]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
net/mlx5: Bridge, extract VLAN pop code to dedicated functions
authorVlad Buslov <vladbu@nvidia.com>
Thu, 2 Sep 2021 08:12:16 +0000 (11:12 +0300)
committerSaeed Mahameed <saeedm@nvidia.com>
Tue, 5 Oct 2021 01:10:56 +0000 (18:10 -0700)
Following patches in series need to pop VLAN when packet misses on egress.
To reuse existing bridge VLAN pop handling code, extract it to dedicated
helpers mlx5_esw_bridge_pkt_reformat_vlan_pop_supported() and
mlx5_esw_bridge_pkt_reformat_vlan_pop_create().

Signed-off-by: Vlad Buslov <vladbu@nvidia.com>
Reviewed-by: Paul Blakey <paulb@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
drivers/net/ethernet/mellanox/mlx5/core/esw/bridge.c

index 6a36c5aef74c140c7e0855e502cc40759a0a3e35..8361dfc0bf1af0779e18e6344d41edb4ba786edb 100644 (file)
@@ -86,6 +86,26 @@ mlx5_esw_bridge_fdb_del_notify(struct mlx5_esw_bridge_fdb_entry *entry)
                                                   SWITCHDEV_FDB_DEL_TO_BRIDGE);
 }
 
+static bool mlx5_esw_bridge_pkt_reformat_vlan_pop_supported(struct mlx5_eswitch *esw)
+{
+       return BIT(MLX5_CAP_ESW_FLOWTABLE_FDB(esw->dev, reformat_remove)) &&
+               MLX5_CAP_GEN_2(esw->dev, max_reformat_remove_size) >= sizeof(struct vlan_hdr) &&
+               MLX5_CAP_GEN_2(esw->dev, max_reformat_remove_offset) >=
+               offsetof(struct vlan_ethhdr, h_vlan_proto);
+}
+
+static struct mlx5_pkt_reformat *
+mlx5_esw_bridge_pkt_reformat_vlan_pop_create(struct mlx5_eswitch *esw)
+{
+       struct mlx5_pkt_reformat_params reformat_params = {};
+
+       reformat_params.type = MLX5_REFORMAT_TYPE_REMOVE_HDR;
+       reformat_params.param_0 = MLX5_REFORMAT_CONTEXT_ANCHOR_MAC_START;
+       reformat_params.param_1 = offsetof(struct vlan_ethhdr, h_vlan_proto);
+       reformat_params.size = sizeof(struct vlan_hdr);
+       return mlx5_packet_reformat_alloc(esw->dev, &reformat_params, MLX5_FLOW_NAMESPACE_FDB);
+}
+
 static struct mlx5_flow_table *
 mlx5_esw_bridge_table_create(int max_fte, u32 level, struct mlx5_eswitch *esw)
 {
@@ -800,24 +820,14 @@ mlx5_esw_bridge_vlan_push_cleanup(struct mlx5_esw_bridge_vlan *vlan, struct mlx5
 static int
 mlx5_esw_bridge_vlan_pop_create(struct mlx5_esw_bridge_vlan *vlan, struct mlx5_eswitch *esw)
 {
-       struct mlx5_pkt_reformat_params reformat_params = {};
        struct mlx5_pkt_reformat *pkt_reformat;
 
-       if (!BIT(MLX5_CAP_ESW_FLOWTABLE_FDB(esw->dev, reformat_remove)) ||
-           MLX5_CAP_GEN_2(esw->dev, max_reformat_remove_size) < sizeof(struct vlan_hdr) ||
-           MLX5_CAP_GEN_2(esw->dev, max_reformat_remove_offset) <
-           offsetof(struct vlan_ethhdr, h_vlan_proto)) {
+       if (!mlx5_esw_bridge_pkt_reformat_vlan_pop_supported(esw)) {
                esw_warn(esw->dev, "Packet reformat REMOVE_HEADER is not supported\n");
                return -EOPNOTSUPP;
        }
 
-       reformat_params.type = MLX5_REFORMAT_TYPE_REMOVE_HDR;
-       reformat_params.param_0 = MLX5_REFORMAT_CONTEXT_ANCHOR_MAC_START;
-       reformat_params.param_1 = offsetof(struct vlan_ethhdr, h_vlan_proto);
-       reformat_params.size = sizeof(struct vlan_hdr);
-       pkt_reformat = mlx5_packet_reformat_alloc(esw->dev,
-                                                 &reformat_params,
-                                                 MLX5_FLOW_NAMESPACE_FDB);
+       pkt_reformat = mlx5_esw_bridge_pkt_reformat_vlan_pop_create(esw);
        if (IS_ERR(pkt_reformat)) {
                esw_warn(esw->dev, "Failed to alloc packet reformat REMOVE_HEADER (err=%ld)\n",
                         PTR_ERR(pkt_reformat));