|
@@ -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;
|