#include <vnet/ip/ip.h>
#include <vnet/tcp/tcp_debug.h>
-#define TRANSPORT_MAX_HDRS_LEN 100 /* Max number of bytes for headers */
+#define TRANSPORT_MAX_HDRS_LEN 140 /* Max number of bytes for headers */
+
typedef enum transport_dequeue_type_
{
typedef enum transport_connection_flags_
{
TRANSPORT_CONNECTION_F_IS_TX_PACED = 1 << 0,
- TRANSPORT_CONNECTION_F_NO_LOOKUP = 1 << 1, /**< Don't register connection in lookup
- Does not apply to local apps and
- transports using the network layer (udp/tcp) */
+ /**
+ * Don't register connection in lookup. Does not apply to local apps
+ * and transports using the network layer (udp/tcp)
+ */
+ TRANSPORT_CONNECTION_F_NO_LOOKUP = 1 << 1,
+ /**
+ * Connection descheduled by the session layer.
+ */
+ TRANSPORT_CONNECTION_F_DESCHED = 1 << 2,
} transport_connection_flags_t;
-typedef struct _transport_stats
-{
- u64 tx_bytes;
-} transport_stats_t;
-
typedef struct _spacer
{
+ u64 bytes_per_sec;
u64 bucket;
- u32 max_burst_size;
+ clib_us_time_t last_update;
f32 tokens_per_period;
- u64 last_update;
+ u32 idle_timeout_us;
} spacer_t;
#define TRANSPORT_CONN_ID_LEN 44
{
ip46_address_t rmt_ip; /**< Remote IP */
ip46_address_t lcl_ip; /**< Local IP */
+ u32 fib_index; /**< Network namespace */
u16 rmt_port; /**< Remote port */
u16 lcl_port; /**< Local port */
- u32 fib_index; /**< Network namespace */
u8 is_ip4; /**< Flag if IP4 connection */
u8 proto; /**< Protocol id */
u8 unused[2]; /**< First field after id wants to be
/*fib_node_index_t rmt_fei;
dpo_id_t rmt_dpo; */
- transport_stats_t stats; /**< Transport connection stats */
spacer_t pacer; /**< Simple transport pacer */
#if TRANSPORT_DEBUG
u32 cc_stat_tstamp; /**< CC stats timestamp */
#endif
+ /**
+ * Transport specific state starts in next cache line. Meant to avoid
+ * alignment surprises in transports when base class changes.
+ */
+ CLIB_CACHE_LINE_ALIGN_MARK (end);
+
/** Macros for 'derived classes' where base is named "connection" */
#define c_lcl_ip connection.lcl_ip
#define c_rmt_ip connection.rmt_ip
STATIC_ASSERT (STRUCT_OFFSET_OF (transport_connection_t, s_index)
== TRANSPORT_CONN_ID_LEN, "update conn id len");
+/* Warn if size changes. Two cache lines is already generous, hopefully we
+ * won't have to outgrow that. */
+STATIC_ASSERT (sizeof (transport_connection_t) <= 128,
+ "moved into 3rd cache line");
+
+#define foreach_transport_proto \
+ _(TCP, "tcp", "T") \
+ _(UDP, "udp", "U") \
+ _(SCTP, "sctp", "S") \
+ _(NONE, "ct", "C") \
+ _(TLS, "tls", "J") \
+ _(UDPC, "udpc", "U") \
+ _(QUIC, "quic", "Q") \
+
typedef enum _transport_proto
{
- TRANSPORT_PROTO_TCP,
- TRANSPORT_PROTO_UDP,
- TRANSPORT_PROTO_SCTP,
- TRANSPORT_PROTO_NONE,
- TRANSPORT_PROTO_TLS,
- TRANSPORT_PROTO_UDPC,
- TRANSPORT_PROTO_QUIC,
+#define _(sym, str, sstr) TRANSPORT_PROTO_ ## sym,
+ foreach_transport_proto
+#undef _
TRANSPORT_N_PROTO
} transport_proto_t;
#define foreach_transport_endpoint_cfg_fields \
foreach_transport_endpoint_fields \
_(transport_endpoint_t, peer) \
+ _(u16, mss) \
typedef struct transport_endpoint_pair_
{