format_transport_half_open_connection (u8 * s, va_list * args)
{
u32 transport_proto = va_arg (*args, u32);
- u32 listen_index = va_arg (*args, u32);
+ u32 ho_index = va_arg (*args, u32);
transport_proto_vft_t *tp_vft;
tp_vft = transport_protocol_get_vft (transport_proto);
if (!tp_vft)
return s;
- s = format (s, "%U", tp_vft->format_half_open, listen_index);
+ s = format (s, "%U", tp_vft->format_half_open, ho_index);
return s;
}
return tp_vfts[tp].connect (tep);
}
+void
+transport_half_close (transport_proto_t tp, u32 conn_index, u8 thread_index)
+{
+ if (tp_vfts[tp].half_close)
+ tp_vfts[tp].half_close (conn_index, thread_index);
+}
+
void
transport_close (transport_proto_t tp, u32 conn_index, u8 thread_index)
{
}
}
+int
+transport_connection_attribute (transport_proto_t tp, u32 conn_index,
+ u8 thread_index, u8 is_get,
+ transport_endpt_attr_t *attr)
+{
+ if (!tp_vfts[tp].attribute)
+ return -1;
+
+ return tp_vfts[tp].attribute (conn_index, thread_index, is_get, attr);
+}
+
#define PORT_MASK ((1 << 16)- 1)
void
now = transport_us_time_now (thread_index);
diff = now - pacer->last_update;
- s = format (s, "rate %lu bucket %lu t/p %.3f last_update %U burst %u",
+ s = format (s, "rate %lu bucket %ld t/p %.3f last_update %U burst %u",
pacer->bytes_per_sec, pacer->bucket, pacer->tokens_per_period,
format_clib_us_time, diff, pacer->max_burst);
return s;
static inline void
spacer_set_pace_rate (spacer_t * pacer, u64 rate_bytes_per_sec,
- clib_us_time_t rtt)
+ clib_us_time_t rtt, clib_time_type_t sec_per_loop)
{
clib_us_time_t max_time;
*
* Max "time-length" of a burst cannot be less than 1us or more than 1ms.
*/
- max_time = rtt / TRANSPORT_PACER_BURSTS_PER_RTT;
+ max_time = clib_max (rtt / TRANSPORT_PACER_BURSTS_PER_RTT,
+ (clib_us_time_t) (sec_per_loop * CLIB_US_TIME_FREQ));
max_time = clib_clamp (max_time, 1 /* 1us */ , 1000 /* 1ms */ );
pacer->max_burst = (rate_bytes_per_sec * max_time) * CLIB_US_TIME_PERIOD;
pacer->max_burst = clib_clamp (pacer->max_burst, TRANSPORT_PACER_MIN_BURST,
u64 rate_bytes_per_sec, u32 start_bucket,
clib_us_time_t rtt)
{
- spacer_set_pace_rate (&tc->pacer, rate_bytes_per_sec, rtt);
+ spacer_set_pace_rate (&tc->pacer, rate_bytes_per_sec, rtt,
+ transport_seconds_per_loop (tc->thread_index));
spacer_reset (&tc->pacer, transport_us_time_now (tc->thread_index),
start_bucket);
}
transport_connection_tx_pacer_update (transport_connection_t * tc,
u64 bytes_per_sec, clib_us_time_t rtt)
{
- spacer_set_pace_rate (&tc->pacer, bytes_per_sec, rtt);
+ spacer_set_pace_rate (&tc->pacer, bytes_per_sec, rtt,
+ transport_seconds_per_loop (tc->thread_index));
}
u32
spacer_update_bucket (&tc->pacer, bytes);
}
+void
+transport_update_pacer_time (u32 thread_index, clib_time_type_t now)
+{
+ session_wrk_update_time (session_main_get_worker (thread_index), now);
+}
+
void
transport_connection_reschedule (transport_connection_t * tc)
{