Ignore:
Timestamp:
Apr 16, 2017, 3:07:01 PM (4 months ago)
Author:
brainslayer
Message:

update

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/linux/universal/linux-3.18/net/ipv6/ip6_gre.c

    r29271 r31869  
    5656#include <net/ip6_route.h>
    5757#include <net/ip6_tunnel.h>
     58#include <net/gre.h>
    5859
    5960
     
    368369
    369370static void ip6gre_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
    370                 u8 type, u8 code, int offset, __be32 info)
    371 {
    372         const struct ipv6hdr *ipv6h = (const struct ipv6hdr *)skb->data;
    373         __be16 *p = (__be16 *)(skb->data + offset);
    374         int grehlen = offset + 4;
     371                    u8 type, u8 code, int offset, __be32 info)
     372{
     373        const struct gre_base_hdr *greh;
     374        const struct ipv6hdr *ipv6h;
     375        int grehlen = sizeof(*greh);
    375376        struct ip6_tnl *t;
     377        int key_off = 0;
    376378        __be16 flags;
    377 
    378         flags = p[0];
    379         if (flags&(GRE_CSUM|GRE_KEY|GRE_SEQ|GRE_ROUTING|GRE_VERSION)) {
    380                 if (flags&(GRE_VERSION|GRE_ROUTING))
    381                         return;
    382                 if (flags&GRE_KEY) {
    383                         grehlen += 4;
    384                         if (flags&GRE_CSUM)
    385                                 grehlen += 4;
    386                 }
    387         }
    388 
    389         /* If only 8 bytes returned, keyed message will be dropped here */
    390         if (!pskb_may_pull(skb, grehlen))
     379        __be32 key;
     380
     381        if (!pskb_may_pull(skb, offset + grehlen))
     382                return;
     383        greh = (const struct gre_base_hdr *)(skb->data + offset);
     384        flags = greh->flags;
     385        if (flags & (GRE_VERSION | GRE_ROUTING))
     386                return;
     387        if (flags & GRE_CSUM)
     388                grehlen += 4;
     389        if (flags & GRE_KEY) {
     390                key_off = grehlen + offset;
     391                grehlen += 4;
     392        }
     393
     394        if (!pskb_may_pull(skb, offset + grehlen))
    391395                return;
    392396        ipv6h = (const struct ipv6hdr *)skb->data;
    393         p = (__be16 *)(skb->data + offset);
     397        greh = (const struct gre_base_hdr *)(skb->data + offset);
     398        key = key_off ? *(__be32 *)(skb->data + key_off) : 0;
     399 
    394400
    395401        t = ip6gre_tunnel_lookup(skb->dev, &ipv6h->daddr, &ipv6h->saddr,
    396                                 flags & GRE_KEY ?
    397                                 net_hdr_word(((__be32 *)p) + (grehlen / 4) - 1) : 0,
    398                                 p[1]);
     402                                 key, greh->protocol);
    399403        if (t == NULL)
    400404                return;
     
    890894
    891895        memcpy(&fl6, &t->fl.u.ip6, sizeof(fl6));
    892         fl6.flowi6_proto = skb->protocol;
    893896
    894897        err = ip6gre_xmit2(skb, dev, 0, &fl6, encap_limit, &mtu);
Note: See TracChangeset for help on using the changeset viewer.