diff --git a/[refs] b/[refs] index 3db991e95dee..01408bcdc6e7 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: e971b7225bcb1f318811ef04628c441497372999 +refs/heads/master: c6865cb3cc6f3c2857fa4c6f5fda2945d70b1e84 diff --git a/trunk/net/core/dev.c b/trunk/net/core/dev.c index 4bee9a9aeef6..a8d91a5dd909 100644 --- a/trunk/net/core/dev.c +++ b/trunk/net/core/dev.c @@ -2570,6 +2570,28 @@ void __skb_get_rxhash(struct sk_buff *skb) } switch (ip_proto) { + case IPPROTO_GRE: + if (pskb_may_pull(skb, nhoff + 16)) { + u8 *h = skb->data + nhoff; + __be16 flags = *(__be16 *)h; + + /* + * Only look inside GRE if version zero and no + * routing + */ + if (!(flags & (GRE_VERSION|GRE_ROUTING))) { + proto = *(__be16 *)(h + 2); + nhoff += 4; + if (flags & GRE_CSUM) + nhoff += 4; + if (flags & GRE_KEY) + nhoff += 4; + if (flags & GRE_SEQ) + nhoff += 4; + goto again; + } + } + break; default: break; }