[NET]: Replace CHECKSUM_HW by CHECKSUM_PARTIAL/CHECKSUM_COMPLETE

Replace CHECKSUM_HW by CHECKSUM_PARTIAL (for outgoing packets, whose
checksum still needs to be completed) and CHECKSUM_COMPLETE (for
incoming packets, device supplied full checksum).

Patch originally from Herbert Xu, updated by myself for 2.6.18-rc3.

Signed-off-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Patrick McHardy 2006-08-29 16:44:56 -07:00 committed by David S. Miller
parent 8584d6df39
commit 84fa7933a3
72 changed files with 168 additions and 169 deletions

View File

@ -1912,7 +1912,7 @@ he_service_rbrq(struct he_dev *he_dev, int group)
skb->tail = skb->data + skb->len; skb->tail = skb->data + skb->len;
#ifdef USE_CHECKSUM_HW #ifdef USE_CHECKSUM_HW
if (vcc->vpi == 0 && vcc->vci >= ATM_NOT_RSV_VCI) { if (vcc->vpi == 0 && vcc->vci >= ATM_NOT_RSV_VCI) {
skb->ip_summed = CHECKSUM_HW; skb->ip_summed = CHECKSUM_COMPLETE;
skb->csum = TCP_CKSUM(skb->data, skb->csum = TCP_CKSUM(skb->data,
he_vcc->pdu_len); he_vcc->pdu_len);
} }

View File

@ -2077,7 +2077,7 @@ boomerang_start_xmit(struct sk_buff *skb, struct net_device *dev)
vp->tx_ring[entry].next = 0; vp->tx_ring[entry].next = 0;
#if DO_ZEROCOPY #if DO_ZEROCOPY
if (skb->ip_summed != CHECKSUM_HW) if (skb->ip_summed != CHECKSUM_PARTIAL)
vp->tx_ring[entry].status = cpu_to_le32(skb->len | TxIntrUploaded); vp->tx_ring[entry].status = cpu_to_le32(skb->len | TxIntrUploaded);
else else
vp->tx_ring[entry].status = cpu_to_le32(skb->len | TxIntrUploaded | AddTCPChksum | AddUDPChksum); vp->tx_ring[entry].status = cpu_to_le32(skb->len | TxIntrUploaded | AddTCPChksum | AddUDPChksum);

View File

@ -813,7 +813,7 @@ static int cp_start_xmit (struct sk_buff *skb, struct net_device *dev)
if (mss) if (mss)
flags |= LargeSend | ((mss & MSSMask) << MSSShift); flags |= LargeSend | ((mss & MSSMask) << MSSShift);
else if (skb->ip_summed == CHECKSUM_HW) { else if (skb->ip_summed == CHECKSUM_PARTIAL) {
const struct iphdr *ip = skb->nh.iph; const struct iphdr *ip = skb->nh.iph;
if (ip->protocol == IPPROTO_TCP) if (ip->protocol == IPPROTO_TCP)
flags |= IPCS | TCPCS; flags |= IPCS | TCPCS;
@ -867,7 +867,7 @@ static int cp_start_xmit (struct sk_buff *skb, struct net_device *dev)
if (mss) if (mss)
ctrl |= LargeSend | ctrl |= LargeSend |
((mss & MSSMask) << MSSShift); ((mss & MSSMask) << MSSShift);
else if (skb->ip_summed == CHECKSUM_HW) { else if (skb->ip_summed == CHECKSUM_PARTIAL) {
if (ip->protocol == IPPROTO_TCP) if (ip->protocol == IPPROTO_TCP)
ctrl |= IPCS | TCPCS; ctrl |= IPCS | TCPCS;
else if (ip->protocol == IPPROTO_UDP) else if (ip->protocol == IPPROTO_UDP)
@ -898,7 +898,7 @@ static int cp_start_xmit (struct sk_buff *skb, struct net_device *dev)
txd->addr = cpu_to_le64(first_mapping); txd->addr = cpu_to_le64(first_mapping);
wmb(); wmb();
if (skb->ip_summed == CHECKSUM_HW) { if (skb->ip_summed == CHECKSUM_PARTIAL) {
if (ip->protocol == IPPROTO_TCP) if (ip->protocol == IPPROTO_TCP)
txd->opts1 = cpu_to_le32(first_eor | first_len | txd->opts1 = cpu_to_le32(first_eor | first_len |
FirstFrag | DescOwn | FirstFrag | DescOwn |

View File

@ -2040,7 +2040,7 @@ static void ace_rx_int(struct net_device *dev, u32 rxretprd, u32 rxretcsm)
*/ */
if (bd_flags & BD_FLG_TCP_UDP_SUM) { if (bd_flags & BD_FLG_TCP_UDP_SUM) {
skb->csum = htons(csum); skb->csum = htons(csum);
skb->ip_summed = CHECKSUM_HW; skb->ip_summed = CHECKSUM_COMPLETE;
} else { } else {
skb->ip_summed = CHECKSUM_NONE; skb->ip_summed = CHECKSUM_NONE;
} }
@ -2511,7 +2511,7 @@ restart:
mapping = ace_map_tx_skb(ap, skb, skb, idx); mapping = ace_map_tx_skb(ap, skb, skb, idx);
flagsize = (skb->len << 16) | (BD_FLG_END); flagsize = (skb->len << 16) | (BD_FLG_END);
if (skb->ip_summed == CHECKSUM_HW) if (skb->ip_summed == CHECKSUM_PARTIAL)
flagsize |= BD_FLG_TCP_UDP_SUM; flagsize |= BD_FLG_TCP_UDP_SUM;
#if ACENIC_DO_VLAN #if ACENIC_DO_VLAN
if (vlan_tx_tag_present(skb)) { if (vlan_tx_tag_present(skb)) {
@ -2534,7 +2534,7 @@ restart:
mapping = ace_map_tx_skb(ap, skb, NULL, idx); mapping = ace_map_tx_skb(ap, skb, NULL, idx);
flagsize = (skb_headlen(skb) << 16); flagsize = (skb_headlen(skb) << 16);
if (skb->ip_summed == CHECKSUM_HW) if (skb->ip_summed == CHECKSUM_PARTIAL)
flagsize |= BD_FLG_TCP_UDP_SUM; flagsize |= BD_FLG_TCP_UDP_SUM;
#if ACENIC_DO_VLAN #if ACENIC_DO_VLAN
if (vlan_tx_tag_present(skb)) { if (vlan_tx_tag_present(skb)) {
@ -2560,7 +2560,7 @@ restart:
PCI_DMA_TODEVICE); PCI_DMA_TODEVICE);
flagsize = (frag->size << 16); flagsize = (frag->size << 16);
if (skb->ip_summed == CHECKSUM_HW) if (skb->ip_summed == CHECKSUM_PARTIAL)
flagsize |= BD_FLG_TCP_UDP_SUM; flagsize |= BD_FLG_TCP_UDP_SUM;
idx = (idx + 1) % ACE_TX_RING_ENTRIES(ap); idx = (idx + 1) % ACE_TX_RING_ENTRIES(ap);

View File

@ -4423,7 +4423,7 @@ bnx2_start_xmit(struct sk_buff *skb, struct net_device *dev)
ring_prod = TX_RING_IDX(prod); ring_prod = TX_RING_IDX(prod);
vlan_tag_flags = 0; vlan_tag_flags = 0;
if (skb->ip_summed == CHECKSUM_HW) { if (skb->ip_summed == CHECKSUM_PARTIAL) {
vlan_tag_flags |= TX_BD_FLAGS_TCP_UDP_CKSUM; vlan_tag_flags |= TX_BD_FLAGS_TCP_UDP_CKSUM;
} }

View File

@ -2167,7 +2167,7 @@ end_copy_pkt:
cas_page_unmap(addr); cas_page_unmap(addr);
} }
skb->csum = ntohs(i ^ 0xffff); skb->csum = ntohs(i ^ 0xffff);
skb->ip_summed = CHECKSUM_HW; skb->ip_summed = CHECKSUM_COMPLETE;
skb->protocol = eth_type_trans(skb, cp->dev); skb->protocol = eth_type_trans(skb, cp->dev);
return len; return len;
} }
@ -2821,7 +2821,7 @@ static inline int cas_xmit_tx_ringN(struct cas *cp, int ring,
} }
ctrl = 0; ctrl = 0;
if (skb->ip_summed == CHECKSUM_HW) { if (skb->ip_summed == CHECKSUM_PARTIAL) {
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);

View File

@ -1470,9 +1470,9 @@ int t1_start_xmit(struct sk_buff *skb, struct net_device *dev)
} }
if (!(adapter->flags & UDP_CSUM_CAPABLE) && if (!(adapter->flags & UDP_CSUM_CAPABLE) &&
skb->ip_summed == CHECKSUM_HW && skb->ip_summed == CHECKSUM_PARTIAL &&
skb->nh.iph->protocol == IPPROTO_UDP) skb->nh.iph->protocol == IPPROTO_UDP)
if (unlikely(skb_checksum_help(skb, 0))) { if (unlikely(skb_checksum_help(skb))) {
dev_kfree_skb_any(skb); dev_kfree_skb_any(skb);
return NETDEV_TX_OK; return NETDEV_TX_OK;
} }
@ -1495,11 +1495,11 @@ int t1_start_xmit(struct sk_buff *skb, struct net_device *dev)
cpl = (struct cpl_tx_pkt *)__skb_push(skb, sizeof(*cpl)); cpl = (struct cpl_tx_pkt *)__skb_push(skb, sizeof(*cpl));
cpl->opcode = CPL_TX_PKT; cpl->opcode = CPL_TX_PKT;
cpl->ip_csum_dis = 1; /* SW calculates IP csum */ cpl->ip_csum_dis = 1; /* SW calculates IP csum */
cpl->l4_csum_dis = skb->ip_summed == CHECKSUM_HW ? 0 : 1; cpl->l4_csum_dis = skb->ip_summed == CHECKSUM_PARTIAL ? 0 : 1;
/* the length field isn't used so don't bother setting it */ /* the length field isn't used so don't bother setting it */
st->tx_cso += (skb->ip_summed == CHECKSUM_HW); st->tx_cso += (skb->ip_summed == CHECKSUM_PARTIAL);
sge->stats.tx_do_cksum += (skb->ip_summed == CHECKSUM_HW); sge->stats.tx_do_cksum += (skb->ip_summed == CHECKSUM_PARTIAL);
sge->stats.tx_reg_pkts++; sge->stats.tx_reg_pkts++;
} }
cpl->iff = dev->if_port; cpl->iff = dev->if_port;

View File

@ -611,7 +611,7 @@ start_xmit (struct sk_buff *skb, struct net_device *dev)
txdesc = &np->tx_ring[entry]; txdesc = &np->tx_ring[entry];
#if 0 #if 0
if (skb->ip_summed == CHECKSUM_HW) { if (skb->ip_summed == CHECKSUM_PARTIAL) {
txdesc->status |= txdesc->status |=
cpu_to_le64 (TCPChecksumEnable | UDPChecksumEnable | cpu_to_le64 (TCPChecksumEnable | UDPChecksumEnable |
IPChecksumEnable); IPChecksumEnable);

View File

@ -2600,7 +2600,7 @@ e1000_tx_csum(struct e1000_adapter *adapter, struct e1000_tx_ring *tx_ring,
unsigned int i; unsigned int i;
uint8_t css; uint8_t css;
if (likely(skb->ip_summed == CHECKSUM_HW)) { if (likely(skb->ip_summed == CHECKSUM_PARTIAL)) {
css = skb->h.raw - skb->data; css = skb->h.raw - skb->data;
i = tx_ring->next_to_use; i = tx_ring->next_to_use;
@ -2927,11 +2927,11 @@ e1000_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
} }
/* reserve a descriptor for the offload context */ /* reserve a descriptor for the offload context */
if ((mss) || (skb->ip_summed == CHECKSUM_HW)) if ((mss) || (skb->ip_summed == CHECKSUM_PARTIAL))
count++; count++;
count++; count++;
#else #else
if (skb->ip_summed == CHECKSUM_HW) if (skb->ip_summed == CHECKSUM_PARTIAL)
count++; count++;
#endif #endif
@ -3608,7 +3608,7 @@ e1000_rx_checksum(struct e1000_adapter *adapter,
*/ */
csum = ntohl(csum ^ 0xFFFF); csum = ntohl(csum ^ 0xFFFF);
skb->csum = csum; skb->csum = csum;
skb->ip_summed = CHECKSUM_HW; skb->ip_summed = CHECKSUM_COMPLETE;
} }
adapter->hw_csum_good++; adapter->hw_csum_good++;
} }

View File

@ -1503,7 +1503,8 @@ static int nv_start_xmit(struct sk_buff *skb, struct net_device *dev)
tx_flags_extra = NV_TX2_TSO | (skb_shinfo(skb)->gso_size << NV_TX2_TSO_SHIFT); tx_flags_extra = NV_TX2_TSO | (skb_shinfo(skb)->gso_size << NV_TX2_TSO_SHIFT);
else else
#endif #endif
tx_flags_extra = (skb->ip_summed == CHECKSUM_HW ? (NV_TX2_CHECKSUM_L3|NV_TX2_CHECKSUM_L4) : 0); tx_flags_extra = skb->ip_summed == CHECKSUM_PARTIAL ?
NV_TX2_CHECKSUM_L3 | NV_TX2_CHECKSUM_L4 : 0;
/* vlan tag */ /* vlan tag */
if (np->vlangrp && vlan_tx_tag_present(skb)) { if (np->vlangrp && vlan_tx_tag_present(skb)) {

View File

@ -947,7 +947,7 @@ static int gfar_start_xmit(struct sk_buff *skb, struct net_device *dev)
/* Set up checksumming */ /* Set up checksumming */
if (likely((dev->features & NETIF_F_IP_CSUM) if (likely((dev->features & NETIF_F_IP_CSUM)
&& (CHECKSUM_HW == skb->ip_summed))) { && (CHECKSUM_PARTIAL == skb->ip_summed))) {
fcb = gfar_add_fcb(skb, txbdp); fcb = gfar_add_fcb(skb, txbdp);
status |= TXBD_TOE; status |= TXBD_TOE;
gfar_tx_checksum(skb, fcb); gfar_tx_checksum(skb, fcb);

View File

@ -1648,7 +1648,7 @@ static int hamachi_rx(struct net_device *dev)
* could do the pseudo myself and return * could do the pseudo myself and return
* CHECKSUM_UNNECESSARY * CHECKSUM_UNNECESSARY
*/ */
skb->ip_summed = CHECKSUM_HW; skb->ip_summed = CHECKSUM_COMPLETE;
} }
} }
} }

