net: Disable LRO on devices that are forwarding
Large Receive Offload (LRO) is only appropriate for packets that are destined for the host, and should be disabled if received packets may be forwarded. It can also confuse the GSO on output. Add dev_disable_lro() function which uses the appropriate ethtool ops to disable LRO if enabled. Add calls to dev_disable_lro() in br_add_if() and functions that enable IPv4 and IPv6 forwarding. Signed-off-by: Ben Hutchings <bhutchings@solarflare.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
2e3216cd54
commit
0187bdfb05
@ -348,6 +348,8 @@ static struct inet6_dev * ipv6_add_dev(struct net_device *dev)
|
||||
kfree(ndev);
|
||||
return NULL;
|
||||
}
|
||||
if (ndev->cnf.forwarding)
|
||||
dev_disable_lro(dev);
|
||||
/* We refer to the device */
|
||||
dev_hold(dev);
|
||||
|
||||
@ -442,6 +444,8 @@ static void dev_forward_change(struct inet6_dev *idev)
|
||||
if (!idev)
|
||||
return;
|
||||
dev = idev->dev;
|
||||
if (idev->cnf.forwarding)
|
||||
dev_disable_lro(dev);
|
||||
if (dev && (dev->flags & IFF_MULTICAST)) {
|
||||
if (idev->cnf.forwarding)
|
||||
ipv6_dev_mc_inc(dev, &in6addr_linklocal_allrouters);
|
||||
@ -487,12 +491,14 @@ static void addrconf_fixup_forwarding(struct ctl_table *table, int *p, int old)
|
||||
if (p == &net->ipv6.devconf_dflt->forwarding)
|
||||
return;
|
||||
|
||||
rtnl_lock();
|
||||
if (p == &net->ipv6.devconf_all->forwarding) {
|
||||
__s32 newf = net->ipv6.devconf_all->forwarding;
|
||||
net->ipv6.devconf_dflt->forwarding = newf;
|
||||
addrconf_forward_change(net, newf);
|
||||
} else if ((!*p) ^ (!old))
|
||||
dev_forward_change((struct inet6_dev *)table->extra1);
|
||||
rtnl_unlock();
|
||||
|
||||
if (*p)
|
||||
rt6_purge_dflt_routers(net);
|
||||
|
Reference in New Issue
Block a user