mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-10-31 08:44:41 +00:00 
			
		
		
		
	[NET]: Replace CHECKSUM_HW by CHECKSUM_PARTIAL/CHECKSUM_COMPLETE
Replace CHECKSUM_HW by CHECKSUM_PARTIAL (for outgoing packets, whose checksum still needs to be completed) and CHECKSUM_COMPLETE (for incoming packets, device supplied full checksum). Patch originally from Herbert Xu, updated by myself for 2.6.18-rc3. Signed-off-by: Patrick McHardy <kaber@trash.net> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									8584d6df39
								
							
						
					
					
						commit
						84fa7933a3
					
				
					 72 changed files with 168 additions and 169 deletions
				
			
		|  | @ -1912,7 +1912,7 @@ he_service_rbrq(struct he_dev *he_dev, int group) | |||
| 				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); | ||||
| 				} | ||||
|  |  | |||
|  | @ -2077,7 +2077,7 @@ boomerang_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 
 | ||||
| 	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); | ||||
|  |  | |||
|  | @ -813,7 +813,7 @@ static int cp_start_xmit (struct sk_buff *skb, struct net_device *dev) | |||
| 
 | ||||
| 		if (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 @@ static int cp_start_xmit (struct sk_buff *skb, struct net_device *dev) | |||
| 			if (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 @@ static int cp_start_xmit (struct sk_buff *skb, struct net_device *dev) | |||
| 		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 | | ||||
|  |  | |||
|  | @ -2040,7 +2040,7 @@ static void ace_rx_int(struct net_device *dev, u32 rxretprd, u32 rxretcsm) | |||
| 		 */ | ||||
| 		if (bd_flags & BD_FLG_TCP_UDP_SUM) { | ||||
| 			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 @@ restart: | |||
| 
 | ||||
| 		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 @@ restart: | |||
| 					       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); | ||||
| 
 | ||||
|  |  | |||
|  | @ -4423,7 +4423,7 @@ bnx2_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 	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; | ||||
| 	} | ||||
| 
 | ||||
|  |  | |||
|  | @ -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(struct cas *cp, int ring, | |||
| 	} | ||||
| 
 | ||||
| 	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); | ||||
|  |  | |||
|  | @ -1470,9 +1470,9 @@ int t1_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 		} | ||||
| 
 | ||||
| 		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 @@ int t1_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 		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; | ||||
|  |  | |||
|  | @ -611,7 +611,7 @@ start_xmit (struct sk_buff *skb, struct net_device *dev) | |||
| 	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); | ||||
|  |  | |||
|  | @ -2600,7 +2600,7 @@ e1000_tx_csum(struct e1000_adapter *adapter, struct e1000_tx_ring *tx_ring, | |||
| 	unsigned 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 @@ e1000_xmit_frame(struct sk_buff *skb, struct net_device *netdev) | |||
| 	} | ||||
| 
 | ||||
| 	/* 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 *adapter, | |||
| 		 */ | ||||
| 		csum = ntohl(csum ^ 0xFFFF); | ||||
| 		skb->csum = csum; | ||||
| 		skb->ip_summed = CHECKSUM_HW; | ||||
| 		skb->ip_summed = CHECKSUM_COMPLETE; | ||||
| 	} | ||||
| 	adapter->hw_csum_good++; | ||||
| } | ||||
|  |  | |||
|  | @ -1503,7 +1503,8 @@ static int nv_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 		tx_flags_extra = NV_TX2_TSO | (skb_shinfo(skb)->gso_size << NV_TX2_TSO_SHIFT); | ||||
| 	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)) { | ||||
|  |  | |||
|  | @ -947,7 +947,7 @@ static int gfar_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 
 | ||||
| 	/* 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); | ||||
|  |  | |||
|  | @ -1648,7 +1648,7 @@ static int hamachi_rx(struct net_device *dev) | |||
| 						* could do the pseudo myself and return | ||||
| 						* CHECKSUM_UNNECESSARY | ||||
| 						*/ | ||||
| 						skb->ip_summed = CHECKSUM_HW; | ||||
| 						skb->ip_summed = CHECKSUM_COMPLETE; | ||||
| 					} | ||||
| 				}	 | ||||
| 			} | ||||
|  |  | |||
|  | @ -1036,7 +1036,7 @@ static inline u16 emac_tx_csum(struct ocp_enet_private *dev, | |||
| 			       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; | ||||
| 	} | ||||
|  |  | |||
|  | @ -1387,7 +1387,7 @@ static int ioc3_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 	 * MAC header which should not be summed and the TCP/UDP pseudo headers | ||||
| 	 * 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; | ||||
|  |  | |||
|  | @ -1232,7 +1232,7 @@ ixgb_tx_csum(struct ixgb_adapter *adapter, struct sk_buff *skb) | |||
| 	unsigned 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; | ||||
| 
 | ||||
