openvswitch: make skb->csum consistent with rest of networking stack.
Following patch keeps skb->csum correct across ovs. Signed-off-by: Pravin B Shelar <pshelar@nicira.com> Signed-off-by: Jesse Gross <jesse@nicira.com>
This commit is contained in:
		
							parent
							
								
									45bfa52e36
								
							
						
					
					
						commit
						b34df5e805
					
				| @ -130,9 +130,13 @@ static int set_eth_addr(struct sk_buff *skb, | ||||
| 	if (unlikely(err)) | ||||
| 		return err; | ||||
| 
 | ||||
| 	skb_postpull_rcsum(skb, eth_hdr(skb), ETH_ALEN * 2); | ||||
| 
 | ||||
| 	memcpy(eth_hdr(skb)->h_source, eth_key->eth_src, ETH_ALEN); | ||||
| 	memcpy(eth_hdr(skb)->h_dest, eth_key->eth_dst, ETH_ALEN); | ||||
| 
 | ||||
| 	ovs_skb_postpush_rcsum(skb, eth_hdr(skb), ETH_ALEN * 2); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -618,6 +618,9 @@ int ovs_flow_extract(struct sk_buff *skb, u16 in_port, struct sw_flow_key *key, | ||||
| 	memcpy(key->eth.dst, eth->h_dest, ETH_ALEN); | ||||
| 
 | ||||
| 	__skb_pull(skb, 2 * ETH_ALEN); | ||||
| 	/* We are going to push all headers that we pull, so no need to
 | ||||
| 	 * update skb->csum here. | ||||
| 	 */ | ||||
| 
 | ||||
| 	if (vlan_tx_tag_present(skb)) | ||||
| 		key->eth.tci = htons(skb->vlan_tci); | ||||
|  | ||||
| @ -221,6 +221,7 @@ static int internal_dev_recv(struct vport *vport, struct sk_buff *skb) | ||||
| 	skb->dev = netdev; | ||||
| 	skb->pkt_type = PACKET_HOST; | ||||
| 	skb->protocol = eth_type_trans(skb, netdev); | ||||
| 	skb_postpull_rcsum(skb, eth_hdr(skb), ETH_HLEN); | ||||
| 
 | ||||
| 	netif_rx(skb); | ||||
| 
 | ||||
|  | ||||
| @ -49,6 +49,8 @@ static void netdev_port_receive(struct vport *vport, struct sk_buff *skb) | ||||
| 		return; | ||||
| 
 | ||||
| 	skb_push(skb, ETH_HLEN); | ||||
| 	ovs_skb_postpush_rcsum(skb, skb->data, ETH_HLEN); | ||||
| 
 | ||||
| 	ovs_vport_receive(vport, skb); | ||||
| 	return; | ||||
| 
 | ||||
|  | ||||
| @ -192,4 +192,11 @@ void ovs_vport_record_error(struct vport *, enum vport_err_type err_type); | ||||
| extern const struct vport_ops ovs_netdev_vport_ops; | ||||
| extern const struct vport_ops ovs_internal_vport_ops; | ||||
| 
 | ||||
| static inline void ovs_skb_postpush_rcsum(struct sk_buff *skb, | ||||
| 				      const void *start, unsigned int len) | ||||
| { | ||||
| 	if (skb->ip_summed == CHECKSUM_COMPLETE) | ||||
| 		skb->csum = csum_add(skb->csum, csum_partial(start, len, 0)); | ||||
| } | ||||
| 
 | ||||
| #endif /* vport.h */ | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user