vxlan*: migrate old MULTIARCH macros to VLIB_NODE_FN
[vpp.git] / src / vnet / vxlan / vxlan.c
index 93a4e26..ff796ec 100644 (file)
@@ -241,7 +241,7 @@ vxlan_rewrite (vxlan_tunnel_t * t, bool is_ip6)
   vxlan_header_t *vxlan;
   /* Fixed portion of the (outer) ip header */
 
-  memset (&h, 0, sizeof (h));
+  clib_memset (&h, 0, sizeof (h));
   if (!is_ip6)
     {
       ip4_header_t *ip = &h.h4.ip4;
@@ -419,7 +419,7 @@ int vnet_vxlan_add_del_tunnel
 
       vxlan_tunnel_t *t;
       pool_get_aligned (vxm->tunnels, t, CLIB_CACHE_LINE_BYTES);
-      memset (t, 0, sizeof (*t));
+      clib_memset (t, 0, sizeof (*t));
       dev_instance = t - vxm->tunnels;
 
       /* copy from arg structure */
@@ -599,7 +599,8 @@ int vnet_vxlan_add_del_tunnel
       if (!p)
        return VNET_API_ERROR_NO_SUCH_ENTRY;
 
-      u32 instance = vxm->tunnel_index_by_sw_if_index[p->sw_if_index];
+      u32 instance = is_ip6 ? key6.value :
+       vxm->tunnel_index_by_sw_if_index[p->sw_if_index];
       vxlan_tunnel_t *t = pool_elt_at_index (vxm->tunnels, instance);
 
       sw_if_index = t->sw_if_index;
@@ -918,12 +919,38 @@ VLIB_CLI_COMMAND (show_vxlan_tunnel_command, static) = {
 void
 vnet_int_vxlan_bypass_mode (u32 sw_if_index, u8 is_ip6, u8 is_enable)
 {
+  vxlan_main_t *vxm = &vxlan_main;
+
+  if (pool_is_free_index (vxm->vnet_main->interface_main.sw_interfaces,
+                         sw_if_index))
+    return;
+
+  is_enable = ! !is_enable;
+
   if (is_ip6)
-    vnet_feature_enable_disable ("ip6-unicast", "ip6-vxlan-bypass",
-                                sw_if_index, is_enable, 0, 0);
+    {
+      if (clib_bitmap_get (vxm->bm_ip6_bypass_enabled_by_sw_if, sw_if_index)
+         != is_enable)
+       {
+         vnet_feature_enable_disable ("ip6-unicast", "ip6-vxlan-bypass",
+                                      sw_if_index, is_enable, 0, 0);
+         vxm->bm_ip6_bypass_enabled_by_sw_if =
+           clib_bitmap_set (vxm->bm_ip6_bypass_enabled_by_sw_if,
+                            sw_if_index, is_enable);
+       }
+    }
   else
-    vnet_feature_enable_disable ("ip4-unicast", "ip4-vxlan-bypass",
-                                sw_if_index, is_enable, 0, 0);
+    {
+      if (clib_bitmap_get (vxm->bm_ip4_bypass_enabled_by_sw_if, sw_if_index)
+         != is_enable)
+       {
+         vnet_feature_enable_disable ("ip4-unicast", "ip4-vxlan-bypass",
+                                      sw_if_index, is_enable, 0, 0);
+         vxm->bm_ip4_bypass_enabled_by_sw_if =
+           clib_bitmap_set (vxm->bm_ip4_bypass_enabled_by_sw_if,
+                            sw_if_index, is_enable);
+       }
+    }
 }
 
 
@@ -1215,6 +1242,9 @@ vxlan_init (vlib_main_t * vm)
   vnet_flow_get_range (vxm->vnet_main, "vxlan", 1024 * 1024,
                       &vxm->flow_id_start);
 
+  vxm->bm_ip4_bypass_enabled_by_sw_if = 0;
+  vxm->bm_ip6_bypass_enabled_by_sw_if = 0;
+
   /* initialize the ip6 hash */
   clib_bihash_init_16_8 (&vxm->vxlan4_tunnel_by_key, "vxlan4",
                         VXLAN_HASH_NUM_BUCKETS, VXLAN_HASH_MEMORY_SIZE);