net/mlx5: Consider VLAN interface in MACsec TX steering rules
authorEmeel Hakim <ehakim@nvidia.com>
Wed, 19 Apr 2023 14:21:25 +0000 (17:21 +0300)
committerDavid S. Miller <davem@davemloft.net>
Fri, 21 Apr 2023 07:22:15 +0000 (08:22 +0100)
Offloading MACsec when its configured over VLAN with current MACsec
TX steering rules will wrongly insert MACsec sec tag after inserting
the VLAN header leading to a ETHERNET | SECTAG | VLAN packet when
ETHERNET | VLAN | SECTAG is configured.

The above issue is due to adding the SECTAG by HW which is a later
stage compared to the VLAN header insertion stage.

Detect such a case and adjust TX steering rules to insert the
SECTAG in the correct place by using reformat_param_0 field in
the packet reformat to indicate the offset of SECTAG from end of
the MAC header to account for VLANs in granularity of 4Bytes.

Signed-off-by: Emeel Hakim <ehakim@nvidia.com>
Reviewed-by: Subbaraya Sundeep <sbhatta@marvell.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mellanox/mlx5/core/en_accel/macsec_fs.c

index 9173b67..7fc901a 100644 (file)
@@ -4,6 +4,7 @@
 #include <net/macsec.h>
 #include <linux/netdevice.h>
 #include <linux/mlx5/qp.h>
+#include <linux/if_vlan.h>
 #include "fs_core.h"
 #include "en/fs.h"
 #include "en_accel/macsec_fs.h"
@@ -508,6 +509,8 @@ static void macsec_fs_tx_del_rule(struct mlx5e_macsec_fs *macsec_fs,
        macsec_fs_tx_ft_put(macsec_fs);
 }
 
+#define MLX5_REFORMAT_PARAM_ADD_MACSEC_OFFSET_4_BYTES 1
+
 static union mlx5e_macsec_rule *
 macsec_fs_tx_add_rule(struct mlx5e_macsec_fs *macsec_fs,
                      const struct macsec_context *macsec_ctx,
@@ -553,6 +556,10 @@ macsec_fs_tx_add_rule(struct mlx5e_macsec_fs *macsec_fs,
        reformat_params.type = MLX5_REFORMAT_TYPE_ADD_MACSEC;
        reformat_params.size = reformat_size;
        reformat_params.data = reformatbf;
+
+       if (is_vlan_dev(macsec_ctx->netdev))
+               reformat_params.param_0 = MLX5_REFORMAT_PARAM_ADD_MACSEC_OFFSET_4_BYTES;
+
        flow_act.pkt_reformat = mlx5_packet_reformat_alloc(macsec_fs->mdev,
                                                           &reformat_params,
                                                           MLX5_FLOW_NAMESPACE_EGRESS_MACSEC);