aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorMoni Shoua <monis@voltaire.com>2007-10-09 22:43:38 -0400
committerJeff Garzik <jeff@garzik.org>2007-10-15 14:20:45 -0400
commit872254dd6b1f80cb95ee9e2e22980888533fc293 (patch)
tree85851d40ed6717aa7df30f7ad8247e13ecded7bf /drivers
parent200d1713b47200aa478f27e454e3d957264d49be (diff)
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>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/bonding/bond_main.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
index 64bfec32e2a6..6ae45931d1b2 100644
--- a/drivers/net/bonding/bond_main.c
+++ b/drivers/net/bonding/bond_main.c
@@ -1238,6 +1238,20 @@ static int bond_compute_features(struct bonding *bond)
1238 return 0; 1238 return 0;
1239} 1239}
1240 1240
1241
1242static 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
1241/* enslave device <slave> to bond device <master> */ 1255/* enslave device <slave> to bond device <master> */
1242int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev) 1256int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev)
1243{ 1257{
@@ -1312,6 +1326,25 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev)
1312 goto err_undo_flags; 1326 goto err_undo_flags;
1313 } 1327 }
1314 1328
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
1315 if (slave_dev->set_mac_address == NULL) { 1348 if (slave_dev->set_mac_address == NULL) {
1316 printk(KERN_ERR DRV_NAME 1349 printk(KERN_ERR DRV_NAME
1317 ": %s: Error: The slave device you specified does " 1350 ": %s: Error: The slave device you specified does "