net_sched: fix mirrored packets checksum
[ Upstream commit 82a31b9231f02d9c1b7b290a46999d517b0d312a ] Similar to commit 9b368814b336 ("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: Cong Wang <xiyou.wangcong@gmail.com> Acked-by: Jamal Hadi Salim <jhs@mojatatu.com> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
424848bd98
commit
2832302fc9
3 changed files with 20 additions and 19 deletions
|
@ -2773,6 +2773,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
|
||||||
|
|
|
@ -2947,24 +2947,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
|
||||||
|
|
|
@ -170,7 +170,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 */
|
||||||
|
|
Loading…
Add table
Reference in a new issue