vxlan: crash on configuring vxlan tunnel on l3 mode
[vpp.git] / src / vnet / vxlan / vxlan.c
index dcf4805..484b7c2 100644 (file)
@@ -82,6 +82,8 @@ format_vxlan_tunnel (u8 * s, va_list * args)
   if (PREDICT_FALSE (t->decap_next_index != VXLAN_INPUT_NEXT_L2_INPUT))
     s = format (s, "decap-next-%U ", format_decap_next, t->decap_next_index);
 
+  s = format (s, "l3 %u ", t->is_l3);
+
   if (PREDICT_FALSE (ip46_address_is_multicast (&t->dst)))
     s = format (s, "mcast-sw-if-idx %d ", t->mcast_sw_if_index);
 
@@ -245,7 +247,8 @@ const static fib_node_vft_t vxlan_vft = {
   _ (src)                                                                     \
   _ (dst)                                                                     \
   _ (src_port)                                                                \
-  _ (dst_port)
+  _ (dst_port)                                                                \
+  _ (is_l3)
 
 static void
 vxlan_rewrite (vxlan_tunnel_t * t, bool is_ip6)
@@ -448,7 +451,7 @@ int vnet_vxlan_add_del_tunnel
       t->user_instance = user_instance; /* name */
       t->flow_index = ~0;
 
-      if (a->is_l3)
+      if (a->is_l3 == 0)
        t->hw_if_index =
          vnet_register_interface (vnm, vxlan_device_class.index, dev_instance,
                                   vxlan_hw_class.index, dev_instance);
@@ -503,7 +506,7 @@ int vnet_vxlan_add_del_tunnel
 
       if (add_failed)
        {
-         if (a->is_l3)
+         if (a->is_l3 == 0)
            vnet_delete_hw_interface (vnm, t->hw_if_index);
          else
            ethernet_delete_interface (vnm, t->hw_if_index);
@@ -581,15 +584,16 @@ int vnet_vxlan_add_del_tunnel
               *  - the forwarding interface is for-us
               *  - the accepting interface is that from the API
               */
-             mfib_table_entry_path_update (t->encap_fib_index,
-                                           &mpfx, MFIB_SOURCE_VXLAN, &path);
+             mfib_table_entry_path_update (t->encap_fib_index, &mpfx,
+                                           MFIB_SOURCE_VXLAN,
+                                           MFIB_ENTRY_FLAG_NONE, &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);
+             mfei = mfib_table_entry_path_update (
+               t->encap_fib_index, &mpfx, MFIB_SOURCE_VXLAN,
+               MFIB_ENTRY_FLAG_NONE, &path);
 
              /*
               * Create the mcast adjacency to send traffic to the group
@@ -655,8 +659,7 @@ int vnet_vxlan_add_del_tunnel
          mcast_shared_remove (&t->dst);
        }
 
-      vnet_hw_interface_t *hw = vnet_get_hw_interface (vnm, t->hw_if_index);
-      if (hw->dev_class_index == vxlan_device_class.index)
+      if (t->is_l3 == 0)
        vnet_delete_hw_interface (vnm, t->hw_if_index);
       else
        ethernet_delete_interface (vnm, t->hw_if_index);
@@ -843,7 +846,6 @@ vxlan_add_del_tunnel_command_fn (vlib_main_t * vm,
 
   vnet_vxlan_add_del_tunnel_args_t a = { .is_add = is_add,
                                         .is_ip6 = ipv6_set,
-                                        .is_l3 = is_l3,
                                         .instance = instance,
 #define _(x) .x = x,
                                         foreach_copy_field
@@ -1073,7 +1075,7 @@ set_ip4_vxlan_bypass (vlib_main_t * vm,
 /*?
  * This command adds the 'ip4-vxlan-bypass' graph node for a given interface.
  * By adding the IPv4 vxlan-bypass graph node to an interface, the node checks
- *  for and validate input vxlan packet and bypass ip4-lookup, ip4-local,
+ * for and validate input vxlan packet and bypass ip4-lookup, ip4-local,
  * ip4-udp-lookup nodes to speedup vxlan packet forwarding. This node will
  * cause extra overhead to for non-vxlan packets which is kept at a minimum.
  *
@@ -1130,7 +1132,7 @@ set_ip6_vxlan_bypass (vlib_main_t * vm,
 /*?
  * This command adds the 'ip6-vxlan-bypass' graph node for a given interface.
  * By adding the IPv6 vxlan-bypass graph node to an interface, the node checks
- *  for and validate input vxlan packet and bypass ip6-lookup, ip6-local,
+ * for and validate input vxlan packet and bypass ip6-lookup, ip6-local,
  * ip6-udp-lookup nodes to speedup vxlan packet forwarding. This node will
  * cause extra overhead to for non-vxlan packets which is kept at a minimum.
  *