tcp: avoid fr segments less than mss if possible
[vpp.git] / src / plugins / srv6-mobile / mobile.h
index 5a086b6..a305a25 100644 (file)
@@ -20,6 +20,8 @@
 
 #include <vnet/vnet.h>
 #include <vnet/ip/ip.h>
+#include <vnet/fib/ip4_fib.h>
+#include <vnet/fib/ip6_fib.h>
 #include <vnet/srv6/sr.h>
 #include <vnet/srv6/sr_packet.h>
 
@@ -33,8 +35,8 @@
 #define SRV6_NHTYPE_IPV6       2
 #define SRV6_NHTYPE_NON_IP     3
 
-#ifndef IP_PROTOCOL_NONE
-#define IP_PROTOCOL_NONE       59
+#ifndef IP_PROTOCOL_IP6_ETHERNET
+#define IP_PROTOCOL_IP6_ETHERNET       143
 #endif
 
 #define SRV6_GTP6_UNKNOW       0
 #define SRV6_GTP6_DT6          2
 #define SRV6_GTP6_DT46         3
 
+#define SRV6_GTP4_UNKNOW       0
+#define SRV6_GTP4_DT4          1
+#define SRV6_GTP4_DT6          2
+#define SRV6_GTP4_DT46         3
+
 #if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
 #define BITALIGN2(A,B)          A; B
 #define BITALIGN3(A,B,C)        A; B; C
 #define SRH_TAG_ERROR_INDICATION        0x0002
 #define SRH_TAG_END_MARKER              0x0001
 
-/* *INDENT-OFF* */
+#define GTPU_RECOVERY_IE_TYPE          0x0e
+
+#define GTPU_IE_MAX_SIZ                        256
+#define SRH_TLV_USER_PLANE_CONTAINER   0x0a    /* tentative */
+
+typedef enum mobile_policy_function_list
+{
+  SRV6_MOBILE_POLICY_UNKNOWN_FUNCTION = 0,
+  SRV6_MOBILE_POLICY_T_M_GTP4_D,
+  SRV6_MOBILE_POLICY_T_M_GTP4_DT4,
+  SRV6_MOBILE_POLICY_T_M_GTP4_DT6,
+  SRV6_MOBILE_POLICY_T_M_GTP4_DT46,
+  SRV6_MOBILE_POLICY_END_M_GTP6_D,
+} mobile_policy_function_list_t;
+
+typedef enum mobile_localsid_function_list
+{
+  SRV6_MOBILE_LOCALSID_UNKNOWN_FUNCTION = 0,
+  SRV6_MOBILE_LOCALSID_END_M_GTP4_E,
+  SRV6_MOBILE_LOCALSID_END_M_GTP6_E,
+  SRV6_MOBILE_LOCALSID_END_M_GTP6_D,
+  SRV6_MOBILE_LOCALSID_END_M_GTP6_D_DI,
+  SRV6_MOBILE_LOCALSID_END_M_GTP6_D_DT4,
+  SRV6_MOBILE_LOCALSID_END_M_GTP6_D_DT6,
+  SRV6_MOBILE_LOCALSID_END_M_GTP6_D_DT46,
+} mobile_localsid_function_list_t;
+
+typedef struct
+{
+  u8 type;
+  u8 restart_counter;
+} __attribute__ ((packed)) gtpu_recovery_ie;
+
 typedef struct
 {
   u16 seq;
   u8 npdu_num;
   u8 nextexthdr;
 } __attribute__ ((packed)) gtpu_exthdr_t;
-/* *INDENT-ON* */
 
-/* *INDENT-OFF* */
 typedef struct
 {
   u8 ver_flags;
@@ -77,7 +114,6 @@ typedef struct
   u32 teid;
   gtpu_exthdr_t ext[0];
 } __attribute__ ((packed)) gtpu_header_t;
-/* *INDENT-ON* */
 
 #define GTPU_TYPE_ECHO_REQUEST          1
 #define GTPU_TYPE_ECHO_REPLY            2
@@ -85,7 +121,6 @@ typedef struct
 #define GTPU_TYPE_END_MARKER            254
 #define GTPU_TYPE_GTPU                  255
 
