session tcp vcl: api to update connection attributes
[vpp.git] / src / vnet / session / transport_types.h
index 87daa76..f0fc285 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 */
 
-#define TRANSPORT_MAX_HDRS_LEN    100  /* Max number of bytes for headers */
 
 typedef enum transport_dequeue_type_
 {
@@ -39,19 +42,37 @@ typedef enum transport_service_type_
   TRANSPORT_N_SERVICES
 } transport_service_type_t;
 
-typedef struct _transport_stats
+typedef enum transport_connection_flags_
 {
-  u64 tx_bytes;
-} transport_stats_t;
+  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,
+} transport_connection_flags_t;
 
 typedef struct _spacer
 {
-  u64 bucket;
-  u32 max_burst_size;
+  u64 bytes_per_sec;
+  i64 bucket;
+  clib_us_time_t last_update;
   f32 tokens_per_period;
-  u64 last_update;
+  u32 max_burst;
 } spacer_t;
 
+#define TRANSPORT_CONN_ID_LEN  44
+
 /*
  * Protocol independent transport properties associated to a session
  */
@@ -67,27 +88,28 @@ typedef struct _transport_connection
     {
       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 */
       u8 is_ip4;               /**< Flag if IP4 connection */
       u8 proto;                        /**< Protocol id */
-      u32 fib_index;           /**< Network namespace */
+      u8 unused[2];            /**< First field after id wants to be
+                                    4-byte aligned) */
     };
     /*
      * Opaque connection ID
      */
-    u8 opaque_conn_id[42];
+    u8 opaque_conn_id[TRANSPORT_CONN_ID_LEN];
   };
 
   u32 s_index;                 /**< Parent session index */
   u32 c_index;                 /**< Connection index in transport pool */
   u32 thread_index;            /**< Worker-thread index */
+  u8 flags;                    /**< Transport specific flags */
 
   /*fib_node_index_t rmt_fei;
      dpo_id_t rmt_dpo; */
 
-  u8 flags;                    /**< Transport specific flags */
-  transport_stats_t stats;     /**< Transport connection stats */
   spacer_t pacer;              /**< Simple transport pacer */
 
 #if TRANSPORT_DEBUG
@@ -95,6 +117,12 @@ typedef struct _transport_connection
   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
@@ -118,20 +146,31 @@ typedef struct _transport_connection
 #define c_stats connection.stats
 #define c_pacer connection.pacer
 #define c_flags connection.flags
+#define s_ho_handle pacer.bytes_per_sec
+#define c_s_ho_handle connection.pacer.bytes_per_sec
 } transport_connection_t;
 
-#define TRANSPORT_CONNECTION_F_IS_TX_PACED     1 << 0
+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")                                                         \
+  _ (NONE, "ct", "C")                                                         \
+  _ (TLS, "tls", "J")                                                         \
+  _ (QUIC, "quic", "Q")                                                       \
+  _ (DTLS, "dtls", "D")
 
 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);
@@ -141,6 +180,7 @@ u8 *format_transport_listen_connection (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 */                        \
@@ -156,9 +196,17 @@ typedef struct transport_endpoint_
 #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_
 {
@@ -167,6 +215,42 @@ 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_
+{
+#define _(name) TRANSPORT_ENDPT_ATTR_F_##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 clib_bihash_24_8_t transport_endpoint_table_t;
 
 #define ENDPOINT_INVALID_INDEX ((u32)~0)
@@ -184,7 +268,6 @@ transport_endpoint_fib_proto (transport_endpoint_t * tep)
 }
 
 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);