Fixed vxlan link status.
[vpp.git] / vnet / vnet / vxlan / vxlan.c
index 316f8cb..6e38428 100644 (file)
@@ -66,11 +66,23 @@ static uword dummy_interface_tx (vlib_main_t * vm,
   return frame->n_vectors;
 }
 
+static clib_error_t *
+vxlan_interface_admin_up_down (vnet_main_t * vnm, u32 hw_if_index, u32 flags)
+{
+  if (flags & VNET_SW_INTERFACE_FLAG_ADMIN_UP)
+    vnet_hw_interface_set_flags (vnm, hw_if_index, VNET_HW_INTERFACE_FLAG_LINK_UP);
+  else
+    vnet_hw_interface_set_flags (vnm, hw_if_index, 0);
+
+  return /* no error */ 0;
+}
+
 VNET_DEVICE_CLASS (vxlan_device_class,static) = {
   .name = "VXLAN",
   .format_device_name = format_vxlan_name,
   .format_tx_trace = format_vxlan_encap_trace,
   .tx_function = dummy_interface_tx,
+  .admin_up_down_function = vxlan_interface_admin_up_down,
 };
 
 static uword dummy_set_rewrite (vnet_main_t * vnm,
@@ -142,6 +154,7 @@ int vnet_vxlan_add_del_tunnel
   vxlan_main_t * vxm = &vxlan_main;
   vxlan_tunnel_t *t = 0;
   vnet_main_t * vnm = vxm->vnet_main;
+  ip4_main_t * im4 = &ip4_main;
   vnet_hw_interface_t * hi;
   uword * p;
   u32 hw_if_index = ~0;
@@ -231,6 +244,8 @@ int vnet_vxlan_add_del_tunnel
        }
       vnet_sw_interface_set_flags (vnm, sw_if_index, 
                                    VNET_SW_INTERFACE_FLAG_ADMIN_UP);
+      vec_validate (im4->fib_index_by_sw_if_index, sw_if_index);
+      im4->fib_index_by_sw_if_index[sw_if_index] = t->encap_fib_index;
     }
   else
     {