xref: /OK3568_Linux_fs/kernel/net/bridge/br_vlan.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only
2*4882a593Smuzhiyun #include <linux/kernel.h>
3*4882a593Smuzhiyun #include <linux/netdevice.h>
4*4882a593Smuzhiyun #include <linux/rtnetlink.h>
5*4882a593Smuzhiyun #include <linux/slab.h>
6*4882a593Smuzhiyun #include <net/switchdev.h>
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #include "br_private.h"
9*4882a593Smuzhiyun #include "br_private_tunnel.h"
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun static void nbp_vlan_set_vlan_dev_state(struct net_bridge_port *p, u16 vid);
12*4882a593Smuzhiyun 
br_vlan_cmp(struct rhashtable_compare_arg * arg,const void * ptr)13*4882a593Smuzhiyun static inline int br_vlan_cmp(struct rhashtable_compare_arg *arg,
14*4882a593Smuzhiyun 			      const void *ptr)
15*4882a593Smuzhiyun {
16*4882a593Smuzhiyun 	const struct net_bridge_vlan *vle = ptr;
17*4882a593Smuzhiyun 	u16 vid = *(u16 *)arg->key;
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun 	return vle->vid != vid;
20*4882a593Smuzhiyun }
21*4882a593Smuzhiyun 
22*4882a593Smuzhiyun static const struct rhashtable_params br_vlan_rht_params = {
23*4882a593Smuzhiyun 	.head_offset = offsetof(struct net_bridge_vlan, vnode),
24*4882a593Smuzhiyun 	.key_offset = offsetof(struct net_bridge_vlan, vid),
25*4882a593Smuzhiyun 	.key_len = sizeof(u16),
26*4882a593Smuzhiyun 	.nelem_hint = 3,
27*4882a593Smuzhiyun 	.max_size = VLAN_N_VID,
28*4882a593Smuzhiyun 	.obj_cmpfn = br_vlan_cmp,
29*4882a593Smuzhiyun 	.automatic_shrinking = true,
30*4882a593Smuzhiyun };
31*4882a593Smuzhiyun 
br_vlan_lookup(struct rhashtable * tbl,u16 vid)32*4882a593Smuzhiyun static struct net_bridge_vlan *br_vlan_lookup(struct rhashtable *tbl, u16 vid)
33*4882a593Smuzhiyun {
34*4882a593Smuzhiyun 	return rhashtable_lookup_fast(tbl, &vid, br_vlan_rht_params);
35*4882a593Smuzhiyun }
36*4882a593Smuzhiyun 
__vlan_add_pvid(struct net_bridge_vlan_group * vg,const struct net_bridge_vlan * v)37*4882a593Smuzhiyun static bool __vlan_add_pvid(struct net_bridge_vlan_group *vg,
38*4882a593Smuzhiyun 			    const struct net_bridge_vlan *v)
39*4882a593Smuzhiyun {
40*4882a593Smuzhiyun 	if (vg->pvid == v->vid)
41*4882a593Smuzhiyun 		return false;
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun 	smp_wmb();
44*4882a593Smuzhiyun 	br_vlan_set_pvid_state(vg, v->state);
45*4882a593Smuzhiyun 	vg->pvid = v->vid;
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun 	return true;
48*4882a593Smuzhiyun }
49*4882a593Smuzhiyun 
__vlan_delete_pvid(struct net_bridge_vlan_group * vg,u16 vid)50*4882a593Smuzhiyun static bool __vlan_delete_pvid(struct net_bridge_vlan_group *vg, u16 vid)
51*4882a593Smuzhiyun {
52*4882a593Smuzhiyun 	if (vg->pvid != vid)
53*4882a593Smuzhiyun 		return false;
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun 	smp_wmb();
56*4882a593Smuzhiyun 	vg->pvid = 0;
57*4882a593Smuzhiyun 
58*4882a593Smuzhiyun 	return true;
59*4882a593Smuzhiyun }
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun /* return true if anything changed, false otherwise */
__vlan_add_flags(struct net_bridge_vlan * v,u16 flags)62*4882a593Smuzhiyun static bool __vlan_add_flags(struct net_bridge_vlan *v, u16 flags)
63*4882a593Smuzhiyun {
64*4882a593Smuzhiyun 	struct net_bridge_vlan_group *vg;
65*4882a593Smuzhiyun 	u16 old_flags = v->flags;
66*4882a593Smuzhiyun 	bool ret;
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun 	if (br_vlan_is_master(v))
69*4882a593Smuzhiyun 		vg = br_vlan_group(v->br);
70*4882a593Smuzhiyun 	else
71*4882a593Smuzhiyun 		vg = nbp_vlan_group(v->port);
72*4882a593Smuzhiyun 
73*4882a593Smuzhiyun 	if (flags & BRIDGE_VLAN_INFO_PVID)
74*4882a593Smuzhiyun 		ret = __vlan_add_pvid(vg, v);
75*4882a593Smuzhiyun 	else
76*4882a593Smuzhiyun 		ret = __vlan_delete_pvid(vg, v->vid);
77*4882a593Smuzhiyun 
78*4882a593Smuzhiyun 	if (flags & BRIDGE_VLAN_INFO_UNTAGGED)
79*4882a593Smuzhiyun 		v->flags |= BRIDGE_VLAN_INFO_UNTAGGED;
80*4882a593Smuzhiyun 	else
81*4882a593Smuzhiyun 		v->flags &= ~BRIDGE_VLAN_INFO_UNTAGGED;
82*4882a593Smuzhiyun 
83*4882a593Smuzhiyun 	return ret || !!(old_flags ^ v->flags);
84*4882a593Smuzhiyun }
85*4882a593Smuzhiyun 
__vlan_vid_add(struct net_device * dev,struct net_bridge * br,struct net_bridge_vlan * v,u16 flags,struct netlink_ext_ack * extack)86*4882a593Smuzhiyun static int __vlan_vid_add(struct net_device *dev, struct net_bridge *br,
87*4882a593Smuzhiyun 			  struct net_bridge_vlan *v, u16 flags,
88*4882a593Smuzhiyun 			  struct netlink_ext_ack *extack)
89*4882a593Smuzhiyun {
90*4882a593Smuzhiyun 	int err;
91*4882a593Smuzhiyun 
92*4882a593Smuzhiyun 	/* Try switchdev op first. In case it is not supported, fallback to
93*4882a593Smuzhiyun 	 * 8021q add.
94*4882a593Smuzhiyun 	 */
95*4882a593Smuzhiyun 	err = br_switchdev_port_vlan_add(dev, v->vid, flags, extack);
96*4882a593Smuzhiyun 	if (err == -EOPNOTSUPP)
97*4882a593Smuzhiyun 		return vlan_vid_add(dev, br->vlan_proto, v->vid);
98*4882a593Smuzhiyun 	v->priv_flags |= BR_VLFLAG_ADDED_BY_SWITCHDEV;
99*4882a593Smuzhiyun 	return err;
100*4882a593Smuzhiyun }
101*4882a593Smuzhiyun 
__vlan_add_list(struct net_bridge_vlan * v)102*4882a593Smuzhiyun static void __vlan_add_list(struct net_bridge_vlan *v)
103*4882a593Smuzhiyun {
104*4882a593Smuzhiyun 	struct net_bridge_vlan_group *vg;
105*4882a593Smuzhiyun 	struct list_head *headp, *hpos;
106*4882a593Smuzhiyun 	struct net_bridge_vlan *vent;
107*4882a593Smuzhiyun 
108*4882a593Smuzhiyun 	if (br_vlan_is_master(v))
109*4882a593Smuzhiyun 		vg = br_vlan_group(v->br);
110*4882a593Smuzhiyun 	else
111*4882a593Smuzhiyun 		vg = nbp_vlan_group(v->port);
112*4882a593Smuzhiyun 
113*4882a593Smuzhiyun 	headp = &vg->vlan_list;
114*4882a593Smuzhiyun 	list_for_each_prev(hpos, headp) {
115*4882a593Smuzhiyun 		vent = list_entry(hpos, struct net_bridge_vlan, vlist);
116*4882a593Smuzhiyun 		if (v->vid < vent->vid)
117*4882a593Smuzhiyun 			continue;
118*4882a593Smuzhiyun 		else
119*4882a593Smuzhiyun 			break;
120*4882a593Smuzhiyun 	}
121*4882a593Smuzhiyun 	list_add_rcu(&v->vlist, hpos);
122*4882a593Smuzhiyun }
123*4882a593Smuzhiyun 
__vlan_del_list(struct net_bridge_vlan * v)124*4882a593Smuzhiyun static void __vlan_del_list(struct net_bridge_vlan *v)
125*4882a593Smuzhiyun {
126*4882a593Smuzhiyun 	list_del_rcu(&v->vlist);
127*4882a593Smuzhiyun }
128*4882a593Smuzhiyun 
__vlan_vid_del(struct net_device * dev,struct net_bridge * br,const struct net_bridge_vlan * v)129*4882a593Smuzhiyun static int __vlan_vid_del(struct net_device *dev, struct net_bridge *br,
130*4882a593Smuzhiyun 			  const struct net_bridge_vlan *v)
131*4882a593Smuzhiyun {
132*4882a593Smuzhiyun 	int err;
133*4882a593Smuzhiyun 
134*4882a593Smuzhiyun 	/* Try switchdev op first. In case it is not supported, fallback to
135*4882a593Smuzhiyun 	 * 8021q del.
136*4882a593Smuzhiyun 	 */
137*4882a593Smuzhiyun 	err = br_switchdev_port_vlan_del(dev, v->vid);
138*4882a593Smuzhiyun 	if (!(v->priv_flags & BR_VLFLAG_ADDED_BY_SWITCHDEV))
139*4882a593Smuzhiyun 		vlan_vid_del(dev, br->vlan_proto, v->vid);
140*4882a593Smuzhiyun 	return err == -EOPNOTSUPP ? 0 : err;
141*4882a593Smuzhiyun }
142*4882a593Smuzhiyun 
143*4882a593Smuzhiyun /* Returns a master vlan, if it didn't exist it gets created. In all cases
144*4882a593Smuzhiyun  * a reference is taken to the master vlan before returning.
145*4882a593Smuzhiyun  */
146*4882a593Smuzhiyun static struct net_bridge_vlan *
br_vlan_get_master(struct net_bridge * br,u16 vid,struct netlink_ext_ack * extack)147*4882a593Smuzhiyun br_vlan_get_master(struct net_bridge *br, u16 vid,
148*4882a593Smuzhiyun 		   struct netlink_ext_ack *extack)
149*4882a593Smuzhiyun {
150*4882a593Smuzhiyun 	struct net_bridge_vlan_group *vg;
151*4882a593Smuzhiyun 	struct net_bridge_vlan *masterv;
152*4882a593Smuzhiyun 
153*4882a593Smuzhiyun 	vg = br_vlan_group(br);
154*4882a593Smuzhiyun 	masterv = br_vlan_find(vg, vid);
155*4882a593Smuzhiyun 	if (!masterv) {
156*4882a593Smuzhiyun 		bool changed;
157*4882a593Smuzhiyun 
158*4882a593Smuzhiyun 		/* missing global ctx, create it now */
159*4882a593Smuzhiyun 		if (br_vlan_add(br, vid, 0, &changed, extack))
160*4882a593Smuzhiyun 			return NULL;
161*4882a593Smuzhiyun 		masterv = br_vlan_find(vg, vid);
162*4882a593Smuzhiyun 		if (WARN_ON(!masterv))
163*4882a593Smuzhiyun 			return NULL;
164*4882a593Smuzhiyun 		refcount_set(&masterv->refcnt, 1);
165*4882a593Smuzhiyun 		return masterv;
166*4882a593Smuzhiyun 	}
167*4882a593Smuzhiyun 	refcount_inc(&masterv->refcnt);
168*4882a593Smuzhiyun 
169*4882a593Smuzhiyun 	return masterv;
170*4882a593Smuzhiyun }
171*4882a593Smuzhiyun 
br_master_vlan_rcu_free(struct rcu_head * rcu)172*4882a593Smuzhiyun static void br_master_vlan_rcu_free(struct rcu_head *rcu)
173*4882a593Smuzhiyun {
174*4882a593Smuzhiyun 	struct net_bridge_vlan *v;
175*4882a593Smuzhiyun 
176*4882a593Smuzhiyun 	v = container_of(rcu, struct net_bridge_vlan, rcu);
177*4882a593Smuzhiyun 	WARN_ON(!br_vlan_is_master(v));
178*4882a593Smuzhiyun 	free_percpu(v->stats);
179*4882a593Smuzhiyun 	v->stats = NULL;
180*4882a593Smuzhiyun 	kfree(v);
181*4882a593Smuzhiyun }
182*4882a593Smuzhiyun 
br_vlan_put_master(struct net_bridge_vlan * masterv)183*4882a593Smuzhiyun static void br_vlan_put_master(struct net_bridge_vlan *masterv)
184*4882a593Smuzhiyun {
185*4882a593Smuzhiyun 	struct net_bridge_vlan_group *vg;
186*4882a593Smuzhiyun 
187*4882a593Smuzhiyun 	if (!br_vlan_is_master(masterv))
188*4882a593Smuzhiyun 		return;
189*4882a593Smuzhiyun 
190*4882a593Smuzhiyun 	vg = br_vlan_group(masterv->br);
191*4882a593Smuzhiyun 	if (refcount_dec_and_test(&masterv->refcnt)) {
192*4882a593Smuzhiyun 		rhashtable_remove_fast(&vg->vlan_hash,
193*4882a593Smuzhiyun 				       &masterv->vnode, br_vlan_rht_params);
194*4882a593Smuzhiyun 		__vlan_del_list(masterv);
195*4882a593Smuzhiyun 		call_rcu(&masterv->rcu, br_master_vlan_rcu_free);
196*4882a593Smuzhiyun 	}
197*4882a593Smuzhiyun }
198*4882a593Smuzhiyun 
nbp_vlan_rcu_free(struct rcu_head * rcu)199*4882a593Smuzhiyun static void nbp_vlan_rcu_free(struct rcu_head *rcu)
200*4882a593Smuzhiyun {
201*4882a593Smuzhiyun 	struct net_bridge_vlan *v;
202*4882a593Smuzhiyun 
203*4882a593Smuzhiyun 	v = container_of(rcu, struct net_bridge_vlan, rcu);
204*4882a593Smuzhiyun 	WARN_ON(br_vlan_is_master(v));
205*4882a593Smuzhiyun 	/* if we had per-port stats configured then free them here */
206*4882a593Smuzhiyun 	if (v->priv_flags & BR_VLFLAG_PER_PORT_STATS)
207*4882a593Smuzhiyun 		free_percpu(v->stats);
208*4882a593Smuzhiyun 	v->stats = NULL;
209*4882a593Smuzhiyun 	kfree(v);
210*4882a593Smuzhiyun }
211*4882a593Smuzhiyun 
212*4882a593Smuzhiyun /* This is the shared VLAN add function which works for both ports and bridge
213*4882a593Smuzhiyun  * devices. There are four possible calls to this function in terms of the
214*4882a593Smuzhiyun  * vlan entry type:
215*4882a593Smuzhiyun  * 1. vlan is being added on a port (no master flags, global entry exists)
216*4882a593Smuzhiyun  * 2. vlan is being added on a bridge (both master and brentry flags)
217*4882a593Smuzhiyun  * 3. vlan is being added on a port, but a global entry didn't exist which
218*4882a593Smuzhiyun  *    is being created right now (master flag set, brentry flag unset), the
219*4882a593Smuzhiyun  *    global entry is used for global per-vlan features, but not for filtering
220*4882a593Smuzhiyun  * 4. same as 3 but with both master and brentry flags set so the entry
221*4882a593Smuzhiyun  *    will be used for filtering in both the port and the bridge
222*4882a593Smuzhiyun  */
__vlan_add(struct net_bridge_vlan * v,u16 flags,struct netlink_ext_ack * extack)223*4882a593Smuzhiyun static int __vlan_add(struct net_bridge_vlan *v, u16 flags,
224*4882a593Smuzhiyun 		      struct netlink_ext_ack *extack)
225*4882a593Smuzhiyun {
226*4882a593Smuzhiyun 	struct net_bridge_vlan *masterv = NULL;
227*4882a593Smuzhiyun 	struct net_bridge_port *p = NULL;
228*4882a593Smuzhiyun 	struct net_bridge_vlan_group *vg;
229*4882a593Smuzhiyun 	struct net_device *dev;
230*4882a593Smuzhiyun 	struct net_bridge *br;
231*4882a593Smuzhiyun 	int err;
232*4882a593Smuzhiyun 
233*4882a593Smuzhiyun 	if (br_vlan_is_master(v)) {
234*4882a593Smuzhiyun 		br = v->br;
235*4882a593Smuzhiyun 		dev = br->dev;
236*4882a593Smuzhiyun 		vg = br_vlan_group(br);
237*4882a593Smuzhiyun 	} else {
238*4882a593Smuzhiyun 		p = v->port;
239*4882a593Smuzhiyun 		br = p->br;
240*4882a593Smuzhiyun 		dev = p->dev;
241*4882a593Smuzhiyun 		vg = nbp_vlan_group(p);
242*4882a593Smuzhiyun 	}
243*4882a593Smuzhiyun 
244*4882a593Smuzhiyun 	if (p) {
245*4882a593Smuzhiyun 		/* Add VLAN to the device filter if it is supported.
246*4882a593Smuzhiyun 		 * This ensures tagged traffic enters the bridge when
247*4882a593Smuzhiyun 		 * promiscuous mode is disabled by br_manage_promisc().
248*4882a593Smuzhiyun 		 */
249*4882a593Smuzhiyun 		err = __vlan_vid_add(dev, br, v, flags, extack);
250*4882a593Smuzhiyun 		if (err)
251*4882a593Smuzhiyun 			goto out;
252*4882a593Smuzhiyun 
253*4882a593Smuzhiyun 		/* need to work on the master vlan too */
254*4882a593Smuzhiyun 		if (flags & BRIDGE_VLAN_INFO_MASTER) {
255*4882a593Smuzhiyun 			bool changed;
256*4882a593Smuzhiyun 
257*4882a593Smuzhiyun 			err = br_vlan_add(br, v->vid,
258*4882a593Smuzhiyun 					  flags | BRIDGE_VLAN_INFO_BRENTRY,
259*4882a593Smuzhiyun 					  &changed, extack);
260*4882a593Smuzhiyun 			if (err)
261*4882a593Smuzhiyun 				goto out_filt;
262*4882a593Smuzhiyun 
263*4882a593Smuzhiyun 			if (changed)
264*4882a593Smuzhiyun 				br_vlan_notify(br, NULL, v->vid, 0,
265*4882a593Smuzhiyun 					       RTM_NEWVLAN);
266*4882a593Smuzhiyun 		}
267*4882a593Smuzhiyun 
268*4882a593Smuzhiyun 		masterv = br_vlan_get_master(br, v->vid, extack);
269*4882a593Smuzhiyun 		if (!masterv) {
270*4882a593Smuzhiyun 			err = -ENOMEM;
271*4882a593Smuzhiyun 			goto out_filt;
272*4882a593Smuzhiyun 		}
273*4882a593Smuzhiyun 		v->brvlan = masterv;
274*4882a593Smuzhiyun 		if (br_opt_get(br, BROPT_VLAN_STATS_PER_PORT)) {
275*4882a593Smuzhiyun 			v->stats = netdev_alloc_pcpu_stats(struct br_vlan_stats);
276*4882a593Smuzhiyun 			if (!v->stats) {
277*4882a593Smuzhiyun 				err = -ENOMEM;
278*4882a593Smuzhiyun 				goto out_filt;
279*4882a593Smuzhiyun 			}
280*4882a593Smuzhiyun 			v->priv_flags |= BR_VLFLAG_PER_PORT_STATS;
281*4882a593Smuzhiyun 		} else {
282*4882a593Smuzhiyun 			v->stats = masterv->stats;
283*4882a593Smuzhiyun 		}
284*4882a593Smuzhiyun 	} else {
285*4882a593Smuzhiyun 		err = br_switchdev_port_vlan_add(dev, v->vid, flags, extack);
286*4882a593Smuzhiyun 		if (err && err != -EOPNOTSUPP)
287*4882a593Smuzhiyun 			goto out;
288*4882a593Smuzhiyun 	}
289*4882a593Smuzhiyun 
290*4882a593Smuzhiyun 	/* Add the dev mac and count the vlan only if it's usable */
291*4882a593Smuzhiyun 	if (br_vlan_should_use(v)) {
292*4882a593Smuzhiyun 		err = br_fdb_insert(br, p, dev->dev_addr, v->vid);
293*4882a593Smuzhiyun 		if (err) {
294*4882a593Smuzhiyun 			br_err(br, "failed insert local address into bridge forwarding table\n");
295*4882a593Smuzhiyun 			goto out_filt;
296*4882a593Smuzhiyun 		}
297*4882a593Smuzhiyun 		vg->num_vlans++;
298*4882a593Smuzhiyun 	}
299*4882a593Smuzhiyun 
300*4882a593Smuzhiyun 	/* set the state before publishing */
301*4882a593Smuzhiyun 	v->state = BR_STATE_FORWARDING;
302*4882a593Smuzhiyun 
303*4882a593Smuzhiyun 	err = rhashtable_lookup_insert_fast(&vg->vlan_hash, &v->vnode,
304*4882a593Smuzhiyun 					    br_vlan_rht_params);
305*4882a593Smuzhiyun 	if (err)
306*4882a593Smuzhiyun 		goto out_fdb_insert;
307*4882a593Smuzhiyun 
308*4882a593Smuzhiyun 	__vlan_add_list(v);
309*4882a593Smuzhiyun 	__vlan_add_flags(v, flags);
310*4882a593Smuzhiyun 
311*4882a593Smuzhiyun 	if (p)
312*4882a593Smuzhiyun 		nbp_vlan_set_vlan_dev_state(p, v->vid);
313*4882a593Smuzhiyun out:
314*4882a593Smuzhiyun 	return err;
315*4882a593Smuzhiyun 
316*4882a593Smuzhiyun out_fdb_insert:
317*4882a593Smuzhiyun 	if (br_vlan_should_use(v)) {
318*4882a593Smuzhiyun 		br_fdb_find_delete_local(br, p, dev->dev_addr, v->vid);
319*4882a593Smuzhiyun 		vg->num_vlans--;
320*4882a593Smuzhiyun 	}
321*4882a593Smuzhiyun 
322*4882a593Smuzhiyun out_filt:
323*4882a593Smuzhiyun 	if (p) {
324*4882a593Smuzhiyun 		__vlan_vid_del(dev, br, v);
325*4882a593Smuzhiyun 		if (masterv) {
326*4882a593Smuzhiyun 			if (v->stats && masterv->stats != v->stats)
327*4882a593Smuzhiyun 				free_percpu(v->stats);
328*4882a593Smuzhiyun 			v->stats = NULL;
329*4882a593Smuzhiyun 
330*4882a593Smuzhiyun 			br_vlan_put_master(masterv);
331*4882a593Smuzhiyun 			v->brvlan = NULL;
332*4882a593Smuzhiyun 		}
333*4882a593Smuzhiyun 	} else {
334*4882a593Smuzhiyun 		br_switchdev_port_vlan_del(dev, v->vid);
335*4882a593Smuzhiyun 	}
336*4882a593Smuzhiyun 
337*4882a593Smuzhiyun 	goto out;
338*4882a593Smuzhiyun }
339*4882a593Smuzhiyun 
__vlan_del(struct net_bridge_vlan * v)340*4882a593Smuzhiyun static int __vlan_del(struct net_bridge_vlan *v)
341*4882a593Smuzhiyun {
342*4882a593Smuzhiyun 	struct net_bridge_vlan *masterv = v;
343*4882a593Smuzhiyun 	struct net_bridge_vlan_group *vg;
344*4882a593Smuzhiyun 	struct net_bridge_port *p = NULL;
345*4882a593Smuzhiyun 	int err = 0;
346*4882a593Smuzhiyun 
347*4882a593Smuzhiyun 	if (br_vlan_is_master(v)) {
348*4882a593Smuzhiyun 		vg = br_vlan_group(v->br);
349*4882a593Smuzhiyun 	} else {
350*4882a593Smuzhiyun 		p = v->port;
351*4882a593Smuzhiyun 		vg = nbp_vlan_group(v->port);
352*4882a593Smuzhiyun 		masterv = v->brvlan;
353*4882a593Smuzhiyun 	}
354*4882a593Smuzhiyun 
355*4882a593Smuzhiyun 	__vlan_delete_pvid(vg, v->vid);
356*4882a593Smuzhiyun 	if (p) {
357*4882a593Smuzhiyun 		err = __vlan_vid_del(p->dev, p->br, v);
358*4882a593Smuzhiyun 		if (err)
359*4882a593Smuzhiyun 			goto out;
360*4882a593Smuzhiyun 	} else {
361*4882a593Smuzhiyun 		err = br_switchdev_port_vlan_del(v->br->dev, v->vid);
362*4882a593Smuzhiyun 		if (err && err != -EOPNOTSUPP)
363*4882a593Smuzhiyun 			goto out;
364*4882a593Smuzhiyun 		err = 0;
365*4882a593Smuzhiyun 	}
366*4882a593Smuzhiyun 
367*4882a593Smuzhiyun 	if (br_vlan_should_use(v)) {
368*4882a593Smuzhiyun 		v->flags &= ~BRIDGE_VLAN_INFO_BRENTRY;
369*4882a593Smuzhiyun 		vg->num_vlans--;
370*4882a593Smuzhiyun 	}
371*4882a593Smuzhiyun 
372*4882a593Smuzhiyun 	if (masterv != v) {
373*4882a593Smuzhiyun 		vlan_tunnel_info_del(vg, v);
374*4882a593Smuzhiyun 		rhashtable_remove_fast(&vg->vlan_hash, &v->vnode,
375*4882a593Smuzhiyun 				       br_vlan_rht_params);
376*4882a593Smuzhiyun 		__vlan_del_list(v);
377*4882a593Smuzhiyun 		nbp_vlan_set_vlan_dev_state(p, v->vid);
378*4882a593Smuzhiyun 		call_rcu(&v->rcu, nbp_vlan_rcu_free);
379*4882a593Smuzhiyun 	}
380*4882a593Smuzhiyun 
381*4882a593Smuzhiyun 	br_vlan_put_master(masterv);
382*4882a593Smuzhiyun out:
383*4882a593Smuzhiyun 	return err;
384*4882a593Smuzhiyun }
385*4882a593Smuzhiyun 
__vlan_group_free(struct net_bridge_vlan_group * vg)386*4882a593Smuzhiyun static void __vlan_group_free(struct net_bridge_vlan_group *vg)
387*4882a593Smuzhiyun {
388*4882a593Smuzhiyun 	WARN_ON(!list_empty(&vg->vlan_list));
389*4882a593Smuzhiyun 	rhashtable_destroy(&vg->vlan_hash);
390*4882a593Smuzhiyun 	vlan_tunnel_deinit(vg);
391*4882a593Smuzhiyun 	kfree(vg);
392*4882a593Smuzhiyun }
393*4882a593Smuzhiyun 
__vlan_flush(const struct net_bridge * br,const struct net_bridge_port * p,struct net_bridge_vlan_group * vg)394*4882a593Smuzhiyun static void __vlan_flush(const struct net_bridge *br,
395*4882a593Smuzhiyun 			 const struct net_bridge_port *p,
396*4882a593Smuzhiyun 			 struct net_bridge_vlan_group *vg)
397*4882a593Smuzhiyun {
398*4882a593Smuzhiyun 	struct net_bridge_vlan *vlan, *tmp;
399*4882a593Smuzhiyun 	u16 v_start = 0, v_end = 0;
400*4882a593Smuzhiyun 
401*4882a593Smuzhiyun 	__vlan_delete_pvid(vg, vg->pvid);
402*4882a593Smuzhiyun 	list_for_each_entry_safe(vlan, tmp, &vg->vlan_list, vlist) {
403*4882a593Smuzhiyun 		/* take care of disjoint ranges */
404*4882a593Smuzhiyun 		if (!v_start) {
405*4882a593Smuzhiyun 			v_start = vlan->vid;
406*4882a593Smuzhiyun 		} else if (vlan->vid - v_end != 1) {
407*4882a593Smuzhiyun 			/* found range end, notify and start next one */
408*4882a593Smuzhiyun 			br_vlan_notify(br, p, v_start, v_end, RTM_DELVLAN);
409*4882a593Smuzhiyun 			v_start = vlan->vid;
410*4882a593Smuzhiyun 		}
411*4882a593Smuzhiyun 		v_end = vlan->vid;
412*4882a593Smuzhiyun 
413*4882a593Smuzhiyun 		__vlan_del(vlan);
414*4882a593Smuzhiyun 	}
415*4882a593Smuzhiyun 
416*4882a593Smuzhiyun 	/* notify about the last/whole vlan range */
417*4882a593Smuzhiyun 	if (v_start)
418*4882a593Smuzhiyun 		br_vlan_notify(br, p, v_start, v_end, RTM_DELVLAN);
419*4882a593Smuzhiyun }
420*4882a593Smuzhiyun 
br_handle_vlan(struct net_bridge * br,const struct net_bridge_port * p,struct net_bridge_vlan_group * vg,struct sk_buff * skb)421*4882a593Smuzhiyun struct sk_buff *br_handle_vlan(struct net_bridge *br,
422*4882a593Smuzhiyun 			       const struct net_bridge_port *p,
423*4882a593Smuzhiyun 			       struct net_bridge_vlan_group *vg,
424*4882a593Smuzhiyun 			       struct sk_buff *skb)
425*4882a593Smuzhiyun {
426*4882a593Smuzhiyun 	struct br_vlan_stats *stats;
427*4882a593Smuzhiyun 	struct net_bridge_vlan *v;
428*4882a593Smuzhiyun 	u16 vid;
429*4882a593Smuzhiyun 
430*4882a593Smuzhiyun 	/* If this packet was not filtered at input, let it pass */
431*4882a593Smuzhiyun 	if (!BR_INPUT_SKB_CB(skb)->vlan_filtered)
432*4882a593Smuzhiyun 		goto out;
433*4882a593Smuzhiyun 
434*4882a593Smuzhiyun 	/* At this point, we know that the frame was filtered and contains
435*4882a593Smuzhiyun 	 * a valid vlan id.  If the vlan id has untagged flag set,
436*4882a593Smuzhiyun 	 * send untagged; otherwise, send tagged.
437*4882a593Smuzhiyun 	 */
438*4882a593Smuzhiyun 	br_vlan_get_tag(skb, &vid);
439*4882a593Smuzhiyun 	v = br_vlan_find(vg, vid);
440*4882a593Smuzhiyun 	/* Vlan entry must be configured at this point.  The
441*4882a593Smuzhiyun 	 * only exception is the bridge is set in promisc mode and the
442*4882a593Smuzhiyun 	 * packet is destined for the bridge device.  In this case
443*4882a593Smuzhiyun 	 * pass the packet as is.
444*4882a593Smuzhiyun 	 */
445*4882a593Smuzhiyun 	if (!v || !br_vlan_should_use(v)) {
446*4882a593Smuzhiyun 		if ((br->dev->flags & IFF_PROMISC) && skb->dev == br->dev) {
447*4882a593Smuzhiyun 			goto out;
448*4882a593Smuzhiyun 		} else {
449*4882a593Smuzhiyun 			kfree_skb(skb);
450*4882a593Smuzhiyun 			return NULL;
451*4882a593Smuzhiyun 		}
452*4882a593Smuzhiyun 	}
453*4882a593Smuzhiyun 	if (br_opt_get(br, BROPT_VLAN_STATS_ENABLED)) {
454*4882a593Smuzhiyun 		stats = this_cpu_ptr(v->stats);
455*4882a593Smuzhiyun 		u64_stats_update_begin(&stats->syncp);
456*4882a593Smuzhiyun 		stats->tx_bytes += skb->len;
457*4882a593Smuzhiyun 		stats->tx_packets++;
458*4882a593Smuzhiyun 		u64_stats_update_end(&stats->syncp);
459*4882a593Smuzhiyun 	}
460*4882a593Smuzhiyun 
461*4882a593Smuzhiyun 	if (v->flags & BRIDGE_VLAN_INFO_UNTAGGED)
462*4882a593Smuzhiyun 		__vlan_hwaccel_clear_tag(skb);
463*4882a593Smuzhiyun 
464*4882a593Smuzhiyun 	if (p && (p->flags & BR_VLAN_TUNNEL) &&
465*4882a593Smuzhiyun 	    br_handle_egress_vlan_tunnel(skb, v)) {
466*4882a593Smuzhiyun 		kfree_skb(skb);
467*4882a593Smuzhiyun 		return NULL;
468*4882a593Smuzhiyun 	}
469*4882a593Smuzhiyun out:
470*4882a593Smuzhiyun 	return skb;
471*4882a593Smuzhiyun }
472*4882a593Smuzhiyun 
473*4882a593Smuzhiyun /* Called under RCU */
__allowed_ingress(const struct net_bridge * br,struct net_bridge_vlan_group * vg,struct sk_buff * skb,u16 * vid,u8 * state)474*4882a593Smuzhiyun static bool __allowed_ingress(const struct net_bridge *br,
475*4882a593Smuzhiyun 			      struct net_bridge_vlan_group *vg,
476*4882a593Smuzhiyun 			      struct sk_buff *skb, u16 *vid,
477*4882a593Smuzhiyun 			      u8 *state)
478*4882a593Smuzhiyun {
479*4882a593Smuzhiyun 	struct br_vlan_stats *stats;
480*4882a593Smuzhiyun 	struct net_bridge_vlan *v;
481*4882a593Smuzhiyun 	bool tagged;
482*4882a593Smuzhiyun 
483*4882a593Smuzhiyun 	BR_INPUT_SKB_CB(skb)->vlan_filtered = true;
484*4882a593Smuzhiyun 	/* If vlan tx offload is disabled on bridge device and frame was
485*4882a593Smuzhiyun 	 * sent from vlan device on the bridge device, it does not have
486*4882a593Smuzhiyun 	 * HW accelerated vlan tag.
487*4882a593Smuzhiyun 	 */
488*4882a593Smuzhiyun 	if (unlikely(!skb_vlan_tag_present(skb) &&
489*4882a593Smuzhiyun 		     skb->protocol == br->vlan_proto)) {
490*4882a593Smuzhiyun 		skb = skb_vlan_untag(skb);
491*4882a593Smuzhiyun 		if (unlikely(!skb))
492*4882a593Smuzhiyun 			return false;
493*4882a593Smuzhiyun 	}
494*4882a593Smuzhiyun 
495*4882a593Smuzhiyun 	if (!br_vlan_get_tag(skb, vid)) {
496*4882a593Smuzhiyun 		/* Tagged frame */
497*4882a593Smuzhiyun 		if (skb->vlan_proto != br->vlan_proto) {
498*4882a593Smuzhiyun 			/* Protocol-mismatch, empty out vlan_tci for new tag */
499*4882a593Smuzhiyun 			skb_push(skb, ETH_HLEN);
500*4882a593Smuzhiyun 			skb = vlan_insert_tag_set_proto(skb, skb->vlan_proto,
501*4882a593Smuzhiyun 							skb_vlan_tag_get(skb));
502*4882a593Smuzhiyun 			if (unlikely(!skb))
503*4882a593Smuzhiyun 				return false;
504*4882a593Smuzhiyun 
505*4882a593Smuzhiyun 			skb_pull(skb, ETH_HLEN);
506*4882a593Smuzhiyun 			skb_reset_mac_len(skb);
507*4882a593Smuzhiyun 			*vid = 0;
508*4882a593Smuzhiyun 			tagged = false;
509*4882a593Smuzhiyun 		} else {
510*4882a593Smuzhiyun 			tagged = true;
511*4882a593Smuzhiyun 		}
512*4882a593Smuzhiyun 	} else {
513*4882a593Smuzhiyun 		/* Untagged frame */
514*4882a593Smuzhiyun 		tagged = false;
515*4882a593Smuzhiyun 	}
516*4882a593Smuzhiyun 
517*4882a593Smuzhiyun 	if (!*vid) {
518*4882a593Smuzhiyun 		u16 pvid = br_get_pvid(vg);
519*4882a593Smuzhiyun 
520*4882a593Smuzhiyun 		/* Frame had a tag with VID 0 or did not have a tag.
521*4882a593Smuzhiyun 		 * See if pvid is set on this port.  That tells us which
522*4882a593Smuzhiyun 		 * vlan untagged or priority-tagged traffic belongs to.
523*4882a593Smuzhiyun 		 */
524*4882a593Smuzhiyun 		if (!pvid)
525*4882a593Smuzhiyun 			goto drop;
526*4882a593Smuzhiyun 
527*4882a593Smuzhiyun 		/* PVID is set on this port.  Any untagged or priority-tagged
528*4882a593Smuzhiyun 		 * ingress frame is considered to belong to this vlan.
529*4882a593Smuzhiyun 		 */
530*4882a593Smuzhiyun 		*vid = pvid;
531*4882a593Smuzhiyun 		if (likely(!tagged))
532*4882a593Smuzhiyun 			/* Untagged Frame. */
533*4882a593Smuzhiyun 			__vlan_hwaccel_put_tag(skb, br->vlan_proto, pvid);
534*4882a593Smuzhiyun 		else
535*4882a593Smuzhiyun 			/* Priority-tagged Frame.
536*4882a593Smuzhiyun 			 * At this point, we know that skb->vlan_tci VID
537*4882a593Smuzhiyun 			 * field was 0.
538*4882a593Smuzhiyun 			 * We update only VID field and preserve PCP field.
539*4882a593Smuzhiyun 			 */
540*4882a593Smuzhiyun 			skb->vlan_tci |= pvid;
541*4882a593Smuzhiyun 
542*4882a593Smuzhiyun 		/* if stats are disabled we can avoid the lookup */
543*4882a593Smuzhiyun 		if (!br_opt_get(br, BROPT_VLAN_STATS_ENABLED)) {
544*4882a593Smuzhiyun 			if (*state == BR_STATE_FORWARDING) {
545*4882a593Smuzhiyun 				*state = br_vlan_get_pvid_state(vg);
546*4882a593Smuzhiyun 				if (!br_vlan_state_allowed(*state, true))
547*4882a593Smuzhiyun 					goto drop;
548*4882a593Smuzhiyun 			}
549*4882a593Smuzhiyun 			return true;
550*4882a593Smuzhiyun 		}
551*4882a593Smuzhiyun 	}
552*4882a593Smuzhiyun 	v = br_vlan_find(vg, *vid);
553*4882a593Smuzhiyun 	if (!v || !br_vlan_should_use(v))
554*4882a593Smuzhiyun 		goto drop;
555*4882a593Smuzhiyun 
556*4882a593Smuzhiyun 	if (*state == BR_STATE_FORWARDING) {
557*4882a593Smuzhiyun 		*state = br_vlan_get_state(v);
558*4882a593Smuzhiyun 		if (!br_vlan_state_allowed(*state, true))
559*4882a593Smuzhiyun 			goto drop;
560*4882a593Smuzhiyun 	}
561*4882a593Smuzhiyun 
562*4882a593Smuzhiyun 	if (br_opt_get(br, BROPT_VLAN_STATS_ENABLED)) {
563*4882a593Smuzhiyun 		stats = this_cpu_ptr(v->stats);
564*4882a593Smuzhiyun 		u64_stats_update_begin(&stats->syncp);
565*4882a593Smuzhiyun 		stats->rx_bytes += skb->len;
566*4882a593Smuzhiyun 		stats->rx_packets++;
567*4882a593Smuzhiyun 		u64_stats_update_end(&stats->syncp);
568*4882a593Smuzhiyun 	}
569*4882a593Smuzhiyun 
570*4882a593Smuzhiyun 	return true;
571*4882a593Smuzhiyun 
572*4882a593Smuzhiyun drop:
573*4882a593Smuzhiyun 	kfree_skb(skb);
574*4882a593Smuzhiyun 	return false;
575*4882a593Smuzhiyun }
576*4882a593Smuzhiyun 
br_allowed_ingress(const struct net_bridge * br,struct net_bridge_vlan_group * vg,struct sk_buff * skb,u16 * vid,u8 * state)577*4882a593Smuzhiyun bool br_allowed_ingress(const struct net_bridge *br,
578*4882a593Smuzhiyun 			struct net_bridge_vlan_group *vg, struct sk_buff *skb,
579*4882a593Smuzhiyun 			u16 *vid, u8 *state)
580*4882a593Smuzhiyun {
581*4882a593Smuzhiyun 	/* If VLAN filtering is disabled on the bridge, all packets are
582*4882a593Smuzhiyun 	 * permitted.
583*4882a593Smuzhiyun 	 */
584*4882a593Smuzhiyun 	if (!br_opt_get(br, BROPT_VLAN_ENABLED)) {
585*4882a593Smuzhiyun 		BR_INPUT_SKB_CB(skb)->vlan_filtered = false;
586*4882a593Smuzhiyun 		return true;
587*4882a593Smuzhiyun 	}
588*4882a593Smuzhiyun 
589*4882a593Smuzhiyun 	return __allowed_ingress(br, vg, skb, vid, state);
590*4882a593Smuzhiyun }
591*4882a593Smuzhiyun 
592*4882a593Smuzhiyun /* Called under RCU. */
br_allowed_egress(struct net_bridge_vlan_group * vg,const struct sk_buff * skb)593*4882a593Smuzhiyun bool br_allowed_egress(struct net_bridge_vlan_group *vg,
594*4882a593Smuzhiyun 		       const struct sk_buff *skb)
595*4882a593Smuzhiyun {
596*4882a593Smuzhiyun 	const struct net_bridge_vlan *v;
597*4882a593Smuzhiyun 	u16 vid;
598*4882a593Smuzhiyun 
599*4882a593Smuzhiyun 	/* If this packet was not filtered at input, let it pass */
600*4882a593Smuzhiyun 	if (!BR_INPUT_SKB_CB(skb)->vlan_filtered)
601*4882a593Smuzhiyun 		return true;
602*4882a593Smuzhiyun 
603*4882a593Smuzhiyun 	br_vlan_get_tag(skb, &vid);
604*4882a593Smuzhiyun 	v = br_vlan_find(vg, vid);
605*4882a593Smuzhiyun 	if (v && br_vlan_should_use(v) &&
606*4882a593Smuzhiyun 	    br_vlan_state_allowed(br_vlan_get_state(v), false))
607*4882a593Smuzhiyun 		return true;
608*4882a593Smuzhiyun 
609*4882a593Smuzhiyun 	return false;
610*4882a593Smuzhiyun }
611*4882a593Smuzhiyun 
612*4882a593Smuzhiyun /* Called under RCU */
br_should_learn(struct net_bridge_port * p,struct sk_buff * skb,u16 * vid)613*4882a593Smuzhiyun bool br_should_learn(struct net_bridge_port *p, struct sk_buff *skb, u16 *vid)
614*4882a593Smuzhiyun {
615*4882a593Smuzhiyun 	struct net_bridge_vlan_group *vg;
616*4882a593Smuzhiyun 	struct net_bridge *br = p->br;
617*4882a593Smuzhiyun 	struct net_bridge_vlan *v;
618*4882a593Smuzhiyun 
619*4882a593Smuzhiyun 	/* If filtering was disabled at input, let it pass. */
620*4882a593Smuzhiyun 	if (!br_opt_get(br, BROPT_VLAN_ENABLED))
621*4882a593Smuzhiyun 		return true;
622*4882a593Smuzhiyun 
623*4882a593Smuzhiyun 	vg = nbp_vlan_group_rcu(p);
624*4882a593Smuzhiyun 	if (!vg || !vg->num_vlans)
625*4882a593Smuzhiyun 		return false;
626*4882a593Smuzhiyun 
627*4882a593Smuzhiyun 	if (!br_vlan_get_tag(skb, vid) && skb->vlan_proto != br->vlan_proto)
628*4882a593Smuzhiyun 		*vid = 0;
629*4882a593Smuzhiyun 
630*4882a593Smuzhiyun 	if (!*vid) {
631*4882a593Smuzhiyun 		*vid = br_get_pvid(vg);
632*4882a593Smuzhiyun 		if (!*vid ||
633*4882a593Smuzhiyun 		    !br_vlan_state_allowed(br_vlan_get_pvid_state(vg), true))
634*4882a593Smuzhiyun 			return false;
635*4882a593Smuzhiyun 
636*4882a593Smuzhiyun 		return true;
637*4882a593Smuzhiyun 	}
638*4882a593Smuzhiyun 
639*4882a593Smuzhiyun 	v = br_vlan_find(vg, *vid);
640*4882a593Smuzhiyun 	if (v && br_vlan_state_allowed(br_vlan_get_state(v), true))
641*4882a593Smuzhiyun 		return true;
642*4882a593Smuzhiyun 
643*4882a593Smuzhiyun 	return false;
644*4882a593Smuzhiyun }
645*4882a593Smuzhiyun 
br_vlan_add_existing(struct net_bridge * br,struct net_bridge_vlan_group * vg,struct net_bridge_vlan * vlan,u16 flags,bool * changed,struct netlink_ext_ack * extack)646*4882a593Smuzhiyun static int br_vlan_add_existing(struct net_bridge *br,
647*4882a593Smuzhiyun 				struct net_bridge_vlan_group *vg,
648*4882a593Smuzhiyun 				struct net_bridge_vlan *vlan,
649*4882a593Smuzhiyun 				u16 flags, bool *changed,
650*4882a593Smuzhiyun 				struct netlink_ext_ack *extack)
651*4882a593Smuzhiyun {
652*4882a593Smuzhiyun 	int err;
653*4882a593Smuzhiyun 
654*4882a593Smuzhiyun 	err = br_switchdev_port_vlan_add(br->dev, vlan->vid, flags, extack);
655*4882a593Smuzhiyun 	if (err && err != -EOPNOTSUPP)
656*4882a593Smuzhiyun 		return err;
657*4882a593Smuzhiyun 
658*4882a593Smuzhiyun 	if (!br_vlan_is_brentry(vlan)) {
659*4882a593Smuzhiyun 		/* Trying to change flags of non-existent bridge vlan */
660*4882a593Smuzhiyun 		if (!(flags & BRIDGE_VLAN_INFO_BRENTRY)) {
661*4882a593Smuzhiyun 			err = -EINVAL;
662*4882a593Smuzhiyun 			goto err_flags;
663*4882a593Smuzhiyun 		}
664*4882a593Smuzhiyun 		/* It was only kept for port vlans, now make it real */
665*4882a593Smuzhiyun 		err = br_fdb_insert(br, NULL, br->dev->dev_addr,
666*4882a593Smuzhiyun 				    vlan->vid);
667*4882a593Smuzhiyun 		if (err) {
668*4882a593Smuzhiyun 			br_err(br, "failed to insert local address into bridge forwarding table\n");
669*4882a593Smuzhiyun 			goto err_fdb_insert;
670*4882a593Smuzhiyun 		}
671*4882a593Smuzhiyun 
672*4882a593Smuzhiyun 		refcount_inc(&vlan->refcnt);
673*4882a593Smuzhiyun 		vlan->flags |= BRIDGE_VLAN_INFO_BRENTRY;
674*4882a593Smuzhiyun 		vg->num_vlans++;
675*4882a593Smuzhiyun 		*changed = true;
676*4882a593Smuzhiyun 	}
677*4882a593Smuzhiyun 
678*4882a593Smuzhiyun 	if (__vlan_add_flags(vlan, flags))
679*4882a593Smuzhiyun 		*changed = true;
680*4882a593Smuzhiyun 
681*4882a593Smuzhiyun 	return 0;
682*4882a593Smuzhiyun 
683*4882a593Smuzhiyun err_fdb_insert:
684*4882a593Smuzhiyun err_flags:
685*4882a593Smuzhiyun 	br_switchdev_port_vlan_del(br->dev, vlan->vid);
686*4882a593Smuzhiyun 	return err;
687*4882a593Smuzhiyun }
688*4882a593Smuzhiyun 
689*4882a593Smuzhiyun /* Must be protected by RTNL.
690*4882a593Smuzhiyun  * Must be called with vid in range from 1 to 4094 inclusive.
691*4882a593Smuzhiyun  * changed must be true only if the vlan was created or updated
692*4882a593Smuzhiyun  */
br_vlan_add(struct net_bridge * br,u16 vid,u16 flags,bool * changed,struct netlink_ext_ack * extack)693*4882a593Smuzhiyun int br_vlan_add(struct net_bridge *br, u16 vid, u16 flags, bool *changed,
694*4882a593Smuzhiyun 		struct netlink_ext_ack *extack)
695*4882a593Smuzhiyun {
696*4882a593Smuzhiyun 	struct net_bridge_vlan_group *vg;
697*4882a593Smuzhiyun 	struct net_bridge_vlan *vlan;
698*4882a593Smuzhiyun 	int ret;
699*4882a593Smuzhiyun 
700*4882a593Smuzhiyun 	ASSERT_RTNL();
701*4882a593Smuzhiyun 
702*4882a593Smuzhiyun 	*changed = false;
703*4882a593Smuzhiyun 	vg = br_vlan_group(br);
704*4882a593Smuzhiyun 	vlan = br_vlan_find(vg, vid);
705*4882a593Smuzhiyun 	if (vlan)
706*4882a593Smuzhiyun 		return br_vlan_add_existing(br, vg, vlan, flags, changed,
707*4882a593Smuzhiyun 					    extack);
708*4882a593Smuzhiyun 
709*4882a593Smuzhiyun 	vlan = kzalloc(sizeof(*vlan), GFP_KERNEL);
710*4882a593Smuzhiyun 	if (!vlan)
711*4882a593Smuzhiyun 		return -ENOMEM;
712*4882a593Smuzhiyun 
713*4882a593Smuzhiyun 	vlan->stats = netdev_alloc_pcpu_stats(struct br_vlan_stats);
714*4882a593Smuzhiyun 	if (!vlan->stats) {
715*4882a593Smuzhiyun 		kfree(vlan);
716*4882a593Smuzhiyun 		return -ENOMEM;
717*4882a593Smuzhiyun 	}
718*4882a593Smuzhiyun 	vlan->vid = vid;
719*4882a593Smuzhiyun 	vlan->flags = flags | BRIDGE_VLAN_INFO_MASTER;
720*4882a593Smuzhiyun 	vlan->flags &= ~BRIDGE_VLAN_INFO_PVID;
721*4882a593Smuzhiyun 	vlan->br = br;
722*4882a593Smuzhiyun 	if (flags & BRIDGE_VLAN_INFO_BRENTRY)
723*4882a593Smuzhiyun 		refcount_set(&vlan->refcnt, 1);
724*4882a593Smuzhiyun 	ret = __vlan_add(vlan, flags, extack);
725*4882a593Smuzhiyun 	if (ret) {
726*4882a593Smuzhiyun 		free_percpu(vlan->stats);
727*4882a593Smuzhiyun 		kfree(vlan);
728*4882a593Smuzhiyun 	} else {
729*4882a593Smuzhiyun 		*changed = true;
730*4882a593Smuzhiyun 	}
731*4882a593Smuzhiyun 
732*4882a593Smuzhiyun 	return ret;
733*4882a593Smuzhiyun }
734*4882a593Smuzhiyun 
735*4882a593Smuzhiyun /* Must be protected by RTNL.
736*4882a593Smuzhiyun  * Must be called with vid in range from 1 to 4094 inclusive.
737*4882a593Smuzhiyun  */
br_vlan_delete(struct net_bridge * br,u16 vid)738*4882a593Smuzhiyun int br_vlan_delete(struct net_bridge *br, u16 vid)
739*4882a593Smuzhiyun {
740*4882a593Smuzhiyun 	struct net_bridge_vlan_group *vg;
741*4882a593Smuzhiyun 	struct net_bridge_vlan *v;
742*4882a593Smuzhiyun 
743*4882a593Smuzhiyun 	ASSERT_RTNL();
744*4882a593Smuzhiyun 
745*4882a593Smuzhiyun 	vg = br_vlan_group(br);
746*4882a593Smuzhiyun 	v = br_vlan_find(vg, vid);
747*4882a593Smuzhiyun 	if (!v || !br_vlan_is_brentry(v))
748*4882a593Smuzhiyun 		return -ENOENT;
749*4882a593Smuzhiyun 
750*4882a593Smuzhiyun 	br_fdb_find_delete_local(br, NULL, br->dev->dev_addr, vid);
751*4882a593Smuzhiyun 	br_fdb_delete_by_port(br, NULL, vid, 0);
752*4882a593Smuzhiyun 
753*4882a593Smuzhiyun 	vlan_tunnel_info_del(vg, v);
754*4882a593Smuzhiyun 
755*4882a593Smuzhiyun 	return __vlan_del(v);
756*4882a593Smuzhiyun }
757*4882a593Smuzhiyun 
br_vlan_flush(struct net_bridge * br)758*4882a593Smuzhiyun void br_vlan_flush(struct net_bridge *br)
759*4882a593Smuzhiyun {
760*4882a593Smuzhiyun 	struct net_bridge_vlan_group *vg;
761*4882a593Smuzhiyun 
762*4882a593Smuzhiyun 	ASSERT_RTNL();
763*4882a593Smuzhiyun 
764*4882a593Smuzhiyun 	vg = br_vlan_group(br);
765*4882a593Smuzhiyun 	__vlan_flush(br, NULL, vg);
766*4882a593Smuzhiyun 	RCU_INIT_POINTER(br->vlgrp, NULL);
767*4882a593Smuzhiyun 	synchronize_rcu();
768*4882a593Smuzhiyun 	__vlan_group_free(vg);
769*4882a593Smuzhiyun }
770*4882a593Smuzhiyun 
br_vlan_find(struct net_bridge_vlan_group * vg,u16 vid)771*4882a593Smuzhiyun struct net_bridge_vlan *br_vlan_find(struct net_bridge_vlan_group *vg, u16 vid)
772*4882a593Smuzhiyun {
773*4882a593Smuzhiyun 	if (!vg)
774*4882a593Smuzhiyun 		return NULL;
775*4882a593Smuzhiyun 
776*4882a593Smuzhiyun 	return br_vlan_lookup(&vg->vlan_hash, vid);
777*4882a593Smuzhiyun }
778*4882a593Smuzhiyun 
779*4882a593Smuzhiyun /* Must be protected by RTNL. */
recalculate_group_addr(struct net_bridge * br)780*4882a593Smuzhiyun static void recalculate_group_addr(struct net_bridge *br)
781*4882a593Smuzhiyun {
782*4882a593Smuzhiyun 	if (br_opt_get(br, BROPT_GROUP_ADDR_SET))
783*4882a593Smuzhiyun 		return;
784*4882a593Smuzhiyun 
785*4882a593Smuzhiyun 	spin_lock_bh(&br->lock);
786*4882a593Smuzhiyun 	if (!br_opt_get(br, BROPT_VLAN_ENABLED) ||
787*4882a593Smuzhiyun 	    br->vlan_proto == htons(ETH_P_8021Q)) {
788*4882a593Smuzhiyun 		/* Bridge Group Address */
789*4882a593Smuzhiyun 		br->group_addr[5] = 0x00;
790*4882a593Smuzhiyun 	} else { /* vlan_enabled && ETH_P_8021AD */
791*4882a593Smuzhiyun 		/* Provider Bridge Group Address */
792*4882a593Smuzhiyun 		br->group_addr[5] = 0x08;
793*4882a593Smuzhiyun 	}
794*4882a593Smuzhiyun 	spin_unlock_bh(&br->lock);
795*4882a593Smuzhiyun }
796*4882a593Smuzhiyun 
797*4882a593Smuzhiyun /* Must be protected by RTNL. */
br_recalculate_fwd_mask(struct net_bridge * br)798*4882a593Smuzhiyun void br_recalculate_fwd_mask(struct net_bridge *br)
799*4882a593Smuzhiyun {
800*4882a593Smuzhiyun 	if (!br_opt_get(br, BROPT_VLAN_ENABLED) ||
801*4882a593Smuzhiyun 	    br->vlan_proto == htons(ETH_P_8021Q))
802*4882a593Smuzhiyun 		br->group_fwd_mask_required = BR_GROUPFWD_DEFAULT;
803*4882a593Smuzhiyun 	else /* vlan_enabled && ETH_P_8021AD */
804*4882a593Smuzhiyun 		br->group_fwd_mask_required = BR_GROUPFWD_8021AD &
805*4882a593Smuzhiyun 					      ~(1u << br->group_addr[5]);
806*4882a593Smuzhiyun }
807*4882a593Smuzhiyun 
__br_vlan_filter_toggle(struct net_bridge * br,unsigned long val)808*4882a593Smuzhiyun int __br_vlan_filter_toggle(struct net_bridge *br, unsigned long val)
809*4882a593Smuzhiyun {
810*4882a593Smuzhiyun 	struct switchdev_attr attr = {
811*4882a593Smuzhiyun 		.orig_dev = br->dev,
812*4882a593Smuzhiyun 		.id = SWITCHDEV_ATTR_ID_BRIDGE_VLAN_FILTERING,
813*4882a593Smuzhiyun 		.flags = SWITCHDEV_F_SKIP_EOPNOTSUPP,
814*4882a593Smuzhiyun 		.u.vlan_filtering = val,
815*4882a593Smuzhiyun 	};
816*4882a593Smuzhiyun 	int err;
817*4882a593Smuzhiyun 
818*4882a593Smuzhiyun 	if (br_opt_get(br, BROPT_VLAN_ENABLED) == !!val)
819*4882a593Smuzhiyun 		return 0;
820*4882a593Smuzhiyun 
821*4882a593Smuzhiyun 	err = switchdev_port_attr_set(br->dev, &attr);
822*4882a593Smuzhiyun 	if (err && err != -EOPNOTSUPP)
823*4882a593Smuzhiyun 		return err;
824*4882a593Smuzhiyun 
825*4882a593Smuzhiyun 	br_opt_toggle(br, BROPT_VLAN_ENABLED, !!val);
826*4882a593Smuzhiyun 	br_manage_promisc(br);
827*4882a593Smuzhiyun 	recalculate_group_addr(br);
828*4882a593Smuzhiyun 	br_recalculate_fwd_mask(br);
829*4882a593Smuzhiyun 
830*4882a593Smuzhiyun 	return 0;
831*4882a593Smuzhiyun }
832*4882a593Smuzhiyun 
br_vlan_filter_toggle(struct net_bridge * br,unsigned long val)833*4882a593Smuzhiyun int br_vlan_filter_toggle(struct net_bridge *br, unsigned long val)
834*4882a593Smuzhiyun {
835*4882a593Smuzhiyun 	return __br_vlan_filter_toggle(br, val);
836*4882a593Smuzhiyun }
837*4882a593Smuzhiyun 
br_vlan_enabled(const struct net_device * dev)838*4882a593Smuzhiyun bool br_vlan_enabled(const struct net_device *dev)
839*4882a593Smuzhiyun {
840*4882a593Smuzhiyun 	struct net_bridge *br = netdev_priv(dev);
841*4882a593Smuzhiyun 
842*4882a593Smuzhiyun 	return br_opt_get(br, BROPT_VLAN_ENABLED);
843*4882a593Smuzhiyun }
844*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(br_vlan_enabled);
845*4882a593Smuzhiyun 
br_vlan_get_proto(const struct net_device * dev,u16 * p_proto)846*4882a593Smuzhiyun int br_vlan_get_proto(const struct net_device *dev, u16 *p_proto)
847*4882a593Smuzhiyun {
848*4882a593Smuzhiyun 	struct net_bridge *br = netdev_priv(dev);
849*4882a593Smuzhiyun 
850*4882a593Smuzhiyun 	*p_proto = ntohs(br->vlan_proto);
851*4882a593Smuzhiyun 
852*4882a593Smuzhiyun 	return 0;
853*4882a593Smuzhiyun }
854*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(br_vlan_get_proto);
855*4882a593Smuzhiyun 
__br_vlan_set_proto(struct net_bridge * br,__be16 proto)856*4882a593Smuzhiyun int __br_vlan_set_proto(struct net_bridge *br, __be16 proto)
857*4882a593Smuzhiyun {
858*4882a593Smuzhiyun 	struct switchdev_attr attr = {
859*4882a593Smuzhiyun 		.orig_dev = br->dev,
860*4882a593Smuzhiyun 		.id = SWITCHDEV_ATTR_ID_BRIDGE_VLAN_PROTOCOL,
861*4882a593Smuzhiyun 		.flags = SWITCHDEV_F_SKIP_EOPNOTSUPP,
862*4882a593Smuzhiyun 		.u.vlan_protocol = ntohs(proto),
863*4882a593Smuzhiyun 	};
864*4882a593Smuzhiyun 	int err = 0;
865*4882a593Smuzhiyun 	struct net_bridge_port *p;
866*4882a593Smuzhiyun 	struct net_bridge_vlan *vlan;
867*4882a593Smuzhiyun 	struct net_bridge_vlan_group *vg;
868*4882a593Smuzhiyun 	__be16 oldproto = br->vlan_proto;
869*4882a593Smuzhiyun 
870*4882a593Smuzhiyun 	if (br->vlan_proto == proto)
871*4882a593Smuzhiyun 		return 0;
872*4882a593Smuzhiyun 
873*4882a593Smuzhiyun 	err = switchdev_port_attr_set(br->dev, &attr);
874*4882a593Smuzhiyun 	if (err && err != -EOPNOTSUPP)
875*4882a593Smuzhiyun 		return err;
876*4882a593Smuzhiyun 
877*4882a593Smuzhiyun 	/* Add VLANs for the new proto to the device filter. */
878*4882a593Smuzhiyun 	list_for_each_entry(p, &br->port_list, list) {
879*4882a593Smuzhiyun 		vg = nbp_vlan_group(p);
880*4882a593Smuzhiyun 		list_for_each_entry(vlan, &vg->vlan_list, vlist) {
881*4882a593Smuzhiyun 			if (vlan->priv_flags & BR_VLFLAG_ADDED_BY_SWITCHDEV)
882*4882a593Smuzhiyun 				continue;
883*4882a593Smuzhiyun 			err = vlan_vid_add(p->dev, proto, vlan->vid);
884*4882a593Smuzhiyun 			if (err)
885*4882a593Smuzhiyun 				goto err_filt;
886*4882a593Smuzhiyun 		}
887*4882a593Smuzhiyun 	}
888*4882a593Smuzhiyun 
889*4882a593Smuzhiyun 	br->vlan_proto = proto;
890*4882a593Smuzhiyun 
891*4882a593Smuzhiyun 	recalculate_group_addr(br);
892*4882a593Smuzhiyun 	br_recalculate_fwd_mask(br);
893*4882a593Smuzhiyun 
894*4882a593Smuzhiyun 	/* Delete VLANs for the old proto from the device filter. */
895*4882a593Smuzhiyun 	list_for_each_entry(p, &br->port_list, list) {
896*4882a593Smuzhiyun 		vg = nbp_vlan_group(p);
897*4882a593Smuzhiyun 		list_for_each_entry(vlan, &vg->vlan_list, vlist) {
898*4882a593Smuzhiyun 			if (vlan->priv_flags & BR_VLFLAG_ADDED_BY_SWITCHDEV)
899*4882a593Smuzhiyun 				continue;
900*4882a593Smuzhiyun 			vlan_vid_del(p->dev, oldproto, vlan->vid);
901*4882a593Smuzhiyun 		}
902*4882a593Smuzhiyun 	}
903*4882a593Smuzhiyun 
904*4882a593Smuzhiyun 	return 0;
905*4882a593Smuzhiyun 
906*4882a593Smuzhiyun err_filt:
907*4882a593Smuzhiyun 	attr.u.vlan_protocol = ntohs(oldproto);
908*4882a593Smuzhiyun 	switchdev_port_attr_set(br->dev, &attr);
909*4882a593Smuzhiyun 
910*4882a593Smuzhiyun 	list_for_each_entry_continue_reverse(vlan, &vg->vlan_list, vlist) {
911*4882a593Smuzhiyun 		if (vlan->priv_flags & BR_VLFLAG_ADDED_BY_SWITCHDEV)
912*4882a593Smuzhiyun 			continue;
913*4882a593Smuzhiyun 		vlan_vid_del(p->dev, proto, vlan->vid);
914*4882a593Smuzhiyun 	}
915*4882a593Smuzhiyun 
916*4882a593Smuzhiyun 	list_for_each_entry_continue_reverse(p, &br->port_list, list) {
917*4882a593Smuzhiyun 		vg = nbp_vlan_group(p);
918*4882a593Smuzhiyun 		list_for_each_entry(vlan, &vg->vlan_list, vlist) {
919*4882a593Smuzhiyun 			if (vlan->priv_flags & BR_VLFLAG_ADDED_BY_SWITCHDEV)
920*4882a593Smuzhiyun 				continue;
921*4882a593Smuzhiyun 			vlan_vid_del(p->dev, proto, vlan->vid);
922*4882a593Smuzhiyun 		}
923*4882a593Smuzhiyun 	}
924*4882a593Smuzhiyun 
925*4882a593Smuzhiyun 	return err;
926*4882a593Smuzhiyun }
927*4882a593Smuzhiyun 
br_vlan_set_proto(struct net_bridge * br,unsigned long val)928*4882a593Smuzhiyun int br_vlan_set_proto(struct net_bridge *br, unsigned long val)
929*4882a593Smuzhiyun {
930*4882a593Smuzhiyun 	if (val != ETH_P_8021Q && val != ETH_P_8021AD)
931*4882a593Smuzhiyun 		return -EPROTONOSUPPORT;
932*4882a593Smuzhiyun 
933*4882a593Smuzhiyun 	return __br_vlan_set_proto(br, htons(val));
934*4882a593Smuzhiyun }
935*4882a593Smuzhiyun 
br_vlan_set_stats(struct net_bridge * br,unsigned long val)936*4882a593Smuzhiyun int br_vlan_set_stats(struct net_bridge *br, unsigned long val)
937*4882a593Smuzhiyun {
938*4882a593Smuzhiyun 	switch (val) {
939*4882a593Smuzhiyun 	case 0:
940*4882a593Smuzhiyun 	case 1:
941*4882a593Smuzhiyun 		br_opt_toggle(br, BROPT_VLAN_STATS_ENABLED, !!val);
942*4882a593Smuzhiyun 		break;
943*4882a593Smuzhiyun 	default:
944*4882a593Smuzhiyun 		return -EINVAL;
945*4882a593Smuzhiyun 	}
946*4882a593Smuzhiyun 
947*4882a593Smuzhiyun 	return 0;
948*4882a593Smuzhiyun }
949*4882a593Smuzhiyun 
br_vlan_set_stats_per_port(struct net_bridge * br,unsigned long val)950*4882a593Smuzhiyun int br_vlan_set_stats_per_port(struct net_bridge *br, unsigned long val)
951*4882a593Smuzhiyun {
952*4882a593Smuzhiyun 	struct net_bridge_port *p;
953*4882a593Smuzhiyun 
954*4882a593Smuzhiyun 	/* allow to change the option if there are no port vlans configured */
955*4882a593Smuzhiyun 	list_for_each_entry(p, &br->port_list, list) {
956*4882a593Smuzhiyun 		struct net_bridge_vlan_group *vg = nbp_vlan_group(p);
957*4882a593Smuzhiyun 
958*4882a593Smuzhiyun 		if (vg->num_vlans)
959*4882a593Smuzhiyun 			return -EBUSY;
960*4882a593Smuzhiyun 	}
961*4882a593Smuzhiyun 
962*4882a593Smuzhiyun 	switch (val) {
963*4882a593Smuzhiyun 	case 0:
964*4882a593Smuzhiyun 	case 1:
965*4882a593Smuzhiyun 		br_opt_toggle(br, BROPT_VLAN_STATS_PER_PORT, !!val);
966*4882a593Smuzhiyun 		break;
967*4882a593Smuzhiyun 	default:
968*4882a593Smuzhiyun 		return -EINVAL;
969*4882a593Smuzhiyun 	}
970*4882a593Smuzhiyun 
971*4882a593Smuzhiyun 	return 0;
972*4882a593Smuzhiyun }
973*4882a593Smuzhiyun 
vlan_default_pvid(struct net_bridge_vlan_group * vg,u16 vid)974*4882a593Smuzhiyun static bool vlan_default_pvid(struct net_bridge_vlan_group *vg, u16 vid)
975*4882a593Smuzhiyun {
976*4882a593Smuzhiyun 	struct net_bridge_vlan *v;
977*4882a593Smuzhiyun 
978*4882a593Smuzhiyun 	if (vid != vg->pvid)
979*4882a593Smuzhiyun 		return false;
980*4882a593Smuzhiyun 
981*4882a593Smuzhiyun 	v = br_vlan_lookup(&vg->vlan_hash, vid);
982*4882a593Smuzhiyun 	if (v && br_vlan_should_use(v) &&
983*4882a593Smuzhiyun 	    (v->flags & BRIDGE_VLAN_INFO_UNTAGGED))
984*4882a593Smuzhiyun 		return true;
985*4882a593Smuzhiyun 
986*4882a593Smuzhiyun 	return false;
987*4882a593Smuzhiyun }
988*4882a593Smuzhiyun 
br_vlan_disable_default_pvid(struct net_bridge * br)989*4882a593Smuzhiyun static void br_vlan_disable_default_pvid(struct net_bridge *br)
990*4882a593Smuzhiyun {
991*4882a593Smuzhiyun 	struct net_bridge_port *p;
992*4882a593Smuzhiyun 	u16 pvid = br->default_pvid;
993*4882a593Smuzhiyun 
994*4882a593Smuzhiyun 	/* Disable default_pvid on all ports where it is still
995*4882a593Smuzhiyun 	 * configured.
996*4882a593Smuzhiyun 	 */
997*4882a593Smuzhiyun 	if (vlan_default_pvid(br_vlan_group(br), pvid)) {
998*4882a593Smuzhiyun 		if (!br_vlan_delete(br, pvid))
999*4882a593Smuzhiyun 			br_vlan_notify(br, NULL, pvid, 0, RTM_DELVLAN);
1000*4882a593Smuzhiyun 	}
1001*4882a593Smuzhiyun 
1002*4882a593Smuzhiyun 	list_for_each_entry(p, &br->port_list, list) {
1003*4882a593Smuzhiyun 		if (vlan_default_pvid(nbp_vlan_group(p), pvid) &&
1004*4882a593Smuzhiyun 		    !nbp_vlan_delete(p, pvid))
1005*4882a593Smuzhiyun 			br_vlan_notify(br, p, pvid, 0, RTM_DELVLAN);
1006*4882a593Smuzhiyun 	}
1007*4882a593Smuzhiyun 
1008*4882a593Smuzhiyun 	br->default_pvid = 0;
1009*4882a593Smuzhiyun }
1010*4882a593Smuzhiyun 
__br_vlan_set_default_pvid(struct net_bridge * br,u16 pvid,struct netlink_ext_ack * extack)1011*4882a593Smuzhiyun int __br_vlan_set_default_pvid(struct net_bridge *br, u16 pvid,
1012*4882a593Smuzhiyun 			       struct netlink_ext_ack *extack)
1013*4882a593Smuzhiyun {
1014*4882a593Smuzhiyun 	const struct net_bridge_vlan *pvent;
1015*4882a593Smuzhiyun 	struct net_bridge_vlan_group *vg;
1016*4882a593Smuzhiyun 	struct net_bridge_port *p;
1017*4882a593Smuzhiyun 	unsigned long *changed;
1018*4882a593Smuzhiyun 	bool vlchange;
1019*4882a593Smuzhiyun 	u16 old_pvid;
1020*4882a593Smuzhiyun 	int err = 0;
1021*4882a593Smuzhiyun 
1022*4882a593Smuzhiyun 	if (!pvid) {
1023*4882a593Smuzhiyun 		br_vlan_disable_default_pvid(br);
1024*4882a593Smuzhiyun 		return 0;
1025*4882a593Smuzhiyun 	}
1026*4882a593Smuzhiyun 
1027*4882a593Smuzhiyun 	changed = bitmap_zalloc(BR_MAX_PORTS, GFP_KERNEL);
1028*4882a593Smuzhiyun 	if (!changed)
1029*4882a593Smuzhiyun 		return -ENOMEM;
1030*4882a593Smuzhiyun 
1031*4882a593Smuzhiyun 	old_pvid = br->default_pvid;
1032*4882a593Smuzhiyun 
1033*4882a593Smuzhiyun 	/* Update default_pvid config only if we do not conflict with
1034*4882a593Smuzhiyun 	 * user configuration.
1035*4882a593Smuzhiyun 	 */
1036*4882a593Smuzhiyun 	vg = br_vlan_group(br);
1037*4882a593Smuzhiyun 	pvent = br_vlan_find(vg, pvid);
1038*4882a593Smuzhiyun 	if ((!old_pvid || vlan_default_pvid(vg, old_pvid)) &&
1039*4882a593Smuzhiyun 	    (!pvent || !br_vlan_should_use(pvent))) {
1040*4882a593Smuzhiyun 		err = br_vlan_add(br, pvid,
1041*4882a593Smuzhiyun 				  BRIDGE_VLAN_INFO_PVID |
1042*4882a593Smuzhiyun 				  BRIDGE_VLAN_INFO_UNTAGGED |
1043*4882a593Smuzhiyun 				  BRIDGE_VLAN_INFO_BRENTRY,
1044*4882a593Smuzhiyun 				  &vlchange, extack);
1045*4882a593Smuzhiyun 		if (err)
1046*4882a593Smuzhiyun 			goto out;
1047*4882a593Smuzhiyun 
1048*4882a593Smuzhiyun 		if (br_vlan_delete(br, old_pvid))
1049*4882a593Smuzhiyun 			br_vlan_notify(br, NULL, old_pvid, 0, RTM_DELVLAN);
1050*4882a593Smuzhiyun 		br_vlan_notify(br, NULL, pvid, 0, RTM_NEWVLAN);
1051*4882a593Smuzhiyun 		set_bit(0, changed);
1052*4882a593Smuzhiyun 	}
1053*4882a593Smuzhiyun 
1054*4882a593Smuzhiyun 	list_for_each_entry(p, &br->port_list, list) {
1055*4882a593Smuzhiyun 		/* Update default_pvid config only if we do not conflict with
1056*4882a593Smuzhiyun 		 * user configuration.
1057*4882a593Smuzhiyun 		 */
1058*4882a593Smuzhiyun 		vg = nbp_vlan_group(p);
1059*4882a593Smuzhiyun 		if ((old_pvid &&
1060*4882a593Smuzhiyun 		     !vlan_default_pvid(vg, old_pvid)) ||
1061*4882a593Smuzhiyun 		    br_vlan_find(vg, pvid))
1062*4882a593Smuzhiyun 			continue;
1063*4882a593Smuzhiyun 
1064*4882a593Smuzhiyun 		err = nbp_vlan_add(p, pvid,
1065*4882a593Smuzhiyun 				   BRIDGE_VLAN_INFO_PVID |
1066*4882a593Smuzhiyun 				   BRIDGE_VLAN_INFO_UNTAGGED,
1067*4882a593Smuzhiyun 				   &vlchange, extack);
1068*4882a593Smuzhiyun 		if (err)
1069*4882a593Smuzhiyun 			goto err_port;
1070*4882a593Smuzhiyun 		if (nbp_vlan_delete(p, old_pvid))
1071*4882a593Smuzhiyun 			br_vlan_notify(br, p, old_pvid, 0, RTM_DELVLAN);
1072*4882a593Smuzhiyun 		br_vlan_notify(p->br, p, pvid, 0, RTM_NEWVLAN);
1073*4882a593Smuzhiyun 		set_bit(p->port_no, changed);
1074*4882a593Smuzhiyun 	}
1075*4882a593Smuzhiyun 
1076*4882a593Smuzhiyun 	br->default_pvid = pvid;
1077*4882a593Smuzhiyun 
1078*4882a593Smuzhiyun out:
1079*4882a593Smuzhiyun 	bitmap_free(changed);
1080*4882a593Smuzhiyun 	return err;
1081*4882a593Smuzhiyun 
1082*4882a593Smuzhiyun err_port:
1083*4882a593Smuzhiyun 	list_for_each_entry_continue_reverse(p, &br->port_list, list) {
1084*4882a593Smuzhiyun 		if (!test_bit(p->port_no, changed))
1085*4882a593Smuzhiyun 			continue;
1086*4882a593Smuzhiyun 
1087*4882a593Smuzhiyun 		if (old_pvid) {
1088*4882a593Smuzhiyun 			nbp_vlan_add(p, old_pvid,
1089*4882a593Smuzhiyun 				     BRIDGE_VLAN_INFO_PVID |
1090*4882a593Smuzhiyun 				     BRIDGE_VLAN_INFO_UNTAGGED,
1091*4882a593Smuzhiyun 				     &vlchange, NULL);
1092*4882a593Smuzhiyun 			br_vlan_notify(p->br, p, old_pvid, 0, RTM_NEWVLAN);
1093*4882a593Smuzhiyun 		}
1094*4882a593Smuzhiyun 		nbp_vlan_delete(p, pvid);
1095*4882a593Smuzhiyun 		br_vlan_notify(br, p, pvid, 0, RTM_DELVLAN);
1096*4882a593Smuzhiyun 	}
1097*4882a593Smuzhiyun 
1098*4882a593Smuzhiyun 	if (test_bit(0, changed)) {
1099*4882a593Smuzhiyun 		if (old_pvid) {
1100*4882a593Smuzhiyun 			br_vlan_add(br, old_pvid,
1101*4882a593Smuzhiyun 				    BRIDGE_VLAN_INFO_PVID |
1102*4882a593Smuzhiyun 				    BRIDGE_VLAN_INFO_UNTAGGED |
1103*4882a593Smuzhiyun 				    BRIDGE_VLAN_INFO_BRENTRY,
1104*4882a593Smuzhiyun 				    &vlchange, NULL);
1105*4882a593Smuzhiyun 			br_vlan_notify(br, NULL, old_pvid, 0, RTM_NEWVLAN);
1106*4882a593Smuzhiyun 		}
1107*4882a593Smuzhiyun 		br_vlan_delete(br, pvid);
1108*4882a593Smuzhiyun 		br_vlan_notify(br, NULL, pvid, 0, RTM_DELVLAN);
1109*4882a593Smuzhiyun 	}
1110*4882a593Smuzhiyun 	goto out;
1111*4882a593Smuzhiyun }
1112*4882a593Smuzhiyun 
br_vlan_set_default_pvid(struct net_bridge * br,unsigned long val)1113*4882a593Smuzhiyun int br_vlan_set_default_pvid(struct net_bridge *br, unsigned long val)
1114*4882a593Smuzhiyun {
1115*4882a593Smuzhiyun 	u16 pvid = val;
1116*4882a593Smuzhiyun 	int err = 0;
1117*4882a593Smuzhiyun 
1118*4882a593Smuzhiyun 	if (val >= VLAN_VID_MASK)
1119*4882a593Smuzhiyun 		return -EINVAL;
1120*4882a593Smuzhiyun 
1121*4882a593Smuzhiyun 	if (pvid == br->default_pvid)
1122*4882a593Smuzhiyun 		goto out;
1123*4882a593Smuzhiyun 
1124*4882a593Smuzhiyun 	/* Only allow default pvid change when filtering is disabled */
1125*4882a593Smuzhiyun 	if (br_opt_get(br, BROPT_VLAN_ENABLED)) {
1126*4882a593Smuzhiyun 		pr_info_once("Please disable vlan filtering to change default_pvid\n");
1127*4882a593Smuzhiyun 		err = -EPERM;
1128*4882a593Smuzhiyun 		goto out;
1129*4882a593Smuzhiyun 	}
1130*4882a593Smuzhiyun 	err = __br_vlan_set_default_pvid(br, pvid, NULL);
1131*4882a593Smuzhiyun out:
1132*4882a593Smuzhiyun 	return err;
1133*4882a593Smuzhiyun }
1134*4882a593Smuzhiyun 
br_vlan_init(struct net_bridge * br)1135*4882a593Smuzhiyun int br_vlan_init(struct net_bridge *br)
1136*4882a593Smuzhiyun {
1137*4882a593Smuzhiyun 	struct net_bridge_vlan_group *vg;
1138*4882a593Smuzhiyun 	int ret = -ENOMEM;
1139*4882a593Smuzhiyun 
1140*4882a593Smuzhiyun 	vg = kzalloc(sizeof(*vg), GFP_KERNEL);
1141*4882a593Smuzhiyun 	if (!vg)
1142*4882a593Smuzhiyun 		goto out;
1143*4882a593Smuzhiyun 	ret = rhashtable_init(&vg->vlan_hash, &br_vlan_rht_params);
1144*4882a593Smuzhiyun 	if (ret)
1145*4882a593Smuzhiyun 		goto err_rhtbl;
1146*4882a593Smuzhiyun 	ret = vlan_tunnel_init(vg);
1147*4882a593Smuzhiyun 	if (ret)
1148*4882a593Smuzhiyun 		goto err_tunnel_init;
1149*4882a593Smuzhiyun 	INIT_LIST_HEAD(&vg->vlan_list);
1150*4882a593Smuzhiyun 	br->vlan_proto = htons(ETH_P_8021Q);
1151*4882a593Smuzhiyun 	br->default_pvid = 1;
1152*4882a593Smuzhiyun 	rcu_assign_pointer(br->vlgrp, vg);
1153*4882a593Smuzhiyun 
1154*4882a593Smuzhiyun out:
1155*4882a593Smuzhiyun 	return ret;
1156*4882a593Smuzhiyun 
1157*4882a593Smuzhiyun err_tunnel_init:
1158*4882a593Smuzhiyun 	rhashtable_destroy(&vg->vlan_hash);
1159*4882a593Smuzhiyun err_rhtbl:
1160*4882a593Smuzhiyun 	kfree(vg);
1161*4882a593Smuzhiyun 
1162*4882a593Smuzhiyun 	goto out;
1163*4882a593Smuzhiyun }
1164*4882a593Smuzhiyun 
nbp_vlan_init(struct net_bridge_port * p,struct netlink_ext_ack * extack)1165*4882a593Smuzhiyun int nbp_vlan_init(struct net_bridge_port *p, struct netlink_ext_ack *extack)
1166*4882a593Smuzhiyun {
1167*4882a593Smuzhiyun 	struct switchdev_attr attr = {
1168*4882a593Smuzhiyun 		.orig_dev = p->br->dev,
1169*4882a593Smuzhiyun 		.id = SWITCHDEV_ATTR_ID_BRIDGE_VLAN_FILTERING,
1170*4882a593Smuzhiyun 		.flags = SWITCHDEV_F_SKIP_EOPNOTSUPP,
1171*4882a593Smuzhiyun 		.u.vlan_filtering = br_opt_get(p->br, BROPT_VLAN_ENABLED),
1172*4882a593Smuzhiyun 	};
1173*4882a593Smuzhiyun 	struct net_bridge_vlan_group *vg;
1174*4882a593Smuzhiyun 	int ret = -ENOMEM;
1175*4882a593Smuzhiyun 
1176*4882a593Smuzhiyun 	vg = kzalloc(sizeof(struct net_bridge_vlan_group), GFP_KERNEL);
1177*4882a593Smuzhiyun 	if (!vg)
1178*4882a593Smuzhiyun 		goto out;
1179*4882a593Smuzhiyun 
1180*4882a593Smuzhiyun 	ret = switchdev_port_attr_set(p->dev, &attr);
1181*4882a593Smuzhiyun 	if (ret && ret != -EOPNOTSUPP)
1182*4882a593Smuzhiyun 		goto err_vlan_enabled;
1183*4882a593Smuzhiyun 
1184*4882a593Smuzhiyun 	ret = rhashtable_init(&vg->vlan_hash, &br_vlan_rht_params);
1185*4882a593Smuzhiyun 	if (ret)
1186*4882a593Smuzhiyun 		goto err_rhtbl;
1187*4882a593Smuzhiyun 	ret = vlan_tunnel_init(vg);
1188*4882a593Smuzhiyun 	if (ret)
1189*4882a593Smuzhiyun 		goto err_tunnel_init;
1190*4882a593Smuzhiyun 	INIT_LIST_HEAD(&vg->vlan_list);
1191*4882a593Smuzhiyun 	rcu_assign_pointer(p->vlgrp, vg);
1192*4882a593Smuzhiyun 	if (p->br->default_pvid) {
1193*4882a593Smuzhiyun 		bool changed;
1194*4882a593Smuzhiyun 
1195*4882a593Smuzhiyun 		ret = nbp_vlan_add(p, p->br->default_pvid,
1196*4882a593Smuzhiyun 				   BRIDGE_VLAN_INFO_PVID |
1197*4882a593Smuzhiyun 				   BRIDGE_VLAN_INFO_UNTAGGED,
1198*4882a593Smuzhiyun 				   &changed, extack);
1199*4882a593Smuzhiyun 		if (ret)
1200*4882a593Smuzhiyun 			goto err_vlan_add;
1201*4882a593Smuzhiyun 		br_vlan_notify(p->br, p, p->br->default_pvid, 0, RTM_NEWVLAN);
1202*4882a593Smuzhiyun 	}
1203*4882a593Smuzhiyun out:
1204*4882a593Smuzhiyun 	return ret;
1205*4882a593Smuzhiyun 
1206*4882a593Smuzhiyun err_vlan_add:
1207*4882a593Smuzhiyun 	RCU_INIT_POINTER(p->vlgrp, NULL);
1208*4882a593Smuzhiyun 	synchronize_rcu();
1209*4882a593Smuzhiyun 	vlan_tunnel_deinit(vg);
1210*4882a593Smuzhiyun err_tunnel_init:
1211*4882a593Smuzhiyun 	rhashtable_destroy(&vg->vlan_hash);
1212*4882a593Smuzhiyun err_rhtbl:
1213*4882a593Smuzhiyun err_vlan_enabled:
1214*4882a593Smuzhiyun 	kfree(vg);
1215*4882a593Smuzhiyun 
1216*4882a593Smuzhiyun 	goto out;
1217*4882a593Smuzhiyun }
1218*4882a593Smuzhiyun 
1219*4882a593Smuzhiyun /* Must be protected by RTNL.
1220*4882a593Smuzhiyun  * Must be called with vid in range from 1 to 4094 inclusive.
1221*4882a593Smuzhiyun  * changed must be true only if the vlan was created or updated
1222*4882a593Smuzhiyun  */
nbp_vlan_add(struct net_bridge_port * port,u16 vid,u16 flags,bool * changed,struct netlink_ext_ack * extack)1223*4882a593Smuzhiyun int nbp_vlan_add(struct net_bridge_port *port, u16 vid, u16 flags,
1224*4882a593Smuzhiyun 		 bool *changed, struct netlink_ext_ack *extack)
1225*4882a593Smuzhiyun {
1226*4882a593Smuzhiyun 	struct net_bridge_vlan *vlan;
1227*4882a593Smuzhiyun 	int ret;
1228*4882a593Smuzhiyun 
1229*4882a593Smuzhiyun 	ASSERT_RTNL();
1230*4882a593Smuzhiyun 
1231*4882a593Smuzhiyun 	*changed = false;
1232*4882a593Smuzhiyun 	vlan = br_vlan_find(nbp_vlan_group(port), vid);
1233*4882a593Smuzhiyun 	if (vlan) {
1234*4882a593Smuzhiyun 		/* Pass the flags to the hardware bridge */
1235*4882a593Smuzhiyun 		ret = br_switchdev_port_vlan_add(port->dev, vid, flags, extack);
1236*4882a593Smuzhiyun 		if (ret && ret != -EOPNOTSUPP)
1237*4882a593Smuzhiyun 			return ret;
1238*4882a593Smuzhiyun 		*changed = __vlan_add_flags(vlan, flags);
1239*4882a593Smuzhiyun 
1240*4882a593Smuzhiyun 		return 0;
1241*4882a593Smuzhiyun 	}
1242*4882a593Smuzhiyun 
1243*4882a593Smuzhiyun 	vlan = kzalloc(sizeof(*vlan), GFP_KERNEL);
1244*4882a593Smuzhiyun 	if (!vlan)
1245*4882a593Smuzhiyun 		return -ENOMEM;
1246*4882a593Smuzhiyun 
1247*4882a593Smuzhiyun 	vlan->vid = vid;
1248*4882a593Smuzhiyun 	vlan->port = port;
1249*4882a593Smuzhiyun 	ret = __vlan_add(vlan, flags, extack);
1250*4882a593Smuzhiyun 	if (ret)
1251*4882a593Smuzhiyun 		kfree(vlan);
1252*4882a593Smuzhiyun 	else
1253*4882a593Smuzhiyun 		*changed = true;
1254*4882a593Smuzhiyun 
1255*4882a593Smuzhiyun 	return ret;
1256*4882a593Smuzhiyun }
1257*4882a593Smuzhiyun 
1258*4882a593Smuzhiyun /* Must be protected by RTNL.
1259*4882a593Smuzhiyun  * Must be called with vid in range from 1 to 4094 inclusive.
1260*4882a593Smuzhiyun  */
nbp_vlan_delete(struct net_bridge_port * port,u16 vid)1261*4882a593Smuzhiyun int nbp_vlan_delete(struct net_bridge_port *port, u16 vid)
1262*4882a593Smuzhiyun {
1263*4882a593Smuzhiyun 	struct net_bridge_vlan *v;
1264*4882a593Smuzhiyun 
1265*4882a593Smuzhiyun 	ASSERT_RTNL();
1266*4882a593Smuzhiyun 
1267*4882a593Smuzhiyun 	v = br_vlan_find(nbp_vlan_group(port), vid);
1268*4882a593Smuzhiyun 	if (!v)
1269*4882a593Smuzhiyun 		return -ENOENT;
1270*4882a593Smuzhiyun 	br_fdb_find_delete_local(port->br, port, port->dev->dev_addr, vid);
1271*4882a593Smuzhiyun 	br_fdb_delete_by_port(port->br, port, vid, 0);
1272*4882a593Smuzhiyun 
1273*4882a593Smuzhiyun 	return __vlan_del(v);
1274*4882a593Smuzhiyun }
1275*4882a593Smuzhiyun 
nbp_vlan_flush(struct net_bridge_port * port)1276*4882a593Smuzhiyun void nbp_vlan_flush(struct net_bridge_port *port)
1277*4882a593Smuzhiyun {
1278*4882a593Smuzhiyun 	struct net_bridge_vlan_group *vg;
1279*4882a593Smuzhiyun 
1280*4882a593Smuzhiyun 	ASSERT_RTNL();
1281*4882a593Smuzhiyun 
1282*4882a593Smuzhiyun 	vg = nbp_vlan_group(port);
1283*4882a593Smuzhiyun 	__vlan_flush(port->br, port, vg);
1284*4882a593Smuzhiyun 	RCU_INIT_POINTER(port->vlgrp, NULL);
1285*4882a593Smuzhiyun 	synchronize_rcu();
1286*4882a593Smuzhiyun 	__vlan_group_free(vg);
1287*4882a593Smuzhiyun }
1288*4882a593Smuzhiyun 
br_vlan_get_stats(const struct net_bridge_vlan * v,struct br_vlan_stats * stats)1289*4882a593Smuzhiyun void br_vlan_get_stats(const struct net_bridge_vlan *v,
1290*4882a593Smuzhiyun 		       struct br_vlan_stats *stats)
1291*4882a593Smuzhiyun {
1292*4882a593Smuzhiyun 	int i;
1293*4882a593Smuzhiyun 
1294*4882a593Smuzhiyun 	memset(stats, 0, sizeof(*stats));
1295*4882a593Smuzhiyun 	for_each_possible_cpu(i) {
1296*4882a593Smuzhiyun 		u64 rxpackets, rxbytes, txpackets, txbytes;
1297*4882a593Smuzhiyun 		struct br_vlan_stats *cpu_stats;
1298*4882a593Smuzhiyun 		unsigned int start;
1299*4882a593Smuzhiyun 
1300*4882a593Smuzhiyun 		cpu_stats = per_cpu_ptr(v->stats, i);
1301*4882a593Smuzhiyun 		do {
1302*4882a593Smuzhiyun 			start = u64_stats_fetch_begin_irq(&cpu_stats->syncp);
1303*4882a593Smuzhiyun 			rxpackets = cpu_stats->rx_packets;
1304*4882a593Smuzhiyun 			rxbytes = cpu_stats->rx_bytes;
1305*4882a593Smuzhiyun 			txbytes = cpu_stats->tx_bytes;
1306*4882a593Smuzhiyun 			txpackets = cpu_stats->tx_packets;
1307*4882a593Smuzhiyun 		} while (u64_stats_fetch_retry_irq(&cpu_stats->syncp, start));
1308*4882a593Smuzhiyun 
1309*4882a593Smuzhiyun 		stats->rx_packets += rxpackets;
1310*4882a593Smuzhiyun 		stats->rx_bytes += rxbytes;
1311*4882a593Smuzhiyun 		stats->tx_bytes += txbytes;
1312*4882a593Smuzhiyun 		stats->tx_packets += txpackets;
1313*4882a593Smuzhiyun 	}
1314*4882a593Smuzhiyun }
1315*4882a593Smuzhiyun 
br_vlan_get_pvid(const struct net_device * dev,u16 * p_pvid)1316*4882a593Smuzhiyun int br_vlan_get_pvid(const struct net_device *dev, u16 *p_pvid)
1317*4882a593Smuzhiyun {
1318*4882a593Smuzhiyun 	struct net_bridge_vlan_group *vg;
1319*4882a593Smuzhiyun 	struct net_bridge_port *p;
1320*4882a593Smuzhiyun 
1321*4882a593Smuzhiyun 	ASSERT_RTNL();
1322*4882a593Smuzhiyun 	p = br_port_get_check_rtnl(dev);
1323*4882a593Smuzhiyun 	if (p)
1324*4882a593Smuzhiyun 		vg = nbp_vlan_group(p);
1325*4882a593Smuzhiyun 	else if (netif_is_bridge_master(dev))
1326*4882a593Smuzhiyun 		vg = br_vlan_group(netdev_priv(dev));
1327*4882a593Smuzhiyun 	else
1328*4882a593Smuzhiyun 		return -EINVAL;
1329*4882a593Smuzhiyun 
1330*4882a593Smuzhiyun 	*p_pvid = br_get_pvid(vg);
1331*4882a593Smuzhiyun 	return 0;
1332*4882a593Smuzhiyun }
1333*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(br_vlan_get_pvid);
1334*4882a593Smuzhiyun 
br_vlan_get_pvid_rcu(const struct net_device * dev,u16 * p_pvid)1335*4882a593Smuzhiyun int br_vlan_get_pvid_rcu(const struct net_device *dev, u16 *p_pvid)
1336*4882a593Smuzhiyun {
1337*4882a593Smuzhiyun 	struct net_bridge_vlan_group *vg;
1338*4882a593Smuzhiyun 	struct net_bridge_port *p;
1339*4882a593Smuzhiyun 
1340*4882a593Smuzhiyun 	p = br_port_get_check_rcu(dev);
1341*4882a593Smuzhiyun 	if (p)
1342*4882a593Smuzhiyun 		vg = nbp_vlan_group_rcu(p);
1343*4882a593Smuzhiyun 	else if (netif_is_bridge_master(dev))
1344*4882a593Smuzhiyun 		vg = br_vlan_group_rcu(netdev_priv(dev));
1345*4882a593Smuzhiyun 	else
1346*4882a593Smuzhiyun 		return -EINVAL;
1347*4882a593Smuzhiyun 
1348*4882a593Smuzhiyun 	*p_pvid = br_get_pvid(vg);
1349*4882a593Smuzhiyun 	return 0;
1350*4882a593Smuzhiyun }
1351*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(br_vlan_get_pvid_rcu);
1352*4882a593Smuzhiyun 
br_vlan_get_info(const struct net_device * dev,u16 vid,struct bridge_vlan_info * p_vinfo)1353*4882a593Smuzhiyun int br_vlan_get_info(const struct net_device *dev, u16 vid,
1354*4882a593Smuzhiyun 		     struct bridge_vlan_info *p_vinfo)
1355*4882a593Smuzhiyun {
1356*4882a593Smuzhiyun 	struct net_bridge_vlan_group *vg;
1357*4882a593Smuzhiyun 	struct net_bridge_vlan *v;
1358*4882a593Smuzhiyun 	struct net_bridge_port *p;
1359*4882a593Smuzhiyun 
1360*4882a593Smuzhiyun 	ASSERT_RTNL();
1361*4882a593Smuzhiyun 	p = br_port_get_check_rtnl(dev);
1362*4882a593Smuzhiyun 	if (p)
1363*4882a593Smuzhiyun 		vg = nbp_vlan_group(p);
1364*4882a593Smuzhiyun 	else if (netif_is_bridge_master(dev))
1365*4882a593Smuzhiyun 		vg = br_vlan_group(netdev_priv(dev));
1366*4882a593Smuzhiyun 	else
1367*4882a593Smuzhiyun 		return -EINVAL;
1368*4882a593Smuzhiyun 
1369*4882a593Smuzhiyun 	v = br_vlan_find(vg, vid);
1370*4882a593Smuzhiyun 	if (!v)
1371*4882a593Smuzhiyun 		return -ENOENT;
1372*4882a593Smuzhiyun 
1373*4882a593Smuzhiyun 	p_vinfo->vid = vid;
1374*4882a593Smuzhiyun 	p_vinfo->flags = v->flags;
1375*4882a593Smuzhiyun 	if (vid == br_get_pvid(vg))
1376*4882a593Smuzhiyun 		p_vinfo->flags |= BRIDGE_VLAN_INFO_PVID;
1377*4882a593Smuzhiyun 	return 0;
1378*4882a593Smuzhiyun }
1379*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(br_vlan_get_info);
1380*4882a593Smuzhiyun 
br_vlan_is_bind_vlan_dev(const struct net_device * dev)1381*4882a593Smuzhiyun static int br_vlan_is_bind_vlan_dev(const struct net_device *dev)
1382*4882a593Smuzhiyun {
1383*4882a593Smuzhiyun 	return is_vlan_dev(dev) &&
1384*4882a593Smuzhiyun 		!!(vlan_dev_priv(dev)->flags & VLAN_FLAG_BRIDGE_BINDING);
1385*4882a593Smuzhiyun }
1386*4882a593Smuzhiyun 
br_vlan_is_bind_vlan_dev_fn(struct net_device * dev,__always_unused struct netdev_nested_priv * priv)1387*4882a593Smuzhiyun static int br_vlan_is_bind_vlan_dev_fn(struct net_device *dev,
1388*4882a593Smuzhiyun 			       __always_unused struct netdev_nested_priv *priv)
1389*4882a593Smuzhiyun {
1390*4882a593Smuzhiyun 	return br_vlan_is_bind_vlan_dev(dev);
1391*4882a593Smuzhiyun }
1392*4882a593Smuzhiyun 
br_vlan_has_upper_bind_vlan_dev(struct net_device * dev)1393*4882a593Smuzhiyun static bool br_vlan_has_upper_bind_vlan_dev(struct net_device *dev)
1394*4882a593Smuzhiyun {
1395*4882a593Smuzhiyun 	int found;
1396*4882a593Smuzhiyun 
1397*4882a593Smuzhiyun 	rcu_read_lock();
1398*4882a593Smuzhiyun 	found = netdev_walk_all_upper_dev_rcu(dev, br_vlan_is_bind_vlan_dev_fn,
1399*4882a593Smuzhiyun 					      NULL);
1400*4882a593Smuzhiyun 	rcu_read_unlock();
1401*4882a593Smuzhiyun 
1402*4882a593Smuzhiyun 	return !!found;
1403*4882a593Smuzhiyun }
1404*4882a593Smuzhiyun 
1405*4882a593Smuzhiyun struct br_vlan_bind_walk_data {
1406*4882a593Smuzhiyun 	u16 vid;
1407*4882a593Smuzhiyun 	struct net_device *result;
1408*4882a593Smuzhiyun };
1409*4882a593Smuzhiyun 
br_vlan_match_bind_vlan_dev_fn(struct net_device * dev,struct netdev_nested_priv * priv)1410*4882a593Smuzhiyun static int br_vlan_match_bind_vlan_dev_fn(struct net_device *dev,
1411*4882a593Smuzhiyun 					  struct netdev_nested_priv *priv)
1412*4882a593Smuzhiyun {
1413*4882a593Smuzhiyun 	struct br_vlan_bind_walk_data *data = priv->data;
1414*4882a593Smuzhiyun 	int found = 0;
1415*4882a593Smuzhiyun 
1416*4882a593Smuzhiyun 	if (br_vlan_is_bind_vlan_dev(dev) &&
1417*4882a593Smuzhiyun 	    vlan_dev_priv(dev)->vlan_id == data->vid) {
1418*4882a593Smuzhiyun 		data->result = dev;
1419*4882a593Smuzhiyun 		found = 1;
1420*4882a593Smuzhiyun 	}
1421*4882a593Smuzhiyun 
1422*4882a593Smuzhiyun 	return found;
1423*4882a593Smuzhiyun }
1424*4882a593Smuzhiyun 
1425*4882a593Smuzhiyun static struct net_device *
br_vlan_get_upper_bind_vlan_dev(struct net_device * dev,u16 vid)1426*4882a593Smuzhiyun br_vlan_get_upper_bind_vlan_dev(struct net_device *dev, u16 vid)
1427*4882a593Smuzhiyun {
1428*4882a593Smuzhiyun 	struct br_vlan_bind_walk_data data = {
1429*4882a593Smuzhiyun 		.vid = vid,
1430*4882a593Smuzhiyun 	};
1431*4882a593Smuzhiyun 	struct netdev_nested_priv priv = {
1432*4882a593Smuzhiyun 		.data = (void *)&data,
1433*4882a593Smuzhiyun 	};
1434*4882a593Smuzhiyun 
1435*4882a593Smuzhiyun 	rcu_read_lock();
1436*4882a593Smuzhiyun 	netdev_walk_all_upper_dev_rcu(dev, br_vlan_match_bind_vlan_dev_fn,
1437*4882a593Smuzhiyun 				      &priv);
1438*4882a593Smuzhiyun 	rcu_read_unlock();
1439*4882a593Smuzhiyun 
1440*4882a593Smuzhiyun 	return data.result;
1441*4882a593Smuzhiyun }
1442*4882a593Smuzhiyun 
br_vlan_is_dev_up(const struct net_device * dev)1443*4882a593Smuzhiyun static bool br_vlan_is_dev_up(const struct net_device *dev)
1444*4882a593Smuzhiyun {
1445*4882a593Smuzhiyun 	return  !!(dev->flags & IFF_UP) && netif_oper_up(dev);
1446*4882a593Smuzhiyun }
1447*4882a593Smuzhiyun 
br_vlan_set_vlan_dev_state(const struct net_bridge * br,struct net_device * vlan_dev)1448*4882a593Smuzhiyun static void br_vlan_set_vlan_dev_state(const struct net_bridge *br,
1449*4882a593Smuzhiyun 				       struct net_device *vlan_dev)
1450*4882a593Smuzhiyun {
1451*4882a593Smuzhiyun 	u16 vid = vlan_dev_priv(vlan_dev)->vlan_id;
1452*4882a593Smuzhiyun 	struct net_bridge_vlan_group *vg;
1453*4882a593Smuzhiyun 	struct net_bridge_port *p;
1454*4882a593Smuzhiyun 	bool has_carrier = false;
1455*4882a593Smuzhiyun 
1456*4882a593Smuzhiyun 	if (!netif_carrier_ok(br->dev)) {
1457*4882a593Smuzhiyun 		netif_carrier_off(vlan_dev);
1458*4882a593Smuzhiyun 		return;
1459*4882a593Smuzhiyun 	}
1460*4882a593Smuzhiyun 
1461*4882a593Smuzhiyun 	list_for_each_entry(p, &br->port_list, list) {
1462*4882a593Smuzhiyun 		vg = nbp_vlan_group(p);
1463*4882a593Smuzhiyun 		if (br_vlan_find(vg, vid) && br_vlan_is_dev_up(p->dev)) {
1464*4882a593Smuzhiyun 			has_carrier = true;
1465*4882a593Smuzhiyun 			break;
1466*4882a593Smuzhiyun 		}
1467*4882a593Smuzhiyun 	}
1468*4882a593Smuzhiyun 
1469*4882a593Smuzhiyun 	if (has_carrier)
1470*4882a593Smuzhiyun 		netif_carrier_on(vlan_dev);
1471*4882a593Smuzhiyun 	else
1472*4882a593Smuzhiyun 		netif_carrier_off(vlan_dev);
1473*4882a593Smuzhiyun }
1474*4882a593Smuzhiyun 
br_vlan_set_all_vlan_dev_state(struct net_bridge_port * p)1475*4882a593Smuzhiyun static void br_vlan_set_all_vlan_dev_state(struct net_bridge_port *p)
1476*4882a593Smuzhiyun {
1477*4882a593Smuzhiyun 	struct net_bridge_vlan_group *vg = nbp_vlan_group(p);
1478*4882a593Smuzhiyun 	struct net_bridge_vlan *vlan;
1479*4882a593Smuzhiyun 	struct net_device *vlan_dev;
1480*4882a593Smuzhiyun 
1481*4882a593Smuzhiyun 	list_for_each_entry(vlan, &vg->vlan_list, vlist) {
1482*4882a593Smuzhiyun 		vlan_dev = br_vlan_get_upper_bind_vlan_dev(p->br->dev,
1483*4882a593Smuzhiyun 							   vlan->vid);
1484*4882a593Smuzhiyun 		if (vlan_dev) {
1485*4882a593Smuzhiyun 			if (br_vlan_is_dev_up(p->dev)) {
1486*4882a593Smuzhiyun 				if (netif_carrier_ok(p->br->dev))
1487*4882a593Smuzhiyun 					netif_carrier_on(vlan_dev);
1488*4882a593Smuzhiyun 			} else {
1489*4882a593Smuzhiyun 				br_vlan_set_vlan_dev_state(p->br, vlan_dev);
1490*4882a593Smuzhiyun 			}
1491*4882a593Smuzhiyun 		}
1492*4882a593Smuzhiyun 	}
1493*4882a593Smuzhiyun }
1494*4882a593Smuzhiyun 
br_vlan_upper_change(struct net_device * dev,struct net_device * upper_dev,bool linking)1495*4882a593Smuzhiyun static void br_vlan_upper_change(struct net_device *dev,
1496*4882a593Smuzhiyun 				 struct net_device *upper_dev,
1497*4882a593Smuzhiyun 				 bool linking)
1498*4882a593Smuzhiyun {
1499*4882a593Smuzhiyun 	struct net_bridge *br = netdev_priv(dev);
1500*4882a593Smuzhiyun 
1501*4882a593Smuzhiyun 	if (!br_vlan_is_bind_vlan_dev(upper_dev))
1502*4882a593Smuzhiyun 		return;
1503*4882a593Smuzhiyun 
1504*4882a593Smuzhiyun 	if (linking) {
1505*4882a593Smuzhiyun 		br_vlan_set_vlan_dev_state(br, upper_dev);
1506*4882a593Smuzhiyun 		br_opt_toggle(br, BROPT_VLAN_BRIDGE_BINDING, true);
1507*4882a593Smuzhiyun 	} else {
1508*4882a593Smuzhiyun 		br_opt_toggle(br, BROPT_VLAN_BRIDGE_BINDING,
1509*4882a593Smuzhiyun 			      br_vlan_has_upper_bind_vlan_dev(dev));
1510*4882a593Smuzhiyun 	}
1511*4882a593Smuzhiyun }
1512*4882a593Smuzhiyun 
1513*4882a593Smuzhiyun struct br_vlan_link_state_walk_data {
1514*4882a593Smuzhiyun 	struct net_bridge *br;
1515*4882a593Smuzhiyun };
1516*4882a593Smuzhiyun 
br_vlan_link_state_change_fn(struct net_device * vlan_dev,struct netdev_nested_priv * priv)1517*4882a593Smuzhiyun static int br_vlan_link_state_change_fn(struct net_device *vlan_dev,
1518*4882a593Smuzhiyun 					struct netdev_nested_priv *priv)
1519*4882a593Smuzhiyun {
1520*4882a593Smuzhiyun 	struct br_vlan_link_state_walk_data *data = priv->data;
1521*4882a593Smuzhiyun 
1522*4882a593Smuzhiyun 	if (br_vlan_is_bind_vlan_dev(vlan_dev))
1523*4882a593Smuzhiyun 		br_vlan_set_vlan_dev_state(data->br, vlan_dev);
1524*4882a593Smuzhiyun 
1525*4882a593Smuzhiyun 	return 0;
1526*4882a593Smuzhiyun }
1527*4882a593Smuzhiyun 
br_vlan_link_state_change(struct net_device * dev,struct net_bridge * br)1528*4882a593Smuzhiyun static void br_vlan_link_state_change(struct net_device *dev,
1529*4882a593Smuzhiyun 				      struct net_bridge *br)
1530*4882a593Smuzhiyun {
1531*4882a593Smuzhiyun 	struct br_vlan_link_state_walk_data data = {
1532*4882a593Smuzhiyun 		.br = br
1533*4882a593Smuzhiyun 	};
1534*4882a593Smuzhiyun 	struct netdev_nested_priv priv = {
1535*4882a593Smuzhiyun 		.data = (void *)&data,
1536*4882a593Smuzhiyun 	};
1537*4882a593Smuzhiyun 
1538*4882a593Smuzhiyun 	rcu_read_lock();
1539*4882a593Smuzhiyun 	netdev_walk_all_upper_dev_rcu(dev, br_vlan_link_state_change_fn,
1540*4882a593Smuzhiyun 				      &priv);
1541*4882a593Smuzhiyun 	rcu_read_unlock();
1542*4882a593Smuzhiyun }
1543*4882a593Smuzhiyun 
1544*4882a593Smuzhiyun /* Must be protected by RTNL. */
nbp_vlan_set_vlan_dev_state(struct net_bridge_port * p,u16 vid)1545*4882a593Smuzhiyun static void nbp_vlan_set_vlan_dev_state(struct net_bridge_port *p, u16 vid)
1546*4882a593Smuzhiyun {
1547*4882a593Smuzhiyun 	struct net_device *vlan_dev;
1548*4882a593Smuzhiyun 
1549*4882a593Smuzhiyun 	if (!br_opt_get(p->br, BROPT_VLAN_BRIDGE_BINDING))
1550*4882a593Smuzhiyun 		return;
1551*4882a593Smuzhiyun 
1552*4882a593Smuzhiyun 	vlan_dev = br_vlan_get_upper_bind_vlan_dev(p->br->dev, vid);
1553*4882a593Smuzhiyun 	if (vlan_dev)
1554*4882a593Smuzhiyun 		br_vlan_set_vlan_dev_state(p->br, vlan_dev);
1555*4882a593Smuzhiyun }
1556*4882a593Smuzhiyun 
1557*4882a593Smuzhiyun /* Must be protected by RTNL. */
br_vlan_bridge_event(struct net_device * dev,unsigned long event,void * ptr)1558*4882a593Smuzhiyun int br_vlan_bridge_event(struct net_device *dev, unsigned long event, void *ptr)
1559*4882a593Smuzhiyun {
1560*4882a593Smuzhiyun 	struct netdev_notifier_changeupper_info *info;
1561*4882a593Smuzhiyun 	struct net_bridge *br = netdev_priv(dev);
1562*4882a593Smuzhiyun 	int vlcmd = 0, ret = 0;
1563*4882a593Smuzhiyun 	bool changed = false;
1564*4882a593Smuzhiyun 
1565*4882a593Smuzhiyun 	switch (event) {
1566*4882a593Smuzhiyun 	case NETDEV_REGISTER:
1567*4882a593Smuzhiyun 		ret = br_vlan_add(br, br->default_pvid,
1568*4882a593Smuzhiyun 				  BRIDGE_VLAN_INFO_PVID |
1569*4882a593Smuzhiyun 				  BRIDGE_VLAN_INFO_UNTAGGED |
1570*4882a593Smuzhiyun 				  BRIDGE_VLAN_INFO_BRENTRY, &changed, NULL);
1571*4882a593Smuzhiyun 		vlcmd = RTM_NEWVLAN;
1572*4882a593Smuzhiyun 		break;
1573*4882a593Smuzhiyun 	case NETDEV_UNREGISTER:
1574*4882a593Smuzhiyun 		changed = !br_vlan_delete(br, br->default_pvid);
1575*4882a593Smuzhiyun 		vlcmd = RTM_DELVLAN;
1576*4882a593Smuzhiyun 		break;
1577*4882a593Smuzhiyun 	case NETDEV_CHANGEUPPER:
1578*4882a593Smuzhiyun 		info = ptr;
1579*4882a593Smuzhiyun 		br_vlan_upper_change(dev, info->upper_dev, info->linking);
1580*4882a593Smuzhiyun 		break;
1581*4882a593Smuzhiyun 
1582*4882a593Smuzhiyun 	case NETDEV_CHANGE:
1583*4882a593Smuzhiyun 	case NETDEV_UP:
1584*4882a593Smuzhiyun 		if (!br_opt_get(br, BROPT_VLAN_BRIDGE_BINDING))
1585*4882a593Smuzhiyun 			break;
1586*4882a593Smuzhiyun 		br_vlan_link_state_change(dev, br);
1587*4882a593Smuzhiyun 		break;
1588*4882a593Smuzhiyun 	}
1589*4882a593Smuzhiyun 	if (changed)
1590*4882a593Smuzhiyun 		br_vlan_notify(br, NULL, br->default_pvid, 0, vlcmd);
1591*4882a593Smuzhiyun 
1592*4882a593Smuzhiyun 	return ret;
1593*4882a593Smuzhiyun }
1594*4882a593Smuzhiyun 
1595*4882a593Smuzhiyun /* Must be protected by RTNL. */
br_vlan_port_event(struct net_bridge_port * p,unsigned long event)1596*4882a593Smuzhiyun void br_vlan_port_event(struct net_bridge_port *p, unsigned long event)
1597*4882a593Smuzhiyun {
1598*4882a593Smuzhiyun 	if (!br_opt_get(p->br, BROPT_VLAN_BRIDGE_BINDING))
1599*4882a593Smuzhiyun 		return;
1600*4882a593Smuzhiyun 
1601*4882a593Smuzhiyun 	switch (event) {
1602*4882a593Smuzhiyun 	case NETDEV_CHANGE:
1603*4882a593Smuzhiyun 	case NETDEV_DOWN:
1604*4882a593Smuzhiyun 	case NETDEV_UP:
1605*4882a593Smuzhiyun 		br_vlan_set_all_vlan_dev_state(p);
1606*4882a593Smuzhiyun 		break;
1607*4882a593Smuzhiyun 	}
1608*4882a593Smuzhiyun }
1609*4882a593Smuzhiyun 
br_vlan_stats_fill(struct sk_buff * skb,const struct net_bridge_vlan * v)1610*4882a593Smuzhiyun static bool br_vlan_stats_fill(struct sk_buff *skb,
1611*4882a593Smuzhiyun 			       const struct net_bridge_vlan *v)
1612*4882a593Smuzhiyun {
1613*4882a593Smuzhiyun 	struct br_vlan_stats stats;
1614*4882a593Smuzhiyun 	struct nlattr *nest;
1615*4882a593Smuzhiyun 
1616*4882a593Smuzhiyun 	nest = nla_nest_start(skb, BRIDGE_VLANDB_ENTRY_STATS);
1617*4882a593Smuzhiyun 	if (!nest)
1618*4882a593Smuzhiyun 		return false;
1619*4882a593Smuzhiyun 
1620*4882a593Smuzhiyun 	br_vlan_get_stats(v, &stats);
1621*4882a593Smuzhiyun 	if (nla_put_u64_64bit(skb, BRIDGE_VLANDB_STATS_RX_BYTES, stats.rx_bytes,
1622*4882a593Smuzhiyun 			      BRIDGE_VLANDB_STATS_PAD) ||
1623*4882a593Smuzhiyun 	    nla_put_u64_64bit(skb, BRIDGE_VLANDB_STATS_RX_PACKETS,
1624*4882a593Smuzhiyun 			      stats.rx_packets, BRIDGE_VLANDB_STATS_PAD) ||
1625*4882a593Smuzhiyun 	    nla_put_u64_64bit(skb, BRIDGE_VLANDB_STATS_TX_BYTES, stats.tx_bytes,
1626*4882a593Smuzhiyun 			      BRIDGE_VLANDB_STATS_PAD) ||
1627*4882a593Smuzhiyun 	    nla_put_u64_64bit(skb, BRIDGE_VLANDB_STATS_TX_PACKETS,
1628*4882a593Smuzhiyun 			      stats.tx_packets, BRIDGE_VLANDB_STATS_PAD))
1629*4882a593Smuzhiyun 		goto out_err;
1630*4882a593Smuzhiyun 
1631*4882a593Smuzhiyun 	nla_nest_end(skb, nest);
1632*4882a593Smuzhiyun 
1633*4882a593Smuzhiyun 	return true;
1634*4882a593Smuzhiyun 
1635*4882a593Smuzhiyun out_err:
1636*4882a593Smuzhiyun 	nla_nest_cancel(skb, nest);
1637*4882a593Smuzhiyun 	return false;
1638*4882a593Smuzhiyun }
1639*4882a593Smuzhiyun 
1640*4882a593Smuzhiyun /* v_opts is used to dump the options which must be equal in the whole range */
br_vlan_fill_vids(struct sk_buff * skb,u16 vid,u16 vid_range,const struct net_bridge_vlan * v_opts,u16 flags,bool dump_stats)1641*4882a593Smuzhiyun static bool br_vlan_fill_vids(struct sk_buff *skb, u16 vid, u16 vid_range,
1642*4882a593Smuzhiyun 			      const struct net_bridge_vlan *v_opts,
1643*4882a593Smuzhiyun 			      u16 flags,
1644*4882a593Smuzhiyun 			      bool dump_stats)
1645*4882a593Smuzhiyun {
1646*4882a593Smuzhiyun 	struct bridge_vlan_info info;
1647*4882a593Smuzhiyun 	struct nlattr *nest;
1648*4882a593Smuzhiyun 
1649*4882a593Smuzhiyun 	nest = nla_nest_start(skb, BRIDGE_VLANDB_ENTRY);
1650*4882a593Smuzhiyun 	if (!nest)
1651*4882a593Smuzhiyun 		return false;
1652*4882a593Smuzhiyun 
1653*4882a593Smuzhiyun 	memset(&info, 0, sizeof(info));
1654*4882a593Smuzhiyun 	info.vid = vid;
1655*4882a593Smuzhiyun 	if (flags & BRIDGE_VLAN_INFO_UNTAGGED)
1656*4882a593Smuzhiyun 		info.flags |= BRIDGE_VLAN_INFO_UNTAGGED;
1657*4882a593Smuzhiyun 	if (flags & BRIDGE_VLAN_INFO_PVID)
1658*4882a593Smuzhiyun 		info.flags |= BRIDGE_VLAN_INFO_PVID;
1659*4882a593Smuzhiyun 
1660*4882a593Smuzhiyun 	if (nla_put(skb, BRIDGE_VLANDB_ENTRY_INFO, sizeof(info), &info))
1661*4882a593Smuzhiyun 		goto out_err;
1662*4882a593Smuzhiyun 
1663*4882a593Smuzhiyun 	if (vid_range && vid < vid_range &&
1664*4882a593Smuzhiyun 	    !(flags & BRIDGE_VLAN_INFO_PVID) &&
1665*4882a593Smuzhiyun 	    nla_put_u16(skb, BRIDGE_VLANDB_ENTRY_RANGE, vid_range))
1666*4882a593Smuzhiyun 		goto out_err;
1667*4882a593Smuzhiyun 
1668*4882a593Smuzhiyun 	if (v_opts) {
1669*4882a593Smuzhiyun 		if (!br_vlan_opts_fill(skb, v_opts))
1670*4882a593Smuzhiyun 			goto out_err;
1671*4882a593Smuzhiyun 
1672*4882a593Smuzhiyun 		if (dump_stats && !br_vlan_stats_fill(skb, v_opts))
1673*4882a593Smuzhiyun 			goto out_err;
1674*4882a593Smuzhiyun 	}
1675*4882a593Smuzhiyun 
1676*4882a593Smuzhiyun 	nla_nest_end(skb, nest);
1677*4882a593Smuzhiyun 
1678*4882a593Smuzhiyun 	return true;
1679*4882a593Smuzhiyun 
1680*4882a593Smuzhiyun out_err:
1681*4882a593Smuzhiyun 	nla_nest_cancel(skb, nest);
1682*4882a593Smuzhiyun 	return false;
1683*4882a593Smuzhiyun }
1684*4882a593Smuzhiyun 
rtnl_vlan_nlmsg_size(void)1685*4882a593Smuzhiyun static size_t rtnl_vlan_nlmsg_size(void)
1686*4882a593Smuzhiyun {
1687*4882a593Smuzhiyun 	return NLMSG_ALIGN(sizeof(struct br_vlan_msg))
1688*4882a593Smuzhiyun 		+ nla_total_size(0) /* BRIDGE_VLANDB_ENTRY */
1689*4882a593Smuzhiyun 		+ nla_total_size(sizeof(u16)) /* BRIDGE_VLANDB_ENTRY_RANGE */
1690*4882a593Smuzhiyun 		+ nla_total_size(sizeof(struct bridge_vlan_info)) /* BRIDGE_VLANDB_ENTRY_INFO */
1691*4882a593Smuzhiyun 		+ br_vlan_opts_nl_size(); /* bridge vlan options */
1692*4882a593Smuzhiyun }
1693*4882a593Smuzhiyun 
br_vlan_notify(const struct net_bridge * br,const struct net_bridge_port * p,u16 vid,u16 vid_range,int cmd)1694*4882a593Smuzhiyun void br_vlan_notify(const struct net_bridge *br,
1695*4882a593Smuzhiyun 		    const struct net_bridge_port *p,
1696*4882a593Smuzhiyun 		    u16 vid, u16 vid_range,
1697*4882a593Smuzhiyun 		    int cmd)
1698*4882a593Smuzhiyun {
1699*4882a593Smuzhiyun 	struct net_bridge_vlan_group *vg;
1700*4882a593Smuzhiyun 	struct net_bridge_vlan *v = NULL;
1701*4882a593Smuzhiyun 	struct br_vlan_msg *bvm;
1702*4882a593Smuzhiyun 	struct nlmsghdr *nlh;
1703*4882a593Smuzhiyun 	struct sk_buff *skb;
1704*4882a593Smuzhiyun 	int err = -ENOBUFS;
1705*4882a593Smuzhiyun 	struct net *net;
1706*4882a593Smuzhiyun 	u16 flags = 0;
1707*4882a593Smuzhiyun 	int ifindex;
1708*4882a593Smuzhiyun 
1709*4882a593Smuzhiyun 	/* right now notifications are done only with rtnl held */
1710*4882a593Smuzhiyun 	ASSERT_RTNL();
1711*4882a593Smuzhiyun 
1712*4882a593Smuzhiyun 	if (p) {
1713*4882a593Smuzhiyun 		ifindex = p->dev->ifindex;
1714*4882a593Smuzhiyun 		vg = nbp_vlan_group(p);
1715*4882a593Smuzhiyun 		net = dev_net(p->dev);
1716*4882a593Smuzhiyun 	} else {
1717*4882a593Smuzhiyun 		ifindex = br->dev->ifindex;
1718*4882a593Smuzhiyun 		vg = br_vlan_group(br);
1719*4882a593Smuzhiyun 		net = dev_net(br->dev);
1720*4882a593Smuzhiyun 	}
1721*4882a593Smuzhiyun 
1722*4882a593Smuzhiyun 	skb = nlmsg_new(rtnl_vlan_nlmsg_size(), GFP_KERNEL);
1723*4882a593Smuzhiyun 	if (!skb)
1724*4882a593Smuzhiyun 		goto out_err;
1725*4882a593Smuzhiyun 
1726*4882a593Smuzhiyun 	err = -EMSGSIZE;
1727*4882a593Smuzhiyun 	nlh = nlmsg_put(skb, 0, 0, cmd, sizeof(*bvm), 0);
1728*4882a593Smuzhiyun 	if (!nlh)
1729*4882a593Smuzhiyun 		goto out_err;
1730*4882a593Smuzhiyun 	bvm = nlmsg_data(nlh);
1731*4882a593Smuzhiyun 	memset(bvm, 0, sizeof(*bvm));
1732*4882a593Smuzhiyun 	bvm->family = AF_BRIDGE;
1733*4882a593Smuzhiyun 	bvm->ifindex = ifindex;
1734*4882a593Smuzhiyun 
1735*4882a593Smuzhiyun 	switch (cmd) {
1736*4882a593Smuzhiyun 	case RTM_NEWVLAN:
1737*4882a593Smuzhiyun 		/* need to find the vlan due to flags/options */
1738*4882a593Smuzhiyun 		v = br_vlan_find(vg, vid);
1739*4882a593Smuzhiyun 		if (!v || !br_vlan_should_use(v))
1740*4882a593Smuzhiyun 			goto out_kfree;
1741*4882a593Smuzhiyun 
1742*4882a593Smuzhiyun 		flags = v->flags;
1743*4882a593Smuzhiyun 		if (br_get_pvid(vg) == v->vid)
1744*4882a593Smuzhiyun 			flags |= BRIDGE_VLAN_INFO_PVID;
1745*4882a593Smuzhiyun 		break;
1746*4882a593Smuzhiyun 	case RTM_DELVLAN:
1747*4882a593Smuzhiyun 		break;
1748*4882a593Smuzhiyun 	default:
1749*4882a593Smuzhiyun 		goto out_kfree;
1750*4882a593Smuzhiyun 	}
1751*4882a593Smuzhiyun 
1752*4882a593Smuzhiyun 	if (!br_vlan_fill_vids(skb, vid, vid_range, v, flags, false))
1753*4882a593Smuzhiyun 		goto out_err;
1754*4882a593Smuzhiyun 
1755*4882a593Smuzhiyun 	nlmsg_end(skb, nlh);
1756*4882a593Smuzhiyun 	rtnl_notify(skb, net, 0, RTNLGRP_BRVLAN, NULL, GFP_KERNEL);
1757*4882a593Smuzhiyun 	return;
1758*4882a593Smuzhiyun 
1759*4882a593Smuzhiyun out_err:
1760*4882a593Smuzhiyun 	rtnl_set_sk_err(net, RTNLGRP_BRVLAN, err);
1761*4882a593Smuzhiyun out_kfree:
1762*4882a593Smuzhiyun 	kfree_skb(skb);
1763*4882a593Smuzhiyun }
1764*4882a593Smuzhiyun 
1765*4882a593Smuzhiyun /* check if v_curr can enter a range ending in range_end */
br_vlan_can_enter_range(const struct net_bridge_vlan * v_curr,const struct net_bridge_vlan * range_end)1766*4882a593Smuzhiyun bool br_vlan_can_enter_range(const struct net_bridge_vlan *v_curr,
1767*4882a593Smuzhiyun 			     const struct net_bridge_vlan *range_end)
1768*4882a593Smuzhiyun {
1769*4882a593Smuzhiyun 	return v_curr->vid - range_end->vid == 1 &&
1770*4882a593Smuzhiyun 	       range_end->flags == v_curr->flags &&
1771*4882a593Smuzhiyun 	       br_vlan_opts_eq_range(v_curr, range_end);
1772*4882a593Smuzhiyun }
1773*4882a593Smuzhiyun 
br_vlan_dump_dev(const struct net_device * dev,struct sk_buff * skb,struct netlink_callback * cb,u32 dump_flags)1774*4882a593Smuzhiyun static int br_vlan_dump_dev(const struct net_device *dev,
1775*4882a593Smuzhiyun 			    struct sk_buff *skb,
1776*4882a593Smuzhiyun 			    struct netlink_callback *cb,
1777*4882a593Smuzhiyun 			    u32 dump_flags)
1778*4882a593Smuzhiyun {
1779*4882a593Smuzhiyun 	struct net_bridge_vlan *v, *range_start = NULL, *range_end = NULL;
1780*4882a593Smuzhiyun 	bool dump_stats = !!(dump_flags & BRIDGE_VLANDB_DUMPF_STATS);
1781*4882a593Smuzhiyun 	struct net_bridge_vlan_group *vg;
1782*4882a593Smuzhiyun 	int idx = 0, s_idx = cb->args[1];
1783*4882a593Smuzhiyun 	struct nlmsghdr *nlh = NULL;
1784*4882a593Smuzhiyun 	struct net_bridge_port *p;
1785*4882a593Smuzhiyun 	struct br_vlan_msg *bvm;
1786*4882a593Smuzhiyun 	struct net_bridge *br;
1787*4882a593Smuzhiyun 	int err = 0;
1788*4882a593Smuzhiyun 	u16 pvid;
1789*4882a593Smuzhiyun 
1790*4882a593Smuzhiyun 	if (!netif_is_bridge_master(dev) && !netif_is_bridge_port(dev))
1791*4882a593Smuzhiyun 		return -EINVAL;
1792*4882a593Smuzhiyun 
1793*4882a593Smuzhiyun 	if (netif_is_bridge_master(dev)) {
1794*4882a593Smuzhiyun 		br = netdev_priv(dev);
1795*4882a593Smuzhiyun 		vg = br_vlan_group_rcu(br);
1796*4882a593Smuzhiyun 		p = NULL;
1797*4882a593Smuzhiyun 	} else {
1798*4882a593Smuzhiyun 		p = br_port_get_rcu(dev);
1799*4882a593Smuzhiyun 		if (WARN_ON(!p))
1800*4882a593Smuzhiyun 			return -EINVAL;
1801*4882a593Smuzhiyun 		vg = nbp_vlan_group_rcu(p);
1802*4882a593Smuzhiyun 		br = p->br;
1803*4882a593Smuzhiyun 	}
1804*4882a593Smuzhiyun 
1805*4882a593Smuzhiyun 	if (!vg)
1806*4882a593Smuzhiyun 		return 0;
1807*4882a593Smuzhiyun 
1808*4882a593Smuzhiyun 	nlh = nlmsg_put(skb, NETLINK_CB(cb->skb).portid, cb->nlh->nlmsg_seq,
1809*4882a593Smuzhiyun 			RTM_NEWVLAN, sizeof(*bvm), NLM_F_MULTI);
1810*4882a593Smuzhiyun 	if (!nlh)
1811*4882a593Smuzhiyun 		return -EMSGSIZE;
1812*4882a593Smuzhiyun 	bvm = nlmsg_data(nlh);
1813*4882a593Smuzhiyun 	memset(bvm, 0, sizeof(*bvm));
1814*4882a593Smuzhiyun 	bvm->family = PF_BRIDGE;
1815*4882a593Smuzhiyun 	bvm->ifindex = dev->ifindex;
1816*4882a593Smuzhiyun 	pvid = br_get_pvid(vg);
1817*4882a593Smuzhiyun 
1818*4882a593Smuzhiyun 	/* idx must stay at range's beginning until it is filled in */
1819*4882a593Smuzhiyun 	list_for_each_entry_rcu(v, &vg->vlan_list, vlist) {
1820*4882a593Smuzhiyun 		if (!br_vlan_should_use(v))
1821*4882a593Smuzhiyun 			continue;
1822*4882a593Smuzhiyun 		if (idx < s_idx) {
1823*4882a593Smuzhiyun 			idx++;
1824*4882a593Smuzhiyun 			continue;
1825*4882a593Smuzhiyun 		}
1826*4882a593Smuzhiyun 
1827*4882a593Smuzhiyun 		if (!range_start) {
1828*4882a593Smuzhiyun 			range_start = v;
1829*4882a593Smuzhiyun 			range_end = v;
1830*4882a593Smuzhiyun 			continue;
1831*4882a593Smuzhiyun 		}
1832*4882a593Smuzhiyun 
1833*4882a593Smuzhiyun 		if (dump_stats || v->vid == pvid ||
1834*4882a593Smuzhiyun 		    !br_vlan_can_enter_range(v, range_end)) {
1835*4882a593Smuzhiyun 			u16 vlan_flags = br_vlan_flags(range_start, pvid);
1836*4882a593Smuzhiyun 
1837*4882a593Smuzhiyun 			if (!br_vlan_fill_vids(skb, range_start->vid,
1838*4882a593Smuzhiyun 					       range_end->vid, range_start,
1839*4882a593Smuzhiyun 					       vlan_flags, dump_stats)) {
1840*4882a593Smuzhiyun 				err = -EMSGSIZE;
1841*4882a593Smuzhiyun 				break;
1842*4882a593Smuzhiyun 			}
1843*4882a593Smuzhiyun 			/* advance number of filled vlans */
1844*4882a593Smuzhiyun 			idx += range_end->vid - range_start->vid + 1;
1845*4882a593Smuzhiyun 
1846*4882a593Smuzhiyun 			range_start = v;
1847*4882a593Smuzhiyun 		}
1848*4882a593Smuzhiyun 		range_end = v;
1849*4882a593Smuzhiyun 	}
1850*4882a593Smuzhiyun 
1851*4882a593Smuzhiyun 	/* err will be 0 and range_start will be set in 3 cases here:
1852*4882a593Smuzhiyun 	 * - first vlan (range_start == range_end)
1853*4882a593Smuzhiyun 	 * - last vlan (range_start == range_end, not in range)
1854*4882a593Smuzhiyun 	 * - last vlan range (range_start != range_end, in range)
1855*4882a593Smuzhiyun 	 */
1856*4882a593Smuzhiyun 	if (!err && range_start &&
1857*4882a593Smuzhiyun 	    !br_vlan_fill_vids(skb, range_start->vid, range_end->vid,
1858*4882a593Smuzhiyun 			       range_start, br_vlan_flags(range_start, pvid),
1859*4882a593Smuzhiyun 			       dump_stats))
1860*4882a593Smuzhiyun 		err = -EMSGSIZE;
1861*4882a593Smuzhiyun 
1862*4882a593Smuzhiyun 	cb->args[1] = err ? idx : 0;
1863*4882a593Smuzhiyun 
1864*4882a593Smuzhiyun 	nlmsg_end(skb, nlh);
1865*4882a593Smuzhiyun 
1866*4882a593Smuzhiyun 	return err;
1867*4882a593Smuzhiyun }
1868*4882a593Smuzhiyun 
1869*4882a593Smuzhiyun static const struct nla_policy br_vlan_db_dump_pol[BRIDGE_VLANDB_DUMP_MAX + 1] = {
1870*4882a593Smuzhiyun 	[BRIDGE_VLANDB_DUMP_FLAGS] = { .type = NLA_U32 },
1871*4882a593Smuzhiyun };
1872*4882a593Smuzhiyun 
br_vlan_rtm_dump(struct sk_buff * skb,struct netlink_callback * cb)1873*4882a593Smuzhiyun static int br_vlan_rtm_dump(struct sk_buff *skb, struct netlink_callback *cb)
1874*4882a593Smuzhiyun {
1875*4882a593Smuzhiyun 	struct nlattr *dtb[BRIDGE_VLANDB_DUMP_MAX + 1];
1876*4882a593Smuzhiyun 	int idx = 0, err = 0, s_idx = cb->args[0];
1877*4882a593Smuzhiyun 	struct net *net = sock_net(skb->sk);
1878*4882a593Smuzhiyun 	struct br_vlan_msg *bvm;
1879*4882a593Smuzhiyun 	struct net_device *dev;
1880*4882a593Smuzhiyun 	u32 dump_flags = 0;
1881*4882a593Smuzhiyun 
1882*4882a593Smuzhiyun 	err = nlmsg_parse(cb->nlh, sizeof(*bvm), dtb, BRIDGE_VLANDB_DUMP_MAX,
1883*4882a593Smuzhiyun 			  br_vlan_db_dump_pol, cb->extack);
1884*4882a593Smuzhiyun 	if (err < 0)
1885*4882a593Smuzhiyun 		return err;
1886*4882a593Smuzhiyun 
1887*4882a593Smuzhiyun 	bvm = nlmsg_data(cb->nlh);
1888*4882a593Smuzhiyun 	if (dtb[BRIDGE_VLANDB_DUMP_FLAGS])
1889*4882a593Smuzhiyun 		dump_flags = nla_get_u32(dtb[BRIDGE_VLANDB_DUMP_FLAGS]);
1890*4882a593Smuzhiyun 
1891*4882a593Smuzhiyun 	rcu_read_lock();
1892*4882a593Smuzhiyun 	if (bvm->ifindex) {
1893*4882a593Smuzhiyun 		dev = dev_get_by_index_rcu(net, bvm->ifindex);
1894*4882a593Smuzhiyun 		if (!dev) {
1895*4882a593Smuzhiyun 			err = -ENODEV;
1896*4882a593Smuzhiyun 			goto out_err;
1897*4882a593Smuzhiyun 		}
1898*4882a593Smuzhiyun 		err = br_vlan_dump_dev(dev, skb, cb, dump_flags);
1899*4882a593Smuzhiyun 		/* if the dump completed without an error we return 0 here */
1900*4882a593Smuzhiyun 		if (err != -EMSGSIZE)
1901*4882a593Smuzhiyun 			goto out_err;
1902*4882a593Smuzhiyun 	} else {
1903*4882a593Smuzhiyun 		for_each_netdev_rcu(net, dev) {
1904*4882a593Smuzhiyun 			if (idx < s_idx)
1905*4882a593Smuzhiyun 				goto skip;
1906*4882a593Smuzhiyun 
1907*4882a593Smuzhiyun 			err = br_vlan_dump_dev(dev, skb, cb, dump_flags);
1908*4882a593Smuzhiyun 			if (err == -EMSGSIZE)
1909*4882a593Smuzhiyun 				break;
1910*4882a593Smuzhiyun skip:
1911*4882a593Smuzhiyun 			idx++;
1912*4882a593Smuzhiyun 		}
1913*4882a593Smuzhiyun 	}
1914*4882a593Smuzhiyun 	cb->args[0] = idx;
1915*4882a593Smuzhiyun 	rcu_read_unlock();
1916*4882a593Smuzhiyun 
1917*4882a593Smuzhiyun 	return skb->len;
1918*4882a593Smuzhiyun 
1919*4882a593Smuzhiyun out_err:
1920*4882a593Smuzhiyun 	rcu_read_unlock();
1921*4882a593Smuzhiyun 
1922*4882a593Smuzhiyun 	return err;
1923*4882a593Smuzhiyun }
1924*4882a593Smuzhiyun 
1925*4882a593Smuzhiyun static const struct nla_policy br_vlan_db_policy[BRIDGE_VLANDB_ENTRY_MAX + 1] = {
1926*4882a593Smuzhiyun 	[BRIDGE_VLANDB_ENTRY_INFO]	=
1927*4882a593Smuzhiyun 		NLA_POLICY_EXACT_LEN(sizeof(struct bridge_vlan_info)),
1928*4882a593Smuzhiyun 	[BRIDGE_VLANDB_ENTRY_RANGE]	= { .type = NLA_U16 },
1929*4882a593Smuzhiyun 	[BRIDGE_VLANDB_ENTRY_STATE]	= { .type = NLA_U8 },
1930*4882a593Smuzhiyun 	[BRIDGE_VLANDB_ENTRY_TUNNEL_INFO] = { .type = NLA_NESTED },
1931*4882a593Smuzhiyun };
1932*4882a593Smuzhiyun 
br_vlan_rtm_process_one(struct net_device * dev,const struct nlattr * attr,int cmd,struct netlink_ext_ack * extack)1933*4882a593Smuzhiyun static int br_vlan_rtm_process_one(struct net_device *dev,
1934*4882a593Smuzhiyun 				   const struct nlattr *attr,
1935*4882a593Smuzhiyun 				   int cmd, struct netlink_ext_ack *extack)
1936*4882a593Smuzhiyun {
1937*4882a593Smuzhiyun 	struct bridge_vlan_info *vinfo, vrange_end, *vinfo_last = NULL;
1938*4882a593Smuzhiyun 	struct nlattr *tb[BRIDGE_VLANDB_ENTRY_MAX + 1];
1939*4882a593Smuzhiyun 	bool changed = false, skip_processing = false;
1940*4882a593Smuzhiyun 	struct net_bridge_vlan_group *vg;
1941*4882a593Smuzhiyun 	struct net_bridge_port *p = NULL;
1942*4882a593Smuzhiyun 	int err = 0, cmdmap = 0;
1943*4882a593Smuzhiyun 	struct net_bridge *br;
1944*4882a593Smuzhiyun 
1945*4882a593Smuzhiyun 	if (netif_is_bridge_master(dev)) {
1946*4882a593Smuzhiyun 		br = netdev_priv(dev);
1947*4882a593Smuzhiyun 		vg = br_vlan_group(br);
1948*4882a593Smuzhiyun 	} else {
1949*4882a593Smuzhiyun 		p = br_port_get_rtnl(dev);
1950*4882a593Smuzhiyun 		if (WARN_ON(!p))
1951*4882a593Smuzhiyun 			return -ENODEV;
1952*4882a593Smuzhiyun 		br = p->br;
1953*4882a593Smuzhiyun 		vg = nbp_vlan_group(p);
1954*4882a593Smuzhiyun 	}
1955*4882a593Smuzhiyun 
1956*4882a593Smuzhiyun 	if (WARN_ON(!vg))
1957*4882a593Smuzhiyun 		return -ENODEV;
1958*4882a593Smuzhiyun 
1959*4882a593Smuzhiyun 	err = nla_parse_nested(tb, BRIDGE_VLANDB_ENTRY_MAX, attr,
1960*4882a593Smuzhiyun 			       br_vlan_db_policy, extack);
1961*4882a593Smuzhiyun 	if (err)
1962*4882a593Smuzhiyun 		return err;
1963*4882a593Smuzhiyun 
1964*4882a593Smuzhiyun 	if (!tb[BRIDGE_VLANDB_ENTRY_INFO]) {
1965*4882a593Smuzhiyun 		NL_SET_ERR_MSG_MOD(extack, "Missing vlan entry info");
1966*4882a593Smuzhiyun 		return -EINVAL;
1967*4882a593Smuzhiyun 	}
1968*4882a593Smuzhiyun 	memset(&vrange_end, 0, sizeof(vrange_end));
1969*4882a593Smuzhiyun 
1970*4882a593Smuzhiyun 	vinfo = nla_data(tb[BRIDGE_VLANDB_ENTRY_INFO]);
1971*4882a593Smuzhiyun 	if (vinfo->flags & (BRIDGE_VLAN_INFO_RANGE_BEGIN |
1972*4882a593Smuzhiyun 			    BRIDGE_VLAN_INFO_RANGE_END)) {
1973*4882a593Smuzhiyun 		NL_SET_ERR_MSG_MOD(extack, "Old-style vlan ranges are not allowed when using RTM vlan calls");
1974*4882a593Smuzhiyun 		return -EINVAL;
1975*4882a593Smuzhiyun 	}
1976*4882a593Smuzhiyun 	if (!br_vlan_valid_id(vinfo->vid, extack))
1977*4882a593Smuzhiyun 		return -EINVAL;
1978*4882a593Smuzhiyun 
1979*4882a593Smuzhiyun 	if (tb[BRIDGE_VLANDB_ENTRY_RANGE]) {
1980*4882a593Smuzhiyun 		vrange_end.vid = nla_get_u16(tb[BRIDGE_VLANDB_ENTRY_RANGE]);
1981*4882a593Smuzhiyun 		/* validate user-provided flags without RANGE_BEGIN */
1982*4882a593Smuzhiyun 		vrange_end.flags = BRIDGE_VLAN_INFO_RANGE_END | vinfo->flags;
1983*4882a593Smuzhiyun 		vinfo->flags |= BRIDGE_VLAN_INFO_RANGE_BEGIN;
1984*4882a593Smuzhiyun 
1985*4882a593Smuzhiyun 		/* vinfo_last is the range start, vinfo the range end */
1986*4882a593Smuzhiyun 		vinfo_last = vinfo;
1987*4882a593Smuzhiyun 		vinfo = &vrange_end;
1988*4882a593Smuzhiyun 
1989*4882a593Smuzhiyun 		if (!br_vlan_valid_id(vinfo->vid, extack) ||
1990*4882a593Smuzhiyun 		    !br_vlan_valid_range(vinfo, vinfo_last, extack))
1991*4882a593Smuzhiyun 			return -EINVAL;
1992*4882a593Smuzhiyun 	}
1993*4882a593Smuzhiyun 
1994*4882a593Smuzhiyun 	switch (cmd) {
1995*4882a593Smuzhiyun 	case RTM_NEWVLAN:
1996*4882a593Smuzhiyun 		cmdmap = RTM_SETLINK;
1997*4882a593Smuzhiyun 		skip_processing = !!(vinfo->flags & BRIDGE_VLAN_INFO_ONLY_OPTS);
1998*4882a593Smuzhiyun 		break;
1999*4882a593Smuzhiyun 	case RTM_DELVLAN:
2000*4882a593Smuzhiyun 		cmdmap = RTM_DELLINK;
2001*4882a593Smuzhiyun 		break;
2002*4882a593Smuzhiyun 	}
2003*4882a593Smuzhiyun 
2004*4882a593Smuzhiyun 	if (!skip_processing) {
2005*4882a593Smuzhiyun 		struct bridge_vlan_info *tmp_last = vinfo_last;
2006*4882a593Smuzhiyun 
2007*4882a593Smuzhiyun 		/* br_process_vlan_info may overwrite vinfo_last */
2008*4882a593Smuzhiyun 		err = br_process_vlan_info(br, p, cmdmap, vinfo, &tmp_last,
2009*4882a593Smuzhiyun 					   &changed, extack);
2010*4882a593Smuzhiyun 
2011*4882a593Smuzhiyun 		/* notify first if anything changed */
2012*4882a593Smuzhiyun 		if (changed)
2013*4882a593Smuzhiyun 			br_ifinfo_notify(cmdmap, br, p);
2014*4882a593Smuzhiyun 
2015*4882a593Smuzhiyun 		if (err)
2016*4882a593Smuzhiyun 			return err;
2017*4882a593Smuzhiyun 	}
2018*4882a593Smuzhiyun 
2019*4882a593Smuzhiyun 	/* deal with options */
2020*4882a593Smuzhiyun 	if (cmd == RTM_NEWVLAN) {
2021*4882a593Smuzhiyun 		struct net_bridge_vlan *range_start, *range_end;
2022*4882a593Smuzhiyun 
2023*4882a593Smuzhiyun 		if (vinfo_last) {
2024*4882a593Smuzhiyun 			range_start = br_vlan_find(vg, vinfo_last->vid);
2025*4882a593Smuzhiyun 			range_end = br_vlan_find(vg, vinfo->vid);
2026*4882a593Smuzhiyun 		} else {
2027*4882a593Smuzhiyun 			range_start = br_vlan_find(vg, vinfo->vid);
2028*4882a593Smuzhiyun 			range_end = range_start;
2029*4882a593Smuzhiyun 		}
2030*4882a593Smuzhiyun 
2031*4882a593Smuzhiyun 		err = br_vlan_process_options(br, p, range_start, range_end,
2032*4882a593Smuzhiyun 					      tb, extack);
2033*4882a593Smuzhiyun 	}
2034*4882a593Smuzhiyun 
2035*4882a593Smuzhiyun 	return err;
2036*4882a593Smuzhiyun }
2037*4882a593Smuzhiyun 
br_vlan_rtm_process(struct sk_buff * skb,struct nlmsghdr * nlh,struct netlink_ext_ack * extack)2038*4882a593Smuzhiyun static int br_vlan_rtm_process(struct sk_buff *skb, struct nlmsghdr *nlh,
2039*4882a593Smuzhiyun 			       struct netlink_ext_ack *extack)
2040*4882a593Smuzhiyun {
2041*4882a593Smuzhiyun 	struct net *net = sock_net(skb->sk);
2042*4882a593Smuzhiyun 	struct br_vlan_msg *bvm;
2043*4882a593Smuzhiyun 	struct net_device *dev;
2044*4882a593Smuzhiyun 	struct nlattr *attr;
2045*4882a593Smuzhiyun 	int err, vlans = 0;
2046*4882a593Smuzhiyun 	int rem;
2047*4882a593Smuzhiyun 
2048*4882a593Smuzhiyun 	/* this should validate the header and check for remaining bytes */
2049*4882a593Smuzhiyun 	err = nlmsg_parse(nlh, sizeof(*bvm), NULL, BRIDGE_VLANDB_MAX, NULL,
2050*4882a593Smuzhiyun 			  extack);
2051*4882a593Smuzhiyun 	if (err < 0)
2052*4882a593Smuzhiyun 		return err;
2053*4882a593Smuzhiyun 
2054*4882a593Smuzhiyun 	bvm = nlmsg_data(nlh);
2055*4882a593Smuzhiyun 	dev = __dev_get_by_index(net, bvm->ifindex);
2056*4882a593Smuzhiyun 	if (!dev)
2057*4882a593Smuzhiyun 		return -ENODEV;
2058*4882a593Smuzhiyun 
2059*4882a593Smuzhiyun 	if (!netif_is_bridge_master(dev) && !netif_is_bridge_port(dev)) {
2060*4882a593Smuzhiyun 		NL_SET_ERR_MSG_MOD(extack, "The device is not a valid bridge or bridge port");
2061*4882a593Smuzhiyun 		return -EINVAL;
2062*4882a593Smuzhiyun 	}
2063*4882a593Smuzhiyun 
2064*4882a593Smuzhiyun 	nlmsg_for_each_attr(attr, nlh, sizeof(*bvm), rem) {
2065*4882a593Smuzhiyun 		if (nla_type(attr) != BRIDGE_VLANDB_ENTRY)
2066*4882a593Smuzhiyun 			continue;
2067*4882a593Smuzhiyun 
2068*4882a593Smuzhiyun 		vlans++;
2069*4882a593Smuzhiyun 		err = br_vlan_rtm_process_one(dev, attr, nlh->nlmsg_type,
2070*4882a593Smuzhiyun 					      extack);
2071*4882a593Smuzhiyun 		if (err)
2072*4882a593Smuzhiyun 			break;
2073*4882a593Smuzhiyun 	}
2074*4882a593Smuzhiyun 	if (!vlans) {
2075*4882a593Smuzhiyun 		NL_SET_ERR_MSG_MOD(extack, "No vlans found to process");
2076*4882a593Smuzhiyun 		err = -EINVAL;
2077*4882a593Smuzhiyun 	}
2078*4882a593Smuzhiyun 
2079*4882a593Smuzhiyun 	return err;
2080*4882a593Smuzhiyun }
2081*4882a593Smuzhiyun 
br_vlan_rtnl_init(void)2082*4882a593Smuzhiyun void br_vlan_rtnl_init(void)
2083*4882a593Smuzhiyun {
2084*4882a593Smuzhiyun 	rtnl_register_module(THIS_MODULE, PF_BRIDGE, RTM_GETVLAN, NULL,
2085*4882a593Smuzhiyun 			     br_vlan_rtm_dump, 0);
2086*4882a593Smuzhiyun 	rtnl_register_module(THIS_MODULE, PF_BRIDGE, RTM_NEWVLAN,
2087*4882a593Smuzhiyun 			     br_vlan_rtm_process, NULL, 0);
2088*4882a593Smuzhiyun 	rtnl_register_module(THIS_MODULE, PF_BRIDGE, RTM_DELVLAN,
2089*4882a593Smuzhiyun 			     br_vlan_rtm_process, NULL, 0);
2090*4882a593Smuzhiyun }
2091*4882a593Smuzhiyun 
br_vlan_rtnl_uninit(void)2092*4882a593Smuzhiyun void br_vlan_rtnl_uninit(void)
2093*4882a593Smuzhiyun {
2094*4882a593Smuzhiyun 	rtnl_unregister(PF_BRIDGE, RTM_GETVLAN);
2095*4882a593Smuzhiyun 	rtnl_unregister(PF_BRIDGE, RTM_NEWVLAN);
2096*4882a593Smuzhiyun 	rtnl_unregister(PF_BRIDGE, RTM_DELVLAN);
2097*4882a593Smuzhiyun }
2098