diff options
| author | Patrick McHardy <kaber@trash.net> | 2006-08-29 19:44:56 -0400 |
|---|---|---|
| committer | David S. Miller <davem@sunset.davemloft.net> | 2006-09-22 17:53:53 -0400 |
| commit | 84fa7933a33f806bbbaae6775e87459b1ec584c0 (patch) | |
| tree | 5be404225d90f640997b12f631e9b496b3fd0d61 | |
| parent | 8584d6df39db5601965f9bc5e3bf2fea833ad7bb (diff) | |
[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>
72 files changed, 168 insertions, 169 deletions
diff --git a/drivers/atm/he.c b/drivers/atm/he.c index ffcb9fd31c38..41e052fecd7f 100644 --- a/drivers/atm/he.c +++ b/drivers/atm/he.c | |||
| @@ -1912,7 +1912,7 @@ he_service_rbrq(struct he_dev *he_dev, int group) | |||
| 1912 | skb->tail = skb->data + skb->len; | 1912 | skb->tail = skb->data + skb->len; |
| 1913 | #ifdef USE_CHECKSUM_HW | 1913 | #ifdef USE_CHECKSUM_HW |
| 1914 | if (vcc->vpi == 0 && vcc->vci >= ATM_NOT_RSV_VCI) { | 1914 | if (vcc->vpi == 0 && vcc->vci >= ATM_NOT_RSV_VCI) { |
| 1915 | skb->ip_summed = CHECKSUM_HW; | 1915 | skb->ip_summed = CHECKSUM_COMPLETE; |
| 1916 | skb->csum = TCP_CKSUM(skb->data, | 1916 | skb->csum = TCP_CKSUM(skb->data, |
| 1917 | he_vcc->pdu_len); | 1917 | he_vcc->pdu_len); |
| 1918 | } | 1918 | } |
diff --git a/drivers/net/3c59x.c b/drivers/net/3c59x.c index 80e8ca013e44..29dede2eaa85 100644 --- a/drivers/net/3c59x.c +++ b/drivers/net/3c59x.c | |||
| @@ -2077,7 +2077,7 @@ boomerang_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 2077 | 2077 | ||
| 2078 | vp->tx_ring[entry].next = 0; | 2078 | vp->tx_ring[entry].next = 0; |
| 2079 | #if DO_ZEROCOPY | 2079 | #if DO_ZEROCOPY |
| 2080 | if (skb->ip_summed != CHECKSUM_HW) | 2080 | if (skb->ip_summed != CHECKSUM_PARTIAL) |
| 2081 | vp->tx_ring[entry].status = cpu_to_le32(skb->len | TxIntrUploaded); | 2081 | vp->tx_ring[entry].status = cpu_to_le32(skb->len | TxIntrUploaded); |
| 2082 | else | 2082 | else |
| 2083 | vp->tx_ring[entry].status = cpu_to_le32(skb->len | TxIntrUploaded | AddTCPChksum | AddUDPChksum); | 2083 | vp->tx_ring[entry].status = cpu_to_le32(skb->len | TxIntrUploaded | AddTCPChksum | AddUDPChksum); |
diff --git a/drivers/net/8139cp.c b/drivers/net/8139cp.c index 1428bb7715af..a48b211c489d 100644 --- a/drivers/net/8139cp.c +++ b/drivers/net/8139cp.c | |||
| @@ -813,7 +813,7 @@ static int cp_start_xmit (struct sk_buff *skb, struct net_device *dev) | |||
| 813 | 813 | ||
| 814 | if (mss) | 814 | if (mss) |
| 815 | flags |= LargeSend | ((mss & MSSMask) << MSSShift); | 815 | flags |= LargeSend | ((mss & MSSMask) << MSSShift); |
| 816 | else if (skb->ip_summed == CHECKSUM_HW) { | 816 | else if (skb->ip_summed == CHECKSUM_PARTIAL) { |
| 817 | const struct iphdr *ip = skb->nh.iph; | 817 | const struct iphdr *ip = skb->nh.iph; |
| 818 | if (ip->protocol == IPPROTO_TCP) | 818 | if (ip->protocol == IPPROTO_TCP) |
| 819 | flags |= IPCS | TCPCS; | 819 | flags |= IPCS | TCPCS; |
| @@ -867,7 +867,7 @@ static int cp_start_xmit (struct sk_buff *skb, struct net_device *dev) | |||
| 867 | if (mss) | 867 | if (mss) |
| 868 | ctrl |= LargeSend | | 868 | ctrl |= LargeSend | |
| 869 | ((mss & MSSMask) << MSSShift); | 869 | ((mss & MSSMask) << MSSShift); |
| 870 | else if (skb->ip_summed == CHECKSUM_HW) { | 870 | else if (skb->ip_summed == CHECKSUM_PARTIAL) { |
| 871 | if (ip->protocol == IPPROTO_TCP) | 871 | if (ip->protocol == IPPROTO_TCP) |
| 872 | ctrl |= IPCS | TCPCS; | 872 | ctrl |= IPCS | TCPCS; |
| 873 | else if (ip->protocol == IPPROTO_UDP) | 873 | else if (ip->protocol == IPPROTO_UDP) |
| @@ -898,7 +898,7 @@ static int cp_start_xmit (struct sk_buff *skb, struct net_device *dev) | |||
| 898 | txd->addr = cpu_to_le64(first_mapping); | 898 | txd->addr = cpu_to_le64(first_mapping); |
| 899 | wmb(); | 899 | wmb(); |
| 900 | 900 | ||
| 901 | if (skb->ip_summed == CHECKSUM_HW) { | 901 | if (skb->ip_summed == CHECKSUM_PARTIAL) { |
| 902 | if (ip->protocol == IPPROTO_TCP) | 902 | if (ip->protocol == IPPROTO_TCP) |
| 903 | txd->opts1 = cpu_to_le32(first_eor | first_len | | 903 | txd->opts1 = cpu_to_le32(first_eor | first_len | |
| 904 | FirstFrag | DescOwn | | 904 | FirstFrag | DescOwn | |
diff --git a/drivers/net/acenic.c b/drivers/net/acenic.c index 1c01e9b3d07c..826548644d7b 100644 --- a/drivers/net/acenic.c +++ b/drivers/net/acenic.c | |||
| @@ -2040,7 +2040,7 @@ static void ace_rx_int(struct net_device *dev, u32 rxretprd, u32 rxretcsm) | |||
| 2040 | */ | 2040 | */ |
| 2041 | if (bd_flags & BD_FLG_TCP_UDP_SUM) { | 2041 | if (bd_flags & BD_FLG_TCP_UDP_SUM) { |
| 2042 | skb->csum = htons(csum); | 2042 | skb->csum = htons(csum); |
| 2043 | skb->ip_summed = CHECKSUM_HW; | 2043 | skb->ip_summed = CHECKSUM_COMPLETE; |
| 2044 | } else { | 2044 | } else { |
| 2045 | skb->ip_summed = CHECKSUM_NONE; | 2045 | skb->ip_summed = CHECKSUM_NONE; |
| 2046 | } | 2046 | } |
| @@ -2511,7 +2511,7 @@ restart: | |||
| 2511 | 2511 | ||
| 2512 | mapping = ace_map_tx_skb(ap, skb, skb, idx); | 2512 | mapping = ace_map_tx_skb(ap, skb, skb, idx); |
| 2513 | flagsize = (skb->len << 16) | (BD_FLG_END); | 2513 | flagsize = (skb->len << 16) | (BD_FLG_END); |
| 2514 | if (skb->ip_summed == CHECKSUM_HW) | 2514 | if (skb->ip_summed == CHECKSUM_PARTIAL) |
| 2515 | flagsize |= BD_FLG_TCP_UDP_SUM; | 2515 | flagsize |= BD_FLG_TCP_UDP_SUM; |
| 2516 | #if ACENIC_DO_VLAN | 2516 | #if ACENIC_DO_VLAN |
| 2517 | if (vlan_tx_tag_present(skb)) { | 2517 | if (vlan_tx_tag_present(skb)) { |
| @@ -2534,7 +2534,7 @@ restart: | |||
| 2534 | 2534 | ||
| 2535 | mapping = ace_map_tx_skb(ap, skb, NULL, idx); | 2535 | mapping = ace_map_tx_skb(ap, skb, NULL, idx); |
| 2536 | flagsize = (skb_headlen(skb) << 16); | 2536 | flagsize = (skb_headlen(skb) << 16); |
| 2537 | if (skb->ip_summed == CHECKSUM_HW) | 2537 | if (skb->ip_summed == CHECKSUM_PARTIAL) |
| 2538 | flagsize |= BD_FLG_TCP_UDP_SUM; | 2538 | flagsize |= BD_FLG_TCP_UDP_SUM; |
| 2539 | #if ACENIC_DO_VLAN | 2539 | #if ACENIC_DO_VLAN |
| 2540 | if (vlan_tx_tag_present(skb)) { | 2540 | if (vlan_tx_tag_present(skb)) { |
| @@ -2560,7 +2560,7 @@ restart: | |||
| 2560 | PCI_DMA_TODEVICE); | 2560 | PCI_DMA_TODEVICE); |
| 2561 | 2561 | ||
| 2562 | flagsize = (frag->size << 16); | 2562 | flagsize = (frag->size << 16); |
| 2563 | if (skb->ip_summed == CHECKSUM_HW) | 2563 | if (skb->ip_summed == CHECKSUM_PARTIAL) |
| 2564 | flagsize |= BD_FLG_TCP_UDP_SUM; | 2564 | flagsize |= BD_FLG_TCP_UDP_SUM; |
| 2565 | idx = (idx + 1) % ACE_TX_RING_ENTRIES(ap); | 2565 | idx = (idx + 1) % ACE_TX_RING_ENTRIES(ap); |
| 2566 | 2566 | ||
diff --git a/drivers/net/bnx2.c b/drivers/net/bnx2.c index 652eb05a6c2d..7857b4630124 100644 --- a/drivers/net/bnx2.c +++ b/drivers/net/bnx2.c | |||
| @@ -4423,7 +4423,7 @@ bnx2_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 4423 | ring_prod = TX_RING_IDX(prod); | 4423 | ring_prod = TX_RING_IDX(prod); |
| 4424 | 4424 | ||
| 4425 | vlan_tag_flags = 0; | 4425 | vlan_tag_flags = 0; |
| 4426 | if (skb->ip_summed == CHECKSUM_HW) { | 4426 | if (skb->ip_summed == CHECKSUM_PARTIAL) { |
| 4427 | vlan_tag_flags |= TX_BD_FLAGS_TCP_UDP_CKSUM; | 4427 | vlan_tag_flags |= TX_BD_FLAGS_TCP_UDP_CKSUM; |
| 4428 | } | 4428 | } |
| 4429 | 4429 | ||
diff --git a/drivers/net/cassini.c b/drivers/net/cassini.c index a31544ccb3c4..558fdb8ad2dc 100644 --- a/drivers/net/cassini.c +++ b/drivers/net/cassini.c | |||
| @@ -2167,7 +2167,7 @@ end_copy_pkt: | |||
| 2167 | cas_page_unmap(addr); | 2167 | cas_page_unmap(addr); |
| 2168 | } | 2168 | } |
| 2169 | skb->csum = ntohs(i ^ 0xffff); | 2169 | skb->csum = ntohs(i ^ 0xffff); |
| 2170 | skb->ip_summed = CHECKSUM_HW; | 2170 | skb->ip_summed = CHECKSUM_COMPLETE; |
| 2171 | skb->protocol = eth_type_trans(skb, cp->dev); | 2171 | skb->protocol = eth_type_trans(skb, cp->dev); |
| 2172 | return len; | 2172 | return len; |
| 2173 | } | 2173 | } |
| @@ -2821,7 +2821,7 @@ static inline int cas_xmit_tx_ringN(struct cas *cp, int ring, | |||
| 2821 | } | 2821 | } |
| 2822 | 2822 | ||
| 2823 | ctrl = 0; | 2823 | ctrl = 0; |
| 2824 | if (skb->ip_summed == CHECKSUM_HW) { | 2824 | if (skb->ip_summed == CHECKSUM_PARTIAL) { |
| 2825 | u64 csum_start_off, csum_stuff_off; | 2825 | u64 csum_start_off, csum_stuff_off; |
| 2826 | 2826 | ||
| 2827 | csum_start_off = (u64) (skb->h.raw - skb->data); | 2827 | csum_start_off = (u64) (skb->h.raw - skb->data); |
diff --git a/drivers/net/chelsio/sge.c b/drivers/net/chelsio/sge.c index 61b3754f50ff..ddd0bdb498f4 100644 --- a/drivers/net/chelsio/sge.c +++ b/drivers/net/chelsio/sge.c | |||
| @@ -1470,9 +1470,9 @@ int t1_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 1470 | } | 1470 | } |
| 1471 | 1471 | ||
| 1472 | if (!(adapter->flags & UDP_CSUM_CAPABLE) && | 1472 | if (!(adapter->flags & UDP_CSUM_CAPABLE) && |
| 1473 | skb->ip_summed == CHECKSUM_HW && | 1473 | skb->ip_summed == CHECKSUM_PARTIAL && |
| 1474 | skb->nh.iph->protocol == IPPROTO_UDP) | 1474 | skb->nh.iph->protocol == IPPROTO_UDP) |
| 1475 | if (unlikely(skb_checksum_help(skb, 0))) { | 1475 | if (unlikely(skb_checksum_help(skb))) { |
| 1476 | dev_kfree_skb_any(skb); | 1476 | dev_kfree_skb_any(skb); |
| 1477 | return NETDEV_TX_OK; | 1477 | return NETDEV_TX_OK; |
| 1478 | } | 1478 | } |
| @@ -1495,11 +1495,11 @@ int t1_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 1495 | cpl = (struct cpl_tx_pkt *)__skb_push(skb, sizeof(*cpl)); | 1495 | cpl = (struct cpl_tx_pkt *)__skb_push(skb, sizeof(*cpl)); |
| 1496 | cpl->opcode = CPL_TX_PKT; | 1496 | cpl->opcode = CPL_TX_PKT; |
| 1497 | cpl->ip_csum_dis = 1; /* SW calculates IP csum */ | 1497 | cpl->ip_csum_dis = 1; /* SW calculates IP csum */ |
| 1498 | cpl->l4_csum_dis = skb->ip_summed == CHECKSUM_HW ? 0 : 1; | 1498 | cpl->l4_csum_dis = skb->ip_summed == CHECKSUM_PARTIAL ? 0 : 1; |
| 1499 | /* the length field isn't used so don't bother setting it */ | 1499 | /* the length field isn't used so don't bother setting it */ |
| 1500 | 1500 | ||
| 1501 | st->tx_cso += (skb->ip_summed == CHECKSUM_HW); | 1501 | st->tx_cso += (skb->ip_summed == CHECKSUM_PARTIAL); |
| 1502 | sge->stats.tx_do_cksum += (skb->ip_summed == CHECKSUM_HW); | 1502 | sge->stats.tx_do_cksum += (skb->ip_summed == CHECKSUM_PARTIAL); |
| 1503 | sge->stats.tx_reg_pkts++; | 1503 | sge->stats.tx_reg_pkts++; |
| 1504 | } | 1504 | } |
| 1505 | cpl->iff = dev->if_port; | 1505 | cpl->iff = dev->if_port; |
diff --git a/drivers/net/dl2k.c b/drivers/net/dl2k.c index 402961e68c89..b74e67654764 100644 --- a/drivers/net/dl2k.c +++ b/drivers/net/dl2k.c | |||
| @@ -611,7 +611,7 @@ start_xmit (struct sk_buff *skb, struct net_device *dev) | |||
| 611 | txdesc = &np->tx_ring[entry]; | 611 | txdesc = &np->tx_ring[entry]; |
| 612 | 612 | ||
| 613 | #if 0 | 613 | #if 0 |
| 614 | if (skb->ip_summed == CHECKSUM_HW) { | 614 | if (skb->ip_summed == CHECKSUM_PARTIAL) { |
| 615 | txdesc->status |= | 615 | txdesc->status |= |
| 616 | cpu_to_le64 (TCPChecksumEnable | UDPChecksumEnable | | 616 | cpu_to_le64 (TCPChecksumEnable | UDPChecksumEnable | |
| 617 | IPChecksumEnable); | 617 | IPChecksumEnable); |
diff --git a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c index 98ef9f85482f..2ab9f96f5dab 100644 --- a/drivers/net/e1000/e1000_main.c +++ b/drivers/net/e1000/e1000_main.c | |||
| @@ -2600,7 +2600,7 @@ e1000_tx_csum(struct e1000_adapter *adapter, struct e1000_tx_ring *tx_ring, | |||
| 2600 | unsigned int i; | 2600 | unsigned int i; |
| 2601 | uint8_t css; | 2601 | uint8_t css; |
| 2602 | 2602 | ||
| 2603 | if (likely(skb->ip_summed == CHECKSUM_HW)) { | 2603 | if (likely(skb->ip_summed == CHECKSUM_PARTIAL)) { |
| 2604 | css = skb->h.raw - skb->data; | 2604 | css = skb->h.raw - skb->data; |
| 2605 | 2605 | ||
| 2606 | i = tx_ring->next_to_use; | 2606 | i = tx_ring->next_to_use; |
| @@ -2927,11 +2927,11 @@ e1000_xmit_frame(struct sk_buff *skb, struct net_device *netdev) | |||
| 2927 | } | 2927 | } |
| 2928 | 2928 | ||
| 2929 | /* reserve a descriptor for the offload context */ | 2929 | /* reserve a descriptor for the offload context */ |
| 2930 | if ((mss) || (skb->ip_summed == CHECKSUM_HW)) | 2930 | if ((mss) || (skb->ip_summed == CHECKSUM_PARTIAL)) |
| 2931 | count++; | 2931 | count++; |
| 2932 | count++; | 2932 | count++; |
| 2933 | #else | 2933 | #else |
| 2934 | if (skb->ip_summed == CHECKSUM_HW) | 2934 | if (skb->ip_summed == CHECKSUM_PARTIAL) |
| 2935 | count++; | 2935 | count++; |
| 2936 | #endif | 2936 | #endif |
| 2937 | 2937 | ||
| @@ -3608,7 +3608,7 @@ e1000_rx_checksum(struct e1000_adapter *adapter, | |||
| 3608 | */ | 3608 | */ |
| 3609 | csum = ntohl(csum ^ 0xFFFF); | 3609 | csum = ntohl(csum ^ 0xFFFF); |
| 3610 | skb->csum = csum; | 3610 | skb->csum = csum; |
| 3611 | skb->ip_summed = CHECKSUM_HW; | 3611 | skb->ip_summed = CHECKSUM_COMPLETE; |
| 3612 | } | 3612 | } |
| 3613 | adapter->hw_csum_good++; | 3613 | adapter->hw_csum_good++; |
| 3614 | } | 3614 | } |
diff --git a/drivers/net/forcedeth.c b/drivers/net/forcedeth.c index 11b8f1b43dd5..32cacf115f75 100644 --- a/drivers/net/forcedeth.c +++ b/drivers/net/forcedeth.c | |||
| @@ -1503,7 +1503,8 @@ static int nv_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 1503 | tx_flags_extra = NV_TX2_TSO | (skb_shinfo(skb)->gso_size << NV_TX2_TSO_SHIFT); | 1503 | tx_flags_extra = NV_TX2_TSO | (skb_shinfo(skb)->gso_size << NV_TX2_TSO_SHIFT); |
| 1504 | else | 1504 | else |
| 1505 | #endif | 1505 | #endif |
| 1506 | tx_flags_extra = (skb->ip_summed == CHECKSUM_HW ? (NV_TX2_CHECKSUM_L3|NV_TX2_CHECKSUM_L4) : 0); | 1506 | tx_flags_extra = skb->ip_summed == CHECKSUM_PARTIAL ? |
| 1507 | NV_TX2_CHECKSUM_L3 | NV_TX2_CHECKSUM_L4 : 0; | ||
| 1507 | 1508 | ||
| 1508 | /* vlan tag */ | 1509 | /* vlan tag */ |
| 1509 | if (np->vlangrp && vlan_tx_tag_present(skb)) { | 1510 | if (np->vlangrp && vlan_tx_tag_present(skb)) { |
diff --git a/drivers/net/gianfar.c b/drivers/net/gianfar.c index ebbbd6ca6204..ba960913c034 100644 --- a/drivers/net/gianfar.c +++ b/drivers/net/gianfar.c | |||
| @@ -947,7 +947,7 @@ static int gfar_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 947 | 947 | ||
| 948 | /* Set up checksumming */ | 948 | /* Set up checksumming */ |
| 949 | if (likely((dev->features & NETIF_F_IP_CSUM) | 949 | if (likely((dev->features & NETIF_F_IP_CSUM) |
| 950 | && (CHECKSUM_HW == skb->ip_summed))) { | 950 | && (CHECKSUM_PARTIAL == skb->ip_summed))) { |
| 951 | fcb = gfar_add_fcb(skb, txbdp); | 951 | fcb = gfar_add_fcb(skb, txbdp); |
| 952 | status |= TXBD_TOE; | 952 | status |= TXBD_TOE; |
| 953 | gfar_tx_checksum(skb, fcb); | 953 | gfar_tx_checksum(skb, fcb); |
diff --git a/drivers/net/hamachi.c b/drivers/net/hamachi.c index 409c6aab0411..763373ae9666 100644 --- a/drivers/net/hamachi.c +++ b/drivers/net/hamachi.c | |||
| @@ -1648,7 +1648,7 @@ static int hamachi_rx(struct net_device *dev) | |||
| 1648 | * could do the pseudo myself and return | 1648 | * could do the pseudo myself and return |
| 1649 | * CHECKSUM_UNNECESSARY | 1649 | * CHECKSUM_UNNECESSARY |
| 1650 | */ | 1650 | */ |
| 1651 | skb->ip_summed = CHECKSUM_HW; | 1651 | skb->ip_summed = CHECKSUM_COMPLETE; |
| 1652 | } | 1652 | } |
| 1653 | } | 1653 | } |
| 1654 | } | 1654 | } |
diff --git a/drivers/net/ibm_emac/ibm_emac_core.c b/drivers/net/ibm_emac/ibm_emac_core.c index 82468e2dc799..57e214d85e9a 100644 --- a/drivers/net/ibm_emac/ibm_emac_core.c +++ b/drivers/net/ibm_emac/ibm_emac_core.c | |||
| @@ -1036,7 +1036,7 @@ static inline u16 emac_tx_csum(struct ocp_enet_private *dev, | |||
| 1036 | struct sk_buff *skb) | 1036 | struct sk_buff *skb) |
| 1037 | { | 1037 | { |
| 1038 | #if defined(CONFIG_IBM_EMAC_TAH) | 1038 | #if defined(CONFIG_IBM_EMAC_TAH) |
| 1039 | if (skb->ip_summed == CHECKSUM_HW) { | 1039 | if (skb->ip_summed == CHECKSUM_PARTIAL) { |
| 1040 | ++dev->stats.tx_packets_csum; | 1040 | ++dev->stats.tx_packets_csum; |
| 1041 | return EMAC_TX_CTRL_TAH_CSUM; | 1041 | return EMAC_TX_CTRL_TAH_CSUM; |
| 1042 | } | 1042 | } |
diff --git a/drivers/net/ioc3-eth.c b/drivers/net/ioc3-eth.c index 68d8af7df08e..65f897ddb920 100644 --- a/drivers/net/ioc3-eth.c +++ b/drivers/net/ioc3-eth.c | |||
| @@ -1387,7 +1387,7 @@ static int ioc3_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 1387 | * MAC header which should not be summed and the TCP/UDP pseudo headers | 1387 | * MAC header which should not be summed and the TCP/UDP pseudo headers |
| 1388 | * manually. | 1388 | * manually. |
| 1389 | */ | 1389 | */ |
| 1390 | if (skb->ip_summed == CHECKSUM_HW) { | 1390 | if (skb->ip_summed == CHECKSUM_PARTIAL) { |
| 1391 | int proto = ntohs(skb->nh.iph->protocol); | 1391 | int proto = ntohs(skb->nh.iph->protocol); |
| 1392 | unsigned int csoff; | 1392 | unsigned int csoff; |
| 1393 | struct iphdr *ih = skb->nh.iph; | 1393 | struct iphdr *ih = skb->nh.iph; |
diff --git a/drivers/net/ixgb/ixgb_main.c b/drivers/net/ixgb/ixgb_main.c index 7bbd447289b5..9405b44f3214 100644 --- a/drivers/net/ixgb/ixgb_main.c +++ b/drivers/net/ixgb/ixgb_main.c | |||
| @@ -1232,7 +1232,7 @@ ixgb_tx_csum(struct ixgb_adapter *adapter, struct sk_buff *skb) | |||
| 1232 | unsigned int i; | 1232 | unsigned int i; |
| 1233 | uint8_t css, cso; | 1233 | uint8_t css, cso; |
| 1234 | 1234 | ||
| 1235 | if(likely(skb->ip_summed == CHECKSUM_HW)) { | 1235 | if(likely(skb->ip_summed == CHECKSUM_PARTIAL)) { |
| 1236 | css = skb->h.raw - skb->data; | 1236 | css = skb->h.raw - skb->data; |
| 1237 | cso = (skb->h.raw + skb->csum) - skb->data; | 1237 | cso = (skb->h.raw + skb->csum) - skb->data; |
| 1238 | 1238 | ||
diff --git a/drivers/net/mv643xx_eth.c b/drivers/net/mv643xx_eth.c index eeab1df5bef3..38df58fdb358 100644 --- a/drivers/net/mv643xx_eth.c +++ b/drivers/net/mv643xx_eth.c | |||
| @@ -1147,7 +1147,7 @@ static void eth_tx_submit_descs_for_skb(struct mv643xx_private *mp, | |||
| 1147 | desc->byte_cnt = length; | 1147 | desc->byte_cnt = length; |
| 1148 | desc->buf_ptr = dma_map_single(NULL, skb->data, length, DMA_TO_DEVICE); | 1148 | desc->buf_ptr = dma_map_single(NULL, skb->data, length, DMA_TO_DEVICE); |
| 1149 | 1149 | ||
| 1150 | if (skb->ip_summed == CHECKSUM_HW) { | 1150 | if (skb->ip_summed == CHECKSUM_PARTIAL) { |
| 1151 | BUG_ON(skb->protocol != ETH_P_IP); | 1151 | BUG_ON(skb->protocol != ETH_P_IP); |
| 1152 | 1152 | ||
| 1153 | cmd_sts |= ETH_GEN_TCP_UDP_CHECKSUM | | 1153 | cmd_sts |= ETH_GEN_TCP_UDP_CHECKSUM | |
diff --git a/drivers/net/myri10ge/myri10ge.c b/drivers/net/myri10ge/myri10ge.c index 9bdd43ab3573..9f16681d0e7e 100644 --- a/drivers/net/myri10ge/myri10ge.c +++ b/drivers/net/myri10ge/myri10ge.c | |||
| @@ -930,7 +930,7 @@ static inline void myri10ge_vlan_ip_csum(struct sk_buff *skb, u16 hw_csum) | |||
| 930 | (vh->h_vlan_encapsulated_proto == htons(ETH_P_IP) || | 930 | (vh->h_vlan_encapsulated_proto == htons(ETH_P_IP) || |
| 931 | vh->h_vlan_encapsulated_proto == htons(ETH_P_IPV6))) { | 931 | vh->h_vlan_encapsulated_proto == htons(ETH_P_IPV6))) { |
| 932 | skb->csum = hw_csum; | 932 | skb->csum = hw_csum; |
| 933 | skb->ip_summed = CHECKSUM_HW; | 933 | skb->ip_summed = CHECKSUM_COMPLETE; |
| 934 | } | 934 | } |
| 935 | } | 935 | } |
| 936 | 936 | ||
| @@ -973,7 +973,7 @@ myri10ge_rx_done(struct myri10ge_priv *mgp, struct myri10ge_rx_buf *rx, | |||
| 973 | if ((skb->protocol == ntohs(ETH_P_IP)) || | 973 | if ((skb->protocol == ntohs(ETH_P_IP)) || |
| 974 | (skb->protocol == ntohs(ETH_P_IPV6))) { | 974 | (skb->protocol == ntohs(ETH_P_IPV6))) { |
| 975 | skb->csum = ntohs((u16) csum); | 975 | skb->csum = ntohs((u16) csum); |
| 976 | skb->ip_summed = CHECKSUM_HW; | 976 | skb->ip_summed = CHECKSUM_COMPLETE; |
| 977 | } else | 977 | } else |
| 978 | myri10ge_vlan_ip_csum(skb, ntohs((u16) csum)); | 978 | myri10ge_vlan_ip_csum(skb, ntohs((u16) csum)); |
| 979 | } | 979 | } |
| @@ -1897,13 +1897,13 @@ again: | |||
| 1897 | pseudo_hdr_offset = 0; | 1897 | pseudo_hdr_offset = 0; |
| 1898 | odd_flag = 0; | 1898 | odd_flag = 0; |
| 1899 | flags = (MXGEFW_FLAGS_NO_TSO | MXGEFW_FLAGS_FIRST); | 1899 | flags = (MXGEFW_FLAGS_NO_TSO | MXGEFW_FLAGS_FIRST); |
| 1900 | if (likely(skb->ip_summed == CHECKSUM_HW)) { | 1900 | if (likely(skb->ip_summed == CHECKSUM_PARTIAL)) { |
| 1901 | cksum_offset = (skb->h.raw - skb->data); | 1901 | cksum_offset = (skb->h.raw - skb->data); |
| 1902 | pseudo_hdr_offset = (skb->h.raw + skb->csum) - skb->data; | 1902 | pseudo_hdr_offset = (skb->h.raw + skb->csum) - skb->data; |
| 1903 | /* If the headers are excessively large, then we must | 1903 | /* If the headers are excessively large, then we must |
| 1904 | * fall back to a software checksum */ | 1904 | * fall back to a software checksum */ |
| 1905 | if (unlikely(cksum_offset > 255 || pseudo_hdr_offset > 127)) { | 1905 | if (unlikely(cksum_offset > 255 || pseudo_hdr_offset > 127)) { |
| 1906 | if (skb_checksum_help(skb, 0)) | 1906 | if (skb_checksum_help(skb)) |
| 1907 | goto drop; | 1907 | goto drop; |
| 1908 | cksum_offset = 0; | 1908 | cksum_offset = 0; |
| 1909 | pseudo_hdr_offset = 0; | 1909 | pseudo_hdr_offset = 0; |
diff --git a/drivers/net/ns83820.c b/drivers/net/ns83820.c index 0e76859c90a2..5143f5dbb2e5 100644 --- a/drivers/net/ns83820.c +++ b/drivers/net/ns83820.c | |||
| @@ -1153,7 +1153,7 @@ again: | |||
| 1153 | if (!nr_frags) | 1153 | if (!nr_frags) |
| 1154 | frag = NULL; | 1154 | frag = NULL; |
| 1155 | extsts = 0; | 1155 | extsts = 0; |
| 1156 | if (skb->ip_summed == CHECKSUM_HW) { | 1156 | if (skb->ip_summed == CHECKSUM_PARTIAL) { |
| 1157 | extsts |= EXTSTS_IPPKT; | 1157 | extsts |= EXTSTS_IPPKT; |
| 1158 | if (IPPROTO_TCP == skb->nh.iph->protocol) | 1158 | if (IPPROTO_TCP == skb->nh.iph->protocol) |
| 1159 | extsts |= EXTSTS_TCPPKT; | 1159 | extsts |= EXTSTS_TCPPKT; |
diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c index 4c2f575faad7..d9b960aa9b0d 100644 --- a/drivers/net/r8169.c +++ b/drivers/net/r8169.c | |||
| @@ -2169,7 +2169,7 @@ static inline u32 rtl8169_tso_csum(struct sk_buff *skb, struct net_device *dev) | |||
| 2169 | if (mss) | 2169 | if (mss) |
| 2170 | return LargeSend | ((mss & MSSMask) << MSSShift); | 2170 | return LargeSend | ((mss & MSSMask) << MSSShift); |
| 2171 | } | 2171 | } |
| 2172 | if (skb->ip_summed == CHECKSUM_HW) { | 2172 | if (skb->ip_summed == CHECKSUM_PARTIAL) { |
| 2173 | const struct iphdr *ip = skb->nh.iph; | 2173 | const struct iphdr *ip = skb->nh.iph; |
| 2174 | 2174 | ||
| 2175 | if (ip->protocol == IPPROTO_TCP) | 2175 | if (ip->protocol == IPPROTO_TCP) |
diff --git a/drivers/net/s2io.c b/drivers/net/s2io.c index e72e0e099060..5b3713f622d7 100644 --- a/drivers/net/s2io.c +++ b/drivers/net/s2io.c | |||
| @@ -3893,7 +3893,7 @@ static int s2io_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 3893 | txdp->Control_1 |= TXD_TCP_LSO_MSS(s2io_tcp_mss(skb)); | 3893 | txdp->Control_1 |= TXD_TCP_LSO_MSS(s2io_tcp_mss(skb)); |
| 3894 | } | 3894 | } |
| 3895 | #endif | 3895 | #endif |
| 3896 | if (skb->ip_summed == CHECKSUM_HW) { | 3896 | if (skb->ip_summed == CHECKSUM_PARTIAL) { |
| 3897 | txdp->Control_2 |= | 3897 | txdp->Control_2 |= |
| 3898 | (TXD_TX_CKO_IPV4_EN | TXD_TX_CKO_TCP_EN | | 3898 | (TXD_TX_CKO_IPV4_EN | TXD_TX_CKO_TCP_EN | |
| 3899 | TXD_TX_CKO_UDP_EN); | 3899 | TXD_TX_CKO_UDP_EN); |
diff --git a/drivers/net/sk98lin/skge.c b/drivers/net/sk98lin/skge.c index ee62845d3ac9..eb3b35180c2f 100644 --- a/drivers/net/sk98lin/skge.c +++ b/drivers/net/sk98lin/skge.c | |||
| @@ -1559,7 +1559,7 @@ struct sk_buff *pMessage) /* pointer to send-message */ | |||
| 1559 | pTxd->VDataHigh = (SK_U32) (PhysAddr >> 32); | 1559 | pTxd->VDataHigh = (SK_U32) (PhysAddr >> 32); |
| 1560 | pTxd->pMBuf = pMessage; | 1560 | pTxd->pMBuf = pMessage; |
| 1561 | 1561 | ||
| 1562 | if (pMessage->ip_summed == CHECKSUM_HW) { | 1562 | if (pMessage->ip_summed == CHECKSUM_PARTIAL) { |
| 1563 | u16 hdrlen = pMessage->h.raw - pMessage->data; | 1563 | u16 hdrlen = pMessage->h.raw - pMessage->data; |
| 1564 | u16 offset = hdrlen + pMessage->csum; | 1564 | u16 offset = hdrlen + pMessage->csum; |
| 1565 | 1565 | ||
| @@ -1678,7 +1678,7 @@ struct sk_buff *pMessage) /* pointer to send-message */ | |||
| 1678 | /* | 1678 | /* |
| 1679 | ** Does the HW need to evaluate checksum for TCP or UDP packets? | 1679 | ** Does the HW need to evaluate checksum for TCP or UDP packets? |
| 1680 | */ | 1680 | */ |
| 1681 | if (pMessage->ip_summed == CHECKSUM_HW) { | 1681 | if (pMessage->ip_summed == CHECKSUM_PARTIAL) { |
| 1682 | u16 hdrlen = pMessage->h.raw - pMessage->data; | 1682 | u16 hdrlen = pMessage->h.raw - pMessage->data; |
| 1683 | u16 offset = hdrlen + pMessage->csum; | 1683 | u16 offset = hdrlen + pMessage->csum; |
| 1684 | 1684 | ||
| @@ -2158,7 +2158,7 @@ rx_start: | |||
| 2158 | 2158 | ||
| 2159 | #ifdef USE_SK_RX_CHECKSUM | 2159 | #ifdef USE_SK_RX_CHECKSUM |
| 2160 | pMsg->csum = pRxd->TcpSums & 0xffff; | 2160 | pMsg->csum = pRxd->TcpSums & 0xffff; |
| 2161 | pMsg->ip_summed = CHECKSUM_HW; | 2161 | pMsg->ip_summed = CHECKSUM_COMPLETE; |
| 2162 | #else | 2162 | #else |
| 2163 | pMsg->ip_summed = CHECKSUM_NONE; | 2163 | pMsg->ip_summed = CHECKSUM_NONE; |
| 2164 | #endif | 2164 | #endif |
diff --git a/drivers/net/skge.c b/drivers/net/skge.c index ad878dfddef4..b3d6fa3d6df4 100644 --- a/drivers/net/skge.c +++ b/drivers/net/skge.c | |||
| @@ -2338,7 +2338,7 @@ static int skge_xmit_frame(struct sk_buff *skb, struct net_device *dev) | |||
| 2338 | td->dma_lo = map; | 2338 | td->dma_lo = map; |
| 2339 | td->dma_hi = map >> 32; | 2339 | td->dma_hi = map >> 32; |
| 2340 | 2340 | ||
| 2341 | if (skb->ip_summed == CHECKSUM_HW) { | 2341 | if (skb->ip_summed == CHECKSUM_PARTIAL) { |
| 2342 | int offset = skb->h.raw - skb->data; | 2342 | int offset = skb->h.raw - skb->data; |
| 2343 | 2343 | ||
| 2344 | /* This seems backwards, but it is what the sk98lin | 2344 | /* 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, | |||
| 2642 | skb->dev = skge->netdev; | 2642 | skb->dev = skge->netdev; |
| 2643 | if (skge->rx_csum) { | 2643 | if (skge->rx_csum) { |
| 2644 | skb->csum = csum; | 2644 | skb->csum = csum; |
| 2645 | skb->ip_summed = CHECKSUM_HW; | 2645 | skb->ip_summed = CHECKSUM_COMPLETE; |
| 2646 | } | 2646 | } |
| 2647 | 2647 | ||
| 2648 | skb->protocol = eth_type_trans(skb, skge->netdev); | 2648 | skb->protocol = eth_type_trans(skb, skge->netdev); |
diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c index 933e87f1cc68..8e92566b587e 100644 --- a/drivers/net/sky2.c +++ b/drivers/net/sky2.c | |||
| @@ -1163,7 +1163,7 @@ static unsigned tx_le_req(const struct sk_buff *skb) | |||
| 1163 | if (skb_is_gso(skb)) | 1163 | if (skb_is_gso(skb)) |
| 1164 | ++count; | 1164 | ++count; |
| 1165 | 1165 | ||
| 1166 | if (skb->ip_summed == CHECKSUM_HW) | 1166 | if (skb->ip_summed == CHECKSUM_PARTIAL) |
| 1167 | ++count; | 1167 | ++count; |
| 1168 | 1168 | ||
| 1169 | return count; | 1169 | return count; |
| @@ -1272,7 +1272,7 @@ static int sky2_xmit_frame(struct sk_buff *skb, struct net_device *dev) | |||
| 1272 | #endif | 1272 | #endif |
| 1273 | 1273 | ||
| 1274 | /* Handle TCP checksum offload */ | 1274 | /* Handle TCP checksum offload */ |
| 1275 | if (skb->ip_summed == CHECKSUM_HW) { | 1275 | if (skb->ip_summed == CHECKSUM_PARTIAL) { |
| 1276 | u16 hdr = skb->h.raw - skb->data; | 1276 | u16 hdr = skb->h.raw - skb->data; |
| 1277 | u16 offset = hdr + skb->csum; | 1277 | u16 offset = hdr + skb->csum; |
| 1278 | 1278 | ||
| @@ -2000,7 +2000,7 @@ static int sky2_status_intr(struct sky2_hw *hw, int to_do) | |||
| 2000 | #endif | 2000 | #endif |
| 2001 | case OP_RXCHKS: | 2001 | case OP_RXCHKS: |
| 2002 | skb = sky2->rx_ring[sky2->rx_next].skb; | 2002 | skb = sky2->rx_ring[sky2->rx_next].skb; |
| 2003 | skb->ip_summed = CHECKSUM_HW; | 2003 | skb->ip_summed = CHECKSUM_COMPLETE; |
| 2004 | skb->csum = le16_to_cpu(status); | 2004 | skb->csum = le16_to_cpu(status); |
| 2005 | break; | 2005 | break; |
| 2006 | 2006 | ||
diff --git a/drivers/net/starfire.c b/drivers/net/starfire.c index c0a62b00ffc8..2607aa51d8e0 100644 --- a/drivers/net/starfire.c +++ b/drivers/net/starfire.c | |||
| @@ -1230,7 +1230,7 @@ static int start_tx(struct sk_buff *skb, struct net_device *dev) | |||
| 1230 | } | 1230 | } |
| 1231 | 1231 | ||
| 1232 | #if defined(ZEROCOPY) && defined(HAS_BROKEN_FIRMWARE) | 1232 | #if defined(ZEROCOPY) && defined(HAS_BROKEN_FIRMWARE) |
| 1233 | if (skb->ip_summed == CHECKSUM_HW) { | 1233 | if (skb->ip_summed == CHECKSUM_PARTIAL) { |
| 1234 | if (skb_padto(skb, (skb->len + PADDING_MASK) & ~PADDING_MASK)) | 1234 | if (skb_padto(skb, (skb->len + PADDING_MASK) & ~PADDING_MASK)) |
| 1235 | return NETDEV_TX_OK; | 1235 | return NETDEV_TX_OK; |
| 1236 | } | 1236 | } |
| @@ -1252,7 +1252,7 @@ static int start_tx(struct sk_buff *skb, struct net_device *dev) | |||
| 1252 | status |= TxDescIntr; | 1252 | status |= TxDescIntr; |
| 1253 | np->reap_tx = 0; | 1253 | np->reap_tx = 0; |
| 1254 | } | 1254 | } |
| 1255 | if (skb->ip_summed == CHECKSUM_HW) { | 1255 | if (skb->ip_summed == CHECKSUM_PARTIAL) { |
| 1256 | status |= TxCalTCP; | 1256 | status |= TxCalTCP; |
| 1257 | np->stats.tx_compressed++; | 1257 | np->stats.tx_compressed++; |
| 1258 | } | 1258 | } |
| @@ -1499,7 +1499,7 @@ static int __netdev_rx(struct net_device *dev, int *quota) | |||
| 1499 | * Until then, the printk stays. :-) -Ion | 1499 | * Until then, the printk stays. :-) -Ion |
| 1500 | */ | 1500 | */ |
| 1501 | else if (le16_to_cpu(desc->status2) & 0x0040) { | 1501 | else if (le16_to_cpu(desc->status2) & 0x0040) { |
| 1502 | skb->ip_summed = CHECKSUM_HW; | 1502 | skb->ip_summed = CHECKSUM_COMPLETE; |
| 1503 | skb->csum = le16_to_cpu(desc->csum); | 1503 | skb->csum = le16_to_cpu(desc->csum); |
| 1504 | printk(KERN_DEBUG "%s: checksum_hw, status2 = %#x\n", dev->name, le16_to_cpu(desc->status2)); | 1504 | printk(KERN_DEBUG "%s: checksum_hw, status2 = %#x\n", dev->name, le16_to_cpu(desc->status2)); |
| 1505 | } | 1505 | } |
diff --git a/drivers/net/sungem.c b/drivers/net/sungem.c index d7b1d1882cab..b388651b7836 100644 --- a/drivers/net/sungem.c +++ b/drivers/net/sungem.c | |||
| @@ -855,7 +855,7 @@ static int gem_rx(struct gem *gp, int work_to_do) | |||
| 855 | } | 855 | } |
| 856 | 856 | ||
| 857 | skb->csum = ntohs((status & RXDCTRL_TCPCSUM) ^ 0xffff); | 857 | skb->csum = ntohs((status & RXDCTRL_TCPCSUM) ^ 0xffff); |
| 858 | skb->ip_summed = CHECKSUM_HW; | 858 | skb->ip_summed = CHECKSUM_COMPLETE; |
| 859 | skb->protocol = eth_type_trans(skb, gp->dev); | 859 | skb->protocol = eth_type_trans(skb, gp->dev); |
| 860 | 860 | ||
| 861 | netif_receive_skb(skb); | 861 | netif_receive_skb(skb); |
| @@ -1026,7 +1026,7 @@ static int gem_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 1026 | unsigned long flags; | 1026 | unsigned long flags; |
| 1027 | 1027 | ||
| 1028 | ctrl = 0; | 1028 | ctrl = 0; |
| 1029 | if (skb->ip_summed == CHECKSUM_HW) { | 1029 | if (skb->ip_summed == CHECKSUM_PARTIAL) { |
| 1030 | u64 csum_start_off, csum_stuff_off; | 1030 | u64 csum_start_off, csum_stuff_off; |
| 1031 | 1031 | ||
| 1032 | csum_start_off = (u64) (skb->h.raw - skb->data); | 1032 | csum_start_off = (u64) (skb->h.raw - skb->data); |
diff --git a/drivers/net/sunhme.c b/drivers/net/sunhme.c index c6f5bc3c042f..17981da22730 100644 --- a/drivers/net/sunhme.c +++ b/drivers/net/sunhme.c | |||
| @@ -1207,7 +1207,7 @@ static void happy_meal_transceiver_check(struct happy_meal *hp, void __iomem *tr | |||
| 1207 | * flags, thus: | 1207 | * flags, thus: |
| 1208 | * | 1208 | * |
| 1209 | * skb->csum = rxd->rx_flags & 0xffff; | 1209 | * skb->csum = rxd->rx_flags & 0xffff; |
| 1210 | * skb->ip_summed = CHECKSUM_HW; | 1210 | * skb->ip_summed = CHECKSUM_COMPLETE; |
| 1211 | * | 1211 | * |
| 1212 | * before sending off the skb to the protocols, and we are good as gold. | 1212 | * before sending off the skb to the protocols, and we are good as gold. |
| 1213 | */ | 1213 | */ |
| @@ -2074,7 +2074,7 @@ static void happy_meal_rx(struct happy_meal *hp, struct net_device *dev) | |||
| 2074 | 2074 | ||
| 2075 | /* This card is _fucking_ hot... */ | 2075 | /* This card is _fucking_ hot... */ |
| 2076 | skb->csum = ntohs(csum ^ 0xffff); | 2076 | skb->csum = ntohs(csum ^ 0xffff); |
| 2077 | skb->ip_summed = CHECKSUM_HW; | 2077 | skb->ip_summed = CHECKSUM_COMPLETE; |
| 2078 | 2078 | ||
| 2079 | RXD(("len=%d csum=%4x]", len, csum)); | 2079 | RXD(("len=%d csum=%4x]", len, csum)); |
| 2080 | skb->protocol = eth_type_trans(skb, dev); | 2080 | 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) | |||
| 2268 | u32 tx_flags; | 2268 | u32 tx_flags; |
| 2269 | 2269 | ||
| 2270 | tx_flags = TXFLAG_OWN; | 2270 | tx_flags = TXFLAG_OWN; |
| 2271 | if (skb->ip_summed == CHECKSUM_HW) { | 2271 | if (skb->ip_summed == CHECKSUM_PARTIAL) { |
| 2272 | u32 csum_start_off, csum_stuff_off; | 2272 | u32 csum_start_off, csum_stuff_off; |
| 2273 | 2273 | ||
| 2274 | csum_start_off = (u32) (skb->h.raw - skb->data); | 2274 | csum_start_off = (u32) (skb->h.raw - skb->data); |
diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c index eafabb253f08..6f5d3a38c582 100644 --- a/drivers/net/tg3.c +++ b/drivers/net/tg3.c | |||
| @@ -3851,11 +3851,11 @@ static int tg3_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 3851 | skb->h.th->check = 0; | 3851 | skb->h.th->check = 0; |
| 3852 | 3852 | ||
| 3853 | } | 3853 | } |
| 3854 | else if (skb->ip_summed == CHECKSUM_HW) | 3854 | else if (skb->ip_summed == CHECKSUM_PARTIAL) |
| 3855 | base_flags |= TXD_FLAG_TCPUDP_CSUM; | 3855 | base_flags |= TXD_FLAG_TCPUDP_CSUM; |
| 3856 | #else | 3856 | #else |
| 3857 | mss = 0; | 3857 | mss = 0; |
| 3858 | if (skb->ip_summed == CHECKSUM_HW) | 3858 | if (skb->ip_summed == CHECKSUM_PARTIAL) |
| 3859 | base_flags |= TXD_FLAG_TCPUDP_CSUM; | 3859 | base_flags |= TXD_FLAG_TCPUDP_CSUM; |
| 3860 | #endif | 3860 | #endif |
| 3861 | #if TG3_VLAN_TAG_USED | 3861 | #if TG3_VLAN_TAG_USED |
| @@ -3981,7 +3981,7 @@ static int tg3_start_xmit_dma_bug(struct sk_buff *skb, struct net_device *dev) | |||
| 3981 | 3981 | ||
| 3982 | entry = tp->tx_prod; | 3982 | entry = tp->tx_prod; |
| 3983 | base_flags = 0; | 3983 | base_flags = 0; |
| 3984 | if (skb->ip_summed == CHECKSUM_HW) | 3984 | if (skb->ip_summed == CHECKSUM_PARTIAL) |
| 3985 | base_flags |= TXD_FLAG_TCPUDP_CSUM; | 3985 | base_flags |= TXD_FLAG_TCPUDP_CSUM; |
| 3986 | #if TG3_TSO_SUPPORT != 0 | 3986 | #if TG3_TSO_SUPPORT != 0 |
| 3987 | mss = 0; | 3987 | mss = 0; |
diff --git a/drivers/net/typhoon.c b/drivers/net/typhoon.c index 4103c37172f9..c6e601dc6bbc 100644 --- a/drivers/net/typhoon.c +++ b/drivers/net/typhoon.c | |||
| @@ -830,7 +830,7 @@ typhoon_start_tx(struct sk_buff *skb, struct net_device *dev) | |||
| 830 | first_txd->addrHi = (u64)((unsigned long) skb) >> 32; | 830 | first_txd->addrHi = (u64)((unsigned long) skb) >> 32; |
| 831 | first_txd->processFlags = 0; | 831 | first_txd->processFlags = 0; |
| 832 | 832 | ||
| 833 | if(skb->ip_summed == CHECKSUM_HW) { | 833 | if(skb->ip_summed == CHECKSUM_PARTIAL) { |
| 834 | /* The 3XP will figure out if this is UDP/TCP */ | 834 | /* The 3XP will figure out if this is UDP/TCP */ |
| 835 | first_txd->processFlags |= TYPHOON_TX_PF_TCP_CHKSUM; | 835 | first_txd->processFlags |= TYPHOON_TX_PF_TCP_CHKSUM; |
| 836 | first_txd->processFlags |= TYPHOON_TX_PF_UDP_CHKSUM; | 836 | first_txd->processFlags |= TYPHOON_TX_PF_UDP_CHKSUM; |
diff --git a/drivers/net/via-rhine.c b/drivers/net/via-rhine.c index ae971080e2e4..66547159bfd9 100644 --- a/drivers/net/via-rhine.c +++ b/drivers/net/via-rhine.c | |||
| @@ -1230,7 +1230,7 @@ static int rhine_start_tx(struct sk_buff *skb, struct net_device *dev) | |||
| 1230 | rp->tx_skbuff[entry] = skb; | 1230 | rp->tx_skbuff[entry] = skb; |
| 1231 | 1231 | ||
| 1232 | if ((rp->quirks & rqRhineI) && | 1232 | if ((rp->quirks & rqRhineI) && |
| 1233 | (((unsigned long)skb->data & 3) || skb_shinfo(skb)->nr_frags != 0 || skb->ip_summed == CHECKSUM_HW)) { | 1233 | (((unsigned long)skb->data & 3) || skb_shinfo(skb)->nr_frags != 0 || skb->ip_summed == CHECKSUM_PARTIAL)) { |
| 1234 | /* Must use alignment buffer. */ | 1234 | /* Must use alignment buffer. */ |
| 1235 | if (skb->len > PKT_BUF_SZ) { | 1235 | if (skb->len > PKT_BUF_SZ) { |
| 1236 | /* packet too long, drop it */ | 1236 | /* packet too long, drop it */ |
diff --git a/drivers/net/via-velocity.c b/drivers/net/via-velocity.c index aa9cd92f46b2..f1e0c746a388 100644 --- a/drivers/net/via-velocity.c +++ b/drivers/net/via-velocity.c | |||
| @@ -2002,7 +2002,7 @@ static int velocity_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 2002 | * Handle hardware checksum | 2002 | * Handle hardware checksum |
| 2003 | */ | 2003 | */ |
| 2004 | if ((vptr->flags & VELOCITY_FLAGS_TX_CSUM) | 2004 | if ((vptr->flags & VELOCITY_FLAGS_TX_CSUM) |
| 2005 | && (skb->ip_summed == CHECKSUM_HW)) { | 2005 | && (skb->ip_summed == CHECKSUM_PARTIAL)) { |
| 2006 | struct iphdr *ip = skb->nh.iph; | 2006 | struct iphdr *ip = skb->nh.iph; |
| 2007 | if (ip->protocol == IPPROTO_TCP) | 2007 | if (ip->protocol == IPPROTO_TCP) |
| 2008 | td_ptr->tdesc1.TCR |= TCR0_TCPCK; | 2008 | td_ptr->tdesc1.TCR |= TCR0_TCPCK; |
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 50a4719512ed..4f2c2b6beb5e 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h | |||
| @@ -976,7 +976,7 @@ extern void dev_mcast_init(void); | |||
| 976 | extern int netdev_max_backlog; | 976 | extern int netdev_max_backlog; |
| 977 | extern int weight_p; | 977 | extern int weight_p; |
| 978 | extern int netdev_set_master(struct net_device *dev, struct net_device *master); | 978 | extern int netdev_set_master(struct net_device *dev, struct net_device *master); |
| 979 | extern int skb_checksum_help(struct sk_buff *skb, int inward); | 979 | extern int skb_checksum_help(struct sk_buff *skb); |
| 980 | extern struct sk_buff *skb_gso_segment(struct sk_buff *skb, int features); | 980 | extern struct sk_buff *skb_gso_segment(struct sk_buff *skb, int features); |
| 981 | #ifdef CONFIG_BUG | 981 | #ifdef CONFIG_BUG |
| 982 | extern void netdev_rx_csum_fault(struct net_device *dev); | 982 | 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) | |||
| 1012 | { | 1012 | { |
| 1013 | return skb_is_gso(skb) && | 1013 | return skb_is_gso(skb) && |
| 1014 | (!skb_gso_ok(skb, dev->features) || | 1014 | (!skb_gso_ok(skb, dev->features) || |
| 1015 | unlikely(skb->ip_summed != CHECKSUM_HW)); | 1015 | unlikely(skb->ip_summed != CHECKSUM_PARTIAL)); |
| 1016 | } | 1016 | } |
| 1017 | 1017 | ||
| 1018 | /* On bonding slaves other than the currently active slave, suppress | 1018 | /* On bonding slaves other than the currently active slave, suppress |
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index 755e9cddac47..85577a4ffa61 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h | |||
| @@ -34,8 +34,9 @@ | |||
| 34 | #define HAVE_ALIGNABLE_SKB /* Ditto 8) */ | 34 | #define HAVE_ALIGNABLE_SKB /* Ditto 8) */ |
| 35 | 35 | ||
| 36 | #define CHECKSUM_NONE 0 | 36 | #define CHECKSUM_NONE 0 |
| 37 | #define CHECKSUM_HW 1 | 37 | #define CHECKSUM_PARTIAL 1 |
| 38 | #define CHECKSUM_UNNECESSARY 2 | 38 | #define CHECKSUM_UNNECESSARY 2 |
| 39 | #define CHECKSUM_COMPLETE 3 | ||
| 39 | 40 | ||
| 40 | #define SKB_DATA_ALIGN(X) (((X) + (SMP_CACHE_BYTES - 1)) & \ | 41 | #define SKB_DATA_ALIGN(X) (((X) + (SMP_CACHE_BYTES - 1)) & \ |
| 41 | ~(SMP_CACHE_BYTES - 1)) | 42 | ~(SMP_CACHE_BYTES - 1)) |
| @@ -56,17 +57,17 @@ | |||
| 56 | * Apparently with secret goal to sell you new device, when you | 57 | * Apparently with secret goal to sell you new device, when you |
| 57 | * will add new protocol to your host. F.e. IPv6. 8) | 58 | * will add new protocol to your host. F.e. IPv6. 8) |
| 58 | * | 59 | * |
| 59 | * HW: the most generic way. Device supplied checksum of _all_ | 60 | * COMPLETE: the most generic way. Device supplied checksum of _all_ |
| 60 | * the packet as seen by netif_rx in skb->csum. | 61 | * the packet as seen by netif_rx in skb->csum. |
| 61 | * NOTE: Even if device supports only some protocols, but | 62 | * NOTE: Even if device supports only some protocols, but |
| 62 | * is able to produce some skb->csum, it MUST use HW, | 63 | * is able to produce some skb->csum, it MUST use COMPLETE, |
| 63 | * not UNNECESSARY. | 64 | * not UNNECESSARY. |
| 64 | * | 65 | * |
| 65 | * B. Checksumming on output. | 66 | * B. Checksumming on output. |
| 66 | * | 67 | * |
| 67 | * NONE: skb is checksummed by protocol or csum is not required. | 68 | * NONE: skb is checksummed by protocol or csum is not required. |
| 68 | * | 69 | * |
| 69 | * HW: device is required to csum packet as seen by hard_start_xmit | 70 | * PARTIAL: device is required to csum packet as seen by hard_start_xmit |
| 70 | * from skb->h.raw to the end and to record the checksum | 71 | * from skb->h.raw to the end and to record the checksum |
| 71 | * at skb->h.raw+skb->csum. | 72 | * at skb->h.raw+skb->csum. |
| 72 | * | 73 | * |
| @@ -1261,14 +1262,14 @@ static inline int skb_linearize_cow(struct sk_buff *skb) | |||
| 1261 | * @len: length of data pulled | 1262 | * @len: length of data pulled |
| 1262 | * | 1263 | * |
| 1263 | * After doing a pull on a received packet, you need to call this to | 1264 | * After doing a pull on a received packet, you need to call this to |
| 1264 | * update the CHECKSUM_HW checksum, or set ip_summed to CHECKSUM_NONE | 1265 | * update the CHECKSUM_COMPLETE checksum, or set ip_summed to |
| 1265 | * so that it can be recomputed from scratch. | 1266 | * CHECKSUM_NONE so that it can be recomputed from scratch. |
| 1266 | */ | 1267 | */ |
| 1267 | 1268 | ||
| 1268 | static inline void skb_postpull_rcsum(struct sk_buff *skb, | 1269 | static inline void skb_postpull_rcsum(struct sk_buff *skb, |
| 1269 | const void *start, unsigned int len) | 1270 | const void *start, unsigned int len) |
| 1270 | { | 1271 | { |
| 1271 | if (skb->ip_summed == CHECKSUM_HW) | 1272 | if (skb->ip_summed == CHECKSUM_COMPLETE) |
| 1272 | skb->csum = csum_sub(skb->csum, csum_partial(start, len, 0)); | 1273 | skb->csum = csum_sub(skb->csum, csum_partial(start, len, 0)); |
| 1273 | } | 1274 | } |
| 1274 | 1275 | ||
| @@ -1287,7 +1288,7 @@ static inline int pskb_trim_rcsum(struct sk_buff *skb, unsigned int len) | |||
| 1287 | { | 1288 | { |
| 1288 | if (likely(len >= skb->len)) | 1289 | if (likely(len >= skb->len)) |
| 1289 | return 0; | 1290 | return 0; |
| 1290 | if (skb->ip_summed == CHECKSUM_HW) | 1291 | if (skb->ip_summed == CHECKSUM_COMPLETE) |
| 1291 | skb->ip_summed = CHECKSUM_NONE; | 1292 | skb->ip_summed = CHECKSUM_NONE; |
| 1292 | return __pskb_trim(skb, len); | 1293 | return __pskb_trim(skb, len); |
| 1293 | } | 1294 | } |
diff --git a/net/core/datagram.c b/net/core/datagram.c index aecddcc30401..f558c61aecc7 100644 --- a/net/core/datagram.c +++ b/net/core/datagram.c | |||
| @@ -417,7 +417,7 @@ unsigned int __skb_checksum_complete(struct sk_buff *skb) | |||
| 417 | 417 | ||
| 418 | sum = (u16)csum_fold(skb_checksum(skb, 0, skb->len, skb->csum)); | 418 | sum = (u16)csum_fold(skb_checksum(skb, 0, skb->len, skb->csum)); |
| 419 | if (likely(!sum)) { | 419 | if (likely(!sum)) { |
| 420 | if (unlikely(skb->ip_summed == CHECKSUM_HW)) | 420 | if (unlikely(skb->ip_summed == CHECKSUM_COMPLETE)) |
| 421 | netdev_rx_csum_fault(skb->dev); | 421 | netdev_rx_csum_fault(skb->dev); |
| 422 | skb->ip_summed = CHECKSUM_UNNECESSARY; | 422 | skb->ip_summed = CHECKSUM_UNNECESSARY; |
| 423 | } | 423 | } |
| @@ -462,7 +462,7 @@ int skb_copy_and_csum_datagram_iovec(struct sk_buff *skb, | |||
| 462 | goto fault; | 462 | goto fault; |
| 463 | if ((unsigned short)csum_fold(csum)) | 463 | if ((unsigned short)csum_fold(csum)) |
| 464 | goto csum_error; | 464 | goto csum_error; |
| 465 | if (unlikely(skb->ip_summed == CHECKSUM_HW)) | 465 | if (unlikely(skb->ip_summed == CHECKSUM_COMPLETE)) |
| 466 | netdev_rx_csum_fault(skb->dev); | 466 | netdev_rx_csum_fault(skb->dev); |
| 467 | iov->iov_len -= chunk; | 467 | iov->iov_len -= chunk; |
| 468 | iov->iov_base += chunk; | 468 | iov->iov_base += chunk; |
diff --git a/net/core/dev.c b/net/core/dev.c index d4a1ec3bded5..fc82f6f6e1c1 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
| @@ -1166,12 +1166,12 @@ EXPORT_SYMBOL(netif_device_attach); | |||
| 1166 | * Invalidate hardware checksum when packet is to be mangled, and | 1166 | * Invalidate hardware checksum when packet is to be mangled, and |
| 1167 | * complete checksum manually on outgoing path. | 1167 | * complete checksum manually on outgoing path. |
| 1168 | */ | 1168 | */ |
| 1169 | int skb_checksum_help(struct sk_buff *skb, int inward) | 1169 | int skb_checksum_help(struct sk_buff *skb) |
| 1170 | { | 1170 | { |
| 1171 | unsigned int csum; | 1171 | unsigned int csum; |
| 1172 | int ret = 0, offset = skb->h.raw - skb->data; | 1172 | int ret = 0, offset = skb->h.raw - skb->data; |
| 1173 | 1173 | ||
| 1174 | if (inward) | 1174 | if (skb->ip_summed == CHECKSUM_COMPLETE) |
| 1175 | goto out_set_summed; | 1175 | goto out_set_summed; |
| 1176 | 1176 | ||
| 1177 | if (unlikely(skb_shinfo(skb)->gso_size)) { | 1177 | if (unlikely(skb_shinfo(skb)->gso_size)) { |
| @@ -1223,7 +1223,7 @@ struct sk_buff *skb_gso_segment(struct sk_buff *skb, int features) | |||
| 1223 | skb->mac_len = skb->nh.raw - skb->data; | 1223 | skb->mac_len = skb->nh.raw - skb->data; |
| 1224 | __skb_pull(skb, skb->mac_len); | 1224 | __skb_pull(skb, skb->mac_len); |
| 1225 | 1225 | ||
| 1226 | if (unlikely(skb->ip_summed != CHECKSUM_HW)) { | 1226 | if (unlikely(skb->ip_summed != CHECKSUM_PARTIAL)) { |
| 1227 | if (skb_header_cloned(skb) && | 1227 | if (skb_header_cloned(skb) && |
| 1228 | (err = pskb_expand_head(skb, 0, 0, GFP_ATOMIC))) | 1228 | (err = pskb_expand_head(skb, 0, 0, GFP_ATOMIC))) |
| 1229 | return ERR_PTR(err); | 1229 | return ERR_PTR(err); |
| @@ -1232,7 +1232,7 @@ struct sk_buff *skb_gso_segment(struct sk_buff *skb, int features) | |||
| 1232 | rcu_read_lock(); | 1232 | rcu_read_lock(); |
| 1233 | list_for_each_entry_rcu(ptype, &ptype_base[ntohs(type) & 15], list) { | 1233 | list_for_each_entry_rcu(ptype, &ptype_base[ntohs(type) & 15], list) { |
| 1234 | if (ptype->type == type && !ptype->dev && ptype->gso_segment) { | 1234 | if (ptype->type == type && !ptype->dev && ptype->gso_segment) { |
| 1235 | if (unlikely(skb->ip_summed != CHECKSUM_HW)) { | 1235 | if (unlikely(skb->ip_summed != CHECKSUM_PARTIAL)) { |
| 1236 | err = ptype->gso_send_check(skb); | 1236 | err = ptype->gso_send_check(skb); |
| 1237 | segs = ERR_PTR(err); | 1237 | segs = ERR_PTR(err); |
| 1238 | if (err || skb_gso_ok(skb, features)) | 1238 | if (err || skb_gso_ok(skb, features)) |
| @@ -1444,11 +1444,11 @@ int dev_queue_xmit(struct sk_buff *skb) | |||
| 1444 | /* If packet is not checksummed and device does not support | 1444 | /* If packet is not checksummed and device does not support |
| 1445 | * checksumming for this protocol, complete checksumming here. | 1445 | * checksumming for this protocol, complete checksumming here. |
| 1446 | */ | 1446 | */ |
| 1447 | if (skb->ip_summed == CHECKSUM_HW && | 1447 | if (skb->ip_summed == CHECKSUM_PARTIAL && |
| 1448 | (!(dev->features & NETIF_F_GEN_CSUM) && | 1448 | (!(dev->features & NETIF_F_GEN_CSUM) && |
| 1449 | (!(dev->features & NETIF_F_IP_CSUM) || | 1449 | (!(dev->features & NETIF_F_IP_CSUM) || |
| 1450 | skb->protocol != htons(ETH_P_IP)))) | 1450 | skb->protocol != htons(ETH_P_IP)))) |
| 1451 | if (skb_checksum_help(skb, 0)) | 1451 | if (skb_checksum_help(skb)) |
| 1452 | goto out_kfree_skb; | 1452 | goto out_kfree_skb; |
| 1453 | 1453 | ||
| 1454 | gso: | 1454 | gso: |
diff --git a/net/core/netpoll.c b/net/core/netpoll.c index 471da451cd48..ead5920c26d6 100644 --- a/net/core/netpoll.c +++ b/net/core/netpoll.c | |||
| @@ -110,7 +110,7 @@ static int checksum_udp(struct sk_buff *skb, struct udphdr *uh, | |||
| 110 | 110 | ||
| 111 | psum = csum_tcpudp_nofold(saddr, daddr, ulen, IPPROTO_UDP, 0); | 111 | psum = csum_tcpudp_nofold(saddr, daddr, ulen, IPPROTO_UDP, 0); |
| 112 | 112 | ||
| 113 | if (skb->ip_summed == CHECKSUM_HW && | 113 | if (skb->ip_summed == CHECKSUM_COMPLETE && |
| 114 | !(u16)csum_fold(csum_add(psum, skb->csum))) | 114 | !(u16)csum_fold(csum_add(psum, skb->csum))) |
| 115 | return 0; | 115 | return 0; |
| 116 | 116 | ||
diff --git a/net/core/skbuff.c b/net/core/skbuff.c index c54f3664bce5..8a476f1956e5 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c | |||
| @@ -1397,7 +1397,7 @@ void skb_copy_and_csum_dev(const struct sk_buff *skb, u8 *to) | |||
| 1397 | unsigned int csum; | 1397 | unsigned int csum; |
| 1398 | long csstart; | 1398 | long csstart; |
| 1399 | 1399 | ||
| 1400 | if (skb->ip_summed == CHECKSUM_HW) | 1400 | if (skb->ip_summed == CHECKSUM_PARTIAL) |
| 1401 | csstart = skb->h.raw - skb->data; | 1401 | csstart = skb->h.raw - skb->data; |
| 1402 | else | 1402 | else |
| 1403 | csstart = skb_headlen(skb); | 1403 | csstart = skb_headlen(skb); |
| @@ -1411,7 +1411,7 @@ void skb_copy_and_csum_dev(const struct sk_buff *skb, u8 *to) | |||
| 1411 | csum = skb_copy_and_csum_bits(skb, csstart, to + csstart, | 1411 | csum = skb_copy_and_csum_bits(skb, csstart, to + csstart, |
| 1412 | skb->len - csstart, 0); | 1412 | skb->len - csstart, 0); |
| 1413 | 1413 | ||
| 1414 | if (skb->ip_summed == CHECKSUM_HW) { | 1414 | if (skb->ip_summed == CHECKSUM_PARTIAL) { |
| 1415 | long csstuff = csstart + skb->csum; | 1415 | long csstuff = csstart + skb->csum; |
| 1416 | 1416 | ||
| 1417 | *((unsigned short *)(to + csstuff)) = csum_fold(csum); | 1417 | *((unsigned short *)(to + csstuff)) = csum_fold(csum); |
| @@ -1898,10 +1898,10 @@ int skb_append_datato_frags(struct sock *sk, struct sk_buff *skb, | |||
| 1898 | * @len: length of data pulled | 1898 | * @len: length of data pulled |
| 1899 | * | 1899 | * |
| 1900 | * This function performs an skb_pull on the packet and updates | 1900 | * This function performs an skb_pull on the packet and updates |
| 1901 | * update the CHECKSUM_HW checksum. It should be used on receive | 1901 | * update the CHECKSUM_COMPLETE checksum. It should be used on |
| 1902 | * path processing instead of skb_pull unless you know that the | 1902 | * receive path processing instead of skb_pull unless you know |
| 1903 | * checksum difference is zero (e.g., a valid IP header) or you | 1903 | * that the checksum difference is zero (e.g., a valid IP header) |
| 1904 | * are setting ip_summed to CHECKSUM_NONE. | 1904 | * or you are setting ip_summed to CHECKSUM_NONE. |
| 1905 | */ | 1905 | */ |
| 1906 | unsigned char *skb_pull_rcsum(struct sk_buff *skb, unsigned int len) | 1906 | unsigned char *skb_pull_rcsum(struct sk_buff *skb, unsigned int len) |
| 1907 | { | 1907 | { |
| @@ -1994,7 +1994,7 @@ struct sk_buff *skb_segment(struct sk_buff *skb, int features) | |||
| 1994 | frag = skb_shinfo(nskb)->frags; | 1994 | frag = skb_shinfo(nskb)->frags; |
| 1995 | k = 0; | 1995 | k = 0; |
| 1996 | 1996 | ||
| 1997 | nskb->ip_summed = CHECKSUM_HW; | 1997 | nskb->ip_summed = CHECKSUM_PARTIAL; |
| 1998 | nskb->csum = skb->csum; | 1998 | nskb->csum = skb->csum; |
| 1999 | memcpy(skb_put(nskb, hsize), skb->data + offset, hsize); | 1999 | memcpy(skb_put(nskb, hsize), skb->data + offset, hsize); |
| 2000 | 2000 | ||
diff --git a/net/ipv4/icmp.c b/net/ipv4/icmp.c index 6ad797c14163..6d223e5c6741 100644 --- a/net/ipv4/icmp.c +++ b/net/ipv4/icmp.c | |||
| @@ -930,7 +930,7 @@ int icmp_rcv(struct sk_buff *skb) | |||
| 930 | ICMP_INC_STATS_BH(ICMP_MIB_INMSGS); | 930 | ICMP_INC_STATS_BH(ICMP_MIB_INMSGS); |
| 931 | 931 | ||
| 932 | switch (skb->ip_summed) { | 932 | switch (skb->ip_summed) { |
| 933 | case CHECKSUM_HW: | 933 | case CHECKSUM_COMPLETE: |
| 934 | if (!(u16)csum_fold(skb->csum)) | 934 | if (!(u16)csum_fold(skb->csum)) |
| 935 | break; | 935 | break; |
| 936 | /* fall through */ | 936 | /* fall through */ |
diff --git a/net/ipv4/igmp.c b/net/ipv4/igmp.c index 8e8117c19e4d..7003e763d970 100644 --- a/net/ipv4/igmp.c +++ b/net/ipv4/igmp.c | |||
| @@ -931,7 +931,7 @@ int igmp_rcv(struct sk_buff *skb) | |||
| 931 | goto drop; | 931 | goto drop; |
| 932 | 932 | ||
| 933 | switch (skb->ip_summed) { | 933 | switch (skb->ip_summed) { |
| 934 | case CHECKSUM_HW: | 934 | case CHECKSUM_COMPLETE: |
| 935 | if (!(u16)csum_fold(skb->csum)) | 935 | if (!(u16)csum_fold(skb->csum)) |
| 936 | break; | 936 | break; |
| 937 | /* fall through */ | 937 | /* fall through */ |
diff --git a/net/ipv4/ip_fragment.c b/net/ipv4/ip_fragment.c index b84b53a47526..8d7f107c2eef 100644 --- a/net/ipv4/ip_fragment.c +++ b/net/ipv4/ip_fragment.c | |||
| @@ -665,7 +665,7 @@ static struct sk_buff *ip_frag_reasm(struct ipq *qp, struct net_device *dev) | |||
| 665 | head->len += fp->len; | 665 | head->len += fp->len; |
| 666 | if (head->ip_summed != fp->ip_summed) | 666 | if (head->ip_summed != fp->ip_summed) |
| 667 | head->ip_summed = CHECKSUM_NONE; | 667 | head->ip_summed = CHECKSUM_NONE; |
| 668 | else if (head->ip_summed == CHECKSUM_HW) | 668 | else if (head->ip_summed == CHECKSUM_COMPLETE) |
| 669 | head->csum = csum_add(head->csum, fp->csum); | 669 | head->csum = csum_add(head->csum, fp->csum); |
| 670 | head->truesize += fp->truesize; | 670 | head->truesize += fp->truesize; |
| 671 | atomic_sub(fp->truesize, &ip_frag_mem); | 671 | atomic_sub(fp->truesize, &ip_frag_mem); |
diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c index 0f9b3a31997b..e66f6ff2e198 100644 --- a/net/ipv4/ip_gre.c +++ b/net/ipv4/ip_gre.c | |||
| @@ -576,7 +576,7 @@ static int ipgre_rcv(struct sk_buff *skb) | |||
| 576 | 576 | ||
| 577 | if (flags&GRE_CSUM) { | 577 | if (flags&GRE_CSUM) { |
| 578 | switch (skb->ip_summed) { | 578 | switch (skb->ip_summed) { |
| 579 | case CHECKSUM_HW: | 579 | case CHECKSUM_COMPLETE: |
| 580 | csum = (u16)csum_fold(skb->csum); | 580 | csum = (u16)csum_fold(skb->csum); |
| 581 | if (!csum) | 581 | if (!csum) |
| 582 | break; | 582 | break; |
| @@ -584,7 +584,7 @@ static int ipgre_rcv(struct sk_buff *skb) | |||
| 584 | case CHECKSUM_NONE: | 584 | case CHECKSUM_NONE: |
| 585 | skb->csum = 0; | 585 | skb->csum = 0; |
| 586 | csum = __skb_checksum_complete(skb); | 586 | csum = __skb_checksum_complete(skb); |
| 587 | skb->ip_summed = CHECKSUM_HW; | 587 | skb->ip_summed = CHECKSUM_COMPLETE; |
| 588 | } | 588 | } |
| 589 | offset += 4; | 589 | offset += 4; |
| 590 | } | 590 | } |
diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c index 308bdeac3455..1b9b6742ef77 100644 --- a/net/ipv4/ip_output.c +++ b/net/ipv4/ip_output.c | |||
| @@ -680,7 +680,7 @@ ip_generic_getfrag(void *from, char *to, int offset, int len, int odd, struct sk | |||
| 680 | { | 680 | { |
| 681 | struct iovec *iov = from; | 681 | struct iovec *iov = from; |
| 682 | 682 | ||
| 683 | if (skb->ip_summed == CHECKSUM_HW) { | 683 | if (skb->ip_summed == CHECKSUM_PARTIAL) { |
| 684 | if (memcpy_fromiovecend(to, iov, offset, len) < 0) | 684 | if (memcpy_fromiovecend(to, iov, offset, len) < 0) |
| 685 | return -EFAULT; | 685 | return -EFAULT; |
| 686 | } else { | 686 | } else { |
| @@ -736,7 +736,7 @@ static inline int ip_ufo_append_data(struct sock *sk, | |||
| 736 | /* initialize protocol header pointer */ | 736 | /* initialize protocol header pointer */ |
| 737 | skb->h.raw = skb->data + fragheaderlen; | 737 | skb->h.raw = skb->data + fragheaderlen; |
| 738 | 738 | ||
| 739 | skb->ip_summed = CHECKSUM_HW; | 739 | skb->ip_summed = CHECKSUM_PARTIAL; |
| 740 | skb->csum = 0; | 740 | skb->csum = 0; |
| 741 | sk->sk_sndmsg_off = 0; | 741 | sk->sk_sndmsg_off = 0; |
| 742 | } | 742 | } |
| @@ -844,7 +844,7 @@ int ip_append_data(struct sock *sk, | |||
| 844 | length + fragheaderlen <= mtu && | 844 | length + fragheaderlen <= mtu && |
| 845 | rt->u.dst.dev->features & NETIF_F_ALL_CSUM && | 845 | rt->u.dst.dev->features & NETIF_F_ALL_CSUM && |
| 846 | !exthdrlen) | 846 | !exthdrlen) |
| 847 | csummode = CHECKSUM_HW; | 847 | csummode = CHECKSUM_PARTIAL; |
| 848 | 848 | ||
| 849 | inet->cork.length += length; | 849 | inet->cork.length += length; |
| 850 | if (((length > mtu) && (sk->sk_protocol == IPPROTO_UDP)) && | 850 | if (((length > mtu) && (sk->sk_protocol == IPPROTO_UDP)) && |
diff --git a/net/ipv4/ipvs/ip_vs_proto_tcp.c b/net/ipv4/ipvs/ip_vs_proto_tcp.c index bc28b1160a3a..820e8318d10d 100644 --- a/net/ipv4/ipvs/ip_vs_proto_tcp.c +++ b/net/ipv4/ipvs/ip_vs_proto_tcp.c | |||
| @@ -151,7 +151,7 @@ tcp_snat_handler(struct sk_buff **pskb, | |||
| 151 | /* Only port and addr are changed, do fast csum update */ | 151 | /* Only port and addr are changed, do fast csum update */ |
| 152 | tcp_fast_csum_update(tcph, cp->daddr, cp->vaddr, | 152 | tcp_fast_csum_update(tcph, cp->daddr, cp->vaddr, |
| 153 | cp->dport, cp->vport); | 153 | cp->dport, cp->vport); |
| 154 | if ((*pskb)->ip_summed == CHECKSUM_HW) | 154 | if ((*pskb)->ip_summed == CHECKSUM_COMPLETE) |
| 155 | (*pskb)->ip_summed = CHECKSUM_NONE; | 155 | (*pskb)->ip_summed = CHECKSUM_NONE; |
| 156 | } else { | 156 | } else { |
| 157 | /* full checksum calculation */ | 157 | /* full checksum calculation */ |
| @@ -204,7 +204,7 @@ tcp_dnat_handler(struct sk_buff **pskb, | |||
| 204 | /* Only port and addr are changed, do fast csum update */ | 204 | /* Only port and addr are changed, do fast csum update */ |
| 205 | tcp_fast_csum_update(tcph, cp->vaddr, cp->daddr, | 205 | tcp_fast_csum_update(tcph, cp->vaddr, cp->daddr, |
| 206 | cp->vport, cp->dport); | 206 | cp->vport, cp->dport); |
| 207 | if ((*pskb)->ip_summed == CHECKSUM_HW) | 207 | if ((*pskb)->ip_summed == CHECKSUM_COMPLETE) |
| 208 | (*pskb)->ip_summed = CHECKSUM_NONE; | 208 | (*pskb)->ip_summed = CHECKSUM_NONE; |
| 209 | } else { | 209 | } else { |
| 210 | /* full checksum calculation */ | 210 | /* full checksum calculation */ |
| @@ -229,7 +229,7 @@ tcp_csum_check(struct sk_buff *skb, struct ip_vs_protocol *pp) | |||
| 229 | switch (skb->ip_summed) { | 229 | switch (skb->ip_summed) { |
| 230 | case CHECKSUM_NONE: | 230 | case CHECKSUM_NONE: |
| 231 | skb->csum = skb_checksum(skb, tcphoff, skb->len - tcphoff, 0); | 231 | skb->csum = skb_checksum(skb, tcphoff, skb->len - tcphoff, 0); |
| 232 | case CHECKSUM_HW: | 232 | case CHECKSUM_COMPLETE: |
| 233 | if (csum_tcpudp_magic(skb->nh.iph->saddr, skb->nh.iph->daddr, | 233 | if (csum_tcpudp_magic(skb->nh.iph->saddr, skb->nh.iph->daddr, |
| 234 | skb->len - tcphoff, | 234 | skb->len - tcphoff, |
| 235 | skb->nh.iph->protocol, skb->csum)) { | 235 | skb->nh.iph->protocol, skb->csum)) { |
| @@ -239,7 +239,7 @@ tcp_csum_check(struct sk_buff *skb, struct ip_vs_protocol *pp) | |||
| 239 | } | 239 | } |
| 240 | break; | 240 | break; |
| 241 | default: | 241 | default: |
| 242 | /* CHECKSUM_UNNECESSARY */ | 242 | /* No need to checksum. */ |
| 243 | break; | 243 | break; |
| 244 | } | 244 | } |
| 245 | 245 | ||
diff --git a/net/ipv4/ipvs/ip_vs_proto_udp.c b/net/ipv4/ipvs/ip_vs_proto_udp.c index 89d9175d8f28..90c8166c0ec1 100644 --- a/net/ipv4/ipvs/ip_vs_proto_udp.c +++ b/net/ipv4/ipvs/ip_vs_proto_udp.c | |||
| @@ -161,7 +161,7 @@ udp_snat_handler(struct sk_buff **pskb, | |||
| 161 | /* Only port and addr are changed, do fast csum update */ | 161 | /* Only port and addr are changed, do fast csum update */ |
| 162 | udp_fast_csum_update(udph, cp->daddr, cp->vaddr, | 162 | udp_fast_csum_update(udph, cp->daddr, cp->vaddr, |
| 163 | cp->dport, cp->vport); | 163 | cp->dport, cp->vport); |
| 164 | if ((*pskb)->ip_summed == CHECKSUM_HW) | 164 | if ((*pskb)->ip_summed == CHECKSUM_COMPLETE) |
| 165 | (*pskb)->ip_summed = CHECKSUM_NONE; | 165 | (*pskb)->ip_summed = CHECKSUM_NONE; |
| 166 | } else { | 166 | } else { |
| 167 | /* full checksum calculation */ | 167 | /* full checksum calculation */ |
| @@ -216,7 +216,7 @@ udp_dnat_handler(struct sk_buff **pskb, | |||
| 216 | /* Only port and addr are changed, do fast csum update */ | 216 | /* Only port and addr are changed, do fast csum update */ |
| 217 | udp_fast_csum_update(udph, cp->vaddr, cp->daddr, | 217 | udp_fast_csum_update(udph, cp->vaddr, cp->daddr, |
| 218 | cp->vport, cp->dport); | 218 | cp->vport, cp->dport); |
| 219 | if ((*pskb)->ip_summed == CHECKSUM_HW) | 219 | if ((*pskb)->ip_summed == CHECKSUM_COMPLETE) |
| 220 | (*pskb)->ip_summed = CHECKSUM_NONE; | 220 | (*pskb)->ip_summed = CHECKSUM_NONE; |
| 221 | } else { | 221 | } else { |
| 222 | /* full checksum calculation */ | 222 | /* full checksum calculation */ |
| @@ -250,7 +250,7 @@ udp_csum_check(struct sk_buff *skb, struct ip_vs_protocol *pp) | |||
| 250 | case CHECKSUM_NONE: | 250 | case CHECKSUM_NONE: |
| 251 | skb->csum = skb_checksum(skb, udphoff, | 251 | skb->csum = skb_checksum(skb, udphoff, |
| 252 | skb->len - udphoff, 0); | 252 | skb->len - udphoff, 0); |
| 253 | case CHECKSUM_HW: | 253 | case CHECKSUM_COMPLETE: |
| 254 | if (csum_tcpudp_magic(skb->nh.iph->saddr, | 254 | if (csum_tcpudp_magic(skb->nh.iph->saddr, |
| 255 | skb->nh.iph->daddr, | 255 | skb->nh.iph->daddr, |
| 256 | skb->len - udphoff, | 256 | skb->len - udphoff, |
| @@ -262,7 +262,7 @@ udp_csum_check(struct sk_buff *skb, struct ip_vs_protocol *pp) | |||
| 262 | } | 262 | } |
| 263 | break; | 263 | break; |
| 264 | default: | 264 | default: |
| 265 | /* CHECKSUM_UNNECESSARY */ | 265 | /* No need to checksum. */ |
| 266 | break; | 266 | break; |
| 267 | } | 267 | } |
| 268 | } | 268 | } |
diff --git a/net/ipv4/netfilter.c b/net/ipv4/netfilter.c index 6a9e34b794bc..f88347de21a9 100644 --- a/net/ipv4/netfilter.c +++ b/net/ipv4/netfilter.c | |||
| @@ -168,7 +168,7 @@ unsigned int nf_ip_checksum(struct sk_buff *skb, unsigned int hook, | |||
| 168 | unsigned int csum = 0; | 168 | unsigned int csum = 0; |
| 169 | 169 | ||
| 170 | switch (skb->ip_summed) { | 170 | switch (skb->ip_summed) { |
| 171 | case CHECKSUM_HW: | 171 | case CHECKSUM_COMPLETE: |
| 172 | if (hook != NF_IP_PRE_ROUTING && hook != NF_IP_LOCAL_IN) | 172 | if (hook != NF_IP_PRE_ROUTING && hook != NF_IP_LOCAL_IN) |
| 173 | break; | 173 | break; |
| 174 | if ((protocol == 0 && !(u16)csum_fold(skb->csum)) || | 174 | if ((protocol == 0 && !(u16)csum_fold(skb->csum)) || |
diff --git a/net/ipv4/netfilter/ip_conntrack_proto_tcp.c b/net/ipv4/netfilter/ip_conntrack_proto_tcp.c index fb920e76ec10..9de81ff645d5 100644 --- a/net/ipv4/netfilter/ip_conntrack_proto_tcp.c +++ b/net/ipv4/netfilter/ip_conntrack_proto_tcp.c | |||
| @@ -865,8 +865,7 @@ static int tcp_error(struct sk_buff *skb, | |||
| 865 | 865 | ||
| 866 | /* Checksum invalid? Ignore. | 866 | /* Checksum invalid? Ignore. |
| 867 | * We skip checking packets on the outgoing path | 867 | * We skip checking packets on the outgoing path |
| 868 | * because the semantic of CHECKSUM_HW is different there | 868 | * because it is assumed to be correct. |
| 869 | * and moreover root might send raw packets. | ||
| 870 | */ | 869 | */ |
| 871 | /* FIXME: Source route IP option packets --RR */ | 870 | /* FIXME: Source route IP option packets --RR */ |
| 872 | if (ip_conntrack_checksum && hooknum == NF_IP_PRE_ROUTING && | 871 | if (ip_conntrack_checksum && hooknum == NF_IP_PRE_ROUTING && |
diff --git a/net/ipv4/netfilter/ip_conntrack_proto_udp.c b/net/ipv4/netfilter/ip_conntrack_proto_udp.c index 9b2c16b4d2ff..e58e52f14553 100644 --- a/net/ipv4/netfilter/ip_conntrack_proto_udp.c +++ b/net/ipv4/netfilter/ip_conntrack_proto_udp.c | |||
| @@ -117,8 +117,7 @@ static int udp_error(struct sk_buff *skb, enum ip_conntrack_info *ctinfo, | |||
| 117 | 117 | ||
| 118 | /* Checksum invalid? Ignore. | 118 | /* Checksum invalid? Ignore. |
| 119 | * We skip checking packets on the outgoing path | 119 | * We skip checking packets on the outgoing path |
| 120 | * because the semantic of CHECKSUM_HW is different there | 120 | * because the checksum is assumed to be correct. |
| 121 | * and moreover root might send raw packets. | ||
| 122 | * FIXME: Source route IP option packets --RR */ | 121 | * FIXME: Source route IP option packets --RR */ |
| 123 | if (ip_conntrack_checksum && hooknum == NF_IP_PRE_ROUTING && | 122 | if (ip_conntrack_checksum && hooknum == NF_IP_PRE_ROUTING && |
| 124 | nf_ip_checksum(skb, hooknum, iph->ihl * 4, IPPROTO_UDP)) { | 123 | nf_ip_checksum(skb, hooknum, iph->ihl * 4, IPPROTO_UDP)) { |
diff --git a/net/ipv4/netfilter/ip_nat_standalone.c b/net/ipv4/netfilter/ip_nat_standalone.c index 17de077a7901..f4f00c816d87 100644 --- a/net/ipv4/netfilter/ip_nat_standalone.c +++ b/net/ipv4/netfilter/ip_nat_standalone.c | |||
| @@ -111,8 +111,9 @@ ip_nat_fn(unsigned int hooknum, | |||
| 111 | & htons(IP_MF|IP_OFFSET))); | 111 | & htons(IP_MF|IP_OFFSET))); |
| 112 | 112 | ||
| 113 | /* If we had a hardware checksum before, it's now invalid */ | 113 | /* If we had a hardware checksum before, it's now invalid */ |
| 114 | if ((*pskb)->ip_summed == CHECKSUM_HW) | 114 | if ((*pskb)->ip_summed == CHECKSUM_PARTIAL || |
| 115 | if (skb_checksum_help(*pskb, (out == NULL))) | 115 | (*pskb)->ip_summed == CHECKSUM_COMPLETE) |
| 116 | if (skb_checksum_help(*pskb)) | ||
| 116 | return NF_DROP; | 117 | return NF_DROP; |
| 117 | 118 | ||
| 118 | ct = ip_conntrack_get(*pskb, &ctinfo); | 119 | ct = ip_conntrack_get(*pskb, &ctinfo); |
diff --git a/net/ipv4/netfilter/ip_queue.c b/net/ipv4/netfilter/ip_queue.c index 198ac36db861..276a964ee6cf 100644 --- a/net/ipv4/netfilter/ip_queue.c +++ b/net/ipv4/netfilter/ip_queue.c | |||
| @@ -208,9 +208,9 @@ ipq_build_packet_message(struct ipq_queue_entry *entry, int *errp) | |||
| 208 | break; | 208 | break; |
| 209 | 209 | ||
| 210 | case IPQ_COPY_PACKET: | 210 | case IPQ_COPY_PACKET: |
| 211 | if (entry->skb->ip_summed == CHECKSUM_HW && | 211 | if ((entry->skb->ip_summed == CHECKSUM_PARTIAL || |
| 212 | (*errp = skb_checksum_help(entry->skb, | 212 | entry->skb->ip_summed == CHECKSUM_COMPLETE) && |
| 213 | entry->info->outdev == NULL))) { | 213 | (*errp = skb_checksum_help(entry->skb))) { |
| 214 | read_unlock_bh(&queue_lock); | 214 | read_unlock_bh(&queue_lock); |
| 215 | return NULL; | 215 | return NULL; |
| 216 | } | 216 | } |
diff --git a/net/ipv4/netfilter/ipt_ECN.c b/net/ipv4/netfilter/ipt_ECN.c index 4adf5c9d34f5..4ec43f98fe49 100644 --- a/net/ipv4/netfilter/ipt_ECN.c +++ b/net/ipv4/netfilter/ipt_ECN.c | |||
| @@ -49,7 +49,7 @@ set_ect_ip(struct sk_buff **pskb, const struct ipt_ECN_info *einfo) | |||
| 49 | 49 | ||
| 50 | /* Return 0 if there was an error. */ | 50 | /* Return 0 if there was an error. */ |
| 51 | static inline int | 51 | static inline int |
| 52 | set_ect_tcp(struct sk_buff **pskb, const struct ipt_ECN_info *einfo, int inward) | 52 | set_ect_tcp(struct sk_buff **pskb, const struct ipt_ECN_info *einfo) |
| 53 | { | 53 | { |
| 54 | struct tcphdr _tcph, *tcph; | 54 | struct tcphdr _tcph, *tcph; |
| 55 | u_int16_t diffs[2]; | 55 | u_int16_t diffs[2]; |
| @@ -70,8 +70,9 @@ set_ect_tcp(struct sk_buff **pskb, const struct ipt_ECN_info *einfo, int inward) | |||
| 70 | return 0; | 70 | return 0; |
| 71 | tcph = (void *)(*pskb)->nh.iph + (*pskb)->nh.iph->ihl*4; | 71 | tcph = (void *)(*pskb)->nh.iph + (*pskb)->nh.iph->ihl*4; |
| 72 | 72 | ||
| 73 | if ((*pskb)->ip_summed == CHECKSUM_HW && | 73 | if (((*pskb)->ip_summed == CHECKSUM_PARTIAL || |
| 74 | skb_checksum_help(*pskb, inward)) | 74 | (*pskb)->ip_summed == CHECKSUM_COMPLETE) && |
| 75 | skb_checksum_help(*pskb)) | ||
| 75 | return 0; | 76 | return 0; |
| 76 | 77 | ||
| 77 | diffs[0] = ((u_int16_t *)tcph)[6]; | 78 | diffs[0] = ((u_int16_t *)tcph)[6]; |
| @@ -106,7 +107,7 @@ target(struct sk_buff **pskb, | |||
| 106 | 107 | ||
| 107 | if (einfo->operation & (IPT_ECN_OP_SET_ECE | IPT_ECN_OP_SET_CWR) | 108 | if (einfo->operation & (IPT_ECN_OP_SET_ECE | IPT_ECN_OP_SET_CWR) |
| 108 | && (*pskb)->nh.iph->protocol == IPPROTO_TCP) | 109 | && (*pskb)->nh.iph->protocol == IPPROTO_TCP) |
| 109 | if (!set_ect_tcp(pskb, einfo, (out == NULL))) | 110 | if (!set_ect_tcp(pskb, einfo)) |
| 110 | return NF_DROP; | 111 | return NF_DROP; |
| 111 | 112 | ||
| 112 | return IPT_CONTINUE; | 113 | return IPT_CONTINUE; |
diff --git a/net/ipv4/netfilter/ipt_TCPMSS.c b/net/ipv4/netfilter/ipt_TCPMSS.c index ef2fe5b3f0d8..c998dc0fcd15 100644 --- a/net/ipv4/netfilter/ipt_TCPMSS.c +++ b/net/ipv4/netfilter/ipt_TCPMSS.c | |||
| @@ -62,8 +62,9 @@ ipt_tcpmss_target(struct sk_buff **pskb, | |||
| 62 | if (!skb_make_writable(pskb, (*pskb)->len)) | 62 | if (!skb_make_writable(pskb, (*pskb)->len)) |
| 63 | return NF_DROP; | 63 | return NF_DROP; |
| 64 | 64 | ||
| 65 | if ((*pskb)->ip_summed == CHECKSUM_HW && | 65 | if (((*pskb)->ip_summed == CHECKSUM_PARTIAL || |
| 66 | skb_checksum_help(*pskb, out == NULL)) | 66 | (*pskb)->ip_summed == CHECKSUM_COMPLETE) && |
| 67 | skb_checksum_help(*pskb)) | ||
| 67 | return NF_DROP; | 68 | return NF_DROP; |
| 68 | 69 | ||
| 69 | iph = (*pskb)->nh.iph; | 70 | iph = (*pskb)->nh.iph; |
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 934396bb1376..b0124e69ab38 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c | |||
| @@ -568,7 +568,7 @@ new_segment: | |||
| 568 | skb->truesize += copy; | 568 | skb->truesize += copy; |
| 569 | sk->sk_wmem_queued += copy; | 569 | sk->sk_wmem_queued += copy; |
| 570 | sk->sk_forward_alloc -= copy; | 570 | sk->sk_forward_alloc -= copy; |
| 571 | skb->ip_summed = CHECKSUM_HW; | 571 | skb->ip_summed = CHECKSUM_PARTIAL; |
| 572 | tp->write_seq += copy; | 572 | tp->write_seq += copy; |
| 573 | TCP_SKB_CB(skb)->end_seq += copy; | 573 | TCP_SKB_CB(skb)->end_seq += copy; |
| 574 | skb_shinfo(skb)->gso_segs = 0; | 574 | skb_shinfo(skb)->gso_segs = 0; |
| @@ -723,7 +723,7 @@ new_segment: | |||
| 723 | * Check whether we can use HW checksum. | 723 | * Check whether we can use HW checksum. |
| 724 | */ | 724 | */ |
| 725 | if (sk->sk_route_caps & NETIF_F_ALL_CSUM) | 725 | if (sk->sk_route_caps & NETIF_F_ALL_CSUM) |
| 726 | skb->ip_summed = CHECKSUM_HW; | 726 | skb->ip_summed = CHECKSUM_PARTIAL; |
| 727 | 727 | ||
| 728 | skb_entail(sk, tp, skb); | 728 | skb_entail(sk, tp, skb); |
| 729 | copy = size_goal; | 729 | copy = size_goal; |
| @@ -2205,7 +2205,7 @@ struct sk_buff *tcp_tso_segment(struct sk_buff *skb, int features) | |||
| 2205 | th->fin = th->psh = 0; | 2205 | th->fin = th->psh = 0; |
| 2206 | 2206 | ||
| 2207 | th->check = ~csum_fold(th->check + delta); | 2207 | th->check = ~csum_fold(th->check + delta); |
| 2208 | if (skb->ip_summed != CHECKSUM_HW) | 2208 | if (skb->ip_summed != CHECKSUM_PARTIAL) |
| 2209 | th->check = csum_fold(csum_partial(skb->h.raw, thlen, | 2209 | th->check = csum_fold(csum_partial(skb->h.raw, thlen, |
| 2210 | skb->csum)); | 2210 | skb->csum)); |
| 2211 | 2211 | ||
| @@ -2219,7 +2219,7 @@ struct sk_buff *tcp_tso_segment(struct sk_buff *skb, int features) | |||
| 2219 | 2219 | ||
| 2220 | delta = htonl(oldlen + (skb->tail - skb->h.raw) + skb->data_len); | 2220 | delta = htonl(oldlen + (skb->tail - skb->h.raw) + skb->data_len); |
| 2221 | th->check = ~csum_fold(th->check + delta); | 2221 | th->check = ~csum_fold(th->check + delta); |
| 2222 | if (skb->ip_summed != CHECKSUM_HW) | 2222 | if (skb->ip_summed != CHECKSUM_PARTIAL) |
| 2223 | th->check = csum_fold(csum_partial(skb->h.raw, thlen, | 2223 | th->check = csum_fold(csum_partial(skb->h.raw, thlen, |
| 2224 | skb->csum)); | 2224 | skb->csum)); |
| 2225 | 2225 | ||
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index 43f6740244f8..b2aa512a30e9 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c | |||
| @@ -484,7 +484,7 @@ void tcp_v4_send_check(struct sock *sk, int len, struct sk_buff *skb) | |||
| 484 | struct inet_sock *inet = inet_sk(sk); | 484 | struct inet_sock *inet = inet_sk(sk); |
| 485 | struct tcphdr *th = skb->h.th; | 485 | struct tcphdr *th = skb->h.th; |
| 486 | 486 | ||
| 487 | if (skb->ip_summed == CHECKSUM_HW) { | 487 | if (skb->ip_summed == CHECKSUM_PARTIAL) { |
| 488 | th->check = ~tcp_v4_check(th, len, inet->saddr, inet->daddr, 0); | 488 | th->check = ~tcp_v4_check(th, len, inet->saddr, inet->daddr, 0); |
| 489 | skb->csum = offsetof(struct tcphdr, check); | 489 | skb->csum = offsetof(struct tcphdr, check); |
| 490 | } else { | 490 | } else { |
| @@ -509,7 +509,7 @@ int tcp_v4_gso_send_check(struct sk_buff *skb) | |||
| 509 | th->check = 0; | 509 | th->check = 0; |
| 510 | th->check = ~tcp_v4_check(th, skb->len, iph->saddr, iph->daddr, 0); | 510 | th->check = ~tcp_v4_check(th, skb->len, iph->saddr, iph->daddr, 0); |
| 511 | skb->csum = offsetof(struct tcphdr, check); | 511 | skb->csum = offsetof(struct tcphdr, check); |
| 512 | skb->ip_summed = CHECKSUM_HW; | 512 | skb->ip_summed = CHECKSUM_PARTIAL; |
| 513 | return 0; | 513 | return 0; |
| 514 | } | 514 | } |
| 515 | 515 | ||
| @@ -973,7 +973,7 @@ static struct sock *tcp_v4_hnd_req(struct sock *sk, struct sk_buff *skb) | |||
| 973 | 973 | ||
| 974 | static int tcp_v4_checksum_init(struct sk_buff *skb) | 974 | static int tcp_v4_checksum_init(struct sk_buff *skb) |
| 975 | { | 975 | { |
| 976 | if (skb->ip_summed == CHECKSUM_HW) { | 976 | if (skb->ip_summed == CHECKSUM_COMPLETE) { |
| 977 | if (!tcp_v4_check(skb->h.th, skb->len, skb->nh.iph->saddr, | 977 | if (!tcp_v4_check(skb->h.th, skb->len, skb->nh.iph->saddr, |
| 978 | skb->nh.iph->daddr, skb->csum)) { | 978 | skb->nh.iph->daddr, skb->csum)) { |
| 979 | skb->ip_summed = CHECKSUM_UNNECESSARY; | 979 | skb->ip_summed = CHECKSUM_UNNECESSARY; |
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index b4f3ffe1b3b4..9252a50c4b49 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c | |||
| @@ -577,7 +577,7 @@ int tcp_fragment(struct sock *sk, struct sk_buff *skb, u32 len, unsigned int mss | |||
| 577 | TCP_SKB_CB(buff)->sacked = TCP_SKB_CB(skb)->sacked; | 577 | TCP_SKB_CB(buff)->sacked = TCP_SKB_CB(skb)->sacked; |
| 578 | TCP_SKB_CB(skb)->sacked &= ~TCPCB_AT_TAIL; | 578 | TCP_SKB_CB(skb)->sacked &= ~TCPCB_AT_TAIL; |
| 579 | 579 | ||
| 580 | if (!skb_shinfo(skb)->nr_frags && skb->ip_summed != CHECKSUM_HW) { | 580 | if (!skb_shinfo(skb)->nr_frags && skb->ip_summed != CHECKSUM_PARTIAL) { |
| 581 | /* Copy and checksum data tail into the new buffer. */ | 581 | /* Copy and checksum data tail into the new buffer. */ |
| 582 | buff->csum = csum_partial_copy_nocheck(skb->data + len, skb_put(buff, nsize), | 582 | buff->csum = csum_partial_copy_nocheck(skb->data + len, skb_put(buff, nsize), |
| 583 | nsize, 0); | 583 | nsize, 0); |
| @@ -586,7 +586,7 @@ int tcp_fragment(struct sock *sk, struct sk_buff *skb, u32 len, unsigned int mss | |||
| 586 | 586 | ||
| 587 | skb->csum = csum_block_sub(skb->csum, buff->csum, len); | 587 | skb->csum = csum_block_sub(skb->csum, buff->csum, len); |
| 588 | } else { | 588 | } else { |
| 589 | skb->ip_summed = CHECKSUM_HW; | 589 | skb->ip_summed = CHECKSUM_PARTIAL; |
| 590 | skb_split(skb, buff, len); | 590 | skb_split(skb, buff, len); |
| 591 | } | 591 | } |
| 592 | 592 | ||
| @@ -689,7 +689,7 @@ int tcp_trim_head(struct sock *sk, struct sk_buff *skb, u32 len) | |||
| 689 | __pskb_trim_head(skb, len - skb_headlen(skb)); | 689 | __pskb_trim_head(skb, len - skb_headlen(skb)); |
| 690 | 690 | ||
| 691 | TCP_SKB_CB(skb)->seq += len; | 691 | TCP_SKB_CB(skb)->seq += len; |
| 692 | skb->ip_summed = CHECKSUM_HW; | 692 | skb->ip_summed = CHECKSUM_PARTIAL; |
| 693 | 693 | ||
| 694 | skb->truesize -= len; | 694 | skb->truesize -= len; |
| 695 | sk->sk_wmem_queued -= len; | 695 | sk->sk_wmem_queued -= len; |
| @@ -1062,7 +1062,7 @@ static int tso_fragment(struct sock *sk, struct sk_buff *skb, unsigned int len, | |||
| 1062 | /* This packet was never sent out yet, so no SACK bits. */ | 1062 | /* This packet was never sent out yet, so no SACK bits. */ |
| 1063 | TCP_SKB_CB(buff)->sacked = 0; | 1063 | TCP_SKB_CB(buff)->sacked = 0; |
| 1064 | 1064 | ||
| 1065 | buff->ip_summed = skb->ip_summed = CHECKSUM_HW; | 1065 | buff->ip_summed = skb->ip_summed = CHECKSUM_PARTIAL; |
| 1066 | skb_split(skb, buff, len); | 1066 | skb_split(skb, buff, len); |
| 1067 | 1067 | ||
| 1068 | /* Fix up tso_factor for both original and new SKB. */ | 1068 | /* Fix up tso_factor for both original and new SKB. */ |
| @@ -1206,8 +1206,7 @@ static int tcp_mtu_probe(struct sock *sk) | |||
| 1206 | TCP_SKB_CB(nskb)->flags = TCPCB_FLAG_ACK; | 1206 | TCP_SKB_CB(nskb)->flags = TCPCB_FLAG_ACK; |
| 1207 | TCP_SKB_CB(nskb)->sacked = 0; | 1207 | TCP_SKB_CB(nskb)->sacked = 0; |
| 1208 | nskb->csum = 0; | 1208 | nskb->csum = 0; |
| 1209 | if (skb->ip_summed == CHECKSUM_HW) | 1209 | nskb->ip_summed = skb->ip_summed; |
| 1210 | nskb->ip_summed = CHECKSUM_HW; | ||
| 1211 | 1210 | ||
| 1212 | len = 0; | 1211 | len = 0; |
| 1213 | while (len < probe_size) { | 1212 | while (len < probe_size) { |
| @@ -1231,7 +1230,7 @@ static int tcp_mtu_probe(struct sock *sk) | |||
| 1231 | ~(TCPCB_FLAG_FIN|TCPCB_FLAG_PSH); | 1230 | ~(TCPCB_FLAG_FIN|TCPCB_FLAG_PSH); |
| 1232 | if (!skb_shinfo(skb)->nr_frags) { | 1231 | if (!skb_shinfo(skb)->nr_frags) { |
| 1233 | skb_pull(skb, copy); | 1232 | skb_pull(skb, copy); |
| 1234 | if (skb->ip_summed != CHECKSUM_HW) | 1233 | if (skb->ip_summed != CHECKSUM_PARTIAL) |
| 1235 | skb->csum = csum_partial(skb->data, skb->len, 0); | 1234 | skb->csum = csum_partial(skb->data, skb->len, 0); |
| 1236 | } else { | 1235 | } else { |
| 1237 | __pskb_trim_head(skb, copy); | 1236 | __pskb_trim_head(skb, copy); |
| @@ -1572,10 +1571,9 @@ static void tcp_retrans_try_collapse(struct sock *sk, struct sk_buff *skb, int m | |||
| 1572 | 1571 | ||
| 1573 | memcpy(skb_put(skb, next_skb_size), next_skb->data, next_skb_size); | 1572 | memcpy(skb_put(skb, next_skb_size), next_skb->data, next_skb_size); |
| 1574 | 1573 | ||
| 1575 | if (next_skb->ip_summed == CHECKSUM_HW) | 1574 | skb->ip_summed = next_skb->ip_summed; |
| 1576 | skb->ip_summed = CHECKSUM_HW; | ||
| 1577 | 1575 | ||
| 1578 | if (skb->ip_summed != CHECKSUM_HW) | 1576 | if (skb->ip_summed != CHECKSUM_PARTIAL) |
| 1579 | skb->csum = csum_block_add(skb->csum, next_skb->csum, skb_size); | 1577 | skb->csum = csum_block_add(skb->csum, next_skb->csum, skb_size); |
| 1580 | 1578 | ||
| 1581 | /* Update sequence range on original skb. */ | 1579 | /* Update sequence range on original skb. */ |
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index a4d005eccc7f..87152510980c 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c | |||
| @@ -429,7 +429,7 @@ static int udp_push_pending_frames(struct sock *sk, struct udp_sock *up) | |||
| 429 | /* | 429 | /* |
| 430 | * Only one fragment on the socket. | 430 | * Only one fragment on the socket. |
| 431 | */ | 431 | */ |
| 432 | if (skb->ip_summed == CHECKSUM_HW) { | 432 | if (skb->ip_summed == CHECKSUM_PARTIAL) { |
| 433 | skb->csum = offsetof(struct udphdr, check); | 433 | skb->csum = offsetof(struct udphdr, check); |
| 434 | uh->check = ~csum_tcpudp_magic(fl->fl4_src, fl->fl4_dst, | 434 | uh->check = ~csum_tcpudp_magic(fl->fl4_src, fl->fl4_dst, |
| 435 | up->len, IPPROTO_UDP, 0); | 435 | up->len, IPPROTO_UDP, 0); |
| @@ -448,7 +448,7 @@ static int udp_push_pending_frames(struct sock *sk, struct udp_sock *up) | |||
| 448 | * fragments on the socket so that all csums of sk_buffs | 448 | * fragments on the socket so that all csums of sk_buffs |
| 449 | * should be together. | 449 | * should be together. |
| 450 | */ | 450 | */ |
| 451 | if (skb->ip_summed == CHECKSUM_HW) { | 451 | if (skb->ip_summed == CHECKSUM_PARTIAL) { |
| 452 | int offset = (unsigned char *)uh - skb->data; | 452 | int offset = (unsigned char *)uh - skb->data; |
| 453 | skb->csum = skb_checksum(skb, offset, skb->len - offset, 0); | 453 | skb->csum = skb_checksum(skb, offset, skb->len - offset, 0); |
| 454 | 454 | ||
| @@ -1088,7 +1088,7 @@ static void udp_checksum_init(struct sk_buff *skb, struct udphdr *uh, | |||
| 1088 | { | 1088 | { |
| 1089 | if (uh->check == 0) { | 1089 | if (uh->check == 0) { |
| 1090 | skb->ip_summed = CHECKSUM_UNNECESSARY; | 1090 | skb->ip_summed = CHECKSUM_UNNECESSARY; |
| 1091 | } else if (skb->ip_summed == CHECKSUM_HW) { | 1091 | } else if (skb->ip_summed == CHECKSUM_COMPLETE) { |
| 1092 | if (!udp_check(uh, ulen, saddr, daddr, skb->csum)) | 1092 | if (!udp_check(uh, ulen, saddr, daddr, skb->csum)) |
| 1093 | skb->ip_summed = CHECKSUM_UNNECESSARY; | 1093 | skb->ip_summed = CHECKSUM_UNNECESSARY; |
| 1094 | } | 1094 | } |
diff --git a/net/ipv4/xfrm4_output.c b/net/ipv4/xfrm4_output.c index d16f863cf687..4a96a9e3ef3b 100644 --- a/net/ipv4/xfrm4_output.c +++ b/net/ipv4/xfrm4_output.c | |||
| @@ -48,8 +48,8 @@ static int xfrm4_output_one(struct sk_buff *skb) | |||
| 48 | struct xfrm_state *x = dst->xfrm; | 48 | struct xfrm_state *x = dst->xfrm; |
| 49 | int err; | 49 | int err; |
| 50 | 50 | ||
| 51 | if (skb->ip_summed == CHECKSUM_HW) { | 51 | if (skb->ip_summed == CHECKSUM_PARTIAL) { |
| 52 | err = skb_checksum_help(skb, 0); | 52 | err = skb_checksum_help(skb); |
| 53 | if (err) | 53 | if (err) |
| 54 | goto error_nolock; | 54 | goto error_nolock; |
| 55 | } | 55 | } |
diff --git a/net/ipv6/exthdrs.c b/net/ipv6/exthdrs.c index 86dac106873b..05afa6b1912b 100644 --- a/net/ipv6/exthdrs.c +++ b/net/ipv6/exthdrs.c | |||
| @@ -294,7 +294,7 @@ looped_back: | |||
| 294 | hdr = (struct ipv6_rt_hdr *) skb2->h.raw; | 294 | hdr = (struct ipv6_rt_hdr *) skb2->h.raw; |
| 295 | } | 295 | } |
| 296 | 296 | ||
| 297 | if (skb->ip_summed == CHECKSUM_HW) | 297 | if (skb->ip_summed == CHECKSUM_COMPLETE) |
| 298 | skb->ip_summed = CHECKSUM_NONE; | 298 | skb->ip_summed = CHECKSUM_NONE; |
| 299 | 299 | ||
| 300 | i = n - --hdr->segments_left; | 300 | i = n - --hdr->segments_left; |
diff --git a/net/ipv6/icmp.c b/net/ipv6/icmp.c index dbfce089e916..103055107674 100644 --- a/net/ipv6/icmp.c +++ b/net/ipv6/icmp.c | |||
| @@ -606,7 +606,7 @@ static int icmpv6_rcv(struct sk_buff **pskb) | |||
| 606 | 606 | ||
| 607 | /* Perform checksum. */ | 607 | /* Perform checksum. */ |
| 608 | switch (skb->ip_summed) { | 608 | switch (skb->ip_summed) { |
| 609 | case CHECKSUM_HW: | 609 | case CHECKSUM_COMPLETE: |
| 610 | if (!csum_ipv6_magic(saddr, daddr, skb->len, IPPROTO_ICMPV6, | 610 | if (!csum_ipv6_magic(saddr, daddr, skb->len, IPPROTO_ICMPV6, |
| 611 | skb->csum)) | 611 | skb->csum)) |
| 612 | break; | 612 | break; |
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index 4fb47a252913..65514f21c186 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c | |||
| @@ -866,7 +866,7 @@ static inline int ip6_ufo_append_data(struct sock *sk, | |||
| 866 | /* initialize protocol header pointer */ | 866 | /* initialize protocol header pointer */ |
| 867 | skb->h.raw = skb->data + fragheaderlen; | 867 | skb->h.raw = skb->data + fragheaderlen; |
| 868 | 868 | ||
| 869 | skb->ip_summed = CHECKSUM_HW; | 869 | skb->ip_summed = CHECKSUM_PARTIAL; |
| 870 | skb->csum = 0; | 870 | skb->csum = 0; |
| 871 | sk->sk_sndmsg_off = 0; | 871 | sk->sk_sndmsg_off = 0; |
| 872 | } | 872 | } |
diff --git a/net/ipv6/netfilter.c b/net/ipv6/netfilter.c index 395a417ba955..580b1aba6722 100644 --- a/net/ipv6/netfilter.c +++ b/net/ipv6/netfilter.c | |||
| @@ -87,7 +87,7 @@ unsigned int nf_ip6_checksum(struct sk_buff *skb, unsigned int hook, | |||
| 87 | unsigned int csum = 0; | 87 | unsigned int csum = 0; |
| 88 | 88 | ||
| 89 | switch (skb->ip_summed) { | 89 | switch (skb->ip_summed) { |
| 90 | case CHECKSUM_HW: | 90 | case CHECKSUM_COMPLETE: |
| 91 | if (hook != NF_IP6_PRE_ROUTING && hook != NF_IP6_LOCAL_IN) | 91 | if (hook != NF_IP6_PRE_ROUTING && hook != NF_IP6_LOCAL_IN) |
| 92 | break; | 92 | break; |
| 93 | if (!csum_ipv6_magic(&ip6h->saddr, &ip6h->daddr, | 93 | if (!csum_ipv6_magic(&ip6h->saddr, &ip6h->daddr, |
diff --git a/net/ipv6/netfilter/ip6_queue.c b/net/ipv6/netfilter/ip6_queue.c index 968a14be0d05..c01c126224e2 100644 --- a/net/ipv6/netfilter/ip6_queue.c +++ b/net/ipv6/netfilter/ip6_queue.c | |||
| @@ -206,9 +206,9 @@ ipq_build_packet_message(struct ipq_queue_entry *entry, int *errp) | |||
| 206 | break; | 206 | break; |
| 207 | 207 | ||
| 208 | case IPQ_COPY_PACKET: | 208 | case IPQ_COPY_PACKET: |
| 209 | if (entry->skb->ip_summed == CHECKSUM_HW && | 209 | if ((entry->skb->ip_summed == CHECKSUM_PARTIAL || |
| 210 | (*errp = skb_checksum_help(entry->skb, | 210 | entry->skb->ip_summed == CHECKSUM_COMPLETE) && |
| 211 | entry->info->outdev == NULL))) { | 211 | (*errp = skb_checksum_help(entry->skb))) { |
| 212 | read_unlock_bh(&queue_lock); | 212 | read_unlock_bh(&queue_lock); |
| 213 | return NULL; | 213 | return NULL; |
| 214 | } | 214 | } |
diff --git a/net/ipv6/netfilter/nf_conntrack_reasm.c b/net/ipv6/netfilter/nf_conntrack_reasm.c index 00d5583807f7..7a4e4c2e3197 100644 --- a/net/ipv6/netfilter/nf_conntrack_reasm.c +++ b/net/ipv6/netfilter/nf_conntrack_reasm.c | |||
| @@ -408,7 +408,7 @@ static int nf_ct_frag6_queue(struct nf_ct_frag6_queue *fq, struct sk_buff *skb, | |||
| 408 | return -1; | 408 | return -1; |
| 409 | } | 409 | } |
| 410 | 410 | ||
| 411 | if (skb->ip_summed == CHECKSUM_HW) | 411 | if (skb->ip_summed == CHECKSUM_COMPLETE) |
| 412 | skb->csum = csum_sub(skb->csum, | 412 | skb->csum = csum_sub(skb->csum, |
| 413 | csum_partial(skb->nh.raw, | 413 | csum_partial(skb->nh.raw, |
| 414 | (u8*)(fhdr + 1) - skb->nh.raw, | 414 | (u8*)(fhdr + 1) - skb->nh.raw, |
| @@ -640,7 +640,7 @@ nf_ct_frag6_reasm(struct nf_ct_frag6_queue *fq, struct net_device *dev) | |||
| 640 | head->len += fp->len; | 640 | head->len += fp->len; |
| 641 | if (head->ip_summed != fp->ip_summed) | 641 | if (head->ip_summed != fp->ip_summed) |
| 642 | head->ip_summed = CHECKSUM_NONE; | 642 | head->ip_summed = CHECKSUM_NONE; |
| 643 | else if (head->ip_summed == CHECKSUM_HW) | 643 | else if (head->ip_summed == CHECKSUM_COMPLETE) |
| 644 | head->csum = csum_add(head->csum, fp->csum); | 644 | head->csum = csum_add(head->csum, fp->csum); |
| 645 | head->truesize += fp->truesize; | 645 | head->truesize += fp->truesize; |
| 646 | atomic_sub(fp->truesize, &nf_ct_frag6_mem); | 646 | 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) | |||
| 652 | head->nh.ipv6h->payload_len = htons(payload_len); | 652 | head->nh.ipv6h->payload_len = htons(payload_len); |
| 653 | 653 | ||
| 654 | /* Yes, and fold redundant checksum back. 8) */ | 654 | /* Yes, and fold redundant checksum back. 8) */ |
| 655 | if (head->ip_summed == CHECKSUM_HW) | 655 | if (head->ip_summed == CHECKSUM_COMPLETE) |
| 656 | head->csum = csum_partial(head->nh.raw, head->h.raw-head->nh.raw, head->csum); | 656 | head->csum = csum_partial(head->nh.raw, head->h.raw-head->nh.raw, head->csum); |
| 657 | 657 | ||
| 658 | fq->fragments = NULL; | 658 | fq->fragments = NULL; |
diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c index d5040e172292..d4af1cb5e19f 100644 --- a/net/ipv6/raw.c +++ b/net/ipv6/raw.c | |||
| @@ -334,7 +334,7 @@ int rawv6_rcv(struct sock *sk, struct sk_buff *skb) | |||
| 334 | if (!rp->checksum) | 334 | if (!rp->checksum) |
| 335 | skb->ip_summed = CHECKSUM_UNNECESSARY; | 335 | skb->ip_summed = CHECKSUM_UNNECESSARY; |
| 336 | 336 | ||
| 337 | if (skb->ip_summed == CHECKSUM_HW) { | 337 | if (skb->ip_summed == CHECKSUM_COMPLETE) { |
| 338 | skb_postpull_rcsum(skb, skb->nh.raw, | 338 | skb_postpull_rcsum(skb, skb->nh.raw, |
| 339 | skb->h.raw - skb->nh.raw); | 339 | skb->h.raw - skb->nh.raw); |
| 340 | if (!csum_ipv6_magic(&skb->nh.ipv6h->saddr, | 340 | if (!csum_ipv6_magic(&skb->nh.ipv6h->saddr, |
diff --git a/net/ipv6/reassembly.c b/net/ipv6/reassembly.c index 4e299c69e1c6..a8623d2b0879 100644 --- a/net/ipv6/reassembly.c +++ b/net/ipv6/reassembly.c | |||
| @@ -433,7 +433,7 @@ static void ip6_frag_queue(struct frag_queue *fq, struct sk_buff *skb, | |||
| 433 | return; | 433 | return; |
| 434 | } | 434 | } |
| 435 | 435 | ||
| 436 | if (skb->ip_summed == CHECKSUM_HW) | 436 | if (skb->ip_summed == CHECKSUM_COMPLETE) |
| 437 | skb->csum = csum_sub(skb->csum, | 437 | skb->csum = csum_sub(skb->csum, |
| 438 | csum_partial(skb->nh.raw, (u8*)(fhdr+1)-skb->nh.raw, 0)); | 438 | csum_partial(skb->nh.raw, (u8*)(fhdr+1)-skb->nh.raw, 0)); |
| 439 | 439 | ||
| @@ -647,7 +647,7 @@ static int ip6_frag_reasm(struct frag_queue *fq, struct sk_buff **skb_in, | |||
| 647 | head->len += fp->len; | 647 | head->len += fp->len; |
| 648 | if (head->ip_summed != fp->ip_summed) | 648 | if (head->ip_summed != fp->ip_summed) |
| 649 | head->ip_summed = CHECKSUM_NONE; | 649 | head->ip_summed = CHECKSUM_NONE; |
| 650 | else if (head->ip_summed == CHECKSUM_HW) | 650 | else if (head->ip_summed == CHECKSUM_COMPLETE) |
| 651 | head->csum = csum_add(head->csum, fp->csum); | 651 | head->csum = csum_add(head->csum, fp->csum); |
| 652 | head->truesize += fp->truesize; | 652 | head->truesize += fp->truesize; |
| 653 | atomic_sub(fp->truesize, &ip6_frag_mem); | 653 | 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, | |||
| 662 | *skb_in = head; | 662 | *skb_in = head; |
| 663 | 663 | ||
| 664 | /* Yes, and fold redundant checksum back. 8) */ | 664 | /* Yes, and fold redundant checksum back. 8) */ |
| 665 | if (head->ip_summed == CHECKSUM_HW) | 665 | if (head->ip_summed == CHECKSUM_COMPLETE) |
| 666 | head->csum = csum_partial(head->nh.raw, head->h.raw-head->nh.raw, head->csum); | 666 | head->csum = csum_partial(head->nh.raw, head->h.raw-head->nh.raw, head->csum); |
| 667 | 667 | ||
| 668 | IP6_INC_STATS_BH(IPSTATS_MIB_REASMOKS); | 668 | IP6_INC_STATS_BH(IPSTATS_MIB_REASMOKS); |
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index 302786a11cd6..7f1b660493b7 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c | |||
| @@ -545,7 +545,7 @@ static void tcp_v6_send_check(struct sock *sk, int len, struct sk_buff *skb) | |||
| 545 | struct ipv6_pinfo *np = inet6_sk(sk); | 545 | struct ipv6_pinfo *np = inet6_sk(sk); |
| 546 | struct tcphdr *th = skb->h.th; | 546 | struct tcphdr *th = skb->h.th; |
| 547 | 547 | ||
| 548 | if (skb->ip_summed == CHECKSUM_HW) { | 548 | if (skb->ip_summed == CHECKSUM_PARTIAL) { |
| 549 | th->check = ~csum_ipv6_magic(&np->saddr, &np->daddr, len, IPPROTO_TCP, 0); | 549 | th->check = ~csum_ipv6_magic(&np->saddr, &np->daddr, len, IPPROTO_TCP, 0); |
| 550 | skb->csum = offsetof(struct tcphdr, check); | 550 | skb->csum = offsetof(struct tcphdr, check); |
| 551 | } else { | 551 | } else { |
| @@ -570,7 +570,7 @@ static int tcp_v6_gso_send_check(struct sk_buff *skb) | |||
| 570 | th->check = ~csum_ipv6_magic(&ipv6h->saddr, &ipv6h->daddr, skb->len, | 570 | th->check = ~csum_ipv6_magic(&ipv6h->saddr, &ipv6h->daddr, skb->len, |
| 571 | IPPROTO_TCP, 0); | 571 | IPPROTO_TCP, 0); |
| 572 | skb->csum = offsetof(struct tcphdr, check); | 572 | skb->csum = offsetof(struct tcphdr, check); |
| 573 | skb->ip_summed = CHECKSUM_HW; | 573 | skb->ip_summed = CHECKSUM_PARTIAL; |
| 574 | return 0; | 574 | return 0; |
| 575 | } | 575 | } |
| 576 | 576 | ||
| @@ -1033,7 +1033,7 @@ out: | |||
| 1033 | 1033 | ||
| 1034 | static int tcp_v6_checksum_init(struct sk_buff *skb) | 1034 | static int tcp_v6_checksum_init(struct sk_buff *skb) |
| 1035 | { | 1035 | { |
| 1036 | if (skb->ip_summed == CHECKSUM_HW) { | 1036 | if (skb->ip_summed == CHECKSUM_COMPLETE) { |
| 1037 | if (!tcp_v6_check(skb->h.th,skb->len,&skb->nh.ipv6h->saddr, | 1037 | if (!tcp_v6_check(skb->h.th,skb->len,&skb->nh.ipv6h->saddr, |
| 1038 | &skb->nh.ipv6h->daddr,skb->csum)) { | 1038 | &skb->nh.ipv6h->daddr,skb->csum)) { |
| 1039 | skb->ip_summed = CHECKSUM_UNNECESSARY; | 1039 | skb->ip_summed = CHECKSUM_UNNECESSARY; |
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index 82c7c9cde2a8..780b89f6dfcc 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c | |||
| @@ -475,7 +475,7 @@ static int udpv6_rcv(struct sk_buff **pskb) | |||
| 475 | uh = skb->h.uh; | 475 | uh = skb->h.uh; |
| 476 | } | 476 | } |
| 477 | 477 | ||
| 478 | if (skb->ip_summed == CHECKSUM_HW && | 478 | if (skb->ip_summed == CHECKSUM_COMPLETE && |
| 479 | !csum_ipv6_magic(saddr, daddr, ulen, IPPROTO_UDP, skb->csum)) | 479 | !csum_ipv6_magic(saddr, daddr, ulen, IPPROTO_UDP, skb->csum)) |
| 480 | skb->ip_summed = CHECKSUM_UNNECESSARY; | 480 | skb->ip_summed = CHECKSUM_UNNECESSARY; |
| 481 | 481 | ||
diff --git a/net/ipv6/xfrm6_output.c b/net/ipv6/xfrm6_output.c index c8c8b44a0f58..6d111743e508 100644 --- a/net/ipv6/xfrm6_output.c +++ b/net/ipv6/xfrm6_output.c | |||
| @@ -41,8 +41,8 @@ static int xfrm6_output_one(struct sk_buff *skb) | |||
| 41 | struct xfrm_state *x = dst->xfrm; | 41 | struct xfrm_state *x = dst->xfrm; |
| 42 | int err; | 42 | int err; |
| 43 | 43 | ||
| 44 | if (skb->ip_summed == CHECKSUM_HW) { | 44 | if (skb->ip_summed == CHECKSUM_PARTIAL) { |
| 45 | err = skb_checksum_help(skb, 0); | 45 | err = skb_checksum_help(skb); |
| 46 | if (err) | 46 | if (err) |
| 47 | goto error_nolock; | 47 | goto error_nolock; |
| 48 | } | 48 | } |
diff --git a/net/netfilter/nf_conntrack_proto_tcp.c b/net/netfilter/nf_conntrack_proto_tcp.c index af8adcba23a7..308d2abd7ee5 100644 --- a/net/netfilter/nf_conntrack_proto_tcp.c +++ b/net/netfilter/nf_conntrack_proto_tcp.c | |||
| @@ -823,8 +823,7 @@ static int tcp_error(struct sk_buff *skb, | |||
| 823 | 823 | ||
| 824 | /* Checksum invalid? Ignore. | 824 | /* Checksum invalid? Ignore. |
| 825 | * We skip checking packets on the outgoing path | 825 | * We skip checking packets on the outgoing path |
| 826 | * because the semantic of CHECKSUM_HW is different there | 826 | * because the checksum is assumed to be correct. |
| 827 | * and moreover root might send raw packets. | ||
| 828 | */ | 827 | */ |
| 829 | /* FIXME: Source route IP option packets --RR */ | 828 | /* FIXME: Source route IP option packets --RR */ |
| 830 | if (nf_conntrack_checksum && | 829 | if (nf_conntrack_checksum && |
diff --git a/net/netfilter/nf_conntrack_proto_udp.c b/net/netfilter/nf_conntrack_proto_udp.c index ae07ebe3ab37..d36e03139e8b 100644 --- a/net/netfilter/nf_conntrack_proto_udp.c +++ b/net/netfilter/nf_conntrack_proto_udp.c | |||
| @@ -131,8 +131,7 @@ static int udp_error(struct sk_buff *skb, unsigned int dataoff, | |||
| 131 | 131 | ||
| 132 | /* Checksum invalid? Ignore. | 132 | /* Checksum invalid? Ignore. |
| 133 | * We skip checking packets on the outgoing path | 133 | * We skip checking packets on the outgoing path |
| 134 | * because the semantic of CHECKSUM_HW is different there | 134 | * because the checksum is assumed to be correct. |
| 135 | * and moreover root might send raw packets. | ||
| 136 | * FIXME: Source route IP option packets --RR */ | 135 | * FIXME: Source route IP option packets --RR */ |
| 137 | if (nf_conntrack_checksum && | 136 | if (nf_conntrack_checksum && |
| 138 | ((pf == PF_INET && hooknum == NF_IP_PRE_ROUTING) || | 137 | ((pf == PF_INET && hooknum == NF_IP_PRE_ROUTING) || |
diff --git a/net/netfilter/nfnetlink_queue.c b/net/netfilter/nfnetlink_queue.c index 49ef41e34c48..eddfbe4441a2 100644 --- a/net/netfilter/nfnetlink_queue.c +++ b/net/netfilter/nfnetlink_queue.c | |||
| @@ -377,9 +377,9 @@ nfqnl_build_packet_message(struct nfqnl_instance *queue, | |||
| 377 | break; | 377 | break; |
| 378 | 378 | ||
| 379 | case NFQNL_COPY_PACKET: | 379 | case NFQNL_COPY_PACKET: |
| 380 | if (entskb->ip_summed == CHECKSUM_HW && | 380 | if ((entskb->ip_summed == CHECKSUM_PARTIAL || |
| 381 | (*errp = skb_checksum_help(entskb, | 381 | entskb->ip_summed == CHECKSUM_COMPLETE) && |
| 382 | outdev == NULL))) { | 382 | (*errp = skb_checksum_help(entskb))) { |
| 383 | spin_unlock_bh(&queue->lock); | 383 | spin_unlock_bh(&queue->lock); |
| 384 | return NULL; | 384 | return NULL; |
| 385 | } | 385 | } |
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index 4172a5235916..300215bdbf46 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c | |||
| @@ -586,7 +586,7 @@ static int tpacket_rcv(struct sk_buff *skb, struct net_device *dev, struct packe | |||
| 586 | else if (skb->pkt_type == PACKET_OUTGOING) { | 586 | else if (skb->pkt_type == PACKET_OUTGOING) { |
| 587 | /* Special case: outgoing packets have ll header at head */ | 587 | /* Special case: outgoing packets have ll header at head */ |
| 588 | skb_pull(skb, skb->nh.raw - skb->data); | 588 | skb_pull(skb, skb->nh.raw - skb->data); |
| 589 | if (skb->ip_summed == CHECKSUM_HW) | 589 | if (skb->ip_summed == CHECKSUM_PARTIAL) |
| 590 | status |= TP_STATUS_CSUMNOTREADY; | 590 | status |= TP_STATUS_CSUMNOTREADY; |
| 591 | } | 591 | } |
| 592 | } | 592 | } |
diff --git a/net/sched/sch_netem.c b/net/sched/sch_netem.c index a08ec4c7c55d..45939bafbdf8 100644 --- a/net/sched/sch_netem.c +++ b/net/sched/sch_netem.c | |||
| @@ -192,8 +192,8 @@ static int netem_enqueue(struct sk_buff *skb, struct Qdisc *sch) | |||
| 192 | */ | 192 | */ |
| 193 | if (q->corrupt && q->corrupt >= get_crandom(&q->corrupt_cor)) { | 193 | if (q->corrupt && q->corrupt >= get_crandom(&q->corrupt_cor)) { |
| 194 | if (!(skb = skb_unshare(skb, GFP_ATOMIC)) | 194 | if (!(skb = skb_unshare(skb, GFP_ATOMIC)) |
| 195 | || (skb->ip_summed == CHECKSUM_HW | 195 | || (skb->ip_summed == CHECKSUM_PARTIAL |
| 196 | && skb_checksum_help(skb, 0))) { | 196 | && skb_checksum_help(skb))) { |
| 197 | sch->qstats.drops++; | 197 | sch->qstats.drops++; |
| 198 | return NET_XMIT_DROP; | 198 | return NET_XMIT_DROP; |
| 199 | } | 199 | } |
diff --git a/net/sunrpc/socklib.c b/net/sunrpc/socklib.c index eb330d4f66d6..6f17527b9e69 100644 --- a/net/sunrpc/socklib.c +++ b/net/sunrpc/socklib.c | |||
| @@ -168,7 +168,7 @@ int csum_partial_copy_to_xdr(struct xdr_buf *xdr, struct sk_buff *skb) | |||
| 168 | return -1; | 168 | return -1; |
| 169 | if ((unsigned short)csum_fold(desc.csum)) | 169 | if ((unsigned short)csum_fold(desc.csum)) |
| 170 | return -1; | 170 | return -1; |
| 171 | if (unlikely(skb->ip_summed == CHECKSUM_HW)) | 171 | if (unlikely(skb->ip_summed == CHECKSUM_COMPLETE)) |
| 172 | netdev_rx_csum_fault(skb->dev); | 172 | netdev_rx_csum_fault(skb->dev); |
| 173 | return 0; | 173 | return 0; |
| 174 | no_checksum: | 174 | no_checksum: |
