session udp: add len check for tx dgrams
[vpp.git] / src / vnet / session / transport_types.h
index 28043b5..b3469fa 100644 (file)
 #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 */
 
-
 typedef enum transport_dequeue_type_
 {
   TRANSPORT_TX_PEEK,           /**< reliable transport protos */
@@ -40,33 +40,44 @@ typedef enum transport_service_type_
   TRANSPORT_N_SERVICES
 } transport_service_type_t;
 
+/*
+ * IS_TX_PACED : Connection sending is paced
+ * NO_LOOKUP: Don't register connection in lookup. Does not apply to local
+ *           apps and transports using the network layer (udp/tcp)
+ * DESCHED: Connection descheduled by the session layer
+ * CLESS: 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
+ */
+#define foreach_transport_connection_flag                                     \
+  _ (IS_TX_PACED, "tx_paced")                                                 \
+  _ (NO_LOOKUP, "no_lookup")                                                  \
+  _ (DESCHED, "descheduled")                                                  \
+  _ (CLESS, "connectionless")
+
+typedef enum transport_connection_flags_bits_
+{
+#define _(sym, str) TRANSPORT_CONNECTION_F_BIT_##sym,
+  foreach_transport_connection_flag
+#undef _
+    TRANSPORT_CONNECTION_N_FLAGS
+} transport_connection_flags_bits_t;
+
 typedef enum transport_connection_flags_
 {
-  TRANSPORT_CONNECTION_F_IS_TX_PACED = 1 << 0,
-  /**
-   * 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,
+#define _(sym, str)                                                           \
+  TRANSPORT_CONNECTION_F_##sym = 1 << TRANSPORT_CONNECTION_F_BIT_##sym,
+  foreach_transport_connection_flag
+#undef _
 } transport_connection_flags_t;
 
 typedef struct _spacer
 {
   u64 bytes_per_sec;
-  u64 bucket;
+  i64 bucket;
   clib_us_time_t last_update;
   f32 tokens_per_period;
-  u32 idle_timeout_us;
+  u32 max_burst;
 } spacer_t;
 
 #define TRANSPORT_CONN_ID_LEN  44
@@ -104,6 +115,7 @@ typedef struct _transport_connection
   u32 c_index;                 /**< Connection index in transport pool */
   u32 thread_index;            /**< Worker-thread index */
   u8 flags;                    /**< Transport specific flags */
+  u8 dscp;                     /**< Differentiated Services Code Point */
 
   /*fib_node_index_t rmt_fei;
      dpo_id_t rmt_dpo; */
@@ -112,7 +124,7 @@ typedef struct _transport_connection
 
 #if TRANSPORT_DEBUG
   elog_track_t elog_track;     /**< Event logging */
-  u32 cc_stat_tstamp;          /**< CC stats timestamp */
+  f64 cc_stat_tstamp;          /**< CC stats timestamp */
 #endif
 
   /**
@@ -144,6 +156,8 @@ typedef struct _transport_connection
 #define c_stats connection.stats
 #define c_pacer connection.pacer
 #define c_flags connection.flags
+#define c_dscp          connection.dscp
+#define s_ho_handle pacer.bytes_per_sec
 } transport_connection_t;
 
 STATIC_ASSERT (STRUCT_OFFSET_OF (transport_connection_t, s_index)
@@ -154,12 +168,15 @@ 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")                                 \
+#define foreach_transport_proto                                               \
+  _ (TCP, "tcp", "T")                                                         \
+  _ (UDP, "udp", "U")                                                         \
+  _ (NONE, "ct", "C")                                                         \
+  _ (TLS, "tls", "J")                                                         \
+  _ (QUIC, "quic", "Q")                                                       \
+  _ (DTLS, "dtls", "D")                                                       \
+  _ (SRTP, "srtp", "R")                                                       \
+  _ (HTTP, "http", "H")
 
 typedef enum _transport_proto
 {
@@ -170,6 +187,7 @@ typedef enum _transport_proto
 
 u8 *format_transport_proto (u8 * s, va_list * args);
 u8 *format_transport_proto_short (u8 * s, va_list * args);
+u8 *format_transport_flags (u8 *s, va_list *args);
 u8 *format_transport_connection (u8 * s, va_list * args);
 u8 *format_transport_listen_connection (u8 * s, va_list * args);
 u8 *format_transport_half_open_connection (u8 * s, va_list * args);
@@ -197,11 +215,16 @@ typedef enum transport_endpt_cfg_flags_
   TRANSPORT_CFG_F_UNIDIRECTIONAL = 1 << 1,
 } transport_endpt_cfg_flags_t;
 
+/* clang-format off */
 #define foreach_transport_endpoint_cfg_fields                          \
   foreach_transport_endpoint_fields                                    \
-  _(transport_endpoint_t, peer)                                                \
-  _(u16, mss)                                                          \
-  _(u8, transport_flags)                                               \
+  _ (transport_endpoint_t, peer)                                       \
+  _ (u32, next_node_index)                                             \
+  _ (u32, next_node_opaque)                                            \
+  _ (u16, mss)                                                         \
+  _ (u8, dscp) \
+  _ (u8, transport_flags)                                              \
+/* clang-format on */
 
 typedef struct transport_endpoint_pair_
 {
@@ -210,6 +233,74 @@ typedef struct transport_endpoint_pair_
 #undef _
 } transport_endpoint_cfg_t;
 
+#define foreach_transport_endpt_cfg_flags                                     \
+  _ (CSUM_OFFLOAD)                                                            \
+  _ (GSO)                                                                     \
+  _ (RATE_SAMPLING)
+
+typedef enum transport_endpt_attr_flag_bit_
+{
+#define _(name) TRANSPORT_ENDPT_ATTR_F_BIT_##name,
+  foreach_transport_endpt_cfg_flags
+#undef _
+} __clib_packed transport_endpt_attr_flag_bit_t;
+
+typedef enum transport_endpt_attr_flag_
+{
+#define _(name)                                                               \
+  TRANSPORT_ENDPT_ATTR_F_##name = 1 << TRANSPORT_ENDPT_ATTR_F_BIT_##name,
+  foreach_transport_endpt_cfg_flags
+#undef _
+} __clib_packed transport_endpt_attr_flag_t;
+
+#define foreach_transport_attr_fields                                         \
+  _ (u64, next_output_node, NEXT_OUTPUT_NODE)                                 \
+  _ (u16, mss, MSS)                                                           \
+  _ (u8, flags, FLAGS)                                                        \
+  _ (u8, cc_algo, CC_ALGO)
+
+typedef enum transport_endpt_attr_type_
+{
+#define _(type, name, str) TRANSPORT_ENDPT_ATTR_##str,
+  foreach_transport_attr_fields
+#undef _
+} __clib_packed transport_endpt_attr_type_t;
+
+typedef struct transport_endpt_attr_
+{
+  transport_endpt_attr_type_t type;
+  union
+  {
+#define _(type, name, str) type name;
+    foreach_transport_attr_fields
+#undef _
+  };
+} transport_endpt_attr_t;
+
+typedef enum transport_endpt_ext_cfg_type_
+{
+  TRANSPORT_ENDPT_EXT_CFG_NONE,
+  TRANSPORT_ENDPT_EXT_CFG_CRYPTO,
+} transport_endpt_ext_cfg_type_t;
+
+typedef struct transport_endpt_crypto_cfg_
+{
+  u32 ckpair_index;
+  u8 crypto_engine;
+  u8 hostname[256]; /**< full domain len is 255 as per rfc 3986 */
+} transport_endpt_crypto_cfg_t;
+
+typedef struct transport_endpt_ext_cfg_
+{
+  u16 type;
+  u16 len;
+  union
+  {
+    transport_endpt_crypto_cfg_t crypto;
+    u8 data[0];
+  };
+} transport_endpt_ext_cfg_t;
+
 typedef clib_bihash_24_8_t transport_endpoint_table_t;
 
 #define ENDPOINT_INVALID_INDEX ((u32)~0)