geneve: Fix the byte swapping for the VNI
[vpp.git] / src / vnet / geneve / decap.c
index 2e6e9c5..10a17ce 100644 (file)
@@ -17,9 +17,6 @@
 #include <vnet/pg/pg.h>
 #include <vnet/geneve/geneve.h>
 
-vlib_node_registration_t geneve4_input_node;
-vlib_node_registration_t geneve6_input_node;
-
 typedef struct
 {
   u32 next_index;
@@ -82,16 +79,18 @@ geneve_input (vlib_main_t * vm,
   geneve4_tunnel_key_t last_key4;
   geneve6_tunnel_key_t last_key6;
   u32 pkts_decapsulated = 0;
-  u32 thread_index = vlib_get_thread_index ();
+  u32 thread_index = vm->thread_index;
   u32 stats_sw_if_index, stats_n_packets, stats_n_bytes;
+  vlib_buffer_t *bufs[VLIB_FRAME_SIZE], **b = bufs;
 
   if (is_ip4)
     last_key4.as_u64 = ~0;
   else
-    memset (&last_key6, 0xff, sizeof (last_key6));
+    clib_memset (&last_key6, 0xff, sizeof (last_key6));
 
   from = vlib_frame_vector_args (from_frame);
   n_left_from = from_frame->n_vectors;
+  vlib_get_buffers (vm, from, bufs, n_left_from);
 
   next_index = node->cached_next_index;
   stats_sw_if_index = node->runtime_data[0];
@@ -120,16 +119,11 @@ geneve_input (vlib_main_t * vm,
 
          /* Prefetch next iteration. */
          {
-           vlib_buffer_t *p2, *p3;
-
-           p2 = vlib_get_buffer (vm, from[2]);
-           p3 = vlib_get_buffer (vm, from[3]);
-
-           vlib_prefetch_buffer_header (p2, LOAD);
-           vlib_prefetch_buffer_header (p3, LOAD);
+           vlib_prefetch_buffer_header (b[2], LOAD);
+           vlib_prefetch_buffer_header (b[3], LOAD);
 
-           CLIB_PREFETCH (p2->data, 2 * CLIB_CACHE_LINE_BYTES, LOAD);
-           CLIB_PREFETCH (p3->data, 2 * CLIB_CACHE_LINE_BYTES, LOAD);
+           CLIB_PREFETCH (b[2]->data, 2 * CLIB_CACHE_LINE_BYTES, LOAD);
+           CLIB_PREFETCH (b[3]->data, 2 * CLIB_CACHE_LINE_BYTES, LOAD);
          }
 
          bi0 = from[0];
@@ -141,8 +135,9 @@ geneve_input (vlib_main_t * vm,
          n_left_to_next -= 2;
          n_left_from -= 2;
 
-         b0 = vlib_get_buffer (vm, bi0);
-         b1 = vlib_get_buffer (vm, bi1);
+         b0 = b[0];
+         b1 = b[1];
+         b += 2;
 
          /* udp leaves current_data pointing at the geneve header */
          geneve0 = vlib_buffer_get_current (b0);
@@ -173,11 +168,10 @@ geneve_input (vlib_main_t * vm,
          /* pop (ip, udp, geneve) */
          if (is_ip4)
            {
-             vlib_buffer_advance
-               (b0,
-                sizeof (*ip4_0) + sizeof (udp_header_t) +
-                GENEVE_BASE_HEADER_LENGTH +
-                vnet_get_geneve_options_len (geneve0));
+             vlib_buffer_advance (b0,
+                                  sizeof (*ip4_0) + sizeof (udp_header_t) +
+                                  GENEVE_BASE_HEADER_LENGTH +
+                                  vnet_get_geneve_options_len (geneve0));
              vlib_buffer_advance (b1,
                                   sizeof (*ip4_1) + sizeof (udp_header_t) +
                                   GENEVE_BASE_HEADER_LENGTH +
@@ -185,14 +179,13 @@ geneve_input (vlib_main_t * vm,
            }
          else
            {
-             vlib_buffer_advance
-               (b0,
-                sizeof (*ip6_0) + sizeof (udp_header_t) +
-                GENEVE_BASE_HEADER_LENGTH +
-                vnet_get_geneve_options_len (geneve0));
              vlib_buffer_advance (b0,
                                   sizeof (*ip6_0) + sizeof (udp_header_t) +
                                   GENEVE_BASE_HEADER_LENGTH +
+                                  vnet_get_geneve_options_len (geneve0));
+             vlib_buffer_advance (b1,
+                                  sizeof (*ip6_1) + sizeof (udp_header_t) +
+                                  GENEVE_BASE_HEADER_LENGTH +
                                   vnet_get_geneve_options_len (geneve1));
            }
 
@@ -220,7 +213,7 @@ geneve_input (vlib_main_t * vm,
          if (is_ip4)
            {
              key4_0.remote = ip4_0->src_address.as_u32;
-             key4_0.vni = vnet_get_geneve_vni_bigendian (geneve0);
+             key4_0.vni = vnet_get_geneve_vni_network_order (geneve0);
 
              /* Make sure GENEVE tunnel exist according to packet SIP and VNI */
              if (PREDICT_FALSE (key4_0.as_u64 != last_key4.as_u64))
@@ -239,7 +232,7 @@ geneve_input (vlib_main_t * vm,
                tunnel_index0 = last_tunnel_index;
              t0 = pool_elt_at_index (vxm->tunnels, tunnel_index0);
 
-             /* Validate GENEVE tunnel encap-fib index agaist packet */
+             /* Validate GENEVE tunnel encap-fib index against packet */
              if (PREDICT_FALSE (validate_geneve_fib (b0, t0, is_ip4) == 0))
                {
                  error0 = GENEVE_ERROR_NO_SUCH_TUNNEL;
@@ -255,7 +248,7 @@ geneve_input (vlib_main_t * vm,
                  (ip4_address_is_multicast (&ip4_0->dst_address)))
                {
                  key4_0.remote = ip4_0->dst_address.as_u32;
-                 key4_0.vni = vnet_get_geneve_vni_bigendian (geneve0);
+                 key4_0.vni = vnet_get_geneve_vni_network_order (geneve0);
                  /* Make sure mcast GENEVE tunnel exist by packet DIP and VNI */
                  p0 = hash_get (vxm->geneve4_tunnel_by_key, key4_0.as_u64);
                  if (PREDICT_TRUE (p0 != NULL))
@@ -273,7 +266,7 @@ geneve_input (vlib_main_t * vm,
            {
              key6_0.remote.as_u64[0] = ip6_0->src_address.as_u64[0];
              key6_0.remote.as_u64[1] = ip6_0->src_address.as_u64[1];
-             key6_0.vni = vnet_get_geneve_vni_bigendian (geneve0);
+             key6_0.vni = vnet_get_geneve_vni_network_order (geneve0);
 
              /* Make sure GENEVE tunnel exist according to packet SIP and VNI */
              if (PREDICT_FALSE
@@ -286,14 +279,14 @@ geneve_input (vlib_main_t * vm,
                      next0 = GENEVE_INPUT_NEXT_DROP;
                      goto trace0;
                    }
-                 clib_memcpy (&last_key6, &key6_0, sizeof (key6_0));
+                 clib_memcpy_fast (&last_key6, &key6_0, sizeof (key6_0));
                  tunnel_index0 = last_tunnel_index = p0[0];
                }
              else
                tunnel_index0 = last_tunnel_index;
              t0 = pool_elt_at_index (vxm->tunnels, tunnel_index0);
 
-             /* Validate GENEVE tunnel encap-fib index agaist packet */
+             /* Validate GENEVE tunnel encap-fib index against packet */
              if (PREDICT_FALSE (validate_geneve_fib (b0, t0, is_ip4) == 0))
                {
                  error0 = GENEVE_ERROR_NO_SUCH_TUNNEL;
@@ -310,7 +303,7 @@ geneve_input (vlib_main_t * vm,
                {
                  key6_0.remote.as_u64[0] = ip6_0->dst_address.as_u64[0];
                  key6_0.remote.as_u64[1] = ip6_0->dst_address.as_u64[1];
-                 key6_0.vni = vnet_get_geneve_vni_bigendian (geneve0);
+                 key6_0.vni = vnet_get_geneve_vni_network_order (geneve0);
                  p0 = hash_get_mem (vxm->geneve6_tunnel_by_key, &key6_0);
                  if (PREDICT_TRUE (p0 != NULL))
                    {
@@ -387,7 +380,7 @@ geneve_input (vlib_main_t * vm,
          if (is_ip4)
            {
              key4_1.remote = ip4_1->src_address.as_u32;
-             key4_1.vni = vnet_get_geneve_vni_bigendian (geneve1);
+             key4_1.vni = vnet_get_geneve_vni_network_order (geneve1);
 
              /* Make sure unicast GENEVE tunnel exist by packet SIP and VNI */
              if (PREDICT_FALSE (key4_1.as_u64 != last_key4.as_u64))
@@ -406,7 +399,7 @@ geneve_input (vlib_main_t * vm,
                tunnel_index1 = last_tunnel_index;
              t1 = pool_elt_at_index (vxm->tunnels, tunnel_index1);
 
-             /* Validate GENEVE tunnel encap-fib index agaist packet */
+             /* Validate GENEVE tunnel encap-fib index against packet */
              if (PREDICT_FALSE (validate_geneve_fib (b1, t1, is_ip4) == 0))
                {
                  error1 = GENEVE_ERROR_NO_SUCH_TUNNEL;
@@ -422,7 +415,7 @@ geneve_input (vlib_main_t * vm,
                  (ip4_address_is_multicast (&ip4_1->dst_address)))
                {
                  key4_1.remote = ip4_1->dst_address.as_u32;
-                 key4_1.vni = vnet_get_geneve_vni_bigendian (geneve1);
+                 key4_1.vni = vnet_get_geneve_vni_network_order (geneve1);
                  /* Make sure mcast GENEVE tunnel exist by packet DIP and VNI */
                  p1 = hash_get (vxm->geneve4_tunnel_by_key, key4_1.as_u64);
                  if (PREDICT_TRUE (p1 != NULL))
@@ -440,7 +433,7 @@ geneve_input (vlib_main_t * vm,
            {
              key6_1.remote.as_u64[0] = ip6_1->src_address.as_u64[0];
              key6_1.remote.as_u64[1] = ip6_1->src_address.as_u64[1];
-             key6_1.vni = vnet_get_geneve_vni_bigendian (geneve1);
+             key6_1.vni = vnet_get_geneve_vni_network_order (geneve1);
 
              /* Make sure GENEVE tunnel exist according to packet SIP and VNI */
              if (PREDICT_FALSE
@@ -455,14 +448,14 @@ geneve_input (vlib_main_t * vm,
                      goto trace1;
                    }
 
-                 clib_memcpy (&last_key6, &key6_1, sizeof (key6_1));
+                 clib_memcpy_fast (&last_key6, &key6_1, sizeof (key6_1));
                  tunnel_index1 = last_tunnel_index = p1[0];
                }
              else
                tunnel_index1 = last_tunnel_index;
              t1 = pool_elt_at_index (vxm->tunnels, tunnel_index1);
 
-             /* Validate GENEVE tunnel encap-fib index agaist packet */
+             /* Validate GENEVE tunnel encap-fib index against packet */
              if (PREDICT_FALSE (validate_geneve_fib (b1, t1, is_ip4) == 0))
                {
                  error1 = GENEVE_ERROR_NO_SUCH_TUNNEL;
@@ -479,7 +472,7 @@ geneve_input (vlib_main_t * vm,
                {
                  key6_1.remote.as_u64[0] = ip6_1->dst_address.as_u64[0];
                  key6_1.remote.as_u64[1] = ip6_1->dst_address.as_u64[1];
-                 key6_1.vni = vnet_get_geneve_vni_bigendian (geneve1);
+                 key6_1.vni = vnet_get_geneve_vni_network_order (geneve1);
                  p1 = hash_get_mem (vxm->geneve6_tunnel_by_key, &key6_1);
                  if (PREDICT_TRUE (p1 != NULL))
                    {
@@ -566,7 +559,8 @@ geneve_input (vlib_main_t * vm,
          n_left_from -= 1;
          n_left_to_next -= 1;
 
-         b0 = vlib_get_buffer (vm, bi0);
+         b0 = b[0];
+         b += 1;
 
          /* udp leaves current_data pointing at the geneve header */
          geneve0 = vlib_buffer_get_current (b0);
@@ -624,7 +618,7 @@ geneve_input (vlib_main_t * vm,
          if (is_ip4)
            {
              key4_0.remote = ip4_0->src_address.as_u32;
-             key4_0.vni = vnet_get_geneve_vni_bigendian (geneve0);
+             key4_0.vni = vnet_get_geneve_vni_network_order (geneve0);
 
              /* Make sure unicast GENEVE tunnel exist by packet SIP and VNI */
              if (PREDICT_FALSE (key4_0.as_u64 != last_key4.as_u64))
@@ -659,7 +653,7 @@ geneve_input (vlib_main_t * vm,
                  (ip4_address_is_multicast (&ip4_0->dst_address)))
                {
                  key4_0.remote = ip4_0->dst_address.as_u32;
-                 key4_0.vni = vnet_get_geneve_vni_bigendian (geneve0);
+                 key4_0.vni = vnet_get_geneve_vni_network_order (geneve0);
                  /* Make sure mcast GENEVE tunnel exist by packet DIP and VNI */
                  p0 = hash_get (vxm->geneve4_tunnel_by_key, key4_0.as_u64);
                  if (PREDICT_TRUE (p0 != NULL))
@@ -677,7 +671,7 @@ geneve_input (vlib_main_t * vm,
            {
              key6_0.remote.as_u64[0] = ip6_0->src_address.as_u64[0];
              key6_0.remote.as_u64[1] = ip6_0->src_address.as_u64[1];
-             key6_0.vni = vnet_get_geneve_vni_bigendian (geneve0);
+             key6_0.vni = vnet_get_geneve_vni_network_order (geneve0);
 
              /* Make sure GENEVE tunnel exist according to packet SIP and VNI */
              if (PREDICT_FALSE
@@ -690,7 +684,7 @@ geneve_input (vlib_main_t * vm,
                      next0 = GENEVE_INPUT_NEXT_DROP;
                      goto trace00;
                    }
-                 clib_memcpy (&last_key6, &key6_0, sizeof (key6_0));
+                 clib_memcpy_fast (&last_key6, &key6_0, sizeof (key6_0));
                  tunnel_index0 = last_tunnel_index = p0[0];
                }
              else
@@ -714,7 +708,7 @@ geneve_input (vlib_main_t * vm,
                {
                  key6_0.remote.as_u64[0] = ip6_0->dst_address.as_u64[0];
                  key6_0.remote.as_u64[1] = ip6_0->dst_address.as_u64[1];
-                 key6_0.vni = vnet_get_geneve_vni_bigendian (geneve0);
+                 key6_0.vni = vnet_get_geneve_vni_network_order (geneve0);
                  p0 = hash_get_mem (vxm->geneve6_tunnel_by_key, &key6_0);
                  if (PREDICT_TRUE (p0 != NULL))
                    {
@@ -797,16 +791,16 @@ geneve_input (vlib_main_t * vm,
   return from_frame->n_vectors;
 }
 
-static uword
-geneve4_input (vlib_main_t * vm,
-              vlib_node_runtime_t * node, vlib_frame_t * from_frame)
+VLIB_NODE_FN (geneve4_input_node) (vlib_main_t * vm,
+                                  vlib_node_runtime_t * node,
+                                  vlib_frame_t * from_frame)
 {
   return geneve_input (vm, node, from_frame, /* is_ip4 */ 1);
 }
 
-static uword
-geneve6_input (vlib_main_t * vm,
-              vlib_node_runtime_t * node, vlib_frame_t * from_frame)
+VLIB_NODE_FN (geneve6_input_node) (vlib_main_t * vm,
+                                  vlib_node_runtime_t * node,
+                                  vlib_frame_t * from_frame)
 {
   return geneve_input (vm, node, from_frame, /* is_ip4 */ 0);
 }
@@ -820,7 +814,6 @@ static char *geneve_error_strings[] = {
 
 /* *INDENT-OFF* */
 VLIB_REGISTER_NODE (geneve4_input_node) = {
-  .function = geneve4_input,
   .name = "geneve4-input",
   /* Takes a vector of packets. */
   .vector_size = sizeof (u32),
@@ -838,10 +831,7 @@ VLIB_REGISTER_NODE (geneve4_input_node) = {
   // $$$$ .unformat_buffer = unformat_geneve_header,
 };
 
-VLIB_NODE_FUNCTION_MULTIARCH (geneve4_input_node, geneve4_input)
-
 VLIB_REGISTER_NODE (geneve6_input_node) = {
-  .function = geneve6_input,
   .name = "geneve6-input",
   /* Takes a vector of packets. */
   .vector_size = sizeof (u32),
@@ -857,8 +847,6 @@ VLIB_REGISTER_NODE (geneve6_input_node) = {
   .format_trace = format_geneve_rx_trace,
   // $$$$ .unformat_buffer = unformat_geneve_header,
 };
-
-VLIB_NODE_FUNCTION_MULTIARCH (geneve6_input_node, geneve6_input)
 /* *INDENT-ON* */
 
 typedef enum
@@ -877,8 +865,10 @@ ip_geneve_bypass_inline (vlib_main_t * vm,
   u32 *from, *to_next, n_left_from, n_left_to_next, next_index;
   vlib_node_runtime_t *error_node =
     vlib_node_get_runtime (vm, ip4_input_node.index);
-  ip4_address_t addr4;         /* last IPv4 address matching a local VTEP address */
-  ip6_address_t addr6;         /* last IPv6 address matching a local VTEP address */
+  vtep4_key_t last_vtep4;      /* last IPv4 address / fib index
+                                  matching a local VTEP address */
+  vtep6_key_t last_vtep6;      /* last IPv6 address / fib index
+                                  matching a local VTEP address */
 
   from = vlib_frame_vector_args (frame);
   n_left_from = frame->n_vectors;
@@ -888,9 +878,9 @@ ip_geneve_bypass_inline (vlib_main_t * vm,
     ip4_forward_next_trace (vm, node, frame, VLIB_TX);
 
   if (is_ip4)
-    addr4.data_u32 = ~0;
+    vtep4_key_init (&last_vtep4);
   else
-    ip6_address_set_zero (&addr6);
+    vtep6_key_init (&last_vtep6);
 
   while (n_left_from > 0)
     {
@@ -943,10 +933,8 @@ ip_geneve_bypass_inline (vlib_main_t * vm,
            }
 
          /* Setup packet for next IP feature */
-         vnet_feature_next (vnet_buffer (b0)->sw_if_index[VLIB_RX], &next0,
-                            b0);
-         vnet_feature_next (vnet_buffer (b1)->sw_if_index[VLIB_RX], &next1,
-                            b1);
+         vnet_feature_next (&next0, b0);
+         vnet_feature_next (&next1, b1);
 
          if (is_ip4)
            {
@@ -976,21 +964,13 @@ ip_geneve_bypass_inline (vlib_main_t * vm,
          /* Validate DIP against VTEPs */
          if (is_ip4)
            {
-             if (addr4.as_u32 != ip40->dst_address.as_u32)
-               {
-                 if (!hash_get (vxm->vtep4, ip40->dst_address.as_u32))
-                   goto exit0; /* no local VTEP for GENEVE packet */
-                 addr4 = ip40->dst_address;
-               }
+             if (!vtep4_check (&vxm->vtep_table, b0, ip40, &last_vtep4))
+               goto exit0;     /* no local VTEP for GENEVE packet */
            }
          else
            {
-             if (!ip6_address_is_equal (&addr6, &ip60->dst_address))
-               {
-                 if (!hash_get_mem (vxm->vtep6, &ip60->dst_address))
-                   goto exit0; /* no local VTEP for GENEVE packet */
-                 addr6 = ip60->dst_address;
-               }
+             if (!vtep6_check (&vxm->vtep_table, b0, ip60, &last_vtep6))
+               goto exit0;     /* no local VTEP for GENEVE packet */
            }
 
          flags0 = b0->flags;
@@ -1062,21 +1042,13 @@ ip_geneve_bypass_inline (vlib_main_t * vm,
          /* Validate DIP against VTEPs */
          if (is_ip4)
            {
-             if (addr4.as_u32 != ip41->dst_address.as_u32)
-               {
-                 if (!hash_get (vxm->vtep4, ip41->dst_address.as_u32))
-                   goto exit1; /* no local VTEP for GENEVE packet */
-                 addr4 = ip41->dst_address;
-               }
+             if (!vtep4_check (&vxm->vtep_table, b1, ip41, &last_vtep4))
+               goto exit1;     /* no local VTEP for GENEVE packet */
            }
          else
            {
-             if (!ip6_address_is_equal (&addr6, &ip61->dst_address))
-               {
-                 if (!hash_get_mem (vxm->vtep6, &ip61->dst_address))
-                   goto exit1; /* no local VTEP for GENEVE packet */
-                 addr6 = ip61->dst_address;
-               }
+             if (!vtep6_check (&vxm->vtep_table, b1, ip61, &last_vtep6))
+               goto exit1;     /* no local VTEP for GENEVE packet */
            }
 
          flags1 = b1->flags;
@@ -1161,8 +1133,7 @@ ip_geneve_bypass_inline (vlib_main_t * vm,
            ip60 = vlib_buffer_get_current (b0);
 
          /* Setup packet for next IP feature */
-         vnet_feature_next (vnet_buffer (b0)->sw_if_index[VLIB_RX], &next0,
-                            b0);
+         vnet_feature_next (&next0, b0);
 
          if (is_ip4)
            /* Treat IP4 frag packets as "experimental" protocol for now
@@ -1185,21 +1156,13 @@ ip_geneve_bypass_inline (vlib_main_t * vm,
          /* Validate DIP against VTEPs */
          if (is_ip4)
            {
-             if (addr4.as_u32 != ip40->dst_address.as_u32)
-               {
-                 if (!hash_get (vxm->vtep4, ip40->dst_address.as_u32))
-                   goto exit;  /* no local VTEP for GENEVE packet */
-                 addr4 = ip40->dst_address;
-               }
+             if (!vtep4_check (&vxm->vtep_table, b0, ip40, &last_vtep4))
+               goto exit;      /* no local VTEP for GENEVE packet */
            }
          else
            {
-             if (!ip6_address_is_equal (&addr6, &ip60->dst_address))
-               {
-                 if (!hash_get_mem (vxm->vtep6, &ip60->dst_address))
-                   goto exit;  /* no local VTEP for GENEVE packet */
-                 addr6 = ip60->dst_address;
-               }
+             if (!vtep6_check (&vxm->vtep_table, b0, ip60, &last_vtep6))
+               goto exit;      /* no local VTEP for GENEVE packet */
            }
 
          flags0 = b0->flags;
@@ -1267,9 +1230,9 @@ ip_geneve_bypass_inline (vlib_main_t * vm,
   return frame->n_vectors;
 }
 
-static uword
-ip4_geneve_bypass (vlib_main_t * vm,
-                  vlib_node_runtime_t * node, vlib_frame_t * frame)
+VLIB_NODE_FN (ip4_geneve_bypass_node) (vlib_main_t * vm,
+                                      vlib_node_runtime_t * node,
+                                      vlib_frame_t * frame)
 {
   return ip_geneve_bypass_inline (vm, node, frame, /* is_ip4 */ 1);
 }
@@ -1277,27 +1240,21 @@ ip4_geneve_bypass (vlib_main_t * vm,
 /* *INDENT-OFF* */
 VLIB_REGISTER_NODE (ip4_geneve_bypass_node) =
 {
-  .function = ip4_geneve_bypass,.name = "ip4-geneve-bypass",.vector_size =
-    sizeof (u32),.n_next_nodes = IP_GENEVE_BYPASS_N_NEXT,.next_nodes =
+  .name = "ip4-geneve-bypass",
+  .vector_size = sizeof (u32),
+  .n_next_nodes = IP_GENEVE_BYPASS_N_NEXT,.next_nodes =
   {
-  [IP_GENEVE_BYPASS_NEXT_DROP] = "error-drop",
-      [IP_GENEVE_BYPASS_NEXT_GENEVE] = "geneve4-input",}
-,.format_buffer = format_ip4_header,.format_trace =
-    format_ip4_forward_next_trace,};
-
-VLIB_NODE_FUNCTION_MULTIARCH (ip4_geneve_bypass_node, ip4_geneve_bypass)
-/* Dummy init function to get us linked in. */
-     clib_error_t *ip4_geneve_bypass_init (vlib_main_t * vm)
-{
-  return 0;
-}
-
-VLIB_INIT_FUNCTION (ip4_geneve_bypass_init);
+    [IP_GENEVE_BYPASS_NEXT_DROP] = "error-drop",
+    [IP_GENEVE_BYPASS_NEXT_GENEVE] = "geneve4-input",
+  },
+  .format_buffer = format_ip4_header,
+  .format_trace = format_ip4_forward_next_trace,
+};
 /* *INDENT-ON* */
 
-static uword
-ip6_geneve_bypass (vlib_main_t * vm,
-                  vlib_node_runtime_t * node, vlib_frame_t * frame)
+VLIB_NODE_FN (ip6_geneve_bypass_node) (vlib_main_t * vm,
+                                      vlib_node_runtime_t * node,
+                                      vlib_frame_t * frame)
 {
   return ip_geneve_bypass_inline (vm, node, frame, /* is_ip4 */ 0);
 }
@@ -1305,24 +1262,19 @@ ip6_geneve_bypass (vlib_main_t * vm,
 /* *INDENT-OFF* */
 VLIB_REGISTER_NODE (ip6_geneve_bypass_node) =
 {
-  .function = ip6_geneve_bypass,.name = "ip6-geneve-bypass",.vector_size =
-    sizeof (u32),.n_next_nodes = IP_GENEVE_BYPASS_N_NEXT,.next_nodes =
+  .name = "ip6-geneve-bypass",
+  .vector_size = sizeof (u32),
+  .n_next_nodes = IP_GENEVE_BYPASS_N_NEXT,
+  .next_nodes =
   {
-  [IP_GENEVE_BYPASS_NEXT_DROP] = "error-drop",
-      [IP_GENEVE_BYPASS_NEXT_GENEVE] = "geneve6-input",}
-,.format_buffer = format_ip6_header,.format_trace =
-    format_ip6_forward_next_trace,};
+    [IP_GENEVE_BYPASS_NEXT_DROP] = "error-drop",
+    [IP_GENEVE_BYPASS_NEXT_GENEVE] = "geneve6-input",
+  },
+  .format_buffer = format_ip6_header,
+  .format_trace = format_ip6_forward_next_trace,
+};
 /* *INDENT-ON* */
 
-VLIB_NODE_FUNCTION_MULTIARCH (ip6_geneve_bypass_node, ip6_geneve_bypass)
-/* Dummy init function to get us linked in. */
-     clib_error_t *ip6_geneve_bypass_init (vlib_main_t * vm)
-{
-  return 0;
-}
-
-VLIB_INIT_FUNCTION (ip6_geneve_bypass_init);
-
 /*
  * fd.io coding-style-patch-verification: ON
  *