X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=vnet%2Fvnet%2Fmpls%2Fmpls.h;fp=vnet%2Fvnet%2Fmpls-gre%2Fmpls.h;h=2aeae49df43654cbb582535d1c7e6dd4dfa59361;hb=0bfe5d8c792abcdbcf27bfcc7b7b353fba04aee2;hp=d8ffca22793cba721822f19137cb37cfc1b3c0b0;hpb=60537f3d83e83d0ce10a620ca99aad4eddf85f5e;p=vpp.git diff --git a/vnet/vnet/mpls-gre/mpls.h b/vnet/vnet/mpls/mpls.h similarity index 65% rename from vnet/vnet/mpls-gre/mpls.h rename to vnet/vnet/mpls/mpls.h index d8ffca22793..2aeae49df43 100644 --- a/vnet/vnet/mpls-gre/mpls.h +++ b/vnet/vnet/mpls/mpls.h @@ -17,9 +17,12 @@ #include #include -#include +#include +#include #include #include +#include +#include typedef CLIB_PACKED (struct { ip4_header_t ip4; /* 20 bytes */ @@ -31,7 +34,7 @@ extern vnet_hw_interface_class_t mpls_gre_hw_interface_class; typedef enum { #define mpls_error(n,s) MPLS_ERROR_##n, -#include +#include #undef mpls_error MPLS_N_ERROR, } mpls_gre_error_t; @@ -42,6 +45,7 @@ typedef enum { */ typedef struct { + fib_node_t mgt_node; ip4_address_t tunnel_src; ip4_address_t tunnel_dst; ip4_address_t intfc_address; @@ -52,6 +56,9 @@ typedef struct { u32 hw_if_index; /* L2 x-connect capable tunnel intfc */ u8 * rewrite_data; u8 l2_only; + fib_node_index_t fei; /* FIB Entry index for the tunnel's destination */ + adj_index_t adj_index; /* The midchain adj this tunnel creates */ + u32 sibling_index; } mpls_gre_tunnel_t; typedef struct { @@ -64,6 +71,7 @@ typedef struct { u32 hw_if_index; u8 * rewrite_data; u8 l2_only; + fib_node_index_t fei; } mpls_eth_tunnel_t; typedef struct { @@ -78,7 +86,53 @@ typedef struct { u32 next_index; /* e.g. ip4/6-input, l2-input */ } mpls_decap_t; +#define MPLS_FIB_DEFAULT_TABLE_ID 0 + +/** + * Type exposure is to allow the DP fast/inlined access + */ +#define MPLS_FIB_KEY_SIZE 21 +#define MPLS_FIB_DB_SIZE (1 << (MPLS_FIB_KEY_SIZE-1)) + +typedef struct mpls_fib_t_ +{ + /** + * A hash table of entries. 21 bit key + * Hash table for reduced memory footprint + */ + uword * mf_entries; + + /** + * The load-balance indeices keyed by 21 bit label+eos bit. + * A flat array for maximum lookup performace. + */ + index_t mf_lbs[MPLS_FIB_DB_SIZE]; +} mpls_fib_t; + +/** + * @brief Definition of a callback for receiving MPLS interface state change + * notifications + */ +typedef void (*mpls_interface_state_change_callback_t)(u32 sw_if_index, + u32 is_enable); + typedef struct { + /* MPLS FIB index for each software interface */ + u32 *fib_index_by_sw_if_index; + + /** A pool of all the MPLS FIBs */ + struct fib_table_t_ *fibs; + + /** A hash table to lookup the mpls_fib by table ID */ + uword *fib_index_by_table_id; + + /* rx/tx interface/feature configuration. */ + ip_config_main_t rx_config_mains, tx_config_main; + + /* Built-in unicast feature path indices, see ip_feature_init_cast(...) */ + u32 mpls_rx_feature_lookup; + u32 mpls_rx_feature_not_enabled; + /* pool of gre tunnel instances */ mpls_gre_tunnel_t *gre_tunnels; u32 * free_gre_sw_if_indices; @@ -99,23 +153,53 @@ typedef struct { u32 ip4_classify_mpls_policy_encap_next_index; u32 ip6_classify_mpls_policy_encap_next_index; + /* feature path configuration lists */ + vnet_ip_feature_registration_t * next_feature; + + /* Save feature results for show command */ + char **feature_nodes; + + /* IP4 enabled count by software interface */ + u8 * mpls_enabled_by_sw_if_index; + + /* Functions to call when MPLS state on an interface changes. */ + mpls_interface_state_change_callback_t * mpls_interface_state_change_callbacks; + /* convenience */ vlib_main_t * vlib_main; vnet_main_t * vnet_main; } mpls_main_t; -mpls_main_t mpls_main; +extern mpls_main_t mpls_main; + +#define VNET_MPLS_FEATURE_INIT(x,...) \ + __VA_ARGS__ vnet_ip_feature_registration_t uc_##x; \ +static void __vnet_add_feature_registration_uc_##x (void) \ + __attribute__((__constructor__)) ; \ +static void __vnet_add_feature_registration_uc_##x (void) \ +{ \ + mpls_main_t * mm = &mpls_main; \ + uc_##x.next = mm->next_feature; \ + mm->next_feature = &uc_##x; \ +} \ +__VA_ARGS__ vnet_ip_feature_registration_t uc_##x + +extern clib_error_t * mpls_feature_init(vlib_main_t * vm); format_function_t format_mpls_protocol; -format_function_t format_mpls_header; -format_function_t format_mpls_header_with_length; format_function_t format_mpls_gre_header_with_length; format_function_t format_mpls_eth_header_with_length; -format_function_t format_mpls_unicast_label; format_function_t format_mpls_encap_index; +format_function_t format_mpls_eos_bit; +format_function_t format_mpls_unicast_header_net_byte_order; +format_function_t format_mpls_unicast_label; +format_function_t format_mpls_header; + extern vlib_node_registration_t mpls_input_node; extern vlib_node_registration_t mpls_policy_encap_node; +extern vlib_node_registration_t mpls_output_node; +extern vlib_node_registration_t mpls_midchain_node; extern vnet_device_class_t mpls_gre_device_class; @@ -126,6 +210,7 @@ unformat_function_t unformat_mpls_protocol_net_byte_order; unformat_function_t unformat_mpls_label_net_byte_order; unformat_function_t unformat_mpls_gre_header; unformat_function_t unformat_pg_mpls_gre_header; +unformat_function_t unformat_mpls_unicast_label; /* Parse mpls header. */ unformat_function_t unformat_mpls_header; @@ -135,6 +220,12 @@ unformat_function_t unformat_pg_mpls_header; #define MPLS_GRE_OUTPUT_NEXT_LOOKUP 1 #define MPLS_GRE_OUTPUT_NEXT_DROP VNET_INTERFACE_TX_NEXT_DROP +void mpls_sw_interface_enable_disable (mpls_main_t * mm, + u32 sw_if_index, + u8 is_enable); + +u8 mpls_sw_interface_is_enabled (u32 sw_if_index); + mpls_encap_t * mpls_encap_by_fib_and_dest (mpls_main_t * mm, u32 rx_fib, u32 dst_address); @@ -176,6 +267,7 @@ int vnet_mpls_add_del_encap (ip4_address_t *dest, u32 fib_id, int vnet_mpls_policy_tunnel_add_rewrite (mpls_main_t * mm, mpls_encap_t * e, u32 policy_tunnel_index); + typedef struct { u32 lookup_miss; @@ -198,8 +290,7 @@ u8 * format_mpls_gre_header (u8 * s, va_list * args); #define foreach_mpls_input_next \ _(DROP, "error-drop") \ -_(IP4_INPUT, "ip4-input") \ -_(L2_OUTPUT, "l2-output") +_(LOOKUP, "mpls-lookup") typedef enum { #define _(s,n) MPLS_INPUT_NEXT_##s, @@ -208,6 +299,28 @@ typedef enum { MPLS_INPUT_N_NEXT, } mpls_input_next_t; +#define foreach_mpls_lookup_next \ +_(DROP, "error-drop") \ +_(IP4_INPUT, "ip4-input") \ +_(L2_OUTPUT, "l2-output") + +// FIXME remove. +typedef enum { +#define _(s,n) MPLS_LOOKUP_NEXT_##s, + foreach_mpls_lookup_next +#undef _ + MPLS_LOOKUP_N_NEXT, +} mpls_lookup_next_t; + +#define foreach_mpls_output_next \ +_(DROP, "error-drop") + +typedef enum { +#define _(s,n) MPLS_OUTPUT_NEXT_##s, + foreach_mpls_output_next +#undef _ + MPLS_OUTPUT_N_NEXT, +} mpls_output_next_t; typedef struct { u32 lookup_miss;