blob: b01d689c8025260e525541b205c55d9f5aed4450 [file] [log] [blame]
developer58aa0682023-09-18 14:02:26 +08001From 120baca4e8b019d03c8d1a29012cea911629247a Mon Sep 17 00:00:00 2001
2From: Bc-bocun Chen <bc-bocun.chen@mediatek.com>
3Date: Mon, 18 Sep 2023 11:13:51 +0800
4Subject: [PATCH 15/22] update-net-bridge-for-bridger
5
6---
7 include/net/switchdev.h | 2 +
8 net/bridge/Makefile | 2 +-
9 net/bridge/br_mdb.c | 32 +-
10 net/bridge/br_netlink.c | 6 +-
11 net/bridge/br_netlink_tunnel.c | 4 +-
12 net/bridge/br_private.h | 293 +++++++++++++-
13 net/bridge/br_private_tunnel.h | 4 +
14 net/bridge/br_vlan.c | 698 +++++++++++++++++++++++++++++++--
15 net/bridge/br_vlan_options.c | 346 ++++++++++++++++
16 net/core/rtnetlink.c | 1 +
17 net/dsa/slave.c | 11 +
18 11 files changed, 1365 insertions(+), 34 deletions(-)
19 create mode 100644 net/bridge/br_vlan_options.c
20
developerdd386532022-07-26 17:14:47 +080021diff --git a/include/net/switchdev.h b/include/net/switchdev.h
22index 191dc34..d4d71d9 100644
23--- a/include/net/switchdev.h
24+++ b/include/net/switchdev.h
25@@ -77,6 +77,7 @@ struct switchdev_obj {
26 struct switchdev_obj_port_vlan {
27 struct switchdev_obj obj;
28 u16 flags;
29+ u16 vid;
30 u16 vid_begin;
31 u16 vid_end;
32 };
33@@ -117,6 +118,7 @@ enum switchdev_notifier_type {
34 struct switchdev_notifier_info {
35 struct net_device *dev;
36 struct netlink_ext_ack *extack;
37+ const void *ctx;
38 };
39
40 struct switchdev_notifier_fdb_info {
41diff --git a/net/bridge/Makefile b/net/bridge/Makefile
42index ac9ef33..49da7ae 100644
43--- a/net/bridge/Makefile
44+++ b/net/bridge/Makefile
45@@ -20,7 +20,7 @@ obj-$(CONFIG_BRIDGE_NETFILTER) += br_netfilter.o
46
47 bridge-$(CONFIG_BRIDGE_IGMP_SNOOPING) += br_multicast.o br_mdb.o
48
49-bridge-$(CONFIG_BRIDGE_VLAN_FILTERING) += br_vlan.o br_vlan_tunnel.o
50+bridge-$(CONFIG_BRIDGE_VLAN_FILTERING) += br_vlan.o br_vlan_tunnel.o br_vlan_options.o
51
52 bridge-$(CONFIG_NET_SWITCHDEV) += br_switchdev.o
53
54diff --git a/net/bridge/br_mdb.c b/net/bridge/br_mdb.c
55index da5ed4c..eeabfbc 100644
56--- a/net/bridge/br_mdb.c
57+++ b/net/bridge/br_mdb.c
58@@ -16,7 +16,37 @@
59
60 #include "br_private.h"
61
62-static int br_rports_fill_info(struct sk_buff *skb, struct netlink_callback *cb,
63+static size_t __br_rports_one_size(void)
64+{
65+ return nla_total_size(sizeof(u32)) + /* MDBA_ROUTER_PORT */
66+ nla_total_size(sizeof(u32)) + /* MDBA_ROUTER_PATTR_TIMER */
67+ nla_total_size(sizeof(u8)) + /* MDBA_ROUTER_PATTR_TYPE */
68+ nla_total_size(sizeof(u32)) + /* MDBA_ROUTER_PATTR_INET_TIMER */
69+ nla_total_size(sizeof(u32)) + /* MDBA_ROUTER_PATTR_INET6_TIMER */
70+ nla_total_size(sizeof(u32)); /* MDBA_ROUTER_PATTR_VID */
71+}
72+
73+size_t br_rports_size(const struct net_bridge_mcast *brmctx)
74+{
75+ struct net_bridge_mcast_port *pmctx;
76+ size_t size = nla_total_size(0); /* MDBA_ROUTER */
77+
78+ rcu_read_lock();
79+ hlist_for_each_entry_rcu(pmctx, &brmctx->ip4_mc_router_list,
80+ ip4_rlist)
81+ size += __br_rports_one_size();
82+
83+#if IS_ENABLED(CONFIG_IPV6)
84+ hlist_for_each_entry_rcu(pmctx, &brmctx->ip6_mc_router_list,
85+ ip6_rlist)
86+ size += __br_rports_one_size();
87+#endif
88+ rcu_read_unlock();
89+
90+ return size;
91+}
92+
93+int br_rports_fill_info(struct sk_buff *skb, struct netlink_callback *cb,
94 struct net_device *dev)
95 {
96 struct net_bridge *br = netdev_priv(dev);
97diff --git a/net/bridge/br_netlink.c b/net/bridge/br_netlink.c
98index cbcbc19..887e767 100644
99--- a/net/bridge/br_netlink.c
100+++ b/net/bridge/br_netlink.c
101@@ -562,7 +562,7 @@ static int br_vlan_info(struct net_bridge *br, struct net_bridge_port *p,
102 return err;
103 }
104
105-static int br_process_vlan_info(struct net_bridge *br,
106+int br_process_vlan_info(struct net_bridge *br,
107 struct net_bridge_port *p, int cmd,
108 struct bridge_vlan_info *vinfo_curr,
109 struct bridge_vlan_info **vinfo_last,
110@@ -1578,7 +1578,7 @@ static int br_fill_linkxstats(struct sk_buff *skb,
111 pvid = br_get_pvid(vg);
112 list_for_each_entry(v, &vg->vlan_list, vlist) {
113 struct bridge_vlan_xstats vxi;
114- struct br_vlan_stats stats;
115+ struct pcpu_sw_netstats stats;
116
117 if (++vl_idx < *prividx)
118 continue;
119@@ -1652,6 +1652,7 @@ int __init br_netlink_init(void)
120 int err;
121
122 br_mdb_init();
123+ br_vlan_rtnl_init();
124 rtnl_af_register(&br_af_ops);
125
126 err = rtnl_link_register(&br_link_ops);
127@@ -1669,6 +1670,7 @@ int __init br_netlink_init(void)
128 void br_netlink_fini(void)
129 {
130 br_mdb_uninit();
131+ br_vlan_rtnl_uninit();
132 rtnl_af_unregister(&br_af_ops);
133 rtnl_link_unregister(&br_link_ops);
134 }
135diff --git a/net/bridge/br_netlink_tunnel.c b/net/bridge/br_netlink_tunnel.c
136index afee292..3bbbd66 100644
137--- a/net/bridge/br_netlink_tunnel.c
138+++ b/net/bridge/br_netlink_tunnel.c
139@@ -26,7 +26,7 @@ static size_t __get_vlan_tinfo_size(void)
140 nla_total_size(sizeof(u16)); /* IFLA_BRIDGE_VLAN_TUNNEL_FLAGS */
141 }
142
143-static bool vlan_tunid_inrange(struct net_bridge_vlan *v_curr,
144+bool vlan_tunid_inrange(struct net_bridge_vlan *v_curr,
145 struct net_bridge_vlan *v_last)
146 {
147 __be32 tunid_curr = tunnel_id_to_key32(v_curr->tinfo.tunnel_id);
148@@ -193,7 +193,7 @@ static const struct nla_policy vlan_tunnel_policy[IFLA_BRIDGE_VLAN_TUNNEL_MAX +
149 [IFLA_BRIDGE_VLAN_TUNNEL_FLAGS] = { .type = NLA_U16 },
150 };
151
152-static int br_vlan_tunnel_info(struct net_bridge_port *p, int cmd,
153+int br_vlan_tunnel_info(struct net_bridge_port *p, int cmd,
154 u16 vid, u32 tun_id, bool *changed)
155 {
156 int err = 0;
157diff --git a/net/bridge/br_private.h b/net/bridge/br_private.h
158index 4bd9e9b..4620f70 100644
159--- a/net/bridge/br_private.h
160+++ b/net/bridge/br_private.h
161@@ -95,6 +95,60 @@ struct br_vlan_stats {
162 struct u64_stats_sync syncp;
163 };
164
165+/* net_bridge_mcast_port must be always defined due to forwarding stubs */
166+struct net_bridge_mcast_port {
167+#ifdef CONFIG_BRIDGE_IGMP_SNOOPING
168+ struct net_bridge_port *port;
169+ struct net_bridge_vlan *vlan;
170+
171+ struct bridge_mcast_own_query ip4_own_query;
172+ struct timer_list ip4_mc_router_timer;
173+ struct hlist_node ip4_rlist;
174+#if IS_ENABLED(CONFIG_IPV6)
175+ struct bridge_mcast_own_query ip6_own_query;
176+ struct timer_list ip6_mc_router_timer;
177+ struct hlist_node ip6_rlist;
178+#endif /* IS_ENABLED(CONFIG_IPV6) */
179+ unsigned char multicast_router;
180+#endif /* CONFIG_BRIDGE_IGMP_SNOOPING */
181+};
182+
183+/* net_bridge_mcast must be always defined due to forwarding stubs */
184+struct net_bridge_mcast {
185+#ifdef CONFIG_BRIDGE_IGMP_SNOOPING
186+ struct net_bridge *br;
187+ struct net_bridge_vlan *vlan;
188+
189+ u32 multicast_last_member_count;
190+ u32 multicast_startup_query_count;
191+
192+ u8 multicast_querier;
193+ u8 multicast_igmp_version;
194+ u8 multicast_router;
195+#if IS_ENABLED(CONFIG_IPV6)
196+ u8 multicast_mld_version;
197+#endif
198+ unsigned long multicast_last_member_interval;
199+ unsigned long multicast_membership_interval;
200+ unsigned long multicast_querier_interval;
201+ unsigned long multicast_query_interval;
202+ unsigned long multicast_query_response_interval;
203+ unsigned long multicast_startup_query_interval;
204+ struct hlist_head ip4_mc_router_list;
205+ struct timer_list ip4_mc_router_timer;
206+ struct bridge_mcast_other_query ip4_other_query;
207+ struct bridge_mcast_own_query ip4_own_query;
208+ struct bridge_mcast_querier ip4_querier;
209+#if IS_ENABLED(CONFIG_IPV6)
210+ struct hlist_head ip6_mc_router_list;
211+ struct timer_list ip6_mc_router_timer;
212+ struct bridge_mcast_other_query ip6_other_query;
213+ struct bridge_mcast_own_query ip6_own_query;
214+ struct bridge_mcast_querier ip6_querier;
215+#endif /* IS_ENABLED(CONFIG_IPV6) */
216+#endif /* CONFIG_BRIDGE_IGMP_SNOOPING */
217+};
218+
219 struct br_tunnel_info {
220 __be64 tunnel_id;
221 struct metadata_dst __rcu *tunnel_dst;
222@@ -104,6 +158,8 @@ struct br_tunnel_info {
223 enum {
224 BR_VLFLAG_PER_PORT_STATS = BIT(0),
225 BR_VLFLAG_ADDED_BY_SWITCHDEV = BIT(1),
226+ BR_VLFLAG_MCAST_ENABLED = BIT(2),
227+ BR_VLFLAG_GLOBAL_MCAST_ENABLED = BIT(3),
228 };
229
230 /**
231@@ -113,12 +169,16 @@ enum {
232 * @vid: VLAN id
233 * @flags: bridge vlan flags
234 * @priv_flags: private (in-kernel) bridge vlan flags
235+ * @state: STP state (e.g. blocking, learning, forwarding)
236 * @stats: per-cpu VLAN statistics
237 * @br: if MASTER flag set, this points to a bridge struct
238 * @port: if MASTER flag unset, this points to a port struct
239 * @refcnt: if MASTER flag set, this is bumped for each port referencing it
240 * @brvlan: if MASTER flag unset, this points to the global per-VLAN context
241 * for this VLAN entry
242+ * @br_mcast_ctx: if MASTER flag set, this is the global vlan multicast context
243+ * @port_mcast_ctx: if MASTER flag unset, this is the per-port/vlan multicast
244+ * context
245 * @vlist: sorted list of VLAN entries
246 * @rcu: used for entry destruction
247 *
248@@ -133,7 +193,8 @@ struct net_bridge_vlan {
249 u16 vid;
250 u16 flags;
251 u16 priv_flags;
252- struct br_vlan_stats __percpu *stats;
253+ u8 state;
254+ struct pcpu_sw_netstats __percpu *stats;
255 union {
256 struct net_bridge *br;
257 struct net_bridge_port *port;
258@@ -145,6 +206,11 @@ struct net_bridge_vlan {
259
260 struct br_tunnel_info tinfo;
261
262+ union {
263+ struct net_bridge_mcast br_mcast_ctx;
264+ struct net_bridge_mcast_port port_mcast_ctx;
265+ };
266+
267 struct list_head vlist;
268
269 struct rcu_head rcu;
270@@ -170,6 +236,7 @@ struct net_bridge_vlan_group {
271 struct list_head vlan_list;
272 u16 num_vlans;
273 u16 pvid;
274+ u8 pvid_state;
275 };
276
277 struct net_bridge_fdb_key {
278@@ -497,6 +564,67 @@ static inline bool br_vlan_should_use(const struct net_bridge_vlan *v)
279 return true;
280 }
281
282+static inline bool br_vlan_valid_id(u16 vid, struct netlink_ext_ack *extack)
283+{
284+ bool ret = vid > 0 && vid < VLAN_VID_MASK;
285+
286+ if (!ret)
287+ NL_SET_ERR_MSG_MOD(extack, "Vlan id is invalid");
288+
289+ return ret;
290+}
291+
292+static inline bool br_vlan_valid_range(const struct bridge_vlan_info *cur,
293+ const struct bridge_vlan_info *last,
294+ struct netlink_ext_ack *extack)
295+{
296+ /* pvid flag is not allowed in ranges */
297+ if (cur->flags & BRIDGE_VLAN_INFO_PVID) {
298+ NL_SET_ERR_MSG_MOD(extack, "Pvid isn't allowed in a range");
299+ return false;
300+ }
301+
302+ /* when cur is the range end, check if:
303+ * - it has range start flag
304+ * - range ids are invalid (end is equal to or before start)
305+ */
306+ if (last) {
307+ if (cur->flags & BRIDGE_VLAN_INFO_RANGE_BEGIN) {
308+ NL_SET_ERR_MSG_MOD(extack, "Found a new vlan range start while processing one");
309+ return false;
310+ } else if (!(cur->flags & BRIDGE_VLAN_INFO_RANGE_END)) {
311+ NL_SET_ERR_MSG_MOD(extack, "Vlan range end flag is missing");
312+ return false;
313+ } else if (cur->vid <= last->vid) {
314+ NL_SET_ERR_MSG_MOD(extack, "End vlan id is less than or equal to start vlan id");
315+ return false;
316+ }
317+ }
318+
319+ /* check for required range flags */
320+ if (!(cur->flags & (BRIDGE_VLAN_INFO_RANGE_BEGIN |
321+ BRIDGE_VLAN_INFO_RANGE_END))) {
322+ NL_SET_ERR_MSG_MOD(extack, "Both vlan range flags are missing");
323+ return false;
324+ }
325+
326+ return true;
327+}
328+
329+static inline u8 br_vlan_multicast_router(const struct net_bridge_vlan *v)
330+{
331+ u8 mcast_router = MDB_RTR_TYPE_DISABLED;
332+
333+#ifdef CONFIG_BRIDGE_IGMP_SNOOPING
334+ if (!br_vlan_is_master(v))
335+ mcast_router = v->port_mcast_ctx.multicast_router;
336+ else
337+ mcast_router = v->br_mcast_ctx.multicast_router;
338+#endif
339+
340+ return mcast_router;
341+}
342+
343 static inline int br_opt_get(const struct net_bridge *br,
344 enum net_bridge_opts opt)
345 {
346@@ -676,8 +804,10 @@ void br_multicast_flood(struct net_bridge_mdb_entry *mdst,
347 struct sk_buff *skb, bool local_rcv, bool local_orig);
348 int br_multicast_set_router(struct net_bridge *br, unsigned long val);
349 int br_multicast_set_port_router(struct net_bridge_port *p, unsigned long val);
350+int br_multicast_set_vlan_router(struct net_bridge_vlan *v, u8 mcast_router);
351 int br_multicast_toggle(struct net_bridge *br, unsigned long val);
352 int br_multicast_set_querier(struct net_bridge *br, unsigned long val);
353+
354 int br_multicast_set_hash_max(struct net_bridge *br, unsigned long val);
355 int br_multicast_set_igmp_version(struct net_bridge *br, unsigned long val);
356 #if IS_ENABLED(CONFIG_IPV6)
357@@ -708,6 +838,17 @@ void br_mdb_init(void);
358 void br_mdb_uninit(void);
359 void br_multicast_host_join(struct net_bridge_mdb_entry *mp, bool notify);
360 void br_multicast_host_leave(struct net_bridge_mdb_entry *mp, bool notify);
361+int br_rports_fill_info(struct sk_buff *skb, struct netlink_callback *cb,
362+ struct net_device *dev);
363+int br_multicast_dump_querier_state(struct sk_buff *skb,
364+ const struct net_bridge_mcast *brmctx,
365+ int nest_attr);
366+size_t br_multicast_querier_state_size(void);
367+size_t br_rports_size(const struct net_bridge_mcast *brmctx);
368+void br_multicast_set_query_intvl(struct net_bridge_mcast *brmctx,
369+ unsigned long val);
370+void br_multicast_set_startup_query_intvl(struct net_bridge_mcast *brmctx,
371+ unsigned long val);
372
373 #define mlock_dereference(X, br) \
374 rcu_dereference_protected(X, lockdep_is_held(&br->multicast_lock))
375@@ -760,6 +901,49 @@ static inline int br_multicast_igmp_type(const struct sk_buff *skb)
376 {
377 return BR_INPUT_SKB_CB(skb)->igmp;
378 }
379+static inline bool
380+br_rports_have_mc_router(const struct net_bridge_mcast *brmctx)
381+{
382+#if IS_ENABLED(CONFIG_IPV6)
383+ return !hlist_empty(&brmctx->ip4_mc_router_list) ||
384+ !hlist_empty(&brmctx->ip6_mc_router_list);
385+#else
386+ return !hlist_empty(&brmctx->ip4_mc_router_list);
387+#endif
388+}
389+
390+static inline bool
391+br_multicast_ctx_options_equal(const struct net_bridge_mcast *brmctx1,
392+ const struct net_bridge_mcast *brmctx2)
393+{
394+ return brmctx1->multicast_igmp_version ==
395+ brmctx2->multicast_igmp_version &&
396+ brmctx1->multicast_last_member_count ==
397+ brmctx2->multicast_last_member_count &&
398+ brmctx1->multicast_startup_query_count ==
399+ brmctx2->multicast_startup_query_count &&
400+ brmctx1->multicast_last_member_interval ==
401+ brmctx2->multicast_last_member_interval &&
402+ brmctx1->multicast_membership_interval ==
403+ brmctx2->multicast_membership_interval &&
404+ brmctx1->multicast_querier_interval ==
405+ brmctx2->multicast_querier_interval &&
406+ brmctx1->multicast_query_interval ==
407+ brmctx2->multicast_query_interval &&
408+ brmctx1->multicast_query_response_interval ==
409+ brmctx2->multicast_query_response_interval &&
410+ brmctx1->multicast_startup_query_interval ==
411+ brmctx2->multicast_startup_query_interval &&
412+ brmctx1->multicast_querier == brmctx2->multicast_querier &&
413+ brmctx1->multicast_router == brmctx2->multicast_router &&
414+ !br_rports_have_mc_router(brmctx1) &&
415+ !br_rports_have_mc_router(brmctx2) &&
416+#if IS_ENABLED(CONFIG_IPV6)
417+ brmctx1->multicast_mld_version ==
418+ brmctx2->multicast_mld_version &&
419+#endif
420+ true;
421+}
422 #else
423 static inline int br_multicast_rcv(struct net_bridge *br,
424 struct net_bridge_port *port,
425@@ -907,10 +1091,21 @@ void nbp_vlan_flush(struct net_bridge_port *port);
426 int nbp_vlan_init(struct net_bridge_port *port, struct netlink_ext_ack *extack);
427 int nbp_get_num_vlan_infos(struct net_bridge_port *p, u32 filter_mask);
428 void br_vlan_get_stats(const struct net_bridge_vlan *v,
429- struct br_vlan_stats *stats);
430+ struct pcpu_sw_netstats *stats);
431 void br_vlan_port_event(struct net_bridge_port *p, unsigned long event);
432 int br_vlan_bridge_event(struct net_device *dev, unsigned long event,
433 void *ptr);
434+void br_vlan_rtnl_init(void);
435+void br_vlan_rtnl_uninit(void);
436+void br_vlan_notify(const struct net_bridge *br,
437+ const struct net_bridge_port *p,
438+ u16 vid, u16 vid_range,
439+ int cmd);
440+int br_vlan_replay(struct net_device *br_dev, struct net_device *dev,
441+ const void *ctx, bool adding, struct notifier_block *nb,
442+ struct netlink_ext_ack *extack);
443+bool br_vlan_can_enter_range(struct net_bridge_vlan *v_curr,
444+ struct net_bridge_vlan *range_end);
445
446 void br_vlan_fill_forward_path_pvid(struct net_bridge *br,
447 struct net_device_path_ctx *ctx,
448@@ -969,6 +1164,10 @@ static inline u16 br_get_pvid(const struct net_bridge_vlan_group *vg)
449 return vg->pvid;
450 }
451
452+static inline u16 br_vlan_flags(const struct net_bridge_vlan *v, u16 pvid)
453+{
454+ return v->vid == pvid ? v->flags | BRIDGE_VLAN_INFO_PVID : v->flags;
455+}
456 #else
457 static inline bool br_allowed_ingress(const struct net_bridge *br,
458 struct net_bridge_vlan_group *vg,
459@@ -1111,7 +1310,7 @@ static inline struct net_bridge_vlan_group *nbp_vlan_group_rcu(
460 }
461
462 static inline void br_vlan_get_stats(const struct net_bridge_vlan *v,
463- struct br_vlan_stats *stats)
464+ struct pcpu_sw_netstats *stats)
465 {
466 }
467
468@@ -1125,6 +1324,88 @@ static inline int br_vlan_bridge_event(struct net_device *dev,
469 {
470 return 0;
471 }
472+
473+static inline void br_vlan_rtnl_init(void)
474+{
475+}
476+
477+static inline void br_vlan_rtnl_uninit(void)
478+{
479+}
480+
481+static inline void br_vlan_notify(const struct net_bridge *br,
482+ const struct net_bridge_port *p,
483+ u16 vid, u16 vid_range,
484+ int cmd)
485+{
486+}
487+
488+static inline bool br_vlan_can_enter_range(const struct net_bridge_vlan *v_curr,
489+ const struct net_bridge_vlan *range_end)
490+{
491+ return true;
492+}
493+
494+static inline int br_vlan_replay(struct net_device *br_dev,
495+ struct net_device *dev, const void *ctx,
496+ bool adding, struct notifier_block *nb,
497+ struct netlink_ext_ack *extack)
498+{
499+ return -EOPNOTSUPP;
500+}
501+#endif
502+
503+/* br_vlan_options.c */
504+#ifdef CONFIG_BRIDGE_VLAN_FILTERING
505+bool br_vlan_opts_eq_range(struct net_bridge_vlan *v_curr,
506+ struct net_bridge_vlan *range_end);
507+bool br_vlan_opts_fill(struct sk_buff *skb, const struct net_bridge_vlan *v);
508+size_t br_vlan_opts_nl_size(void);
509+int br_vlan_process_options(const struct net_bridge *br,
510+ struct net_bridge_port *p,
511+ struct net_bridge_vlan *range_start,
512+ struct net_bridge_vlan *range_end,
513+ struct nlattr **tb,
514+ struct netlink_ext_ack *extack);
515+bool br_vlan_global_opts_can_enter_range(const struct net_bridge_vlan *v_curr,
516+ const struct net_bridge_vlan *r_end);
517+bool br_vlan_global_opts_fill(struct sk_buff *skb, u16 vid, u16 vid_range,
518+ const struct net_bridge_vlan *v_opts);
519+
520+/* vlan state manipulation helpers using *_ONCE to annotate lock-free access */
521+static inline u8 br_vlan_get_state(const struct net_bridge_vlan *v)
522+{
523+ return READ_ONCE(v->state);
524+}
525+
526+static inline void br_vlan_set_state(struct net_bridge_vlan *v, u8 state)
527+{
528+ WRITE_ONCE(v->state, state);
529+}
530+
531+static inline u8 br_vlan_get_pvid_state(const struct net_bridge_vlan_group *vg)
532+{
533+ return READ_ONCE(vg->pvid_state);
534+}
535+
536+static inline void br_vlan_set_pvid_state(struct net_bridge_vlan_group *vg,
537+ u8 state)
538+{
539+ WRITE_ONCE(vg->pvid_state, state);
540+}
541+
542+/* learn_allow is true at ingress and false at egress */
543+static inline bool br_vlan_state_allowed(u8 state, bool learn_allow)
544+{
545+ switch (state) {
546+ case BR_STATE_LEARNING:
547+ return learn_allow;
548+ case BR_STATE_FORWARDING:
549+ return true;
550+ default:
551+ return false;
552+ }
553+}
554 #endif
555
556 struct nf_br_ops {
557@@ -1196,6 +1477,12 @@ int br_setlink(struct net_device *dev, struct nlmsghdr *nlmsg, u16 flags,
558 int br_dellink(struct net_device *dev, struct nlmsghdr *nlmsg, u16 flags);
559 int br_getlink(struct sk_buff *skb, u32 pid, u32 seq, struct net_device *dev,
560 u32 filter_mask, int nlflags);
561+int br_process_vlan_info(struct net_bridge *br,
562+ struct net_bridge_port *p, int cmd,
563+ struct bridge_vlan_info *vinfo_curr,
564+ struct bridge_vlan_info **vinfo_last,
565+ bool *changed,
566+ struct netlink_ext_ack *extack);
567
568 #ifdef CONFIG_SYSFS
569 /* br_sysfs_if.c */
570diff --git a/net/bridge/br_private_tunnel.h b/net/bridge/br_private_tunnel.h
571index 2bdef2e..25be963 100644
572--- a/net/bridge/br_private_tunnel.h
573+++ b/net/bridge/br_private_tunnel.h
574@@ -42,6 +42,10 @@ int br_handle_ingress_vlan_tunnel(struct sk_buff *skb,
575 struct net_bridge_vlan_group *vg);
576 int br_handle_egress_vlan_tunnel(struct sk_buff *skb,
577 struct net_bridge_vlan *vlan);
578+bool vlan_tunid_inrange(struct net_bridge_vlan *v_curr,
579+ struct net_bridge_vlan *v_last);
580+int br_vlan_tunnel_info(struct net_bridge_port *p, int cmd,
581+ u16 vid, u32 tun_id, bool *changed);
582 #else
583 static inline int vlan_tunnel_init(struct net_bridge_vlan_group *vg)
584 {
585diff --git a/net/bridge/br_vlan.c b/net/bridge/br_vlan.c
586index bcfd169..2b5950c 100644
587--- a/net/bridge/br_vlan.c
588+++ b/net/bridge/br_vlan.c
589@@ -34,13 +34,15 @@ static struct net_bridge_vlan *br_vlan_lookup(struct rhashtable *tbl, u16 vid)
590 return rhashtable_lookup_fast(tbl, &vid, br_vlan_rht_params);
591 }
592
593-static bool __vlan_add_pvid(struct net_bridge_vlan_group *vg, u16 vid)
594+static bool __vlan_add_pvid(struct net_bridge_vlan_group *vg,
595+ const struct net_bridge_vlan *v)
596 {
597- if (vg->pvid == vid)
598+ if (vg->pvid == v->vid)
599 return false;
600
601 smp_wmb();
602- vg->pvid = vid;
603+ br_vlan_set_pvid_state(vg, v->state);
604+ vg->pvid = v->vid;
605
606 return true;
607 }
608@@ -69,7 +71,7 @@ static bool __vlan_add_flags(struct net_bridge_vlan *v, u16 flags)
609 vg = nbp_vlan_group(v->port);
610
611 if (flags & BRIDGE_VLAN_INFO_PVID)
612- ret = __vlan_add_pvid(vg, v->vid);
613+ ret = __vlan_add_pvid(vg, v);
614 else
615 ret = __vlan_delete_pvid(vg, v->vid);
616
617@@ -257,6 +259,10 @@ static int __vlan_add(struct net_bridge_vlan *v, u16 flags,
618 &changed, extack);
619 if (err)
620 goto out_filt;
621+
622+ if (changed)
623+ br_vlan_notify(br, NULL, v->vid, 0,
624+ RTM_NEWVLAN);
625 }
626
627 masterv = br_vlan_get_master(br, v->vid, extack);
628@@ -266,7 +272,7 @@ static int __vlan_add(struct net_bridge_vlan *v, u16 flags,
629 }
630 v->brvlan = masterv;
631 if (br_opt_get(br, BROPT_VLAN_STATS_PER_PORT)) {
632- v->stats = netdev_alloc_pcpu_stats(struct br_vlan_stats);
633+ v->stats = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats);
634 if (!v->stats) {
635 err = -ENOMEM;
636 goto out_filt;
637@@ -382,13 +388,31 @@ static void __vlan_group_free(struct net_bridge_vlan_group *vg)
638 kfree(vg);
639 }
640
641-static void __vlan_flush(struct net_bridge_vlan_group *vg)
642+static void __vlan_flush(const struct net_bridge *br,
643+ const struct net_bridge_port *p,
644+ struct net_bridge_vlan_group *vg)
645 {
646 struct net_bridge_vlan *vlan, *tmp;
647+ u16 v_start = 0, v_end = 0;
648
649 __vlan_delete_pvid(vg, vg->pvid);
650- list_for_each_entry_safe(vlan, tmp, &vg->vlan_list, vlist)
651+ list_for_each_entry_safe(vlan, tmp, &vg->vlan_list, vlist) {
652+ /* take care of disjoint ranges */
653+ if (!v_start) {
654+ v_start = vlan->vid;
655+ } else if (vlan->vid - v_end != 1) {
656+ /* found range end, notify and start next one */
657+ br_vlan_notify(br, p, v_start, v_end, RTM_DELVLAN);
658+ v_start = vlan->vid;
659+ }
660+ v_end = vlan->vid;
661+
662 __vlan_del(vlan);
663+ }
664+
665+ /* notify about the last/whole vlan range */
666+ if (v_start)
667+ br_vlan_notify(br, p, v_start, v_end, RTM_DELVLAN);
668 }
669
670 struct sk_buff *br_handle_vlan(struct net_bridge *br,
671@@ -396,7 +420,7 @@ struct sk_buff *br_handle_vlan(struct net_bridge *br,
672 struct net_bridge_vlan_group *vg,
673 struct sk_buff *skb)
674 {
675- struct br_vlan_stats *stats;
676+ struct pcpu_sw_netstats *stats;
677 struct net_bridge_vlan *v;
678 u16 vid;
679
680@@ -448,7 +472,7 @@ static bool __allowed_ingress(const struct net_bridge *br,
681 struct net_bridge_vlan_group *vg,
682 struct sk_buff *skb, u16 *vid)
683 {
684- struct br_vlan_stats *stats;
685+ struct pcpu_sw_netstats *stats;
686 struct net_bridge_vlan *v;
687 bool tagged;
688
689@@ -666,7 +690,7 @@ int br_vlan_add(struct net_bridge *br, u16 vid, u16 flags, bool *changed,
690 if (!vlan)
691 return -ENOMEM;
692
693- vlan->stats = netdev_alloc_pcpu_stats(struct br_vlan_stats);
694+ vlan->stats = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats);
695 if (!vlan->stats) {
696 kfree(vlan);
697 return -ENOMEM;
698@@ -718,7 +742,7 @@ void br_vlan_flush(struct net_bridge *br)
699 ASSERT_RTNL();
700
701 vg = br_vlan_group(br);
702- __vlan_flush(vg);
703+ __vlan_flush(br, NULL, vg);
704 RCU_INIT_POINTER(br->vlgrp, NULL);
705 synchronize_rcu();
706 __vlan_group_free(vg);
707@@ -927,12 +951,15 @@ static void br_vlan_disable_default_pvid(struct net_bridge *br)
708 /* Disable default_pvid on all ports where it is still
709 * configured.
710 */
711- if (vlan_default_pvid(br_vlan_group(br), pvid))
712- br_vlan_delete(br, pvid);
713+ if (vlan_default_pvid(br_vlan_group(br), pvid)) {
714+ if (!br_vlan_delete(br, pvid))
715+ br_vlan_notify(br, NULL, pvid, 0, RTM_DELVLAN);
716+ }
717
718 list_for_each_entry(p, &br->port_list, list) {
719- if (vlan_default_pvid(nbp_vlan_group(p), pvid))
720- nbp_vlan_delete(p, pvid);
721+ if (vlan_default_pvid(nbp_vlan_group(p), pvid) &&
722+ !nbp_vlan_delete(p, pvid))
723+ br_vlan_notify(br, p, pvid, 0, RTM_DELVLAN);
724 }
725
726 br->default_pvid = 0;
727@@ -974,7 +1001,10 @@ int __br_vlan_set_default_pvid(struct net_bridge *br, u16 pvid,
728 &vlchange, extack);
729 if (err)
730 goto out;
731- br_vlan_delete(br, old_pvid);
732+
733+ if (br_vlan_delete(br, old_pvid))
734+ br_vlan_notify(br, NULL, old_pvid, 0, RTM_DELVLAN);
735+ br_vlan_notify(br, NULL, pvid, 0, RTM_NEWVLAN);
736 set_bit(0, changed);
737 }
738
739@@ -994,7 +1024,9 @@ int __br_vlan_set_default_pvid(struct net_bridge *br, u16 pvid,
740 &vlchange, extack);
741 if (err)
742 goto err_port;
743- nbp_vlan_delete(p, old_pvid);
744+ if (nbp_vlan_delete(p, old_pvid))
745+ br_vlan_notify(br, p, old_pvid, 0, RTM_DELVLAN);
746+ br_vlan_notify(p->br, p, pvid, 0, RTM_NEWVLAN);
747 set_bit(p->port_no, changed);
748 }
749
750@@ -1009,22 +1041,28 @@ int __br_vlan_set_default_pvid(struct net_bridge *br, u16 pvid,
751 if (!test_bit(p->port_no, changed))
752 continue;
753
754- if (old_pvid)
755+ if (old_pvid) {
756 nbp_vlan_add(p, old_pvid,
757 BRIDGE_VLAN_INFO_PVID |
758 BRIDGE_VLAN_INFO_UNTAGGED,
759 &vlchange, NULL);
760+ br_vlan_notify(p->br, p, old_pvid, 0, RTM_NEWVLAN);
761+ }
762 nbp_vlan_delete(p, pvid);
763+ br_vlan_notify(br, p, pvid, 0, RTM_DELVLAN);
764 }
765
766 if (test_bit(0, changed)) {
767- if (old_pvid)
768+ if (old_pvid) {
769 br_vlan_add(br, old_pvid,
770 BRIDGE_VLAN_INFO_PVID |
771 BRIDGE_VLAN_INFO_UNTAGGED |
772 BRIDGE_VLAN_INFO_BRENTRY,
773 &vlchange, NULL);
774+ br_vlan_notify(br, NULL, old_pvid, 0, RTM_NEWVLAN);
775+ }
776 br_vlan_delete(br, pvid);
777+ br_vlan_notify(br, NULL, pvid, 0, RTM_DELVLAN);
778 }
779 goto out;
780 }
781@@ -1117,6 +1155,7 @@ int nbp_vlan_init(struct net_bridge_port *p, struct netlink_ext_ack *extack)
782 &changed, extack);
783 if (ret)
784 goto err_vlan_add;
785+ br_vlan_notify(p->br, p, p->br->default_pvid, 0, RTM_NEWVLAN);
786 }
787 out:
788 return ret;
789@@ -1198,21 +1237,21 @@ void nbp_vlan_flush(struct net_bridge_port *port)
790 ASSERT_RTNL();
791
792 vg = nbp_vlan_group(port);
793- __vlan_flush(vg);
794+ __vlan_flush(port->br, port, vg);
795 RCU_INIT_POINTER(port->vlgrp, NULL);
796 synchronize_rcu();
797 __vlan_group_free(vg);
798 }
799
800 void br_vlan_get_stats(const struct net_bridge_vlan *v,
801- struct br_vlan_stats *stats)
802+ struct pcpu_sw_netstats *stats)
803 {
804 int i;
805
806 memset(stats, 0, sizeof(*stats));
807 for_each_possible_cpu(i) {
808 u64 rxpackets, rxbytes, txpackets, txbytes;
809- struct br_vlan_stats *cpu_stats;
810+ struct pcpu_sw_netstats *cpu_stats;
811 unsigned int start;
812
813 cpu_stats = per_cpu_ptr(v->stats, i);
814@@ -1526,8 +1565,8 @@ int br_vlan_bridge_event(struct net_device *dev, unsigned long event, void *ptr)
815 {
816 struct netdev_notifier_changeupper_info *info;
817 struct net_bridge *br = netdev_priv(dev);
818- bool changed;
819- int ret = 0;
820+ int vlcmd = 0, ret = 0;
821+ bool changed = false;
822
823 switch (event) {
824 case NETDEV_REGISTER:
825@@ -1535,9 +1574,11 @@ int br_vlan_bridge_event(struct net_device *dev, unsigned long event, void *ptr)
826 BRIDGE_VLAN_INFO_PVID |
827 BRIDGE_VLAN_INFO_UNTAGGED |
828 BRIDGE_VLAN_INFO_BRENTRY, &changed, NULL);
829+ vlcmd = RTM_NEWVLAN;
830 break;
831 case NETDEV_UNREGISTER:
832- br_vlan_delete(br, br->default_pvid);
833+ changed = !br_vlan_delete(br, br->default_pvid);
834+ vlcmd = RTM_DELVLAN;
835 break;
836 case NETDEV_CHANGEUPPER:
837 info = ptr;
838@@ -1551,6 +1592,8 @@ int br_vlan_bridge_event(struct net_device *dev, unsigned long event, void *ptr)
839 br_vlan_link_state_change(dev, br);
840 break;
841 }
842+ if (changed)
843+ br_vlan_notify(br, NULL, br->default_pvid, 0, vlcmd);
844
845 return ret;
846 }
847@@ -1569,3 +1612,608 @@ void br_vlan_port_event(struct net_bridge_port *p, unsigned long event)
848 break;
849 }
850 }
851+
852+static bool br_vlan_stats_fill(struct sk_buff *skb,
853+ const struct net_bridge_vlan *v)
854+{
855+ struct pcpu_sw_netstats stats;
856+ struct nlattr *nest;
857+
858+ nest = nla_nest_start(skb, BRIDGE_VLANDB_ENTRY_STATS);
859+ if (!nest)
860+ return false;
861+
862+ br_vlan_get_stats(v, &stats);
863+ if (nla_put_u64_64bit(skb, BRIDGE_VLANDB_STATS_RX_BYTES, stats.rx_bytes,
864+ BRIDGE_VLANDB_STATS_PAD) ||
865+ nla_put_u64_64bit(skb, BRIDGE_VLANDB_STATS_RX_PACKETS,
866+ stats.rx_packets, BRIDGE_VLANDB_STATS_PAD) ||
867+ nla_put_u64_64bit(skb, BRIDGE_VLANDB_STATS_TX_BYTES, stats.tx_bytes,
868+ BRIDGE_VLANDB_STATS_PAD) ||
869+ nla_put_u64_64bit(skb, BRIDGE_VLANDB_STATS_TX_PACKETS,
870+ stats.tx_packets, BRIDGE_VLANDB_STATS_PAD))
871+ goto out_err;
872+
873+ nla_nest_end(skb, nest);
874+
875+ return true;
876+
877+out_err:
878+ nla_nest_cancel(skb, nest);
879+ return false;
880+}
881+
882+/* v_opts is used to dump the options which must be equal in the whole range */
883+static bool br_vlan_fill_vids(struct sk_buff *skb, u16 vid, u16 vid_range,
884+ const struct net_bridge_vlan *v_opts,
885+ u16 flags,
886+ bool dump_stats)
887+{
888+ struct bridge_vlan_info info;
889+ struct nlattr *nest;
890+
891+ nest = nla_nest_start(skb, BRIDGE_VLANDB_ENTRY);
892+ if (!nest)
893+ return false;
894+
895+ memset(&info, 0, sizeof(info));
896+ info.vid = vid;
897+ if (flags & BRIDGE_VLAN_INFO_UNTAGGED)
898+ info.flags |= BRIDGE_VLAN_INFO_UNTAGGED;
899+ if (flags & BRIDGE_VLAN_INFO_PVID)
900+ info.flags |= BRIDGE_VLAN_INFO_PVID;
901+
902+ if (nla_put(skb, BRIDGE_VLANDB_ENTRY_INFO, sizeof(info), &info))
903+ goto out_err;
904+
905+ if (vid_range && vid < vid_range &&
906+ !(flags & BRIDGE_VLAN_INFO_PVID) &&
907+ nla_put_u16(skb, BRIDGE_VLANDB_ENTRY_RANGE, vid_range))
908+ goto out_err;
909+
910+ if (v_opts) {
911+ if (!br_vlan_opts_fill(skb, v_opts))
912+ goto out_err;
913+
914+ if (dump_stats && !br_vlan_stats_fill(skb, v_opts))
915+ goto out_err;
916+ }
917+
918+ nla_nest_end(skb, nest);
919+
920+ return true;
921+
922+out_err:
923+ nla_nest_cancel(skb, nest);
924+ return false;
925+}
926+
927+static size_t rtnl_vlan_nlmsg_size(void)
928+{
929+ return NLMSG_ALIGN(sizeof(struct br_vlan_msg))
930+ + nla_total_size(0) /* BRIDGE_VLANDB_ENTRY */
931+ + nla_total_size(sizeof(u16)) /* BRIDGE_VLANDB_ENTRY_RANGE */
932+ + nla_total_size(sizeof(struct bridge_vlan_info)) /* BRIDGE_VLANDB_ENTRY_INFO */
933+ + br_vlan_opts_nl_size(); /* bridge vlan options */
934+}
935+
936+void br_vlan_notify(const struct net_bridge *br,
937+ const struct net_bridge_port *p,
938+ u16 vid, u16 vid_range,
939+ int cmd)
940+{
941+ struct net_bridge_vlan_group *vg;
942+ struct net_bridge_vlan *v = NULL;
943+ struct br_vlan_msg *bvm;
944+ struct nlmsghdr *nlh;
945+ struct sk_buff *skb;
946+ int err = -ENOBUFS;
947+ struct net *net;
948+ u16 flags = 0;
949+ int ifindex;
950+
951+ /* right now notifications are done only with rtnl held */
952+ ASSERT_RTNL();
953+
954+ if (p) {
955+ ifindex = p->dev->ifindex;
956+ vg = nbp_vlan_group(p);
957+ net = dev_net(p->dev);
958+ } else {
959+ ifindex = br->dev->ifindex;
960+ vg = br_vlan_group(br);
961+ net = dev_net(br->dev);
962+ }
963+
964+ skb = nlmsg_new(rtnl_vlan_nlmsg_size(), GFP_KERNEL);
965+ if (!skb)
966+ goto out_err;
967+
968+ err = -EMSGSIZE;
969+ nlh = nlmsg_put(skb, 0, 0, cmd, sizeof(*bvm), 0);
970+ if (!nlh)
971+ goto out_err;
972+ bvm = nlmsg_data(nlh);
973+ memset(bvm, 0, sizeof(*bvm));
974+ bvm->family = AF_BRIDGE;
975+ bvm->ifindex = ifindex;
976+
977+ switch (cmd) {
978+ case RTM_NEWVLAN:
979+ /* need to find the vlan due to flags/options */
980+ v = br_vlan_find(vg, vid);
981+ if (!v || !br_vlan_should_use(v))
982+ goto out_kfree;
983+
984+ flags = v->flags;
985+ if (br_get_pvid(vg) == v->vid)
986+ flags |= BRIDGE_VLAN_INFO_PVID;
987+ break;
988+ case RTM_DELVLAN:
989+ break;
990+ default:
991+ goto out_kfree;
992+ }
993+
994+ if (!br_vlan_fill_vids(skb, vid, vid_range, v, flags, false))
995+ goto out_err;
996+
997+ nlmsg_end(skb, nlh);
998+ rtnl_notify(skb, net, 0, RTNLGRP_BRVLAN, NULL, GFP_KERNEL);
999+ return;
1000+
1001+out_err:
1002+ rtnl_set_sk_err(net, RTNLGRP_BRVLAN, err);
1003+out_kfree:
1004+ kfree_skb(skb);
1005+}
1006+
1007+static int br_vlan_replay_one(struct notifier_block *nb,
1008+ struct net_device *dev,
1009+ struct switchdev_obj_port_vlan *vlan,
1010+ const void *ctx, unsigned long action,
1011+ struct netlink_ext_ack *extack)
1012+{
1013+ struct switchdev_notifier_port_obj_info obj_info = {
1014+ .info = {
1015+ .dev = dev,
1016+ .extack = extack,
1017+ .ctx = ctx,
1018+ },
1019+ .obj = &vlan->obj,
1020+ };
1021+ int err;
1022+
1023+ err = nb->notifier_call(nb, action, &obj_info);
1024+ return notifier_to_errno(err);
1025+}
1026+
1027+int br_vlan_replay(struct net_device *br_dev, struct net_device *dev,
1028+ const void *ctx, bool adding, struct notifier_block *nb,
1029+ struct netlink_ext_ack *extack)
1030+{
1031+ struct net_bridge_vlan_group *vg;
1032+ struct net_bridge_vlan *v;
1033+ struct net_bridge_port *p;
1034+ struct net_bridge *br;
1035+ unsigned long action;
1036+ int err = 0;
1037+ u16 pvid;
1038+
1039+ ASSERT_RTNL();
1040+
1041+ if (!nb)
1042+ return 0;
1043+
1044+ if (!netif_is_bridge_master(br_dev))
1045+ return -EINVAL;
1046+
1047+ if (!netif_is_bridge_master(dev) && !netif_is_bridge_port(dev))
1048+ return -EINVAL;
1049+
1050+ if (netif_is_bridge_master(dev)) {
1051+ br = netdev_priv(dev);
1052+ vg = br_vlan_group(br);
1053+ p = NULL;
1054+ } else {
1055+ p = br_port_get_rtnl(dev);
1056+ if (WARN_ON(!p))
1057+ return -EINVAL;
1058+ vg = nbp_vlan_group(p);
1059+ br = p->br;
1060+ }
1061+
1062+ if (!vg)
1063+ return 0;
1064+
1065+ if (adding)
1066+ action = SWITCHDEV_PORT_OBJ_ADD;
1067+ else
1068+ action = SWITCHDEV_PORT_OBJ_DEL;
1069+
1070+ pvid = br_get_pvid(vg);
1071+
1072+ list_for_each_entry(v, &vg->vlan_list, vlist) {
1073+ struct switchdev_obj_port_vlan vlan = {
1074+ .obj.orig_dev = dev,
1075+ .obj.id = SWITCHDEV_OBJ_ID_PORT_VLAN,
1076+ .flags = br_vlan_flags(v, pvid),
1077+ .vid = v->vid,
1078+ };
1079+
1080+ if (!br_vlan_should_use(v))
1081+ continue;
1082+
1083+ err = br_vlan_replay_one(nb, dev, &vlan, ctx, action, extack);
1084+ if (err)
1085+ return err;
1086+ }
1087+
1088+ return err;
1089+}
1090+
1091+/* check if v_curr can enter a range ending in range_end */
1092+bool br_vlan_can_enter_range(struct net_bridge_vlan *v_curr,
1093+ struct net_bridge_vlan *range_end)
1094+{
1095+ return v_curr->vid - range_end->vid == 1 &&
1096+ range_end->flags == v_curr->flags &&
1097+ br_vlan_opts_eq_range(v_curr, range_end);
1098+}
1099+
1100+static int br_vlan_dump_dev(const struct net_device *dev,
1101+ struct sk_buff *skb,
1102+ struct netlink_callback *cb,
1103+ u32 dump_flags)
1104+{
1105+ struct net_bridge_vlan *v, *range_start = NULL, *range_end = NULL;
1106+ bool dump_global = !!(dump_flags & BRIDGE_VLANDB_DUMPF_GLOBAL);
1107+ bool dump_stats = !!(dump_flags & BRIDGE_VLANDB_DUMPF_STATS);
1108+ struct net_bridge_vlan_group *vg;
1109+ int idx = 0, s_idx = cb->args[1];
1110+ struct nlmsghdr *nlh = NULL;
1111+ struct net_bridge_port *p;
1112+ struct br_vlan_msg *bvm;
1113+ struct net_bridge *br;
1114+ int err = 0;
1115+ u16 pvid;
1116+
1117+ if (!netif_is_bridge_master(dev) && !netif_is_bridge_port(dev))
1118+ return -EINVAL;
1119+
1120+ if (netif_is_bridge_master(dev)) {
1121+ br = netdev_priv(dev);
1122+ vg = br_vlan_group_rcu(br);
1123+ p = NULL;
1124+ } else {
1125+ /* global options are dumped only for bridge devices */
1126+ if (dump_global)
1127+ return 0;
1128+
1129+ p = br_port_get_rcu(dev);
1130+ if (WARN_ON(!p))
1131+ return -EINVAL;
1132+ vg = nbp_vlan_group_rcu(p);
1133+ br = p->br;
1134+ }
1135+
1136+ if (!vg)
1137+ return 0;
1138+
1139+ nlh = nlmsg_put(skb, NETLINK_CB(cb->skb).portid, cb->nlh->nlmsg_seq,
1140+ RTM_NEWVLAN, sizeof(*bvm), NLM_F_MULTI);
1141+ if (!nlh)
1142+ return -EMSGSIZE;
1143+ bvm = nlmsg_data(nlh);
1144+ memset(bvm, 0, sizeof(*bvm));
1145+ bvm->family = PF_BRIDGE;
1146+ bvm->ifindex = dev->ifindex;
1147+ pvid = br_get_pvid(vg);
1148+
1149+ /* idx must stay at range's beginning until it is filled in */
1150+ list_for_each_entry_rcu(v, &vg->vlan_list, vlist) {
1151+ if (!dump_global && !br_vlan_should_use(v))
1152+ continue;
1153+ if (idx < s_idx) {
1154+ idx++;
1155+ continue;
1156+ }
1157+
1158+ if (!range_start) {
1159+ range_start = v;
1160+ range_end = v;
1161+ continue;
1162+ }
1163+
1164+ if (dump_global) {
1165+ if (br_vlan_global_opts_can_enter_range(v, range_end))
1166+ goto update_end;
1167+ if (!br_vlan_global_opts_fill(skb, range_start->vid,
1168+ range_end->vid,
1169+ range_start)) {
1170+ err = -EMSGSIZE;
1171+ break;
1172+ }
1173+ /* advance number of filled vlans */
1174+ idx += range_end->vid - range_start->vid + 1;
1175+
1176+ range_start = v;
1177+ } else if (dump_stats || v->vid == pvid ||
1178+ !br_vlan_can_enter_range(v, range_end)) {
1179+ u16 vlan_flags = br_vlan_flags(range_start, pvid);
1180+
1181+ if (!br_vlan_fill_vids(skb, range_start->vid,
1182+ range_end->vid, range_start,
1183+ vlan_flags, dump_stats)) {
1184+ err = -EMSGSIZE;
1185+ break;
1186+ }
1187+ /* advance number of filled vlans */
1188+ idx += range_end->vid - range_start->vid + 1;
1189+
1190+ range_start = v;
1191+ }
1192+update_end:
1193+ range_end = v;
1194+ }
1195+
1196+ /* err will be 0 and range_start will be set in 3 cases here:
1197+ * - first vlan (range_start == range_end)
1198+ * - last vlan (range_start == range_end, not in range)
1199+ * - last vlan range (range_start != range_end, in range)
1200+ */
1201+ if (!err && range_start) {
1202+ if (dump_global &&
1203+ !br_vlan_global_opts_fill(skb, range_start->vid,
1204+ range_end->vid, range_start))
1205+ err = -EMSGSIZE;
1206+ else if (!dump_global &&
1207+ !br_vlan_fill_vids(skb, range_start->vid,
1208+ range_end->vid, range_start,
1209+ br_vlan_flags(range_start, pvid),
1210+ dump_stats))
1211+ err = -EMSGSIZE;
1212+ }
1213+
1214+ cb->args[1] = err ? idx : 0;
1215+
1216+ nlmsg_end(skb, nlh);
1217+
1218+ return err;
1219+}
1220+
1221+static const struct nla_policy br_vlan_db_dump_pol[BRIDGE_VLANDB_DUMP_MAX + 1] = {
1222+ [BRIDGE_VLANDB_DUMP_FLAGS] = { .type = NLA_U32 },
1223+};
1224+
1225+static int br_vlan_rtm_dump(struct sk_buff *skb, struct netlink_callback *cb)
1226+{
1227+ struct nlattr *dtb[BRIDGE_VLANDB_DUMP_MAX + 1];
1228+ int idx = 0, err = 0, s_idx = cb->args[0];
1229+ struct net *net = sock_net(skb->sk);
1230+ struct br_vlan_msg *bvm;
1231+ struct net_device *dev;
1232+ u32 dump_flags = 0;
1233+
1234+ err = nlmsg_parse(cb->nlh, sizeof(*bvm), dtb, BRIDGE_VLANDB_DUMP_MAX,
1235+ br_vlan_db_dump_pol, cb->extack);
1236+ if (err < 0)
1237+ return err;
1238+
1239+ bvm = nlmsg_data(cb->nlh);
1240+ if (dtb[BRIDGE_VLANDB_DUMP_FLAGS])
1241+ dump_flags = nla_get_u32(dtb[BRIDGE_VLANDB_DUMP_FLAGS]);
1242+
1243+ rcu_read_lock();
1244+ if (bvm->ifindex) {
1245+ dev = dev_get_by_index_rcu(net, bvm->ifindex);
1246+ if (!dev) {
1247+ err = -ENODEV;
1248+ goto out_err;
1249+ }
1250+ err = br_vlan_dump_dev(dev, skb, cb, dump_flags);
1251+ /* if the dump completed without an error we return 0 here */
1252+ if (err != -EMSGSIZE)
1253+ goto out_err;
1254+ } else {
1255+ for_each_netdev_rcu(net, dev) {
1256+ if (idx < s_idx)
1257+ goto skip;
1258+
1259+ err = br_vlan_dump_dev(dev, skb, cb, dump_flags);
1260+ if (err == -EMSGSIZE)
1261+ break;
1262+skip:
1263+ idx++;
1264+ }
1265+ }
1266+ cb->args[0] = idx;
1267+ rcu_read_unlock();
1268+
1269+ return skb->len;
1270+
1271+out_err:
1272+ rcu_read_unlock();
1273+
1274+ return err;
1275+}
1276+
1277+static const struct nla_policy br_vlan_db_policy[BRIDGE_VLANDB_ENTRY_MAX + 1] = {
1278+ [BRIDGE_VLANDB_ENTRY_INFO] =
1279+ NLA_POLICY_EXACT_LEN(sizeof(struct bridge_vlan_info)),
1280+ [BRIDGE_VLANDB_ENTRY_RANGE] = { .type = NLA_U16 },
1281+ [BRIDGE_VLANDB_ENTRY_STATE] = { .type = NLA_U8 },
1282+ [BRIDGE_VLANDB_ENTRY_TUNNEL_INFO] = { .type = NLA_NESTED },
1283+ [BRIDGE_VLANDB_ENTRY_MCAST_ROUTER] = { .type = NLA_U8 },
1284+};
1285+
1286+static int br_vlan_rtm_process_one(struct net_device *dev,
1287+ const struct nlattr *attr,
1288+ int cmd, struct netlink_ext_ack *extack)
1289+{
1290+ struct bridge_vlan_info *vinfo, vrange_end, *vinfo_last = NULL;
1291+ struct nlattr *tb[BRIDGE_VLANDB_ENTRY_MAX + 1];
1292+ bool changed = false, skip_processing = false;
1293+ struct net_bridge_vlan_group *vg;
1294+ struct net_bridge_port *p = NULL;
1295+ int err = 0, cmdmap = 0;
1296+ struct net_bridge *br;
1297+
1298+ if (netif_is_bridge_master(dev)) {
1299+ br = netdev_priv(dev);
1300+ vg = br_vlan_group(br);
1301+ } else {
1302+ p = br_port_get_rtnl(dev);
1303+ if (WARN_ON(!p))
1304+ return -ENODEV;
1305+ br = p->br;
1306+ vg = nbp_vlan_group(p);
1307+ }
1308+
1309+ if (WARN_ON(!vg))
1310+ return -ENODEV;
1311+
1312+ err = nla_parse_nested(tb, BRIDGE_VLANDB_ENTRY_MAX, attr,
1313+ br_vlan_db_policy, extack);
1314+ if (err)
1315+ return err;
1316+
1317+ if (!tb[BRIDGE_VLANDB_ENTRY_INFO]) {
1318+ NL_SET_ERR_MSG_MOD(extack, "Missing vlan entry info");
1319+ return -EINVAL;
1320+ }
1321+ memset(&vrange_end, 0, sizeof(vrange_end));
1322+
1323+ vinfo = nla_data(tb[BRIDGE_VLANDB_ENTRY_INFO]);
1324+ if (vinfo->flags & (BRIDGE_VLAN_INFO_RANGE_BEGIN |
1325+ BRIDGE_VLAN_INFO_RANGE_END)) {
1326+ NL_SET_ERR_MSG_MOD(extack, "Old-style vlan ranges are not allowed when using RTM vlan calls");
1327+ return -EINVAL;
1328+ }
1329+ if (!br_vlan_valid_id(vinfo->vid, extack))
1330+ return -EINVAL;
1331+
1332+ if (tb[BRIDGE_VLANDB_ENTRY_RANGE]) {
1333+ vrange_end.vid = nla_get_u16(tb[BRIDGE_VLANDB_ENTRY_RANGE]);
1334+ /* validate user-provided flags without RANGE_BEGIN */
1335+ vrange_end.flags = BRIDGE_VLAN_INFO_RANGE_END | vinfo->flags;
1336+ vinfo->flags |= BRIDGE_VLAN_INFO_RANGE_BEGIN;
1337+
1338+ /* vinfo_last is the range start, vinfo the range end */
1339+ vinfo_last = vinfo;
1340+ vinfo = &vrange_end;
1341+
1342+ if (!br_vlan_valid_id(vinfo->vid, extack) ||
1343+ !br_vlan_valid_range(vinfo, vinfo_last, extack))
1344+ return -EINVAL;
1345+ }
1346+
1347+ switch (cmd) {
1348+ case RTM_NEWVLAN:
1349+ cmdmap = RTM_SETLINK;
1350+ skip_processing = !!(vinfo->flags & BRIDGE_VLAN_INFO_ONLY_OPTS);
1351+ break;
1352+ case RTM_DELVLAN:
1353+ cmdmap = RTM_DELLINK;
1354+ break;
1355+ }
1356+
1357+ if (!skip_processing) {
1358+ struct bridge_vlan_info *tmp_last = vinfo_last;
1359+
1360+ /* br_process_vlan_info may overwrite vinfo_last */
1361+ err = br_process_vlan_info(br, p, cmdmap, vinfo, &tmp_last,
1362+ &changed, extack);
1363+
1364+ /* notify first if anything changed */
1365+ if (changed)
1366+ br_ifinfo_notify(cmdmap, br, p);
1367+
1368+ if (err)
1369+ return err;
1370+ }
1371+
1372+ /* deal with options */
1373+ if (cmd == RTM_NEWVLAN) {
1374+ struct net_bridge_vlan *range_start, *range_end;
1375+
1376+ if (vinfo_last) {
1377+ range_start = br_vlan_find(vg, vinfo_last->vid);
1378+ range_end = br_vlan_find(vg, vinfo->vid);
1379+ } else {
1380+ range_start = br_vlan_find(vg, vinfo->vid);
1381+ range_end = range_start;
1382+ }
1383+
1384+ err = br_vlan_process_options(br, p, range_start, range_end,
1385+ tb, extack);
1386+ }
1387+
1388+ return err;
1389+}
1390+
1391+static int br_vlan_rtm_process(struct sk_buff *skb, struct nlmsghdr *nlh,
1392+ struct netlink_ext_ack *extack)
1393+{
1394+ struct net *net = sock_net(skb->sk);
1395+ struct br_vlan_msg *bvm;
1396+ struct net_device *dev;
1397+ struct nlattr *attr;
1398+ int err, vlans = 0;
1399+ int rem;
1400+
1401+ /* this should validate the header and check for remaining bytes */
1402+ err = nlmsg_parse(nlh, sizeof(*bvm), NULL, BRIDGE_VLANDB_MAX, NULL,
1403+ extack);
1404+ if (err < 0)
1405+ return err;
1406+
1407+ bvm = nlmsg_data(nlh);
1408+ dev = __dev_get_by_index(net, bvm->ifindex);
1409+ if (!dev)
1410+ return -ENODEV;
1411+
1412+ if (!netif_is_bridge_master(dev) && !netif_is_bridge_port(dev)) {
1413+ NL_SET_ERR_MSG_MOD(extack, "The device is not a valid bridge or bridge port");
1414+ return -EINVAL;
1415+ }
1416+
1417+ nlmsg_for_each_attr(attr, nlh, sizeof(*bvm), rem) {
1418+ switch (nla_type(attr)) {
1419+ case BRIDGE_VLANDB_ENTRY:
1420+ err = br_vlan_rtm_process_one(dev, attr,
1421+ nlh->nlmsg_type,
1422+ extack);
1423+ break;
1424+ default:
1425+ continue;
1426+ }
1427+
1428+ vlans++;
1429+ if (err)
1430+ break;
1431+ }
1432+ if (!vlans) {
1433+ NL_SET_ERR_MSG_MOD(extack, "No vlans found to process");
1434+ err = -EINVAL;
1435+ }
1436+
1437+ return err;
1438+}
1439+
1440+void br_vlan_rtnl_init(void)
1441+{
1442+ rtnl_register_module(THIS_MODULE, PF_BRIDGE, RTM_GETVLAN, NULL,
1443+ br_vlan_rtm_dump, 0);
1444+ rtnl_register_module(THIS_MODULE, PF_BRIDGE, RTM_NEWVLAN,
1445+ br_vlan_rtm_process, NULL, 0);
1446+ rtnl_register_module(THIS_MODULE, PF_BRIDGE, RTM_DELVLAN,
1447+ br_vlan_rtm_process, NULL, 0);
1448+}
1449+
1450+void br_vlan_rtnl_uninit(void)
1451+{
1452+ rtnl_unregister(PF_BRIDGE, RTM_GETVLAN);
1453+ rtnl_unregister(PF_BRIDGE, RTM_NEWVLAN);
1454+ rtnl_unregister(PF_BRIDGE, RTM_DELVLAN);
1455+}
1456diff --git a/net/bridge/br_vlan_options.c b/net/bridge/br_vlan_options.c
1457new file mode 100644
1458index 0000000..5e48c29
1459--- /dev/null
1460+++ b/net/bridge/br_vlan_options.c
1461@@ -0,0 +1,346 @@
1462+// SPDX-License-Identifier: GPL-2.0-only
1463+// Copyright (c) 2020, Nikolay Aleksandrov <nikolay@cumulusnetworks.com>
1464+#include <linux/kernel.h>
1465+#include <linux/netdevice.h>
1466+#include <linux/rtnetlink.h>
1467+#include <linux/slab.h>
1468+#include <net/ip_tunnels.h>
1469+
1470+#include "br_private.h"
1471+#include "br_private_tunnel.h"
1472+
1473+static bool __vlan_tun_put(struct sk_buff *skb, const struct net_bridge_vlan *v)
1474+{
1475+ __be32 tid = tunnel_id_to_key32(v->tinfo.tunnel_id);
1476+ struct nlattr *nest;
1477+
1478+ if (!v->tinfo.tunnel_dst)
1479+ return true;
1480+
1481+ nest = nla_nest_start(skb, BRIDGE_VLANDB_ENTRY_TUNNEL_INFO);
1482+ if (!nest)
1483+ return false;
1484+ if (nla_put_u32(skb, BRIDGE_VLANDB_TINFO_ID, be32_to_cpu(tid))) {
1485+ nla_nest_cancel(skb, nest);
1486+ return false;
1487+ }
1488+ nla_nest_end(skb, nest);
1489+
1490+ return true;
1491+}
1492+
1493+static bool __vlan_tun_can_enter_range(struct net_bridge_vlan *v_curr,
1494+ struct net_bridge_vlan *range_end)
1495+{
1496+ return (!v_curr->tinfo.tunnel_dst && !range_end->tinfo.tunnel_dst) ||
1497+ vlan_tunid_inrange(v_curr, range_end);
1498+}
1499+
1500+/* check if the options' state of v_curr allow it to enter the range */
1501+bool br_vlan_opts_eq_range(struct net_bridge_vlan *v_curr,
1502+ struct net_bridge_vlan *range_end)
1503+{
1504+ u8 range_mc_rtr = br_vlan_multicast_router(range_end);
1505+ u8 curr_mc_rtr = br_vlan_multicast_router(v_curr);
1506+
1507+ return v_curr->state == range_end->state &&
1508+ __vlan_tun_can_enter_range(v_curr, range_end) &&
1509+ curr_mc_rtr == range_mc_rtr;
1510+}
1511+
1512+bool br_vlan_opts_fill(struct sk_buff *skb, const struct net_bridge_vlan *v)
1513+{
1514+ if (nla_put_u8(skb, BRIDGE_VLANDB_ENTRY_STATE, br_vlan_get_state(v)) ||
1515+ !__vlan_tun_put(skb, v))
1516+ return false;
1517+
1518+#ifdef CONFIG_BRIDGE_IGMP_SNOOPING
1519+ if (nla_put_u8(skb, BRIDGE_VLANDB_ENTRY_MCAST_ROUTER,
1520+ br_vlan_multicast_router(v)))
1521+ return false;
1522+#endif
1523+
1524+ return true;
1525+}
1526+
1527+size_t br_vlan_opts_nl_size(void)
1528+{
1529+ return nla_total_size(sizeof(u8)) /* BRIDGE_VLANDB_ENTRY_STATE */
1530+ + nla_total_size(0) /* BRIDGE_VLANDB_ENTRY_TUNNEL_INFO */
1531+ + nla_total_size(sizeof(u32)) /* BRIDGE_VLANDB_TINFO_ID */
1532+#ifdef CONFIG_BRIDGE_IGMP_SNOOPING
1533+ + nla_total_size(sizeof(u8)) /* BRIDGE_VLANDB_ENTRY_MCAST_ROUTER */
1534+#endif
1535+ + 0;
1536+}
1537+
1538+static int br_vlan_modify_state(struct net_bridge_vlan_group *vg,
1539+ struct net_bridge_vlan *v,
1540+ u8 state,
1541+ bool *changed,
1542+ struct netlink_ext_ack *extack)
1543+{
1544+ struct net_bridge *br;
1545+
1546+ ASSERT_RTNL();
1547+
1548+ if (state > BR_STATE_BLOCKING) {
1549+ NL_SET_ERR_MSG_MOD(extack, "Invalid vlan state");
1550+ return -EINVAL;
1551+ }
1552+
1553+ if (br_vlan_is_brentry(v))
1554+ br = v->br;
1555+ else
1556+ br = v->port->br;
1557+
1558+ if (br->stp_enabled == BR_KERNEL_STP) {
1559+ NL_SET_ERR_MSG_MOD(extack, "Can't modify vlan state when using kernel STP");
1560+ return -EBUSY;
1561+ }
1562+
1563+ if (v->state == state)
1564+ return 0;
1565+
1566+ if (v->vid == br_get_pvid(vg))
1567+ br_vlan_set_pvid_state(vg, state);
1568+
1569+ br_vlan_set_state(v, state);
1570+ *changed = true;
1571+
1572+ return 0;
1573+}
1574+
1575+static const struct nla_policy br_vlandb_tinfo_pol[BRIDGE_VLANDB_TINFO_MAX + 1] = {
1576+ [BRIDGE_VLANDB_TINFO_ID] = { .type = NLA_U32 },
1577+ [BRIDGE_VLANDB_TINFO_CMD] = { .type = NLA_U32 },
1578+};
1579+
1580+static int br_vlan_modify_tunnel(struct net_bridge_port *p,
1581+ struct net_bridge_vlan *v,
1582+ struct nlattr **tb,
1583+ bool *changed,
1584+ struct netlink_ext_ack *extack)
1585+{
1586+ struct nlattr *tun_tb[BRIDGE_VLANDB_TINFO_MAX + 1], *attr;
1587+ struct bridge_vlan_info *vinfo;
1588+ u32 tun_id = 0;
1589+ int cmd, err;
1590+
1591+ if (!p) {
1592+ NL_SET_ERR_MSG_MOD(extack, "Can't modify tunnel mapping of non-port vlans");
1593+ return -EINVAL;
1594+ }
1595+ if (!(p->flags & BR_VLAN_TUNNEL)) {
1596+ NL_SET_ERR_MSG_MOD(extack, "Port doesn't have tunnel flag set");
1597+ return -EINVAL;
1598+ }
1599+
1600+ attr = tb[BRIDGE_VLANDB_ENTRY_TUNNEL_INFO];
1601+ err = nla_parse_nested(tun_tb, BRIDGE_VLANDB_TINFO_MAX, attr,
1602+ br_vlandb_tinfo_pol, extack);
1603+ if (err)
1604+ return err;
1605+
1606+ if (!tun_tb[BRIDGE_VLANDB_TINFO_CMD]) {
1607+ NL_SET_ERR_MSG_MOD(extack, "Missing tunnel command attribute");
1608+ return -ENOENT;
1609+ }
1610+ cmd = nla_get_u32(tun_tb[BRIDGE_VLANDB_TINFO_CMD]);
1611+ switch (cmd) {
1612+ case RTM_SETLINK:
1613+ if (!tun_tb[BRIDGE_VLANDB_TINFO_ID]) {
1614+ NL_SET_ERR_MSG_MOD(extack, "Missing tunnel id attribute");
1615+ return -ENOENT;
1616+ }
1617+ /* when working on vlan ranges this is the starting tunnel id */
1618+ tun_id = nla_get_u32(tun_tb[BRIDGE_VLANDB_TINFO_ID]);
1619+ /* vlan info attr is guaranteed by br_vlan_rtm_process_one */
1620+ vinfo = nla_data(tb[BRIDGE_VLANDB_ENTRY_INFO]);
1621+ /* tunnel ids are mapped to each vlan in increasing order,
1622+ * the starting vlan is in BRIDGE_VLANDB_ENTRY_INFO and v is the
1623+ * current vlan, so we compute: tun_id + v - vinfo->vid
1624+ */
1625+ tun_id += v->vid - vinfo->vid;
1626+ break;
1627+ case RTM_DELLINK:
1628+ break;
1629+ default:
1630+ NL_SET_ERR_MSG_MOD(extack, "Unsupported tunnel command");
1631+ return -EINVAL;
1632+ }
1633+
1634+ return br_vlan_tunnel_info(p, cmd, v->vid, tun_id, changed);
1635+}
1636+
1637+static int br_vlan_process_one_opts(const struct net_bridge *br,
1638+ struct net_bridge_port *p,
1639+ struct net_bridge_vlan_group *vg,
1640+ struct net_bridge_vlan *v,
1641+ struct nlattr **tb,
1642+ bool *changed,
1643+ struct netlink_ext_ack *extack)
1644+{
1645+ int err;
1646+
1647+ *changed = false;
1648+ if (tb[BRIDGE_VLANDB_ENTRY_STATE]) {
1649+ u8 state = nla_get_u8(tb[BRIDGE_VLANDB_ENTRY_STATE]);
1650+
1651+ err = br_vlan_modify_state(vg, v, state, changed, extack);
1652+ if (err)
1653+ return err;
1654+ }
1655+ if (tb[BRIDGE_VLANDB_ENTRY_TUNNEL_INFO]) {
1656+ err = br_vlan_modify_tunnel(p, v, tb, changed, extack);
1657+ if (err)
1658+ return err;
1659+ }
1660+
1661+ return 0;
1662+}
1663+
1664+int br_vlan_process_options(const struct net_bridge *br,
1665+ struct net_bridge_port *p,
1666+ struct net_bridge_vlan *range_start,
1667+ struct net_bridge_vlan *range_end,
1668+ struct nlattr **tb,
1669+ struct netlink_ext_ack *extack)
1670+{
1671+ struct net_bridge_vlan *v, *curr_start = NULL, *curr_end = NULL;
1672+ struct net_bridge_vlan_group *vg;
1673+ int vid, err = 0;
1674+ u16 pvid;
1675+
1676+ if (p)
1677+ vg = nbp_vlan_group(p);
1678+ else
1679+ vg = br_vlan_group(br);
1680+
1681+ if (!range_start || !br_vlan_should_use(range_start)) {
1682+ NL_SET_ERR_MSG_MOD(extack, "Vlan range start doesn't exist, can't process options");
1683+ return -ENOENT;
1684+ }
1685+ if (!range_end || !br_vlan_should_use(range_end)) {
1686+ NL_SET_ERR_MSG_MOD(extack, "Vlan range end doesn't exist, can't process options");
1687+ return -ENOENT;
1688+ }
1689+
1690+ pvid = br_get_pvid(vg);
1691+ for (vid = range_start->vid; vid <= range_end->vid; vid++) {
1692+ bool changed = false;
1693+
1694+ v = br_vlan_find(vg, vid);
1695+ if (!v || !br_vlan_should_use(v)) {
1696+ NL_SET_ERR_MSG_MOD(extack, "Vlan in range doesn't exist, can't process options");
1697+ err = -ENOENT;
1698+ break;
1699+ }
1700+
1701+ err = br_vlan_process_one_opts(br, p, vg, v, tb, &changed,
1702+ extack);
1703+ if (err)
1704+ break;
1705+
1706+ if (changed) {
1707+ /* vlan options changed, check for range */
1708+ if (!curr_start) {
1709+ curr_start = v;
1710+ curr_end = v;
1711+ continue;
1712+ }
1713+
1714+ if (v->vid == pvid ||
1715+ !br_vlan_can_enter_range(v, curr_end)) {
1716+ br_vlan_notify(br, p, curr_start->vid,
1717+ curr_end->vid, RTM_NEWVLAN);
1718+ curr_start = v;
1719+ }
1720+ curr_end = v;
1721+ } else {
1722+ /* nothing changed and nothing to notify yet */
1723+ if (!curr_start)
1724+ continue;
1725+
1726+ br_vlan_notify(br, p, curr_start->vid, curr_end->vid,
1727+ RTM_NEWVLAN);
1728+ curr_start = NULL;
1729+ curr_end = NULL;
1730+ }
1731+ }
1732+ if (curr_start)
1733+ br_vlan_notify(br, p, curr_start->vid, curr_end->vid,
1734+ RTM_NEWVLAN);
1735+
1736+ return err;
1737+}
1738+
1739+bool br_vlan_global_opts_can_enter_range(const struct net_bridge_vlan *v_curr,
1740+ const struct net_bridge_vlan *r_end)
1741+{
1742+ return v_curr->vid - r_end->vid == 1 &&
1743+ ((v_curr->priv_flags ^ r_end->priv_flags) &
1744+ BR_VLFLAG_GLOBAL_MCAST_ENABLED) == 0 &&
1745+ br_multicast_ctx_options_equal(&v_curr->br_mcast_ctx,
1746+ &r_end->br_mcast_ctx);
1747+}
1748+
1749+bool br_vlan_global_opts_fill(struct sk_buff *skb, u16 vid, u16 vid_range,
1750+ const struct net_bridge_vlan *v_opts)
1751+{
1752+ struct nlattr *nest2 __maybe_unused;
1753+ u64 clockval __maybe_unused;
1754+ struct nlattr *nest;
1755+
1756+ nest = nla_nest_start(skb, BRIDGE_VLANDB_GLOBAL_OPTIONS);
1757+ if (!nest)
1758+ return false;
1759+
1760+ if (nla_put_u16(skb, BRIDGE_VLANDB_GOPTS_ID, vid))
1761+ goto out_err;
1762+
1763+ if (vid_range && vid < vid_range &&
1764+ nla_put_u16(skb, BRIDGE_VLANDB_GOPTS_RANGE, vid_range))
1765+ goto out_err;
1766+
1767+#ifdef CONFIG_BRIDGE_IGMP_SNOOPING
1768+ clockval = jiffies_to_clock_t(v_opts->br_mcast_ctx.multicast_last_member_interval);
1769+ if (nla_put_u64_64bit(skb, BRIDGE_VLANDB_GOPTS_MCAST_LAST_MEMBER_INTVL,
1770+ clockval, BRIDGE_VLANDB_GOPTS_PAD))
1771+ goto out_err;
1772+ clockval = jiffies_to_clock_t(v_opts->br_mcast_ctx.multicast_membership_interval);
1773+ if (nla_put_u64_64bit(skb, BRIDGE_VLANDB_GOPTS_MCAST_MEMBERSHIP_INTVL,
1774+ clockval, BRIDGE_VLANDB_GOPTS_PAD))
1775+ goto out_err;
1776+ clockval = jiffies_to_clock_t(v_opts->br_mcast_ctx.multicast_querier_interval);
1777+ if (nla_put_u64_64bit(skb, BRIDGE_VLANDB_GOPTS_MCAST_QUERIER_INTVL,
1778+ clockval, BRIDGE_VLANDB_GOPTS_PAD))
1779+ goto out_err;
1780+ clockval = jiffies_to_clock_t(v_opts->br_mcast_ctx.multicast_query_interval);
1781+ if (nla_put_u64_64bit(skb, BRIDGE_VLANDB_GOPTS_MCAST_QUERY_INTVL,
1782+ clockval, BRIDGE_VLANDB_GOPTS_PAD))
1783+ goto out_err;
1784+ clockval = jiffies_to_clock_t(v_opts->br_mcast_ctx.multicast_query_response_interval);
1785+ if (nla_put_u64_64bit(skb, BRIDGE_VLANDB_GOPTS_MCAST_QUERY_RESPONSE_INTVL,
1786+ clockval, BRIDGE_VLANDB_GOPTS_PAD))
1787+ goto out_err;
1788+ clockval = jiffies_to_clock_t(v_opts->br_mcast_ctx.multicast_startup_query_interval);
1789+ if (nla_put_u64_64bit(skb, BRIDGE_VLANDB_GOPTS_MCAST_STARTUP_QUERY_INTVL,
1790+ clockval, BRIDGE_VLANDB_GOPTS_PAD))
1791+ goto out_err;
1792+
1793+#if IS_ENABLED(CONFIG_IPV6)
1794+ if (nla_put_u8(skb, BRIDGE_VLANDB_GOPTS_MCAST_MLD_VERSION,
1795+ v_opts->br_mcast_ctx.multicast_mld_version))
1796+ goto out_err;
1797+#endif
1798+#endif
1799+
1800+ nla_nest_end(skb, nest);
1801+
1802+ return true;
1803+
1804+out_err:
1805+ nla_nest_cancel(skb, nest);
1806+ return false;
1807+}
1808diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
developer58aa0682023-09-18 14:02:26 +08001809index da1ef00..b896f71 100644
developerdd386532022-07-26 17:14:47 +08001810--- a/net/core/rtnetlink.c
1811+++ b/net/core/rtnetlink.c
developer58aa0682023-09-18 14:02:26 +08001812@@ -1998,6 +1998,7 @@ static int rtnl_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb)
developerdd386532022-07-26 17:14:47 +08001813 goto cont;
1814 if (idx < s_idx)
1815 goto cont;
1816+
1817 err = rtnl_fill_ifinfo(skb, dev, net,
1818 RTM_NEWLINK,
1819 NETLINK_CB(cb->skb).portid,
1820diff --git a/net/dsa/slave.c b/net/dsa/slave.c
1821index 2dfaa1e..a60a26c 100644
1822--- a/net/dsa/slave.c
1823+++ b/net/dsa/slave.c
1824@@ -1495,8 +1495,19 @@ int dsa_slave_create(struct dsa_port *port)
1825 goto out_phy;
1826 }
1827
1828+ rtnl_lock();
1829+
1830+ ret = netdev_upper_dev_link(master, slave_dev, NULL);
1831+
1832+ rtnl_unlock();
1833+
1834+ if (ret)
1835+ goto out_unregister;
1836+
1837 return 0;
1838
1839+out_unregister:
1840+ unregister_netdev(slave_dev);
1841 out_phy:
1842 rtnl_lock();
1843 phylink_disconnect_phy(p->dp->pl);
developer58aa0682023-09-18 14:02:26 +08001844--
18452.18.0
1846