diff options
-rw-r--r-- | net/bridge/br_if.c | 2 | ||||
-rw-r--r-- | net/bridge/br_netlink.c | 27 | ||||
-rw-r--r-- | net/bridge/br_private.h | 22 | ||||
-rw-r--r-- | net/bridge/br_switchdev.c | 3 | ||||
-rw-r--r-- | net/bridge/br_vlan.c | 59 |
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 | ||
527 | static int br_vlan_info(struct net_bridge *br, struct net_bridge_port *p, | 527 | static 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 | ||
613 | static int br_afspec(struct net_bridge *br, | 616 | static 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); |
870 | int br_vlan_add(struct net_bridge *br, u16 vid, u16 flags, | 870 | int br_vlan_add(struct net_bridge *br, u16 vid, u16 flags, |
871 | bool *changed); | 871 | bool *changed, struct netlink_ext_ack *extack); |
872 | int br_vlan_delete(struct net_bridge *br, u16 vid); | 872 | int br_vlan_delete(struct net_bridge *br, u16 vid); |
873 | void br_vlan_flush(struct net_bridge *br); | 873 | void br_vlan_flush(struct net_bridge *br); |
874 | struct net_bridge_vlan *br_vlan_find(struct net_bridge_vlan_group *vg, u16 vid); | 874 | struct 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); | |||
881 | int br_vlan_set_stats_per_port(struct net_bridge *br, unsigned long val); | 881 | int br_vlan_set_stats_per_port(struct net_bridge *br, unsigned long val); |
882 | int br_vlan_init(struct net_bridge *br); | 882 | int br_vlan_init(struct net_bridge *br); |
883 | int br_vlan_set_default_pvid(struct net_bridge *br, unsigned long val); | 883 | int br_vlan_set_default_pvid(struct net_bridge *br, unsigned long val); |
884 | int __br_vlan_set_default_pvid(struct net_bridge *br, u16 pvid); | 884 | int __br_vlan_set_default_pvid(struct net_bridge *br, u16 pvid, |
885 | struct netlink_ext_ack *extack); | ||
885 | int nbp_vlan_add(struct net_bridge_port *port, u16 vid, u16 flags, | 886 | int nbp_vlan_add(struct net_bridge_port *port, u16 vid, u16 flags, |
886 | bool *changed); | 887 | bool *changed, struct netlink_ext_ack *extack); |
887 | int nbp_vlan_delete(struct net_bridge_port *port, u16 vid); | 888 | int nbp_vlan_delete(struct net_bridge_port *port, u16 vid); |
888 | void nbp_vlan_flush(struct net_bridge_port *port); | 889 | void nbp_vlan_flush(struct net_bridge_port *port); |
889 | int nbp_vlan_init(struct net_bridge_port *port); | 890 | int nbp_vlan_init(struct net_bridge_port *port, struct netlink_ext_ack *extack); |
890 | int nbp_get_num_vlan_infos(struct net_bridge_port *p, u32 filter_mask); | 891 | int nbp_get_num_vlan_infos(struct net_bridge_port *p, u32 filter_mask); |
891 | void br_vlan_get_stats(const struct net_bridge_vlan *v, | 892 | void 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 | ||
973 | static inline int br_vlan_add(struct net_bridge *br, u16 vid, u16 flags, | 974 | static 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 | ||
998 | static inline int nbp_vlan_add(struct net_bridge_port *port, u16 vid, u16 flags, | 999 | static 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 | ||
1020 | static inline int nbp_vlan_init(struct net_bridge_port *port) | 1021 | static 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); |
1175 | void br_switchdev_fdb_notify(const struct net_bridge_fdb_entry *fdb, | 1177 | void br_switchdev_fdb_notify(const struct net_bridge_fdb_entry *fdb, |
1176 | int type); | 1178 | int type); |
1177 | int br_switchdev_port_vlan_add(struct net_device *dev, u16 vid, u16 flags); | 1179 | int br_switchdev_port_vlan_add(struct net_device *dev, u16 vid, u16 flags, |
1180 | struct netlink_ext_ack *extack); | ||
1178 | int br_switchdev_port_vlan_del(struct net_device *dev, u16 vid); | 1181 | int br_switchdev_port_vlan_del(struct net_device *dev, u16 vid); |
1179 | 1182 | ||
1180 | static inline void br_switchdev_frame_unmark(struct sk_buff *skb) | 1183 | static 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 | ||
1208 | static inline int br_switchdev_port_vlan_add(struct net_device *dev, | 1211 | static 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 | ||
143 | int br_switchdev_port_vlan_add(struct net_device *dev, u16 vid, u16 flags) | 143 | int 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 | ||
82 | static int __vlan_vid_add(struct net_device *dev, struct net_bridge *br, | 82 | static 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 | */ |
142 | static struct net_bridge_vlan *br_vlan_get_master(struct net_bridge *br, u16 vid) | 142 | static struct net_bridge_vlan * |
143 | br_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 | */ |
217 | static int __vlan_add(struct net_bridge_vlan *v, u16 flags) | 219 | static 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) | |||
591 | static int br_vlan_add_existing(struct net_bridge *br, | 594 | static 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 | */ |
637 | int br_vlan_add(struct net_bridge *br, u16 vid, u16 flags, bool *changed) | 641 | int 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 | ||
917 | int __br_vlan_set_default_pvid(struct net_bridge *br, u16 pvid) | 923 | int __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); |
1025 | out: | 1032 | out: |
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 | ||
1067 | int nbp_vlan_init(struct net_bridge_port *p) | 1074 | int 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 | */ |
1124 | int nbp_vlan_add(struct net_bridge_port *port, u16 vid, u16 flags, | 1131 | int 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 |