Skip to content

Commit

Permalink
net: bridge: don't print in br_switchdev_set_port_flag
Browse files Browse the repository at this point in the history
For the netlink interface, propagate errors through extack rather than
simply printing them to the console. For the sysfs interface, we still
print to the console, but at least that's one layer higher than in
switchdev, which also allows us to silently ignore the offloading of
flags if that is ever needed in the future.

Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Acked-by: Nikolay Aleksandrov <nikolay@nvidia.com>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Vladimir Oltean authored and David S. Miller committed Feb 13, 2021
1 parent 304ae3b commit 078bbb8
Show file tree
Hide file tree
Showing 4 changed files with 21 additions and 14 deletions.
9 changes: 5 additions & 4 deletions net/bridge/br_netlink.c
Original file line number Diff line number Diff line change
Expand Up @@ -866,7 +866,8 @@ static void br_set_port_flag(struct net_bridge_port *p, struct nlattr *tb[],
}

/* Process bridge protocol info on port */
static int br_setport(struct net_bridge_port *p, struct nlattr *tb[])
static int br_setport(struct net_bridge_port *p, struct nlattr *tb[],
struct netlink_ext_ack *extack)
{
unsigned long old_flags, changed_mask;
bool br_vlan_tunnel_old;
Expand Down Expand Up @@ -894,7 +895,7 @@ static int br_setport(struct net_bridge_port *p, struct nlattr *tb[])

changed_mask = old_flags ^ p->flags;

err = br_switchdev_set_port_flag(p, p->flags, changed_mask);
err = br_switchdev_set_port_flag(p, p->flags, changed_mask, extack);
if (err) {
p->flags = old_flags;
return err;
Expand Down Expand Up @@ -1007,7 +1008,7 @@ int br_setlink(struct net_device *dev, struct nlmsghdr *nlh, u16 flags,
return err;

spin_lock_bh(&p->br->lock);
err = br_setport(p, tb);
err = br_setport(p, tb, extack);
spin_unlock_bh(&p->br->lock);
} else {
/* Binary compatibility with old RSTP */
Expand Down Expand Up @@ -1102,7 +1103,7 @@ static int br_port_slave_changelink(struct net_device *brdev,
return 0;

spin_lock_bh(&br->lock);
ret = br_setport(br_port_get_rtnl(dev), data);
ret = br_setport(br_port_get_rtnl(dev), data, extack);
spin_unlock_bh(&br->lock);

return ret;
Expand Down
6 changes: 4 additions & 2 deletions net/bridge/br_private.h
Original file line number Diff line number Diff line change
Expand Up @@ -1575,7 +1575,8 @@ bool nbp_switchdev_allowed_egress(const struct net_bridge_port *p,
const struct sk_buff *skb);
int br_switchdev_set_port_flag(struct net_bridge_port *p,
unsigned long flags,
unsigned long mask);
unsigned long mask,
struct netlink_ext_ack *extack);
void br_switchdev_fdb_notify(const struct net_bridge_fdb_entry *fdb,
int type);
int br_switchdev_port_vlan_add(struct net_device *dev, u16 vid, u16 flags,
Expand Down Expand Up @@ -1605,7 +1606,8 @@ static inline bool nbp_switchdev_allowed_egress(const struct net_bridge_port *p,

static inline int br_switchdev_set_port_flag(struct net_bridge_port *p,
unsigned long flags,
unsigned long mask)
unsigned long mask,
struct netlink_ext_ack *extack)
{
return 0;
}
Expand Down
13 changes: 7 additions & 6 deletions net/bridge/br_switchdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,8 @@ bool nbp_switchdev_allowed_egress(const struct net_bridge_port *p,

int br_switchdev_set_port_flag(struct net_bridge_port *p,
unsigned long flags,
unsigned long mask)
unsigned long mask,
struct netlink_ext_ack *extack)
{
struct switchdev_attr attr = {
.orig_dev = p->dev,
Expand All @@ -79,14 +80,15 @@ int br_switchdev_set_port_flag(struct net_bridge_port *p,

/* We run from atomic context here */
err = call_switchdev_notifiers(SWITCHDEV_PORT_ATTR_SET, p->dev,
&info.info, NULL);
&info.info, extack);
err = notifier_to_errno(err);
if (err == -EOPNOTSUPP)
return 0;

if (err) {
br_warn(p->br, "bridge flag offload is not supported %u(%s)\n",
(unsigned int)p->port_no, p->dev->name);
if (extack && !extack->_msg)
NL_SET_ERR_MSG_MOD(extack,
"bridge flag offload is not supported");
return -EOPNOTSUPP;
}

Expand All @@ -96,8 +98,7 @@ int br_switchdev_set_port_flag(struct net_bridge_port *p,

err = switchdev_port_attr_set(p->dev, &attr);
if (err) {
br_warn(p->br, "error setting offload flag on port %u(%s)\n",
(unsigned int)p->port_no, p->dev->name);
NL_SET_ERR_MSG_MOD(extack, "error setting offload flag on port");
return err;
}

Expand Down
7 changes: 5 additions & 2 deletions net/bridge/br_sysfs_if.c
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ static BRPORT_ATTR(_name, 0644, \
static int store_flag(struct net_bridge_port *p, unsigned long v,
unsigned long mask)
{
struct netlink_ext_ack extack = {0};
unsigned long flags = p->flags;
int err;

Expand All @@ -68,9 +69,11 @@ static int store_flag(struct net_bridge_port *p, unsigned long v,
flags &= ~mask;

if (flags != p->flags) {
err = br_switchdev_set_port_flag(p, flags, mask);
if (err)
err = br_switchdev_set_port_flag(p, flags, mask, &extack);
if (err) {
netdev_err(p->dev, "%s\n", extack._msg);
return err;
}

p->flags = flags;
br_port_flags_change(p, mask);
Expand Down

0 comments on commit 078bbb8

Please sign in to comment.