[NET]: IPV6 checksum offloading in network devices
The existing model for checksum offload does not correctly handle devices that can offload IPV4 and IPV6 only. The NETIF_F_HW_CSUM flag implies device can do any arbitrary protocol. This patch: * adds NETIF_F_IPV6_CSUM for those devices * fixes bnx2 and tg3 devices that need it * add NETIF_F_IPV6_CSUM to ipv6 output (incl GSO) * fixes assumptions about NETIF_F_ALL_CSUM in nat * adjusts bridge union of checksumming computation Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
d3d6dd3ada
commit
d212f87b06
@@ -368,10 +368,18 @@ void br_features_recompute(struct net_bridge *br)
|
||||
list_for_each_entry(p, &br->port_list, list) {
|
||||
unsigned long feature = p->dev->features;
|
||||
|
||||
/* if device needs checksumming, downgrade to hw checksumming */
|
||||
if (checksum & NETIF_F_NO_CSUM && !(feature & NETIF_F_NO_CSUM))
|
||||
checksum ^= NETIF_F_NO_CSUM | NETIF_F_HW_CSUM;
|
||||
|
||||
/* if device can't do all checksum, downgrade to ipv4/ipv6 */
|
||||
if (checksum & NETIF_F_HW_CSUM && !(feature & NETIF_F_HW_CSUM))
|
||||
checksum ^= NETIF_F_HW_CSUM | NETIF_F_IP_CSUM;
|
||||
checksum ^= NETIF_F_HW_CSUM
|
||||
| NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM;
|
||||
|
||||
if (checksum & NETIF_F_IPV6_CSUM && !(feature & NETIF_F_IPV6_CSUM))
|
||||
checksum &= ~NETIF_F_IPV6_CSUM;
|
||||
|
||||
if (!(feature & NETIF_F_IP_CSUM))
|
||||
checksum = 0;
|
||||
|
||||
|
Reference in New Issue
Block a user