aboutsummaryrefslogtreecommitdiffstats
path: root/src/vnet/bonding/device.c
diff options
context:
space:
mode:
authorMatthew Smith <mgsmith@netgate.com>2019-11-14 10:36:02 -0600
committerMatthew Smith <mgsmith@netgate.com>2019-12-02 18:20:24 +0000
commite83aa456bdb885277ba615808b63a33cb5a8e352 (patch)
tree056ccb4b3d03598e85449ef2567f899a664f5dc8 /src/vnet/bonding/device.c
parent73aff479bd7fcf8583e5193405e43faa822194c8 (diff)
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 <mgsmith@netgate.com>
Diffstat (limited to 'src/vnet/bonding/device.c')
-rw-r--r--src/vnet/bonding/device.c45
1 files changed, 45 insertions, 0 deletions
diff --git a/src/vnet/bonding/device.c b/src/vnet/bonding/device.c
index 21bbcb51f1d..57f2806472f 100644
--- a/src/vnet/bonding/device.c
+++ b/src/vnet/bonding/device.c
@@ -142,6 +142,50 @@ bond_interface_admin_up_down (vnet_main_t * vnm, u32 hw_if_index, u32 flags)
return 0;
}
+static clib_error_t *
+bond_add_del_mac_address (vnet_hw_interface_t * hi, const u8 * address,
+ u8 is_add)
+{
+ vnet_main_t *vnm = vnet_get_main ();
+ bond_if_t *bif;
+ clib_error_t *error = 0;
+ vnet_hw_interface_t *s_hi;
+ int i;
+
+
+ bif = bond_get_master_by_sw_if_index (hi->sw_if_index);
+ if (!bif)
+ {
+ return clib_error_return (0, "No bond master found for sw_if_index %u",
+ hi->sw_if_index);
+ }
+
+ /* Add/del address on each slave hw intf, they control the hardware */
+ vec_foreach_index (i, bif->slaves)
+ {
+ s_hi = vnet_get_sup_hw_interface (vnm, vec_elt (bif->slaves, i));
+ error = vnet_hw_interface_add_del_mac_address (vnm, s_hi->hw_if_index,
+ address, is_add);
+
+ if (error)
+ {
+ int j;
+
+ /* undo any that were completed before the failure */
+ for (j = i - 1; j > -1; j--)
+ {
+ s_hi = vnet_get_sup_hw_interface (vnm, vec_elt (bif->slaves, j));
+ vnet_hw_interface_add_del_mac_address (vnm, s_hi->hw_if_index,
+ address, !(is_add));
+ }
+
+ return error;
+ }
+ }
+
+ return 0;
+}
+
static_always_inline void
bond_tx_add_to_queue (bond_per_thread_data_t * ptd, u32 port, u32 bi)
{
@@ -807,6 +851,7 @@ VNET_DEVICE_CLASS (bond_dev_class) = {
.admin_up_down_function = bond_interface_admin_up_down,
.subif_add_del_function = bond_subif_add_del_function,
.format_tx_trace = format_bond_tx_trace,
+ .mac_addr_add_del_function = bond_add_del_mac_address,
};
/* *INDENT-ON* */