-/* *INDENT-OFF* */
 typedef struct
 {
   BITALIGN2 (u8 ppi:3,
@@ -93,9 +128,7 @@ typedef struct
 
   u8 padding[3];
 } __attribute__ ((packed)) gtpu_paging_policy_t;
-/* *INDENT-ON* */
 
-/* *INDENT-OFF* */
 typedef struct
 {
   u8 exthdrlen;
@@ -113,7 +146,6 @@ typedef struct
   gtpu_paging_policy_t  paging[0];
   u8 nextexthdr;
 } __attribute__ ((packed)) gtpu_pdu_session_t;
-/* *INDENT-ON* */
 
 #define GTPU_PDU_SESSION_P_BIT_MASK     0x80
 #define GTPU_PDU_SESSION_R_BIT_MASK     0x40
@@ -123,37 +155,91 @@ typedef struct
 #define SRV6_PDU_SESSION_R_BIT_MASK     0x02
 #define SRV6_PDU_SESSION_QFI_MASK       0xfC
 
-/* *INDENT-OFF* */
 typedef struct
 {
   ip4_header_t ip4;            /* 20 bytes */
   udp_header_t udp;            /* 8 bytes */
   gtpu_header_t gtpu;        /* 8 bytes */
 } __attribute__ ((packed)) ip4_gtpu_header_t;
-/* *INDENT-ON* */
 
-/* *INDENT-OFF* */
 typedef struct
 {
   ip6_header_t ip6;          /* 40 bytes */
   udp_header_t udp;          /* 8 bytes */
   gtpu_header_t gtpu;        /* 8 bytes */
 } __attribute__ ((packed)) ip6_gtpu_header_t;
-/* *INDENT-ON* */
 
 #define GTPU_V1_VER   (1<<5)
 
 #define GTPU_PT_GTP   (1<<4)
 
-typedef struct srv6_end_gtp6_param_s
+typedef struct
+{
+  u8 type;
+  u8 length;
+  u8 value[0];
+} __attribute__ ((packed)) user_plane_sub_tlv_t;
+
+#define USER_PLANE_SUB_TLV_IE  0x01
+
+/* SRv6 mobile Plugin Params */
+
+/* GTP6.D, GTP6.Di */
+typedef struct srv6_end_gtp6_d_param_s
 {
   u8 nhtype;
 
   ip6_address_t sr_prefix;
   u32 sr_prefixlen;
-} srv6_end_gtp6_param_t;
 
-typedef struct srv6_end_gtp4_param_s
+  bool drop_in;
+
+  u32 fib_table;
+  u32 fib4_index;
+  u32 fib6_index;
+} srv6_end_gtp6_d_param_t;
+
+/* GTP6.DT */
+typedef struct srv6_end_gtp6_dt_param_s
+{
+  u8 type;
+
+  u32 fib4_index;
+  u32 fib6_index;
+  u32 local_fib_index;
+} srv6_end_gtp6_dt_param_t;
+
+/* GTP6.E */
+typedef struct srv6_end_gtp6_e_param_s
+{
+  u32 fib_table;
+  u32 fib4_index;
+  u32 fib6_index;
+} srv6_end_gtp6_e_param_t;
+
+/* GTP4.DT */
+typedef struct srv6_t_gtp4_dt_param_s
+{
+  u8 type;
+
+  u32 fib4_index;
+  u32 fib6_index;
+  u32 local_fib_index;
+} srv6_t_gtp4_dt_param_t;
+
+/* GTP4.E */
+typedef struct srv6_end_gtp4_e_param_s
+{
+  u32 v4src_position;
+  ip4_address_t v4src_addr;
+
+  u32 fib_table;
+  u32 fib4_index;
+  u32 fib6_index;
+} srv6_end_gtp4_e_param_t;
+
+/* GTP4.D */
+typedef struct srv6_end_gtp4_d_param_s
 {
   u8 nhtype;
 
@@ -163,8 +249,12 @@ typedef struct srv6_end_gtp4_param_s
   ip6_address_t v6src_prefix;
   u32 v6src_prefixlen;
 
-  u32 v4src_position;
-} srv6_end_gtp4_param_t;
+  bool drop_in;
+
+  u32 fib_table;
+  u32 fib4_index;
+  u32 fib6_index;
+} srv6_end_gtp4_d_param_t;
 
 typedef struct srv6_end_main_v4_s
 {
@@ -238,6 +328,30 @@ typedef struct srv6_end_main_v6_decap_di_s
 extern srv6_end_main_v6_decap_di_t srv6_end_main_v6_decap_di;
 extern vlib_node_registration_t srv6_end_m_gtp6_d_di;
 
+typedef struct srv6_end_main_v6_dt_s
+{
+  vlib_main_t *vlib_main;
+  vnet_main_t *vnet_main;
+
+  u32 end_m_gtp6_dt_node_index;
+  u32 error_node_index;
+} srv6_end_main_v6_dt_t;
+
+extern srv6_end_main_v6_dt_t srv6_end_main_v6_dt;
+extern vlib_node_registration_t srv6_end_m_gtp6_dt;
+
+typedef struct srv6_t_main_v4_dt_s
+{
+  vlib_main_t *vlib_main;
+  vnet_main_t *vnet_main;
+
+  u32 t_m_gtp4_dt_node_index;
+  u32 error_node_index;
+} srv6_t_main_v4_dt_t;
+
+extern srv6_t_main_v4_dt_t srv6_t_main_v4_dt;
+extern vlib_node_registration_t srv6_t_m_gtp4_dt;
+
 #endif /* __included_srv6_end_h__ */
 
 /*