summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPetr Machata <petrm@mellanox.com>2018-12-12 12:02:50 -0500
committerDavid S. Miller <davem@davemloft.net>2018-12-12 19:34:21 -0500
commit169327d5850cb80d98d095cfaf8dfbb63d576864 (patch)
tree29412941f876c4a7a5bf7215278cae6fe004ca75
parent2fd527b72bb6f95dfe8a1902e998cb76390c431e (diff)
net: bridge: Propagate extack to switchdev
ndo_bridge_setlink has been updated in the previous patch to have extack available, and changelink RTNL op has had this argument since the time extack was added. Propagate both through the bridge driver to eventually reach br_switchdev_port_vlan_add(), where it will be used by subsequent patches. Signed-off-by: Petr Machata <petrm@mellanox.com> Acked-by: Jiri Pirko <jiri@mellanox.com> Acked-by: Nikolay Aleksandrov <nikolay@cumulusnetworks.com> Acked-by: Ivan Vecera <ivecera@redhat.com> Acked-by: Roopa Prabhu <roopa@cumulusnetworks.com> Reviewed-by: Ido Schimmel <idosch@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-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