summaryrefslogtreecommitdiffstats
path: root/vnet/vnet/ethernet/interface.c
diff options
context:
space:
mode:
authorNeale Ranns <nranns@cisco.com>2016-12-20 14:24:01 +0000
committerDamjan Marion <dmarion.lists@gmail.com>2016-12-20 19:10:06 +0000
commit3be6b2845485d8740410293322c8b4bf373878e7 (patch)
tree2c456eb76f63cd04d9fd8bd11df28cd7565763b9 /vnet/vnet/ethernet/interface.c
parentfdf494439b04d3a498aa488f0b407c1a2346262f (diff)
Decouple dependencies/assumptions in MAC change
Change-Id: Ic38d0e468da1ad5b56eefda471a5961146a1c372 Signed-off-by: Neale Ranns <nranns@cisco.com>
Diffstat (limited to 'vnet/vnet/ethernet/interface.c')
-rw-r--r--vnet/vnet/ethernet/interface.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/vnet/vnet/ethernet/interface.c b/vnet/vnet/ethernet/interface.c
index 66f788c8e89..1c1f4353983 100644
--- a/vnet/vnet/ethernet/interface.c
+++ b/vnet/vnet/ethernet/interface.c
@@ -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* */