Skip to content

Commit 872254d

Browse files
Moni ShouaJeff Garzik
authored andcommitted
net/bonding: Enable bonding to enslave non ARPHRD_ETHER
This patch changes some of the bond netdevice attributes and functions to be that of the active slave for the case of the enslaved device not being of ARPHRD_ETHER type. Basically it overrides those setting done by ether_setup(), which are netdevice **type** dependent and hence might be not appropriate for devices of other types. It also enforces mutual exclusion on bonding slaves from dissimilar ether types, as was concluded over the v1 discussion. IPoIB (see Documentation/infiniband/ipoib.txt) MAC address is made of a 3 bytes IB QP (Queue Pair) number and 16 bytes IB port GID (Global ID) of the port this IPoIB device is bounded to. The QP is a resource created by the IB HW and the GID is an identifier burned into the HCA (i have omitted here some details which are not important for the bonding RFC). Signed-off-by: Moni Shoua <monis at voltaire.com> Signed-off-by: Or Gerlitz <ogerlitz at voltaire.com> Acked-by: Jay Vosburgh <fubar@us.ibm.com> Signed-off-by: Jeff Garzik <jeff@garzik.org>
1 parent 200d171 commit 872254d

File tree

1 file changed

+33
-0
lines changed

1 file changed

+33
-0
lines changed

drivers/net/bonding/bond_main.c

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1238,6 +1238,20 @@ static int bond_compute_features(struct bonding *bond)
12381238
return 0;
12391239
}
12401240

1241+
1242+
static void bond_setup_by_slave(struct net_device *bond_dev,
1243+
struct net_device *slave_dev)
1244+
{
1245+
bond_dev->neigh_setup = slave_dev->neigh_setup;
1246+
1247+
bond_dev->type = slave_dev->type;
1248+
bond_dev->hard_header_len = slave_dev->hard_header_len;
1249+
bond_dev->addr_len = slave_dev->addr_len;
1250+
1251+
memcpy(bond_dev->broadcast, slave_dev->broadcast,
1252+
slave_dev->addr_len);
1253+
}
1254+
12411255
/* enslave device <slave> to bond device <master> */
12421256
int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev)
12431257
{
@@ -1312,6 +1326,25 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev)
13121326
goto err_undo_flags;
13131327
}
13141328

1329+
/* set bonding device ether type by slave - bonding netdevices are
1330+
* created with ether_setup, so when the slave type is not ARPHRD_ETHER
1331+
* there is a need to override some of the type dependent attribs/funcs.
1332+
*
1333+
* bond ether type mutual exclusion - don't allow slaves of dissimilar
1334+
* ether type (eg ARPHRD_ETHER and ARPHRD_INFINIBAND) share the same bond
1335+
*/
1336+
if (bond->slave_cnt == 0) {
1337+
if (slave_dev->type != ARPHRD_ETHER)
1338+
bond_setup_by_slave(bond_dev, slave_dev);
1339+
} else if (bond_dev->type != slave_dev->type) {
1340+
printk(KERN_ERR DRV_NAME ": %s ether type (%d) is different "
1341+
"from other slaves (%d), can not enslave it.\n",
1342+
slave_dev->name,
1343+
slave_dev->type, bond_dev->type);
1344+
res = -EINVAL;
1345+
goto err_undo_flags;
1346+
}
1347+
13151348
if (slave_dev->set_mac_address == NULL) {
13161349
printk(KERN_ERR DRV_NAME
13171350
": %s: Error: The slave device you specified does "

0 commit comments

Comments
 (0)