Decouple dependencies/assumptions in MAC change 31/4431/2
authorNeale Ranns <nranns@cisco.com>
Tue, 20 Dec 2016 14:24:01 +0000 (14:24 +0000)
committerDamjan Marion <dmarion.lists@gmail.com>
Tue, 20 Dec 2016 19:10:06 +0000 (19:10 +0000)
Change-Id: Ic38d0e468da1ad5b56eefda471a5961146a1c372
Signed-off-by: Neale Ranns <nranns@cisco.com>
vnet/vnet/ethernet/arp.c
vnet/vnet/ethernet/ethernet.h
vnet/vnet/ethernet/interface.c
vnet/vnet/fib/ip6_fib.h
vnet/vnet/interface.c
vnet/vnet/interface.h
vnet/vnet/ip/ip6_neighbor.c

index d020c8a..b388e77 100644 (file)
@@ -2333,7 +2333,7 @@ change_arp_mac (u32 sw_if_index, ethernet_arp_ip4_entry_t * e)
 }
 
 void
-ethernet_arp_change_mac (vnet_main_t * vnm, u32 sw_if_index)
+ethernet_arp_change_mac (u32 sw_if_index)
 {
   ethernet_arp_main_t *am = &ethernet_arp_main;
   ethernet_arp_ip4_entry_t *e;
index e557a2c..f88b0cf 100644 (file)
@@ -538,7 +538,8 @@ int vnet_add_del_ip4_arp_change_event (vnet_main_t * vnm,
                                       uword type_opaque,
                                       uword data, int is_add);
 
-void ethernet_arp_change_mac (vnet_main_t * vnm, u32 sw_if_index);
+void ethernet_arp_change_mac (u32 sw_if_index);
+void ethernet_ndp_change_mac (u32 sw_if_index);
 
 void arp_update_adjacency (vnet_main_t * vnm, u32 sw_if_index, u32 ai);
 
index 66f788c..1c1f435 100644 (file)
@@ -168,6 +168,26 @@ ethernet_update_adjacency (vnet_main_t * vnm, u32 sw_if_index, u32 ai)
     }
 }
 
+static clib_error_t *
+ethernet_mac_change (vnet_hw_interface_t * hi, char *mac_address)
+{
+  ethernet_interface_t *ei;
+  ethernet_main_t *em;
+
+  em = &ethernet_main;
+  ei = pool_elt_at_index (em->interfaces, hi->hw_instance);
+
+  vec_validate (hi->hw_address,
+               STRUCT_SIZE_OF (ethernet_header_t, src_address) - 1);
+  clib_memcpy (hi->hw_address, mac_address, vec_len (hi->hw_address));
+
+  clib_memcpy (ei->address, (u8 *) mac_address, sizeof (ei->address));
+  ethernet_arp_change_mac (hi->sw_if_index);
+  ethernet_ndp_change_mac (hi->sw_if_index);
+
+  return (NULL);
+}
+
 /* *INDENT-OFF* */
 VNET_HW_INTERFACE_CLASS (ethernet_hw_interface_class) = {
   .name = "Ethernet",
@@ -177,6 +197,7 @@ VNET_HW_INTERFACE_CLASS (ethernet_hw_interface_class) = {
   .unformat_header = unformat_ethernet_header,
   .build_rewrite = ethernet_build_rewrite,
   .update_adjacency = ethernet_update_adjacency,
+  .mac_addr_change_function = ethernet_mac_change,
 };
 /* *INDENT-ON* */
 
index 3668234..f6af993 100644 (file)
@@ -57,8 +57,6 @@ u32 ip6_fib_table_fwding_lookup(ip6_main_t * im,
                                u32 fib_index, 
                                const ip6_address_t * dst);
 
-void ethernet_ndp_change_mac (vlib_main_t * vm, u32 sw_if_index);
-
 /**
  * @biref return the DPO that the LB stacks on.
  */
index b72dcd4..78610ed 100644 (file)
@@ -1311,25 +1311,16 @@ vnet_hw_interface_change_mac_address_helper (vnet_main_t * vnm,
       if (dev_class->mac_addr_change_function)
        {
          error =
-           dev_class->mac_addr_change_function (vnet_get_hw_interface
-                                                (vnm, hw_if_index),
-                                                (char *) &mac_address);
+           dev_class->mac_addr_change_function (hi, (char *) &mac_address);
        }
       if (!error)
        {
-         ethernet_main_t *em = &ethernet_main;
-         ethernet_interface_t *ei =
-           pool_elt_at_index (em->interfaces, hi->hw_instance);
-
-         vec_validate (hi->hw_address,
-                       STRUCT_SIZE_OF (ethernet_header_t, src_address) - 1);
-         clib_memcpy (hi->hw_address, &mac_address,
-                      vec_len (hi->hw_address));
-
-         clib_memcpy (ei->address, (u8 *) & mac_address,
-                      sizeof (ei->address));
-         ethernet_arp_change_mac (vnm, hw_if_index);
-         ethernet_ndp_change_mac (vnm->vlib_main, hw_if_index);
+         vnet_hw_interface_class_t *hw_class;
+
+         hw_class = vnet_get_hw_interface_class (vnm, hi->hw_class_index);
+
+         if (NULL != hw_class->mac_addr_change_function)
+           hw_class->mac_addr_change_function (hi, (char *) &mac_address);
        }
       else
        {
index b5245e4..d42e5fd 100644 (file)
@@ -293,6 +293,9 @@ typedef struct _vnet_hw_interface_class
   /* Function to call when link state changes. */
   vnet_interface_function_t *link_up_down_function;
 
+  /* Function to call when link MAC changes. */
+  vnet_interface_set_mac_address_function_t *mac_addr_change_function;
+
   /* Format function to display interface name. */
   format_function_t *format_interface_name;
 
index 432e09b..5a1c9e8 100644 (file)
@@ -4061,7 +4061,7 @@ vnet_ip6_nd_term (vlib_main_t * vm,
 }
 
 void
-ethernet_ndp_change_mac (vlib_main_t * vm, u32 sw_if_index)
+ethernet_ndp_change_mac (u32 sw_if_index)
 {
   ip6_neighbor_main_t *nm = &ip6_neighbor_main;
   ip6_neighbor_t *n;