Commit d32435391974e39c35ade4d115f17c538a96a708

Authored by Eyal Perry
Committed by David S. Miller
1 parent 85aec73d59

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>

Showing 2 changed files with 20 additions and 7 deletions Side-by-side Diff

include/linux/if_vlan.h
... ... @@ -88,7 +88,8 @@
88 88 __be16 vlan_proto, u16 vlan_id);
89 89 extern struct net_device *vlan_dev_real_dev(const struct net_device *dev);
90 90 extern u16 vlan_dev_vlan_id(const struct net_device *dev);
91   -
  91 +extern u16 vlan_dev_get_egress_qos_mask(struct net_device *dev,
  92 + u32 skprio);
92 93 extern bool vlan_do_receive(struct sk_buff **skb);
93 94 extern struct sk_buff *vlan_untag(struct sk_buff *skb);
94 95  
... ... @@ -118,6 +119,12 @@
118 119 static inline u16 vlan_dev_vlan_id(const struct net_device *dev)
119 120 {
120 121 BUG();
  122 + return 0;
  123 +}
  124 +
  125 +static inline u16 vlan_dev_get_egress_qos_mask(struct net_device *dev,
  126 + u32 skprio)
  127 +{
121 128 return 0;
122 129 }
123 130  
net/8021q/vlan_dev.c
... ... @@ -69,15 +69,15 @@
69 69 }
70 70  
71 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 74 struct vlan_priority_tci_mapping *mp;
75 75  
76 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 79 while (mp) {
80   - if (mp->priority == skb->priority) {
  80 + if (mp->priority == skprio) {
81 81 return mp->vlan_qos; /* This should already be shifted
82 82 * to mask correctly with the
83 83 * VLAN's TCI */
... ... @@ -87,6 +87,12 @@
87 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 97 * Create the VLAN header for an arbitrary protocol layer
92 98 *
... ... @@ -111,7 +117,7 @@
111 117 vhdr = (struct vlan_hdr *) skb_push(skb, VLAN_HLEN);
112 118  
113 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 121 vhdr->h_vlan_TCI = htons(vlan_tci);
116 122  
117 123 /*
... ... @@ -168,7 +174,7 @@
168 174 vlan->flags & VLAN_FLAG_REORDER_HDR) {
169 175 u16 vlan_tci;
170 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 178 skb = __vlan_hwaccel_put_tag(skb, vlan->vlan_proto, vlan_tci);
173 179 }
174 180  
... ... @@ -253,7 +259,7 @@
253 259 np->vlan_qos = vlan_qos;
254 260 /* Before inserting this element in hash table, make sure all its fields
255 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 264 smp_wmb();
259 265 vlan->egress_priority_map[skb_prio & 0xF] = np;