|  |  | |||
|  | @ -1147,7 +1147,7 @@ static void eth_tx_submit_descs_for_skb(struct mv643xx_private *mp, | |||
| 	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 | | ||||
|  |  | |||
|  | @ -930,7 +930,7 @@ static inline void myri10ge_vlan_ip_csum(struct sk_buff *skb, u16 hw_csum) | |||
| 	    (vh->h_vlan_encapsulated_proto == htons(ETH_P_IP) || | ||||
| 	     vh->h_vlan_encapsulated_proto == htons(ETH_P_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 *mgp, struct myri10ge_rx_buf *rx, | |||
| 		if ((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 @@ again: | |||
| 	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; | ||||
|  |  | |||
|  | @ -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; | ||||
|  |  | |||
|  | @ -2169,7 +2169,7 @@ static inline u32 rtl8169_tso_csum(struct sk_buff *skb, struct net_device *dev) | |||
| 		if (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) | ||||
|  |  | |||
|  | @ -3893,7 +3893,7 @@ static int s2io_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 		txdp->Control_1 |= TXD_TCP_LSO_MSS(s2io_tcp_mss(skb)); | ||||
| 	} | ||||
| #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); | ||||
|  |  | |||
|  | @ -1559,7 +1559,7 @@ struct sk_buff	*pMessage)	/* pointer to send-message              */ | |||
| 	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 @@ struct sk_buff	*pMessage)	/* pointer to send-message              */ | |||
| 	/* 
 | ||||
| 	** 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 @@ rx_start: | |||
| 
 | ||||
| #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 | ||||
|  |  | |||
|  | @ -2338,7 +2338,7 @@ static int skge_xmit_frame(struct sk_buff *skb, struct net_device *dev) | |||
| 	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
 | ||||
|  | @ -2642,7 +2642,7 @@ static inline struct sk_buff *skge_rx_get(struct skge_port *skge, | |||
| 	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); | ||||
|  |  | |||
|  | @ -1163,7 +1163,7 @@ static unsigned tx_le_req(const struct sk_buff *skb) | |||
| 	if (skb_is_gso(skb)) | ||||
| 		++count; | ||||
| 
 | ||||
| 	if (skb->ip_summed == CHECKSUM_HW) | ||||
| 	if (skb->ip_summed == CHECKSUM_PARTIAL) | ||||
| 		++count; | ||||
| 
 | ||||
| 	return count; | ||||
|  | @ -1272,7 +1272,7 @@ static int sky2_xmit_frame(struct sk_buff *skb, struct net_device *dev) | |||
| #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; | ||||
| 
 | ||||
|  | @ -2000,7 +2000,7 @@ static int sky2_status_intr(struct sky2_hw *hw, int to_do) | |||
| #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; | ||||
| 
 | ||||
|  |  | |||
|  | @ -1230,7 +1230,7 @@ static int start_tx(struct sk_buff *skb, struct net_device *dev) | |||
| 	} | ||||
| 
 | ||||
| #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 @@ static int start_tx(struct sk_buff *skb, struct net_device *dev) | |||
| 				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 @@ static int __netdev_rx(struct net_device *dev, int *quota) | |||
| 		 * 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)); | ||||
| 		} | ||||
|  |  | |||
|  | @ -855,7 +855,7 @@ static int gem_rx(struct gem *gp, int work_to_do) | |||
| 		} | ||||
| 
 | ||||
| 		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_buff *skb, struct net_device *dev) | |||
| 	unsigned 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); | ||||
|  |  | |||
|  | @ -1207,7 +1207,7 @@ static void happy_meal_transceiver_check(struct happy_meal *hp, void __iomem *tr | |||
|  * 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_meal *hp, struct net_device *dev) | |||
| 
 | ||||
| 		/* 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(struct sk_buff *skb, struct net_device *dev) | |||
|  	u32 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); | ||||
|  |  | |||
|  | @ -3851,11 +3851,11 @@ static int tg3_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 		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 | ||||
|  | @ -3981,7 +3981,7 @@ static int tg3_start_xmit_dma_bug(struct sk_buff *skb, struct net_device *dev) | |||
| 
 | ||||
| 	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; | ||||
|  |  | |||
|  | @ -830,7 +830,7 @@ typhoon_start_tx(struct sk_buff *skb, struct net_device *dev) | |||
| 	first_txd->addrHi = (u64)((unsigned long) skb) >> 32; | ||||
| 	first_txd->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; | ||||
|  |  | |||
|  | @ -1230,7 +1230,7 @@ static int rhine_start_tx(struct sk_buff *skb, struct net_device *dev) | |||
| 	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 */ | ||||
|  |  | |||
|  | @ -2002,7 +2002,7 @@ static int velocity_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 	 *	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; | ||||
|  |  | |||
|  | @ -976,7 +976,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); | ||||
|  | @ -1012,7 +1012,7 @@ static inline int netif_needs_gso(struct net_device *dev, struct sk_buff *skb) | |||
| { | ||||
| 	return skb_is_gso(skb) && | ||||
| 	       (!skb_gso_ok(skb, dev->features) || | ||||
| 		unlikely(skb->ip_summed != CHECKSUM_HW)); | ||||
| 		unlikely(skb->ip_summed != CHECKSUM_PARTIAL)); | ||||
| } | ||||
| 
 | ||||
