fib: fib api updates
[vpp.git] / src / vnet / vxlan / vxlan.c
index 4276d66..def306a 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 */
@@ -538,8 +538,9 @@ int vnet_vxlan_add_del_tunnel
                .frp_addr = zero_addr,
                .frp_sw_if_index = 0xffffffff,
                .frp_fib_index = ~0,
-               .frp_weight = 0,
+               .frp_weight = 1,
                .frp_flags = FIB_ROUTE_PATH_LOCAL,
+               .frp_mitf_flags = MFIB_ITF_FLAG_FORWARD,
              };
              const mfib_prefix_t mpfx = {
                .fp_proto = fp,
@@ -553,17 +554,14 @@ int vnet_vxlan_add_del_tunnel
               *  - the accepting interface is that from the API
               */
              mfib_table_entry_path_update (t->encap_fib_index,
-                                           &mpfx,
-                                           MFIB_SOURCE_VXLAN,
-                                           &path, MFIB_ITF_FLAG_FORWARD);
+                                           &mpfx, MFIB_SOURCE_VXLAN, &path);
 
              path.frp_sw_if_index = a->mcast_sw_if_index;
              path.frp_flags = FIB_ROUTE_PATH_FLAG_NONE;
+             path.frp_mitf_flags = MFIB_ITF_FLAG_ACCEPT;
              mfei = mfib_table_entry_path_update (t->encap_fib_index,
                                                   &mpfx,
-                                                  MFIB_SOURCE_VXLAN,
-                                                  &path,
-                                                  MFIB_ITF_FLAG_ACCEPT);
+                                                  MFIB_SOURCE_VXLAN, &path);
 
              /*
               * Create the mcast adjacency to send traffic to the group
@@ -639,6 +637,17 @@ int vnet_vxlan_add_del_tunnel
   if (sw_if_indexp)
     *sw_if_indexp = sw_if_index;
 
+  if (a->is_add)
+    {
+      /* register udp ports */
+      if (!is_ip6 && !udp_is_valid_dst_port (UDP_DST_PORT_vxlan, 1))
+       udp_register_dst_port (vxm->vlib_main, UDP_DST_PORT_vxlan,
+                              vxlan4_input_node.index, 1);
+      if (is_ip6 && !udp_is_valid_dst_port (UDP_DST_PORT_vxlan6, 0))
+       udp_register_dst_port (vxm->vlib_main, UDP_DST_PORT_vxlan6,
+                              vxlan6_input_node.index, 0);
+    }
+
   return 0;
 }
 
@@ -919,12 +928,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);
+       }
+    }
 }
 
 
@@ -1216,6 +1251,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);
@@ -1226,11 +1264,6 @@ vxlan_init (vlib_main_t * vm)
                                       sizeof (ip46_address_t),
                                       sizeof (mcast_shared_t));
 
-  udp_register_dst_port (vm, UDP_DST_PORT_vxlan,
-                        vxlan4_input_node.index, /* is_ip4 */ 1);
-  udp_register_dst_port (vm, UDP_DST_PORT_vxlan6,
-                        vxlan6_input_node.index, /* is_ip4 */ 0);
-
   fib_node_register_type (FIB_NODE_TYPE_VXLAN_TUNNEL, &vxlan_vft);
 
   return 0;