]> Pileus Git - ~andy/linux/blobdiff - net/8021q/vlan_dev.c
net/vlan: Provide read access to the vlan egress map
[~andy/linux] / net / 8021q / vlan_dev.c
index 09bf1c38805b75eee667726628bb1e93e8763a07..13904a4149296765affb964fe28c6e6905efc16f 100644 (file)
@@ -69,15 +69,15 @@ static int vlan_dev_rebuild_header(struct sk_buff *skb)
 }
 
 static inline u16
-vlan_dev_get_egress_qos_mask(struct net_device *dev, struct sk_buff *skb)
+__vlan_dev_get_egress_qos_mask(struct net_device *dev, u32 skprio)
 {
        struct vlan_priority_tci_mapping *mp;
 
        smp_rmb(); /* coupled with smp_wmb() in vlan_dev_set_egress_priority() */
 
-       mp = vlan_dev_priv(dev)->egress_priority_map[(skb->priority & 0xF)];
+       mp = vlan_dev_priv(dev)->egress_priority_map[(skprio & 0xF)];
        while (mp) {
-               if (mp->priority == skb->priority) {
+               if (mp->priority == skprio) {
                        return mp->vlan_qos; /* This should already be shifted
                                              * to mask correctly with the
                                              * VLAN's TCI */
@@ -87,6 +87,12 @@ vlan_dev_get_egress_qos_mask(struct net_device *dev, struct sk_buff *skb)
        return 0;
 }
 
+u16 vlan_dev_get_egress_qos_mask(struct net_device *dev, u32 skprio)
+{
+       return __vlan_dev_get_egress_qos_mask(dev, skprio);
+}
+EXPORT_SYMBOL(vlan_dev_get_egress_qos_mask);
+
 /*
  *     Create the VLAN header for an arbitrary protocol layer
  *
@@ -111,7 +117,7 @@ static int vlan_dev_hard_header(struct sk_buff *skb, struct net_device *dev,
                vhdr = (struct vlan_hdr *) skb_push(skb, VLAN_HLEN);
 
                vlan_tci = vlan->vlan_id;
-               vlan_tci |= vlan_dev_get_egress_qos_mask(dev, skb);
+               vlan_tci |= __vlan_dev_get_egress_qos_mask(dev, skb->priority);
                vhdr->h_vlan_TCI = htons(vlan_tci);
 
                /*
@@ -168,7 +174,7 @@ static netdev_tx_t vlan_dev_hard_start_xmit(struct sk_buff *skb,
            vlan->flags & VLAN_FLAG_REORDER_HDR) {
                u16 vlan_tci;
                vlan_tci = vlan->vlan_id;
-               vlan_tci |= vlan_dev_get_egress_qos_mask(dev, skb);
+               vlan_tci |= __vlan_dev_get_egress_qos_mask(dev, skb->priority);
                skb = __vlan_hwaccel_put_tag(skb, vlan->vlan_proto, vlan_tci);
        }
 
@@ -253,7 +259,7 @@ int vlan_dev_set_egress_priority(const struct net_device *dev,
        np->vlan_qos = vlan_qos;
        /* Before inserting this element in hash table, make sure all its fields
         * are committed to memory.
-        * coupled with smp_rmb() in vlan_dev_get_egress_qos_mask()
+        * coupled with smp_rmb() in __vlan_dev_get_egress_qos_mask()
         */
        smp_wmb();
        vlan->egress_priority_map[skb_prio & 0xF] = np;