X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=vnet%2Fvnet%2Fl2%2Fl2_input.h;h=f3fada6a7d35f84e5e087ec3afb4925863e04ff2;hb=9677a944d5188f10188657bf627301b239fe1da7;hp=e650162b593b1d1939889a7cfebaaf31391de71e;hpb=cb9cadad578297ffd78fa8a33670bdf1ab669e7e;p=vpp.git diff --git a/vnet/vnet/l2/l2_input.h b/vnet/vnet/l2/l2_input.h index e650162b593..f3fada6a7d3 100644 --- a/vnet/vnet/l2/l2_input.h +++ b/vnet/vnet/l2/l2_input.h @@ -24,177 +24,155 @@ #include #include -// Per-subinterface L2 feature configuration +/* Per-subinterface L2 feature configuration */ -typedef struct { +typedef struct +{ - union { - u16 bd_index; // bridge domain id - u32 output_sw_if_index; // for xconnect + union + { + u16 bd_index; /* bridge domain id */ + u32 output_sw_if_index; /* for xconnect */ }; - // Interface mode. If both are 0, this interface is in L3 mode - u8 xconnect; - u8 bridge; + /* Interface mode. If both are 0, this interface is in L3 mode */ + u8 xconnect; + u8 bridge; - // this is the bvi interface for the bridge-domain - u8 bvi; + /* this is the bvi interface for the bridge-domain */ + u8 bvi; - // config for which input features are configured on this interface + /* config for which input features are configured on this interface */ u32 feature_bitmap; - // some of these flags are also in the feature bitmap - u8 learn_enable; - u8 fwd_enable; - u8 flood_enable; + /* some of these flags are also in the feature bitmap */ + u8 learn_enable; + u8 fwd_enable; + u8 flood_enable; - // split horizon group - u8 shg; + /* split horizon group */ + u8 shg; } l2_input_config_t; -typedef struct { +typedef struct +{ - // Next nodes for the feature bitmap + /* Next nodes for the feature bitmap */ u32 feat_next_node_index[32]; /* config vector indexed by sw_if_index */ l2_input_config_t *configs; - /* bridge domain config vector indexed by BD ID */ + /* bridge domain config vector indexed by bd_index */ l2_bridge_domain_t *bd_configs; /* convenience variables */ - vlib_main_t * vlib_main; - vnet_main_t * vnet_main; + vlib_main_t *vlib_main; + vnet_main_t *vnet_main; } l2input_main_t; extern l2input_main_t l2input_main; -static_always_inline l2_bridge_domain_t * +extern vlib_node_registration_t l2input_node; + +static_always_inline l2_bridge_domain_t * l2input_bd_config_from_index (l2input_main_t * l2im, u32 bd_index) { - l2_bridge_domain_t * bd_config; + l2_bridge_domain_t *bd_config; - bd_config = vec_elt_at_index (l2im->bd_configs, bd_index); - return bd_is_valid (bd_config) ? bd_config : NULL; + bd_config = vec_elt_at_index (l2im->bd_configs, bd_index); + return bd_is_valid (bd_config) ? bd_config : NULL; } -// L2 input features +/* L2 input indication packet is from BVI, using -2 */ +#define L2INPUT_BVI ((u32) (~0-1)) + +/* L2 input features */ -// Mappings from feature ID to graph node name -#define foreach_l2input_feat \ +/* Mappings from feature ID to graph node name */ +#define foreach_l2input_feat \ _(DROP, "feature-bitmap-drop") \ - _(CLASSIFY, "l2-classify") \ _(XCONNECT, "l2-output") \ - _(IPIW, "feature-bitmap-drop") \ _(FLOOD, "l2-flood") \ _(ARP_TERM, "arp-term-l2bd") \ _(UU_FLOOD, "l2-flood") \ _(FWD, "l2-fwd") \ + _(RW, "l2-rw") \ _(LEARN, "l2-learn") \ _(VTR, "l2-input-vtr") \ _(VPATH, "vpath-input-l2") \ - _(CTRL_PKT, "feature-bitmap-drop") \ - _(L2PT, "feature-bitmap-drop") \ - _(IGMP_SNOOP, "feature-bitmap-drop") \ - _(MLD_SNOOP, "feature-bitmap-drop") \ - _(DHCP_SNOOP, "feature-bitmap-drop") \ - _(DAI, "feature-bitmap-drop") \ - _(IPSG, "feature-bitmap-drop") \ _(ACL, "l2-input-acl") \ - _(QOS, "feature-bitmap-drop") \ - _(CFM, "feature-bitmap-drop") \ - _(SPAN, "feature-bitmap-drop") + _(POLICER_CLAS, "l2-policer-classify") \ + _(INPUT_CLASSIFY, "l2-input-classify") -// Feature bitmap positions -typedef enum { +/* Feature bitmap positions */ +typedef enum +{ #define _(sym,str) L2INPUT_FEAT_##sym##_BIT, foreach_l2input_feat #undef _ - L2INPUT_N_FEAT, + L2INPUT_N_FEAT, } l2input_feat_t; -// Feature bit masks -typedef enum { +/* Feature bit masks */ +typedef enum +{ #define _(sym,str) L2INPUT_FEAT_##sym = (1<feature_bitmap & L2INPUT_FEAT_FLOOD) == - L2INPUT_FEAT_FLOOD); + return ((bd_config->feature_bitmap & L2INPUT_FEAT_FLOOD) == + L2INPUT_FEAT_FLOOD); } -static_always_inline u8 bd_feature_uu_flood (l2_bridge_domain_t * bd_config) +static_always_inline u8 +bd_feature_uu_flood (l2_bridge_domain_t * bd_config) { - return ((bd_config->feature_bitmap & L2INPUT_FEAT_UU_FLOOD) == - L2INPUT_FEAT_UU_FLOOD); + return ((bd_config->feature_bitmap & L2INPUT_FEAT_UU_FLOOD) == + L2INPUT_FEAT_UU_FLOOD); } -static_always_inline u8 bd_feature_forward (l2_bridge_domain_t * bd_config) +static_always_inline u8 +bd_feature_forward (l2_bridge_domain_t * bd_config) { - return ((bd_config->feature_bitmap & L2INPUT_FEAT_FWD) == - L2INPUT_FEAT_FWD); + return ((bd_config->feature_bitmap & L2INPUT_FEAT_FWD) == L2INPUT_FEAT_FWD); } -static_always_inline u8 bd_feature_learn (l2_bridge_domain_t * bd_config) +static_always_inline u8 +bd_feature_learn (l2_bridge_domain_t * bd_config) { - return ((bd_config->feature_bitmap & L2INPUT_FEAT_LEARN) == - L2INPUT_FEAT_LEARN); + return ((bd_config->feature_bitmap & L2INPUT_FEAT_LEARN) == + L2INPUT_FEAT_LEARN); } -static_always_inline u8 bd_feature_arp_term (l2_bridge_domain_t * bd_config) +static_always_inline u8 +bd_feature_arp_term (l2_bridge_domain_t * bd_config) { - return ((bd_config->feature_bitmap & L2INPUT_FEAT_ARP_TERM) == - L2INPUT_FEAT_ARP_TERM); + return ((bd_config->feature_bitmap & L2INPUT_FEAT_ARP_TERM) == + L2INPUT_FEAT_ARP_TERM); } -// Masks for eliminating features that do not apply to a packet - -#define IP4_FEAT_MASK ~(L2INPUT_FEAT_CTRL_PKT | \ - L2INPUT_FEAT_MLD_SNOOP | \ - L2INPUT_FEAT_L2PT | \ - L2INPUT_FEAT_CFM | \ - L2INPUT_FEAT_DAI) - -#define IP6_FEAT_MASK ~(L2INPUT_FEAT_CTRL_PKT | \ - L2INPUT_FEAT_IGMP_SNOOP | \ - L2INPUT_FEAT_L2PT | \ - L2INPUT_FEAT_CFM | \ - L2INPUT_FEAT_DAI) - -#define IP_UDP_TCP_FEAT_MASK ~(L2INPUT_FEAT_CTRL_PKT | \ - L2INPUT_FEAT_L2PT | \ - L2INPUT_FEAT_IGMP_SNOOP | \ - L2INPUT_FEAT_MLD_SNOOP | \ - L2INPUT_FEAT_DHCP_SNOOP | \ - L2INPUT_FEAT_CFM | \ - L2INPUT_FEAT_DAI) - -#define MPLS_FEAT_MASK ~(L2INPUT_FEAT_CTRL_PKT | \ - L2INPUT_FEAT_L2PT | \ - L2INPUT_FEAT_IGMP_SNOOP | \ - L2INPUT_FEAT_MLD_SNOOP | \ - L2INPUT_FEAT_DHCP_SNOOP | \ - L2INPUT_FEAT_CFM | \ - L2INPUT_FEAT_DAI) - - -// Get a pointer to the config for the given interface -l2_input_config_t * l2input_intf_config (u32 sw_if_index); - -// Enable (or disable) the feature in the bitmap for the given interface +/** Masks for eliminating features that do not apply to a packet */ + +/** Get a pointer to the config for the given interface */ +l2_input_config_t *l2input_intf_config (u32 sw_if_index); + +/* Enable (or disable) the feature in the bitmap for the given interface */ u32 l2input_intf_bitmap_enable (u32 sw_if_index, - u32 feature_bitmap, - u32 enable); + u32 feature_bitmap, u32 enable); + +/* Sets modifies flags from a bridge domain */ +u32 l2input_set_bridge_features (u32 bd_index, u32 feat_mask, u32 feat_value); #define MODE_L3 0 @@ -206,68 +184,69 @@ u32 l2input_intf_bitmap_enable (u32 sw_if_index, #define MODE_ERROR_BVI_DEF 2 u32 set_int_l2_mode (vlib_main_t * vm, - vnet_main_t * vnet_main, - u32 mode, - u32 sw_if_index, - u32 bd_index, - u32 bvi, - u32 shg, - u32 xc_sw_if_index); + vnet_main_t * vnet_main, + u32 mode, + u32 sw_if_index, + u32 bd_index, u32 bvi, u32 shg, u32 xc_sw_if_index); static inline void vnet_update_l2_len (vlib_buffer_t * b) { - ethernet_header_t * eth; + ethernet_header_t *eth; u16 ethertype; + u8 vlan_count = 0; /* point at currrent l2 hdr */ eth = vlib_buffer_get_current (b); - /* + /* * l2-output pays no attention to this * but the tag push/pop code on an l2 subif needs it. - * - * Determine l2 header len, check for up to 2 vlans + * + * Determine l2 header len, check for up to 2 vlans */ - vnet_buffer(b)->l2.l2_len = sizeof(ethernet_header_t); - ethertype = clib_net_to_host_u16(eth->type); - if ((ethertype == ETHERNET_TYPE_VLAN) || - (ethertype == ETHERNET_TYPE_DOT1AD) || - (ethertype == ETHERNET_TYPE_VLAN_9100) || - (ethertype == ETHERNET_TYPE_VLAN_9200)) { - ethernet_vlan_header_t * vlan; - vnet_buffer(b)->l2.l2_len += sizeof (*vlan); - vlan = (void *) (eth+1); - ethertype = clib_net_to_host_u16 (vlan->type); - if (ethertype == ETHERNET_TYPE_VLAN) { - vnet_buffer(b)->l2.l2_len += sizeof (*vlan); + vnet_buffer (b)->l2.l2_len = sizeof (ethernet_header_t); + ethertype = clib_net_to_host_u16 (eth->type); + if (ethernet_frame_is_tagged (ethertype)) + { + ethernet_vlan_header_t *vlan; + vnet_buffer (b)->l2.l2_len += sizeof (*vlan); + vlan_count = 1; + vlan = (void *) (eth + 1); + ethertype = clib_net_to_host_u16 (vlan->type); + if (ethertype == ETHERNET_TYPE_VLAN) + { + vnet_buffer (b)->l2.l2_len += sizeof (*vlan); + vlan_count = 2; + } } - } + ethernet_buffer_set_vlan_count (b, vlan_count); } /* - * Compute flow hash of an ethernet packet, use 5-tuple hash if L3 packet - * is ip4 or ip6. Otherwise hash on smac/dmac/etype. - * The vlib buffer current pointer is expected to be at ethernet header + * Compute flow hash of an ethernet packet, use 5-tuple hash if L3 packet + * is ip4 or ip6. Otherwise hash on smac/dmac/etype. + * The vlib buffer current pointer is expected to be at ethernet header * and vnet l2.l2_len is exppected to be setup already. */ -static inline u32 vnet_l2_compute_flow_hash (vlib_buffer_t *b) +static inline u32 +vnet_l2_compute_flow_hash (vlib_buffer_t * b) { - ethernet_header_t * eh = vlib_buffer_get_current(b); - u8 * l3h = (u8 *)eh + vnet_buffer(b)->l2.l2_len; - u16 ethertype = clib_net_to_host_u16(*(u16 *)(l3h - 2)); - - if (ethertype == ETHERNET_TYPE_IP4) - return ip4_compute_flow_hash((ip4_header_t *) l3h, IP_FLOW_HASH_DEFAULT); - else if (ethertype == ETHERNET_TYPE_IP6) - return ip6_compute_flow_hash((ip6_header_t *) l3h, IP_FLOW_HASH_DEFAULT); + ethernet_header_t *eh = vlib_buffer_get_current (b); + u8 *l3h = (u8 *) eh + vnet_buffer (b)->l2.l2_len; + u16 ethertype = clib_net_to_host_u16 (*(u16 *) (l3h - 2)); + + if (ethertype == ETHERNET_TYPE_IP4) + return ip4_compute_flow_hash ((ip4_header_t *) l3h, IP_FLOW_HASH_DEFAULT); + else if (ethertype == ETHERNET_TYPE_IP6) + return ip6_compute_flow_hash ((ip6_header_t *) l3h, IP_FLOW_HASH_DEFAULT); else { u32 a, b, c; - u32 * ap = (u32 *) &eh->dst_address[2]; - u32 * bp = (u32 *) &eh->src_address[2]; - a = * ap; - b = * bp; + u32 *ap = (u32 *) & eh->dst_address[2]; + u32 *bp = (u32 *) & eh->src_address[2]; + a = *ap; + b = *bp; c = ethertype; hash_v3_mix32 (a, b, c); hash_v3_finalize32 (a, b, c); @@ -277,3 +256,11 @@ static inline u32 vnet_l2_compute_flow_hash (vlib_buffer_t *b) #endif + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */