net_sched: fix mirrored packets checksum
Similar to commit 9b368814b3
("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>
This commit is contained in:
Родитель
eb70db8756
Коммит
82a31b9231
|
@ -2870,6 +2870,25 @@ static inline void skb_postpush_rcsum(struct sk_buff *skb,
|
|||
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
|
||||
* @skb: buffer to trim
|
||||
|
|
|
@ -3015,24 +3015,6 @@ int skb_append_pagefrags(struct sk_buff *skb, struct page *page,
|
|||
}
|
||||
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: buffer to update
|
||||
|
|
|
@ -181,7 +181,7 @@ static int tcf_mirred(struct sk_buff *skb, const struct tc_action *a,
|
|||
|
||||
if (!(at & AT_EGRESS)) {
|
||||
if (m->tcfm_ok_push)
|
||||
skb_push(skb2, skb->mac_len);
|
||||
skb_push_rcsum(skb2, skb->mac_len);
|
||||
}
|
||||
|
||||
/* mirror is always swallowed */
|
||||
|
|
Загрузка…
Ссылка в новой задаче