ip: Sub Address Family types. Feature enable for each SAFI
[vpp.git] / src / vnet / ip / ip6_link.c
index 35b718e..bd7ad73 100644 (file)
@@ -146,7 +146,7 @@ ip6_link_is_enabled (u32 sw_if_index)
 
 
 int
-ip6_link_enable (u32 sw_if_index)
+ip6_link_enable (u32 sw_if_index, const ip6_address_t * link_local_addr)
 {
   ip6_link_t *il;
   int rv;
@@ -182,14 +182,16 @@ ip6_link_enable (u32 sw_if_index)
       vec_validate (ip6_links, sw_if_index);
 
       il = &ip6_links[sw_if_index];
-      il->il_locks = 1;
+      il->il_locks = 0;
       il->il_sw_if_index = sw_if_index;
 
       sw = vnet_get_sup_sw_interface (vnm, sw_if_index);
 
-      if (sw->type == VNET_SW_INTERFACE_TYPE_SUB ||
-         sw->type == VNET_SW_INTERFACE_TYPE_PIPE ||
-         sw->type == VNET_SW_INTERFACE_TYPE_P2P)
+      if (NULL != link_local_addr)
+       ip6_address_copy (&il->il_ll_addr, link_local_addr);
+      else if (sw->type == VNET_SW_INTERFACE_TYPE_SUB ||
+              sw->type == VNET_SW_INTERFACE_TYPE_PIPE ||
+              sw->type == VNET_SW_INTERFACE_TYPE_P2P)
        {
          il->il_ll_addr.as_u64[0] =
            clib_host_to_net_u64 (0xFE80000000000000ULL);
@@ -202,7 +204,8 @@ ip6_link_enable (u32 sw_if_index)
        }
       else
        {
-         ip6_link_local_address_from_mac (&il->il_ll_addr, eth->address);
+         ip6_link_local_address_from_mac (&il->il_ll_addr,
+                                          eth->address.mac.bytes);
        }
 
       {
@@ -236,6 +239,8 @@ ip6_link_enable (u32 sw_if_index)
       rv = VNET_API_ERROR_VALUE_EXIST;
     }
 
+  il->il_locks++;
+
 out:
   return (rv);
 }
@@ -367,7 +372,7 @@ ip6_src_address_for_packet (u32 sw_if_index,
 }
 
 int
-ip6_set_link_local_address (u32 sw_if_index, const ip6_address_t * address)
+ip6_link_set_local_address (u32 sw_if_index, const ip6_address_t * address)
 {
   ip6_link_delegate_t *ild;
   ip6_link_t *il;
@@ -375,7 +380,7 @@ ip6_set_link_local_address (u32 sw_if_index, const ip6_address_t * address)
   il = ip6_link_get (sw_if_index);
 
   if (NULL == il)
-    return (VNET_API_ERROR_IP6_NOT_ENABLED);
+    return ip6_link_enable (sw_if_index, address);
 
   ip6_ll_prefix_t ilp = {
     .ilp_addr = il->il_ll_addr,
@@ -794,7 +799,7 @@ enable_ip6_interface_cmd (vlib_main_t * vm,
 
   if (unformat_user (input, unformat_vnet_sw_interface, vnm, &sw_if_index))
     {
-      if (ip6_link_enable (sw_if_index))
+      if (ip6_link_enable (sw_if_index, NULL))
        error = clib_error_return (0, "Failed\n");
     }
   else