From e83aa456bdb885277ba615808b63a33cb5a8e352 Mon Sep 17 00:00:00 2001 From: Matthew Smith Date: Thu, 14 Nov 2019 10:36:02 -0600 Subject: bonding: add/del secondary mac address callback Type: feature Add a callback to the bond device class which allows a secondary mac address to be added/deleted. The desired operation is performed on all the hardware interfaces which belong to the bond interface. This allows virtual MAC addresses to be used on bond interfaces without requiring the hardware interfaces to have promiscuous mode enabled. When a hardware interface is added or removed from a bond, if there are any secondary MAC addresses configured on the bond, they are added or removed from the hardware interface. Change-Id: If9488078b4d7869ecc56ef6853f3cc9891211860 Signed-off-by: Matthew Smith --- src/vnet/bonding/cli.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) (limited to 'src/vnet/bonding/cli.c') diff --git a/src/vnet/bonding/cli.c b/src/vnet/bonding/cli.c index 7e29d1d4a2c..554ffe9f5ba 100644 --- a/src/vnet/bonding/cli.c +++ b/src/vnet/bonding/cli.c @@ -261,6 +261,31 @@ bond_dump_slave_ifs (slave_interface_details_t ** out_slaveifs, return 0; } +/* + * Manage secondary mac addresses when attaching/detaching a slave. + * If adding, copies any secondary addresses from master to slave + * If deleting, deletes the master's secondary addresses from the slave + * + */ +static void +bond_slave_add_del_mac_addrs (bond_if_t * bif, u32 sif_sw_if_index, u8 is_add) +{ + vnet_main_t *vnm = vnet_get_main (); + ethernet_interface_t *b_ei; + mac_address_t *sec_mac; + vnet_hw_interface_t *s_hwif; + + b_ei = ethernet_get_interface (ðernet_main, bif->hw_if_index); + if (!b_ei || !b_ei->secondary_addrs) + return; + + s_hwif = vnet_get_sup_hw_interface (vnm, sif_sw_if_index); + + vec_foreach (sec_mac, b_ei->secondary_addrs) + vnet_hw_interface_add_del_mac_address (vnm, s_hwif->hw_if_index, + sec_mac->bytes, is_add); +} + static void bond_delete_neighbor (vlib_main_t * vm, bond_if_t * bif, slave_if_t * sif) { @@ -296,6 +321,10 @@ bond_delete_neighbor (vlib_main_t * vm, bond_if_t * bif, slave_if_t * sif) vnet_hw_interface_change_mac_address (vnm, sif_hw->hw_if_index, sif->persistent_hw_address); + /* delete the bond's secondary/virtual mac addrs from the slave */ + bond_slave_add_del_mac_addrs (bif, sif->sw_if_index, 0 /* is_add */ ); + + if ((bif->mode == BOND_MODE_LACP) && bm->lacp_enable_disable) (*bm->lacp_enable_disable) (vm, bif, sif, 0); @@ -665,6 +694,9 @@ bond_enslave (vlib_main_t * vm, bond_enslave_args_t * args) } } + /* if there are secondary/virtual mac addrs, propagate to the slave */ + bond_slave_add_del_mac_addrs (bif, sif->sw_if_index, 1 /* is_add */ ); + if (bif_hw->l2_if_count) { ethernet_set_flags (vnm, sif_hw->hw_if_index, -- cgit 1.2.3-korg