From: Vladimir Oltean <vladimir.oltean@nxp.com> To: netdev@vger.kernel.org, Jakub Kicinski <kuba@kernel.org>, "David S. Miller" <davem@davemloft.net> Cc: Andrew Lunn <andrew@lunn.ch>, Florian Fainelli <f.fainelli@gmail.com>, Vivien Didelot <vivien.didelot@gmail.com>, Jiri Pirko <jiri@resnulli.us>, Ido Schimmel <idosch@idosch.org>, Tobias Waldekranz <tobias@waldekranz.com>, Roopa Prabhu <roopa@nvidia.com>, Nikolay Aleksandrov <nikolay@nvidia.com>, Stephen Hemminger <stephen@networkplumber.org>, bridge@lists.linux-foundation.org, Grygorii Strashko <grygorii.strashko@ti.com>, Marek Behun <kabel@blackhole.sk>, DENG Qingfang <dqfext@gmail.com> Subject: [PATCH v4 net-next 03/15] mlxsw: spectrum: refactor prechangeupper sanity checks Date: Mon, 19 Jul 2021 00:44:22 +0300 [thread overview] Message-ID: <20210718214434.3938850-4-vladimir.oltean@nxp.com> (raw) In-Reply-To: <20210718214434.3938850-1-vladimir.oltean@nxp.com> Make more room for extra code in the NETDEV_PRECHANGEUPPER handlers from mlxsw by moving the existing sanity checks to 2 new dedicated functions. Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com> Reviewed-by: Florian Fainelli <f.fainelli@gmail.com> --- v2->v3: patch is new v3->v4: none .../net/ethernet/mellanox/mlxsw/spectrum.c | 272 +++++++++++------- 1 file changed, 169 insertions(+), 103 deletions(-) diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c index 88699e678544..c1b78878e5cf 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c @@ -4055,6 +4055,118 @@ static bool mlxsw_sp_bridge_vxlan_is_valid(struct net_device *br_dev, return true; } +static int +mlxsw_sp_prechangeupper_sanity_checks(struct mlxsw_sp *mlxsw_sp, + struct net_device *dev, + struct net_device *lower_dev, + struct net_device *upper_dev, + struct netdev_notifier_changeupper_info *info, + struct netlink_ext_ack *extack) +{ + u16 proto; + + if (!is_vlan_dev(upper_dev) && + !netif_is_lag_master(upper_dev) && + !netif_is_bridge_master(upper_dev) && + !netif_is_ovs_master(upper_dev) && + !netif_is_macvlan(upper_dev)) { + NL_SET_ERR_MSG_MOD(extack, "Unknown upper device type"); + return -EINVAL; + } + + if (!info->linking) + return 0; + + if (netif_is_bridge_master(upper_dev) && + !mlxsw_sp_bridge_device_is_offloaded(mlxsw_sp, upper_dev) && + mlxsw_sp_bridge_has_vxlan(upper_dev) && + !mlxsw_sp_bridge_vxlan_is_valid(upper_dev, extack)) + return -EOPNOTSUPP; + + if (netdev_has_any_upper_dev(upper_dev) && + (!netif_is_bridge_master(upper_dev) || + !mlxsw_sp_bridge_device_is_offloaded(mlxsw_sp, + upper_dev))) { + NL_SET_ERR_MSG_MOD(extack, + "Enslaving a port to a device that already has an upper device is not supported"); + return -EINVAL; + } + + if (netif_is_lag_master(upper_dev) && + !mlxsw_sp_master_lag_check(mlxsw_sp, upper_dev, + info->upper_info, extack)) + return -EINVAL; + + if (netif_is_lag_master(upper_dev) && vlan_uses_dev(dev)) { + NL_SET_ERR_MSG_MOD(extack, + "Master device is a LAG master and this device has a VLAN"); + return -EINVAL; + } + + if (netif_is_lag_port(dev) && is_vlan_dev(upper_dev) && + !netif_is_lag_master(vlan_dev_real_dev(upper_dev))) { + NL_SET_ERR_MSG_MOD(extack, "Can not put a VLAN on a LAG port"); + return -EINVAL; + } + + if (netif_is_macvlan(upper_dev) && + !mlxsw_sp_rif_exists(mlxsw_sp, lower_dev)) { + NL_SET_ERR_MSG_MOD(extack, + "macvlan is only supported on top of router interfaces"); + return -EOPNOTSUPP; + } + + if (netif_is_ovs_master(upper_dev) && vlan_uses_dev(dev)) { + NL_SET_ERR_MSG_MOD(extack, + "Master device is an OVS master and this device has a VLAN"); + return -EINVAL; + } + + if (netif_is_ovs_port(dev) && is_vlan_dev(upper_dev)) { + NL_SET_ERR_MSG_MOD(extack, "Can not put a VLAN on an OVS port"); + return -EINVAL; + } + + if (netif_is_bridge_master(upper_dev)) { + br_vlan_get_proto(upper_dev, &proto); + if (br_vlan_enabled(upper_dev) && + proto != ETH_P_8021Q && proto != ETH_P_8021AD) { + NL_SET_ERR_MSG_MOD(extack, + "Enslaving a port to a bridge with unknown VLAN protocol is not supported"); + return -EOPNOTSUPP; + } + if (vlan_uses_dev(lower_dev) && + br_vlan_enabled(upper_dev) && + proto == ETH_P_8021AD) { + NL_SET_ERR_MSG_MOD(extack, + "Enslaving a port that already has a VLAN upper to an 802.1ad bridge is not supported"); + return -EOPNOTSUPP; + } + } + + if (netif_is_bridge_port(lower_dev) && is_vlan_dev(upper_dev)) { + struct net_device *br_dev = netdev_master_upper_dev_get(lower_dev); + + if (br_vlan_enabled(br_dev)) { + br_vlan_get_proto(br_dev, &proto); + if (proto == ETH_P_8021AD) { + NL_SET_ERR_MSG_MOD(extack, + "VLAN uppers are not supported on a port enslaved to an 802.1ad bridge"); + return -EOPNOTSUPP; + } + } + } + + if (is_vlan_dev(upper_dev) && + ntohs(vlan_dev_vlan_proto(upper_dev)) != ETH_P_8021Q) { + NL_SET_ERR_MSG_MOD(extack, + "VLAN uppers are only supported with 802.1q VLAN protocol"); + return -EOPNOTSUPP; + } + + return 0; +} + static int mlxsw_sp_netdevice_port_upper_event(struct net_device *lower_dev, struct net_device *dev, unsigned long event, void *ptr) @@ -4065,7 +4177,6 @@ static int mlxsw_sp_netdevice_port_upper_event(struct net_device *lower_dev, struct net_device *upper_dev; struct mlxsw_sp *mlxsw_sp; int err = 0; - u16 proto; mlxsw_sp_port = netdev_priv(dev); mlxsw_sp = mlxsw_sp_port->mlxsw_sp; @@ -4075,84 +4186,15 @@ static int mlxsw_sp_netdevice_port_upper_event(struct net_device *lower_dev, switch (event) { case NETDEV_PRECHANGEUPPER: upper_dev = info->upper_dev; - if (!is_vlan_dev(upper_dev) && - !netif_is_lag_master(upper_dev) && - !netif_is_bridge_master(upper_dev) && - !netif_is_ovs_master(upper_dev) && - !netif_is_macvlan(upper_dev)) { - NL_SET_ERR_MSG_MOD(extack, "Unknown upper device type"); - return -EINVAL; - } - if (!info->linking) - break; - if (netif_is_bridge_master(upper_dev) && - !mlxsw_sp_bridge_device_is_offloaded(mlxsw_sp, upper_dev) && - mlxsw_sp_bridge_has_vxlan(upper_dev) && - !mlxsw_sp_bridge_vxlan_is_valid(upper_dev, extack)) - return -EOPNOTSUPP; - if (netdev_has_any_upper_dev(upper_dev) && - (!netif_is_bridge_master(upper_dev) || - !mlxsw_sp_bridge_device_is_offloaded(mlxsw_sp, - upper_dev))) { - NL_SET_ERR_MSG_MOD(extack, "Enslaving a port to a device that already has an upper device is not supported"); - return -EINVAL; - } - if (netif_is_lag_master(upper_dev) && - !mlxsw_sp_master_lag_check(mlxsw_sp, upper_dev, - info->upper_info, extack)) - return -EINVAL; - if (netif_is_lag_master(upper_dev) && vlan_uses_dev(dev)) { - NL_SET_ERR_MSG_MOD(extack, "Master device is a LAG master and this device has a VLAN"); - return -EINVAL; - } - if (netif_is_lag_port(dev) && is_vlan_dev(upper_dev) && - !netif_is_lag_master(vlan_dev_real_dev(upper_dev))) { - NL_SET_ERR_MSG_MOD(extack, "Can not put a VLAN on a LAG port"); - return -EINVAL; - } - if (netif_is_macvlan(upper_dev) && - !mlxsw_sp_rif_exists(mlxsw_sp, lower_dev)) { - NL_SET_ERR_MSG_MOD(extack, "macvlan is only supported on top of router interfaces"); - return -EOPNOTSUPP; - } - if (netif_is_ovs_master(upper_dev) && vlan_uses_dev(dev)) { - NL_SET_ERR_MSG_MOD(extack, "Master device is an OVS master and this device has a VLAN"); - return -EINVAL; - } - if (netif_is_ovs_port(dev) && is_vlan_dev(upper_dev)) { - NL_SET_ERR_MSG_MOD(extack, "Can not put a VLAN on an OVS port"); - return -EINVAL; - } - if (netif_is_bridge_master(upper_dev)) { - br_vlan_get_proto(upper_dev, &proto); - if (br_vlan_enabled(upper_dev) && - proto != ETH_P_8021Q && proto != ETH_P_8021AD) { - NL_SET_ERR_MSG_MOD(extack, "Enslaving a port to a bridge with unknown VLAN protocol is not supported"); - return -EOPNOTSUPP; - } - if (vlan_uses_dev(lower_dev) && - br_vlan_enabled(upper_dev) && - proto == ETH_P_8021AD) { - NL_SET_ERR_MSG_MOD(extack, "Enslaving a port that already has a VLAN upper to an 802.1ad bridge is not supported"); - return -EOPNOTSUPP; - } - } - if (netif_is_bridge_port(lower_dev) && is_vlan_dev(upper_dev)) { - struct net_device *br_dev = netdev_master_upper_dev_get(lower_dev); - - if (br_vlan_enabled(br_dev)) { - br_vlan_get_proto(br_dev, &proto); - if (proto == ETH_P_8021AD) { - NL_SET_ERR_MSG_MOD(extack, "VLAN uppers are not supported on a port enslaved to an 802.1ad bridge"); - return -EOPNOTSUPP; - } - } - } - if (is_vlan_dev(upper_dev) && - ntohs(vlan_dev_vlan_proto(upper_dev)) != ETH_P_8021Q) { - NL_SET_ERR_MSG_MOD(extack, "VLAN uppers are only supported with 802.1q VLAN protocol"); - return -EOPNOTSUPP; - } + + err = mlxsw_sp_prechangeupper_sanity_checks(mlxsw_sp, + dev, lower_dev, + upper_dev, + info, + extack); + if (err) + return err; + break; case NETDEV_CHANGEUPPER: upper_dev = info->upper_dev; @@ -4260,6 +4302,46 @@ static int mlxsw_sp_netdevice_lag_event(struct net_device *lag_dev, return 0; } +static int +mlxsw_sp_vlan_prechangeupper_sanity_checks(struct mlxsw_sp *mlxsw_sp, + struct net_device *vlan_dev, + struct net_device *upper_dev, + struct netdev_notifier_changeupper_info *info, + struct netlink_ext_ack *extack) +{ + if (!netif_is_bridge_master(upper_dev) && + !netif_is_macvlan(upper_dev)) { + NL_SET_ERR_MSG_MOD(extack, "Unknown upper device type"); + return -EINVAL; + } + + if (!info->linking) + return 0; + + if (netif_is_bridge_master(upper_dev) && + !mlxsw_sp_bridge_device_is_offloaded(mlxsw_sp, upper_dev) && + mlxsw_sp_bridge_has_vxlan(upper_dev) && + !mlxsw_sp_bridge_vxlan_is_valid(upper_dev, extack)) + return -EOPNOTSUPP; + + if (netdev_has_any_upper_dev(upper_dev) && + (!netif_is_bridge_master(upper_dev) || + !mlxsw_sp_bridge_device_is_offloaded(mlxsw_sp, + upper_dev))) { + NL_SET_ERR_MSG_MOD(extack, + "Enslaving a port to a device that already has an upper device is not supported"); + return -EINVAL; + } + + if (netif_is_macvlan(upper_dev) && + !mlxsw_sp_rif_exists(mlxsw_sp, vlan_dev)) { + NL_SET_ERR_MSG_MOD(extack, "macvlan is only supported on top of router interfaces"); + return -EOPNOTSUPP; + } + + return 0; +} + static int mlxsw_sp_netdevice_port_vlan_event(struct net_device *vlan_dev, struct net_device *dev, unsigned long event, void *ptr, @@ -4277,30 +4359,14 @@ static int mlxsw_sp_netdevice_port_vlan_event(struct net_device *vlan_dev, switch (event) { case NETDEV_PRECHANGEUPPER: upper_dev = info->upper_dev; - if (!netif_is_bridge_master(upper_dev) && - !netif_is_macvlan(upper_dev)) { - NL_SET_ERR_MSG_MOD(extack, "Unknown upper device type"); - return -EINVAL; - } - if (!info->linking) - break; - if (netif_is_bridge_master(upper_dev) && - !mlxsw_sp_bridge_device_is_offloaded(mlxsw_sp, upper_dev) && - mlxsw_sp_bridge_has_vxlan(upper_dev) && - !mlxsw_sp_bridge_vxlan_is_valid(upper_dev, extack)) - return -EOPNOTSUPP; - if (netdev_has_any_upper_dev(upper_dev) && - (!netif_is_bridge_master(upper_dev) || - !mlxsw_sp_bridge_device_is_offloaded(mlxsw_sp, - upper_dev))) { - NL_SET_ERR_MSG_MOD(extack, "Enslaving a port to a device that already has an upper device is not supported"); - return -EINVAL; - } - if (netif_is_macvlan(upper_dev) && - !mlxsw_sp_rif_exists(mlxsw_sp, vlan_dev)) { - NL_SET_ERR_MSG_MOD(extack, "macvlan is only supported on top of router interfaces"); - return -EOPNOTSUPP; - } + + err = mlxsw_sp_vlan_prechangeupper_sanity_checks(mlxsw_sp, + vlan_dev, + upper_dev, + info, extack); + if (err) + return err; + break; case NETDEV_CHANGEUPPER: upper_dev = info->upper_dev; -- 2.25.1
WARNING: multiple messages have this Message-ID (diff)
From: Vladimir Oltean <vladimir.oltean@nxp.com> To: netdev@vger.kernel.org, Jakub Kicinski <kuba@kernel.org>, "David S. Miller" <davem@davemloft.net> Cc: Andrew Lunn <andrew@lunn.ch>, Florian Fainelli <f.fainelli@gmail.com>, Jiri Pirko <jiri@resnulli.us>, DENG Qingfang <dqfext@gmail.com>, bridge@lists.linux-foundation.org, Ido Schimmel <idosch@idosch.org>, Grygorii Strashko <grygorii.strashko@ti.com>, Nikolay Aleksandrov <nikolay@nvidia.com>, Roopa Prabhu <roopa@nvidia.com>, Marek Behun <kabel@blackhole.sk>, Vivien Didelot <vivien.didelot@gmail.com>, Tobias Waldekranz <tobias@waldekranz.com> Subject: [Bridge] [PATCH v4 net-next 03/15] mlxsw: spectrum: refactor prechangeupper sanity checks Date: Mon, 19 Jul 2021 00:44:22 +0300 [thread overview] Message-ID: <20210718214434.3938850-4-vladimir.oltean@nxp.com> (raw) In-Reply-To: <20210718214434.3938850-1-vladimir.oltean@nxp.com> Make more room for extra code in the NETDEV_PRECHANGEUPPER handlers from mlxsw by moving the existing sanity checks to 2 new dedicated functions. Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com> Reviewed-by: Florian Fainelli <f.fainelli@gmail.com> --- v2->v3: patch is new v3->v4: none .../net/ethernet/mellanox/mlxsw/spectrum.c | 272 +++++++++++------- 1 file changed, 169 insertions(+), 103 deletions(-) diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c index 88699e678544..c1b78878e5cf 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c @@ -4055,6 +4055,118 @@ static bool mlxsw_sp_bridge_vxlan_is_valid(struct net_device *br_dev, return true; } +static int +mlxsw_sp_prechangeupper_sanity_checks(struct mlxsw_sp *mlxsw_sp, + struct net_device *dev, + struct net_device *lower_dev, + struct net_device *upper_dev, + struct netdev_notifier_changeupper_info *info, + struct netlink_ext_ack *extack) +{ + u16 proto; + + if (!is_vlan_dev(upper_dev) && + !netif_is_lag_master(upper_dev) && + !netif_is_bridge_master(upper_dev) && + !netif_is_ovs_master(upper_dev) && + !netif_is_macvlan(upper_dev)) { + NL_SET_ERR_MSG_MOD(extack, "Unknown upper device type"); + return -EINVAL; + } + + if (!info->linking) + return 0; + + if (netif_is_bridge_master(upper_dev) && + !mlxsw_sp_bridge_device_is_offloaded(mlxsw_sp, upper_dev) && + mlxsw_sp_bridge_has_vxlan(upper_dev) && + !mlxsw_sp_bridge_vxlan_is_valid(upper_dev, extack)) + return -EOPNOTSUPP; + + if (netdev_has_any_upper_dev(upper_dev) && + (!netif_is_bridge_master(upper_dev) || + !mlxsw_sp_bridge_device_is_offloaded(mlxsw_sp, + upper_dev))) { + NL_SET_ERR_MSG_MOD(extack, + "Enslaving a port to a device that already has an upper device is not supported"); + return -EINVAL; + } + + if (netif_is_lag_master(upper_dev) && + !mlxsw_sp_master_lag_check(mlxsw_sp, upper_dev, + info->upper_info, extack)) + return -EINVAL; + + if (netif_is_lag_master(upper_dev) && vlan_uses_dev(dev)) { + NL_SET_ERR_MSG_MOD(extack, + "Master device is a LAG master and this device has a VLAN"); + return -EINVAL; + } + + if (netif_is_lag_port(dev) && is_vlan_dev(upper_dev) && + !netif_is_lag_master(vlan_dev_real_dev(upper_dev))) { + NL_SET_ERR_MSG_MOD(extack, "Can not put a VLAN on a LAG port"); + return -EINVAL; + } + + if (netif_is_macvlan(upper_dev) && + !mlxsw_sp_rif_exists(mlxsw_sp, lower_dev)) { + NL_SET_ERR_MSG_MOD(extack, + "macvlan is only supported on top of router interfaces"); + return -EOPNOTSUPP; + } + + if (netif_is_ovs_master(upper_dev) && vlan_uses_dev(dev)) { + NL_SET_ERR_MSG_MOD(extack, + "Master device is an OVS master and this device has a VLAN"); + return -EINVAL; + } + + if (netif_is_ovs_port(dev) && is_vlan_dev(upper_dev)) { + NL_SET_ERR_MSG_MOD(extack, "Can not put a VLAN on an OVS port"); + return -EINVAL; + } + + if (netif_is_bridge_master(upper_dev)) { + br_vlan_get_proto(upper_dev, &proto); + if (br_vlan_enabled(upper_dev) && + proto != ETH_P_8021Q && proto != ETH_P_8021AD) { + NL_SET_ERR_MSG_MOD(extack, + "Enslaving a port to a bridge with unknown VLAN protocol is not supported"); + return -EOPNOTSUPP; + } + if (vlan_uses_dev(lower_dev) && + br_vlan_enabled(upper_dev) && + proto == ETH_P_8021AD) { + NL_SET_ERR_MSG_MOD(extack, + "Enslaving a port that already has a VLAN upper to an 802.1ad bridge is not supported"); + return -EOPNOTSUPP; + } + } + + if (netif_is_bridge_port(lower_dev) && is_vlan_dev(upper_dev)) { + struct net_device *br_dev = netdev_master_upper_dev_get(lower_dev); + + if (br_vlan_enabled(br_dev)) { + br_vlan_get_proto(br_dev, &proto); + if (proto == ETH_P_8021AD) { + NL_SET_ERR_MSG_MOD(extack, + "VLAN uppers are not supported on a port enslaved to an 802.1ad bridge"); + return -EOPNOTSUPP; + } + } + } + + if (is_vlan_dev(upper_dev) && + ntohs(vlan_dev_vlan_proto(upper_dev)) != ETH_P_8021Q) { + NL_SET_ERR_MSG_MOD(extack, + "VLAN uppers are only supported with 802.1q VLAN protocol"); + return -EOPNOTSUPP; + } + + return 0; +} + static int mlxsw_sp_netdevice_port_upper_event(struct net_device *lower_dev, struct net_device *dev, unsigned long event, void *ptr) @@ -4065,7 +4177,6 @@ static int mlxsw_sp_netdevice_port_upper_event(struct net_device *lower_dev, struct net_device *upper_dev; struct mlxsw_sp *mlxsw_sp; int err = 0; - u16 proto; mlxsw_sp_port = netdev_priv(dev); mlxsw_sp = mlxsw_sp_port->mlxsw_sp; @@ -4075,84 +4186,15 @@ static int mlxsw_sp_netdevice_port_upper_event(struct net_device *lower_dev, switch (event) { case NETDEV_PRECHANGEUPPER: upper_dev = info->upper_dev; - if (!is_vlan_dev(upper_dev) && - !netif_is_lag_master(upper_dev) && - !netif_is_bridge_master(upper_dev) && - !netif_is_ovs_master(upper_dev) && - !netif_is_macvlan(upper_dev)) { - NL_SET_ERR_MSG_MOD(extack, "Unknown upper device type"); - return -EINVAL; - } - if (!info->linking) - break; - if (netif_is_bridge_master(upper_dev) && - !mlxsw_sp_bridge_device_is_offloaded(mlxsw_sp, upper_dev) && - mlxsw_sp_bridge_has_vxlan(upper_dev) && - !mlxsw_sp_bridge_vxlan_is_valid(upper_dev, extack)) - return -EOPNOTSUPP; - if (netdev_has_any_upper_dev(upper_dev) && - (!netif_is_bridge_master(upper_dev) || - !mlxsw_sp_bridge_device_is_offloaded(mlxsw_sp, - upper_dev))) { - NL_SET_ERR_MSG_MOD(extack, "Enslaving a port to a device that already has an upper device is not supported"); - return -EINVAL; - } - if (netif_is_lag_master(upper_dev) && - !mlxsw_sp_master_lag_check(mlxsw_sp, upper_dev, - info->upper_info, extack)) - return -EINVAL; - if (netif_is_lag_master(upper_dev) && vlan_uses_dev(dev)) { - NL_SET_ERR_MSG_MOD(extack, "Master device is a LAG master and this device has a VLAN"); - return -EINVAL; - } - if (netif_is_lag_port(dev) && is_vlan_dev(upper_dev) && - !netif_is_lag_master(vlan_dev_real_dev(upper_dev))) { - NL_SET_ERR_MSG_MOD(extack, "Can not put a VLAN on a LAG port"); - return -EINVAL; - } - if (netif_is_macvlan(upper_dev) && - !mlxsw_sp_rif_exists(mlxsw_sp, lower_dev)) { - NL_SET_ERR_MSG_MOD(extack, "macvlan is only supported on top of router interfaces"); - return -EOPNOTSUPP; - } - if (netif_is_ovs_master(upper_dev) && vlan_uses_dev(dev)) { - NL_SET_ERR_MSG_MOD(extack, "Master device is an OVS master and this device has a VLAN"); - return -EINVAL; - } - if (netif_is_ovs_port(dev) && is_vlan_dev(upper_dev)) { - NL_SET_ERR_MSG_MOD(extack, "Can not put a VLAN on an OVS port"); - return -EINVAL; - } - if (netif_is_bridge_master(upper_dev)) { - br_vlan_get_proto(upper_dev, &proto); - if (br_vlan_enabled(upper_dev) && - proto != ETH_P_8021Q && proto != ETH_P_8021AD) { - NL_SET_ERR_MSG_MOD(extack, "Enslaving a port to a bridge with unknown VLAN protocol is not supported"); - return -EOPNOTSUPP; - } - if (vlan_uses_dev(lower_dev) && - br_vlan_enabled(upper_dev) && - proto == ETH_P_8021AD) { - NL_SET_ERR_MSG_MOD(extack, "Enslaving a port that already has a VLAN upper to an 802.1ad bridge is not supported"); - return -EOPNOTSUPP; - } - } - if (netif_is_bridge_port(lower_dev) && is_vlan_dev(upper_dev)) { - struct net_device *br_dev = netdev_master_upper_dev_get(lower_dev); - - if (br_vlan_enabled(br_dev)) { - br_vlan_get_proto(br_dev, &proto); - if (proto == ETH_P_8021AD) { - NL_SET_ERR_MSG_MOD(extack, "VLAN uppers are not supported on a port enslaved to an 802.1ad bridge"); - return -EOPNOTSUPP; - } - } - } - if (is_vlan_dev(upper_dev) && - ntohs(vlan_dev_vlan_proto(upper_dev)) != ETH_P_8021Q) { - NL_SET_ERR_MSG_MOD(extack, "VLAN uppers are only supported with 802.1q VLAN protocol"); - return -EOPNOTSUPP; - } + + err = mlxsw_sp_prechangeupper_sanity_checks(mlxsw_sp, + dev, lower_dev, + upper_dev, + info, + extack); + if (err) + return err; + break; case NETDEV_CHANGEUPPER: upper_dev = info->upper_dev; @@ -4260,6 +4302,46 @@ static int mlxsw_sp_netdevice_lag_event(struct net_device *lag_dev, return 0; } +static int +mlxsw_sp_vlan_prechangeupper_sanity_checks(struct mlxsw_sp *mlxsw_sp, + struct net_device *vlan_dev, + struct net_device *upper_dev, + struct netdev_notifier_changeupper_info *info, + struct netlink_ext_ack *extack) +{ + if (!netif_is_bridge_master(upper_dev) && + !netif_is_macvlan(upper_dev)) { + NL_SET_ERR_MSG_MOD(extack, "Unknown upper device type"); + return -EINVAL; + } + + if (!info->linking) + return 0; + + if (netif_is_bridge_master(upper_dev) && + !mlxsw_sp_bridge_device_is_offloaded(mlxsw_sp, upper_dev) && + mlxsw_sp_bridge_has_vxlan(upper_dev) && + !mlxsw_sp_bridge_vxlan_is_valid(upper_dev, extack)) + return -EOPNOTSUPP; + + if (netdev_has_any_upper_dev(upper_dev) && + (!netif_is_bridge_master(upper_dev) || + !mlxsw_sp_bridge_device_is_offloaded(mlxsw_sp, + upper_dev))) { + NL_SET_ERR_MSG_MOD(extack, + "Enslaving a port to a device that already has an upper device is not supported"); + return -EINVAL; + } + + if (netif_is_macvlan(upper_dev) && + !mlxsw_sp_rif_exists(mlxsw_sp, vlan_dev)) { + NL_SET_ERR_MSG_MOD(extack, "macvlan is only supported on top of router interfaces"); + return -EOPNOTSUPP; + } + + return 0; +} + static int mlxsw_sp_netdevice_port_vlan_event(struct net_device *vlan_dev, struct net_device *dev, unsigned long event, void *ptr, @@ -4277,30 +4359,14 @@ static int mlxsw_sp_netdevice_port_vlan_event(struct net_device *vlan_dev, switch (event) { case NETDEV_PRECHANGEUPPER: upper_dev = info->upper_dev; - if (!netif_is_bridge_master(upper_dev) && - !netif_is_macvlan(upper_dev)) { - NL_SET_ERR_MSG_MOD(extack, "Unknown upper device type"); - return -EINVAL; - } - if (!info->linking) - break; - if (netif_is_bridge_master(upper_dev) && - !mlxsw_sp_bridge_device_is_offloaded(mlxsw_sp, upper_dev) && - mlxsw_sp_bridge_has_vxlan(upper_dev) && - !mlxsw_sp_bridge_vxlan_is_valid(upper_dev, extack)) - return -EOPNOTSUPP; - if (netdev_has_any_upper_dev(upper_dev) && - (!netif_is_bridge_master(upper_dev) || - !mlxsw_sp_bridge_device_is_offloaded(mlxsw_sp, - upper_dev))) { - NL_SET_ERR_MSG_MOD(extack, "Enslaving a port to a device that already has an upper device is not supported"); - return -EINVAL; - } - if (netif_is_macvlan(upper_dev) && - !mlxsw_sp_rif_exists(mlxsw_sp, vlan_dev)) { - NL_SET_ERR_MSG_MOD(extack, "macvlan is only supported on top of router interfaces"); - return -EOPNOTSUPP; - } + + err = mlxsw_sp_vlan_prechangeupper_sanity_checks(mlxsw_sp, + vlan_dev, + upper_dev, + info, extack); + if (err) + return err; + break; case NETDEV_CHANGEUPPER: upper_dev = info->upper_dev; -- 2.25.1
next prev parent reply other threads:[~2021-07-18 21:46 UTC|newest] Thread overview: 74+ messages / expand[flat|nested] mbox.gz Atom feed top 2021-07-18 21:44 [PATCH v4 net-next 00/15] Allow forwarding for the software bridge data path to be offloaded to capable devices Vladimir Oltean 2021-07-18 21:44 ` [Bridge] " Vladimir Oltean 2021-07-18 21:44 ` [PATCH v4 net-next 01/15] net: dpaa2-switch: use extack in dpaa2_switch_port_bridge_join Vladimir Oltean 2021-07-18 21:44 ` [Bridge] " Vladimir Oltean 2021-07-19 9:17 ` Ioana Ciornei 2021-07-19 9:17 ` [Bridge] " Ioana Ciornei 2021-07-18 21:44 ` [PATCH v4 net-next 02/15] net: dpaa2-switch: refactor prechangeupper sanity checks Vladimir Oltean 2021-07-18 21:44 ` [Bridge] " Vladimir Oltean 2021-07-19 9:18 ` Ioana Ciornei 2021-07-19 9:18 ` [Bridge] " Ioana Ciornei 2021-07-18 21:44 ` Vladimir Oltean [this message] 2021-07-18 21:44 ` [Bridge] [PATCH v4 net-next 03/15] mlxsw: spectrum: " Vladimir Oltean 2021-07-18 21:44 ` [PATCH v4 net-next 04/15] mlxsw: spectrum: refactor leaving an 8021q upper that is a bridge port Vladimir Oltean 2021-07-18 21:44 ` [Bridge] " Vladimir Oltean 2021-07-19 2:16 ` Florian Fainelli 2021-07-19 2:16 ` [Bridge] " Florian Fainelli 2021-07-18 21:44 ` [PATCH v4 net-next 05/15] net: marvell: prestera: refactor prechangeupper sanity checks Vladimir Oltean 2021-07-18 21:44 ` [Bridge] " Vladimir Oltean 2021-07-19 2:20 ` Florian Fainelli 2021-07-19 2:20 ` [Bridge] " Florian Fainelli 2021-07-18 21:44 ` [PATCH v4 net-next 06/15] net: switchdev: guard drivers against multiple obj replays on same bridge port Vladimir Oltean 2021-07-18 21:44 ` [Bridge] " Vladimir Oltean 2021-07-19 2:17 ` Florian Fainelli 2021-07-19 2:17 ` [Bridge] " Florian Fainelli 2021-07-18 21:44 ` [PATCH v4 net-next 07/15] net: bridge: disambiguate offload_fwd_mark Vladimir Oltean 2021-07-18 21:44 ` [Bridge] " Vladimir Oltean 2021-07-19 2:26 ` Florian Fainelli 2021-07-19 2:26 ` [Bridge] " Florian Fainelli 2021-07-18 21:44 ` [PATCH v4 net-next 08/15] net: bridge: switchdev: recycle unused hwdoms Vladimir Oltean 2021-07-18 21:44 ` [Bridge] " Vladimir Oltean 2021-07-18 21:44 ` [PATCH v4 net-next 09/15] net: bridge: switchdev: let drivers inform which bridge ports are offloaded Vladimir Oltean 2021-07-18 21:44 ` [Bridge] " Vladimir Oltean 2021-07-19 9:23 ` Ioana Ciornei 2021-07-19 9:23 ` [Bridge] " Ioana Ciornei 2021-07-20 7:53 ` Horatiu Vultur 2021-07-20 7:53 ` [Bridge] " Horatiu Vultur 2021-07-20 8:45 ` Vladimir Oltean 2021-07-20 8:45 ` [Bridge] " Vladimir Oltean 2021-07-18 21:44 ` [PATCH v4 net-next 10/15] net: bridge: switchdev object replay helpers for everybody Vladimir Oltean 2021-07-18 21:44 ` [Bridge] " Vladimir Oltean 2021-07-19 8:19 ` Vladimir Oltean 2021-07-19 8:19 ` [Bridge] " Vladimir Oltean 2021-07-19 9:26 ` Ioana Ciornei 2021-07-19 9:26 ` [Bridge] " Ioana Ciornei 2021-07-18 21:44 ` [PATCH v4 net-next 11/15] net: bridge: switchdev: allow the TX data plane forwarding to be offloaded Vladimir Oltean 2021-07-18 21:44 ` [Bridge] " Vladimir Oltean 2021-07-19 2:43 ` Florian Fainelli 2021-07-19 2:43 ` [Bridge] " Florian Fainelli 2021-07-19 7:22 ` Vladimir Oltean 2021-07-19 7:22 ` [Bridge] " Vladimir Oltean 2021-07-18 21:44 ` [PATCH v4 net-next 12/15] net: dsa: track the number of switches in a tree Vladimir Oltean 2021-07-18 21:44 ` [Bridge] " Vladimir Oltean 2021-07-19 2:54 ` Florian Fainelli 2021-07-19 2:54 ` [Bridge] " Florian Fainelli 2021-07-18 21:44 ` [PATCH v4 net-next 13/15] net: dsa: add support for bridge TX forwarding offload Vladimir Oltean 2021-07-18 21:44 ` [Bridge] " Vladimir Oltean 2021-07-19 2:51 ` Florian Fainelli 2021-07-19 2:51 ` [Bridge] " Florian Fainelli 2021-07-18 21:44 ` [PATCH v4 net-next 14/15] net: dsa: mv88e6xxx: map virtual bridges with forwarding offload in the PVT Vladimir Oltean 2021-07-18 21:44 ` [Bridge] " Vladimir Oltean 2021-07-19 2:52 ` Florian Fainelli 2021-07-19 2:52 ` [Bridge] " Florian Fainelli 2021-07-18 21:44 ` [PATCH v4 net-next 15/15] net: dsa: tag_dsa: offload the bridge forwarding process Vladimir Oltean 2021-07-18 21:44 ` [Bridge] " Vladimir Oltean 2021-07-19 2:47 ` Florian Fainelli 2021-07-19 2:47 ` [Bridge] " Florian Fainelli 2021-07-19 7:41 ` Vladimir Oltean 2021-07-19 7:41 ` [Bridge] " Vladimir Oltean 2021-07-20 11:24 ` [PATCH v4 net-next 00/15] Allow forwarding for the software bridge data path to be offloaded to capable devices Ido Schimmel 2021-07-20 11:24 ` [Bridge] " Ido Schimmel 2021-07-20 13:20 ` Vladimir Oltean 2021-07-20 13:20 ` [Bridge] " Vladimir Oltean 2021-07-20 13:51 ` Ido Schimmel 2021-07-20 13:51 ` [Bridge] " Ido Schimmel
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20210718214434.3938850-4-vladimir.oltean@nxp.com \ --to=vladimir.oltean@nxp.com \ --cc=andrew@lunn.ch \ --cc=bridge@lists.linux-foundation.org \ --cc=davem@davemloft.net \ --cc=dqfext@gmail.com \ --cc=f.fainelli@gmail.com \ --cc=grygorii.strashko@ti.com \ --cc=idosch@idosch.org \ --cc=jiri@resnulli.us \ --cc=kabel@blackhole.sk \ --cc=kuba@kernel.org \ --cc=netdev@vger.kernel.org \ --cc=nikolay@nvidia.com \ --cc=roopa@nvidia.com \ --cc=stephen@networkplumber.org \ --cc=tobias@waldekranz.com \ --cc=vivien.didelot@gmail.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.