提交 ff1dcadb 编写于 作者: A Al Viro 提交者: David S. Miller

[NET]: Split skb->csum

... into anonymous union of __wsum and __u32 (csum and csum_offset resp.)
Signed-off-by: NAl Viro <viro@zeniv.linux.org.uk>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 5b14027b
...@@ -2825,7 +2825,7 @@ static inline int cas_xmit_tx_ringN(struct cas *cp, int ring, ...@@ -2825,7 +2825,7 @@ static inline int cas_xmit_tx_ringN(struct cas *cp, int ring,
u64 csum_start_off, csum_stuff_off; u64 csum_start_off, csum_stuff_off;
csum_start_off = (u64) (skb->h.raw - skb->data); csum_start_off = (u64) (skb->h.raw - skb->data);
csum_stuff_off = (u64) ((skb->h.raw + skb->csum) - skb->data); csum_stuff_off = csum_start_off + skb->csum_offset;
ctrl = TX_DESC_CSUM_EN | ctrl = TX_DESC_CSUM_EN |
CAS_BASE(TX_DESC_CSUM_START, csum_start_off) | CAS_BASE(TX_DESC_CSUM_START, csum_start_off) |
......
...@@ -2826,7 +2826,7 @@ e1000_tx_csum(struct e1000_adapter *adapter, struct e1000_tx_ring *tx_ring, ...@@ -2826,7 +2826,7 @@ e1000_tx_csum(struct e1000_adapter *adapter, struct e1000_tx_ring *tx_ring,
context_desc = E1000_CONTEXT_DESC(*tx_ring, i); context_desc = E1000_CONTEXT_DESC(*tx_ring, i);
context_desc->upper_setup.tcp_fields.tucss = css; context_desc->upper_setup.tcp_fields.tucss = css;
context_desc->upper_setup.tcp_fields.tucso = css + skb->csum; context_desc->upper_setup.tcp_fields.tucso = css + skb->csum_offset;
context_desc->upper_setup.tcp_fields.tucse = 0; context_desc->upper_setup.tcp_fields.tucse = 0;
context_desc->tcp_seg_setup.data = 0; context_desc->tcp_seg_setup.data = 0;
context_desc->cmd_and_length = cpu_to_le32(E1000_TXD_CMD_DEXT); context_desc->cmd_and_length = cpu_to_le32(E1000_TXD_CMD_DEXT);
......
...@@ -1249,7 +1249,7 @@ ixgb_tx_csum(struct ixgb_adapter *adapter, struct sk_buff *skb) ...@@ -1249,7 +1249,7 @@ ixgb_tx_csum(struct ixgb_adapter *adapter, struct sk_buff *skb)
if(likely(skb->ip_summed == CHECKSUM_PARTIAL)) { if(likely(skb->ip_summed == CHECKSUM_PARTIAL)) {
struct ixgb_buffer *buffer_info; struct ixgb_buffer *buffer_info;
css = skb->h.raw - skb->data; css = skb->h.raw - skb->data;
cso = (skb->h.raw + skb->csum) - skb->data; cso = css + skb->csum_offset;
i = adapter->tx_ring.next_to_use; i = adapter->tx_ring.next_to_use;
context_desc = IXGB_CONTEXT_DESC(adapter->tx_ring, i); context_desc = IXGB_CONTEXT_DESC(adapter->tx_ring, i);
......
...@@ -1955,7 +1955,7 @@ static int myri10ge_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -1955,7 +1955,7 @@ static int myri10ge_xmit(struct sk_buff *skb, struct net_device *dev)
flags = (MXGEFW_FLAGS_NO_TSO | MXGEFW_FLAGS_FIRST); flags = (MXGEFW_FLAGS_NO_TSO | MXGEFW_FLAGS_FIRST);
if (likely(skb->ip_summed == CHECKSUM_PARTIAL)) { if (likely(skb->ip_summed == CHECKSUM_PARTIAL)) {
cksum_offset = (skb->h.raw - skb->data); cksum_offset = (skb->h.raw - skb->data);
pseudo_hdr_offset = (skb->h.raw + skb->csum) - skb->data; pseudo_hdr_offset = cksum_offset + skb->csum_offset;
/* If the headers are excessively large, then we must /* If the headers are excessively large, then we must
* fall back to a software checksum */ * fall back to a software checksum */
if (unlikely(cksum_offset > 255 || pseudo_hdr_offset > 127)) { if (unlikely(cksum_offset > 255 || pseudo_hdr_offset > 127)) {
......
...@@ -1562,7 +1562,7 @@ struct sk_buff *pMessage) /* pointer to send-message */ ...@@ -1562,7 +1562,7 @@ struct sk_buff *pMessage) /* pointer to send-message */
if (pMessage->ip_summed == CHECKSUM_PARTIAL) { if (pMessage->ip_summed == CHECKSUM_PARTIAL) {
u16 hdrlen = pMessage->h.raw - pMessage->data; u16 hdrlen = pMessage->h.raw - pMessage->data;
u16 offset = hdrlen + pMessage->csum; u16 offset = hdrlen + pMessage->csum_offset;
if ((pMessage->h.ipiph->protocol == IPPROTO_UDP ) && if ((pMessage->h.ipiph->protocol == IPPROTO_UDP ) &&
(pAC->GIni.GIChipRev == 0) && (pAC->GIni.GIChipRev == 0) &&
...@@ -1681,7 +1681,7 @@ struct sk_buff *pMessage) /* pointer to send-message */ ...@@ -1681,7 +1681,7 @@ struct sk_buff *pMessage) /* pointer to send-message */
*/ */
if (pMessage->ip_summed == CHECKSUM_PARTIAL) { if (pMessage->ip_summed == CHECKSUM_PARTIAL) {
u16 hdrlen = pMessage->h.raw - pMessage->data; u16 hdrlen = pMessage->h.raw - pMessage->data;
u16 offset = hdrlen + pMessage->csum; u16 offset = hdrlen + pMessage->csum_offset;
Control = BMU_STFWD; Control = BMU_STFWD;
......
...@@ -2565,7 +2565,7 @@ static int skge_xmit_frame(struct sk_buff *skb, struct net_device *dev) ...@@ -2565,7 +2565,7 @@ static int skge_xmit_frame(struct sk_buff *skb, struct net_device *dev)
td->csum_offs = 0; td->csum_offs = 0;
td->csum_start = offset; td->csum_start = offset;
td->csum_write = offset + skb->csum; td->csum_write = offset + skb->csum_offset;
} else } else
control = BMU_CHECK; control = BMU_CHECK;
......
...@@ -1350,7 +1350,7 @@ static int sky2_xmit_frame(struct sk_buff *skb, struct net_device *dev) ...@@ -1350,7 +1350,7 @@ static int sky2_xmit_frame(struct sk_buff *skb, struct net_device *dev)
u32 tcpsum; u32 tcpsum;
tcpsum = offset << 16; /* sum start */ tcpsum = offset << 16; /* sum start */
tcpsum |= offset + skb->csum; /* sum write */ tcpsum |= offset + skb->csum_offset; /* sum write */
ctrl = CALSUM | WR_SUM | INIT_SUM | LOCK_SUM; ctrl = CALSUM | WR_SUM | INIT_SUM | LOCK_SUM;
if (skb->nh.iph->protocol == IPPROTO_UDP) if (skb->nh.iph->protocol == IPPROTO_UDP)
......
...@@ -1030,7 +1030,7 @@ static int gem_start_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -1030,7 +1030,7 @@ static int gem_start_xmit(struct sk_buff *skb, struct net_device *dev)
u64 csum_start_off, csum_stuff_off; u64 csum_start_off, csum_stuff_off;
csum_start_off = (u64) (skb->h.raw - skb->data); csum_start_off = (u64) (skb->h.raw - skb->data);
csum_stuff_off = (u64) ((skb->h.raw + skb->csum) - skb->data); csum_stuff_off = csum_start_off + skb->csum_offset;
ctrl = (TXDCTRL_CENAB | ctrl = (TXDCTRL_CENAB |
(csum_start_off << 15) | (csum_start_off << 15) |
......
...@@ -2272,7 +2272,7 @@ static int happy_meal_start_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -2272,7 +2272,7 @@ static int happy_meal_start_xmit(struct sk_buff *skb, struct net_device *dev)
u32 csum_start_off, csum_stuff_off; u32 csum_start_off, csum_stuff_off;
csum_start_off = (u32) (skb->h.raw - skb->data); csum_start_off = (u32) (skb->h.raw - skb->data);
csum_stuff_off = (u32) ((skb->h.raw + skb->csum) - skb->data); csum_stuff_off = csum_start_off + skb->csum_offset;
tx_flags = (TXFLAG_OWN | TXFLAG_CSENABLE | tx_flags = (TXFLAG_OWN | TXFLAG_CSENABLE |
((csum_start_off << 14) & TXFLAG_CSBUFBEGIN) | ((csum_start_off << 14) & TXFLAG_CSBUFBEGIN) |
......
...@@ -274,7 +274,10 @@ struct sk_buff { ...@@ -274,7 +274,10 @@ struct sk_buff {
unsigned int len, unsigned int len,
data_len, data_len,
mac_len; mac_len;
__wsum csum; union {
__wsum csum;
__u32 csum_offset;
};
__u32 priority; __u32 priority;
__u8 local_df:1, __u8 local_df:1,
cloned:1, cloned:1,
......
...@@ -1191,9 +1191,9 @@ int skb_checksum_help(struct sk_buff *skb) ...@@ -1191,9 +1191,9 @@ int skb_checksum_help(struct sk_buff *skb)
offset = skb->tail - skb->h.raw; offset = skb->tail - skb->h.raw;
BUG_ON(offset <= 0); BUG_ON(offset <= 0);
BUG_ON(skb->csum + 2 > offset); BUG_ON(skb->csum_offset + 2 > offset);
*(__sum16*)(skb->h.raw + skb->csum) = csum_fold(csum); *(__sum16*)(skb->h.raw + skb->csum_offset) = csum_fold(csum);
out_set_summed: out_set_summed:
skb->ip_summed = CHECKSUM_NONE; skb->ip_summed = CHECKSUM_NONE;
......
...@@ -1414,7 +1414,7 @@ void skb_copy_and_csum_dev(const struct sk_buff *skb, u8 *to) ...@@ -1414,7 +1414,7 @@ void skb_copy_and_csum_dev(const struct sk_buff *skb, u8 *to)
skb->len - csstart, 0); skb->len - csstart, 0);
if (skb->ip_summed == CHECKSUM_PARTIAL) { if (skb->ip_summed == CHECKSUM_PARTIAL) {
long csstuff = csstart + skb->csum; long csstuff = csstart + skb->csum_offset;
*((__sum16 *)(to + csstuff)) = csum_fold(csum); *((__sum16 *)(to + csstuff)) = csum_fold(csum);
} }
......
...@@ -504,7 +504,7 @@ void tcp_v4_send_check(struct sock *sk, int len, struct sk_buff *skb) ...@@ -504,7 +504,7 @@ void tcp_v4_send_check(struct sock *sk, int len, struct sk_buff *skb)
if (skb->ip_summed == CHECKSUM_PARTIAL) { if (skb->ip_summed == CHECKSUM_PARTIAL) {
th->check = ~tcp_v4_check(th, len, th->check = ~tcp_v4_check(th, len,
inet->saddr, inet->daddr, 0); inet->saddr, inet->daddr, 0);
skb->csum = offsetof(struct tcphdr, check); skb->csum_offset = offsetof(struct tcphdr, check);
} else { } else {
th->check = tcp_v4_check(th, len, inet->saddr, inet->daddr, th->check = tcp_v4_check(th, len, inet->saddr, inet->daddr,
csum_partial((char *)th, csum_partial((char *)th,
...@@ -526,7 +526,7 @@ int tcp_v4_gso_send_check(struct sk_buff *skb) ...@@ -526,7 +526,7 @@ int tcp_v4_gso_send_check(struct sk_buff *skb)
th->check = 0; th->check = 0;
th->check = ~tcp_v4_check(th, skb->len, iph->saddr, iph->daddr, 0); th->check = ~tcp_v4_check(th, skb->len, iph->saddr, iph->daddr, 0);
skb->csum = offsetof(struct tcphdr, check); skb->csum_offset = offsetof(struct tcphdr, check);
skb->ip_summed = CHECKSUM_PARTIAL; skb->ip_summed = CHECKSUM_PARTIAL;
return 0; return 0;
} }
......
...@@ -422,7 +422,7 @@ static void udp4_hwcsum_outgoing(struct sock *sk, struct sk_buff *skb, ...@@ -422,7 +422,7 @@ static void udp4_hwcsum_outgoing(struct sock *sk, struct sk_buff *skb,
/* /*
* Only one fragment on the socket. * Only one fragment on the socket.
*/ */
skb->csum = offsetof(struct udphdr, check); skb->csum_offset = offsetof(struct udphdr, check);
uh->check = ~csum_tcpudp_magic(src, dst, len, IPPROTO_UDP, 0); uh->check = ~csum_tcpudp_magic(src, dst, len, IPPROTO_UDP, 0);
} else { } else {
/* /*
......
...@@ -948,7 +948,7 @@ static void tcp_v6_send_check(struct sock *sk, int len, struct sk_buff *skb) ...@@ -948,7 +948,7 @@ static void tcp_v6_send_check(struct sock *sk, int len, struct sk_buff *skb)
if (skb->ip_summed == CHECKSUM_PARTIAL) { if (skb->ip_summed == CHECKSUM_PARTIAL) {
th->check = ~csum_ipv6_magic(&np->saddr, &np->daddr, len, IPPROTO_TCP, 0); th->check = ~csum_ipv6_magic(&np->saddr, &np->daddr, len, IPPROTO_TCP, 0);
skb->csum = offsetof(struct tcphdr, check); skb->csum_offset = offsetof(struct tcphdr, check);
} else { } else {
th->check = csum_ipv6_magic(&np->saddr, &np->daddr, len, IPPROTO_TCP, th->check = csum_ipv6_magic(&np->saddr, &np->daddr, len, IPPROTO_TCP,
csum_partial((char *)th, th->doff<<2, csum_partial((char *)th, th->doff<<2,
...@@ -970,7 +970,7 @@ static int tcp_v6_gso_send_check(struct sk_buff *skb) ...@@ -970,7 +970,7 @@ static int tcp_v6_gso_send_check(struct sk_buff *skb)
th->check = 0; th->check = 0;
th->check = ~csum_ipv6_magic(&ipv6h->saddr, &ipv6h->daddr, skb->len, th->check = ~csum_ipv6_magic(&ipv6h->saddr, &ipv6h->daddr, skb->len,
IPPROTO_TCP, 0); IPPROTO_TCP, 0);
skb->csum = offsetof(struct tcphdr, check); skb->csum_offset = offsetof(struct tcphdr, check);
skb->ip_summed = CHECKSUM_PARTIAL; skb->ip_summed = CHECKSUM_PARTIAL;
return 0; return 0;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册