View File

@ -1036,7 +1036,7 @@ static inline u16 emac_tx_csum(struct ocp_enet_private *dev,
struct sk_buff *skb) struct sk_buff *skb)
{ {
#if defined(CONFIG_IBM_EMAC_TAH) #if defined(CONFIG_IBM_EMAC_TAH)
if (skb->ip_summed == CHECKSUM_HW) { if (skb->ip_summed == CHECKSUM_PARTIAL) {
++dev->stats.tx_packets_csum; ++dev->stats.tx_packets_csum;
return EMAC_TX_CTRL_TAH_CSUM; return EMAC_TX_CTRL_TAH_CSUM;
} }

View File

@ -1387,7 +1387,7 @@ static int ioc3_start_xmit(struct sk_buff *skb, struct net_device *dev)
* MAC header which should not be summed and the TCP/UDP pseudo headers * MAC header which should not be summed and the TCP/UDP pseudo headers
* manually. * manually.
*/ */
if (skb->ip_summed == CHECKSUM_HW) { if (skb->ip_summed == CHECKSUM_PARTIAL) {
int proto = ntohs(skb->nh.iph->protocol); int proto = ntohs(skb->nh.iph->protocol);
unsigned int csoff; unsigned int csoff;
struct iphdr *ih = skb->nh.iph; struct iphdr *ih = skb->nh.iph;

View File

@ -1232,7 +1232,7 @@ ixgb_tx_csum(struct ixgb_adapter *adapter, struct sk_buff *skb)
unsigned int i; unsigned int i;
uint8_t css, cso; uint8_t css, cso;
if(likely(skb->ip_summed == CHECKSUM_HW)) { if(likely(skb->ip_summed == CHECKSUM_PARTIAL)) {
css = skb->h.raw - skb->data; css = skb->h.raw - skb->data;
cso = (skb->h.raw + skb->csum) - skb->data; cso = (skb->h.raw + skb->csum) - skb->data;

View File

@ -1147,7 +1147,7 @@ static void eth_tx_submit_descs_for_skb(struct mv643xx_private *mp,
desc->byte_cnt = length; desc->byte_cnt = length;
desc->buf_ptr = dma_map_single(NULL, skb->data, length, DMA_TO_DEVICE); desc->buf_ptr = dma_map_single(NULL, skb->data, length, DMA_TO_DEVICE);
if (skb->ip_summed == CHECKSUM_HW) { if (skb->ip_summed == CHECKSUM_PARTIAL) {
BUG_ON(skb->protocol != ETH_P_IP); BUG_ON(skb->protocol != ETH_P_IP);
cmd_sts |= ETH_GEN_TCP_UDP_CHECKSUM | cmd_sts |= ETH_GEN_TCP_UDP_CHECKSUM |

View File

@ -930,7 +930,7 @@ static inline void myri10ge_vlan_ip_csum(struct sk_buff *skb, u16 hw_csum)
(vh->h_vlan_encapsulated_proto == htons(ETH_P_IP) || (vh->h_vlan_encapsulated_proto == htons(ETH_P_IP) ||
vh->h_vlan_encapsulated_proto == htons(ETH_P_IPV6))) { vh->h_vlan_encapsulated_proto == htons(ETH_P_IPV6))) {
skb->csum = hw_csum; skb->csum = hw_csum;
skb->ip_summed = CHECKSUM_HW; skb->ip_summed = CHECKSUM_COMPLETE;
} }
} }
@ -973,7 +973,7 @@ myri10ge_rx_done(struct myri10ge_priv *mgp, struct myri10ge_rx_buf *rx,
if ((skb->protocol == ntohs(ETH_P_IP)) || if ((skb->protocol == ntohs(ETH_P_IP)) ||
(skb->protocol == ntohs(ETH_P_IPV6))) { (skb->protocol == ntohs(ETH_P_IPV6))) {
skb->csum = ntohs((u16) csum); skb->csum = ntohs((u16) csum);
skb->ip_summed = CHECKSUM_HW; skb->ip_summed = CHECKSUM_COMPLETE;
} else } else
myri10ge_vlan_ip_csum(skb, ntohs((u16) csum)); myri10ge_vlan_ip_csum(skb, ntohs((u16) csum));
} }
@ -1897,13 +1897,13 @@ again:
pseudo_hdr_offset = 0; pseudo_hdr_offset = 0;
odd_flag = 0; odd_flag = 0;
flags = (MXGEFW_FLAGS_NO_TSO | MXGEFW_FLAGS_FIRST); flags = (MXGEFW_FLAGS_NO_TSO | MXGEFW_FLAGS_FIRST);
if (likely(skb->ip_summed == CHECKSUM_HW)) { 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 = (skb->h.raw + skb->csum) - skb->data;
/* 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)) {
if (skb_checksum_help(skb, 0)) if (skb_checksum_help(skb))
goto drop; goto drop;
cksum_offset = 0; cksum_offset = 0;
pseudo_hdr_offset = 0; pseudo_hdr_offset = 0;

View File

@ -1153,7 +1153,7 @@ again:
if (!nr_frags) if (!nr_frags)
frag = NULL; frag = NULL;
extsts = 0; extsts = 0;
if (skb->ip_summed == CHECKSUM_HW) { if (skb->ip_summed == CHECKSUM_PARTIAL) {
extsts |= EXTSTS_IPPKT; extsts |= EXTSTS_IPPKT;
if (IPPROTO_TCP == skb->nh.iph->protocol) if (IPPROTO_TCP == skb->nh.iph->protocol)
extsts |= EXTSTS_TCPPKT; extsts |= EXTSTS_TCPPKT;

View File

@ -2169,7 +2169,7 @@ static inline u32 rtl8169_tso_csum(struct sk_buff *skb, struct net_device *dev)
if (mss) if (mss)
return LargeSend | ((mss & MSSMask) << MSSShift); return LargeSend | ((mss & MSSMask) << MSSShift);
} }
if (skb->ip_summed == CHECKSUM_HW) { if (skb->ip_summed == CHECKSUM_PARTIAL) {
const struct iphdr *ip = skb->nh.iph; const struct iphdr *ip = skb->nh.iph;
if (ip->protocol == IPPROTO_TCP) if (ip->protocol == IPPROTO_TCP)

View File

@ -3893,7 +3893,7 @@ static int s2io_xmit(struct sk_buff *skb, struct net_device *dev)
txdp->Control_1 |= TXD_TCP_LSO_MSS(s2io_tcp_mss(skb)); txdp->Control_1 |= TXD_TCP_LSO_MSS(s2io_tcp_mss(skb));
} }
#endif #endif
if (skb->ip_summed == CHECKSUM_HW) { if (skb->ip_summed == CHECKSUM_PARTIAL) {
txdp->Control_2 |= txdp->Control_2 |=
(TXD_TX_CKO_IPV4_EN | TXD_TX_CKO_TCP_EN | (TXD_TX_CKO_IPV4_EN | TXD_TX_CKO_TCP_EN |
TXD_TX_CKO_UDP_EN); TXD_TX_CKO_UDP_EN);

View File

@ -1559,7 +1559,7 @@ struct sk_buff *pMessage) /* pointer to send-message */
pTxd->VDataHigh = (SK_U32) (PhysAddr >> 32); pTxd->VDataHigh = (SK_U32) (PhysAddr >> 32);
pTxd->pMBuf = pMessage; pTxd->pMBuf = pMessage;
if (pMessage->ip_summed == CHECKSUM_HW) { 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;
@ -1678,7 +1678,7 @@ struct sk_buff *pMessage) /* pointer to send-message */
/* /*
** Does the HW need to evaluate checksum for TCP or UDP packets? ** Does the HW need to evaluate checksum for TCP or UDP packets?
*/ */
if (pMessage->ip_summed == CHECKSUM_HW) { 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;
@ -2158,7 +2158,7 @@ rx_start:
#ifdef USE_SK_RX_CHECKSUM #ifdef USE_SK_RX_CHECKSUM
pMsg->csum = pRxd->TcpSums & 0xffff; pMsg->csum = pRxd->TcpSums & 0xffff;
pMsg->ip_summed = CHECKSUM_HW; pMsg->ip_summed = CHECKSUM_COMPLETE;
#else #else
pMsg->ip_summed = CHECKSUM_NONE; pMsg->ip_summed = CHECKSUM_NONE;
#endif #endif

View File

@ -2338,7 +2338,7 @@ static int skge_xmit_frame(struct sk_buff *skb, struct net_device *dev)
td->dma_lo = map; td->dma_lo = map;
td->dma_hi = map >> 32; td->dma_hi = map >> 32;
if (skb->ip_summed == CHECKSUM_HW) { if (skb->ip_summed == CHECKSUM_PARTIAL) {
int offset = skb->h.raw - skb->data; int offset = skb->h.raw - skb->data;
/* This seems backwards, but it is what the sk98lin /* This seems backwards, but it is what the sk98lin
@ -2642,7 +2642,7 @@ static inline struct sk_buff *skge_rx_get(struct skge_port *skge,
skb->dev = skge->netdev; skb->dev = skge->netdev;
if (skge->rx_csum) { if (skge->rx_csum) {
skb->csum = csum; skb->csum = csum;
skb->ip_summed = CHECKSUM_HW; skb->ip_summed = CHECKSUM_COMPLETE;
} }
skb->protocol = eth_type_trans(skb, skge->netdev); skb->protocol = eth_type_trans(skb, skge->netdev);

View File

@ -1163,7 +1163,7 @@ static unsigned tx_le_req(const struct sk_buff *skb)
if (skb_is_gso(skb)) if (skb_is_gso(skb))
++count; ++count;
if (skb->ip_summed == CHECKSUM_HW) if (skb->ip_summed == CHECKSUM_PARTIAL)
++count; ++count;
return count; return count;
@ -1272,7 +1272,7 @@ static int sky2_xmit_frame(struct sk_buff *skb, struct net_device *dev)
#endif #endif
/* Handle TCP checksum offload */ /* Handle TCP checksum offload */
if (skb->ip_summed == CHECKSUM_HW) { if (skb->ip_summed == CHECKSUM_PARTIAL) {
u16 hdr = skb->h.raw - skb->data; u16 hdr = skb->h.raw - skb->data;
u16 offset = hdr + skb->csum; u16 offset = hdr + skb->csum;
@ -2000,7 +2000,7 @@ static int sky2_status_intr(struct sky2_hw *hw, int to_do)
#endif #endif
case OP_RXCHKS: case OP_RXCHKS:
skb = sky2->rx_ring[sky2->rx_next].skb; skb = sky2->rx_ring[sky2->rx_next].skb;
skb->ip_summed = CHECKSUM_HW; skb->ip_summed = CHECKSUM_COMPLETE;
skb->csum = le16_to_cpu(status); skb->csum = le16_to_cpu(status);
break; break;

View File

@ -1230,7 +1230,7 @@ static int start_tx(struct sk_buff *skb, struct net_device *dev)
} }
#if defined(ZEROCOPY) && defined(HAS_BROKEN_FIRMWARE) #if defined(ZEROCOPY) && defined(HAS_BROKEN_FIRMWARE)
if (skb->ip_summed == CHECKSUM_HW) { if (skb->ip_summed == CHECKSUM_PARTIAL) {
if (skb_padto(skb, (skb->len + PADDING_MASK) & ~PADDING_MASK)) if (skb_padto(skb, (skb->len + PADDING_MASK) & ~PADDING_MASK))
return NETDEV_TX_OK; return NETDEV_TX_OK;
} }
@ -1252,7 +1252,7 @@ static int start_tx(struct sk_buff *skb, struct net_device *dev)
status |= TxDescIntr; status |= TxDescIntr;
np->reap_tx = 0; np->reap_tx = 0;
} }
if (skb->ip_summed == CHECKSUM_HW) { if (skb->ip_summed == CHECKSUM_PARTIAL) {
status |= TxCalTCP; status |= TxCalTCP;
np->stats.tx_compressed++; np->stats.tx_compressed++;
} }
@ -1499,7 +1499,7 @@ static int __netdev_rx(struct net_device *dev, int *quota)
* Until then, the printk stays. :-) -Ion * Until then, the printk stays. :-) -Ion
*/ */
else if (le16_to_cpu(desc->status2) & 0x0040) { else if (le16_to_cpu(desc->status2) & 0x0040) {
skb->ip_summed = CHECKSUM_HW; skb->ip_summed = CHECKSUM_COMPLETE;
skb->csum = le16_to_cpu(desc->csum); skb->csum = le16_to_cpu(desc->csum);
printk(KERN_DEBUG "%s: checksum_hw, status2 = %#x\n", dev->name, le16_to_cpu(desc->status2)); printk(KERN_DEBUG "%s: checksum_hw, status2 = %#x\n", dev->name, le16_to_cpu(desc->status2));
} }

View File

@ -855,7 +855,7 @@ static int gem_rx(struct gem *gp, int work_to_do)
} }
skb->csum = ntohs((status & RXDCTRL_TCPCSUM) ^ 0xffff); skb->csum = ntohs((status & RXDCTRL_TCPCSUM) ^ 0xffff);
skb->ip_summed = CHECKSUM_HW; skb->ip_summed = CHECKSUM_COMPLETE;
skb->protocol = eth_type_trans(skb, gp->dev); skb->protocol = eth_type_trans(skb, gp->dev);
netif_receive_skb(skb); netif_receive_skb(skb);
@ -1026,7 +1026,7 @@ static int gem_start_xmit(struct sk_buff *skb, struct net_device *dev)
unsigned long flags; unsigned long flags;
ctrl = 0; ctrl = 0;
if (skb->ip_summed == CHECKSUM_HW) { if (skb->ip_summed == CHECKSUM_PARTIAL) {
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);

View File

@ -1207,7 +1207,7 @@ static void happy_meal_transceiver_check(struct happy_meal *hp, void __iomem *tr
* flags, thus: * flags, thus:
* *
* skb->csum = rxd->rx_flags & 0xffff; * skb->csum = rxd->rx_flags & 0xffff;
* skb->ip_summed = CHECKSUM_HW; * skb->ip_summed = CHECKSUM_COMPLETE;
* *
* before sending off the skb to the protocols, and we are good as gold. * before sending off the skb to the protocols, and we are good as gold.
*/ */
@ -2074,7 +2074,7 @@ static void happy_meal_rx(struct happy_meal *hp, struct net_device *dev)
/* This card is _fucking_ hot... */ /* This card is _fucking_ hot... */
skb->csum = ntohs(csum ^ 0xffff); skb->csum = ntohs(csum ^ 0xffff);
skb->ip_summed = CHECKSUM_HW; skb->ip_summed = CHECKSUM_COMPLETE;
RXD(("len=%d csum=%4x]", len, csum)); RXD(("len=%d csum=%4x]", len, csum));
skb->protocol = eth_type_trans(skb, dev); skb->protocol = eth_type_trans(skb, dev);
@ -2268,7 +2268,7 @@ static int happy_meal_start_xmit(struct sk_buff *skb, struct net_device *dev)
u32 tx_flags; u32 tx_flags;
tx_flags = TXFLAG_OWN; tx_flags = TXFLAG_OWN;
if (skb->ip_summed == CHECKSUM_HW) { if (skb->ip_summed == CHECKSUM_PARTIAL) {
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);

View File

@ -3851,11 +3851,11 @@ static int tg3_start_xmit(struct sk_buff *skb, struct net_device *dev)
skb->h.th->check = 0; skb->h.th->check = 0;
} }
else if (skb->ip_summed == CHECKSUM_HW) else if (skb->ip_summed == CHECKSUM_PARTIAL)
base_flags |= TXD_FLAG_TCPUDP_CSUM; base_flags |= TXD_FLAG_TCPUDP_CSUM;
#else #else
mss = 0; mss = 0;
if (skb->ip_summed == CHECKSUM_HW) if (skb->ip_summed == CHECKSUM_PARTIAL)
base_flags |= TXD_FLAG_TCPUDP_CSUM; base_flags |= TXD_FLAG_TCPUDP_CSUM;
#endif #endif
#if TG3_VLAN_TAG_USED #if TG3_VLAN_TAG_USED
@ -3981,7 +3981,7 @@ static int tg3_start_xmit_dma_bug(struct sk_buff *skb, struct net_device *dev)
entry = tp->tx_prod; entry = tp->tx_prod;
base_flags = 0; base_flags = 0;
if (skb->ip_summed == CHECKSUM_HW) if (skb->ip_summed == CHECKSUM_PARTIAL)
base_flags |= TXD_FLAG_TCPUDP_CSUM; base_flags |= TXD_FLAG_TCPUDP_CSUM;
#if TG3_TSO_SUPPORT != 0 #if TG3_TSO_SUPPORT != 0
mss = 0; mss = 0;

View File

@ -830,7 +830,7 @@ typhoon_start_tx(struct sk_buff *skb, struct net_device *dev)
first_txd->addrHi = (u64)((unsigned long) skb) >> 32; first_txd->addrHi = (u64)((unsigned long) skb) >> 32;
first_txd->processFlags = 0; first_txd->processFlags = 0;
if(skb->ip_summed == CHECKSUM_HW) { if(skb->ip_summed == CHECKSUM_PARTIAL) {
/* The 3XP will figure out if this is UDP/TCP */ /* The 3XP will figure out if this is UDP/TCP */
first_txd->processFlags |= TYPHOON_TX_PF_TCP_CHKSUM; first_txd->processFlags |= TYPHOON_TX_PF_TCP_CHKSUM;
first_txd->processFlags |= TYPHOON_TX_PF_UDP_CHKSUM; first_txd->processFlags |= TYPHOON_TX_PF_UDP_CHKSUM;

View File

@ -1230,7 +1230,7 @@ static int rhine_start_tx(struct sk_buff *skb, struct net_device *dev)
rp->tx_skbuff[entry] = skb; rp->tx_skbuff[entry] = skb;
if ((rp->quirks & rqRhineI) && if ((rp->quirks & rqRhineI) &&
(((unsigned long)skb->data & 3) || skb_shinfo(skb)->nr_frags != 0 || skb->ip_summed == CHECKSUM_HW)) { (((unsigned long)skb->data & 3) || skb_shinfo(skb)->nr_frags != 0 || skb->ip_summed == CHECKSUM_PARTIAL)) {
/* Must use alignment buffer. */ /* Must use alignment buffer. */
if (skb->len > PKT_BUF_SZ) { if (skb->len > PKT_BUF_SZ) {
/* packet too long, drop it */ /* packet too long, drop it */

View File

@ -2002,7 +2002,7 @@ static int velocity_xmit(struct sk_buff *skb, struct net_device *dev)
* Handle hardware checksum * Handle hardware checksum
*/ */
if ((vptr->flags & VELOCITY_FLAGS_TX_CSUM) if ((vptr->flags & VELOCITY_FLAGS_TX_CSUM)
&& (skb->ip_summed == CHECKSUM_HW)) { && (skb->ip_summed == CHECKSUM_PARTIAL)) {
struct iphdr *ip = skb->nh.iph; struct iphdr *ip = skb->nh.iph;
if (ip->protocol == IPPROTO_TCP) if (ip->protocol == IPPROTO_TCP)
td_ptr->tdesc1.TCR |= TCR0_TCPCK; td_ptr->tdesc1.TCR |= TCR0_TCPCK;

View File

@ -976,7 +976,7 @@ extern void dev_mcast_init(void);
extern int netdev_max_backlog; extern int netdev_max_backlog;
extern int weight_p; extern int weight_p;
extern int netdev_set_master(struct net_device *dev, struct net_device *master); extern int netdev_set_master(struct net_device *dev, struct net_device *master);
extern int skb_checksum_help(struct sk_buff *skb, int inward); extern int skb_checksum_help(struct sk_buff *skb);
extern struct sk_buff *skb_gso_segment(struct sk_buff *skb, int features); extern struct sk_buff *skb_gso_segment(struct sk_buff *skb, int features);
#ifdef CONFIG_BUG #ifdef CONFIG_BUG
extern void netdev_rx_csum_fault(struct net_device *dev); extern void netdev_rx_csum_fault(struct net_device *dev);
@ -1012,7 +1012,7 @@ static inline int netif_needs_gso(struct net_device *dev, struct sk_buff *skb)
{ {
return skb_is_gso(skb) && return skb_is_gso(skb) &&
(!skb_gso_ok(skb, dev->features) || (!skb_gso_ok(skb, dev->features) ||
unlikely(skb->ip_summed != CHECKSUM_HW)); unlikely(skb->ip_summed != CHECKSUM_PARTIAL));
} }
/* On bonding slaves other than the currently active slave, suppress /* On bonding slaves other than the currently active slave, suppress

View File

@ -34,8 +34,9 @@
#define HAVE_ALIGNABLE_SKB /* Ditto 8) */ #define HAVE_ALIGNABLE_SKB /* Ditto 8) */
#define CHECKSUM_NONE 0 #define CHECKSUM_NONE 0
#define CHECKSUM_HW 1 #define CHECKSUM_PARTIAL 1
#define CHECKSUM_UNNECESSARY 2 #define CHECKSUM_UNNECESSARY 2
#define CHECKSUM_COMPLETE 3
#define SKB_DATA_ALIGN(X) (((X) + (SMP_CACHE_BYTES - 1)) & \ #define SKB_DATA_ALIGN(X) (((X) + (SMP_CACHE_BYTES - 1)) & \
~(SMP_CACHE_BYTES - 1)) ~(SMP_CACHE_BYTES - 1))
@ -56,17 +57,17 @@
* Apparently with secret goal to sell you new device, when you * Apparently with secret goal to sell you new device, when you
* will add new protocol to your host. F.e. IPv6. 8) * will add new protocol to your host. F.e. IPv6. 8)
* *
* HW: the most generic way. Device supplied checksum of _all_ * COMPLETE: the most generic way. Device supplied checksum of _all_
* the packet as seen by netif_rx in skb->csum. * the packet as seen by netif_rx in skb->csum.
* NOTE: Even if device supports only some protocols, but * NOTE: Even if device supports only some protocols, but
* is able to produce some skb->csum, it MUST use HW, * is able to produce some skb->csum, it MUST use COMPLETE,
* not UNNECESSARY. * not UNNECESSARY.
* *
* B. Checksumming on output. * B. Checksumming on output.
* *
* NONE: skb is checksummed by protocol or csum is not required. * NONE: skb is checksummed by protocol or csum is not required.
* *
* HW: device is required to csum packet as seen by hard_start_xmit * PARTIAL: device is required to csum packet as seen by hard_start_xmit
* from skb->h.raw to the end and to record the checksum * from skb->h.raw to the end and to record the checksum
* at skb->h.raw+skb->csum. * at skb->h.raw+skb->csum.
* *
@ -1261,14 +1262,14 @@ static inline int skb_linearize_cow(struct sk_buff *skb)
* @len: length of data pulled * @len: length of data pulled
* *
* After doing a pull on a received packet, you need to call this to * After doing a pull on a received packet, you need to call this to
* update the CHECKSUM_HW checksum, or set ip_summed to CHECKSUM_NONE * update the CHECKSUM_COMPLETE checksum, or set ip_summed to
* so that it can be recomputed from scratch. * CHECKSUM_NONE so that it can be recomputed from scratch.
*/ */
static inline void skb_postpull_rcsum(struct sk_buff *skb, static inline void skb_postpull_rcsum(struct sk_buff *skb,
const void *start, unsigned int len) const void *start, unsigned int len)
{ {
if (skb->ip_summed == CHECKSUM_HW) if (skb->ip_summed == CHECKSUM_COMPLETE)
skb->csum = csum_sub(skb->csum, csum_partial(start, len, 0)); skb->csum = csum_sub(skb->csum, csum_partial(start, len, 0));
} }
@ -1287,7 +1288,7 @@ static inline int pskb_trim_rcsum(struct sk_buff *skb, unsigned int len)
{ {
if (likely(len >= skb->len)) if (likely(len >= skb->len))
return 0; return 0;
if (skb->ip_summed == CHECKSUM_HW) if (skb->ip_summed == CHECKSUM_COMPLETE)
skb->ip_summed = CHECKSUM_NONE; skb->ip_summed = CHECKSUM_NONE;
return __pskb_trim(skb, len); return __pskb_trim(skb, len);
} }

View File

@ -417,7 +417,7 @@ unsigned int __skb_checksum_complete(struct sk_buff *skb)
sum = (u16)csum_fold(skb_checksum(skb, 0, skb->len, skb->csum)); sum = (u16)csum_fold(skb_checksum(skb, 0, skb->len, skb->csum));
if (likely(!sum)) { if (likely(!sum)) {
if (unlikely(skb->ip_summed == CHECKSUM_HW)) if (unlikely(skb->ip_summed == CHECKSUM_COMPLETE))
netdev_rx_csum_fault(skb->dev); netdev_rx_csum_fault(skb->dev);
skb->ip_summed = CHECKSUM_UNNECESSARY; skb->ip_summed = CHECKSUM_UNNECESSARY;
} }
@ -462,7 +462,7 @@ int skb_copy_and_csum_datagram_iovec(struct sk_buff *skb,
goto fault; goto fault;
if ((unsigned short)csum_fold(csum)) if ((unsigned short)csum_fold(csum))
goto csum_error; goto csum_error;
if (unlikely(skb->ip_summed == CHECKSUM_HW)) if (unlikely(skb->ip_summed == CHECKSUM_COMPLETE))
netdev_rx_csum_fault(skb->dev); netdev_rx_csum_fault(skb->dev);
iov->iov_len -= chunk; iov->iov_len -= chunk;
iov->iov_base += chunk; iov->iov_base += chunk;

View File

@ -1166,12 +1166,12 @@ EXPORT_SYMBOL(netif_device_attach);
* Invalidate hardware checksum when packet is to be mangled, and * Invalidate hardware checksum when packet is to be mangled, and
* complete checksum manually on outgoing path. * complete checksum manually on outgoing path.
*/ */
int skb_checksum_help(struct sk_buff *skb, int inward) int skb_checksum_help(struct sk_buff *skb)
{ {
unsigned int csum; unsigned int csum;
int ret = 0, offset = skb->h.raw - skb->data; int ret = 0, offset = skb->h.raw - skb->data;
if (inward) if (skb->ip_summed == CHECKSUM_COMPLETE)
goto out_set_summed; goto out_set_summed;
if (unlikely(skb_shinfo(skb)->gso_size)) { if (unlikely(skb_shinfo(skb)->gso_size)) {
@ -1223,7 +1223,7 @@ struct sk_buff *skb_gso_segment(struct sk_buff *skb, int features)
skb->mac_len = skb->nh.raw - skb->data; skb->mac_len = skb->nh.raw - skb->data;
__skb_pull(skb, skb->mac_len); __skb_pull(skb, skb->mac_len);
if (unlikely(skb->ip_summed != CHECKSUM_HW)) { if (unlikely(skb->ip_summed != CHECKSUM_PARTIAL)) {
if (skb_header_cloned(skb) && if (skb_header_cloned(skb) &&
(err = pskb_expand_head(skb, 0, 0, GFP_ATOMIC))) (err = pskb_expand_head(skb, 0, 0, GFP_ATOMIC)))
return ERR_PTR(err); return ERR_PTR(err);
@ -1232,7 +1232,7 @@ struct sk_buff *skb_gso_segment(struct sk_buff *skb, int features)
rcu_read_lock(); rcu_read_lock();
list_for_each_entry_rcu(ptype, &ptype_base[ntohs(type) & 15], list) { list_for_each_entry_rcu(ptype, &ptype_base[ntohs(type) & 15], list) {
if (ptype->type == type && !ptype->dev && ptype->gso_segment) { if (ptype->type == type && !ptype->dev && ptype->gso_segment) {
if (unlikely(skb->ip_summed != CHECKSUM_HW)) { if (unlikely(skb->ip_summed != CHECKSUM_PARTIAL)) {
err = ptype->gso_send_check(skb); err = ptype->gso_send_check(skb);
segs = ERR_PTR(err); segs = ERR_PTR(err);
if (err || skb_gso_ok(skb, features)) if (err || skb_gso_ok(skb, features))
@ -1444,11 +1444,11 @@ int dev_queue_xmit(struct sk_buff *skb)
/* If packet is not checksummed and device does not support /* If packet is not checksummed and device does not support
* 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_PARTIAL &&
(!(dev->features & NETIF_F_GEN_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))
goto out_kfree_skb; goto out_kfree_skb;
gso: gso:

View File

@ -110,7 +110,7 @@ static int checksum_udp(struct sk_buff *skb, struct udphdr *uh,
psum = csum_tcpudp_nofold(saddr, daddr, ulen, IPPROTO_UDP, 0); psum = csum_tcpudp_nofold(saddr, daddr, ulen, IPPROTO_UDP, 0);
if (skb->ip_summed == CHECKSUM_HW && if (skb->ip_summed == CHECKSUM_COMPLETE &&
!(u16)csum_fold(csum_add(psum, skb->csum))) !(u16)csum_fold(csum_add(psum, skb->csum)))
return 0; return 0;

View File

@ -1397,7 +1397,7 @@ void skb_copy_and_csum_dev(const struct sk_buff *skb, u8 *to)
unsigned int csum; unsigned int csum;
long csstart; long csstart;
if (skb->ip_summed == CHECKSUM_HW) if (skb->ip_summed == CHECKSUM_PARTIAL)
csstart = skb->h.raw - skb->data; csstart = skb->h.raw - skb->data;
else else
csstart = skb_headlen(skb); csstart = skb_headlen(skb);
@ -1411,7 +1411,7 @@ void skb_copy_and_csum_dev(const struct sk_buff *skb, u8 *to)
csum = skb_copy_and_csum_bits(skb, csstart, to + csstart, csum = skb_copy_and_csum_bits(skb, csstart, to + csstart,
skb->len - csstart, 0); skb->len - csstart, 0);
if (skb->ip_summed == CHECKSUM_HW) { if (skb->ip_summed == CHECKSUM_PARTIAL) {
long csstuff = csstart + skb->csum; long csstuff = csstart + skb->csum;
*((unsigned short *)(to + csstuff)) = csum_fold(csum); *((unsigned short *)(to + csstuff)) = csum_fold(csum);
@ -1898,10 +1898,10 @@ int skb_append_datato_frags(struct sock *sk, struct sk_buff *skb,
* @len: length of data pulled * @len: length of data pulled
* *
* This function performs an skb_pull on the packet and updates * This function performs an skb_pull on the packet and updates
* update the CHECKSUM_HW checksum. It should be used on receive * update the CHECKSUM_COMPLETE checksum. It should be used on
* path processing instead of skb_pull unless you know that the * receive path processing instead of skb_pull unless you know
* checksum difference is zero (e.g., a valid IP header) or you * that the checksum difference is zero (e.g., a valid IP header)
* are setting ip_summed to CHECKSUM_NONE. * or you are setting ip_summed to CHECKSUM_NONE.
*/ */
unsigned char *skb_pull_rcsum(struct sk_buff *skb, unsigned int len) unsigned char *skb_pull_rcsum(struct sk_buff *skb, unsigned int len)
{ {
@ -1994,7 +1994,7 @@ struct sk_buff *skb_segment(struct sk_buff *skb, int features)
frag = skb_shinfo(nskb)->frags; frag = skb_shinfo(nskb)->frags;
k = 0; k = 0;
nskb->ip_summed = CHECKSUM_HW; nskb->ip_summed = CHECKSUM_PARTIAL;
nskb->csum = skb->csum; nskb->csum = skb->csum;
memcpy(skb_put(nskb, hsize), skb->data + offset, hsize); memcpy(skb_put(nskb, hsize), skb->data + offset, hsize);

View File

@ -930,7 +930,7 @@ int icmp_rcv(struct sk_buff *skb)
ICMP_INC_STATS_BH(ICMP_MIB_INMSGS); ICMP_INC_STATS_BH(ICMP_MIB_INMSGS);
switch (skb->ip_summed) { switch (skb->ip_summed) {
case CHECKSUM_HW: case CHECKSUM_COMPLETE:
if (!(u16)csum_fold(skb->csum)) if (!(u16)csum_fold(skb->csum))
break; break;
/* fall through */ /* fall through */

View File

@ -931,7 +931,7 @@ int igmp_rcv(struct sk_buff *skb)
goto drop; goto drop;
switch (skb->ip_summed) { switch (skb->ip_summed) {
case CHECKSUM_HW: case CHECKSUM_COMPLETE:
if (!(u16)csum_fold(skb->csum)) if (!(u16)csum_fold(skb->csum))
break; break;
/* fall through */ /* fall through */

View File

@ -665,7 +665,7 @@ static struct sk_buff *ip_frag_reasm(struct ipq *qp, struct net_device *dev)
head->len += fp->len; head->len += fp->len;
if (head->ip_summed != fp->ip_summed) if (head->ip_summed != fp->ip_summed)
head->ip_summed = CHECKSUM_NONE; head->ip_summed = CHECKSUM_NONE;
else if (head->ip_summed == CHECKSUM_HW) else if (head->ip_summed == CHECKSUM_COMPLETE)
head->csum = csum_add(head->csum, fp->csum); head->csum = csum_add(head->csum, fp->csum);
head->truesize += fp->truesize; head->truesize += fp->truesize;
atomic_sub(fp->truesize, &ip_frag_mem); atomic_sub(fp->truesize, &ip_frag_mem);

View File

@ -576,7 +576,7 @@ static int ipgre_rcv(struct sk_buff *skb)
if (flags&GRE_CSUM) { if (flags&GRE_CSUM) {
switch (skb->ip_summed) { switch (skb->ip_summed) {
case CHECKSUM_HW: case CHECKSUM_COMPLETE:
csum = (u16)csum_fold(skb->csum); csum = (u16)csum_fold(skb->csum);
if (!csum) if (!csum)
break; break;
@ -584,7 +584,7 @@ static int ipgre_rcv(struct sk_buff *skb)
case CHECKSUM_NONE: case CHECKSUM_NONE:
skb->csum = 0; skb->csum = 0;
csum = __skb_checksum_complete(skb); csum = __skb_checksum_complete(skb);
skb->ip_summed = CHECKSUM_HW; skb->ip_summed = CHECKSUM_COMPLETE;
} }
offset += 4; offset += 4;
} }

View File

@ -680,7 +680,7 @@ ip_generic_getfrag(void *from, char *to, int offset, int len, int odd, struct sk
{ {
struct iovec *iov = from; struct iovec *iov = from;
if (skb->ip_summed == CHECKSUM_HW) { if (skb->ip_summed == CHECKSUM_PARTIAL) {
if (memcpy_fromiovecend(to, iov, offset, len) < 0) if (memcpy_fromiovecend(to, iov, offset, len) < 0)
return -EFAULT; return -EFAULT;
} else { } else {
@ -736,7 +736,7 @@ static inline int ip_ufo_append_data(struct sock *sk,
/* initialize protocol header pointer */ /* initialize protocol header pointer */
skb->h.raw = skb->data + fragheaderlen; skb->h.raw = skb->data + fragheaderlen;
skb->ip_summed = CHECKSUM_HW; skb->ip_summed = CHECKSUM_PARTIAL;
skb->csum = 0; skb->csum = 0;
sk->sk_sndmsg_off = 0; sk->sk_sndmsg_off = 0;
} }
@ -844,7 +844,7 @@ int ip_append_data(struct sock *sk,
length + fragheaderlen <= mtu && length + fragheaderlen <= mtu &&
rt->u.dst.dev->features & NETIF_F_ALL_CSUM && rt->u.dst.dev->features & NETIF_F_ALL_CSUM &&
!exthdrlen) !exthdrlen)
csummode = CHECKSUM_HW; csummode = CHECKSUM_PARTIAL;
inet->cork.length += length; inet->cork.length += length;
if (((length > mtu) && (sk->sk_protocol == IPPROTO_UDP)) && if (((length > mtu) && (sk->sk_protocol == IPPROTO_UDP)) &&

View File

@ -151,7 +151,7 @@ tcp_snat_handler(struct sk_buff **pskb,
/* Only port and addr are changed, do fast csum update */ /* Only port and addr are changed, do fast csum update */
tcp_fast_csum_update(tcph, cp->daddr, cp->vaddr, tcp_fast_csum_update(tcph, cp->daddr, cp->vaddr,
cp->dport, cp->vport); cp->dport, cp->vport);
if ((*pskb)->ip_summed == CHECKSUM_HW) if ((*pskb)->ip_summed == CHECKSUM_COMPLETE)
(*pskb)->ip_summed = CHECKSUM_NONE; (*pskb)->ip_summed = CHECKSUM_NONE;
} else { } else {
/* full checksum calculation */ /* full checksum calculation */
@ -204,7 +204,7 @@ tcp_dnat_handler(struct sk_buff **pskb,
/* Only port and addr are changed, do fast csum update */ /* Only port and addr are changed, do fast csum update */
tcp_fast_csum_update(tcph, cp->vaddr, cp->daddr, tcp_fast_csum_update(tcph, cp->vaddr, cp->daddr,
cp->vport, cp->dport); cp->vport, cp->dport);
if ((*pskb)->ip_summed == CHECKSUM_HW) if ((*pskb)->ip_summed == CHECKSUM_COMPLETE)
(*pskb)->ip_summed = CHECKSUM_NONE; (*pskb)->ip_summed = CHECKSUM_NONE;
} else { } else {
/* full checksum calculation */ /* full checksum calculation */
@ -229,7 +229,7 @@ tcp_csum_check(struct sk_buff *skb, struct ip_vs_protocol *pp)
switch (skb->ip_summed) { switch (skb->ip_summed) {
case CHECKSUM_NONE: case CHECKSUM_NONE:
skb->csum = skb_checksum(skb, tcphoff, skb->len - tcphoff, 0); skb->csum = skb_checksum(skb, tcphoff, skb->len - tcphoff, 0);
case CHECKSUM_HW: case CHECKSUM_COMPLETE:
if (csum_tcpudp_magic(skb->nh.iph->saddr, skb->nh.iph->daddr, if (csum_tcpudp_magic(skb->nh.iph->saddr, skb->nh.iph->daddr,
skb->len - tcphoff, skb->len - tcphoff,
skb->nh.iph->protocol, skb->csum)) { skb->nh.iph->protocol, skb->csum)) {
@ -239,7 +239,7 @@ tcp_csum_check(struct sk_buff *skb, struct ip_vs_protocol *pp)
} }
break; break;
default: default:
/* CHECKSUM_UNNECESSARY */ /* No need to checksum. */
break; break;
} }

View File

@ -161,7 +161,7 @@ udp_snat_handler(struct sk_buff **pskb,
/* Only port and addr are changed, do fast csum update */ /* Only port and addr are changed, do fast csum update */
udp_fast_csum_update(udph, cp->daddr, cp->vaddr, udp_fast_csum_update(udph, cp->daddr, cp->vaddr,
cp->dport, cp->vport); cp->dport, cp->vport);
if ((*pskb)->ip_summed == CHECKSUM_HW) if ((*pskb)->ip_summed == CHECKSUM_COMPLETE)
(*pskb)->ip_summed = CHECKSUM_NONE; (*pskb)->ip_summed = CHECKSUM_NONE;
} else { } else {
/* full checksum calculation */ /* full checksum calculation */
@ -216,7 +216,7 @@ udp_dnat_handler(struct sk_buff **pskb,
/* Only port and addr are changed, do fast csum update */ /* Only port and addr are changed, do fast csum update */
udp_fast_csum_update(udph, cp->vaddr, cp->daddr, udp_fast_csum_update(udph, cp->vaddr, cp->daddr,
cp->vport, cp->dport); cp->vport, cp->dport);
if ((*pskb)->ip_summed == CHECKSUM_HW) if ((*pskb)->ip_summed == CHECKSUM_COMPLETE)
(*pskb)->ip_summed = CHECKSUM_NONE; (*pskb)->ip_summed = CHECKSUM_NONE;
} else { } else {
/* full checksum calculation */ /* full checksum calculation */
@ -250,7 +250,7 @@ udp_csum_check(struct sk_buff *skb, struct ip_vs_protocol *pp)
case CHECKSUM_NONE: case CHECKSUM_NONE:
skb->csum = skb_checksum(skb, udphoff, skb->csum = skb_checksum(skb, udphoff,
skb->len - udphoff, 0); skb->len - udphoff, 0);
case CHECKSUM_HW: case CHECKSUM_COMPLETE:
if (csum_tcpudp_magic(skb->nh.iph->saddr, if (csum_tcpudp_magic(skb->nh.iph->saddr,
skb->nh.iph->daddr, skb->nh.iph->daddr,
skb->len - udphoff, skb->len - udphoff,
@ -262,7 +262,7 @@ udp_csum_check(struct sk_buff *skb, struct ip_vs_protocol *pp)
} }
break; break;
default: default:
/* CHECKSUM_UNNECESSARY */ /* No need to checksum. */
break; break;
} }
} }

View File

@ -168,7 +168,7 @@ unsigned int nf_ip_checksum(struct sk_buff *skb, unsigned int hook,
unsigned int csum = 0; unsigned int csum = 0;
switch (skb->ip_summed) { switch (skb->ip_summed) {
case CHECKSUM_HW: case CHECKSUM_COMPLETE:
if (hook != NF_IP_PRE_ROUTING && hook != NF_IP_LOCAL_IN) if (hook != NF_IP_PRE_ROUTING && hook != NF_IP_LOCAL_IN)
break; break;
if ((protocol == 0 && !(u16)csum_fold(skb->csum)) || if ((protocol == 0 && !(u16)csum_fold(skb->csum)) ||

View File

@ -865,8 +865,7 @@ static int tcp_error(struct sk_buff *skb,
/* Checksum invalid? Ignore. /* Checksum invalid? Ignore.
* We skip checking packets on the outgoing path * We skip checking packets on the outgoing path
* because the semantic of CHECKSUM_HW is different there * because it is assumed to be correct.
* and moreover root might send raw packets.
*/ */
/* FIXME: Source route IP option packets --RR */ /* FIXME: Source route IP option packets --RR */
if (ip_conntrack_checksum && hooknum == NF_IP_PRE_ROUTING && if (ip_conntrack_checksum && hooknum == NF_IP_PRE_ROUTING &&

View File

@ -117,8 +117,7 @@ static int udp_error(struct sk_buff *skb, enum ip_conntrack_info *ctinfo,
/* Checksum invalid? Ignore. /* Checksum invalid? Ignore.
* We skip checking packets on the outgoing path * We skip checking packets on the outgoing path
* because the semantic of CHECKSUM_HW is different there * because the checksum is assumed to be correct.
* and moreover root might send raw packets.
* FIXME: Source route IP option packets --RR */ * FIXME: Source route IP option packets --RR */
if (ip_conntrack_checksum && hooknum == NF_IP_PRE_ROUTING && if (ip_conntrack_checksum && hooknum == NF_IP_PRE_ROUTING &&
nf_ip_checksum(skb, hooknum, iph->ihl * 4, IPPROTO_UDP)) { nf_ip_checksum(skb, hooknum, iph->ihl * 4, IPPROTO_UDP)) {

View File

@ -111,8 +111,9 @@ ip_nat_fn(unsigned int hooknum,
& htons(IP_MF|IP_OFFSET))); & htons(IP_MF|IP_OFFSET)));
/* If we had a hardware checksum before, it's now invalid */ /* If we had a hardware checksum before, it's now invalid */
if ((*pskb)->ip_summed == CHECKSUM_HW) if ((*pskb)->ip_summed == CHECKSUM_PARTIAL ||
if (skb_checksum_help(*pskb, (out == NULL))) (*pskb)->ip_summed == CHECKSUM_COMPLETE)
if (skb_checksum_help(*pskb))
return NF_DROP; return NF_DROP;
ct = ip_conntrack_get(*pskb, &ctinfo); ct = ip_conntrack_get(*pskb, &ctinfo);

View File

@ -208,9 +208,9 @@ ipq_build_packet_message(struct ipq_queue_entry *entry, int *errp)
break; break;
case IPQ_COPY_PACKET: case IPQ_COPY_PACKET:
if (entry->skb->ip_summed == CHECKSUM_HW && if ((entry->skb->ip_summed == CHECKSUM_PARTIAL ||
(*errp = skb_checksum_help(entry->skb, entry->skb->ip_summed == CHECKSUM_COMPLETE) &&
entry->info->outdev == NULL))) { (*errp = skb_checksum_help(entry->skb))) {
read_unlock_bh(&queue_lock); read_unlock_bh(&queue_lock);
return NULL; return NULL;
} }

View File

@ -49,7 +49,7 @@ set_ect_ip(struct sk_buff **pskb, const struct ipt_ECN_info *einfo)
/* Return 0 if there was an error. */ /* Return 0 if there was an error. */
static inline int static inline int
set_ect_tcp(struct sk_buff **pskb, const struct ipt_ECN_info *einfo, int inward) set_ect_tcp(struct sk_buff **pskb, const struct ipt_ECN_info *einfo)
{ {
struct tcphdr _tcph, *tcph; struct tcphdr _tcph, *tcph;
u_int16_t diffs[2]; u_int16_t diffs[2];
@ -70,8 +70,9 @@ set_ect_tcp(struct sk_buff **pskb, const struct ipt_ECN_info *einfo, int inward)
return 0; return 0;
tcph = (void *)(*pskb)->nh.iph + (*pskb)->nh.iph->ihl*4; tcph = (void *)(*pskb)->nh.iph + (*pskb)->nh.iph->ihl*4;
if ((*pskb)->ip_summed == CHECKSUM_HW && if (((*pskb)->ip_summed == CHECKSUM_PARTIAL ||
skb_checksum_help(*pskb, inward)) (*pskb)->ip_summed == CHECKSUM_COMPLETE) &&
skb_checksum_help(*pskb))
return 0; return 0;
diffs[0] = ((u_int16_t *)tcph)[6]; diffs[0] = ((u_int16_t *)tcph)[6];
@ -106,7 +107,7 @@ target(struct sk_buff **pskb,
if (einfo->operation & (IPT_ECN_OP_SET_ECE | IPT_ECN_OP_SET_CWR) if (einfo->operation & (IPT_ECN_OP_SET_ECE | IPT_ECN_OP_SET_CWR)
&& (*pskb)->nh.iph->protocol == IPPROTO_TCP) && (*pskb)->nh.iph->protocol == IPPROTO_TCP)
if (!set_ect_tcp(pskb, einfo, (out == NULL))) if (!set_ect_tcp(pskb, einfo))
return NF_DROP; return NF_DROP;
return IPT_CONTINUE; return IPT_CONTINUE;

View File

@ -62,8 +62,9 @@ ipt_tcpmss_target(struct sk_buff **pskb,
if (!skb_make_writable(pskb, (*pskb)->len)) if (!skb_make_writable(pskb, (*pskb)->len))
return NF_DROP; return NF_DROP;
if ((*pskb)->ip_summed == CHECKSUM_HW && if (((*pskb)->ip_summed == CHECKSUM_PARTIAL ||
skb_checksum_help(*pskb, out == NULL)) (*pskb)->ip_summed == CHECKSUM_COMPLETE) &&
skb_checksum_help(*pskb))
return NF_DROP; return NF_DROP;
iph = (*pskb)->nh.iph; iph = (*pskb)->nh.iph;

View File

@ -568,7 +568,7 @@ new_segment:
skb->truesize += copy; skb->truesize += copy;
sk->sk_wmem_queued += copy; sk->sk_wmem_queued += copy;
sk->sk_forward_alloc -= copy; sk->sk_forward_alloc -= copy;
skb->ip_summed = CHECKSUM_HW; skb->ip_summed = CHECKSUM_PARTIAL;
tp->write_seq += copy; tp->write_seq += copy;
TCP_SKB_CB(skb)->end_seq += copy; TCP_SKB_CB(skb)->end_seq += copy;
skb_shinfo(skb)->gso_segs = 0; skb_shinfo(skb)->gso_segs = 0;
@ -723,7 +723,7 @@ new_segment:
* Check whether we can use HW checksum. * Check whether we can use HW checksum.
*/ */
if (sk->sk_route_caps & NETIF_F_ALL_CSUM) if (sk->sk_route_caps & NETIF_F_ALL_CSUM)
skb->ip_summed = CHECKSUM_HW; skb->ip_summed = CHECKSUM_PARTIAL;
skb_entail(sk, tp, skb); skb_entail(sk, tp, skb);
copy = size_goal; copy = size_goal;
@ -2205,7 +2205,7 @@ struct sk_buff *tcp_tso_segment(struct sk_buff *skb, int features)
th->fin = th->psh = 0; th->fin = th->psh = 0;
th->check = ~csum_fold(th->check + delta); th->check = ~csum_fold(th->check + delta);
if (skb->ip_summed != CHECKSUM_HW) if (skb->ip_summed != CHECKSUM_PARTIAL)
th->check = csum_fold(csum_partial(skb->h.raw, thlen, th->check = csum_fold(csum_partial(skb->h.raw, thlen,
skb->csum)); skb->csum));
@ -2219,7 +2219,7 @@ struct sk_buff *tcp_tso_segment(struct sk_buff *skb, int features)
delta = htonl(oldlen + (skb->tail - skb->h.raw) + skb->data_len); delta = htonl(oldlen + (skb->tail - skb->h.raw) + skb->data_len);
th->check = ~csum_fold(th->check + delta); th->check = ~csum_fold(th->check + delta);
if (skb->ip_summed != CHECKSUM_HW) if (skb->ip_summed != CHECKSUM_PARTIAL)
th->check = csum_fold(csum_partial(skb->h.raw, thlen, th->check = csum_fold(csum_partial(skb->h.raw, thlen,
skb->csum)); skb->csum));

View File

@ -484,7 +484,7 @@ void tcp_v4_send_check(struct sock *sk, int len, struct sk_buff *skb)
struct inet_sock *inet = inet_sk(sk); struct inet_sock *inet = inet_sk(sk);
struct tcphdr *th = skb->h.th; struct tcphdr *th = skb->h.th;
if (skb->ip_summed == CHECKSUM_HW) { if (skb->ip_summed == CHECKSUM_PARTIAL) {
th->check = ~tcp_v4_check(th, len, inet->saddr, inet->daddr, 0); th->check = ~tcp_v4_check(th, len, inet->saddr, inet->daddr, 0);
skb->csum = offsetof(struct tcphdr, check); skb->csum = offsetof(struct tcphdr, check);
} else { } else {
@ -509,7 +509,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 = offsetof(struct tcphdr, check);
skb->ip_summed = CHECKSUM_HW; skb->ip_summed = CHECKSUM_PARTIAL;
return 0; return 0;
} }
@ -973,7 +973,7 @@ static struct sock *tcp_v4_hnd_req(struct sock *sk, struct sk_buff *skb)
static int tcp_v4_checksum_init(struct sk_buff *skb) static int tcp_v4_checksum_init(struct sk_buff *skb)
{ {
if (skb->ip_summed == CHECKSUM_HW) { if (skb->ip_summed == CHECKSUM_COMPLETE) {
if (!tcp_v4_check(skb->h.th, skb->len, skb->nh.iph->saddr, if (!tcp_v4_check(skb->h.th, skb->len, skb->nh.iph->saddr,
skb->nh.iph->daddr, skb->csum)) { skb->nh.iph->daddr, skb->csum)) {
skb->ip_summed = CHECKSUM_UNNECESSARY; skb->ip_summed = CHECKSUM_UNNECESSARY;

View File

@ -577,7 +577,7 @@ int tcp_fragment(struct sock *sk, struct sk_buff *skb, u32 len, unsigned int mss
TCP_SKB_CB(buff)->sacked = TCP_SKB_CB(skb)->sacked; TCP_SKB_CB(buff)->sacked = TCP_SKB_CB(skb)->sacked;
TCP_SKB_CB(skb)->sacked &= ~TCPCB_AT_TAIL; TCP_SKB_CB(skb)->sacked &= ~TCPCB_AT_TAIL;
if (!skb_shinfo(skb)->nr_frags && skb->ip_summed != CHECKSUM_HW) { if (!skb_shinfo(skb)->nr_frags && skb->ip_summed != CHECKSUM_PARTIAL) {
/* Copy and checksum data tail into the new buffer. */ /* Copy and checksum data tail into the new buffer. */
buff->csum = csum_partial_copy_nocheck(skb->data + len, skb_put(buff, nsize), buff->csum = csum_partial_copy_nocheck(skb->data + len, skb_put(buff, nsize),
nsize, 0); nsize, 0);
@ -586,7 +586,7 @@ int tcp_fragment(struct sock *sk, struct sk_buff *skb, u32 len, unsigned int mss
skb->csum = csum_block_sub(skb->csum, buff->csum, len); skb->csum = csum_block_sub(skb->csum, buff->csum, len);
} else { } else {
skb->ip_summed = CHECKSUM_HW; skb->ip_summed = CHECKSUM_PARTIAL;
skb_split(skb, buff, len); skb_split(skb, buff, len);
} }
@ -689,7 +689,7 @@ int tcp_trim_head(struct sock *sk, struct sk_buff *skb, u32 len)
__pskb_trim_head(skb, len - skb_headlen(skb)); __pskb_trim_head(skb, len - skb_headlen(skb));
TCP_SKB_CB(skb)->seq += len; TCP_SKB_CB(skb)->seq += len;
skb->ip_summed = CHECKSUM_HW; skb->ip_summed = CHECKSUM_PARTIAL;
skb->truesize -= len; skb->truesize -= len;
sk->sk_wmem_queued -= len; sk->sk_wmem_queued -= len;
@ -1062,7 +1062,7 @@ static int tso_fragment(struct sock *sk, struct sk_buff *skb, unsigned int len,
/* This packet was never sent out yet, so no SACK bits. */ /* This packet was never sent out yet, so no SACK bits. */
TCP_SKB_CB(buff)->sacked = 0; TCP_SKB_CB(buff)->sacked = 0;
buff->ip_summed = skb->ip_summed = CHECKSUM_HW; buff->ip_summed = skb->ip_summed = CHECKSUM_PARTIAL;
skb_split(skb, buff, len); skb_split(skb, buff, len);
/* Fix up tso_factor for both original and new SKB. */ /* Fix up tso_factor for both original and new SKB. */
@ -1206,8 +1206,7 @@ static int tcp_mtu_probe(struct sock *sk)
TCP_SKB_CB(nskb)->flags = TCPCB_FLAG_ACK; TCP_SKB_CB(nskb)->flags = TCPCB_FLAG_ACK;
TCP_SKB_CB(nskb)->sacked = 0; TCP_SKB_CB(nskb)->sacked = 0;
nskb->csum = 0; nskb->csum = 0;
if (skb->ip_summed == CHECKSUM_HW) nskb->ip_summed = skb->ip_summed;
nskb->ip_summed = CHECKSUM_HW;
len = 0; len = 0;
while (len < probe_size) { while (len < probe_size) {
@ -1231,7 +1230,7 @@ static int tcp_mtu_probe(struct sock *sk)
~(TCPCB_FLAG_FIN|TCPCB_FLAG_PSH); ~(TCPCB_FLAG_FIN|TCPCB_FLAG_PSH);
if (!skb_shinfo(skb)->nr_frags) { if (!skb_shinfo(skb)->nr_frags) {
skb_pull(skb, copy); skb_pull(skb, copy);
if (skb->ip_summed != CHECKSUM_HW) if (skb->ip_summed != CHECKSUM_PARTIAL)
skb->csum = csum_partial(skb->data, skb->len, 0); skb->csum = csum_partial(skb->data, skb->len, 0);
} else { } else {
__pskb_trim_head(skb, copy); __pskb_trim_head(skb, copy);
@ -1572,10 +1571,9 @@ static void tcp_retrans_try_collapse(struct sock *sk, struct sk_buff *skb, int m
memcpy(skb_put(skb, next_skb_size), next_skb->data, next_skb_size); memcpy(skb_put(skb, next_skb_size), next_skb->data, next_skb_size);
if (next_skb->ip_summed == CHECKSUM_HW) skb->ip_summed = next_skb->ip_summed;
skb->ip_summed = CHECKSUM_HW;
if (skb->ip_summed != CHECKSUM_HW) if (skb->ip_summed != CHECKSUM_PARTIAL)
skb->csum = csum_block_add(skb->csum, next_skb->csum, skb_size); skb->csum = csum_block_add(skb->csum, next_skb->csum, skb_size);
/* Update sequence range on original skb. */ /* Update sequence range on original skb. */

View File

@ -429,7 +429,7 @@ static int udp_push_pending_frames(struct sock *sk, struct udp_sock *up)
/* /*
* Only one fragment on the socket. * Only one fragment on the socket.
*/ */
if (skb->ip_summed == CHECKSUM_HW) { if (skb->ip_summed == CHECKSUM_PARTIAL) {
skb->csum = offsetof(struct udphdr, check); skb->csum = offsetof(struct udphdr, check);
uh->check = ~csum_tcpudp_magic(fl->fl4_src, fl->fl4_dst, uh->check = ~csum_tcpudp_magic(fl->fl4_src, fl->fl4_dst,
up->len, IPPROTO_UDP, 0); up->len, IPPROTO_UDP, 0);
@ -448,7 +448,7 @@ static int udp_push_pending_frames(struct sock *sk, struct udp_sock *up)
* fragments on the socket so that all csums of sk_buffs * fragments on the socket so that all csums of sk_buffs
* should be together. * should be together.
*/ */
if (skb->ip_summed == CHECKSUM_HW) { if (skb->ip_summed == CHECKSUM_PARTIAL) {
int offset = (unsigned char *)uh - skb->data; int offset = (unsigned char *)uh - skb->data;
skb->csum = skb_checksum(skb, offset, skb->len - offset, 0); skb->csum = skb_checksum(skb, offset, skb->len - offset, 0);
@ -1088,7 +1088,7 @@ static void udp_checksum_init(struct sk_buff *skb, struct udphdr *uh,
{ {
if (uh->check == 0) { if (uh->check == 0) {
skb->ip_summed = CHECKSUM_UNNECESSARY; skb->ip_summed = CHECKSUM_UNNECESSARY;
} else if (skb->ip_summed == CHECKSUM_HW) { } else if (skb->ip_summed == CHECKSUM_COMPLETE) {
if (!udp_check(uh, ulen, saddr, daddr, skb->csum)) if (!udp_check(uh, ulen, saddr, daddr, skb->csum))
skb->ip_summed = CHECKSUM_UNNECESSARY; skb->ip_summed = CHECKSUM_UNNECESSARY;
} }

View File

@ -48,8 +48,8 @@ static int xfrm4_output_one(struct sk_buff *skb)
struct xfrm_state *x = dst->xfrm; struct xfrm_state *x = dst->xfrm;
int err; int err;
if (skb->ip_summed == CHECKSUM_HW) { if (skb->ip_summed == CHECKSUM_PARTIAL) {
err = skb_checksum_help(skb, 0); err = skb_checksum_help(skb);
if (err) if (err)
goto error_nolock; goto error_nolock;
} }

View File

@ -294,7 +294,7 @@ looped_back:
hdr = (struct ipv6_rt_hdr *) skb2->h.raw; hdr = (struct ipv6_rt_hdr *) skb2->h.raw;
} }
if (skb->ip_summed == CHECKSUM_HW) if (skb->ip_summed == CHECKSUM_COMPLETE)
skb->ip_summed = CHECKSUM_NONE; skb->ip_summed = CHECKSUM_NONE;
i = n - --hdr->segments_left; i = n - --hdr->segments_left;

View File

@ -606,7 +606,7 @@ static int icmpv6_rcv(struct sk_buff **pskb)
/* Perform checksum. */ /* Perform checksum. */
switch (skb->ip_summed) { switch (skb->ip_summed) {
case CHECKSUM_HW: case CHECKSUM_COMPLETE:
if (!csum_ipv6_magic(saddr, daddr, skb->len, IPPROTO_ICMPV6, if (!csum_ipv6_magic(saddr, daddr, skb->len, IPPROTO_ICMPV6,
skb->csum)) skb->csum))
break; break;

View File

@ -866,7 +866,7 @@ static inline int ip6_ufo_append_data(struct sock *sk,
/* initialize protocol header pointer */ /* initialize protocol header pointer */
skb->h.raw = skb->data + fragheaderlen; skb->h.raw = skb->data + fragheaderlen;
skb->ip_summed = CHECKSUM_HW; skb->ip_summed = CHECKSUM_PARTIAL;
skb->csum = 0; skb->csum = 0;
sk->sk_sndmsg_off = 0; sk->sk_sndmsg_off = 0;
} }

View File

@ -87,7 +87,7 @@ unsigned int nf_ip6_checksum(struct sk_buff *skb, unsigned int hook,
unsigned int csum = 0; unsigned int csum = 0;
switch (skb->ip_summed) { switch (skb->ip_summed) {
case CHECKSUM_HW: case CHECKSUM_COMPLETE:
if (hook != NF_IP6_PRE_ROUTING && hook != NF_IP6_LOCAL_IN) if (hook != NF_IP6_PRE_ROUTING && hook != NF_IP6_LOCAL_IN)
break; break;
if (!csum_ipv6_magic(&ip6h->saddr, &ip6h->daddr, if (!csum_ipv6_magic(&ip6h->saddr, &ip6h->daddr,

View File

@ -206,9 +206,9 @@ ipq_build_packet_message(struct ipq_queue_entry *entry, int *errp)
break; break;
case IPQ_COPY_PACKET: case IPQ_COPY_PACKET:
if (entry->skb->ip_summed == CHECKSUM_HW && if ((entry->skb->ip_summed == CHECKSUM_PARTIAL ||
(*errp = skb_checksum_help(entry->skb, entry->skb->ip_summed == CHECKSUM_COMPLETE) &&
entry->info->outdev == NULL))) { (*errp = skb_checksum_help(entry->skb))) {
read_unlock_bh(&queue_lock); read_unlock_bh(&queue_lock);
return NULL; return NULL;
} }

View File

@ -408,7 +408,7 @@ static int nf_ct_frag6_queue(struct nf_ct_frag6_queue *fq, struct sk_buff *skb,
return -1; return -1;
} }
if (skb->ip_summed == CHECKSUM_HW) if (skb->ip_summed == CHECKSUM_COMPLETE)
skb->csum = csum_sub(skb->csum, skb->csum = csum_sub(skb->csum,
csum_partial(skb->nh.raw, csum_partial(skb->nh.raw,
(u8*)(fhdr + 1) - skb->nh.raw, (u8*)(fhdr + 1) - skb->nh.raw,
@ -640,7 +640,7 @@ nf_ct_frag6_reasm(struct nf_ct_frag6_queue *fq, struct net_device *dev)
head->len += fp->len; head->len += fp->len;
if (head->ip_summed != fp->ip_summed) if (head->ip_summed != fp->ip_summed)
head->ip_summed = CHECKSUM_NONE; head->ip_summed = CHECKSUM_NONE;
else if (head->ip_summed == CHECKSUM_HW) else if (head->ip_summed == CHECKSUM_COMPLETE)
head->csum = csum_add(head->csum, fp->csum); head->csum = csum_add(head->csum, fp->csum);
head->truesize += fp->truesize; head->truesize += fp->truesize;
atomic_sub(fp->truesize, &nf_ct_frag6_mem); atomic_sub(fp->truesize, &nf_ct_frag6_mem);
@ -652,7 +652,7 @@ nf_ct_frag6_reasm(struct nf_ct_frag6_queue *fq, struct net_device *dev)
head->nh.ipv6h->payload_len = htons(payload_len); head->nh.ipv6h->payload_len = htons(payload_len);
/* Yes, and fold redundant checksum back. 8) */ /* Yes, and fold redundant checksum back. 8) */
if (head->ip_summed == CHECKSUM_HW) if (head->ip_summed == CHECKSUM_COMPLETE)
head->csum = csum_partial(head->nh.raw, head->h.raw-head->nh.raw, head->csum); head->csum = csum_partial(head->nh.raw, head->h.raw-head->nh.raw, head->csum);
fq->fragments = NULL; fq->fragments = NULL;

View File

@ -334,7 +334,7 @@ int rawv6_rcv(struct sock *sk, struct sk_buff *skb)
if (!rp->checksum) if (!rp->checksum)
skb->ip_summed = CHECKSUM_UNNECESSARY; skb->ip_summed = CHECKSUM_UNNECESSARY;
if (skb->ip_summed == CHECKSUM_HW) { if (skb->ip_summed == CHECKSUM_COMPLETE) {
skb_postpull_rcsum(skb, skb->nh.raw, skb_postpull_rcsum(skb, skb->nh.raw,
skb->h.raw - skb->nh.raw); skb->h.raw - skb->nh.raw);
if (!csum_ipv6_magic(&skb->nh.ipv6h->saddr, if (!csum_ipv6_magic(&skb->nh.ipv6h->saddr,

View File

@ -433,7 +433,7 @@ static void ip6_frag_queue(struct frag_queue *fq, struct sk_buff *skb,
return; return;
} }
if (skb->ip_summed == CHECKSUM_HW) if (skb->ip_summed == CHECKSUM_COMPLETE)
skb->csum = csum_sub(skb->csum, skb->csum = csum_sub(skb->csum,
csum_partial(skb->nh.raw, (u8*)(fhdr+1)-skb->nh.raw, 0)); csum_partial(skb->nh.raw, (u8*)(fhdr+1)-skb->nh.raw, 0));
@ -647,7 +647,7 @@ static int ip6_frag_reasm(struct frag_queue *fq, struct sk_buff **skb_in,
head->len += fp->len; head->len += fp->len;
if (head->ip_summed != fp->ip_summed) if (head->ip_summed != fp->ip_summed)
head->ip_summed = CHECKSUM_NONE; head->ip_summed = CHECKSUM_NONE;
else if (head->ip_summed == CHECKSUM_HW) else if (head->ip_summed == CHECKSUM_COMPLETE)
head->csum = csum_add(head->csum, fp->csum); head->csum = csum_add(head->csum, fp->csum);
head->truesize += fp->truesize; head->truesize += fp->truesize;
atomic_sub(fp->truesize, &ip6_frag_mem); atomic_sub(fp->truesize, &ip6_frag_mem);
@ -662,7 +662,7 @@ static int ip6_frag_reasm(struct frag_queue *fq, struct sk_buff **skb_in,
*skb_in = head; *skb_in = head;
/* Yes, and fold redundant checksum back. 8) */ /* Yes, and fold redundant checksum back. 8) */
if (head->ip_summed == CHECKSUM_HW) if (head->ip_summed == CHECKSUM_COMPLETE)
head->csum = csum_partial(head->nh.raw, head->h.raw-head->nh.raw, head->csum); head->csum = csum_partial(head->nh.raw, head->h.raw-head->nh.raw, head->csum);
IP6_INC_STATS_BH(IPSTATS_MIB_REASMOKS); IP6_INC_STATS_BH(IPSTATS_MIB_REASMOKS);

View File

@ -545,7 +545,7 @@ static void tcp_v6_send_check(struct sock *sk, int len, struct sk_buff *skb)
struct ipv6_pinfo *np = inet6_sk(sk); struct ipv6_pinfo *np = inet6_sk(sk);
struct tcphdr *th = skb->h.th; struct tcphdr *th = skb->h.th;
if (skb->ip_summed == CHECKSUM_HW) { 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 = offsetof(struct tcphdr, check);
} else { } else {
@ -570,7 +570,7 @@ static int tcp_v6_gso_send_check(struct sk_buff *skb)
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 = offsetof(struct tcphdr, check);
skb->ip_summed = CHECKSUM_HW; skb->ip_summed = CHECKSUM_PARTIAL;
return 0; return 0;
} }
@ -1033,7 +1033,7 @@ out:
static int tcp_v6_checksum_init(struct sk_buff *skb) static int tcp_v6_checksum_init(struct sk_buff *skb)
{ {
if (skb->ip_summed == CHECKSUM_HW) { if (skb->ip_summed == CHECKSUM_COMPLETE) {
if (!tcp_v6_check(skb->h.th,skb->len,&skb->nh.ipv6h->saddr, if (!tcp_v6_check(skb->h.th,skb->len,&skb->nh.ipv6h->saddr,
&skb->nh.ipv6h->daddr,skb->csum)) { &skb->nh.ipv6h->daddr,skb->csum)) {
skb->ip_summed = CHECKSUM_UNNECESSARY; skb->ip_summed = CHECKSUM_UNNECESSARY;

View File

@ -475,7 +475,7 @@ static int udpv6_rcv(struct sk_buff **pskb)
uh = skb->h.uh; uh = skb->h.uh;
} }
if (skb->ip_summed == CHECKSUM_HW && if (skb->ip_summed == CHECKSUM_COMPLETE &&
!csum_ipv6_magic(saddr, daddr, ulen, IPPROTO_UDP, skb->csum)) !csum_ipv6_magic(saddr, daddr, ulen, IPPROTO_UDP, skb->csum))
skb->ip_summed = CHECKSUM_UNNECESSARY; skb->ip_summed = CHECKSUM_UNNECESSARY;

View File

@ -41,8 +41,8 @@ static int xfrm6_output_one(struct sk_buff *skb)
struct xfrm_state *x = dst->xfrm; struct xfrm_state *x = dst->xfrm;
int err; int err;
if (skb->ip_summed == CHECKSUM_HW) { if (skb->ip_summed == CHECKSUM_PARTIAL) {
err = skb_checksum_help(skb, 0); err = skb_checksum_help(skb);
if (err) if (err)
goto error_nolock; goto error_nolock;
} }

View File

@ -823,8 +823,7 @@ static int tcp_error(struct sk_buff *skb,
/* Checksum invalid? Ignore. /* Checksum invalid? Ignore.
* We skip checking packets on the outgoing path * We skip checking packets on the outgoing path
* because the semantic of CHECKSUM_HW is different there * because the checksum is assumed to be correct.
* and moreover root might send raw packets.
*/ */
/* FIXME: Source route IP option packets --RR */ /* FIXME: Source route IP option packets --RR */
if (nf_conntrack_checksum && if (nf_conntrack_checksum &&

View File

@ -131,8 +131,7 @@ static int udp_error(struct sk_buff *skb, unsigned int dataoff,
/* Checksum invalid? Ignore. /* Checksum invalid? Ignore.
* We skip checking packets on the outgoing path * We skip checking packets on the outgoing path
* because the semantic of CHECKSUM_HW is different there * because the checksum is assumed to be correct.
* and moreover root might send raw packets.
* FIXME: Source route IP option packets --RR */ * FIXME: Source route IP option packets --RR */
if (nf_conntrack_checksum && if (nf_conntrack_checksum &&
((pf == PF_INET && hooknum == NF_IP_PRE_ROUTING) || ((pf == PF_INET && hooknum == NF_IP_PRE_ROUTING) ||

View File

@ -377,9 +377,9 @@ nfqnl_build_packet_message(struct nfqnl_instance *queue,
break; break;
case NFQNL_COPY_PACKET: case NFQNL_COPY_PACKET:
if (entskb->ip_summed == CHECKSUM_HW && if ((entskb->ip_summed == CHECKSUM_PARTIAL ||
(*errp = skb_checksum_help(entskb, entskb->ip_summed == CHECKSUM_COMPLETE) &&
outdev == NULL))) { (*errp = skb_checksum_help(entskb))) {
spin_unlock_bh(&queue->lock); spin_unlock_bh(&queue->lock);
return NULL; return NULL;
} }

View File

@ -586,7 +586,7 @@ static int tpacket_rcv(struct sk_buff *skb, struct net_device *dev, struct packe
else if (skb->pkt_type == PACKET_OUTGOING) { else if (skb->pkt_type == PACKET_OUTGOING) {
/* Special case: outgoing packets have ll header at head */ /* Special case: outgoing packets have ll header at head */
skb_pull(skb, skb->nh.raw - skb->data); skb_pull(skb, skb->nh.raw - skb->data);
if (skb->ip_summed == CHECKSUM_HW) if (skb->ip_summed == CHECKSUM_PARTIAL)
status |= TP_STATUS_CSUMNOTREADY; status |= TP_STATUS_CSUMNOTREADY;
} }
} }

View File

@ -192,8 +192,8 @@ static int netem_enqueue(struct sk_buff *skb, struct Qdisc *sch)
*/ */
if (q->corrupt && q->corrupt >= get_crandom(&q->corrupt_cor)) { if (q->corrupt && q->corrupt >= get_crandom(&q->corrupt_cor)) {
if (!(skb = skb_unshare(skb, GFP_ATOMIC)) if (!(skb = skb_unshare(skb, GFP_ATOMIC))
|| (skb->ip_summed == CHECKSUM_HW || (skb->ip_summed == CHECKSUM_PARTIAL
&& skb_checksum_help(skb, 0))) { && skb_checksum_help(skb))) {
sch->qstats.drops++; sch->qstats.drops++;
return NET_XMIT_DROP; return NET_XMIT_DROP;
} }

View File

@ -168,7 +168,7 @@ int csum_partial_copy_to_xdr(struct xdr_buf *xdr, struct sk_buff *skb)
return -1; return -1;
if ((unsigned short)csum_fold(desc.csum)) if ((unsigned short)csum_fold(desc.csum))
return -1; return -1;
if (unlikely(skb->ip_summed == CHECKSUM_HW)) if (unlikely(skb->ip_summed == CHECKSUM_COMPLETE))
netdev_rx_csum_fault(skb->dev); netdev_rx_csum_fault(skb->dev);
return 0; return 0;
no_checksum: no_checksum: