summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--net/bridge/br_if.c2
-rw-r--r--net/bridge/br_netlink.c27
-rw-r--r--net/bridge/br_private.h22
-rw-r--r--net/bridge/br_switchdev.c3
-rw-r--r--net/bridge/br_vlan.c59
5 files changed, 65 insertions, 48 deletions
diff --git a/net/bridge/br_if.c b/net/bridge/br_if.c
index d4863f5679ac..3b945d6369c4 100644
--- a/net/bridge/br_if.c
+++ b/net/bridge/br_if.c
@@ -650,7 +650,7 @@ int br_add_if(struct net_bridge *br, struct net_device *dev,
650 if (br_fdb_insert(br, p, dev->dev_addr, 0)) 650 if (br_fdb_insert(br, p, dev->dev_addr, 0))
651 netdev_err(dev, "failed insert local address bridge forwarding table\n"); 651 netdev_err(dev, "failed insert local address bridge forwarding table\n");
652 652
653 err = nbp_vlan_init(p); 653 err = nbp_vlan_init(p, extack);
654 if (err) { 654 if (err) {
655 netdev_err(dev, "failed to initialize vlan filtering on this port\n"); 655 netdev_err(dev, "failed to initialize vlan filtering on this port\n");
656 goto err7; 656 goto err7;
diff --git a/net/bridge/br_netlink.c b/net/bridge/br_netlink.c
index f9be70b26091..935495b93a99 100644
--- a/net/bridge/br_netlink.c
+++ b/net/bridge/br_netlink.c
@@ -525,7 +525,8 @@ int br_getlink(struct sk_buff *skb, u32 pid, u32 seq,
525} 525}
526 526
527static int br_vlan_info(struct net_bridge *br, struct net_bridge_port *p, 527static int br_vlan_info(struct net_bridge *br, struct net_bridge_port *p,
528 int cmd, struct bridge_vlan_info *vinfo, bool *changed) 528 int cmd, struct bridge_vlan_info *vinfo, bool *changed,
529 struct netlink_ext_ack *extack)
529{ 530{
530 bool curr_change; 531 bool curr_change;
531 int err = 0; 532 int err = 0;
@@ -537,11 +538,11 @@ static int br_vlan_info(struct net_bridge *br, struct net_bridge_port *p,
537 * per-VLAN entry as well 538 * per-VLAN entry as well
538 */ 539 */
539 err = nbp_vlan_add(p, vinfo->vid, vinfo->flags, 540 err = nbp_vlan_add(p, vinfo->vid, vinfo->flags,
540 &curr_change); 541 &curr_change, extack);
541 } else { 542 } else {
542 vinfo->flags |= BRIDGE_VLAN_INFO_BRENTRY; 543 vinfo->flags |= BRIDGE_VLAN_INFO_BRENTRY;
543 err = br_vlan_add(br, vinfo->vid, vinfo->flags, 544 err = br_vlan_add(br, vinfo->vid, vinfo->flags,
544 &curr_change); 545 &curr_change, extack);
545 } 546 }
546 if (curr_change) 547 if (curr_change)
547 *changed = true; 548 *changed = true;
@@ -568,7 +569,8 @@ static int br_process_vlan_info(struct net_bridge *br,
568 struct net_bridge_port *p, int cmd, 569 struct net_bridge_port *p, int cmd,
569 struct bridge_vlan_info *vinfo_curr, 570 struct bridge_vlan_info *vinfo_curr,
570 struct bridge_vlan_info **vinfo_last, 571 struct bridge_vlan_info **vinfo_last,
571 bool *changed) 572 bool *changed,
573 struct netlink_ext_ack *extack)
572{ 574{
573 if (!vinfo_curr->vid || vinfo_curr->vid >= VLAN_VID_MASK) 575 if (!vinfo_curr->vid || vinfo_curr->vid >= VLAN_VID_MASK)
574 return -EINVAL; 576 return -EINVAL;
@@ -598,7 +600,8 @@ static int br_process_vlan_info(struct net_bridge *br,
598 sizeof(struct bridge_vlan_info)); 600 sizeof(struct bridge_vlan_info));
599 for (v = (*vinfo_last)->vid; v <= vinfo_curr->vid; v++) { 601 for (v = (*vinfo_last)->vid; v <= vinfo_curr->vid; v++) {
600 tmp_vinfo.vid = v; 602 tmp_vinfo.vid = v;
601 err = br_vlan_info(br, p, cmd, &tmp_vinfo, changed); 603 err = br_vlan_info(br, p, cmd, &tmp_vinfo, changed,
604 extack);
602 if (err) 605 if (err)
603 break; 606 break;
604 } 607 }
@@ -607,13 +610,14 @@ static int br_process_vlan_info(struct net_bridge *br,
607 return err; 610 return err;
608 } 611 }
609 612
610 return br_vlan_info(br, p, cmd, vinfo_curr, changed); 613 return br_vlan_info(br, p, cmd, vinfo_curr, changed, extack);
611} 614}
612 615
613static int br_afspec(struct net_bridge *br, 616static int br_afspec(struct net_bridge *br,
614 struct net_bridge_port *p, 617 struct net_bridge_port *p,
615 struct nlattr *af_spec, 618 struct nlattr *af_spec,
616 int cmd, bool *changed) 619 int cmd, bool *changed,
620 struct netlink_ext_ack *extack)
617{ 621{
618 struct bridge_vlan_info *vinfo_curr = NULL; 622 struct bridge_vlan_info *vinfo_curr = NULL;
619 struct bridge_vlan_info *vinfo_last = NULL; 623 struct bridge_vlan_info *vinfo_last = NULL;
@@ -643,7 +647,8 @@ static int br_afspec(struct net_bridge *br,
643 return -EINVAL; 647 return -EINVAL;
644 vinfo_curr = nla_data(attr); 648 vinfo_curr = nla_data(attr);
645 err = br_process_vlan_info(br, p, cmd, vinfo_curr, 649 err = br_process_vlan_info(br, p, cmd, vinfo_curr,
646 &vinfo_last, changed); 650 &vinfo_last, changed,
651 extack);
647 if (err) 652 if (err)
648 return err; 653 return err;
649 break; 654 break;
@@ -898,7 +903,7 @@ int br_setlink(struct net_device *dev, struct nlmsghdr *nlh, u16 flags,
898 } 903 }
899 904
900 if (afspec) 905 if (afspec)
901 err = br_afspec(br, p, afspec, RTM_SETLINK, &changed); 906 err = br_afspec(br, p, afspec, RTM_SETLINK, &changed, extack);
902 907
903 if (changed) 908 if (changed)
904 br_ifinfo_notify(RTM_NEWLINK, br, p); 909 br_ifinfo_notify(RTM_NEWLINK, br, p);
@@ -924,7 +929,7 @@ int br_dellink(struct net_device *dev, struct nlmsghdr *nlh, u16 flags)
924 if (!p && !(dev->priv_flags & IFF_EBRIDGE)) 929 if (!p && !(dev->priv_flags & IFF_EBRIDGE))
925 return -EINVAL; 930 return -EINVAL;
926 931
927 err = br_afspec(br, p, afspec, RTM_DELLINK, &changed); 932 err = br_afspec(br, p, afspec, RTM_DELLINK, &changed, NULL);
928 if (changed) 933 if (changed)
929 /* Send RTM_NEWLINK because userspace 934 /* Send RTM_NEWLINK because userspace
930 * expects RTM_NEWLINK for vlan dels 935 * expects RTM_NEWLINK for vlan dels
@@ -1106,7 +1111,7 @@ static int br_changelink(struct net_device *brdev, struct nlattr *tb[],
1106 if (data[IFLA_BR_VLAN_DEFAULT_PVID]) { 1111 if (data[IFLA_BR_VLAN_DEFAULT_PVID]) {
1107 __u16 defpvid = nla_get_u16(data[IFLA_BR_VLAN_DEFAULT_PVID]); 1112 __u16 defpvid = nla_get_u16(data[IFLA_BR_VLAN_DEFAULT_PVID]);
1108 1113
1109 err = __br_vlan_set_default_pvid(br, defpvid); 1114 err = __br_vlan_set_default_pvid(br, defpvid, extack);
1110 if (err) 1115 if (err)
1111 return err; 1116 return err;
1112 } 1117 }
diff --git a/net/bridge/br_private.h b/net/bridge/br_private.h
index 090dfacdc438..ff3dfb2a78b8 100644
--- a/net/bridge/br_private.h
+++ b/net/bridge/br_private.h
@@ -868,7 +868,7 @@ struct sk_buff *br_handle_vlan(struct net_bridge *br,
868 struct net_bridge_vlan_group *vg, 868 struct net_bridge_vlan_group *vg,
869 struct sk_buff *skb); 869 struct sk_buff *skb);
870int br_vlan_add(struct net_bridge *br, u16 vid, u16 flags, 870int br_vlan_add(struct net_bridge *br, u16 vid, u16 flags,
871 bool *changed); 871 bool *changed, struct netlink_ext_ack *extack);
872int br_vlan_delete(struct net_bridge *br, u16 vid); 872int br_vlan_delete(struct net_bridge *br, u16 vid);
873void br_vlan_flush(struct net_bridge *br); 873void br_vlan_flush(struct net_bridge *br);
874struct net_bridge_vlan *br_vlan_find(struct net_bridge_vlan_group *vg, u16 vid); 874struct net_bridge_vlan *br_vlan_find(struct net_bridge_vlan_group *vg, u16 vid);
@@ -881,12 +881,13 @@ int br_vlan_set_stats(struct net_bridge *br, unsigned long val);
881int br_vlan_set_stats_per_port(struct net_bridge *br, unsigned long val); 881int br_vlan_set_stats_per_port(struct net_bridge *br, unsigned long val);
882int br_vlan_init(struct net_bridge *br); 882int br_vlan_init(struct net_bridge *br);
883int br_vlan_set_default_pvid(struct net_bridge *br, unsigned long val); 883int br_vlan_set_default_pvid(struct net_bridge *br, unsigned long val);
884int __br_vlan_set_default_pvid(struct net_bridge *br, u16 pvid); 884int __br_vlan_set_default_pvid(struct net_bridge *br, u16 pvid,
885 struct netlink_ext_ack *extack);
885int nbp_vlan_add(struct net_bridge_port *port, u16 vid, u16 flags, 886int nbp_vlan_add(struct net_bridge_port *port, u16 vid, u16 flags,
886 bool *changed); 887 bool *changed, struct netlink_ext_ack *extack);
887int nbp_vlan_delete(struct net_bridge_port *port, u16 vid); 888int nbp_vlan_delete(struct net_bridge_port *port, u16 vid);
888void nbp_vlan_flush(struct net_bridge_port *port); 889void nbp_vlan_flush(struct net_bridge_port *port);
889int nbp_vlan_init(struct net_bridge_port *port); 890int nbp_vlan_init(struct net_bridge_port *port, struct netlink_ext_ack *extack);
890int nbp_get_num_vlan_infos(struct net_bridge_port *p, u32 filter_mask); 891int nbp_get_num_vlan_infos(struct net_bridge_port *p, u32 filter_mask);
891void br_vlan_get_stats(const struct net_bridge_vlan *v, 892void br_vlan_get_stats(const struct net_bridge_vlan *v,
892 struct br_vlan_stats *stats); 893 struct br_vlan_stats *stats);
@@ -971,7 +972,7 @@ static inline struct sk_buff *br_handle_vlan(struct net_bridge *br,
971} 972}
972 973
973static inline int br_vlan_add(struct net_bridge *br, u16 vid, u16 flags, 974static inline int br_vlan_add(struct net_bridge *br, u16 vid, u16 flags,
974 bool *changed) 975 bool *changed, struct netlink_ext_ack *extack)
975{ 976{
976 *changed = false; 977 *changed = false;
977 return -EOPNOTSUPP; 978 return -EOPNOTSUPP;
@@ -996,7 +997,7 @@ static inline int br_vlan_init(struct net_bridge *br)
996} 997}
997 998
998static inline int nbp_vlan_add(struct net_bridge_port *port, u16 vid, u16 flags, 999static inline int nbp_vlan_add(struct net_bridge_port *port, u16 vid, u16 flags,
999 bool *changed) 1000 bool *changed, struct netlink_ext_ack *extack)
1000{ 1001{
1001 *changed = false; 1002 *changed = false;
1002 return -EOPNOTSUPP; 1003 return -EOPNOTSUPP;
@@ -1017,7 +1018,8 @@ static inline struct net_bridge_vlan *br_vlan_find(struct net_bridge_vlan_group
1017 return NULL; 1018 return NULL;
1018} 1019}
1019 1020
1020static inline int nbp_vlan_init(struct net_bridge_port *port) 1021static inline int nbp_vlan_init(struct net_bridge_port *port,
1022 struct netlink_ext_ack *extack)
1021{ 1023{
1022 return 0; 1024 return 0;
1023} 1025}
@@ -1174,7 +1176,8 @@ int br_switchdev_set_port_flag(struct net_bridge_port *p,
1174 unsigned long mask); 1176 unsigned long mask);
1175void br_switchdev_fdb_notify(const struct net_bridge_fdb_entry *fdb, 1177void br_switchdev_fdb_notify(const struct net_bridge_fdb_entry *fdb,
1176 int type); 1178 int type);
1177int br_switchdev_port_vlan_add(struct net_device *dev, u16 vid, u16 flags); 1179int br_switchdev_port_vlan_add(struct net_device *dev, u16 vid, u16 flags,
1180 struct netlink_ext_ack *extack);
1178int br_switchdev_port_vlan_del(struct net_device *dev, u16 vid); 1181int br_switchdev_port_vlan_del(struct net_device *dev, u16 vid);
1179 1182
1180static inline void br_switchdev_frame_unmark(struct sk_buff *skb) 1183static inline void br_switchdev_frame_unmark(struct sk_buff *skb)
@@ -1206,7 +1209,8 @@ static inline int br_switchdev_set_port_flag(struct net_bridge_port *p,
1206} 1209}
1207 1210
1208static inline int br_switchdev_port_vlan_add(struct net_device *dev, 1211static inline int br_switchdev_port_vlan_add(struct net_device *dev,
1209 u16 vid, u16 flags) 1212 u16 vid, u16 flags,
1213 struct netlink_ext_ack *extack)
1210{ 1214{
1211 return -EOPNOTSUPP; 1215 return -EOPNOTSUPP;
1212} 1216}
diff --git a/net/bridge/br_switchdev.c b/net/bridge/br_switchdev.c
index b993df770675..99ba32177b31 100644
--- a/net/bridge/br_switchdev.c
+++ b/net/bridge/br_switchdev.c
@@ -140,7 +140,8 @@ br_switchdev_fdb_notify(const struct net_bridge_fdb_entry *fdb, int type)
140 } 140 }
141} 141}
142 142
143int br_switchdev_port_vlan_add(struct net_device *dev, u16 vid, u16 flags) 143int br_switchdev_port_vlan_add(struct net_device *dev, u16 vid, u16 flags,
144 struct netlink_ext_ack *extack)
144{ 145{
145 struct switchdev_obj_port_vlan v = { 146 struct switchdev_obj_port_vlan v = {
146 .obj.orig_dev = dev, 147 .obj.orig_dev = dev,
diff --git a/net/bridge/br_vlan.c b/net/bridge/br_vlan.c
index 48f50d7ac624..4a2f31157ef5 100644
--- a/net/bridge/br_vlan.c
+++ b/net/bridge/br_vlan.c
@@ -80,14 +80,14 @@ static bool __vlan_add_flags(struct net_bridge_vlan *v, u16 flags)
80} 80}
81 81
82static int __vlan_vid_add(struct net_device *dev, struct net_bridge *br, 82static int __vlan_vid_add(struct net_device *dev, struct net_bridge *br,
83 u16 vid, u16 flags) 83 u16 vid, u16 flags, struct netlink_ext_ack *extack)
84{ 84{
85 int err; 85 int err;
86 86
87 /* Try switchdev op first. In case it is not supported, fallback to 87 /* Try switchdev op first. In case it is not supported, fallback to
88 * 8021q add. 88 * 8021q add.
89 */ 89 */
90 err = br_switchdev_port_vlan_add(dev, vid, flags); 90 err = br_switchdev_port_vlan_add(dev, vid, flags, extack);
91 if (err == -EOPNOTSUPP) 91 if (err == -EOPNOTSUPP)
92 return vlan_vid_add(dev, br->vlan_proto, vid); 92 return vlan_vid_add(dev, br->vlan_proto, vid);
93 return err; 93 return err;
@@ -139,7 +139,9 @@ static int __vlan_vid_del(struct net_device *dev, struct net_bridge *br,
139/* Returns a master vlan, if it didn't exist it gets created. In all cases a 139/* Returns a master vlan, if it didn't exist it gets created. In all cases a
140 * a reference is taken to the master vlan before returning. 140 * a reference is taken to the master vlan before returning.
141 */ 141 */
142static struct net_bridge_vlan *br_vlan_get_master(struct net_bridge *br, u16 vid) 142static struct net_bridge_vlan *
143br_vlan_get_master(struct net_bridge *br, u16 vid,
144 struct netlink_ext_ack *extack)
143{ 145{
144 struct net_bridge_vlan_group *vg; 146 struct net_bridge_vlan_group *vg;
145 struct net_bridge_vlan *masterv; 147 struct net_bridge_vlan *masterv;
@@ -150,7 +152,7 @@ static struct net_bridge_vlan *br_vlan_get_master(struct net_bridge *br, u16 vid
150 bool changed; 152 bool changed;
151 153
152 /* missing global ctx, create it now */ 154 /* missing global ctx, create it now */
153 if (br_vlan_add(br, vid, 0, &changed)) 155 if (br_vlan_add(br, vid, 0, &changed, extack))
154 return NULL; 156 return NULL;
155 masterv = br_vlan_find(vg, vid); 157 masterv = br_vlan_find(vg, vid);
156 if (WARN_ON(!masterv)) 158 if (WARN_ON(!masterv))
@@ -214,7 +216,8 @@ static void nbp_vlan_rcu_free(struct rcu_head *rcu)
214 * 4. same as 3 but with both master and brentry flags set so the entry 216 * 4. same as 3 but with both master and brentry flags set so the entry
215 * will be used for filtering in both the port and the bridge 217 * will be used for filtering in both the port and the bridge
216 */ 218 */
217static int __vlan_add(struct net_bridge_vlan *v, u16 flags) 219static int __vlan_add(struct net_bridge_vlan *v, u16 flags,
220 struct netlink_ext_ack *extack)
218{ 221{
219 struct net_bridge_vlan *masterv = NULL; 222 struct net_bridge_vlan *masterv = NULL;
220 struct net_bridge_port *p = NULL; 223 struct net_bridge_port *p = NULL;
@@ -239,7 +242,7 @@ static int __vlan_add(struct net_bridge_vlan *v, u16 flags)
239 * This ensures tagged traffic enters the bridge when 242 * This ensures tagged traffic enters the bridge when
240 * promiscuous mode is disabled by br_manage_promisc(). 243 * promiscuous mode is disabled by br_manage_promisc().
241 */ 244 */
242 err = __vlan_vid_add(dev, br, v->vid, flags); 245 err = __vlan_vid_add(dev, br, v->vid, flags, extack);
243 if (err) 246 if (err)
244 goto out; 247 goto out;
245 248
@@ -249,12 +252,12 @@ static int __vlan_add(struct net_bridge_vlan *v, u16 flags)
249 252
250 err = br_vlan_add(br, v->vid, 253 err = br_vlan_add(br, v->vid,
251 flags | BRIDGE_VLAN_INFO_BRENTRY, 254 flags | BRIDGE_VLAN_INFO_BRENTRY,
252 &changed); 255 &changed, extack);
253 if (err) 256 if (err)
254 goto out_filt; 257 goto out_filt;
255 } 258 }
256 259
257 masterv = br_vlan_get_master(br, v->vid); 260 masterv = br_vlan_get_master(br, v->vid, extack);
258 if (!masterv) 261 if (!masterv)
259 goto out_filt; 262 goto out_filt;
260 v->brvlan = masterv; 263 v->brvlan = masterv;
@@ -269,7 +272,7 @@ static int __vlan_add(struct net_bridge_vlan *v, u16 flags)
269 v->stats = masterv->stats; 272 v->stats = masterv->stats;
270 } 273 }
271 } else { 274 } else {
272 err = br_switchdev_port_vlan_add(dev, v->vid, flags); 275 err = br_switchdev_port_vlan_add(dev, v->vid, flags, extack);
273 if (err && err != -EOPNOTSUPP) 276 if (err && err != -EOPNOTSUPP)
274 goto out; 277 goto out;
275 } 278 }
@@ -591,11 +594,12 @@ bool br_should_learn(struct net_bridge_port *p, struct sk_buff *skb, u16 *vid)
591static int br_vlan_add_existing(struct net_bridge *br, 594static int br_vlan_add_existing(struct net_bridge *br,
592 struct net_bridge_vlan_group *vg, 595 struct net_bridge_vlan_group *vg,
593 struct net_bridge_vlan *vlan, 596 struct net_bridge_vlan *vlan,
594 u16 flags, bool *changed) 597 u16 flags, bool *changed,
598 struct netlink_ext_ack *extack)
595{ 599{
596 int err; 600 int err;
597 601
598 err = br_switchdev_port_vlan_add(br->dev, vlan->vid, flags); 602 err = br_switchdev_port_vlan_add(br->dev, vlan->vid, flags, extack);
599 if (err && err != -EOPNOTSUPP) 603 if (err && err != -EOPNOTSUPP)
600 return err; 604 return err;
601 605
@@ -634,7 +638,8 @@ err_flags:
634 * Must be called with vid in range from 1 to 4094 inclusive. 638 * Must be called with vid in range from 1 to 4094 inclusive.
635 * changed must be true only if the vlan was created or updated 639 * changed must be true only if the vlan was created or updated
636 */ 640 */
637int br_vlan_add(struct net_bridge *br, u16 vid, u16 flags, bool *changed) 641int br_vlan_add(struct net_bridge *br, u16 vid, u16 flags, bool *changed,
642 struct netlink_ext_ack *extack)
638{ 643{
639 struct net_bridge_vlan_group *vg; 644 struct net_bridge_vlan_group *vg;
640 struct net_bridge_vlan *vlan; 645 struct net_bridge_vlan *vlan;
@@ -646,7 +651,8 @@ int br_vlan_add(struct net_bridge *br, u16 vid, u16 flags, bool *changed)
646 vg = br_vlan_group(br); 651 vg = br_vlan_group(br);
647 vlan = br_vlan_find(vg, vid); 652 vlan = br_vlan_find(vg, vid);
648 if (vlan) 653 if (vlan)
649 return br_vlan_add_existing(br, vg, vlan, flags, changed); 654 return br_vlan_add_existing(br, vg, vlan, flags, changed,
655 extack);
650 656
651 vlan = kzalloc(sizeof(*vlan), GFP_KERNEL); 657 vlan = kzalloc(sizeof(*vlan), GFP_KERNEL);
652 if (!vlan) 658 if (!vlan)
@@ -663,7 +669,7 @@ int br_vlan_add(struct net_bridge *br, u16 vid, u16 flags, bool *changed)
663 vlan->br = br; 669 vlan->br = br;
664 if (flags & BRIDGE_VLAN_INFO_BRENTRY) 670 if (flags & BRIDGE_VLAN_INFO_BRENTRY)
665 refcount_set(&vlan->refcnt, 1); 671 refcount_set(&vlan->refcnt, 1);
666 ret = __vlan_add(vlan, flags); 672 ret = __vlan_add(vlan, flags, extack);
667 if (ret) { 673 if (ret) {
668 free_percpu(vlan->stats); 674 free_percpu(vlan->stats);
669 kfree(vlan); 675 kfree(vlan);
@@ -914,7 +920,8 @@ static void br_vlan_disable_default_pvid(struct net_bridge *br)
914 br->default_pvid = 0; 920 br->default_pvid = 0;
915} 921}
916 922
917int __br_vlan_set_default_pvid(struct net_bridge *br, u16 pvid) 923int __br_vlan_set_default_pvid(struct net_bridge *br, u16 pvid,
924 struct netlink_ext_ack *extack)
918{ 925{
919 const struct net_bridge_vlan *pvent; 926 const struct net_bridge_vlan *pvent;
920 struct net_bridge_vlan_group *vg; 927 struct net_bridge_vlan_group *vg;
@@ -946,7 +953,7 @@ int __br_vlan_set_default_pvid(struct net_bridge *br, u16 pvid)
946 BRIDGE_VLAN_INFO_PVID | 953 BRIDGE_VLAN_INFO_PVID |
947 BRIDGE_VLAN_INFO_UNTAGGED | 954 BRIDGE_VLAN_INFO_UNTAGGED |
948 BRIDGE_VLAN_INFO_BRENTRY, 955 BRIDGE_VLAN_INFO_BRENTRY,
949 &vlchange); 956 &vlchange, extack);
950 if (err) 957 if (err)
951 goto out; 958 goto out;
952 br_vlan_delete(br, old_pvid); 959 br_vlan_delete(br, old_pvid);
@@ -966,7 +973,7 @@ int __br_vlan_set_default_pvid(struct net_bridge *br, u16 pvid)
966 err = nbp_vlan_add(p, pvid, 973 err = nbp_vlan_add(p, pvid,
967 BRIDGE_VLAN_INFO_PVID | 974 BRIDGE_VLAN_INFO_PVID |
968 BRIDGE_VLAN_INFO_UNTAGGED, 975 BRIDGE_VLAN_INFO_UNTAGGED,
969 &vlchange); 976 &vlchange, extack);
970 if (err) 977 if (err)
971 goto err_port; 978 goto err_port;
972 nbp_vlan_delete(p, old_pvid); 979 nbp_vlan_delete(p, old_pvid);
@@ -988,7 +995,7 @@ err_port:
988 nbp_vlan_add(p, old_pvid, 995 nbp_vlan_add(p, old_pvid,
989 BRIDGE_VLAN_INFO_PVID | 996 BRIDGE_VLAN_INFO_PVID |
990 BRIDGE_VLAN_INFO_UNTAGGED, 997 BRIDGE_VLAN_INFO_UNTAGGED,
991 &vlchange); 998 &vlchange, NULL);
992 nbp_vlan_delete(p, pvid); 999 nbp_vlan_delete(p, pvid);
993 } 1000 }
994 1001
@@ -998,7 +1005,7 @@ err_port:
998 BRIDGE_VLAN_INFO_PVID | 1005 BRIDGE_VLAN_INFO_PVID |
999 BRIDGE_VLAN_INFO_UNTAGGED | 1006 BRIDGE_VLAN_INFO_UNTAGGED |
1000 BRIDGE_VLAN_INFO_BRENTRY, 1007 BRIDGE_VLAN_INFO_BRENTRY,
1001 &vlchange); 1008 &vlchange, NULL);
1002 br_vlan_delete(br, pvid); 1009 br_vlan_delete(br, pvid);
1003 } 1010 }
1004 goto out; 1011 goto out;
@@ -1021,7 +1028,7 @@ int br_vlan_set_default_pvid(struct net_bridge *br, unsigned long val)
1021 err = -EPERM; 1028 err = -EPERM;
1022 goto out; 1029 goto out;
1023 } 1030 }
1024 err = __br_vlan_set_default_pvid(br, pvid); 1031 err = __br_vlan_set_default_pvid(br, pvid, NULL);
1025out: 1032out:
1026 return err; 1033 return err;
1027} 1034}
@@ -1047,7 +1054,7 @@ int br_vlan_init(struct net_bridge *br)
1047 rcu_assign_pointer(br->vlgrp, vg); 1054 rcu_assign_pointer(br->vlgrp, vg);
1048 ret = br_vlan_add(br, 1, 1055 ret = br_vlan_add(br, 1,
1049 BRIDGE_VLAN_INFO_PVID | BRIDGE_VLAN_INFO_UNTAGGED | 1056 BRIDGE_VLAN_INFO_PVID | BRIDGE_VLAN_INFO_UNTAGGED |
1050 BRIDGE_VLAN_INFO_BRENTRY, &changed); 1057 BRIDGE_VLAN_INFO_BRENTRY, &changed, NULL);
1051 if (ret) 1058 if (ret)
1052 goto err_vlan_add; 1059 goto err_vlan_add;
1053 1060
@@ -1064,7 +1071,7 @@ err_rhtbl:
1064 goto out; 1071 goto out;
1065} 1072}
1066 1073
1067int nbp_vlan_init(struct net_bridge_port *p) 1074int nbp_vlan_init(struct net_bridge_port *p, struct netlink_ext_ack *extack)
1068{ 1075{
1069 struct switchdev_attr attr = { 1076 struct switchdev_attr attr = {
1070 .orig_dev = p->br->dev, 1077 .orig_dev = p->br->dev,
@@ -1097,7 +1104,7 @@ int nbp_vlan_init(struct net_bridge_port *p)
1097 ret = nbp_vlan_add(p, p->br->default_pvid, 1104 ret = nbp_vlan_add(p, p->br->default_pvid,
1098 BRIDGE_VLAN_INFO_PVID | 1105 BRIDGE_VLAN_INFO_PVID |
1099 BRIDGE_VLAN_INFO_UNTAGGED, 1106 BRIDGE_VLAN_INFO_UNTAGGED,
1100 &changed); 1107 &changed, extack);
1101 if (ret) 1108 if (ret)
1102 goto err_vlan_add; 1109 goto err_vlan_add;
1103 } 1110 }
@@ -1122,7 +1129,7 @@ err_vlan_enabled:
1122 * changed must be true only if the vlan was created or updated 1129 * changed must be true only if the vlan was created or updated
1123 */ 1130 */
1124int nbp_vlan_add(struct net_bridge_port *port, u16 vid, u16 flags, 1131int nbp_vlan_add(struct net_bridge_port *port, u16 vid, u16 flags,
1125 bool *changed) 1132 bool *changed, struct netlink_ext_ack *extack)
1126{ 1133{
1127 struct net_bridge_vlan *vlan; 1134 struct net_bridge_vlan *vlan;
1128 int ret; 1135 int ret;
@@ -1133,7 +1140,7 @@ int nbp_vlan_add(struct net_bridge_port *port, u16 vid, u16 flags,
1133 vlan = br_vlan_find(nbp_vlan_group(port), vid); 1140 vlan = br_vlan_find(nbp_vlan_group(port), vid);
1134 if (vlan) { 1141 if (vlan) {
1135 /* Pass the flags to the hardware bridge */ 1142 /* Pass the flags to the hardware bridge */
1136 ret = br_switchdev_port_vlan_add(port->dev, vid, flags); 1143 ret = br_switchdev_port_vlan_add(port->dev, vid, flags, extack);
1137 if (ret && ret != -EOPNOTSUPP) 1144 if (ret && ret != -EOPNOTSUPP)
1138 return ret; 1145 return ret;
1139 *changed = __vlan_add_flags(vlan, flags); 1146 *changed = __vlan_add_flags(vlan, flags);
@@ -1147,7 +1154,7 @@ int nbp_vlan_add(struct net_bridge_port *port, u16 vid, u16 flags,
1147 1154
1148 vlan->vid = vid; 1155 vlan->vid = vid;
1149 vlan->port = port; 1156 vlan->port = port;
1150 ret = __vlan_add(vlan, flags); 1157 ret = __vlan_add(vlan, flags, extack);
1151 if (ret) 1158 if (ret)
1152 kfree(vlan); 1159 kfree(vlan);
1153 else 1160 else