Commit 8648b305 authored by Herbert Xu's avatar Herbert Xu Committed by David S. Miller

[NET]: Add NETIF_F_GEN_CSUM and NETIF_F_ALL_CSUM

The current stack treats NETIF_F_HW_CSUM and NETIF_F_NO_CSUM
identically so we test for them in quite a few places.  For the sake
of brevity, I'm adding the macro NETIF_F_GEN_CSUM for these two.  We
also test the disjunct of NETIF_F_IP_CSUM and the other two in various
places, for that purpose I've added NETIF_F_ALL_CSUM.
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 00b70504
...@@ -1199,8 +1199,7 @@ int bond_sethwaddr(struct net_device *bond_dev, struct net_device *slave_dev) ...@@ -1199,8 +1199,7 @@ int bond_sethwaddr(struct net_device *bond_dev, struct net_device *slave_dev)
} }
#define BOND_INTERSECT_FEATURES \ #define BOND_INTERSECT_FEATURES \
(NETIF_F_SG|NETIF_F_IP_CSUM|NETIF_F_NO_CSUM|NETIF_F_HW_CSUM|\ (NETIF_F_SG | NETIF_F_ALL_CSUM | NETIF_F_TSO | NETIF_F_UFO)
NETIF_F_TSO|NETIF_F_UFO)
/* /*
* Compute the common dev->feature set available to all slaves. Some * Compute the common dev->feature set available to all slaves. Some
...@@ -1218,9 +1217,7 @@ static int bond_compute_features(struct bonding *bond) ...@@ -1218,9 +1217,7 @@ static int bond_compute_features(struct bonding *bond)
features &= (slave->dev->features & BOND_INTERSECT_FEATURES); features &= (slave->dev->features & BOND_INTERSECT_FEATURES);
if ((features & NETIF_F_SG) && if ((features & NETIF_F_SG) &&
!(features & (NETIF_F_IP_CSUM | !(features & NETIF_F_ALL_CSUM))
NETIF_F_NO_CSUM |
NETIF_F_HW_CSUM)))
features &= ~NETIF_F_SG; features &= ~NETIF_F_SG;
/* /*
......
...@@ -312,6 +312,9 @@ struct net_device ...@@ -312,6 +312,9 @@ struct net_device
#define NETIF_F_LLTX 4096 /* LockLess TX */ #define NETIF_F_LLTX 4096 /* LockLess TX */
#define NETIF_F_UFO 8192 /* Can offload UDP Large Send*/ #define NETIF_F_UFO 8192 /* Can offload UDP Large Send*/
#define NETIF_F_GEN_CSUM (NETIF_F_NO_CSUM | NETIF_F_HW_CSUM)
#define NETIF_F_ALL_CSUM (NETIF_F_IP_CSUM | NETIF_F_GEN_CSUM)
struct net_device *next_sched; struct net_device *next_sched;
/* Interface index. Unique device identifier */ /* Interface index. Unique device identifier */
......
...@@ -376,8 +376,7 @@ void br_features_recompute(struct net_bridge *br) ...@@ -376,8 +376,7 @@ void br_features_recompute(struct net_bridge *br)
checksum = br->feature_mask & NETIF_F_IP_CSUM; checksum = br->feature_mask & NETIF_F_IP_CSUM;
list_for_each_entry(p, &br->port_list, list) { list_for_each_entry(p, &br->port_list, list) {
if (!(p->dev->features if (!(p->dev->features & NETIF_F_ALL_CSUM))
& (NETIF_F_IP_CSUM|NETIF_F_NO_CSUM|NETIF_F_HW_CSUM)))
checksum = 0; checksum = 0;
features &= p->dev->features; features &= p->dev->features;
} }
......
...@@ -1284,7 +1284,7 @@ int dev_queue_xmit(struct sk_buff *skb) ...@@ -1284,7 +1284,7 @@ int dev_queue_xmit(struct sk_buff *skb)
* checksumming for this protocol, complete checksumming here. * checksumming for this protocol, complete checksumming here.
*/ */
if (skb->ip_summed == CHECKSUM_HW && if (skb->ip_summed == CHECKSUM_HW &&
(!(dev->features & (NETIF_F_HW_CSUM | NETIF_F_NO_CSUM)) && (!(dev->features & NETIF_F_GEN_CSUM) &&
(!(dev->features & NETIF_F_IP_CSUM) || (!(dev->features & NETIF_F_IP_CSUM) ||
skb->protocol != htons(ETH_P_IP)))) skb->protocol != htons(ETH_P_IP))))
if (skb_checksum_help(skb, 0)) if (skb_checksum_help(skb, 0))
...@@ -2789,9 +2789,7 @@ int register_netdevice(struct net_device *dev) ...@@ -2789,9 +2789,7 @@ int register_netdevice(struct net_device *dev)
/* Fix illegal SG+CSUM combinations. */ /* Fix illegal SG+CSUM combinations. */
if ((dev->features & NETIF_F_SG) && if ((dev->features & NETIF_F_SG) &&
!(dev->features & (NETIF_F_IP_CSUM | !(dev->features & NETIF_F_ALL_CSUM)) {
NETIF_F_NO_CSUM |
NETIF_F_HW_CSUM))) {
printk("%s: Dropping NETIF_F_SG since no checksum feature.\n", printk("%s: Dropping NETIF_F_SG since no checksum feature.\n",
dev->name); dev->name);
dev->features &= ~NETIF_F_SG; dev->features &= ~NETIF_F_SG;
......
...@@ -30,7 +30,7 @@ u32 ethtool_op_get_link(struct net_device *dev) ...@@ -30,7 +30,7 @@ u32 ethtool_op_get_link(struct net_device *dev)
u32 ethtool_op_get_tx_csum(struct net_device *dev) u32 ethtool_op_get_tx_csum(struct net_device *dev)
{ {
return (dev->features & (NETIF_F_IP_CSUM | NETIF_F_HW_CSUM)) != 0; return (dev->features & NETIF_F_ALL_CSUM) != 0;
} }
int ethtool_op_set_tx_csum(struct net_device *dev, u32 data) int ethtool_op_set_tx_csum(struct net_device *dev, u32 data)
...@@ -551,9 +551,7 @@ static int ethtool_set_sg(struct net_device *dev, char __user *useraddr) ...@@ -551,9 +551,7 @@ static int ethtool_set_sg(struct net_device *dev, char __user *useraddr)
return -EFAULT; return -EFAULT;
if (edata.data && if (edata.data &&
!(dev->features & (NETIF_F_IP_CSUM | !(dev->features & NETIF_F_ALL_CSUM))
NETIF_F_NO_CSUM |
NETIF_F_HW_CSUM)))
return -EINVAL; return -EINVAL;
return __ethtool_set_sg(dev, edata.data); return __ethtool_set_sg(dev, edata.data);
......
...@@ -840,7 +840,7 @@ int ip_append_data(struct sock *sk, ...@@ -840,7 +840,7 @@ int ip_append_data(struct sock *sk,
*/ */
if (transhdrlen && if (transhdrlen &&
length + fragheaderlen <= mtu && length + fragheaderlen <= mtu &&
rt->u.dst.dev->features&(NETIF_F_IP_CSUM|NETIF_F_NO_CSUM|NETIF_F_HW_CSUM) && rt->u.dst.dev->features & NETIF_F_ALL_CSUM &&
!exthdrlen) !exthdrlen)
csummode = CHECKSUM_HW; csummode = CHECKSUM_HW;
......
...@@ -622,14 +622,10 @@ ssize_t tcp_sendpage(struct socket *sock, struct page *page, int offset, ...@@ -622,14 +622,10 @@ ssize_t tcp_sendpage(struct socket *sock, struct page *page, int offset,
ssize_t res; ssize_t res;
struct sock *sk = sock->sk; struct sock *sk = sock->sk;
#define TCP_ZC_CSUM_FLAGS (NETIF_F_IP_CSUM | NETIF_F_NO_CSUM | NETIF_F_HW_CSUM)
if (!(sk->sk_route_caps & NETIF_F_SG) || if (!(sk->sk_route_caps & NETIF_F_SG) ||
!(sk->sk_route_caps & TCP_ZC_CSUM_FLAGS)) !(sk->sk_route_caps & NETIF_F_ALL_CSUM))
return sock_no_sendpage(sock, page, offset, size, flags); return sock_no_sendpage(sock, page, offset, size, flags);
#undef TCP_ZC_CSUM_FLAGS
lock_sock(sk); lock_sock(sk);
TCP_CHECK_TIMER(sk); TCP_CHECK_TIMER(sk);
res = do_tcp_sendpages(sk, &page, offset, size, flags); res = do_tcp_sendpages(sk, &page, offset, size, flags);
...@@ -726,9 +722,7 @@ new_segment: ...@@ -726,9 +722,7 @@ new_segment:
/* /*
* Check whether we can use HW checksum. * Check whether we can use HW checksum.
*/ */
if (sk->sk_route_caps & if (sk->sk_route_caps & NETIF_F_ALL_CSUM)
(NETIF_F_IP_CSUM | NETIF_F_NO_CSUM |
NETIF_F_HW_CSUM))
skb->ip_summed = CHECKSUM_HW; skb->ip_summed = CHECKSUM_HW;
skb_entail(sk, tp, skb); skb_entail(sk, tp, skb);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment