aboutsummaryrefslogtreecommitdiffstats
path: root/net/8021q
diff options
context:
space:
mode:
Diffstat (limited to 'net/8021q')
-rw-r--r--net/8021q/vlan_dev.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/net/8021q/vlan_dev.c b/net/8021q/vlan_dev.c
index 09bf1c38805b..13904a414929 100644
--- a/net/8021q/vlan_dev.c
+++ b/net/8021q/vlan_dev.c
@@ -69,15 +69,15 @@ static int vlan_dev_rebuild_header(struct sk_buff *skb)
69} 69}
70 70
71static inline u16 71static inline u16
72vlan_dev_get_egress_qos_mask(struct net_device *dev, struct sk_buff *skb) 72__vlan_dev_get_egress_qos_mask(struct net_device *dev, u32 skprio)
73{ 73{
74 struct vlan_priority_tci_mapping *mp; 74 struct vlan_priority_tci_mapping *mp;
75 75
76 smp_rmb(); /* coupled with smp_wmb() in vlan_dev_set_egress_priority() */ 76 smp_rmb(); /* coupled with smp_wmb() in vlan_dev_set_egress_priority() */
77 77
78 mp = vlan_dev_priv(dev)->egress_priority_map[(skb->priority & 0xF)]; 78 mp = vlan_dev_priv(dev)->egress_priority_map[(skprio & 0xF)];
79 while (mp) { 79 while (mp) {
80 if (mp->priority == skb->priority) { 80 if (mp->priority == skprio) {
81 return mp->vlan_qos; /* This should already be shifted 81 return mp->vlan_qos; /* This should already be shifted
82 * to mask correctly with the 82 * to mask correctly with the
83 * VLAN's TCI */ 83 * VLAN's TCI */
@@ -87,6 +87,12 @@ vlan_dev_get_egress_qos_mask(struct net_device *dev, struct sk_buff *skb)
87 return 0; 87 return 0;
88} 88}
89 89
90u16 vlan_dev_get_egress_qos_mask(struct net_device *dev, u32 skprio)
91{
92 return __vlan_dev_get_egress_qos_mask(dev, skprio);
93}
94EXPORT_SYMBOL(vlan_dev_get_egress_qos_mask);
95
90/* 96/*
91 * Create the VLAN header for an arbitrary protocol layer 97 * Create the VLAN header for an arbitrary protocol layer
92 * 98 *
@@ -111,7 +117,7 @@ static int vlan_dev_hard_header(struct sk_buff *skb, struct net_device *dev,
111 vhdr = (struct vlan_hdr *) skb_push(skb, VLAN_HLEN); 117 vhdr = (struct vlan_hdr *) skb_push(skb, VLAN_HLEN);
112 118
113 vlan_tci = vlan->vlan_id; 119 vlan_tci = vlan->vlan_id;
114 vlan_tci |= vlan_dev_get_egress_qos_mask(dev, skb); 120 vlan_tci |= __vlan_dev_get_egress_qos_mask(dev, skb->priority);
115 vhdr->h_vlan_TCI = htons(vlan_tci); 121 vhdr->h_vlan_TCI = htons(vlan_tci);
116 122
117 /* 123 /*
@@ -168,7 +174,7 @@ static netdev_tx_t vlan_dev_hard_start_xmit(struct sk_buff *skb,
168 vlan->flags & VLAN_FLAG_REORDER_HDR) { 174 vlan->flags & VLAN_FLAG_REORDER_HDR) {
169 u16 vlan_tci; 175 u16 vlan_tci;
170 vlan_tci = vlan->vlan_id; 176 vlan_tci = vlan->vlan_id;
171 vlan_tci |= vlan_dev_get_egress_qos_mask(dev, skb); 177 vlan_tci |= __vlan_dev_get_egress_qos_mask(dev, skb->priority);
172 skb = __vlan_hwaccel_put_tag(skb, vlan->vlan_proto, vlan_tci); 178 skb = __vlan_hwaccel_put_tag(skb, vlan->vlan_proto, vlan_tci);
173 } 179 }
174 180
@@ -253,7 +259,7 @@ int vlan_dev_set_egress_priority(const struct net_device *dev,
253 np->vlan_qos = vlan_qos; 259 np->vlan_qos = vlan_qos;
254 /* Before inserting this element in hash table, make sure all its fields 260 /* Before inserting this element in hash table, make sure all its fields
255 * are committed to memory. 261 * are committed to memory.
256 * coupled with smp_rmb() in vlan_dev_get_egress_qos_mask() 262 * coupled with smp_rmb() in __vlan_dev_get_egress_qos_mask()
257 */ 263 */
258 smp_wmb(); 264 smp_wmb();
259 vlan->egress_priority_map[skb_prio & 0xF] = np; 265 vlan->egress_priority_map[skb_prio & 0xF] = np;