l2: remove unused l3 packet type discovery in l2 path
[vpp.git] / vnet / vnet / l2 / l2_input.h
index 50649e7..f3fada6 100644 (file)
 #include <vnet/ethernet/packet.h>
 #include <vnet/ip/ip.h>
 
-// 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;
 
 extern vlib_node_registration_t l2input_node;
 
-static_always_inline l2_bridge_domain_t * 
+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))
 
-// Mappings from feature ID to graph node name
-#define foreach_l2input_feat \
+/* L2 input features */
+
+/* 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")                   \
@@ -99,110 +103,76 @@ l2input_bd_config_from_index (l2input_main_t * l2im, u32 bd_index)
  _(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<<L2INPUT_FEAT_##sym##_BIT),
   foreach_l2input_feat
 #undef _
 } l2input_feat_masks_t;
-           
-// Return an array of strings containing graph node names of each feature
-char **l2input_get_feat_names(void);
+
+/** Return an array of strings containing graph node names of each feature */
+char **l2input_get_feat_names (void);
 
 
-static_always_inline u8 bd_feature_flood (l2_bridge_domain_t * bd_config)
+static_always_inline u8
+bd_feature_flood (l2_bridge_domain_t * bd_config)
 {
-    return ((bd_config->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);
+/* 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
@@ -214,72 +184,69 @@ u32 l2input_set_bridge_features(u32 bd_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_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;
+  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);
+  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);
@@ -289,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:
+ */