Fix ERSPAN encap to set EN bits in the header and add test case
[vpp.git] / src / vnet / gre / gre.c
index a370292..2918f35 100644 (file)
@@ -383,19 +383,22 @@ gre_interface_tx (vlib_main_t * vm,
              adj_index0 = gt0->l2_adj_index;
            }
 
-         if (sw_if_index0 == vnet_buffer (b1)->sw_if_index[VLIB_TX])
+         if (sw_if_index1 != vnet_buffer (b1)->sw_if_index[VLIB_TX])
            {
-             sw_if_index1 = sw_if_index0;
-             gt1 = gt0;
-             adj_index1 = adj_index0;
-           }
-         else if (sw_if_index1 != vnet_buffer (b1)->sw_if_index[VLIB_TX])
-           {
-             sw_if_index1 = vnet_buffer (b1)->sw_if_index[VLIB_TX];
-             vnet_hw_interface_t *hi1 =
-               vnet_get_sup_hw_interface (vnm, sw_if_index1);
-             gt1 = &gm->tunnels[hi1->dev_instance];
-             adj_index1 = gt1->l2_adj_index;
+             if (sw_if_index0 == vnet_buffer (b1)->sw_if_index[VLIB_TX])
+               {
+                 sw_if_index1 = sw_if_index0;
+                 gt1 = gt0;
+                 adj_index1 = adj_index0;
+               }
+             else
+               {
+                 sw_if_index1 = vnet_buffer (b1)->sw_if_index[VLIB_TX];
+                 vnet_hw_interface_t *hi1 =
+                   vnet_get_sup_hw_interface (vnm, sw_if_index1);
+                 gt1 = &gm->tunnels[hi1->dev_instance];
+                 adj_index1 = gt1->l2_adj_index;
+               }
            }
 
          vnet_buffer (b0)->ip.adj_index[VLIB_TX] = adj_index0;
@@ -407,10 +410,10 @@ gre_interface_tx (vlib_main_t * vm,
              vlib_buffer_advance (b0, -sizeof (erspan_t2_t));
              erspan_t2_t *h0 = vlib_buffer_get_current (b0);
              u32 seq_num = clib_smp_atomic_add (&gt0->gre_sn->seq_num, 1);
-             u64 ver1 = clib_host_to_net_u64 (0x1000000000000000);
+             u64 hdr = clib_host_to_net_u64 (ERSPAN_HDR2);
              h0->seq_num = clib_host_to_net_u32 (seq_num);
-             h0->t2_u64 = ver1;        /* all 0's except ver=1 */
-             h0->t2.cos_en_t_session =
+             h0->t2_u64 = hdr;
+             h0->t2.cos_en_t_session |=
                clib_host_to_net_u16 (gt0->session_id);
            }
          if (PREDICT_FALSE (gt1->type == GRE_TUNNEL_TYPE_ERSPAN))
@@ -419,10 +422,10 @@ gre_interface_tx (vlib_main_t * vm,
              vlib_buffer_advance (b1, -sizeof (erspan_t2_t));
              erspan_t2_t *h1 = vlib_buffer_get_current (b1);
              u32 seq_num = clib_smp_atomic_add (&gt1->gre_sn->seq_num, 1);
-             u64 ver1 = clib_host_to_net_u64 (0x1000000000000000);
+             u64 hdr = clib_host_to_net_u64 (ERSPAN_HDR2);
              h1->seq_num = clib_host_to_net_u32 (seq_num);
-             h1->t2_u64 = ver1;        /* all 0's except ver=1 */
-             h1->t2.cos_en_t_session =
+             h1->t2_u64 = hdr;
+             h1->t2.cos_en_t_session |=
                clib_host_to_net_u16 (gt1->session_id);
            }
 
@@ -478,10 +481,10 @@ gre_interface_tx (vlib_main_t * vm,
              vlib_buffer_advance (b0, -sizeof (erspan_t2_t));
              erspan_t2_t *h0 = vlib_buffer_get_current (b0);
              u32 seq_num = clib_smp_atomic_add (&gt0->gre_sn->seq_num, 1);
-             u64 ver1 = clib_host_to_net_u64 (0x1000000000000000);
+             u64 hdr = clib_host_to_net_u64 (ERSPAN_HDR2);
              h0->seq_num = clib_host_to_net_u32 (seq_num);
-             h0->t2_u64 = ver1;        /* all 0's except ver=1 */
-             h0->t2.cos_en_t_session =
+             h0->t2_u64 = hdr;
+             h0->t2.cos_en_t_session |=
                clib_host_to_net_u16 (gt0->session_id);
            }