- u32 bi0 = from[0];
- u32 bi1 = from[1];
- vlib_buffer_t *b0 = vlib_get_buffer (vm, bi0);
- vlib_buffer_t *b1 = vlib_get_buffer (vm, bi1);
-
- to_next[0] = bi0;
- to_next[1] = bi1;
- from += 2;
- to_next += 2;
- n_left_to_next -= 2;
- n_left_from -= 2;
-
- if (sw_if_index0 != vnet_buffer (b0)->sw_if_index[VLIB_TX])
- {
- sw_if_index0 = vnet_buffer (b0)->sw_if_index[VLIB_TX];
- vnet_hw_interface_t *hi0 =
- vnet_get_sup_hw_interface (vnm, sw_if_index0);
- gt0 = &gm->tunnels[hi0->dev_instance];
- adj_index0 = gt0->l2_adj_index;
- }
-
- if (sw_if_index1 != vnet_buffer (b1)->sw_if_index[VLIB_TX])
- {
- 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;
- vnet_buffer (b1)->ip.adj_index[VLIB_TX] = adj_index1;
-
- if (PREDICT_FALSE (gt0->type == GRE_TUNNEL_TYPE_ERSPAN))
- {
- /* Encap GRE seq# and ERSPAN type II header */
- vlib_buffer_advance (b0, -sizeof (erspan_t2_t));
- erspan_t2_t *h0 = vlib_buffer_get_current (b0);
- u32 seq_num = clib_smp_atomic_add (>0->gre_sn->seq_num, 1);
- u64 hdr = clib_host_to_net_u64 (ERSPAN_HDR2);
- h0->seq_num = clib_host_to_net_u32 (seq_num);
- 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))
- {
- /* Encap GRE seq# and ERSPAN type II header */
- vlib_buffer_advance (b1, -sizeof (erspan_t2_t));
- erspan_t2_t *h1 = vlib_buffer_get_current (b1);
- u32 seq_num = clib_smp_atomic_add (>1->gre_sn->seq_num, 1);
- u64 hdr = clib_host_to_net_u64 (ERSPAN_HDR2);
- h1->seq_num = clib_host_to_net_u32 (seq_num);
- h1->t2_u64 = hdr;
- h1->t2.cos_en_t_session |=
- clib_host_to_net_u16 (gt1->session_id);
- }
-
- if (PREDICT_FALSE (b0->flags & VLIB_BUFFER_IS_TRACED))
- {
- gre_tx_trace_t *tr0 = vlib_add_trace (vm, node,
- b0, sizeof (*tr0));
- tr0->tunnel_id = gt0 - gm->tunnels;
- tr0->src = gt0->tunnel_src;
- tr0->dst = gt0->tunnel_dst.fp_addr;
- tr0->length = vlib_buffer_length_in_chain (vm, b0);
- }
- if (PREDICT_FALSE (b1->flags & VLIB_BUFFER_IS_TRACED))
- {
- gre_tx_trace_t *tr1 = vlib_add_trace (vm, node,
- b1, sizeof (*tr1));
- tr1->tunnel_id = gt1 - gm->tunnels;
- tr1->src = gt1->tunnel_src;
- tr1->dst = gt1->tunnel_dst.fp_addr;
- tr1->length = vlib_buffer_length_in_chain (vm, b1);
- }