ETH:fix l2_len/vlan count mismatch for > 2 tags 20/7120/2
authorEyal Bari <ebari@cisco.com>
Tue, 13 Jun 2017 09:09:37 +0000 (12:09 +0300)
committerJohn Lo <loj@cisco.com>
Wed, 14 Jun 2017 07:08:18 +0000 (07:08 +0000)
l2_len was not updated for the third tag
as the ethernet node retracts by the vlan count after parse_header (using
ethernet_buffer_header_size) it ends up pointing before the ethernet header

+ some minor cleanups

Change-Id: I4ccaedd33928912e5d837376f146503b27071741
Signed-off-by: Eyal Bari <ebari@cisco.com>
src/vnet/ethernet/node.c
src/vnet/l2/l2_input_vtr.c
src/vnet/l2/l2_vtr.c

index 8967ceb..4529ca6 100755 (executable)
@@ -165,11 +165,12 @@ parse_header (ethernet_input_variant_t variant,
 
          vlib_buffer_advance (b0, sizeof (h0[0]));
          vlan_count = 2;
-
          if (*type == ETHERNET_TYPE_VLAN)
            {
              // More than double tagged packet
              *match_flags = SUBINT_CONFIG_VALID | SUBINT_CONFIG_MATCH_3_TAG;
+
+             vlib_buffer_advance (b0, sizeof (h0[0]));
              vlan_count = 3;   // "unknown" number, aka, 3-or-more
            }
        }
@@ -239,6 +240,8 @@ determine_next_node (ethernet_main_t * em,
       // record the L2 len and reset the buffer so the L2 header is preserved
       u32 eth_start = vnet_buffer (b0)->ethernet.start_of_ethernet_header;
       vnet_buffer (b0)->l2.l2_len = b0->current_data - eth_start;
+      ASSERT (vnet_buffer (b0)->l2.l2_len ==
+             ethernet_buffer_header_size (b0));
       vlib_buffer_advance (b0, -ethernet_buffer_header_size (b0));
 
       // check for common IP/MPLS ethertypes
index 60a3963..ded2309 100644 (file)
@@ -188,10 +188,7 @@ l2_invtr_node_fn (vlib_main_t * vm,
              if (config0->output_vtr.push_and_pop_bytes)
                {
                  /* perform the tag rewrite on two packets */
-                 if (l2_vtr_process
-                     (b0,
-                      &(vec_elt_at_index
-                        (l2output_main.configs, sw_if_index0)->input_vtr)))
+                 if (l2_vtr_process (b0, &config0->input_vtr))
                    {
                      /* Drop packet */
                      next0 = L2_INVTR_NEXT_DROP;
@@ -212,10 +209,7 @@ l2_invtr_node_fn (vlib_main_t * vm,
            {
              if (config1->output_vtr.push_and_pop_bytes)
                {
-                 if (l2_vtr_process
-                     (b1,
-                      &(vec_elt_at_index
-                        (l2output_main.configs, sw_if_index1)->input_vtr)))
+                 if (l2_vtr_process (b1, &config1->input_vtr))
                    {
                      /* Drop packet */
                      next1 = L2_INVTR_NEXT_DROP;
@@ -305,10 +299,7 @@ l2_invtr_node_fn (vlib_main_t * vm,
              if (config0->output_vtr.push_and_pop_bytes)
                {
                  /* perform the tag rewrite on one packet */
-                 if (l2_vtr_process
-                     (b0,
-                      &(vec_elt_at_index
-                        (l2output_main.configs, sw_if_index0)->input_vtr)))
+                 if (l2_vtr_process (b0, &config0->input_vtr))
                    {
                      /* Drop packet */
                      next0 = L2_INVTR_NEXT_DROP;
index 3c5365f..02a6899 100644 (file)
@@ -229,9 +229,6 @@ l2vtr_configure (vlib_main_t * vlib_main, vnet_main_t * vnet_main, u32 sw_if_ind
        }
       in_config->pop_bytes = 8;
       in_config->push_bytes = 0;
-
-      out_config->push_bytes = in_config->pop_bytes;
-      out_config->pop_bytes = in_config->push_bytes;
       break;
 
     case L2_VTR_PUSH_1: