aboutsummaryrefslogtreecommitdiffstats
path: root/net/8021q
diff options
context:
space:
mode:
authorEyal Perry <eyalpe@mellanox.com>2013-11-06 08:37:23 -0500
committerDavid S. Miller <davem@davemloft.net>2013-11-07 19:09:44 -0500
commitd32435391974e39c35ade4d115f17c538a96a708 (patch)
tree9cd3360d2f424a37e93adb77b9c442e2781961cb /net/8021q
parent85aec73d595b8847f9c4ea571deb127913f0d508 (diff)
net/vlan: Provide read access to the vlan egress map
Provide a method for read-only access to the vlan device egress mapping. Do this by refactoring vlan_dev_get_egress_qos_mask() such that now it receives as an argument the skb priority instead of pointer to the skb. Such an access is needed for the IBoE stack where the control plane goes through the network stack. This is an add-on step on top of commit d4a968658c "net/route: export symbol ip_tos2prio" which allowed the RDMA-CM to use ip_tos2prio. Signed-off-by: Eyal Perry <eyalpe@mellanox.com> Signed-off-by: Hadar Hen Zion <hadarh@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
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;