blob: 20057de56db07bb7f2ce851129a69e866aa54a19 [file] [log] [blame]
Vlad Yasevich243a2e62013-02-13 12:00:09 +00001#include <linux/kernel.h>
2#include <linux/netdevice.h>
3#include <linux/rtnetlink.h>
4#include <linux/slab.h>
5
6#include "br_private.h"
7
8static int __vlan_add(struct net_port_vlans *v, u16 vid)
9{
10 int err;
11
12 if (test_bit(vid, v->vlan_bitmap))
13 return -EEXIST;
14
15 if (v->port_idx && vid) {
16 struct net_device *dev = v->parent.port->dev;
17
18 /* Add VLAN to the device filter if it is supported.
19 * Stricly speaking, this is not necessary now, since devices
20 * are made promiscuous by the bridge, but if that ever changes
21 * this code will allow tagged traffic to enter the bridge.
22 */
23 if (dev->features & NETIF_F_HW_VLAN_FILTER) {
24 err = dev->netdev_ops->ndo_vlan_rx_add_vid(dev, vid);
25 if (err)
26 return err;
27 }
28 }
29
30 set_bit(vid, v->vlan_bitmap);
Vlad Yasevich6cbdcee2013-02-13 12:00:13 +000031 v->num_vlans++;
Vlad Yasevich243a2e62013-02-13 12:00:09 +000032 return 0;
33}
34
35static int __vlan_del(struct net_port_vlans *v, u16 vid)
36{
37 if (!test_bit(vid, v->vlan_bitmap))
38 return -EINVAL;
39
40 if (v->port_idx && vid) {
41 struct net_device *dev = v->parent.port->dev;
42
43 if (dev->features & NETIF_F_HW_VLAN_FILTER)
44 dev->netdev_ops->ndo_vlan_rx_kill_vid(dev, vid);
45 }
46
47 clear_bit(vid, v->vlan_bitmap);
Vlad Yasevich6cbdcee2013-02-13 12:00:13 +000048 v->num_vlans--;
Vlad Yasevich243a2e62013-02-13 12:00:09 +000049 if (bitmap_empty(v->vlan_bitmap, BR_VLAN_BITMAP_LEN)) {
50 if (v->port_idx)
51 rcu_assign_pointer(v->parent.port->vlan_info, NULL);
52 else
53 rcu_assign_pointer(v->parent.br->vlan_info, NULL);
54 kfree_rcu(v, rcu);
55 }
56 return 0;
57}
58
59static void __vlan_flush(struct net_port_vlans *v)
60{
61 bitmap_zero(v->vlan_bitmap, BR_VLAN_BITMAP_LEN);
62 if (v->port_idx)
63 rcu_assign_pointer(v->parent.port->vlan_info, NULL);
64 else
65 rcu_assign_pointer(v->parent.br->vlan_info, NULL);
66 kfree_rcu(v, rcu);
67}
68
Vlad Yasevich78851982013-02-13 12:00:14 +000069/* Strip the tag from the packet. Will return skb with tci set 0. */
70static struct sk_buff *br_vlan_untag(struct sk_buff *skb)
71{
72 if (skb->protocol != htons(ETH_P_8021Q)) {
73 skb->vlan_tci = 0;
74 return skb;
75 }
76
77 skb->vlan_tci = 0;
78 skb = vlan_untag(skb);
79 if (skb)
80 skb->vlan_tci = 0;
81
82 return skb;
83}
84
85struct sk_buff *br_handle_vlan(struct net_bridge *br,
86 const struct net_port_vlans *pv,
87 struct sk_buff *skb)
Vlad Yasevicha37b85c2013-02-13 12:00:10 +000088{
89 u16 vid;
90
Vlad Yasevich78851982013-02-13 12:00:14 +000091 if (!br->vlan_enabled)
92 goto out;
93
94 /* At this point, we know that the frame was filtered and contains
95 * a valid vlan id. If the vlan id matches the pvid of current port
96 * send untagged; otherwise, send taged.
97 */
98 br_vlan_get_tag(skb, &vid);
99 if (vid == br_get_pvid(pv))
100 skb = br_vlan_untag(skb);
101 else {
102 /* Egress policy says "send tagged". If output device
103 * is the bridge, we need to add the VLAN header
104 * ourselves since we'll be going through the RX path.
105 * Sending to ports puts the frame on the TX path and
106 * we let dev_hard_start_xmit() add the header.
107 */
108 if (skb->protocol != htons(ETH_P_8021Q) &&
109 pv->port_idx == 0) {
110 /* vlan_put_tag expects skb->data to point to
111 * mac header.
112 */
113 skb_push(skb, ETH_HLEN);
114 skb = __vlan_put_tag(skb, skb->vlan_tci);
115 if (!skb)
116 goto out;
117 /* put skb->data back to where it was */
118 skb_pull(skb, ETH_HLEN);
119 skb->vlan_tci = 0;
120 }
121 }
122
123out:
124 return skb;
125}
126
127/* Called under RCU */
128bool br_allowed_ingress(struct net_bridge *br, struct net_port_vlans *v,
129 struct sk_buff *skb, u16 *vid)
130{
Vlad Yasevicha37b85c2013-02-13 12:00:10 +0000131 /* If VLAN filtering is disabled on the bridge, all packets are
132 * permitted.
133 */
134 if (!br->vlan_enabled)
135 return true;
136
137 /* If there are no vlan in the permitted list, all packets are
138 * rejected.
139 */
140 if (!v)
141 return false;
142
Vlad Yasevich78851982013-02-13 12:00:14 +0000143 if (br_vlan_get_tag(skb, vid)) {
144 u16 pvid = br_get_pvid(v);
145
146 /* Frame did not have a tag. See if pvid is set
147 * on this port. That tells us which vlan untagged
148 * traffic belongs to.
149 */
150 if (pvid == VLAN_N_VID)
151 return false;
152
153 /* PVID is set on this port. Any untagged ingress
154 * frame is considered to belong to this vlan.
155 */
156 __vlan_hwaccel_put_tag(skb, pvid);
157 return true;
158 }
159
160 /* Frame had a valid vlan tag. See if vlan is allowed */
161 if (test_bit(*vid, v->vlan_bitmap))
Vlad Yasevicha37b85c2013-02-13 12:00:10 +0000162 return true;
163
164 return false;
165}
166
Vlad Yasevich85f46c62013-02-13 12:00:11 +0000167/* Called under RCU. */
168bool br_allowed_egress(struct net_bridge *br,
169 const struct net_port_vlans *v,
170 const struct sk_buff *skb)
171{
172 u16 vid;
173
174 if (!br->vlan_enabled)
175 return true;
176
177 if (!v)
178 return false;
179
180 br_vlan_get_tag(skb, &vid);
181 if (test_bit(vid, v->vlan_bitmap))
182 return true;
183
184 return false;
185}
186
Vlad Yasevich243a2e62013-02-13 12:00:09 +0000187/* Must be protected by RTNL */
188int br_vlan_add(struct net_bridge *br, u16 vid)
189{
190 struct net_port_vlans *pv = NULL;
191 int err;
192
193 ASSERT_RTNL();
194
195 pv = rtnl_dereference(br->vlan_info);
196 if (pv)
197 return __vlan_add(pv, vid);
198
199 /* Create port vlan infomration
200 */
201 pv = kzalloc(sizeof(*pv), GFP_KERNEL);
202 if (!pv)
203 return -ENOMEM;
204
205 pv->parent.br = br;
206 err = __vlan_add(pv, vid);
207 if (err)
208 goto out;
209
210 rcu_assign_pointer(br->vlan_info, pv);
211 return 0;
212out:
213 kfree(pv);
214 return err;
215}
216
217/* Must be protected by RTNL */
218int br_vlan_delete(struct net_bridge *br, u16 vid)
219{
220 struct net_port_vlans *pv;
221
222 ASSERT_RTNL();
223
224 pv = rtnl_dereference(br->vlan_info);
225 if (!pv)
226 return -EINVAL;
227
228 __vlan_del(pv, vid);
229 return 0;
230}
231
232void br_vlan_flush(struct net_bridge *br)
233{
234 struct net_port_vlans *pv;
235
236 ASSERT_RTNL();
237
238 pv = rtnl_dereference(br->vlan_info);
239 if (!pv)
240 return;
241
242 __vlan_flush(pv);
243}
244
245int br_vlan_filter_toggle(struct net_bridge *br, unsigned long val)
246{
247 if (!rtnl_trylock())
248 return restart_syscall();
249
250 if (br->vlan_enabled == val)
251 goto unlock;
252
253 br->vlan_enabled = val;
254
255unlock:
256 rtnl_unlock();
257 return 0;
258}
259
260/* Must be protected by RTNL */
261int nbp_vlan_add(struct net_bridge_port *port, u16 vid)
262{
263 struct net_port_vlans *pv = NULL;
264 int err;
265
266 ASSERT_RTNL();
267
268 pv = rtnl_dereference(port->vlan_info);
269 if (pv)
270 return __vlan_add(pv, vid);
271
272 /* Create port vlan infomration
273 */
274 pv = kzalloc(sizeof(*pv), GFP_KERNEL);
275 if (!pv) {
276 err = -ENOMEM;
277 goto clean_up;
278 }
279
280 pv->port_idx = port->port_no;
281 pv->parent.port = port;
282 err = __vlan_add(pv, vid);
283 if (err)
284 goto clean_up;
285
286 rcu_assign_pointer(port->vlan_info, pv);
287 return 0;
288
289clean_up:
290 kfree(pv);
291 return err;
292}
293
294/* Must be protected by RTNL */
295int nbp_vlan_delete(struct net_bridge_port *port, u16 vid)
296{
297 struct net_port_vlans *pv;
298
299 ASSERT_RTNL();
300
301 pv = rtnl_dereference(port->vlan_info);
302 if (!pv)
303 return -EINVAL;
304
305 return __vlan_del(pv, vid);
306}
307
308void nbp_vlan_flush(struct net_bridge_port *port)
309{
310 struct net_port_vlans *pv;
311
312 ASSERT_RTNL();
313
314 pv = rtnl_dereference(port->vlan_info);
315 if (!pv)
316 return;
317
318 __vlan_flush(pv);
319}