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 <davem@davemloft.net>
This commit is contained in:
Коммит
c1b85a193a
|
@ -53,6 +53,7 @@
|
||||||
#include <linux/notifier.h>
|
#include <linux/notifier.h>
|
||||||
#include <linux/dcbnl.h>
|
#include <linux/dcbnl.h>
|
||||||
#include <linux/inetdevice.h>
|
#include <linux/inetdevice.h>
|
||||||
|
#include <linux/netlink.h>
|
||||||
#include <net/switchdev.h>
|
#include <net/switchdev.h>
|
||||||
#include <net/pkt_cls.h>
|
#include <net/pkt_cls.h>
|
||||||
#include <net/tc_act/tc_mirred.h>
|
#include <net/tc_act/tc_mirred.h>
|
||||||
|
@ -4298,7 +4299,8 @@ static int mlxsw_sp_netdevice_port_upper_event(struct net_device *lower_dev,
|
||||||
if (info->linking)
|
if (info->linking)
|
||||||
err = mlxsw_sp_port_bridge_join(mlxsw_sp_port,
|
err = mlxsw_sp_port_bridge_join(mlxsw_sp_port,
|
||||||
lower_dev,
|
lower_dev,
|
||||||
upper_dev);
|
upper_dev,
|
||||||
|
extack);
|
||||||
else
|
else
|
||||||
mlxsw_sp_port_bridge_leave(mlxsw_sp_port,
|
mlxsw_sp_port_bridge_leave(mlxsw_sp_port,
|
||||||
lower_dev,
|
lower_dev,
|
||||||
|
@ -4389,18 +4391,25 @@ static int mlxsw_sp_netdevice_port_vlan_event(struct net_device *vlan_dev,
|
||||||
{
|
{
|
||||||
struct mlxsw_sp_port *mlxsw_sp_port = netdev_priv(dev);
|
struct mlxsw_sp_port *mlxsw_sp_port = netdev_priv(dev);
|
||||||
struct netdev_notifier_changeupper_info *info = ptr;
|
struct netdev_notifier_changeupper_info *info = ptr;
|
||||||
|
struct netlink_ext_ack *extack;
|
||||||
struct net_device *upper_dev;
|
struct net_device *upper_dev;
|
||||||
int err = 0;
|
int err = 0;
|
||||||
|
|
||||||
|
extack = netdev_notifier_info_to_extack(&info->info);
|
||||||
|
|
||||||
switch (event) {
|
switch (event) {
|
||||||
case NETDEV_PRECHANGEUPPER:
|
case NETDEV_PRECHANGEUPPER:
|
||||||
upper_dev = info->upper_dev;
|
upper_dev = info->upper_dev;
|
||||||
if (!netif_is_bridge_master(upper_dev))
|
if (!netif_is_bridge_master(upper_dev)) {
|
||||||
|
NL_SET_ERR_MSG(extack, "spectrum: VLAN devices only support bridge and VRF uppers");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
}
|
||||||
if (!info->linking)
|
if (!info->linking)
|
||||||
break;
|
break;
|
||||||
if (netdev_has_any_upper_dev(upper_dev))
|
if (netdev_has_any_upper_dev(upper_dev)) {
|
||||||
|
NL_SET_ERR_MSG(extack, "spectrum: Enslaving a port to a device that already has an upper device is not supported");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case NETDEV_CHANGEUPPER:
|
case NETDEV_CHANGEUPPER:
|
||||||
upper_dev = info->upper_dev;
|
upper_dev = info->upper_dev;
|
||||||
|
@ -4408,7 +4417,8 @@ static int mlxsw_sp_netdevice_port_vlan_event(struct net_device *vlan_dev,
|
||||||
if (info->linking)
|
if (info->linking)
|
||||||
err = mlxsw_sp_port_bridge_join(mlxsw_sp_port,
|
err = mlxsw_sp_port_bridge_join(mlxsw_sp_port,
|
||||||
vlan_dev,
|
vlan_dev,
|
||||||
upper_dev);
|
upper_dev,
|
||||||
|
extack);
|
||||||
else
|
else
|
||||||
mlxsw_sp_port_bridge_leave(mlxsw_sp_port,
|
mlxsw_sp_port_bridge_leave(mlxsw_sp_port,
|
||||||
vlan_dev,
|
vlan_dev,
|
||||||
|
|
|
@ -326,7 +326,8 @@ void
|
||||||
mlxsw_sp_port_vlan_bridge_leave(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan);
|
mlxsw_sp_port_vlan_bridge_leave(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan);
|
||||||
int mlxsw_sp_port_bridge_join(struct mlxsw_sp_port *mlxsw_sp_port,
|
int mlxsw_sp_port_bridge_join(struct mlxsw_sp_port *mlxsw_sp_port,
|
||||||
struct net_device *brport_dev,
|
struct net_device *brport_dev,
|
||||||
struct net_device *br_dev);
|
struct net_device *br_dev,
|
||||||
|
struct netlink_ext_ack *extack);
|
||||||
void mlxsw_sp_port_bridge_leave(struct mlxsw_sp_port *mlxsw_sp_port,
|
void mlxsw_sp_port_bridge_leave(struct mlxsw_sp_port *mlxsw_sp_port,
|
||||||
struct net_device *brport_dev,
|
struct net_device *brport_dev,
|
||||||
struct net_device *br_dev);
|
struct net_device *br_dev);
|
||||||
|
|
|
@ -46,6 +46,7 @@
|
||||||
#include <linux/workqueue.h>
|
#include <linux/workqueue.h>
|
||||||
#include <linux/jiffies.h>
|
#include <linux/jiffies.h>
|
||||||
#include <linux/rtnetlink.h>
|
#include <linux/rtnetlink.h>
|
||||||
|
#include <linux/netlink.h>
|
||||||
#include <net/switchdev.h>
|
#include <net/switchdev.h>
|
||||||
|
|
||||||
#include "spectrum.h"
|
#include "spectrum.h"
|
||||||
|
@ -107,7 +108,8 @@ struct mlxsw_sp_bridge_vlan {
|
||||||
struct mlxsw_sp_bridge_ops {
|
struct mlxsw_sp_bridge_ops {
|
||||||
int (*port_join)(struct mlxsw_sp_bridge_device *bridge_device,
|
int (*port_join)(struct mlxsw_sp_bridge_device *bridge_device,
|
||||||
struct mlxsw_sp_bridge_port *bridge_port,
|
struct mlxsw_sp_bridge_port *bridge_port,
|
||||||
struct mlxsw_sp_port *mlxsw_sp_port);
|
struct mlxsw_sp_port *mlxsw_sp_port,
|
||||||
|
struct netlink_ext_ack *extack);
|
||||||
void (*port_leave)(struct mlxsw_sp_bridge_device *bridge_device,
|
void (*port_leave)(struct mlxsw_sp_bridge_device *bridge_device,
|
||||||
struct mlxsw_sp_bridge_port *bridge_port,
|
struct mlxsw_sp_bridge_port *bridge_port,
|
||||||
struct mlxsw_sp_port *mlxsw_sp_port);
|
struct mlxsw_sp_port *mlxsw_sp_port);
|
||||||
|
@ -1735,12 +1737,15 @@ static const struct switchdev_ops mlxsw_sp_port_switchdev_ops = {
|
||||||
static int
|
static int
|
||||||
mlxsw_sp_bridge_8021q_port_join(struct mlxsw_sp_bridge_device *bridge_device,
|
mlxsw_sp_bridge_8021q_port_join(struct mlxsw_sp_bridge_device *bridge_device,
|
||||||
struct mlxsw_sp_bridge_port *bridge_port,
|
struct mlxsw_sp_bridge_port *bridge_port,
|
||||||
struct mlxsw_sp_port *mlxsw_sp_port)
|
struct mlxsw_sp_port *mlxsw_sp_port,
|
||||||
|
struct netlink_ext_ack *extack)
|
||||||
{
|
{
|
||||||
struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
|
struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
|
||||||
|
|
||||||
if (is_vlan_dev(bridge_port->dev))
|
if (is_vlan_dev(bridge_port->dev)) {
|
||||||
|
NL_SET_ERR_MSG(extack, "spectrum: Can not enslave a VLAN device to a VLAN-aware bridge");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_find_by_vid(mlxsw_sp_port, 1);
|
mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_find_by_vid(mlxsw_sp_port, 1);
|
||||||
if (WARN_ON(!mlxsw_sp_port_vlan))
|
if (WARN_ON(!mlxsw_sp_port_vlan))
|
||||||
|
@ -1797,13 +1802,16 @@ mlxsw_sp_port_is_br_member(const struct mlxsw_sp_port *mlxsw_sp_port,
|
||||||
static int
|
static int
|
||||||
mlxsw_sp_bridge_8021d_port_join(struct mlxsw_sp_bridge_device *bridge_device,
|
mlxsw_sp_bridge_8021d_port_join(struct mlxsw_sp_bridge_device *bridge_device,
|
||||||
struct mlxsw_sp_bridge_port *bridge_port,
|
struct mlxsw_sp_bridge_port *bridge_port,
|
||||||
struct mlxsw_sp_port *mlxsw_sp_port)
|
struct mlxsw_sp_port *mlxsw_sp_port,
|
||||||
|
struct netlink_ext_ack *extack)
|
||||||
{
|
{
|
||||||
struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
|
struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
|
||||||
u16 vid;
|
u16 vid;
|
||||||
|
|
||||||
if (!is_vlan_dev(bridge_port->dev))
|
if (!is_vlan_dev(bridge_port->dev)) {
|
||||||
|
NL_SET_ERR_MSG(extack, "spectrum: Only VLAN devices can be enslaved to a VLAN-unaware bridge");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
}
|
||||||
vid = vlan_dev_vlan_id(bridge_port->dev);
|
vid = vlan_dev_vlan_id(bridge_port->dev);
|
||||||
|
|
||||||
mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_find_by_vid(mlxsw_sp_port, vid);
|
mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_find_by_vid(mlxsw_sp_port, vid);
|
||||||
|
@ -1811,7 +1819,7 @@ mlxsw_sp_bridge_8021d_port_join(struct mlxsw_sp_bridge_device *bridge_device,
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
if (mlxsw_sp_port_is_br_member(mlxsw_sp_port, bridge_device->dev)) {
|
if (mlxsw_sp_port_is_br_member(mlxsw_sp_port, bridge_device->dev)) {
|
||||||
netdev_err(mlxsw_sp_port->dev, "Can't bridge VLAN uppers of the same port\n");
|
NL_SET_ERR_MSG(extack, "spectrum: Can not bridge VLAN uppers of the same port");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1854,7 +1862,8 @@ static const struct mlxsw_sp_bridge_ops mlxsw_sp_bridge_8021d_ops = {
|
||||||
|
|
||||||
int mlxsw_sp_port_bridge_join(struct mlxsw_sp_port *mlxsw_sp_port,
|
int mlxsw_sp_port_bridge_join(struct mlxsw_sp_port *mlxsw_sp_port,
|
||||||
struct net_device *brport_dev,
|
struct net_device *brport_dev,
|
||||||
struct net_device *br_dev)
|
struct net_device *br_dev,
|
||||||
|
struct netlink_ext_ack *extack)
|
||||||
{
|
{
|
||||||
struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
|
struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
|
||||||
struct mlxsw_sp_bridge_device *bridge_device;
|
struct mlxsw_sp_bridge_device *bridge_device;
|
||||||
|
@ -1867,7 +1876,7 @@ int mlxsw_sp_port_bridge_join(struct mlxsw_sp_port *mlxsw_sp_port,
|
||||||
bridge_device = bridge_port->bridge_device;
|
bridge_device = bridge_port->bridge_device;
|
||||||
|
|
||||||
err = bridge_device->ops->port_join(bridge_device, bridge_port,
|
err = bridge_device->ops->port_join(bridge_device, bridge_port,
|
||||||
mlxsw_sp_port);
|
mlxsw_sp_port, extack);
|
||||||
if (err)
|
if (err)
|
||||||
goto err_port_join;
|
goto err_port_join;
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче