diff options
Diffstat (limited to 'net/8021q')
-rw-r--r-- | net/8021q/vlan_dev.c | 18 |
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 | ||
71 | static inline u16 | 71 | static inline u16 |
72 | vlan_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 | ||
90 | u16 vlan_dev_get_egress_qos_mask(struct net_device *dev, u32 skprio) | ||
91 | { | ||
92 | return __vlan_dev_get_egress_qos_mask(dev, skprio); | ||
93 | } | ||
94 | EXPORT_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; |