Commit 82a31b92 authored by WANG Cong's avatar WANG Cong Committed by David S. Miller

net_sched: fix mirrored packets checksum

Similar to commit 9b368814 ("net: fix bridge multicast packet checksum validation")
we need to fixup the checksum for CHECKSUM_COMPLETE when
pushing skb on RX path. Otherwise we get similar splats.

Cc: Jamal Hadi Salim <jhs@mojatatu.com>
Cc: Tom Herbert <tom@herbertland.com>
Signed-off-by: default avatarCong Wang <xiyou.wangcong@gmail.com>
Acked-by: default avatarJamal Hadi Salim <jhs@mojatatu.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent eb70db87
...@@ -2870,6 +2870,25 @@ static inline void skb_postpush_rcsum(struct sk_buff *skb, ...@@ -2870,6 +2870,25 @@ static inline void skb_postpush_rcsum(struct sk_buff *skb,
skb->csum = csum_partial(start, len, skb->csum); skb->csum = csum_partial(start, len, skb->csum);
} }
/**
* skb_push_rcsum - push skb and update receive checksum
* @skb: buffer to update
* @len: length of data pulled
*
* This function performs an skb_push on the packet and updates
* the CHECKSUM_COMPLETE checksum. It should be used on
* receive path processing instead of skb_push unless you know
* that the checksum difference is zero (e.g., a valid IP header)
* or you are setting ip_summed to CHECKSUM_NONE.
*/
static inline unsigned char *skb_push_rcsum(struct sk_buff *skb,
unsigned int len)
{
skb_push(skb, len);
skb_postpush_rcsum(skb, skb->data, len);
return skb->data;
}
/** /**
* pskb_trim_rcsum - trim received skb and update checksum * pskb_trim_rcsum - trim received skb and update checksum
* @skb: buffer to trim * @skb: buffer to trim
......
...@@ -3015,24 +3015,6 @@ int skb_append_pagefrags(struct sk_buff *skb, struct page *page, ...@@ -3015,24 +3015,6 @@ int skb_append_pagefrags(struct sk_buff *skb, struct page *page,
} }
EXPORT_SYMBOL_GPL(skb_append_pagefrags); EXPORT_SYMBOL_GPL(skb_append_pagefrags);
/**
* skb_push_rcsum - push skb and update receive checksum
* @skb: buffer to update
* @len: length of data pulled
*
* This function performs an skb_push on the packet and updates
* the CHECKSUM_COMPLETE checksum. It should be used on
* receive path processing instead of skb_push unless you know
* that the checksum difference is zero (e.g., a valid IP header)
* or you are setting ip_summed to CHECKSUM_NONE.
*/
static unsigned char *skb_push_rcsum(struct sk_buff *skb, unsigned len)
{
skb_push(skb, len);
skb_postpush_rcsum(skb, skb->data, len);
return skb->data;
}
/** /**
* skb_pull_rcsum - pull skb and update receive checksum * skb_pull_rcsum - pull skb and update receive checksum
* @skb: buffer to update * @skb: buffer to update
......
...@@ -181,7 +181,7 @@ static int tcf_mirred(struct sk_buff *skb, const struct tc_action *a, ...@@ -181,7 +181,7 @@ static int tcf_mirred(struct sk_buff *skb, const struct tc_action *a,
if (!(at & AT_EGRESS)) { if (!(at & AT_EGRESS)) {
if (m->tcfm_ok_push) if (m->tcfm_ok_push)
skb_push(skb2, skb->mac_len); skb_push_rcsum(skb2, skb->mac_len);
} }
/* mirror is always swallowed */ /* mirror is always swallowed */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment