mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-17 09:14:19 +08:00
[PATCH] bonding: Handle large hard_header_len
The bonding driver fails to adjust its hard_header_len when enslaving interfaces. Whenever an interface with a hard_header_len greater than the ETH_HLEN default is enslaved, the potential for an oops exists, and if the oops happens while responding to an arp request, for example, the system panics. GIANFAR devices may use an extended hard_header for VLAN or hardware checksumming. Enslaving such a device and then transmitting over it causes a kernel panic. Patch modified from submitter's original, but submitter agreed with this patch in private email. Signed-off-by: Mark Huth <mhuth@mvista.com> Signed-off-by: Jay Vosburgh <fubar@us.ibm.com> Signed-off-by: Jeff Garzik <jeff@garzik.org>
This commit is contained in:
parent
a50d8de2cc
commit
54ef313714
@ -1211,10 +1211,14 @@ static int bond_compute_features(struct bonding *bond)
|
||||
unsigned long features = BOND_INTERSECT_FEATURES;
|
||||
struct slave *slave;
|
||||
struct net_device *bond_dev = bond->dev;
|
||||
unsigned short max_hard_header_len = ETH_HLEN;
|
||||
int i;
|
||||
|
||||
bond_for_each_slave(bond, slave, i)
|
||||
bond_for_each_slave(bond, slave, i) {
|
||||
features &= (slave->dev->features & BOND_INTERSECT_FEATURES);
|
||||
if (slave->dev->hard_header_len > max_hard_header_len)
|
||||
max_hard_header_len = slave->dev->hard_header_len;
|
||||
}
|
||||
|
||||
if ((features & NETIF_F_SG) &&
|
||||
!(features & NETIF_F_ALL_CSUM))
|
||||
@ -1232,6 +1236,7 @@ static int bond_compute_features(struct bonding *bond)
|
||||
|
||||
features |= (bond_dev->features & ~BOND_INTERSECT_FEATURES);
|
||||
bond_dev->features = features;
|
||||
bond_dev->hard_header_len = max_hard_header_len;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user