ikev2: add support for custom ipsec-over-udp port
[vpp.git] / src / vnet / vxlan / encap.c
index 3132090..da890b2 100644 (file)
@@ -49,6 +49,7 @@ typedef struct {
   u32 vni;
 } vxlan_encap_trace_t;
 
+#ifndef CLIB_MARCH_VARIANT
 u8 * format_vxlan_encap_trace (u8 * s, va_list * args)
 {
   CLIB_UNUSED (vlib_main_t * vm) = va_arg (*args, vlib_main_t *);
@@ -60,6 +61,7 @@ u8 * format_vxlan_encap_trace (u8 * s, va_list * args)
              t->tunnel_index, t->vni);
   return s;
 }
+#endif
 
 always_inline uword
 vxlan_encap_inline (vlib_main_t * vm,
@@ -90,12 +92,10 @@ vxlan_encap_inline (vlib_main_t * vm,
 
   u8 const underlay_hdr_len = is_ip4 ?
     sizeof(ip4_vxlan_header_t) : sizeof(ip6_vxlan_header_t);
-  u8 const rw_hdr_offset = sizeof t0->rewrite_data - underlay_hdr_len;
   u16 const l3_len = is_ip4 ? sizeof(ip4_header_t) : sizeof(ip6_header_t);
-  u32 const csum_flags = is_ip4 ?
-    VNET_BUFFER_F_OFFLOAD_IP_CKSUM | VNET_BUFFER_F_IS_IP4 |
-    VNET_BUFFER_F_OFFLOAD_UDP_CKSUM :
-    VNET_BUFFER_F_OFFLOAD_UDP_CKSUM;
+  u32 const csum_flags = is_ip4 ? VNET_BUFFER_F_OFFLOAD_IP_CKSUM |
+      VNET_BUFFER_F_IS_IP4 | VNET_BUFFER_F_OFFLOAD_UDP_CKSUM :
+      VNET_BUFFER_F_IS_IP6 | VNET_BUFFER_F_OFFLOAD_UDP_CKSUM;
 
   while (n_left_from > 0)
     {
@@ -171,6 +171,7 @@ vxlan_encap_inline (vlib_main_t * vm,
 
           ASSERT(t0->rewrite_header.data_bytes == underlay_hdr_len);
           ASSERT(t1->rewrite_header.data_bytes == underlay_hdr_len);
+          vnet_rewrite_two_headers(*t0, *t1, vlib_buffer_get_current(b0), vlib_buffer_get_current(b1), underlay_hdr_len);
 
           vlib_buffer_advance (b0, -underlay_hdr_len);
           vlib_buffer_advance (b1, -underlay_hdr_len);
@@ -183,12 +184,6 @@ vxlan_encap_inline (vlib_main_t * vm,
           void * underlay0 = vlib_buffer_get_current(b0);
           void * underlay1 = vlib_buffer_get_current(b1);
 
-         /* vnet_rewrite_two_header writes only in (uword) 8 bytes chunks
-           * and discards the first 4 bytes of the (36 bytes ip4 underlay)  rewrite
-           * use memcpy as a workaround */
-          clib_memcpy(underlay0, t0->rewrite_header.data + rw_hdr_offset, underlay_hdr_len);
-          clib_memcpy(underlay1, t1->rewrite_header.data + rw_hdr_offset, underlay_hdr_len);
-
           ip4_header_t * ip4_0, * ip4_1;
          qos_bits_t ip4_0_tos = 0, ip4_1_tos = 0;
           ip6_header_t * ip6_0, * ip6_1;
@@ -292,6 +287,10 @@ vxlan_encap_inline (vlib_main_t * vm,
                 udp1->checksum = 0xffff;
             }
 
+        /* save inner packet flow_hash for load-balance node */
+        vnet_buffer (b0)->ip.flow_hash = flow_hash0;
+        vnet_buffer (b1)->ip.flow_hash = flow_hash1;
+
        if (sw_if_index0 == sw_if_index1)
        {
           vlib_increment_combined_counter (tx_counter, thread_index,
@@ -352,15 +351,11 @@ vxlan_encap_inline (vlib_main_t * vm,
          vnet_buffer(b0)->ip.adj_index[VLIB_TX] = dpoi_idx0;
 
           ASSERT(t0->rewrite_header.data_bytes == underlay_hdr_len);
+          vnet_rewrite_one_header(*t0, vlib_buffer_get_current(b0), underlay_hdr_len);
 
           vlib_buffer_advance (b0, -underlay_hdr_len);
           void * underlay0 = vlib_buffer_get_current(b0);
 
-         /* vnet_rewrite_one_header writes only in (uword) 8 bytes chunks
-           * and discards the first 4 bytes of the (36 bytes ip4 underlay)  rewrite
-           * use memcpy as a workaround */
-          clib_memcpy(underlay0, t0->rewrite_header.data + rw_hdr_offset, underlay_hdr_len);
-
          u32 len0 = vlib_buffer_length_in_chain (vm, b0);
           u16 payload_l0 = clib_host_to_net_u16 (len0 - l3_len);
 
@@ -433,6 +428,9 @@ vxlan_encap_inline (vlib_main_t * vm,
                 udp0->checksum = 0xffff;
             }
 
+          /* reuse inner packet flow_hash for load-balance node */
+          vnet_buffer (b0)->ip.flow_hash = flow_hash0;
+
           vlib_increment_combined_counter (tx_counter, thread_index,
               sw_if_index0, 1, len0);
           pkts_encapsulated ++;
@@ -460,8 +458,7 @@ vxlan_encap_inline (vlib_main_t * vm,
   return from_frame->n_vectors;
 }
 
-static uword
-vxlan4_encap (vlib_main_t * vm,
+VLIB_NODE_FN (vxlan4_encap_node) (vlib_main_t * vm,
              vlib_node_runtime_t * node,
              vlib_frame_t * from_frame)
 {
@@ -471,8 +468,7 @@ vxlan4_encap (vlib_main_t * vm,
                             /* csum_offload */ 0);
 }
 
-static uword
-vxlan6_encap (vlib_main_t * vm,
+VLIB_NODE_FN (vxlan6_encap_node) (vlib_main_t * vm,
              vlib_node_runtime_t * node,
              vlib_frame_t * from_frame)
 {
@@ -482,7 +478,6 @@ vxlan6_encap (vlib_main_t * vm,
 }
 
 VLIB_REGISTER_NODE (vxlan4_encap_node) = {
-  .function = vxlan4_encap,
   .name = "vxlan4-encap",
   .vector_size = sizeof (u32),
   .format_trace = format_vxlan_encap_trace,
@@ -495,10 +490,7 @@ VLIB_REGISTER_NODE (vxlan4_encap_node) = {
   },
 };
 
-VLIB_NODE_FUNCTION_MULTIARCH (vxlan4_encap_node, vxlan4_encap)
-
 VLIB_REGISTER_NODE (vxlan6_encap_node) = {
-  .function = vxlan6_encap,
   .name = "vxlan6-encap",
   .vector_size = sizeof (u32),
   .format_trace = format_vxlan_encap_trace,
@@ -511,5 +503,3 @@ VLIB_REGISTER_NODE (vxlan6_encap_node) = {
   },
 };
 
-VLIB_NODE_FUNCTION_MULTIARCH (vxlan6_encap_node, vxlan6_encap)
-