#include <vnet/vnet.h>
#include <vnet/ip/ip.h>
#include <vnet/tcp/tcp_debug.h>
+#include <vppinfra/bihash_24_8.h>
+
+
+#define TRANSPORT_MAX_HDRS_LEN 140 /* Max number of bytes for headers */
-#define TRANSPORT_MAX_HDRS_LEN 100 /* 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,
+ /**
+ * Connection is "connection less". Some important implications of that
+ * are that connections are not pinned to workers and listeners will
+ * have fifos associated to them
+ */
+ TRANSPORT_CONNECTION_F_CLESS = 1 << 3,
} transport_connection_flags_t;
typedef struct _spacer
{
+ u64 bytes_per_sec;
u64 bucket;
- u64 last_update;
+ clib_us_time_t last_update;
f32 tokens_per_period;
+ u32 idle_timeout_us;
} spacer_t;
#define TRANSPORT_CONN_ID_LEN 44
#define c_stats connection.stats
#define c_pacer connection.pacer
#define c_flags connection.flags
+#define s_ho_handle pacer.bucket
+#define c_s_ho_handle connection.pacer.bucket
} transport_connection_t;
STATIC_ASSERT (STRUCT_OFFSET_OF (transport_connection_t, s_index)
STATIC_ASSERT (sizeof (transport_connection_t) <= 128,
"moved into 3rd cache line");
+#define foreach_transport_proto \
+ _(TCP, "tcp", "T") \
+ _(UDP, "udp", "U") \
+ _(NONE, "ct", "C") \
+ _(TLS, "tls", "J") \
+ _(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,
- TRANSPORT_N_PROTO
+#define _(sym, str, sstr) TRANSPORT_PROTO_ ## sym,
+ foreach_transport_proto
+#undef _
} transport_proto_t;
u8 *format_transport_proto (u8 * s, va_list * args);
u8 *format_transport_half_open_connection (u8 * s, va_list * args);
uword unformat_transport_proto (unformat_input_t * input, va_list * args);
+u8 *format_transport_protos (u8 * s, va_list * args);
#define foreach_transport_endpoint_fields \
_(ip46_address_t, ip) /**< ip address in net order */ \
#undef _
} transport_endpoint_t;
+typedef enum transport_endpt_cfg_flags_
+{
+ TRANSPORT_CFG_F_CONNECTED = 1 << 0,
+ TRANSPORT_CFG_F_UNIDIRECTIONAL = 1 << 1,
+} transport_endpt_cfg_flags_t;
+
#define foreach_transport_endpoint_cfg_fields \
foreach_transport_endpoint_fields \
_(transport_endpoint_t, peer) \
+ _(u16, mss) \
+ _(u8, transport_flags) \
typedef struct transport_endpoint_pair_
{
}
u8 transport_protocol_is_cl (transport_proto_t tp);
-u8 transport_half_open_has_fifos (transport_proto_t tp);
transport_service_type_t transport_protocol_service_type (transport_proto_t);
transport_tx_fn_type_t transport_protocol_tx_fn_type (transport_proto_t tp);