| /* On bonding slaves other than the currently active slave, suppress
 | ||||
|  |  | |||
|  | @ -34,8 +34,9 @@ | |||
| #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 @@ | |||
|  *	      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. | ||||
|  * | ||||
|  | @ -1261,14 +1262,14 @@ static inline int skb_linearize_cow(struct sk_buff *skb) | |||
|  *	@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)); | ||||
| } | ||||
| 
 | ||||
|  | @ -1287,7 +1288,7 @@ static inline int pskb_trim_rcsum(struct sk_buff *skb, unsigned int len) | |||
| { | ||||
| 	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); | ||||
| } | ||||
|  |  | |||
|  | @ -417,7 +417,7 @@ unsigned int __skb_checksum_complete(struct sk_buff *skb) | |||
| 
 | ||||
| 	sum = (u16)csum_fold(skb_checksum(skb, 0, skb->len, skb->csum)); | ||||
| 	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(struct sk_buff *skb, | |||
| 			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; | ||||
|  |  | |||
|  | @ -1166,12 +1166,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)) { | ||||
|  | @ -1223,7 +1223,7 @@ struct sk_buff *skb_gso_segment(struct sk_buff *skb, int features) | |||
| 	skb->mac_len = skb->nh.raw - skb->data; | ||||
| 	__skb_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); | ||||
|  | @ -1232,7 +1232,7 @@ struct sk_buff *skb_gso_segment(struct sk_buff *skb, int features) | |||
| 	rcu_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)) | ||||
|  | @ -1444,11 +1444,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: | ||||
|  |  | |||
|  | @ -110,7 +110,7 @@ static int checksum_udp(struct sk_buff *skb, struct udphdr *uh, | |||
| 
 | ||||
| 	psum = csum_tcpudp_nofold(saddr, daddr, ulen, IPPROTO_UDP, 0); | ||||
| 
 | ||||
| 	if (skb->ip_summed == CHECKSUM_HW && | ||||
| 	if (skb->ip_summed == CHECKSUM_COMPLETE && | ||||
| 	    !(u16)csum_fold(csum_add(psum, skb->csum))) | ||||
| 		return 0; | ||||
| 
 | ||||
|  |  | |||
|  | @ -1397,7 +1397,7 @@ void skb_copy_and_csum_dev(const struct sk_buff *skb, u8 *to) | |||
| 	unsigned 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); | ||||
|  | @ -1411,7 +1411,7 @@ void skb_copy_and_csum_dev(const struct sk_buff *skb, u8 *to) | |||
| 		csum = skb_copy_and_csum_bits(skb, csstart, to + csstart, | ||||
| 					      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); | ||||
|  | @ -1898,10 +1898,10 @@ int skb_append_datato_frags(struct sock *sk, struct sk_buff *skb, | |||
|  *	@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) | ||||
| { | ||||
|  | @ -1994,7 +1994,7 @@ struct sk_buff *skb_segment(struct sk_buff *skb, int features) | |||
| 		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); | ||||
| 
 | ||||
|  |  | |||
|  | @ -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 */ | ||||
|  |  | |||
|  | @ -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 */ | ||||
|  |  | |||
|  | @ -665,7 +665,7 @@ static struct sk_buff *ip_frag_reasm(struct ipq *qp, struct net_device *dev) | |||
| 		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); | ||||
|  |  | |||
|  | @ -576,7 +576,7 @@ static int ipgre_rcv(struct sk_buff *skb) | |||
| 
 | ||||
