X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fplugins%2Fsrv6-mobile%2Fmobile.h;h=a305a25b8119de4dd0d680bb713981171779ed16;hb=e8ea6be8dfb626b5bb4ff3355ce8037724ce1d83;hp=5a086b66c6e62e10b29246fff9485733afc40557;hpb=61f7bfb6dee843cfc003ee7eb2572e2e2e51f02a;p=vpp.git diff --git a/src/plugins/srv6-mobile/mobile.h b/src/plugins/srv6-mobile/mobile.h index 5a086b66c6e..a305a25b811 100644 --- a/src/plugins/srv6-mobile/mobile.h +++ b/src/plugins/srv6-mobile/mobile.h @@ -20,6 +20,8 @@ #include #include +#include +#include #include #include @@ -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 @@ -42,6 +44,11 @@ #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 @@ -59,16 +66,46 @@ #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__ */ /*