: Replace CHECKSUM_HW by CHECKSUM_PARTIAL/CHECKSUM_COMPLETE
Subsystems (13)
This is the latest version of the checksum patches. Retested everything, I think they're ready to go in. On top of net-2.6.19 from a few minutes ago.
[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.
---
commit b49dd1802f397fb8d5272a34ba47fe9636fe2411
tree ba868e9888fbebc98644e01cd7bd45a89c342233
parent 94f26313abdf7169af0a4afa0c3046927892f22c
author Patrick McHardy <[email protected]> Sat, 05 Aug 2006 09:14:07 +0200 committer Patrick McHardy <[email protected]> Sat, 05 Aug 2006 09:14:07 +0200
drivers/atm/he.c | 2 +- drivers/net/3c59x.c | 2 +- drivers/net/8139cp.c | 6 +++--- drivers/net/acenic.c | 8 ++++---- drivers/net/bnx2.c | 2 +- drivers/net/cassini.c | 4 ++-- drivers/net/chelsio/sge.c | 10 +++++----- drivers/net/dl2k.c | 2 +- drivers/net/e1000/e1000_main.c | 8 ++++---- drivers/net/forcedeth.c | 3 ++- drivers/net/gianfar.c | 2 +- drivers/net/hamachi.c | 2 +- drivers/net/ibm_emac/ibm_emac_core.c | 2 +- drivers/net/ioc3-eth.c | 2 +- drivers/net/ixgb/ixgb_main.c | 2 +- drivers/net/mv643xx_eth.c | 2 +- drivers/net/myri10ge/myri10ge.c | 8 ++++---- drivers/net/ns83820.c | 2 +- drivers/net/r8169.c | 2 +- drivers/net/s2io.c | 2 +- drivers/net/sk98lin/skge.c | 6 +++--- drivers/net/skge.c | 4 ++-- drivers/net/sky2.c | 6 +++--- drivers/net/starfire.c | 6 +++--- drivers/net/sungem.c | 4 ++-- drivers/net/sunhme.c | 6 +++--- drivers/net/tg3.c | 6 +++--- drivers/net/typhoon.c | 2 +- drivers/net/via-rhine.c | 2 +- drivers/net/via-velocity.c | 2 +- include/linux/netdevice.h | 4 ++-- include/linux/skbuff.h | 17 +++++++++-------- net/core/datagram.c | 4 ++-- net/core/dev.c | 12 ++++++------ net/core/netpoll.c | 2 +- net/core/skbuff.c | 14 +++++++------- net/ipv4/icmp.c | 2 +- net/ipv4/igmp.c | 2 +- net/ipv4/ip_fragment.c | 2 +- net/ipv4/ip_gre.c | 4 ++-- net/ipv4/ip_output.c | 6 +++--- net/ipv4/ipvs/ip_vs_proto_tcp.c | 8 ++++---- net/ipv4/ipvs/ip_vs_proto_udp.c | 8 ++++---- net/ipv4/netfilter.c | 2 +- net/ipv4/netfilter/ip_conntrack_proto_tcp.c | 3 +-- net/ipv4/netfilter/ip_conntrack_proto_udp.c | 3 +-- net/ipv4/netfilter/ip_nat_standalone.c | 5 +++-- net/ipv4/netfilter/ip_queue.c | 6 +++--- net/ipv4/netfilter/ipt_ECN.c | 9 +++++---- net/ipv4/netfilter/ipt_TCPMSS.c | 5 +++-- net/ipv4/tcp.c | 8 ++++---- net/ipv4/tcp_ipv4.c | 6 +++--- net/ipv4/tcp_output.c | 18 ++++++++---------- net/ipv4/udp.c | 6 +++--- net/ipv4/xfrm4_output.c | 4 ++-- net/ipv6/exthdrs.c | 2 +- net/ipv6/icmp.c | 2 +- net/ipv6/ip6_output.c | 2 +- net/ipv6/netfilter.c | 2 +- net/ipv6/netfilter/ip6_queue.c | 6 +++--- net/ipv6/netfilter/nf_conntrack_reasm.c | 6 +++--- net/ipv6/raw.c | 2 +- net/ipv6/reassembly.c | 6 +++--- net/ipv6/tcp_ipv6.c | 6 +++--- net/ipv6/udp.c | 2 +- net/ipv6/xfrm6_output.c | 4 ++-- net/netfilter/nf_conntrack_proto_tcp.c | 3 +-- net/netfilter/nf_conntrack_proto_udp.c | 3 +-- net/netfilter/nfnetlink_queue.c | 6 +++--- net/packet/af_packet.c | 2 +- net/sched/sch_netem.c | 4 ++-- net/sunrpc/socklib.c | 2 +- 72 files changed, 168 insertions(+), 169 deletions(-)
drivers/atm/he.c +1 -1
@@ -1912,7 +1912,7 @@ #endif skb->tail = skb->data + skb->len;#ifdef USE_CHECKSUM_HW if (vcc->vpi ==0 && vcc->vci >=ATM_NOT_RSV_VCI ) { - skb->ip_summed =CHECKSUM_HW ; + skb->ip_summed =CHECKSUM_COMPLETE ; skb->csum =TCP_CKSUM (skb->data, he_vcc->pdu_len); }
drivers/net/3c59x.c +1 -1
@@ -2077,7 +2077,7 @@ boomerang_start_xmit(struct sk_buff *skb vp->tx_ring[entry].next =0 ;#if DO_ZEROCOPY -if (skb->ip_summed !=CHECKSUM_HW ) +if (skb->ip_summed !=CHECKSUM_PARTIAL ) vp->tx_ring[entry].status =cpu_to_le32 (skb->len | TxIntrUploaded);else vp->tx_ring[entry].status =cpu_to_le32 (skb->len | TxIntrUploaded | AddTCPChksum | AddUDPChksum);
drivers/net/8139cp.c +3 -3
@@ -813,7 +813,7 @@ #endifif (mss) flags |= LargeSend | ((mss & MSSMask) << MSSShift); -else if (skb->ip_summed ==CHECKSUM_HW ) { +else if (skb->ip_summed ==CHECKSUM_PARTIAL ) {const struct iphdr *ip = skb->nh.iph;if (ip->protocol ==IPPROTO_TCP ) flags |=IPCS |TCPCS ;
@@ -867,7 +867,7 @@ #endifif (mss) ctrl |= LargeSend | ((mss & MSSMask) << MSSShift); -else if (skb->ip_summed ==CHECKSUM_HW ) { +else if (skb->ip_summed ==CHECKSUM_PARTIAL ) {if (ip->protocol ==IPPROTO_TCP ) ctrl |=IPCS |TCPCS ;else if (ip->protocol ==IPPROTO_UDP )
@@ -898,7 +898,7 @@ #endif txd->addr =cpu_to_le64 (first_mapping);wmb (); -if (skb->ip_summed ==CHECKSUM_HW ) { +if (skb->ip_summed ==CHECKSUM_PARTIAL ) {if (ip->protocol ==IPPROTO_TCP ) txd->opts1 = cpu_to_le32(first_eor | first_len | FirstFrag | DescOwn |
drivers/net/acenic.c +4 -4
@@ -2040,7 +2040,7 @@ static void ace_rx_int(struct net_device*/ if (bd_flags &BD_FLG_TCP_UDP_SUM ) { skb->csum =htons (csum); - skb->ip_summed =CHECKSUM_HW ; + skb->ip_summed =CHECKSUM_COMPLETE ; }else { skb->ip_summed =CHECKSUM_NONE ; }
@@ -2511,7 +2511,7 @@ restart: mapping =ace_map_tx_skb (ap, skb, skb, idx); flagsize = (skb->len <<16 ) | (BD_FLG_END ); -if (skb->ip_summed ==CHECKSUM_HW ) +if (skb->ip_summed ==CHECKSUM_PARTIAL ) flagsize |=BD_FLG_TCP_UDP_SUM ;#if ACENIC_DO_VLAN if (vlan_tx_tag_present (skb)) {
@@ -2534,7 +2534,7 @@ #endif mapping =ace_map_tx_skb (ap, skb,NULL , idx); flagsize = (skb_headlen (skb) <<16 ); -if (skb->ip_summed ==CHECKSUM_HW ) +if (skb->ip_summed ==CHECKSUM_PARTIAL ) flagsize |=BD_FLG_TCP_UDP_SUM ;#if ACENIC_DO_VLAN if (vlan_tx_tag_present (skb)) {
@@ -2560,7 +2560,7 @@ #endif PCI_DMA_TODEVICE); flagsize = (frag->size <<16 ); -if (skb->ip_summed ==CHECKSUM_HW ) +if (skb->ip_summed ==CHECKSUM_PARTIAL ) flagsize |=BD_FLG_TCP_UDP_SUM ; idx = (idx +1 ) %ACE_TX_RING_ENTRIES (ap);
drivers/net/bnx2.c +1 -1
@@ -4418,7 +4418,7 @@ bnx2_start_xmit(struct sk_buff *skb, str ring_prod =TX_RING_IDX (prod); vlan_tag_flags =0 ; -if (skb->ip_summed ==CHECKSUM_HW ) { +if (skb->ip_summed ==CHECKSUM_PARTIAL ) { vlan_tag_flags |=TX_BD_FLAGS_TCP_UDP_CKSUM ; }
drivers/net/cassini.c +2 -2
@@ -2167,7 +2167,7 @@ end_copy_pkt:cas_page_unmap (addr); } skb->csum =ntohs (i ^0xffff ); - skb->ip_summed =CHECKSUM_HW ; + skb->ip_summed =CHECKSUM_COMPLETE ; skb->protocol =eth_type_trans (skb, cp->dev);return len; }
@@ -2821,7 +2821,7 @@ static inline int cas_xmit_tx_ringN(stru } ctrl =0 ; -if (skb->ip_summed ==CHECKSUM_HW ) { +if (skb->ip_summed ==CHECKSUM_PARTIAL ) {u64 csum_start_off, csum_stuff_off; csum_start_off = (u64) (skb->h.raw - skb->data);
drivers/net/chelsio/sge.c +5 -5
@@ -1470,9 +1470,9 @@ #endif }if (!(adapter->flags &UDP_CSUM_CAPABLE ) && - skb->ip_summed ==CHECKSUM_HW && + skb->ip_summed ==CHECKSUM_PARTIAL && skb->nh.iph->protocol ==IPPROTO_UDP ) -if (unlikely (skb_checksum_help (skb,0 ))) { +if (unlikely (skb_checksum_help (skb))) {dev_kfree_skb_any (skb);return NETDEV_TX_OK ; }
@@ -1495,11 +1495,11 @@ #endif cpl = (struct cpl_tx_pkt *)__skb_push (skb,sizeof (*cpl)); cpl->opcode =CPL_TX_PKT ; cpl->ip_csum_dis =1 ;/* SW calculates IP csum */ - cpl->l4_csum_dis = skb->ip_summed ==CHECKSUM_HW ?0 :1 ; + cpl->l4_csum_dis = skb->ip_summed ==CHECKSUM_PARTIAL ?0 :1 ;/* the length field isn't used so don't bother setting it */ - st->tx_cso += (skb->ip_summed ==CHECKSUM_HW ); - sge->stats.tx_do_cksum += (skb->ip_summed ==CHECKSUM_HW ); + st->tx_cso += (skb->ip_summed ==CHECKSUM_PARTIAL ); + sge->stats.tx_do_cksum += (skb->ip_summed ==CHECKSUM_PARTIAL ); sge->stats.tx_reg_pkts++; } cpl->iff = dev->if_port;
drivers/net/dl2k.c +1 -1
@@ -611,7 +611,7 @@ start_xmit (struct sk_buff *skb, struct txdesc = &np->tx_ring[entry];#if 0 -if (skb->ip_summed ==CHECKSUM_HW ) { +if (skb->ip_summed ==CHECKSUM_PARTIAL ) { txdesc->status |=cpu_to_le64 (TCPChecksumEnable | UDPChecksumEnable | IPChecksumEnable);
drivers/net/e1000/e1000_main.c +4 -4
@@ -2600,7 +2600,7 @@ e1000_tx_csum(struct e1000_adapter *adapunsigned int i;uint8_t css; -if (likely (skb->ip_summed ==CHECKSUM_HW )) { +if (likely (skb->ip_summed ==CHECKSUM_PARTIAL )) { css = skb->h.raw - skb->data; i = tx_ring->next_to_use;
@@ -2927,11 +2927,11 @@ #ifdef NETIF_F_TSO }/* reserve a descriptor for the offload context */ -if ((mss) || (skb->ip_summed ==CHECKSUM_HW )) +if ((mss) || (skb->ip_summed ==CHECKSUM_PARTIAL )) count++; count++;#else -if (skb->ip_summed ==CHECKSUM_HW ) +if (skb->ip_summed ==CHECKSUM_PARTIAL ) count++;#endif
@@ -3608,7 +3608,7 @@ e1000_rx_checksum(struct e1000_adapter **/ csum =ntohl (csum ^0xFFFF ); skb->csum = csum; - skb->ip_summed =CHECKSUM_HW ; + skb->ip_summed =CHECKSUM_COMPLETE ; } adapter->hw_csum_good++; }
drivers/net/forcedeth.c +2 -1
@@ -1503,7 +1503,8 @@ #ifdef NETIF_F_TSO tx_flags_extra =NV_TX2_TSO | (skb_shinfo (skb)->gso_size <<NV_TX2_TSO_SHIFT ); else#endif - tx_flags_extra = (skb->ip_summed ==CHECKSUM_HW ? (NV_TX2_CHECKSUM_L3 |NV_TX2_CHECKSUM_L4 ) :0 ); + tx_flags_extra = skb->ip_summed ==CHECKSUM_PARTIAL ? +NV_TX2_CHECKSUM_L3 |NV_TX2_CHECKSUM_L4 :0 ;/* vlan tag */ if (np->vlangrp &&vlan_tx_tag_present (skb)) {
drivers/net/gianfar.c +1 -1
@@ -947,7 +947,7 @@ static int gfar_start_xmit(struct sk_buf/* Set up checksumming */ if (likely ((dev->features &NETIF_F_IP_CSUM ) - && (CHECKSUM_HW == skb->ip_summed))) { + && (CHECKSUM_PARTIAL == skb->ip_summed))) { fcb =gfar_add_fcb (skb, txbdp); status |=TXBD_TOE ;gfar_tx_checksum (skb, fcb);
drivers/net/hamachi.c +1 -1
@@ -1648,7 +1648,7 @@ #ifdef RX_CHECKSUM* could do the pseudo myself and return * CHECKSUM_UNNECESSARY */ - skb->ip_summed =CHECKSUM_HW ; + skb->ip_summed =CHECKSUM_COMPLETE ; } } }
drivers/net/ibm_emac/ibm_emac_core.c +1 -1
@@ -1036,7 +1036,7 @@ static inline u16 emac_tx_csum(struct oc struct sk_buff *skb) {#if defined(CONFIG_IBM_EMAC_TAH ) -if (skb->ip_summed ==CHECKSUM_HW ) { +if (skb->ip_summed ==CHECKSUM_PARTIAL ) { ++dev->stats.tx_packets_csum;return EMAC_TX_CTRL_TAH_CSUM ; }
drivers/net/ioc3-eth.c +1 -1
@@ -1387,7 +1387,7 @@ #ifdef CONFIG_SGI_IOC3_ETH_HW_TX_CSUM* MAC header which should not be summed and the TCP/UDP pseudo headers * manually. */ -if (skb->ip_summed ==CHECKSUM_HW ) { +if (skb->ip_summed ==CHECKSUM_PARTIAL ) {int proto =ntohs (skb->nh.iph->protocol);unsigned int csoff;struct iphdr *ih = skb->nh.iph;
drivers/net/ixgb/ixgb_main.c +1 -1
@@ -1232,7 +1232,7 @@ ixgb_tx_csum(struct ixgb_adapter *adapteunsigned int i;uint8_t css, cso; -if (likely (skb->ip_summed ==CHECKSUM_HW )) { +if (likely (skb->ip_summed ==CHECKSUM_PARTIAL )) { css = skb->h.raw - skb->data; cso = (skb->h.raw + skb->csum) - skb->data;
drivers/net/mv643xx_eth.c +1 -1
@@ -1145,7 +1145,7 @@ static void eth_tx_submit_descs_for_skb( desc->byte_cnt = length; desc->buf_ptr =dma_map_single (NULL , skb->data, length,DMA_TO_DEVICE ); -if (skb->ip_summed ==CHECKSUM_HW ) { +if (skb->ip_summed ==CHECKSUM_PARTIAL ) {BUG_ON (skb->protocol !=ETH_P_IP ); cmd_sts |= ETH_GEN_TCP_UDP_CHECKSUM |
drivers/net/myri10ge/myri10ge.c +4 -4
@@ -930,7 +930,7 @@ static inline void myri10ge_vlan_ip_csum (vh->h_vlan_encapsulated_proto == htons(ETH_P_IP) || vh->h_vlan_encapsulated_proto == htons(ETH_P_IPV6))) { skb->csum = hw_csum; - skb->ip_summed =CHECKSUM_HW ; + skb->ip_summed =CHECKSUM_COMPLETE ; } }
@@ -973,7 +973,7 @@ myri10ge_rx_done(struct myri10ge_priv *mif ((skb->protocol ==ntohs (ETH_P_IP )) || (skb->protocol ==ntohs (ETH_P_IPV6 ))) { skb->csum =ntohs ((u16 ) csum); - skb->ip_summed =CHECKSUM_HW ; + skb->ip_summed =CHECKSUM_COMPLETE ; }else myri10ge_vlan_ip_csum (skb,ntohs ((u16 ) csum)); }
@@ -1897,13 +1897,13 @@ #endif /*NETIF_F_TSO */ pseudo_hdr_offset =0 ; odd_flag =0 ; flags = (MXGEFW_FLAGS_NO_TSO |MXGEFW_FLAGS_FIRST ); -if (likely (skb->ip_summed ==CHECKSUM_HW )) { +if (likely (skb->ip_summed ==CHECKSUM_PARTIAL )) { cksum_offset = (skb->h.raw - skb->data); pseudo_hdr_offset = (skb->h.raw + skb->csum) - skb->data;/* If the headers are excessively large, then we must * fall back to a software checksum */ if (unlikely (cksum_offset >255 || pseudo_hdr_offset >127 )) { -if (skb_checksum_help (skb,0 )) +if (skb_checksum_help (skb)) goto drop; cksum_offset =0 ; pseudo_hdr_offset =0 ;
drivers/net/ns83820.c +1 -1
@@ -1153,7 +1153,7 @@ again:if (!nr_frags) frag =NULL ; extsts =0 ; -if (skb->ip_summed ==CHECKSUM_HW ) { +if (skb->ip_summed ==CHECKSUM_PARTIAL ) { extsts |=EXTSTS_IPPKT ;if (IPPROTO_TCP == skb->nh.iph->protocol) extsts |=EXTSTS_TCPPKT ;
drivers/net/r8169.c +1 -1
@@ -2169,7 +2169,7 @@ static inline u32 rtl8169_tso_csum(strucif (mss)return LargeSend | ((mss & MSSMask) << MSSShift); } -if (skb->ip_summed ==CHECKSUM_HW ) { +if (skb->ip_summed ==CHECKSUM_PARTIAL ) {const struct iphdr *ip = skb->nh.iph;if (ip->protocol ==IPPROTO_TCP )
drivers/net/s2io.c +1 -1
@@ -3892,7 +3892,7 @@ #ifdef NETIF_F_TSO txdp->Control_1 |= TXD_TCP_LSO_MSS(s2io_tcp_mss(skb)); }#endif -if (skb->ip_summed ==CHECKSUM_HW ) { +if (skb->ip_summed ==CHECKSUM_PARTIAL ) { txdp->Control_2 |= (TXD_TX_CKO_IPV4_EN |TXD_TX_CKO_TCP_EN |TXD_TX_CKO_UDP_EN );
drivers/net/sk98lin/skge.c +3 -3
@@ -1559,7 +1559,7 @@ #endif pTxd->VDataHigh = (SK_U32 ) (PhysAddr >>32 ); pTxd->pMBuf = pMessage; -if (pMessage->ip_summed ==CHECKSUM_HW ) { +if (pMessage->ip_summed ==CHECKSUM_PARTIAL ) {u16 hdrlen = pMessage->h.raw - pMessage->data;u16 offset = hdrlen + pMessage->csum;
@@ -1678,7 +1678,7 @@ #endif/* ** Does the HW need to evaluate checksum for TCP or UDP packets? */ -if (pMessage->ip_summed ==CHECKSUM_HW ) { +if (pMessage->ip_summed ==CHECKSUM_PARTIAL ) {u16 hdrlen = pMessage->h.raw - pMessage->data;u16 offset = hdrlen + pMessage->csum;
@@ -2158,7 +2158,7 @@ #endif#ifdef USE_SK_RX_CHECKSUM pMsg->csum = pRxd->TcpSums &0xffff ; - pMsg->ip_summed =CHECKSUM_HW ; + pMsg->ip_summed =CHECKSUM_COMPLETE ;#else pMsg->ip_summed =CHECKSUM_NONE ;#endif
drivers/net/skge.c +2 -2
@@ -2336,7 +2336,7 @@ static int skge_xmit_frame(struct sk_buf td->dma_lo = map; td->dma_hi = map >>32 ; -if (skb->ip_summed ==CHECKSUM_HW ) { +if (skb->ip_summed ==CHECKSUM_PARTIAL ) {int offset = skb->h.raw - skb->data;/* This seems backwards, but it is what the sk98lin
@@ -2640,7 +2640,7 @@ static inline struct sk_buff *skge_rx_ge skb->dev = skge->netdev;if (skge->rx_csum) { skb->csum = csum; - skb->ip_summed =CHECKSUM_HW ; + skb->ip_summed =CHECKSUM_COMPLETE ; } skb->protocol =eth_type_trans (skb, skge->netdev);
drivers/net/sky2.c +3 -3
@@ -1164,7 +1164,7 @@ static unsigned tx_le_req(const struct sif (skb_is_gso (skb)) ++count; -if (skb->ip_summed ==CHECKSUM_HW ) +if (skb->ip_summed ==CHECKSUM_PARTIAL ) ++count;return count;
@@ -1273,7 +1273,7 @@ #ifdef SKY2_VLAN_TAG_USED#endif /* Handle TCP checksum offload */ -if (skb->ip_summed ==CHECKSUM_HW ) { +if (skb->ip_summed ==CHECKSUM_PARTIAL ) {u16 hdr = skb->h.raw - skb->data;u16 offset = hdr + skb->csum;
@@ -2001,7 +2001,7 @@ #ifdef SKY2_VLAN_TAG_USED#endif case OP_RXCHKS : skb = sky2->rx_ring[sky2->rx_next].skb; - skb->ip_summed =CHECKSUM_HW ; + skb->ip_summed =CHECKSUM_COMPLETE ; skb->csum =le16_to_cpu (status);break ;
drivers/net/starfire.c +3 -3
@@ -1230,7 +1230,7 @@ static int start_tx(struct sk_buff *skb, }#if defined(ZEROCOPY ) && defined(HAS_BROKEN_FIRMWARE ) -if (skb->ip_summed ==CHECKSUM_HW ) { +if (skb->ip_summed ==CHECKSUM_PARTIAL ) {if (skb_padto (skb, (skb->len +PADDING_MASK ) & ~PADDING_MASK ))return NETDEV_TX_OK ; }
@@ -1252,7 +1252,7 @@ #endif /* ZEROCOPY && HAS_BROKEN_FIRMWAR status |= TxDescIntr; np->reap_tx =0 ; } -if (skb->ip_summed ==CHECKSUM_HW ) { +if (skb->ip_summed ==CHECKSUM_PARTIAL ) { status |= TxCalTCP; np->stats.tx_compressed++; }
@@ -1499,7 +1499,7 @@ #endif* Until then, the printk stays. :-) -Ion */ else if (le16_to_cpu(desc->status2) & 0x0040) { - skb->ip_summed =CHECKSUM_HW ; + skb->ip_summed =CHECKSUM_COMPLETE ; skb->csum =le16_to_cpu (desc->csum);printk (KERN_DEBUG "%s: checksum_hw, status2 = %#x\n" , dev->name,le16_to_cpu (desc->status2)); }
drivers/net/sungem.c +2 -2
@@ -855,7 +855,7 @@ static int gem_rx(struct gem *gp, int wo } skb->csum =ntohs ((status &RXDCTRL_TCPCSUM ) ^0xffff ); - skb->ip_summed =CHECKSUM_HW ; + skb->ip_summed =CHECKSUM_COMPLETE ; skb->protocol =eth_type_trans (skb, gp->dev);netif_receive_skb (skb);
@@ -1026,7 +1026,7 @@ static int gem_start_xmit(struct sk_buffunsigned long flags; ctrl =0 ; -if (skb->ip_summed ==CHECKSUM_HW ) { +if (skb->ip_summed ==CHECKSUM_PARTIAL ) {u64 csum_start_off, csum_stuff_off; csum_start_off = (u64) (skb->h.raw - skb->data);
drivers/net/sunhme.c +3 -3
@@ -1207,7 +1207,7 @@ static void happy_meal_transceiver_check* flags, thus: * * skb->csum = rxd->rx_flags & 0xffff; -* skb->ip_summed = CHECKSUM_HW; +* skb->ip_summed = CHECKSUM_COMPLETE; * * before sending off the skb to the protocols, and we are good as gold. */
@@ -2074,7 +2074,7 @@ static void happy_meal_rx(struct happy_m/* This card is _fucking_ hot... */ skb->csum =ntohs (csum ^0xffff ); - skb->ip_summed =CHECKSUM_HW ; + skb->ip_summed =CHECKSUM_COMPLETE ;RXD (("len=%d csum=%4x]" , len, csum)); skb->protocol =eth_type_trans (skb, dev);
@@ -2268,7 +2268,7 @@ static int happy_meal_start_xmit(structu32 tx_flags; tx_flags =TXFLAG_OWN ; -if (skb->ip_summed ==CHECKSUM_HW ) { +if (skb->ip_summed ==CHECKSUM_PARTIAL ) {u32 csum_start_off, csum_stuff_off; csum_start_off = (u32) (skb->h.raw - skb->data);
drivers/net/tg3.c +3 -3
@@ -3841,11 +3841,11 @@ #if TG3_TSO_SUPPORT != 0 skb->h.th->check = 0; } -else if (skb->ip_summed ==CHECKSUM_HW ) +else if (skb->ip_summed ==CHECKSUM_PARTIAL ) base_flags |=TXD_FLAG_TCPUDP_CSUM ;#else mss =0 ; -if (skb->ip_summed ==CHECKSUM_HW ) +if (skb->ip_summed ==CHECKSUM_PARTIAL ) base_flags |=TXD_FLAG_TCPUDP_CSUM ;#endif #if TG3_VLAN_TAG_USED
@@ -3973,7 +3973,7 @@ static int tg3_start_xmit_dma_bug(struct entry = tp->tx_prod; base_flags =0 ; -if (skb->ip_summed ==CHECKSUM_HW ) +if (skb->ip_summed ==CHECKSUM_PARTIAL ) base_flags |=TXD_FLAG_TCPUDP_CSUM ;#if TG3_TSO_SUPPORT !=0 mss =0 ;
drivers/net/typhoon.c +1 -1
@@ -830,7 +830,7 @@ typhoon_start_tx(struct sk_buff *skb, st first_txd->addrHi = (u64)((unsigned long ) skb) >>32 ; first_txd->processFlags =0 ; -if (skb->ip_summed ==CHECKSUM_HW ) { +if (skb->ip_summed ==CHECKSUM_PARTIAL ) {/* The 3XP will figure out if this is UDP/TCP */ first_txd->processFlags |=TYPHOON_TX_PF_TCP_CHKSUM ; first_txd->processFlags |=TYPHOON_TX_PF_UDP_CHKSUM ;
drivers/net/via-rhine.c +1 -1
@@ -1185,7 +1185,7 @@ static int rhine_start_tx(struct sk_buff rp->tx_skbuff[entry] = skb;if ((rp->quirks & rqRhineI) && - (((unsigned long )skb->data &3 ) ||skb_shinfo (skb)->nr_frags !=0 || skb->ip_summed ==CHECKSUM_HW )) { + (((unsigned long )skb->data &3 ) ||skb_shinfo (skb)->nr_frags !=0 || skb->ip_summed ==CHECKSUM_PARTIAL )) {/* Must use alignment buffer. */ if (skb->len >PKT_BUF_SZ ) {/* packet too long, drop it */
drivers/net/via-velocity.c +1 -1
@@ -2002,7 +2002,7 @@ #endif* Handle hardware checksum */ if ((vptr->flags &VELOCITY_FLAGS_TX_CSUM ) - && (skb->ip_summed ==CHECKSUM_HW )) { + && (skb->ip_summed ==CHECKSUM_PARTIAL )) {struct iphdr *ip = skb->nh.iph;if (ip->protocol ==IPPROTO_TCP ) td_ptr->tdesc1.TCR |=TCR0_TCPCK ;
include/linux/netdevice.h +2 -2
@@ -973,7 +973,7 @@ extern void dev_mcast_init(void);extern int netdev_max_backlog;extern int weight_p;extern int netdev_set_master (struct net_device *dev,struct net_device *master); -extern int skb_checksum_help (struct sk_buff *skb,int inward); +extern int skb_checksum_help (struct sk_buff *skb);extern struct sk_buff *skb_gso_segment (struct sk_buff *skb,int features);#ifdef CONFIG_BUG extern void netdev_rx_csum_fault (struct net_device *dev);
@@ -1009,7 +1009,7 @@ static inline int netif_needs_gso(struct {return skb_is_gso (skb) && (!skb_gso_ok (skb, dev->features) || -unlikely (skb->ip_summed !=CHECKSUM_HW )); +unlikely (skb->ip_summed !=CHECKSUM_PARTIAL )); }#endif /* __KERNEL__ */
include/linux/skbuff.h +9 -8
@@ -34,8 +34,9 @@ #define HAVE_ALLOC_SKB /* For the drive#define HAVE_ALIGNABLE_SKB /* Ditto 8) */ #define CHECKSUM_NONE 0 -#define CHECKSUM_HW 1 +#define CHECKSUM_PARTIAL 1#define CHECKSUM_UNNECESSARY 2 +#define CHECKSUM_COMPLETE 3#define SKB_DATA_ALIGN (X ) (((X) + (SMP_CACHE_BYTES - 1)) & \ ~(SMP_CACHE_BYTES - 1))
@@ -56,17 +57,17 @@ #define SKB_MAX_ALLOC (SKB_MAX_ORDER(0,* Apparently with secret goal to sell you new device, when you * will add new protocol to your host. F.e. IPv6. 8) * -* HW: the most generic way. Device supplied checksum of _all_ +* COMPLETE: the most generic way. Device supplied checksum of _all_ * the packet as seen by netif_rx in skb->csum. * NOTE: Even if device supports only some protocols, but -* is able to produce some skb->csum, it MUST use HW, +* is able to produce some skb->csum, it MUST use COMPLETE, * not UNNECESSARY. * * B. Checksumming on output. * * NONE: skb is checksummed by protocol or csum is not required. * -* HW: device is required to csum packet as seen by hard_start_xmit +* PARTIAL: device is required to csum packet as seen by hard_start_xmit * from skb->h.raw to the end and to record the checksum * at skb->h.raw+skb->csum. *
@@ -1246,14 +1247,14 @@ static inline int skb_linearize_cow(stru* @len: length of data pulled * * After doing a pull on a received packet, you need to call this to -* update the CHECKSUM_HW checksum, or set ip_summed to CHECKSUM_NONE -* so that it can be recomputed from scratch. +* update the CHECKSUM_COMPLETE checksum, or set ip_summed to +* CHECKSUM_NONE so that it can be recomputed from scratch. */ static inline void skb_postpull_rcsum (struct sk_buff *skb,const void *start,unsigned int len) { -if (skb->ip_summed ==CHECKSUM_HW ) +if (skb->ip_summed ==CHECKSUM_COMPLETE ) skb->csum =csum_sub (skb->csum,csum_partial (start, len,0 )); }
@@ -1272,7 +1273,7 @@ static inline int pskb_trim_rcsum(struct {if (likely (len >= skb->len))return 0 ; -if (skb->ip_summed ==CHECKSUM_HW ) +if (skb->ip_summed ==CHECKSUM_COMPLETE ) skb->ip_summed =CHECKSUM_NONE ;return __pskb_trim (skb, len); }
net/core/datagram.c +2 -2
@@ -417,7 +417,7 @@ unsigned int __skb_checksum_complete(str sum = (u16 )csum_fold (skb_checksum (skb,0 , skb->len, skb->csum));if (likely (!sum)) { -if (unlikely (skb->ip_summed ==CHECKSUM_HW )) +if (unlikely (skb->ip_summed ==CHECKSUM_COMPLETE ))netdev_rx_csum_fault (skb->dev); skb->ip_summed =CHECKSUM_UNNECESSARY ; }
@@ -462,7 +462,7 @@ int skb_copy_and_csum_datagram_iovec(str goto fault;if ((unsigned short )csum_fold (csum)) goto csum_error; -if (unlikely (skb->ip_summed ==CHECKSUM_HW )) +if (unlikely (skb->ip_summed ==CHECKSUM_COMPLETE ))netdev_rx_csum_fault (skb->dev); iov->iov_len -= chunk; iov->iov_base += chunk;
net/core/dev.c +6 -6
@@ -1157,12 +1157,12 @@ EXPORT_SYMBOL(netif_device_attach);* Invalidate hardware checksum when packet is to be mangled, and * complete checksum manually on outgoing path. */ -int skb_checksum_help (struct sk_buff *skb,int inward) +int skb_checksum_help (struct sk_buff *skb) {unsigned int csum;int ret =0 , offset = skb->h.raw - skb->data; -if (inward) +if (skb->ip_summed ==CHECKSUM_COMPLETE ) goto out_set_summed;if (unlikely (skb_shinfo (skb)->gso_size)) {
@@ -1214,7 +1214,7 @@ struct sk_buff *skb_gso_segment(struct s skb->mac_len = skb->nh.raw - skb->data;__skb_pull (skb, skb->mac_len); -if (unlikely (skb->ip_summed !=CHECKSUM_HW )) { +if (unlikely (skb->ip_summed !=CHECKSUM_PARTIAL )) {if (skb_header_cloned (skb) && (err =pskb_expand_head (skb,0 ,0 ,GFP_ATOMIC )))return ERR_PTR (err);
@@ -1223,7 +1223,7 @@ struct sk_buff *skb_gso_segment(struct srcu_read_lock ();list_for_each_entry_rcu (ptype, &ptype_base[ntohs (type) &15 ], list) {if (ptype->type == type && !ptype->dev && ptype->gso_segment) { -if (unlikely (skb->ip_summed !=CHECKSUM_HW )) { +if (unlikely (skb->ip_summed !=CHECKSUM_PARTIAL )) { err = ptype->gso_send_check (skb); segs =ERR_PTR (err);if (err ||skb_gso_ok (skb, features))
@@ -1435,11 +1435,11 @@ int dev_queue_xmit(struct sk_buff *skb)/* If packet is not checksummed and device does not support * checksumming for this protocol, complete checksumming here. */ -if (skb->ip_summed ==CHECKSUM_HW && +if (skb->ip_summed ==CHECKSUM_PARTIAL && (!(dev->features &NETIF_F_GEN_CSUM ) && (!(dev->features &NETIF_F_IP_CSUM ) || skb->protocol !=htons (ETH_P_IP )))) -if (skb_checksum_help (skb,0 )) +if (skb_checksum_help (skb)) goto out_kfree_skb; gso:
net/core/netpoll.c +1 -1
@@ -110,7 +110,7 @@ static int checksum_udp(struct sk_buff * psum =csum_tcpudp_nofold (saddr, daddr, ulen,IPPROTO_UDP ,0 ); -if (skb->ip_summed ==CHECKSUM_HW && +if (skb->ip_summed ==CHECKSUM_COMPLETE && !(u16 )csum_fold (csum_add (psum, skb->csum)))return 0 ;
net/core/skbuff.c +7 -7
@@ -1395,7 +1395,7 @@ void skb_copy_and_csum_dev(const structunsigned int csum;long csstart; -if (skb->ip_summed ==CHECKSUM_HW ) +if (skb->ip_summed ==CHECKSUM_PARTIAL ) csstart = skb->h.raw - skb->data;else csstart =skb_headlen (skb);
@@ -1409,7 +1409,7 @@ void skb_copy_and_csum_dev(const struct csum =skb_copy_and_csum_bits (skb, csstart, to + csstart, skb->len - csstart,0 ); -if (skb->ip_summed ==CHECKSUM_HW ) { +if (skb->ip_summed ==CHECKSUM_PARTIAL ) {long csstuff = csstart + skb->csum; *((unsigned short *)(to + csstuff)) =csum_fold (csum);
@@ -1896,10 +1896,10 @@ int skb_append_datato_frags(struct sock* @len: length of data pulled * * This function performs an skb_pull on the packet and updates -* update the CHECKSUM_HW checksum. It should be used on receive -* path processing instead of skb_pull unless you know that the -* checksum difference is zero (e.g., a valid IP header) or you -* are setting ip_summed to CHECKSUM_NONE. +* update the CHECKSUM_COMPLETE checksum. It should be used on +* receive path processing instead of skb_pull unless you know +* that the checksum difference is zero (e.g., a valid IP header) +* or you are setting ip_summed to CHECKSUM_NONE. */ unsigned char *skb_pull_rcsum (struct sk_buff *skb,unsigned int len) {
@@ -1992,7 +1992,7 @@ struct sk_buff *skb_segment(struct sk_bu frag =skb_shinfo (nskb)->frags; k =0 ; - nskb->ip_summed =CHECKSUM_HW ; + nskb->ip_summed =CHECKSUM_PARTIAL ; nskb->csum = skb->csum;memcpy (skb_put (nskb, hsize), skb->data + offset, hsize);
net/ipv4/icmp.c +1 -1
@@ -930,7 +930,7 @@ int icmp_rcv(struct sk_buff *skb)ICMP_INC_STATS_BH (ICMP_MIB_INMSGS );switch (skb->ip_summed) { -case CHECKSUM_HW : +case CHECKSUM_COMPLETE :if (!(u16 )csum_fold (skb->csum))break ;/* fall through */
net/ipv4/igmp.c +1 -1
@@ -931,7 +931,7 @@ int igmp_rcv(struct sk_buff *skb) goto drop;switch (skb->ip_summed) { -case CHECKSUM_HW : +case CHECKSUM_COMPLETE :if (!(u16 )csum_fold (skb->csum))break ;/* fall through */
net/ipv4/ip_fragment.c +1 -1
@@ -665,7 +665,7 @@ static struct sk_buff *ip_frag_reasm(str head->len += fp->len;if (head->ip_summed != fp->ip_summed) head->ip_summed =CHECKSUM_NONE ; -else if (head->ip_summed ==CHECKSUM_HW ) +else if (head->ip_summed ==CHECKSUM_COMPLETE ) head->csum =csum_add (head->csum, fp->csum); head->truesize += fp->truesize;atomic_sub (fp->truesize, &ip_frag_mem);
net/ipv4/ip_gre.c +2 -2
@@ -576,7 +576,7 @@ static int ipgre_rcv(struct sk_buff *skbif (flags&GRE_CSUM ) {switch (skb->ip_summed) { -case CHECKSUM_HW : +case CHECKSUM_COMPLETE : csum = (u16 )csum_fold (skb->csum);if (!csum)break ;
@@ -584,7 +584,7 @@ static int ipgre_rcv(struct sk_buff *skbcase CHECKSUM_NONE : skb->csum =0 ; csum =__skb_checksum_complete (skb); - skb->ip_summed =CHECKSUM_HW ; + skb->ip_summed =CHECKSUM_COMPLETE ; } offset +=4 ; }
net/ipv4/ip_output.c +3 -3
@@ -679,7 +679,7 @@ ip_generic_getfrag(void *from, char *to, {struct iovec *iov = from; -if (skb->ip_summed ==CHECKSUM_HW ) { +if (skb->ip_summed ==CHECKSUM_PARTIAL ) {if (memcpy_fromiovecend (to, iov, offset, len) <0 )return -EFAULT ; }else {
@@ -735,7 +735,7 @@ static inline int ip_ufo_append_data(str/* initialize protocol header pointer */ skb->h.raw = skb->data + fragheaderlen; - skb->ip_summed =CHECKSUM_HW ; + skb->ip_summed =CHECKSUM_PARTIAL ; skb->csum =0 ; sk->sk_sndmsg_off =0 ; }
@@ -843,7 +843,7 @@ int ip_append_data(struct sock *sk, length + fragheaderlen <= mtu && rt->u.dst.dev->features & NETIF_F_ALL_CSUM && !exthdrlen) - csummode =CHECKSUM_HW ; + csummode =CHECKSUM_PARTIAL ; inet->cork.length += length; if (((length > mtu) && (sk->sk_protocol == IPPROTO_UDP)) &&
net/ipv4/ipvs/ip_vs_proto_tcp.c +4 -4
@@ -151,7 +151,7 @@ tcp_snat_handler(struct sk_buff **pskb,/* Only port and addr are changed, do fast csum update */ tcp_fast_csum_update (tcph, cp->daddr, cp->vaddr, cp->dport, cp->vport); -if ((*pskb)->ip_summed ==CHECKSUM_HW ) +if ((*pskb)->ip_summed ==CHECKSUM_COMPLETE ) (*pskb)->ip_summed =CHECKSUM_NONE ; }else {/* full checksum calculation */
@@ -204,7 +204,7 @@ tcp_dnat_handler(struct sk_buff **pskb,/* Only port and addr are changed, do fast csum update */ tcp_fast_csum_update (tcph, cp->vaddr, cp->daddr, cp->vport, cp->dport); -if ((*pskb)->ip_summed ==CHECKSUM_HW ) +if ((*pskb)->ip_summed ==CHECKSUM_COMPLETE ) (*pskb)->ip_summed =CHECKSUM_NONE ; }else {/* full checksum calculation */
@@ -229,7 +229,7 @@ tcp_csum_check(struct sk_buff *skb, struswitch (skb->ip_summed) {case CHECKSUM_NONE : skb->csum =skb_checksum (skb, tcphoff, skb->len - tcphoff,0 ); -case CHECKSUM_HW : +case CHECKSUM_COMPLETE :if (csum_tcpudp_magic (skb->nh.iph->saddr, skb->nh.iph->daddr, skb->len - tcphoff, skb->nh.iph->protocol, skb->csum)) {
@@ -239,7 +239,7 @@ tcp_csum_check(struct sk_buff *skb, stru }break ;default : -/* CHECKSUM_UNNECESSARY */ +/* No need to checksum. */ break ; }
net/ipv4/ipvs/ip_vs_proto_udp.c +4 -4
@@ -161,7 +161,7 @@ udp_snat_handler(struct sk_buff **pskb,/* Only port and addr are changed, do fast csum update */ udp_fast_csum_update (udph, cp->daddr, cp->vaddr, cp->dport, cp->vport); -if ((*pskb)->ip_summed ==CHECKSUM_HW ) +if ((*pskb)->ip_summed ==CHECKSUM_COMPLETE ) (*pskb)->ip_summed =CHECKSUM_NONE ; }else {/* full checksum calculation */
@@ -216,7 +216,7 @@ udp_dnat_handler(struct sk_buff **pskb,/* Only port and addr are changed, do fast csum update */ udp_fast_csum_update (udph, cp->vaddr, cp->daddr, cp->vport, cp->dport); -if ((*pskb)->ip_summed ==CHECKSUM_HW ) +if ((*pskb)->ip_summed ==CHECKSUM_COMPLETE ) (*pskb)->ip_summed =CHECKSUM_NONE ; }else {/* full checksum calculation */
@@ -250,7 +250,7 @@ udp_csum_check(struct sk_buff *skb, strucase CHECKSUM_NONE : skb->csum =skb_checksum (skb, udphoff, skb->len - udphoff,0 ); -case CHECKSUM_HW : +case CHECKSUM_COMPLETE : if (csum_tcpudp_magic(skb->nh.iph->saddr, skb->nh.iph->daddr, skb->len - udphoff,
@@ -262,7 +262,7 @@ udp_csum_check(struct sk_buff *skb, stru }break ;default : -/* CHECKSUM_UNNECESSARY */ +/* No need to checksum. */ break ; } }
net/ipv4/netfilter.c +1 -1
@@ -168,7 +168,7 @@ unsigned int nf_ip_checksum(struct sk_buunsigned int csum =0 ;switch (skb->ip_summed) { -case CHECKSUM_HW : +case CHECKSUM_COMPLETE :if (hook !=NF_IP_PRE_ROUTING && hook !=NF_IP_LOCAL_IN )break ; if ((protocol == 0 && !(u16)csum_fold(skb->csum)) ||
net/ipv4/netfilter/ip_conntrack_proto_tcp.c +1 -2
@@ -865,8 +865,7 @@ static int tcp_error(struct sk_buff *skb/* Checksum invalid? Ignore. * We skip checking packets on the outgoing path -* because the semantic of CHECKSUM_HW is different there -* and moreover root might send raw packets. +* because it is assumed to be correct. */ /* FIXME: Source route IP option packets --RR */ if (ip_conntrack_checksum && hooknum == NF_IP_PRE_ROUTING &&
net/ipv4/netfilter/ip_conntrack_proto_udp.c +1 -2
@@ -117,8 +117,7 @@ static int udp_error(struct sk_buff *skb/* Checksum invalid? Ignore. * We skip checking packets on the outgoing path -* because the semantic of CHECKSUM_HW is different there -* and moreover root might send raw packets. +* because the checksum is assumed to be correct. * FIXME: Source route IP option packets --RR */ if (ip_conntrack_checksum && hooknum ==NF_IP_PRE_ROUTING &&nf_ip_checksum (skb, hooknum, iph->ihl *4 ,IPPROTO_UDP )) {
net/ipv4/netfilter/ip_nat_standalone.c +3 -2
@@ -111,8 +111,9 @@ ip_nat_fn(unsigned int hooknum, & htons(IP_MF|IP_OFFSET)));/* If we had a hardware checksum before, it's now invalid */ -if ((*pskb)->ip_summed ==CHECKSUM_HW ) -if (skb_checksum_help (*pskb, (out ==NULL ))) +if ((*pskb)->ip_summed ==CHECKSUM_PARTIAL || + (*pskb)->ip_summed ==CHECKSUM_COMPLETE ) +if (skb_checksum_help (*pskb))return NF_DROP ; ct =ip_conntrack_get (*pskb, &ctinfo);
net/ipv4/netfilter/ip_queue.c +3 -3
@@ -208,9 +208,9 @@ ipq_build_packet_message(struct ipq_queubreak ;case IPQ_COPY_PACKET : -if (entry->skb->ip_summed ==CHECKSUM_HW && - (*errp =skb_checksum_help (entry->skb, - entry->info->outdev ==NULL ))) { +if ((entry->skb->ip_summed ==CHECKSUM_PARTIAL || + entry->skb->ip_summed ==CHECKSUM_COMPLETE ) && + (*errp =skb_checksum_help (entry->skb))) {read_unlock_bh (&queue_lock);return NULL ; }
net/ipv4/netfilter/ipt_ECN.c +5 -4
@@ -49,7 +49,7 @@ set_ect_ip(struct sk_buff **pskb, const/* Return 0 if there was an error. */ static inline int -set_ect_tcp (struct sk_buff **pskb,const struct ipt_ECN_info *einfo,int inward) +set_ect_tcp (struct sk_buff **pskb,const struct ipt_ECN_info *einfo) {struct tcphdr _tcph, *tcph;u_int16_t diffs[2 ];
@@ -70,8 +70,9 @@ set_ect_tcp(struct sk_buff **pskb, constreturn 0 ; tcph = (void *)(*pskb)->nh.iph + (*pskb)->nh.iph->ihl*4 ; -if ((*pskb)->ip_summed ==CHECKSUM_HW && -skb_checksum_help (*pskb, inward)) +if (((*pskb)->ip_summed ==CHECKSUM_PARTIAL || + (*pskb)->ip_summed ==CHECKSUM_COMPLETE ) && +skb_checksum_help (*pskb))return 0 ; diffs[0 ] = ((u_int16_t *)tcph)[6 ];
@@ -106,7 +107,7 @@ target(struct sk_buff **pskb,if (einfo->operation & (IPT_ECN_OP_SET_ECE |IPT_ECN_OP_SET_CWR ) && (*pskb)->nh.iph->protocol ==IPPROTO_TCP ) -if (!set_ect_tcp (pskb, einfo, (out ==NULL ))) +if (!set_ect_tcp (pskb, einfo))return NF_DROP ;return IPT_CONTINUE ;
net/ipv4/netfilter/ipt_TCPMSS.c +3 -2
@@ -62,8 +62,9 @@ ipt_tcpmss_target(struct sk_buff **pskb,if (!skb_make_writable (pskb, (*pskb)->len))return NF_DROP ; -if ((*pskb)->ip_summed ==CHECKSUM_HW && -skb_checksum_help (*pskb, out ==NULL )) +if (((*pskb)->ip_summed ==CHECKSUM_PARTIAL || + (*pskb)->ip_summed ==CHECKSUM_COMPLETE ) && +skb_checksum_help (*pskb))return NF_DROP ; iph = (*pskb)->nh.iph;
net/ipv4/tcp.c +4 -4
@@ -568,7 +568,7 @@ new_segment: skb->truesize += copy; sk->sk_wmem_queued += copy; sk->sk_forward_alloc -= copy; - skb->ip_summed =CHECKSUM_HW ; + skb->ip_summed =CHECKSUM_PARTIAL ; tp->write_seq += copy;TCP_SKB_CB (skb)->end_seq += copy;skb_shinfo (skb)->gso_segs =0 ;
@@ -723,7 +723,7 @@ new_segment:* Check whether we can use HW checksum. */ if (sk->sk_route_caps &NETIF_F_ALL_CSUM ) - skb->ip_summed =CHECKSUM_HW ; + skb->ip_summed =CHECKSUM_PARTIAL ;skb_entail (sk, tp, skb); copy = size_goal;
@@ -2205,7 +2205,7 @@ struct sk_buff *tcp_tso_segment(struct s th->fin = th->psh =0 ; th->check = ~csum_fold (th->check + delta); -if (skb->ip_summed !=CHECKSUM_HW ) +if (skb->ip_summed !=CHECKSUM_PARTIAL ) th->check =csum_fold (csum_partial (skb->h.raw, thlen, skb->csum));
@@ -2219,7 +2219,7 @@ struct sk_buff *tcp_tso_segment(struct s delta =htonl (oldlen + (skb->tail - skb->h.raw) + skb->data_len); th->check = ~csum_fold (th->check + delta); -if (skb->ip_summed !=CHECKSUM_HW ) +if (skb->ip_summed !=CHECKSUM_PARTIAL ) th->check =csum_fold (csum_partial (skb->h.raw, thlen, skb->csum));
net/ipv4/tcp_ipv4.c +3 -3
@@ -484,7 +484,7 @@ void tcp_v4_send_check(struct sock *sk,struct inet_sock *inet =inet_sk (sk);struct tcphdr *th = skb->h.th; -if (skb->ip_summed ==CHECKSUM_HW ) { +if (skb->ip_summed ==CHECKSUM_PARTIAL ) { th->check = ~tcp_v4_check (th, len, inet->saddr, inet->daddr,0 ); skb->csum = offsetof(struct tcphdr , check); }else {
@@ -509,7 +509,7 @@ int tcp_v4_gso_send_check(struct sk_buff th->check =0 ; th->check = ~tcp_v4_check (th, skb->len, iph->saddr, iph->daddr,0 ); skb->csum = offsetof(struct tcphdr , check); - skb->ip_summed =CHECKSUM_HW ; + skb->ip_summed =CHECKSUM_PARTIAL ;return 0 ; }
@@ -973,7 +973,7 @@ #endifstatic int tcp_v4_checksum_init (struct sk_buff *skb) { -if (skb->ip_summed ==CHECKSUM_HW ) { +if (skb->ip_summed ==CHECKSUM_COMPLETE ) {if (!tcp_v4_check (skb->h.th, skb->len, skb->nh.iph->saddr, skb->nh.iph->daddr, skb->csum)) { skb->ip_summed =CHECKSUM_UNNECESSARY ;
net/ipv4/tcp_output.c +8 -10
@@ -575,7 +575,7 @@ int tcp_fragment(struct sock *sk, structTCP_SKB_CB (buff)->sacked =TCP_SKB_CB (skb)->sacked;TCP_SKB_CB (skb)->sacked &= ~TCPCB_AT_TAIL ; -if (!skb_shinfo (skb)->nr_frags && skb->ip_summed !=CHECKSUM_HW ) { +if (!skb_shinfo (skb)->nr_frags && skb->ip_summed !=CHECKSUM_PARTIAL ) {/* Copy and checksum data tail into the new buffer. */ buff->csum =csum_partial_copy_nocheck (skb->data + len,skb_put (buff, nsize), nsize,0 );
@@ -584,7 +584,7 @@ int tcp_fragment(struct sock *sk, struct skb->csum =csum_block_sub (skb->csum, buff->csum, len); }else { - skb->ip_summed =CHECKSUM_HW ; + skb->ip_summed =CHECKSUM_PARTIAL ;skb_split (skb, buff, len); }
@@ -687,7 +687,7 @@ int tcp_trim_head(struct sock *sk, struc__pskb_trim_head (skb, len -skb_headlen (skb));TCP_SKB_CB (skb)->seq += len; - skb->ip_summed =CHECKSUM_HW ; + skb->ip_summed =CHECKSUM_PARTIAL ; skb->truesize -= len; sk->sk_wmem_queued -= len;
@@ -1060,7 +1060,7 @@ static int tso_fragment(struct sock *sk,/* This packet was never sent out yet, so no SACK bits. */ TCP_SKB_CB (buff)->sacked =0 ; - buff->ip_summed = skb->ip_summed =CHECKSUM_HW ; + buff->ip_summed = skb->ip_summed =CHECKSUM_PARTIAL ;skb_split (skb, buff, len);/* Fix up tso_factor for both original and new SKB. */
@@ -1204,8 +1204,7 @@ static int tcp_mtu_probe(struct sock *skTCP_SKB_CB (nskb)->flags =TCPCB_FLAG_ACK ;TCP_SKB_CB (nskb)->sacked =0 ; nskb->csum =0 ; -if (skb->ip_summed ==CHECKSUM_HW ) - nskb->ip_summed =CHECKSUM_HW ; + nskb->ip_summed = skb->ip_summed; len =0 ;while (len < probe_size) {
@@ -1229,7 +1228,7 @@ static int tcp_mtu_probe(struct sock *sk ~(TCPCB_FLAG_FIN |TCPCB_FLAG_PSH );if (!skb_shinfo (skb)->nr_frags) {skb_pull (skb, copy); -if (skb->ip_summed !=CHECKSUM_HW ) +if (skb->ip_summed !=CHECKSUM_PARTIAL ) skb->csum =csum_partial (skb->data, skb->len,0 ); }else {__pskb_trim_head (skb, copy);
@@ -1570,10 +1569,9 @@ static void tcp_retrans_try_collapse(strmemcpy (skb_put (skb, next_skb_size), next_skb->data, next_skb_size); -if (next_skb->ip_summed ==CHECKSUM_HW ) - skb->ip_summed =CHECKSUM_HW ; + skb->ip_summed = next_skb->ip_summed; -if (skb->ip_summed !=CHECKSUM_HW ) +if (skb->ip_summed !=CHECKSUM_PARTIAL ) skb->csum =csum_block_add (skb->csum, next_skb->csum, skb_size);/* Update sequence range on original skb. */
net/ipv4/udp.c +3 -3
@@ -429,7 +429,7 @@ static int udp_push_pending_frames(struc/* * Only one fragment on the socket. */ -if (skb->ip_summed ==CHECKSUM_HW ) { +if (skb->ip_summed ==CHECKSUM_PARTIAL ) { skb->csum = offsetof(struct udphdr , check); uh->check = ~csum_tcpudp_magic (fl->fl4_src, fl->fl4_dst, up->len,IPPROTO_UDP ,0 );
@@ -448,7 +448,7 @@ static int udp_push_pending_frames(struc* fragments on the socket so that all csums of sk_buffs * should be together. */ -if (skb->ip_summed ==CHECKSUM_HW ) { +if (skb->ip_summed ==CHECKSUM_PARTIAL ) {int offset = (unsigned char *)uh - skb->data; skb->csum =skb_checksum (skb, offset, skb->len - offset,0 );
@@ -1088,7 +1088,7 @@ static void udp_checksum_init(struct sk_ {if (uh->check ==0 ) { skb->ip_summed =CHECKSUM_UNNECESSARY ; - }else if (skb->ip_summed ==CHECKSUM_HW ) { + }else if (skb->ip_summed ==CHECKSUM_COMPLETE ) {if (!udp_check (uh, ulen, saddr, daddr, skb->csum)) skb->ip_summed =CHECKSUM_UNNECESSARY ; }
net/ipv4/xfrm4_output.c +2 -2
@@ -48,8 +48,8 @@ static int xfrm4_output_one(struct sk_bustruct xfrm_state *x = dst->xfrm;int err; -if (skb->ip_summed ==CHECKSUM_HW ) { - err =skb_checksum_help (skb,0 ); +if (skb->ip_summed ==CHECKSUM_PARTIAL ) { + err =skb_checksum_help (skb);if (err) goto error_nolock; }
net/ipv6/exthdrs.c +1 -1
@@ -294,7 +294,7 @@ looped_back: hdr = (struct ipv6_rt_hdr *) skb2->h.raw; } -if (skb->ip_summed ==CHECKSUM_HW ) +if (skb->ip_summed ==CHECKSUM_COMPLETE ) skb->ip_summed =CHECKSUM_NONE ; i = n - --hdr->segments_left;
net/ipv6/icmp.c +1 -1
@@ -606,7 +606,7 @@ static int icmpv6_rcv(struct sk_buff **p/* Perform checksum. */ switch (skb->ip_summed) { -case CHECKSUM_HW : +case CHECKSUM_COMPLETE :if (!csum_ipv6_magic (saddr, daddr, skb->len,IPPROTO_ICMPV6 , skb->csum))break ;
net/ipv6/ip6_output.c +1 -1
@@ -866,7 +866,7 @@ static inline int ip6_ufo_append_data(st/* initialize protocol header pointer */ skb->h.raw = skb->data + fragheaderlen; - skb->ip_summed =CHECKSUM_HW ; + skb->ip_summed =CHECKSUM_PARTIAL ; skb->csum =0 ; sk->sk_sndmsg_off =0 ; }
net/ipv6/netfilter.c +1 -1
@@ -87,7 +87,7 @@ unsigned int nf_ip6_checksum(struct sk_bunsigned int csum =0 ; switch (skb->ip_summed) { - case CHECKSUM_HW: + case CHECKSUM_COMPLETE: if (hook != NF_IP6_PRE_ROUTING && hook != NF_IP6_LOCAL_IN) break; if (!csum_ipv6_magic(&ip6h->saddr, &ip6h->daddr,
net/ipv6/netfilter/ip6_queue.c +3 -3
@@ -206,9 +206,9 @@ ipq_build_packet_message(struct ipq_queubreak ;case IPQ_COPY_PACKET : -if (entry->skb->ip_summed ==CHECKSUM_HW && - (*errp =skb_checksum_help (entry->skb, - entry->info->outdev ==NULL ))) { +if ((entry->skb->ip_summed ==CHECKSUM_PARTIAL || + entry->skb->ip_summed ==CHECKSUM_COMPLETE ) && + (*errp =skb_checksum_help (entry->skb))) {read_unlock_bh (&queue_lock);return NULL ; }
net/ipv6/netfilter/nf_conntrack_reasm.c +3 -3
@@ -408,7 +408,7 @@ static int nf_ct_frag6_queue(struct nf_creturn -1 ; } -if (skb->ip_summed ==CHECKSUM_HW ) +if (skb->ip_summed ==CHECKSUM_COMPLETE ) skb->csum = csum_sub(skb->csum, csum_partial(skb->nh.raw, (u8*)(fhdr + 1) - skb->nh.raw,
@@ -640,7 +640,7 @@ nf_ct_frag6_reasm(struct nf_ct_frag6_que head->len += fp->len;if (head->ip_summed != fp->ip_summed) head->ip_summed =CHECKSUM_NONE ; -else if (head->ip_summed ==CHECKSUM_HW ) +else if (head->ip_summed ==CHECKSUM_COMPLETE ) head->csum =csum_add (head->csum, fp->csum); head->truesize += fp->truesize;atomic_sub (fp->truesize, &nf_ct_frag6_mem);
@@ -652,7 +652,7 @@ nf_ct_frag6_reasm(struct nf_ct_frag6_que head->nh.ipv6h->payload_len =htons (payload_len);/* Yes, and fold redundant checksum back. 8) */ -if (head->ip_summed ==CHECKSUM_HW ) +if (head->ip_summed ==CHECKSUM_COMPLETE ) head->csum =csum_partial (head->nh.raw, head->h.raw-head->nh.raw, head->csum); fq->fragments =NULL ;
net/ipv6/raw.c +1 -1
@@ -334,7 +334,7 @@ int rawv6_rcv(struct sock *sk, struct skif (!rp->checksum) skb->ip_summed =CHECKSUM_UNNECESSARY ; - if (skb->ip_summed == CHECKSUM_HW) { + if (skb->ip_summed == CHECKSUM_COMPLETE) { skb_postpull_rcsum(skb, skb->nh.raw, skb->h.raw - skb->nh.raw); if (!csum_ipv6_magic(&skb->nh.ipv6h->saddr,
net/ipv6/reassembly.c +3 -3
@@ -433,7 +433,7 @@ static void ip6_frag_queue(struct frag_qreturn ; } -if (skb->ip_summed ==CHECKSUM_HW ) +if (skb->ip_summed ==CHECKSUM_COMPLETE ) skb->csum =csum_sub (skb->csum,csum_partial (skb->nh.raw, (u8 *)(fhdr+1 )-skb->nh.raw,0 ));
@@ -647,7 +647,7 @@ static int ip6_frag_reasm(struct frag_qu head->len += fp->len;if (head->ip_summed != fp->ip_summed) head->ip_summed =CHECKSUM_NONE ; -else if (head->ip_summed ==CHECKSUM_HW ) +else if (head->ip_summed ==CHECKSUM_COMPLETE ) head->csum =csum_add (head->csum, fp->csum); head->truesize += fp->truesize;atomic_sub (fp->truesize, &ip6_frag_mem);
@@ -662,7 +662,7 @@ static int ip6_frag_reasm(struct frag_qu *skb_in = head;/* Yes, and fold redundant checksum back. 8) */ -if (head->ip_summed ==CHECKSUM_HW ) +if (head->ip_summed ==CHECKSUM_COMPLETE ) head->csum =csum_partial (head->nh.raw, head->h.raw-head->nh.raw, head->csum);IP6_INC_STATS_BH (IPSTATS_MIB_REASMOKS );
net/ipv6/tcp_ipv6.c +3 -3
@@ -545,7 +545,7 @@ static void tcp_v6_send_check(struct socstruct ipv6_pinfo *np =inet6_sk (sk);struct tcphdr *th = skb->h.th; -if (skb->ip_summed ==CHECKSUM_HW ) { +if (skb->ip_summed ==CHECKSUM_PARTIAL ) { th->check = ~csum_ipv6_magic (&np->saddr, &np->daddr, len,IPPROTO_TCP ,0 ); skb->csum = offsetof(struct tcphdr , check); }else {
@@ -570,7 +570,7 @@ static int tcp_v6_gso_send_check(struct th->check = ~csum_ipv6_magic (&ipv6h->saddr, &ipv6h->daddr, skb->len,IPPROTO_TCP ,0 ); skb->csum = offsetof(struct tcphdr , check); - skb->ip_summed =CHECKSUM_HW ; + skb->ip_summed =CHECKSUM_PARTIAL ;return 0 ; }
@@ -1033,7 +1033,7 @@ out:static int tcp_v6_checksum_init (struct sk_buff *skb) { -if (skb->ip_summed ==CHECKSUM_HW ) { +if (skb->ip_summed ==CHECKSUM_COMPLETE ) {if (!tcp_v6_check (skb->h.th,skb->len,&skb->nh.ipv6h->saddr, &skb->nh.ipv6h->daddr,skb->csum)) { skb->ip_summed =CHECKSUM_UNNECESSARY ;
net/ipv6/udp.c +1 -1
@@ -475,7 +475,7 @@ static int udpv6_rcv(struct sk_buff **ps uh = skb->h.uh; } -if (skb->ip_summed ==CHECKSUM_HW && +if (skb->ip_summed ==CHECKSUM_COMPLETE && !csum_ipv6_magic (saddr, daddr, ulen,IPPROTO_UDP , skb->csum)) skb->ip_summed =CHECKSUM_UNNECESSARY ;
net/ipv6/xfrm6_output.c +2 -2
@@ -41,8 +41,8 @@ static int xfrm6_output_one(struct sk_bustruct xfrm_state *x = dst->xfrm;int err; -if (skb->ip_summed ==CHECKSUM_HW ) { - err =skb_checksum_help (skb,0 ); +if (skb->ip_summed ==CHECKSUM_PARTIAL ) { + err =skb_checksum_help (skb);if (err) goto error_nolock; }
net/netfilter/nf_conntrack_proto_tcp.c +1 -2
@@ -823,8 +823,7 @@ static int tcp_error(struct sk_buff *skb/* Checksum invalid? Ignore. * We skip checking packets on the outgoing path -* because the semantic of CHECKSUM_HW is different there -* and moreover root might send raw packets. +* because the checksum is assumed to be correct. */ /* FIXME: Source route IP option packets --RR */ if (nf_conntrack_checksum &&
net/netfilter/nf_conntrack_proto_udp.c +1 -2
@@ -131,8 +131,7 @@ static int udp_error(struct sk_buff *skb/* Checksum invalid? Ignore. * We skip checking packets on the outgoing path -* because the semantic of CHECKSUM_HW is different there -* and moreover root might send raw packets. +* because the checksum is assumed to be correct. * FIXME: Source route IP option packets --RR */ if (nf_conntrack_checksum && ((pf == PF_INET && hooknum == NF_IP_PRE_ROUTING) ||
net/netfilter/nfnetlink_queue.c +3 -3
@@ -377,9 +377,9 @@ #endifbreak ;case NFQNL_COPY_PACKET : -if (entskb->ip_summed ==CHECKSUM_HW && - (*errp =skb_checksum_help (entskb, - outdev ==NULL ))) { +if ((entskb->ip_summed ==CHECKSUM_PARTIAL || + entskb->ip_summed ==CHECKSUM_COMPLETE ) && + (*errp =skb_checksum_help (entskb))) {spin_unlock_bh (&queue->lock);return NULL ; }
net/packet/af_packet.c +1 -1
@@ -586,7 +586,7 @@ static int tpacket_rcv(struct sk_buff *selse if (skb->pkt_type ==PACKET_OUTGOING ) {/* Special case: outgoing packets have ll header at head */ skb_pull (skb, skb->nh.raw - skb->data); -if (skb->ip_summed ==CHECKSUM_HW ) +if (skb->ip_summed ==CHECKSUM_PARTIAL ) status |=TP_STATUS_CSUMNOTREADY ; } }
net/sched/sch_netem.c +2 -2
@@ -192,8 +192,8 @@ static int netem_enqueue(struct sk_buff*/ if (q->corrupt && q->corrupt >=get_crandom (&q->corrupt_cor)) {if (!(skb =skb_unshare (skb,GFP_ATOMIC )) - || (skb->ip_summed ==CHECKSUM_HW - &&skb_checksum_help (skb,0 ))) { + || (skb->ip_summed ==CHECKSUM_PARTIAL + &&skb_checksum_help (skb))) { sch->qstats.drops++;return NET_XMIT_DROP ; }
net/sunrpc/socklib.c +1 -1
@@ -168,7 +168,7 @@ int csum_partial_copy_to_xdr(struct xdr_return -1 ;if ((unsigned short )csum_fold (desc.csum))return -1 ; -if (unlikely (skb->ip_summed ==CHECKSUM_HW )) +if (unlikely (skb->ip_summed ==CHECKSUM_COMPLETE ))netdev_rx_csum_fault (skb->dev);return 0 ; no_checksum:
David Miller
maintainerFrom: Patrick McHardy <[email protected]>
Date: Sat, 05 Aug 2006 09:25:23 +0200
Quoted 3 lines
This is the latest version of the checksum patches. Retested everything, I think they're ready to go in. On top of net-2.6.19 from a few minutes ago.
All 3 patches applied, thanks a lot for doing this work Patrick.