Messages in this thread Patch in this message | | | Subject | Re: [PATCH v2,net-next 1/2] ip_gre: fix parsing gre header in ipgre_err | From | Haishuang Yan <> | Date | Fri, 14 Sep 2018 10:09:51 +0800 |
| |
> On 2018年9月14日, at 上午1:58, David Miller <davem@davemloft.net> wrote: > > From: Haishuang Yan <yanhaishuang@cmss.chinamobile.com> > Date: Wed, 12 Sep 2018 17:21:21 +0800 > >> @@ -86,7 +86,7 @@ int gre_parse_header(struct sk_buff *skb, struct tnl_ptk_info *tpi, >> >> options = (__be32 *)(greh + 1); >> if (greh->flags & GRE_CSUM) { >> - if (skb_checksum_simple_validate(skb)) { >> + if (csum_err && skb_checksum_simple_validate(skb)) { >> *csum_err = true; >> return -EINVAL; >> } > > You want to ignore csum errors, but you do not want to elide the side > effects of the skb_checksum_simple_validate() call which are to set > skb->csum_valid and skb->csum. > > Therefore, the skb_checksum_simple_validate() call still needs to be > performed. We just wont return -EINVAL in the NULL csum_err case. > >
How about doing like this:
--- a/net/ipv4/gre_demux.c +++ b/net/ipv4/gre_demux.c @@ -86,13 +86,14 @@ int gre_parse_header(struct sk_buff *skb, struct tnl_ptk_info *tpi,
options = (__be32 *)(greh + 1); if (greh->flags & GRE_CSUM) { - if (skb_checksum_simple_validate(skb)) { + if (!skb_checksum_simple_validate(skb)) { + skb_checksum_try_convert(skb, IPPROTO_GRE, 0, + null_compute_pseudo); + } else if (csum_err) { *csum_err = true; return -EINVAL; }
- skb_checksum_try_convert(skb, IPPROTO_GRE, 0, - null_compute_pseudo);
Thanks for reviewing.
| |