#include <vnet/vnet.h>
#include <vnet/session/transport_types.h>
+#define TRANSPORT_PACER_MIN_MSS 1460
+#define TRANSPORT_PACER_MIN_BURST TRANSPORT_PACER_MIN_MSS
+#define TRANSPORT_PACER_MAX_BURST (43 * TRANSPORT_PACER_MIN_MSS)
+#define TRANSPORT_PACER_MIN_IDLE 100
+#define TRANSPORT_PACER_IDLE_FACTOR 0.05
+
typedef struct _transport_options_t
{
transport_tx_fn_type_t tx_type;
u32 (*stop_listen) (u32 conn_index);
int (*connect) (transport_endpoint_cfg_t * rmt);
void (*close) (u32 conn_index, u32 thread_index);
+ void (*reset) (u32 conn_index, u32 thread_index);
void (*cleanup) (u32 conn_index, u32 thread_index);
clib_error_t *(*enable) (vlib_main_t * vm, u8 is_en);
int transport_connect (transport_proto_t tp, transport_endpoint_cfg_t * tep);
void transport_close (transport_proto_t tp, u32 conn_index, u8 thread_index);
+void transport_reset (transport_proto_t tp, u32 conn_index, u8 thread_index);
u32 transport_start_listen (transport_proto_t tp, u32 session_index,
transport_endpoint_t * tep);
u32 transport_stop_listen (transport_proto_t tp, u32 conn_index);
return tp_vfts[tp].app_rx_evt (tc);
}
+/**
+ * Get maximum tx burst allowed for transport connection
+ *
+ * @param tc transport connection
+ */
+static inline u32
+transport_connection_snd_space (transport_connection_t * tc)
+{
+ return tp_vfts[tc->proto].send_space (tc);
+}
+
void transport_register_protocol (transport_proto_t transport_proto,
const transport_proto_vft_t * vft,
fib_protocol_t fib_proto, u32 output_node);
transport_proto_vft_t *transport_protocol_get_vft (transport_proto_t tp);
-void transport_update_time (f64 time_now, u8 thread_index);
+void transport_update_time (clib_time_type_t time_now, u8 thread_index);
int transport_alloc_local_port (u8 proto, ip46_address_t * ip);
int transport_alloc_local_endpoint (u8 proto, transport_endpoint_cfg_t * rmt,
}
void transport_connection_tx_pacer_reset (transport_connection_t * tc,
- u32 rate_bytes_per_sec,
- u32 initial_bucket, u64 time_now);
+ u64 rate_bytes_per_sec,
+ u32 initial_bucket,
+ clib_us_time_t rtt);
/**
* Initialize tx pacer for connection
*
* @param burst_bytes initial burst size in bytes
*/
void transport_connection_tx_pacer_init (transport_connection_t * tc,
- u32 rate_bytes_per_sec,
+ u64 rate_bytes_per_sec,
u32 initial_bucket);
/**
*
* @param tc transport connection
* @param bytes_per_sec new pacing rate
+ * @param rtt connection rtt that is used to compute
+ * inactivity time after which pacer bucket is
+ * reset to 1 mtu
*/
void transport_connection_tx_pacer_update (transport_connection_t * tc,
- u64 bytes_per_sec);
-
-/**
- * Get maximum tx burst allowed for transport connection
- *
- * @param tc transport connection
- * @param time_now current cpu time as returned by @ref clib_cpu_time_now
- * @param mss transport's mss
- */
-u32 transport_connection_snd_space (transport_connection_t * tc,
- u64 time_now, u16 mss);
+ u64 bytes_per_sec,
+ clib_us_time_t rtt);
/**
* Get tx pacer max burst
* @param time_now current cpu time
* @return max burst for connection
*/
-u32 transport_connection_tx_pacer_burst (transport_connection_t * tc,
- u64 time_now);
+u32 transport_connection_tx_pacer_burst (transport_connection_t * tc);
/**
* Get tx pacer current rate
u64 transport_connection_tx_pacer_rate (transport_connection_t * tc);
/**
- * Initialize period for tx pacers
+ * Reset tx pacer bucket
*
- * Defines a unit of time with respect to number of cpu cycles that is to
- * be used by all tx pacers.
+ * @param tc transport connection
+ * @param bucket value the bucket will be reset to
*/
-void transport_init_tx_pacers_period (void);
+void transport_connection_tx_pacer_reset_bucket (transport_connection_t * tc,
+ u32 bucket);
/**
* Check if transport connection is paced