Skip to content

Commit e36b9d1

Browse files
Moni Shouadavem330
Moni Shoua
authored andcommitted
bonding: clean muticast addresses when device changes type
Bonding device forbids slave device of different types under the same master. However, it is possible for a bonding master to change type during its lifetime. This can be either from ARPHRD_ETHER to ARPHRD_INFINIBAND or the other way arround. The change of type requires device level multicast address cleanup because device level multicast addresses depend on the device type. The patch adds a call to dev_close() before the bonding master changes type and dev_open() just after that. In the example below I enslaved an IPoIB device (ib0) under bond0. Since each bonding master starts as device of type ARPHRD_ETHER by default, a change of type occurs when ib0 is enslaved. This is how /proc/net/dev_mcast looks like without the patch 5 bond0 1 0 00ffffffff12601bffff000000000001ff96ca05 5 bond0 1 0 01005e000116 5 bond0 1 0 01005e7ffffd 5 bond0 1 0 01005e000001 5 bond0 1 0 333300000001 6 ib0 1 0 00ffffffff12601bffff000000000001ff96ca05 6 ib0 1 0 333300000001 6 ib0 1 0 01005e000001 6 ib0 1 0 01005e7ffffd 6 ib0 1 0 01005e000116 6 ib0 1 0 00ffffffff12401bffff00000000000000000001 6 ib0 1 0 00ffffffff12601bffff00000000000000000001 and this is how it looks like after the patch. 5 bond0 1 0 00ffffffff12601bffff000000000001ff96ca05 5 bond0 1 0 00ffffffff12601bffff00000000000000000001 5 bond0 1 0 00ffffffff12401bffff0000000000000ffffffd 5 bond0 1 0 00ffffffff12401bffff00000000000000000116 5 bond0 1 0 00ffffffff12401bffff00000000000000000001 6 ib0 1 0 00ffffffff12601bffff000000000001ff96ca05 6 ib0 1 0 00ffffffff12401bffff00000000000000000116 6 ib0 1 0 00ffffffff12401bffff0000000000000ffffffd 6 ib0 2 0 00ffffffff12401bffff00000000000000000001 6 ib0 2 0 00ffffffff12601bffff00000000000000000001 Signed-off-by: Moni Shoua <[email protected]> Signed-off-by: Jay Vosburgh <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 37b76c6 commit e36b9d1

File tree

1 file changed

+10
-2
lines changed

1 file changed

+10
-2
lines changed

drivers/net/bonding/bond_main.c

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1459,8 +1459,16 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev)
14591459
* ether type (eg ARPHRD_ETHER and ARPHRD_INFINIBAND) share the same bond
14601460
*/
14611461
if (bond->slave_cnt == 0) {
1462-
if (slave_dev->type != ARPHRD_ETHER)
1463-
bond_setup_by_slave(bond_dev, slave_dev);
1462+
if (bond_dev->type != slave_dev->type) {
1463+
dev_close(bond_dev);
1464+
pr_debug("%s: change device type from %d to %d\n",
1465+
bond_dev->name, bond_dev->type, slave_dev->type);
1466+
if (slave_dev->type != ARPHRD_ETHER)
1467+
bond_setup_by_slave(bond_dev, slave_dev);
1468+
else
1469+
ether_setup(bond_dev);
1470+
dev_open(bond_dev);
1471+
}
14641472
} else if (bond_dev->type != slave_dev->type) {
14651473
pr_err(DRV_NAME ": %s ether type (%d) is different "
14661474
"from other slaves (%d), can not enslave it.\n",

0 commit comments

Comments
 (0)