Skip to content

Commit c1b85a1

Browse files
committed
Merge branch 'mlxsw-more-extack'
Jiri Pirko says: ==================== mlxsw: Add more extack error reporting Ido says: Add error messages to VLAN and bridge enslavements to help users understand why the enslavement failed. ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents c9f766b + 9b63ef8 commit c1b85a1

File tree

3 files changed

+33
-13
lines changed

3 files changed

+33
-13
lines changed

drivers/net/ethernet/mellanox/mlxsw/spectrum.c

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
#include <linux/notifier.h>
5454
#include <linux/dcbnl.h>
5555
#include <linux/inetdevice.h>
56+
#include <linux/netlink.h>
5657
#include <net/switchdev.h>
5758
#include <net/pkt_cls.h>
5859
#include <net/tc_act/tc_mirred.h>
@@ -4298,7 +4299,8 @@ static int mlxsw_sp_netdevice_port_upper_event(struct net_device *lower_dev,
42984299
if (info->linking)
42994300
err = mlxsw_sp_port_bridge_join(mlxsw_sp_port,
43004301
lower_dev,
4301-
upper_dev);
4302+
upper_dev,
4303+
extack);
43024304
else
43034305
mlxsw_sp_port_bridge_leave(mlxsw_sp_port,
43044306
lower_dev,
@@ -4389,26 +4391,34 @@ static int mlxsw_sp_netdevice_port_vlan_event(struct net_device *vlan_dev,
43894391
{
43904392
struct mlxsw_sp_port *mlxsw_sp_port = netdev_priv(dev);
43914393
struct netdev_notifier_changeupper_info *info = ptr;
4394+
struct netlink_ext_ack *extack;
43924395
struct net_device *upper_dev;
43934396
int err = 0;
43944397

4398+
extack = netdev_notifier_info_to_extack(&info->info);
4399+
43954400
switch (event) {
43964401
case NETDEV_PRECHANGEUPPER:
43974402
upper_dev = info->upper_dev;
4398-
if (!netif_is_bridge_master(upper_dev))
4403+
if (!netif_is_bridge_master(upper_dev)) {
4404+
NL_SET_ERR_MSG(extack, "spectrum: VLAN devices only support bridge and VRF uppers");
43994405
return -EINVAL;
4406+
}
44004407
if (!info->linking)
44014408
break;
4402-
if (netdev_has_any_upper_dev(upper_dev))
4409+
if (netdev_has_any_upper_dev(upper_dev)) {
4410+
NL_SET_ERR_MSG(extack, "spectrum: Enslaving a port to a device that already has an upper device is not supported");
44034411
return -EINVAL;
4412+
}
44044413
break;
44054414
case NETDEV_CHANGEUPPER:
44064415
upper_dev = info->upper_dev;
44074416
if (netif_is_bridge_master(upper_dev)) {
44084417
if (info->linking)
44094418
err = mlxsw_sp_port_bridge_join(mlxsw_sp_port,
44104419
vlan_dev,
4411-
upper_dev);
4420+
upper_dev,
4421+
extack);
44124422
else
44134423
mlxsw_sp_port_bridge_leave(mlxsw_sp_port,
44144424
vlan_dev,

drivers/net/ethernet/mellanox/mlxsw/spectrum.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -326,7 +326,8 @@ void
326326
mlxsw_sp_port_vlan_bridge_leave(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan);
327327
int mlxsw_sp_port_bridge_join(struct mlxsw_sp_port *mlxsw_sp_port,
328328
struct net_device *brport_dev,
329-
struct net_device *br_dev);
329+
struct net_device *br_dev,
330+
struct netlink_ext_ack *extack);
330331
void mlxsw_sp_port_bridge_leave(struct mlxsw_sp_port *mlxsw_sp_port,
331332
struct net_device *brport_dev,
332333
struct net_device *br_dev);

drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
#include <linux/workqueue.h>
4747
#include <linux/jiffies.h>
4848
#include <linux/rtnetlink.h>
49+
#include <linux/netlink.h>
4950
#include <net/switchdev.h>
5051

5152
#include "spectrum.h"
@@ -107,7 +108,8 @@ struct mlxsw_sp_bridge_vlan {
107108
struct mlxsw_sp_bridge_ops {
108109
int (*port_join)(struct mlxsw_sp_bridge_device *bridge_device,
109110
struct mlxsw_sp_bridge_port *bridge_port,
110-
struct mlxsw_sp_port *mlxsw_sp_port);
111+
struct mlxsw_sp_port *mlxsw_sp_port,
112+
struct netlink_ext_ack *extack);
111113
void (*port_leave)(struct mlxsw_sp_bridge_device *bridge_device,
112114
struct mlxsw_sp_bridge_port *bridge_port,
113115
struct mlxsw_sp_port *mlxsw_sp_port);
@@ -1735,12 +1737,15 @@ static const struct switchdev_ops mlxsw_sp_port_switchdev_ops = {
17351737
static int
17361738
mlxsw_sp_bridge_8021q_port_join(struct mlxsw_sp_bridge_device *bridge_device,
17371739
struct mlxsw_sp_bridge_port *bridge_port,
1738-
struct mlxsw_sp_port *mlxsw_sp_port)
1740+
struct mlxsw_sp_port *mlxsw_sp_port,
1741+
struct netlink_ext_ack *extack)
17391742
{
17401743
struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
17411744

1742-
if (is_vlan_dev(bridge_port->dev))
1745+
if (is_vlan_dev(bridge_port->dev)) {
1746+
NL_SET_ERR_MSG(extack, "spectrum: Can not enslave a VLAN device to a VLAN-aware bridge");
17431747
return -EINVAL;
1748+
}
17441749

17451750
mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_find_by_vid(mlxsw_sp_port, 1);
17461751
if (WARN_ON(!mlxsw_sp_port_vlan))
@@ -1797,21 +1802,24 @@ mlxsw_sp_port_is_br_member(const struct mlxsw_sp_port *mlxsw_sp_port,
17971802
static int
17981803
mlxsw_sp_bridge_8021d_port_join(struct mlxsw_sp_bridge_device *bridge_device,
17991804
struct mlxsw_sp_bridge_port *bridge_port,
1800-
struct mlxsw_sp_port *mlxsw_sp_port)
1805+
struct mlxsw_sp_port *mlxsw_sp_port,
1806+
struct netlink_ext_ack *extack)
18011807
{
18021808
struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
18031809
u16 vid;
18041810

1805-
if (!is_vlan_dev(bridge_port->dev))
1811+
if (!is_vlan_dev(bridge_port->dev)) {
1812+
NL_SET_ERR_MSG(extack, "spectrum: Only VLAN devices can be enslaved to a VLAN-unaware bridge");
18061813
return -EINVAL;
1814+
}
18071815
vid = vlan_dev_vlan_id(bridge_port->dev);
18081816

18091817
mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_find_by_vid(mlxsw_sp_port, vid);
18101818
if (WARN_ON(!mlxsw_sp_port_vlan))
18111819
return -EINVAL;
18121820

18131821
if (mlxsw_sp_port_is_br_member(mlxsw_sp_port, bridge_device->dev)) {
1814-
netdev_err(mlxsw_sp_port->dev, "Can't bridge VLAN uppers of the same port\n");
1822+
NL_SET_ERR_MSG(extack, "spectrum: Can not bridge VLAN uppers of the same port");
18151823
return -EINVAL;
18161824
}
18171825

@@ -1854,7 +1862,8 @@ static const struct mlxsw_sp_bridge_ops mlxsw_sp_bridge_8021d_ops = {
18541862

18551863
int mlxsw_sp_port_bridge_join(struct mlxsw_sp_port *mlxsw_sp_port,
18561864
struct net_device *brport_dev,
1857-
struct net_device *br_dev)
1865+
struct net_device *br_dev,
1866+
struct netlink_ext_ack *extack)
18581867
{
18591868
struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
18601869
struct mlxsw_sp_bridge_device *bridge_device;
@@ -1867,7 +1876,7 @@ int mlxsw_sp_port_bridge_join(struct mlxsw_sp_port *mlxsw_sp_port,
18671876
bridge_device = bridge_port->bridge_device;
18681877

18691878
err = bridge_device->ops->port_join(bridge_device, bridge_port,
1870-
mlxsw_sp_port);
1879+
mlxsw_sp_port, extack);
18711880
if (err)
18721881
goto err_port_join;
18731882

0 commit comments

Comments
 (0)