From d999e624a688fee87731dbe3cf14b08e79d0f5f4 Mon Sep 17 00:00:00 2001 From: Moni Shoua Date: Tue, 9 Oct 2007 19:43:38 -0700 Subject: [PATCH] --- yaml --- r: 69311 b: refs/heads/master c: 872254dd6b1f80cb95ee9e2e22980888533fc293 h: refs/heads/master i: 69309: be4d2e2551cfffcb104a612e204b179595538184 69307: 196038cc9c07f84cc4f5e4eb6fc3dc9cd1decabf 69303: 0ebbb3868cb4dc64fe10f9f94e35527cb40ceaa6 69295: ca69f2105c3b60edbf7f79ba259befc6cc8d8561 69279: 7002894dc7a5c70fe6e059693facd040fb53a941 69247: 3b9923c641ce03fb8e42bb66b018747851a42666 v: v3 --- [refs] | 2 +- trunk/drivers/net/bonding/bond_main.c | 33 +++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index a04eb988fede..e94e6f0e4a27 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 200d1713b47200aa478f27e454e3d957264d49be +refs/heads/master: 872254dd6b1f80cb95ee9e2e22980888533fc293 diff --git a/trunk/drivers/net/bonding/bond_main.c b/trunk/drivers/net/bonding/bond_main.c index 64bfec32e2a6..6ae45931d1b2 100644 --- a/trunk/drivers/net/bonding/bond_main.c +++ b/trunk/drivers/net/bonding/bond_main.c @@ -1238,6 +1238,20 @@ static int bond_compute_features(struct bonding *bond) return 0; } + +static void bond_setup_by_slave(struct net_device *bond_dev, + struct net_device *slave_dev) +{ + bond_dev->neigh_setup = slave_dev->neigh_setup; + + bond_dev->type = slave_dev->type; + bond_dev->hard_header_len = slave_dev->hard_header_len; + bond_dev->addr_len = slave_dev->addr_len; + + memcpy(bond_dev->broadcast, slave_dev->broadcast, + slave_dev->addr_len); +} + /* enslave device to bond device */ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev) { @@ -1312,6 +1326,25 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev) goto err_undo_flags; } + /* set bonding device ether type by slave - bonding netdevices are + * created with ether_setup, so when the slave type is not ARPHRD_ETHER + * there is a need to override some of the type dependent attribs/funcs. + * + * bond ether type mutual exclusion - don't allow slaves of dissimilar + * ether type (eg ARPHRD_ETHER and ARPHRD_INFINIBAND) share the same bond + */ + if (bond->slave_cnt == 0) { + if (slave_dev->type != ARPHRD_ETHER) + bond_setup_by_slave(bond_dev, slave_dev); + } else if (bond_dev->type != slave_dev->type) { + printk(KERN_ERR DRV_NAME ": %s ether type (%d) is different " + "from other slaves (%d), can not enslave it.\n", + slave_dev->name, + slave_dev->type, bond_dev->type); + res = -EINVAL; + goto err_undo_flags; + } + if (slave_dev->set_mac_address == NULL) { printk(KERN_ERR DRV_NAME ": %s: Error: The slave device you specified does "