]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - net/bridge/netfilter/ebt_vlan.c
Merge tag 'clk-for-linus' of git://git.linaro.org/people/mturquette/linux
[karo-tx-linux.git] / net / bridge / netfilter / ebt_vlan.c
index 87b53b3a921daefd40c0fd85ade33d5240f4262a..eae67bf0446c8023b6e3895562e48912b6c29330 100644 (file)
@@ -39,8 +39,6 @@ static bool
 ebt_vlan_mt(const struct sk_buff *skb, struct xt_action_param *par)
 {
        const struct ebt_vlan_info *info = par->matchinfo;
-       const struct vlan_hdr *fp;
-       struct vlan_hdr _frame;
 
        unsigned short TCI;     /* Whole TCI, given from parsed frame */
        unsigned short id;      /* VLAN ID, given from frame TCI */
@@ -48,9 +46,20 @@ ebt_vlan_mt(const struct sk_buff *skb, struct xt_action_param *par)
        /* VLAN encapsulated Type/Length field, given from orig frame */
        __be16 encap;
 
-       fp = skb_header_pointer(skb, 0, sizeof(_frame), &_frame);
-       if (fp == NULL)
-               return false;
+       if (vlan_tx_tag_present(skb)) {
+               TCI = vlan_tx_tag_get(skb);
+               encap = skb->protocol;
+       } else {
+               const struct vlan_hdr *fp;
+               struct vlan_hdr _frame;
+
+               fp = skb_header_pointer(skb, 0, sizeof(_frame), &_frame);
+               if (fp == NULL)
+                       return false;
+
+               TCI = ntohs(fp->h_vlan_TCI);
+               encap = fp->h_vlan_encapsulated_proto;
+       }
 
        /* Tag Control Information (TCI) consists of the following elements:
         * - User_priority. The user_priority field is three bits in length,
@@ -59,10 +68,8 @@ ebt_vlan_mt(const struct sk_buff *skb, struct xt_action_param *par)
         * (CFI) is a single bit flag value. Currently ignored.
         * - VLAN Identifier (VID). The VID is encoded as
         * an unsigned binary number. */
-       TCI = ntohs(fp->h_vlan_TCI);
        id = TCI & VLAN_VID_MASK;
        prio = (TCI >> 13) & 0x7;
-       encap = fp->h_vlan_encapsulated_proto;
 
        /* Checking VLAN Identifier (VID) */
        if (GET_BITMASK(EBT_VLAN_ID))
@@ -111,10 +118,10 @@ static int ebt_vlan_mt_check(const struct xt_mtchk_param *par)
         * 0 - The null VLAN ID.
         * 1 - The default Port VID (PVID)
         * 0x0FFF - Reserved for implementation use.
-        * if_vlan.h: VLAN_GROUP_ARRAY_LEN 4096. */
+        * if_vlan.h: VLAN_N_VID 4096. */
        if (GET_BITMASK(EBT_VLAN_ID)) {
                if (!!info->id) { /* if id!=0 => check vid range */
-                       if (info->id > VLAN_GROUP_ARRAY_LEN) {
+                       if (info->id > VLAN_N_VID) {
                                pr_debug("id %d is out of range (1-4096)\n",
                                         info->id);
                                return -EINVAL;