X-Git-Url: https://git.karo-electronics.de/?a=blobdiff_plain;f=net%2Fcore%2Ffilter.c;h=08db7b9143a35709f61babe2932e5d7ff6754cea;hb=1014eb6ec95b18f890101e99385f05539c0c2f01;hp=df37443558395a01780f725e744a920fb1664872;hpb=85e9ca333d03fbd56b9e123c8456f0d98e20faad;p=karo-tx-linux.git diff --git a/net/core/filter.c b/net/core/filter.c index df3744355839..08db7b9143a3 100644 --- a/net/core/filter.c +++ b/net/core/filter.c @@ -303,6 +303,12 @@ load_b: case SKF_AD_IFINDEX: A = skb->dev->ifindex; continue; + case SKF_AD_MARK: + A = skb->mark; + continue; + case SKF_AD_QUEUE: + A = skb->queue_mapping; + continue; case SKF_AD_NLATTR: { struct nlattr *nla; @@ -319,6 +325,25 @@ load_b: A = 0; continue; } + case SKF_AD_NLATTR_NEST: { + struct nlattr *nla; + + if (skb_is_nonlinear(skb)) + return 0; + if (A > skb->len - sizeof(struct nlattr)) + return 0; + + nla = (struct nlattr *)&skb->data[A]; + if (nla->nla_len > A - skb->len) + return 0; + + nla = nla_find_nested(nla, X); + if (nla) + A = (void *)nla - (void *)skb->data; + else + A = 0; + continue; + } default: return 0; }