Signed-off-by: Or Gerlitz <[EMAIL PROTECTED]>

Index: net-2.6.20/drivers/net/bonding/bond_main.c
===================================================================
--- net-2.6.20.orig/drivers/net/bonding/bond_main.c     2006-11-30 
10:54:23.000000000 +0200
+++ net-2.6.20/drivers/net/bonding/bond_main.c  2006-11-30 11:53:06.000000000 
+0200
@@ -1252,6 +1252,24 @@ static int bond_compute_features(struct
        return 0;
 }

+
+static void bond_setup_by_slave(struct net_device *bond_dev,
+                               struct net_device *slave_dev)
+{
+       bond_dev->hard_header           = slave_dev->hard_header;
+       bond_dev->rebuild_header        = slave_dev->rebuild_header;
+       bond_dev->hard_header_cache     = slave_dev->hard_header_cache;
+       bond_dev->header_cache_update   = slave_dev->header_cache_update;
+       bond_dev->hard_header_parse     = slave_dev->hard_header_parse;
+
+       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 <slave> to bond device <master> */
 int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev)
 {
@@ -1326,6 +1344,24 @@ int bond_enslave(struct net_device *bond
                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 "
Index: net-2.6.20/drivers/net/bonding/bonding.h
===================================================================
--- net-2.6.20.orig/drivers/net/bonding/bonding.h       2006-11-30 
10:54:23.000000000 +0200
+++ net-2.6.20/drivers/net/bonding/bonding.h    2006-11-30 10:58:10.000000000 
+0200
@@ -201,6 +201,7 @@ struct bonding {
        struct   list_head vlan_list;
        struct   vlan_group *vlgrp;
        struct   packet_type arp_mon_pt;
+       s8       do_set_mac_addr;
 };

 /**

-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to