diff options
author | David S. Miller <davem@davemloft.net> | 2019-01-08 16:53:54 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2019-01-08 16:53:54 -0500 |
commit | 4314b1f68a3f655f75010ab04bb57419eab34ec3 (patch) | |
tree | fe5a8b3696d70ad745720c40bcd999500c235a68 | |
parent | 11287b693d03830010356339e4ceddf47dee34fa (diff) | |
parent | 4fabf3bf93a194c7fa5288da3e0af37e4b943cf3 (diff) |
Merge branch 'mlxsw-fixes'
Daniel Borkmann says:
====================
pull-request: bpf 2019-01-08
The following pull-request contains BPF updates for your *net* tree.
The main changes are:
1) Fix BSD'ism in sendmsg(2) to rewrite unspecified IPv6 dst for
unconnected UDP sockets with [::1] _after_ cgroup BPF invocation,
from Andrey.
2) Follow-up fix to the speculation fix where we need to reject a
corner case for sanitation when ptr and scalars are mixed in the
same alu op. Also, some unrelated minor doc fixes, from Daniel.
3) Fix BPF kselftest's incorrect uses of create_and_get_cgroup()
by not assuming fd of zero value to be the result of an error
case, from Stanislav.
====================
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/ethernet/mellanox/mlxsw/Kconfig | 1 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlxsw/spectrum.c | 7 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_ctcam.c | 10 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_erp.c | 2 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c | 4 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c | 23 | ||||
-rw-r--r-- | net/bridge/br_private.h | 1 | ||||
-rw-r--r-- | net/bridge/br_vlan.c | 26 | ||||
-rwxr-xr-x | tools/testing/selftests/drivers/net/mlxsw/vxlan.sh | 18 | ||||
-rwxr-xr-x | tools/testing/selftests/net/forwarding/bridge_vlan_aware.sh | 15 | ||||
-rwxr-xr-x | tools/testing/selftests/net/forwarding/vxlan_bridge_1d.sh | 2 |
11 files changed, 74 insertions, 35 deletions
diff --git a/drivers/net/ethernet/mellanox/mlxsw/Kconfig b/drivers/net/ethernet/mellanox/mlxsw/Kconfig index 080ddd1942ec..b9a25aed5d11 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/Kconfig +++ b/drivers/net/ethernet/mellanox/mlxsw/Kconfig | |||
@@ -78,6 +78,7 @@ config MLXSW_SPECTRUM | |||
78 | depends on IPV6 || IPV6=n | 78 | depends on IPV6 || IPV6=n |
79 | depends on NET_IPGRE || NET_IPGRE=n | 79 | depends on NET_IPGRE || NET_IPGRE=n |
80 | depends on IPV6_GRE || IPV6_GRE=n | 80 | depends on IPV6_GRE || IPV6_GRE=n |
81 | depends on VXLAN || VXLAN=n | ||
81 | select GENERIC_ALLOCATOR | 82 | select GENERIC_ALLOCATOR |
82 | select PARMAN | 83 | select PARMAN |
83 | select OBJAGG | 84 | select OBJAGG |
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c index eed1045e4d96..32519c93df17 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c | |||
@@ -5005,12 +5005,15 @@ static int mlxsw_sp_netdevice_port_upper_event(struct net_device *lower_dev, | |||
5005 | lower_dev, | 5005 | lower_dev, |
5006 | upper_dev); | 5006 | upper_dev); |
5007 | } else if (netif_is_lag_master(upper_dev)) { | 5007 | } else if (netif_is_lag_master(upper_dev)) { |
5008 | if (info->linking) | 5008 | if (info->linking) { |
5009 | err = mlxsw_sp_port_lag_join(mlxsw_sp_port, | 5009 | err = mlxsw_sp_port_lag_join(mlxsw_sp_port, |
5010 | upper_dev); | 5010 | upper_dev); |
5011 | else | 5011 | } else { |
5012 | mlxsw_sp_port_lag_tx_en_set(mlxsw_sp_port, | ||
5013 | false); | ||
5012 | mlxsw_sp_port_lag_leave(mlxsw_sp_port, | 5014 | mlxsw_sp_port_lag_leave(mlxsw_sp_port, |
5013 | upper_dev); | 5015 | upper_dev); |
5016 | } | ||
5014 | } else if (netif_is_ovs_master(upper_dev)) { | 5017 | } else if (netif_is_ovs_master(upper_dev)) { |
5015 | if (info->linking) | 5018 | if (info->linking) |
5016 | err = mlxsw_sp_port_ovs_join(mlxsw_sp_port); | 5019 | err = mlxsw_sp_port_ovs_join(mlxsw_sp_port); |
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_ctcam.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_ctcam.c index b0f2d8e8ded0..ac222833a5cf 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_ctcam.c +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_ctcam.c | |||
@@ -72,7 +72,15 @@ mlxsw_sp_acl_ctcam_region_entry_insert(struct mlxsw_sp *mlxsw_sp, | |||
72 | act_set = mlxsw_afa_block_first_set(rulei->act_block); | 72 | act_set = mlxsw_afa_block_first_set(rulei->act_block); |
73 | mlxsw_reg_ptce2_flex_action_set_memcpy_to(ptce2_pl, act_set); | 73 | mlxsw_reg_ptce2_flex_action_set_memcpy_to(ptce2_pl, act_set); |
74 | 74 | ||
75 | return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(ptce2), ptce2_pl); | 75 | err = mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(ptce2), ptce2_pl); |
76 | if (err) | ||
77 | goto err_ptce2_write; | ||
78 | |||
79 | return 0; | ||
80 | |||
81 | err_ptce2_write: | ||
82 | cregion->ops->entry_remove(cregion, centry); | ||
83 | return err; | ||
76 | } | 84 | } |
77 | 85 | ||
78 | static void | 86 | static void |
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_erp.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_erp.c index 1c19feefa5f2..2941967e1cc5 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_erp.c +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_erp.c | |||
@@ -1022,7 +1022,6 @@ void mlxsw_sp_acl_erp_mask_put(struct mlxsw_sp_acl_atcam_region *aregion, | |||
1022 | { | 1022 | { |
1023 | struct objagg_obj *objagg_obj = (struct objagg_obj *) erp_mask; | 1023 | struct objagg_obj *objagg_obj = (struct objagg_obj *) erp_mask; |
1024 | 1024 | ||
1025 | ASSERT_RTNL(); | ||
1026 | objagg_obj_put(aregion->erp_table->objagg, objagg_obj); | 1025 | objagg_obj_put(aregion->erp_table->objagg, objagg_obj); |
1027 | } | 1026 | } |
1028 | 1027 | ||
@@ -1054,7 +1053,6 @@ void mlxsw_sp_acl_erp_bf_remove(struct mlxsw_sp *mlxsw_sp, | |||
1054 | const struct mlxsw_sp_acl_erp *erp = objagg_obj_root_priv(objagg_obj); | 1053 | const struct mlxsw_sp_acl_erp *erp = objagg_obj_root_priv(objagg_obj); |
1055 | unsigned int erp_bank; | 1054 | unsigned int erp_bank; |
1056 | 1055 | ||
1057 | ASSERT_RTNL(); | ||
1058 | if (!mlxsw_sp_acl_erp_table_is_used(erp->erp_table)) | 1056 | if (!mlxsw_sp_acl_erp_table_is_used(erp->erp_table)) |
1059 | return; | 1057 | return; |
1060 | 1058 | ||
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c index 0a31fff2516e..fb1c48c698f2 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c | |||
@@ -816,14 +816,14 @@ int mlxsw_sp_nve_fid_enable(struct mlxsw_sp *mlxsw_sp, struct mlxsw_sp_fid *fid, | |||
816 | ops = nve->nve_ops_arr[params->type]; | 816 | ops = nve->nve_ops_arr[params->type]; |
817 | 817 | ||
818 | if (!ops->can_offload(nve, params->dev, extack)) | 818 | if (!ops->can_offload(nve, params->dev, extack)) |
819 | return -EOPNOTSUPP; | 819 | return -EINVAL; |
820 | 820 | ||
821 | memset(&config, 0, sizeof(config)); | 821 | memset(&config, 0, sizeof(config)); |
822 | ops->nve_config(nve, params->dev, &config); | 822 | ops->nve_config(nve, params->dev, &config); |
823 | if (nve->num_nve_tunnels && | 823 | if (nve->num_nve_tunnels && |
824 | memcmp(&config, &nve->config, sizeof(config))) { | 824 | memcmp(&config, &nve->config, sizeof(config))) { |
825 | NL_SET_ERR_MSG_MOD(extack, "Conflicting NVE tunnels configuration"); | 825 | NL_SET_ERR_MSG_MOD(extack, "Conflicting NVE tunnels configuration"); |
826 | return -EOPNOTSUPP; | 826 | return -EINVAL; |
827 | } | 827 | } |
828 | 828 | ||
829 | err = mlxsw_sp_nve_tunnel_init(mlxsw_sp, &config); | 829 | err = mlxsw_sp_nve_tunnel_init(mlxsw_sp, &config); |
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c index 1bd2c6e15f8d..0abbaa0fbf14 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c | |||
@@ -1078,8 +1078,7 @@ static int | |||
1078 | mlxsw_sp_bridge_port_vlan_add(struct mlxsw_sp_port *mlxsw_sp_port, | 1078 | mlxsw_sp_bridge_port_vlan_add(struct mlxsw_sp_port *mlxsw_sp_port, |
1079 | struct mlxsw_sp_bridge_port *bridge_port, | 1079 | struct mlxsw_sp_bridge_port *bridge_port, |
1080 | u16 vid, bool is_untagged, bool is_pvid, | 1080 | u16 vid, bool is_untagged, bool is_pvid, |
1081 | struct netlink_ext_ack *extack, | 1081 | struct netlink_ext_ack *extack) |
1082 | struct switchdev_trans *trans) | ||
1083 | { | 1082 | { |
1084 | u16 pvid = mlxsw_sp_port_pvid_determine(mlxsw_sp_port, vid, is_pvid); | 1083 | u16 pvid = mlxsw_sp_port_pvid_determine(mlxsw_sp_port, vid, is_pvid); |
1085 | struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan; | 1084 | struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan; |
@@ -1095,9 +1094,6 @@ mlxsw_sp_bridge_port_vlan_add(struct mlxsw_sp_port *mlxsw_sp_port, | |||
1095 | mlxsw_sp_port_vlan->bridge_port != bridge_port) | 1094 | mlxsw_sp_port_vlan->bridge_port != bridge_port) |
1096 | return -EEXIST; | 1095 | return -EEXIST; |
1097 | 1096 | ||
1098 | if (switchdev_trans_ph_prepare(trans)) | ||
1099 | return 0; | ||
1100 | |||
1101 | if (!mlxsw_sp_port_vlan) { | 1097 | if (!mlxsw_sp_port_vlan) { |
1102 | mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_create(mlxsw_sp_port, | 1098 | mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_create(mlxsw_sp_port, |
1103 | vid); | 1099 | vid); |
@@ -1188,6 +1184,9 @@ static int mlxsw_sp_port_vlans_add(struct mlxsw_sp_port *mlxsw_sp_port, | |||
1188 | return err; | 1184 | return err; |
1189 | } | 1185 | } |
1190 | 1186 | ||
1187 | if (switchdev_trans_ph_commit(trans)) | ||
1188 | return 0; | ||
1189 | |||
1191 | bridge_port = mlxsw_sp_bridge_port_find(mlxsw_sp->bridge, orig_dev); | 1190 | bridge_port = mlxsw_sp_bridge_port_find(mlxsw_sp->bridge, orig_dev); |
1192 | if (WARN_ON(!bridge_port)) | 1191 | if (WARN_ON(!bridge_port)) |
1193 | return -EINVAL; | 1192 | return -EINVAL; |
@@ -1200,7 +1199,7 @@ static int mlxsw_sp_port_vlans_add(struct mlxsw_sp_port *mlxsw_sp_port, | |||
1200 | 1199 | ||
1201 | err = mlxsw_sp_bridge_port_vlan_add(mlxsw_sp_port, bridge_port, | 1200 | err = mlxsw_sp_bridge_port_vlan_add(mlxsw_sp_port, bridge_port, |
1202 | vid, flag_untagged, | 1201 | vid, flag_untagged, |
1203 | flag_pvid, extack, trans); | 1202 | flag_pvid, extack); |
1204 | if (err) | 1203 | if (err) |
1205 | return err; | 1204 | return err; |
1206 | } | 1205 | } |
@@ -1808,7 +1807,7 @@ static void | |||
1808 | mlxsw_sp_bridge_port_vlan_del(struct mlxsw_sp_port *mlxsw_sp_port, | 1807 | mlxsw_sp_bridge_port_vlan_del(struct mlxsw_sp_port *mlxsw_sp_port, |
1809 | struct mlxsw_sp_bridge_port *bridge_port, u16 vid) | 1808 | struct mlxsw_sp_bridge_port *bridge_port, u16 vid) |
1810 | { | 1809 | { |
1811 | u16 pvid = mlxsw_sp_port->pvid == vid ? 0 : vid; | 1810 | u16 pvid = mlxsw_sp_port->pvid == vid ? 0 : mlxsw_sp_port->pvid; |
1812 | struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan; | 1811 | struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan; |
1813 | 1812 | ||
1814 | mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_find_by_vid(mlxsw_sp_port, vid); | 1813 | mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_find_by_vid(mlxsw_sp_port, vid); |
@@ -3207,7 +3206,6 @@ mlxsw_sp_switchdev_vxlan_vlan_add(struct mlxsw_sp *mlxsw_sp, | |||
3207 | struct mlxsw_sp_bridge_device *bridge_device, | 3206 | struct mlxsw_sp_bridge_device *bridge_device, |
3208 | const struct net_device *vxlan_dev, u16 vid, | 3207 | const struct net_device *vxlan_dev, u16 vid, |
3209 | bool flag_untagged, bool flag_pvid, | 3208 | bool flag_untagged, bool flag_pvid, |
3210 | struct switchdev_trans *trans, | ||
3211 | struct netlink_ext_ack *extack) | 3209 | struct netlink_ext_ack *extack) |
3212 | { | 3210 | { |
3213 | struct vxlan_dev *vxlan = netdev_priv(vxlan_dev); | 3211 | struct vxlan_dev *vxlan = netdev_priv(vxlan_dev); |
@@ -3225,9 +3223,6 @@ mlxsw_sp_switchdev_vxlan_vlan_add(struct mlxsw_sp *mlxsw_sp, | |||
3225 | mlxsw_sp_bridge_8021q_vxlan_dev_find(bridge_device->dev, vid)) | 3223 | mlxsw_sp_bridge_8021q_vxlan_dev_find(bridge_device->dev, vid)) |
3226 | return -EINVAL; | 3224 | return -EINVAL; |
3227 | 3225 | ||
3228 | if (switchdev_trans_ph_prepare(trans)) | ||
3229 | return 0; | ||
3230 | |||
3231 | if (!netif_running(vxlan_dev)) | 3226 | if (!netif_running(vxlan_dev)) |
3232 | return 0; | 3227 | return 0; |
3233 | 3228 | ||
@@ -3345,6 +3340,9 @@ mlxsw_sp_switchdev_vxlan_vlans_add(struct net_device *vxlan_dev, | |||
3345 | 3340 | ||
3346 | port_obj_info->handled = true; | 3341 | port_obj_info->handled = true; |
3347 | 3342 | ||
3343 | if (switchdev_trans_ph_commit(trans)) | ||
3344 | return 0; | ||
3345 | |||
3348 | bridge_device = mlxsw_sp_bridge_device_find(mlxsw_sp->bridge, br_dev); | 3346 | bridge_device = mlxsw_sp_bridge_device_find(mlxsw_sp->bridge, br_dev); |
3349 | if (!bridge_device) | 3347 | if (!bridge_device) |
3350 | return -EINVAL; | 3348 | return -EINVAL; |
@@ -3358,8 +3356,7 @@ mlxsw_sp_switchdev_vxlan_vlans_add(struct net_device *vxlan_dev, | |||
3358 | err = mlxsw_sp_switchdev_vxlan_vlan_add(mlxsw_sp, bridge_device, | 3356 | err = mlxsw_sp_switchdev_vxlan_vlan_add(mlxsw_sp, bridge_device, |
3359 | vxlan_dev, vid, | 3357 | vxlan_dev, vid, |
3360 | flag_untagged, | 3358 | flag_untagged, |
3361 | flag_pvid, trans, | 3359 | flag_pvid, extack); |
3362 | extack); | ||
3363 | if (err) | 3360 | if (err) |
3364 | return err; | 3361 | return err; |
3365 | } | 3362 | } |
diff --git a/net/bridge/br_private.h b/net/bridge/br_private.h index d240b3e7919f..eabf8bf28a3f 100644 --- a/net/bridge/br_private.h +++ b/net/bridge/br_private.h | |||
@@ -107,6 +107,7 @@ struct br_tunnel_info { | |||
107 | /* private vlan flags */ | 107 | /* private vlan flags */ |
108 | enum { | 108 | enum { |
109 | BR_VLFLAG_PER_PORT_STATS = BIT(0), | 109 | BR_VLFLAG_PER_PORT_STATS = BIT(0), |
110 | BR_VLFLAG_ADDED_BY_SWITCHDEV = BIT(1), | ||
110 | }; | 111 | }; |
111 | 112 | ||
112 | /** | 113 | /** |
diff --git a/net/bridge/br_vlan.c b/net/bridge/br_vlan.c index 4a2f31157ef5..96abf8feb9dc 100644 --- a/net/bridge/br_vlan.c +++ b/net/bridge/br_vlan.c | |||
@@ -80,16 +80,18 @@ 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, struct netlink_ext_ack *extack) | 83 | struct net_bridge_vlan *v, u16 flags, |
84 | struct netlink_ext_ack *extack) | ||
84 | { | 85 | { |
85 | int err; | 86 | int err; |
86 | 87 | ||
87 | /* Try switchdev op first. In case it is not supported, fallback to | 88 | /* Try switchdev op first. In case it is not supported, fallback to |
88 | * 8021q add. | 89 | * 8021q add. |
89 | */ | 90 | */ |
90 | err = br_switchdev_port_vlan_add(dev, vid, flags, extack); | 91 | err = br_switchdev_port_vlan_add(dev, v->vid, flags, extack); |
91 | if (err == -EOPNOTSUPP) | 92 | if (err == -EOPNOTSUPP) |
92 | return vlan_vid_add(dev, br->vlan_proto, vid); | 93 | return vlan_vid_add(dev, br->vlan_proto, v->vid); |
94 | v->priv_flags |= BR_VLFLAG_ADDED_BY_SWITCHDEV; | ||
93 | return err; | 95 | return err; |
94 | } | 96 | } |
95 | 97 | ||
@@ -121,19 +123,17 @@ static void __vlan_del_list(struct net_bridge_vlan *v) | |||
121 | } | 123 | } |
122 | 124 | ||
123 | static int __vlan_vid_del(struct net_device *dev, struct net_bridge *br, | 125 | static int __vlan_vid_del(struct net_device *dev, struct net_bridge *br, |
124 | u16 vid) | 126 | const struct net_bridge_vlan *v) |
125 | { | 127 | { |
126 | int err; | 128 | int err; |
127 | 129 | ||
128 | /* Try switchdev op first. In case it is not supported, fallback to | 130 | /* Try switchdev op first. In case it is not supported, fallback to |
129 | * 8021q del. | 131 | * 8021q del. |
130 | */ | 132 | */ |
131 | err = br_switchdev_port_vlan_del(dev, vid); | 133 | err = br_switchdev_port_vlan_del(dev, v->vid); |
132 | if (err == -EOPNOTSUPP) { | 134 | if (!(v->priv_flags & BR_VLFLAG_ADDED_BY_SWITCHDEV)) |
133 | vlan_vid_del(dev, br->vlan_proto, vid); | 135 | vlan_vid_del(dev, br->vlan_proto, v->vid); |
134 | return 0; | 136 | return err == -EOPNOTSUPP ? 0 : err; |
135 | } | ||
136 | return err; | ||
137 | } | 137 | } |
138 | 138 | ||
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 |
@@ -242,7 +242,7 @@ static int __vlan_add(struct net_bridge_vlan *v, u16 flags, | |||
242 | * This ensures tagged traffic enters the bridge when | 242 | * This ensures tagged traffic enters the bridge when |
243 | * promiscuous mode is disabled by br_manage_promisc(). | 243 | * promiscuous mode is disabled by br_manage_promisc(). |
244 | */ | 244 | */ |
245 | err = __vlan_vid_add(dev, br, v->vid, flags, extack); | 245 | err = __vlan_vid_add(dev, br, v, flags, extack); |
246 | if (err) | 246 | if (err) |
247 | goto out; | 247 | goto out; |
248 | 248 | ||
@@ -305,7 +305,7 @@ out_fdb_insert: | |||
305 | 305 | ||
306 | out_filt: | 306 | out_filt: |
307 | if (p) { | 307 | if (p) { |
308 | __vlan_vid_del(dev, br, v->vid); | 308 | __vlan_vid_del(dev, br, v); |
309 | if (masterv) { | 309 | if (masterv) { |
310 | if (v->stats && masterv->stats != v->stats) | 310 | if (v->stats && masterv->stats != v->stats) |
311 | free_percpu(v->stats); | 311 | free_percpu(v->stats); |
@@ -338,7 +338,7 @@ static int __vlan_del(struct net_bridge_vlan *v) | |||
338 | 338 | ||
339 | __vlan_delete_pvid(vg, v->vid); | 339 | __vlan_delete_pvid(vg, v->vid); |
340 | if (p) { | 340 | if (p) { |
341 | err = __vlan_vid_del(p->dev, p->br, v->vid); | 341 | err = __vlan_vid_del(p->dev, p->br, v); |
342 | if (err) | 342 | if (err) |
343 | goto out; | 343 | goto out; |
344 | } else { | 344 | } else { |
diff --git a/tools/testing/selftests/drivers/net/mlxsw/vxlan.sh b/tools/testing/selftests/drivers/net/mlxsw/vxlan.sh index dcf9f4e913e0..ae6146ec5afd 100755 --- a/tools/testing/selftests/drivers/net/mlxsw/vxlan.sh +++ b/tools/testing/selftests/drivers/net/mlxsw/vxlan.sh | |||
@@ -847,6 +847,24 @@ sanitization_vlan_aware_test() | |||
847 | 847 | ||
848 | log_test "vlan-aware - failed enslavement to vlan-aware bridge" | 848 | log_test "vlan-aware - failed enslavement to vlan-aware bridge" |
849 | 849 | ||
850 | bridge vlan del vid 10 dev vxlan20 | ||
851 | bridge vlan add vid 20 dev vxlan20 pvid untagged | ||
852 | |||
853 | # Test that offloading of an unsupported tunnel fails when it is | ||
854 | # triggered by addition of VLAN to a local port | ||
855 | RET=0 | ||
856 | |||
857 | # TOS must be set to inherit | ||
858 | ip link set dev vxlan10 type vxlan tos 42 | ||
859 | |||
860 | ip link set dev $swp1 master br0 | ||
861 | bridge vlan add vid 10 dev $swp1 &> /dev/null | ||
862 | check_fail $? | ||
863 | |||
864 | log_test "vlan-aware - failed vlan addition to a local port" | ||
865 | |||
866 | ip link set dev vxlan10 type vxlan tos inherit | ||
867 | |||
850 | ip link del dev vxlan20 | 868 | ip link del dev vxlan20 |
851 | ip link del dev vxlan10 | 869 | ip link del dev vxlan10 |
852 | ip link del dev br0 | 870 | ip link del dev br0 |
diff --git a/tools/testing/selftests/net/forwarding/bridge_vlan_aware.sh b/tools/testing/selftests/net/forwarding/bridge_vlan_aware.sh index d8313d0438b7..04c6431b2bd8 100755 --- a/tools/testing/selftests/net/forwarding/bridge_vlan_aware.sh +++ b/tools/testing/selftests/net/forwarding/bridge_vlan_aware.sh | |||
@@ -1,7 +1,7 @@ | |||
1 | #!/bin/bash | 1 | #!/bin/bash |
2 | # SPDX-License-Identifier: GPL-2.0 | 2 | # SPDX-License-Identifier: GPL-2.0 |
3 | 3 | ||
4 | ALL_TESTS="ping_ipv4 ping_ipv6 learning flooding" | 4 | ALL_TESTS="ping_ipv4 ping_ipv6 learning flooding vlan_deletion" |
5 | NUM_NETIFS=4 | 5 | NUM_NETIFS=4 |
6 | CHECK_TC="yes" | 6 | CHECK_TC="yes" |
7 | source lib.sh | 7 | source lib.sh |
@@ -96,6 +96,19 @@ flooding() | |||
96 | flood_test $swp2 $h1 $h2 | 96 | flood_test $swp2 $h1 $h2 |
97 | } | 97 | } |
98 | 98 | ||
99 | vlan_deletion() | ||
100 | { | ||
101 | # Test that the deletion of a VLAN on a bridge port does not affect | ||
102 | # the PVID VLAN | ||
103 | log_info "Add and delete a VLAN on bridge port $swp1" | ||
104 | |||
105 | bridge vlan add vid 10 dev $swp1 | ||
106 | bridge vlan del vid 10 dev $swp1 | ||
107 | |||
108 | ping_ipv4 | ||
109 | ping_ipv6 | ||
110 | } | ||
111 | |||
99 | trap cleanup EXIT | 112 | trap cleanup EXIT |
100 | 113 | ||
101 | setup_prepare | 114 | setup_prepare |
diff --git a/tools/testing/selftests/net/forwarding/vxlan_bridge_1d.sh b/tools/testing/selftests/net/forwarding/vxlan_bridge_1d.sh index 56cef3b1c194..bb10e33690b2 100755 --- a/tools/testing/selftests/net/forwarding/vxlan_bridge_1d.sh +++ b/tools/testing/selftests/net/forwarding/vxlan_bridge_1d.sh | |||
@@ -629,7 +629,7 @@ __test_ecn_decap() | |||
629 | RET=0 | 629 | RET=0 |
630 | 630 | ||
631 | tc filter add dev $h1 ingress pref 77 prot ip \ | 631 | tc filter add dev $h1 ingress pref 77 prot ip \ |
632 | flower ip_tos $decapped_tos action pass | 632 | flower ip_tos $decapped_tos action drop |
633 | sleep 1 | 633 | sleep 1 |
634 | vxlan_encapped_ping_test v2 v1 192.0.2.17 \ | 634 | vxlan_encapped_ping_test v2 v1 192.0.2.17 \ |
635 | $orig_inner_tos $orig_outer_tos \ | 635 | $orig_inner_tos $orig_outer_tos \ |