mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2025-01-27 08:14:35 +08:00
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))
|
if (unlikely(err))
|
||||||
return 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_source, eth_key->eth_src, ETH_ALEN);
|
||||||
memcpy(eth_hdr(skb)->h_dest, eth_key->eth_dst, 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;
|
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);
|
memcpy(key->eth.dst, eth->h_dest, ETH_ALEN);
|
||||||
|
|
||||||
__skb_pull(skb, 2 * 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))
|
if (vlan_tx_tag_present(skb))
|
||||||
key->eth.tci = htons(skb->vlan_tci);
|
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->dev = netdev;
|
||||||
skb->pkt_type = PACKET_HOST;
|
skb->pkt_type = PACKET_HOST;
|
||||||
skb->protocol = eth_type_trans(skb, netdev);
|
skb->protocol = eth_type_trans(skb, netdev);
|
||||||
|
skb_postpull_rcsum(skb, eth_hdr(skb), ETH_HLEN);
|
||||||
|
|
||||||
netif_rx(skb);
|
netif_rx(skb);
|
||||||
|
|
||||||
|
@ -49,6 +49,8 @@ static void netdev_port_receive(struct vport *vport, struct sk_buff *skb)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
skb_push(skb, ETH_HLEN);
|
skb_push(skb, ETH_HLEN);
|
||||||
|
ovs_skb_postpush_rcsum(skb, skb->data, ETH_HLEN);
|
||||||
|
|
||||||
ovs_vport_receive(vport, skb);
|
ovs_vport_receive(vport, skb);
|
||||||
return;
|
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_netdev_vport_ops;
|
||||||
extern const struct vport_ops ovs_internal_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 */
|
#endif /* vport.h */
|
||||||
|
Loading…
Reference in New Issue
Block a user