| 		if (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 *skb) | |||
| 			case CHECKSUM_NONE: | ||||
| 				skb->csum = 0; | ||||
| 				csum = __skb_checksum_complete(skb); | ||||
| 				skb->ip_summed = CHECKSUM_HW; | ||||
| 				skb->ip_summed = CHECKSUM_COMPLETE; | ||||
| 			} | ||||
| 			offset += 4; | ||||
| 		} | ||||
|  |  | |||
|  | @ -680,7 +680,7 @@ ip_generic_getfrag(void *from, char *to, int offset, int len, int odd, struct sk | |||
| { | ||||
| 	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 { | ||||
|  | @ -736,7 +736,7 @@ static inline int ip_ufo_append_data(struct sock *sk, | |||
| 		/* 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; | ||||
| 	} | ||||
|  | @ -844,7 +844,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)) && | ||||
|  |  | |||
|  | @ -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, struct ip_vs_protocol *pp) | |||
| 	switch (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, struct ip_vs_protocol *pp) | |||
| 		} | ||||
| 		break; | ||||
| 	default: | ||||
| 		/* CHECKSUM_UNNECESSARY */ | ||||
| 		/* No need to checksum. */ | ||||
| 		break; | ||||
| 	} | ||||
| 
 | ||||
|  |  | |||
|  | @ -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, struct ip_vs_protocol *pp) | |||
| 		case 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, struct ip_vs_protocol *pp) | |||
| 			} | ||||
| 			break; | ||||
| 		default: | ||||
| 			/* CHECKSUM_UNNECESSARY */ | ||||
| 			/* No need to checksum. */ | ||||
| 			break; | ||||
| 		} | ||||
| 	} | ||||
|  |  | |||
|  | @ -168,7 +168,7 @@ unsigned int nf_ip_checksum(struct sk_buff *skb, unsigned int hook, | |||
| 	unsigned 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)) || | ||||
|  |  | |||
|  | @ -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 && | ||||
|  |  | |||
|  | @ -117,8 +117,7 @@ static int udp_error(struct sk_buff *skb, enum ip_conntrack_info *ctinfo, | |||
| 
 | ||||
| 	/* 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)) { | ||||
|  |  | |||
|  | @ -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); | ||||
|  |  | |||
|  | @ -208,9 +208,9 @@ ipq_build_packet_message(struct ipq_queue_entry *entry, int *errp) | |||
| 		break; | ||||
| 	 | ||||
| 	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; | ||||
| 		} | ||||
|  |  | |||
|  | @ -49,7 +49,7 @@ set_ect_ip(struct sk_buff **pskb, const struct ipt_ECN_info *einfo) | |||
| 
 | ||||
| /* 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, const struct ipt_ECN_info *einfo, int inward) | |||
| 		return 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; | ||||
|  |  | |||
|  | @ -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; | ||||
|  |  | |||
|  | @ -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 sk_buff *skb, int features) | |||
| 		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 sk_buff *skb, int features) | |||
| 
 | ||||
| 	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)); | ||||
| 
 | ||||
|  |  | |||
|  | @ -484,7 +484,7 @@ void tcp_v4_send_check(struct sock *sk, int len, struct sk_buff *skb) | |||
| 	struct inet_sock *inet = inet_sk(sk); | ||||
| 	struct 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 *skb) | |||
| 	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 @@ static struct sock *tcp_v4_hnd_req(struct sock *sk, struct sk_buff *skb) | |||
| 
 | ||||
| static int tcp_v4_checksum_init(struct sk_buff *skb) | ||||
| { | ||||
| 	if (skb->ip_summed == CHECKSUM_HW) { | ||||
| 	if (skb->ip_summed == CHECKSUM_COMPLETE) { | ||||
| 		if (!tcp_v4_check(skb->h.th, skb->len, skb->nh.iph->saddr, | ||||
| 				  skb->nh.iph->daddr, skb->csum)) { | ||||
| 			skb->ip_summed = CHECKSUM_UNNECESSARY; | ||||
|  |  | |||
|  | @ -577,7 +577,7 @@ int tcp_fragment(struct sock *sk, struct sk_buff *skb, u32 len, unsigned int mss | |||
| 	TCP_SKB_CB(buff)->sacked = TCP_SKB_CB(skb)->sacked; | ||||
| 	TCP_SKB_CB(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); | ||||
|  | @ -586,7 +586,7 @@ int tcp_fragment(struct sock *sk, struct sk_buff *skb, u32 len, unsigned int mss | |||
| 
 | ||||
| 		skb->csum = csum_block_sub(skb->csum, buff->csum, len); | ||||
| 	} else { | ||||
| 		skb->ip_summed = CHECKSUM_HW; | ||||
| 		skb->ip_summed = CHECKSUM_PARTIAL; | ||||
| 		skb_split(skb, buff, len); | ||||
| 	} | ||||
| 
 | ||||
|  | @ -689,7 +689,7 @@ int tcp_trim_head(struct sock *sk, struct sk_buff *skb, u32 len) | |||
| 		__pskb_trim_head(skb, len - skb_headlen(skb)); | ||||
| 
 | ||||
| 	TCP_SKB_CB(skb)->seq += len; | ||||
| 	skb->ip_summed = CHECKSUM_HW; | ||||
| 	skb->ip_summed = CHECKSUM_PARTIAL; | ||||
| 
 | ||||
| 	skb->truesize	     -= len; | ||||
| 	sk->sk_wmem_queued   -= len; | ||||
|  | @ -1062,7 +1062,7 @@ static int tso_fragment(struct sock *sk, struct sk_buff *skb, unsigned int len, | |||
| 	/* This packet was never sent out yet, so no SACK bits. */ | ||||
| 	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.  */ | ||||
|  | @ -1206,8 +1206,7 @@ static int tcp_mtu_probe(struct sock *sk) | |||
| 	TCP_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) { | ||||
|  | @ -1231,7 +1230,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); | ||||
|  | @ -1572,10 +1571,9 @@ static void tcp_retrans_try_collapse(struct sock *sk, struct sk_buff *skb, int m | |||
| 
 | ||||
| 		memcpy(skb_put(skb, next_skb_size), next_skb->data, next_skb_size); | ||||
| 
 | ||||
| 		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. */ | ||||
|  |  | |||
|  | @ -429,7 +429,7 @@ static int udp_push_pending_frames(struct sock *sk, struct udp_sock *up) | |||
| 		/*
 | ||||
| 		 * 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(struct sock *sk, struct udp_sock *up) | |||
| 		 * 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_buff *skb, struct udphdr *uh, | |||
| { | ||||
| 	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; | ||||
| 	} | ||||
|  |  | |||
|  | @ -48,8 +48,8 @@ static int xfrm4_output_one(struct sk_buff *skb) | |||
| 	struct 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; | ||||
| 	} | ||||
|  |  | |||
|  | @ -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; | ||||
|  |  | |||
|  | @ -606,7 +606,7 @@ static int icmpv6_rcv(struct sk_buff **pskb) | |||
| 
 | ||||
| 	/* 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; | ||||
|  |  | |||
|  | @ -866,7 +866,7 @@ static inline int ip6_ufo_append_data(struct sock *sk, | |||
| 		/* 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; | ||||
| 	} | ||||
|  |  | |||
|  | @ -87,7 +87,7 @@ unsigned int nf_ip6_checksum(struct sk_buff *skb, unsigned int hook, | |||
| 	unsigned 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, | ||||
|  |  | |||
|  | @ -206,9 +206,9 @@ ipq_build_packet_message(struct ipq_queue_entry *entry, int *errp) | |||
| 		break; | ||||
| 	 | ||||
| 	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; | ||||
| 		} | ||||
|  |  | |||
|  | @ -408,7 +408,7 @@ static int nf_ct_frag6_queue(struct nf_ct_frag6_queue *fq, struct sk_buff *skb, | |||
|  		return -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_queue *fq, struct net_device *dev) | |||
| 		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_queue *fq, struct net_device *dev) | |||
| 	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; | ||||
|  |  | |||
|  | @ -334,7 +334,7 @@ int rawv6_rcv(struct sock *sk, struct sk_buff *skb) | |||
| 	if (!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, | ||||
|  |  | |||
|  | @ -433,7 +433,7 @@ static void ip6_frag_queue(struct frag_queue *fq, struct sk_buff *skb, | |||
|  		return; | ||||
| 	} | ||||
| 
 | ||||
|  	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_queue *fq, struct sk_buff **skb_in, | |||
| 		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_queue *fq, struct sk_buff **skb_in, | |||
| 	*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); | ||||
|  |  | |||
|  | @ -545,7 +545,7 @@ static void tcp_v6_send_check(struct sock *sk, int len, struct sk_buff *skb) | |||
| 	struct ipv6_pinfo *np = inet6_sk(sk); | ||||
| 	struct 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 sk_buff *skb) | |||
| 	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; | ||||
|  |  | |||
|  | @ -475,7 +475,7 @@ static int udpv6_rcv(struct sk_buff **pskb) | |||
| 		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; | ||||
| 
 | ||||
|  |  | |||
|  | @ -41,8 +41,8 @@ static int xfrm6_output_one(struct sk_buff *skb) | |||
| 	struct 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; | ||||
| 	} | ||||
|  |  | |||
|  | @ -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 && | ||||
|  |  | |||
|  | @ -131,8 +131,7 @@ static int udp_error(struct sk_buff *skb, unsigned int dataoff, | |||
| 
 | ||||
| 	/* 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) || | ||||
|  |  | |||
|  | @ -377,9 +377,9 @@ nfqnl_build_packet_message(struct nfqnl_instance *queue, | |||
| 		break; | ||||
| 	 | ||||
| 	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; | ||||
| 		} | ||||
|  |  | |||
|  | @ -586,7 +586,7 @@ static int tpacket_rcv(struct sk_buff *skb, struct net_device *dev, struct packe | |||
| 		else if (skb->pkt_type == PACKET_OUTGOING) { | ||||
| 			/* 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; | ||||
| 		} | ||||
| 	} | ||||
|  |  | |||
|  | @ -192,8 +192,8 @@ static int netem_enqueue(struct sk_buff *skb, struct Qdisc *sch) | |||
| 	 */ | ||||
| 	if (q->corrupt && q->corrupt >= get_crandom(&q->corrupt_cor)) { | ||||
| 		if (!(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; | ||||
| 		} | ||||
|  |  | |||
|  | @ -168,7 +168,7 @@ int csum_partial_copy_to_xdr(struct xdr_buf *xdr, struct sk_buff *skb) | |||
| 		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: | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 Patrick McHardy
						Patrick McHardy