From: Jiri Pirko <j...@mellanox.com>

Since in Spectrum-2, MACs are split and IP addresses are split as well,
in order to use the same elements for Spectrum and Spectrum-2 split them
now.

Signed-off-by: Jiri Pirko <j...@mellanox.com>
Signed-off-by: Ido Schimmel <ido...@mellanox.com>
---
 .../ethernet/mellanox/mlxsw/core_acl_flex_keys.h   | 40 ++++++++-----
 .../mellanox/mlxsw/spectrum_acl_flex_keys.h        | 27 +++++----
 .../ethernet/mellanox/mlxsw/spectrum_acl_tcam.c    | 22 ++++---
 .../net/ethernet/mellanox/mlxsw/spectrum_flower.c  | 69 +++++++++++++---------
 4 files changed, 96 insertions(+), 62 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlxsw/core_acl_flex_keys.h 
b/drivers/net/ethernet/mellanox/mlxsw/core_acl_flex_keys.h
index 122506daa586..4c7c8eb97b9b 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/core_acl_flex_keys.h
+++ b/drivers/net/ethernet/mellanox/mlxsw/core_acl_flex_keys.h
@@ -42,16 +42,20 @@
 
 enum mlxsw_afk_element {
        MLXSW_AFK_ELEMENT_SRC_SYS_PORT,
-       MLXSW_AFK_ELEMENT_DMAC,
-       MLXSW_AFK_ELEMENT_SMAC,
+       MLXSW_AFK_ELEMENT_DMAC_32_47,
+       MLXSW_AFK_ELEMENT_DMAC_0_31,
+       MLXSW_AFK_ELEMENT_SMAC_32_47,
+       MLXSW_AFK_ELEMENT_SMAC_0_31,
        MLXSW_AFK_ELEMENT_ETHERTYPE,
        MLXSW_AFK_ELEMENT_IP_PROTO,
-       MLXSW_AFK_ELEMENT_SRC_IP4,
-       MLXSW_AFK_ELEMENT_DST_IP4,
-       MLXSW_AFK_ELEMENT_SRC_IP6_HI,
-       MLXSW_AFK_ELEMENT_SRC_IP6_LO,
-       MLXSW_AFK_ELEMENT_DST_IP6_HI,
-       MLXSW_AFK_ELEMENT_DST_IP6_LO,
+       MLXSW_AFK_ELEMENT_SRC_IP_96_127,
+       MLXSW_AFK_ELEMENT_SRC_IP_64_95,
+       MLXSW_AFK_ELEMENT_SRC_IP_32_63,
+       MLXSW_AFK_ELEMENT_SRC_IP_0_31,
+       MLXSW_AFK_ELEMENT_DST_IP_96_127,
+       MLXSW_AFK_ELEMENT_DST_IP_64_95,
+       MLXSW_AFK_ELEMENT_DST_IP_32_63,
+       MLXSW_AFK_ELEMENT_DST_IP_0_31,
        MLXSW_AFK_ELEMENT_DST_L4_PORT,
        MLXSW_AFK_ELEMENT_SRC_L4_PORT,
        MLXSW_AFK_ELEMENT_VID,
@@ -100,8 +104,10 @@ struct mlxsw_afk_element_info {
  */
 static const struct mlxsw_afk_element_info mlxsw_afk_element_infos[] = {
        MLXSW_AFK_ELEMENT_INFO_U32(SRC_SYS_PORT, 0x00, 16, 16),
-       MLXSW_AFK_ELEMENT_INFO_BUF(DMAC, 0x04, 6),
-       MLXSW_AFK_ELEMENT_INFO_BUF(SMAC, 0x0A, 6),
+       MLXSW_AFK_ELEMENT_INFO_BUF(DMAC_32_47, 0x04, 2),
+       MLXSW_AFK_ELEMENT_INFO_BUF(DMAC_0_31, 0x06, 4),
+       MLXSW_AFK_ELEMENT_INFO_BUF(SMAC_32_47, 0x0A, 2),
+       MLXSW_AFK_ELEMENT_INFO_BUF(SMAC_0_31, 0x0C, 4),
        MLXSW_AFK_ELEMENT_INFO_U32(ETHERTYPE, 0x00, 0, 16),
        MLXSW_AFK_ELEMENT_INFO_U32(IP_PROTO, 0x10, 0, 8),
        MLXSW_AFK_ELEMENT_INFO_U32(VID, 0x10, 8, 12),
@@ -112,12 +118,14 @@ static const struct mlxsw_afk_element_info 
mlxsw_afk_element_infos[] = {
        MLXSW_AFK_ELEMENT_INFO_U32(IP_TTL_, 0x18, 0, 8),
        MLXSW_AFK_ELEMENT_INFO_U32(IP_ECN, 0x18, 9, 2),
        MLXSW_AFK_ELEMENT_INFO_U32(IP_DSCP, 0x18, 11, 6),
-       MLXSW_AFK_ELEMENT_INFO_U32(SRC_IP4, 0x20, 0, 32),
-       MLXSW_AFK_ELEMENT_INFO_U32(DST_IP4, 0x24, 0, 32),
-       MLXSW_AFK_ELEMENT_INFO_BUF(SRC_IP6_HI, 0x20, 8),
-       MLXSW_AFK_ELEMENT_INFO_BUF(SRC_IP6_LO, 0x28, 8),
-       MLXSW_AFK_ELEMENT_INFO_BUF(DST_IP6_HI, 0x30, 8),
-       MLXSW_AFK_ELEMENT_INFO_BUF(DST_IP6_LO, 0x38, 8),
+       MLXSW_AFK_ELEMENT_INFO_BUF(SRC_IP_96_127, 0x20, 4),
+       MLXSW_AFK_ELEMENT_INFO_BUF(SRC_IP_64_95, 0x24, 4),
+       MLXSW_AFK_ELEMENT_INFO_BUF(SRC_IP_32_63, 0x28, 4),
+       MLXSW_AFK_ELEMENT_INFO_BUF(SRC_IP_0_31, 0x2C, 4),
+       MLXSW_AFK_ELEMENT_INFO_BUF(DST_IP_96_127, 0x30, 4),
+       MLXSW_AFK_ELEMENT_INFO_BUF(DST_IP_64_95, 0x34, 4),
+       MLXSW_AFK_ELEMENT_INFO_BUF(DST_IP_32_63, 0x38, 4),
+       MLXSW_AFK_ELEMENT_INFO_BUF(DST_IP_0_31, 0x3C, 4),
 };
 
 #define MLXSW_AFK_ELEMENT_STORAGE_SIZE 0x40
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_flex_keys.h 
b/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_flex_keys.h
index f2924ef98083..800285b2b14a 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_flex_keys.h
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_flex_keys.h
@@ -38,38 +38,41 @@
 #include "core_acl_flex_keys.h"
 
 static struct mlxsw_afk_element_inst mlxsw_sp_afk_element_info_l2_dmac[] = {
-       MLXSW_AFK_ELEMENT_INST_BUF(DMAC, 0x00, 6),
+       MLXSW_AFK_ELEMENT_INST_BUF(DMAC_32_47, 0x00, 2),
+       MLXSW_AFK_ELEMENT_INST_BUF(DMAC_0_31, 0x02, 4),
        MLXSW_AFK_ELEMENT_INST_U32(PCP, 0x08, 13, 3),
        MLXSW_AFK_ELEMENT_INST_U32(VID, 0x08, 0, 12),
        MLXSW_AFK_ELEMENT_INST_U32(SRC_SYS_PORT, 0x0C, 0, 16),
 };
 
 static struct mlxsw_afk_element_inst mlxsw_sp_afk_element_info_l2_smac[] = {
-       MLXSW_AFK_ELEMENT_INST_BUF(SMAC, 0x00, 6),
+       MLXSW_AFK_ELEMENT_INST_BUF(SMAC_32_47, 0x00, 2),
+       MLXSW_AFK_ELEMENT_INST_BUF(SMAC_0_31, 0x02, 4),
        MLXSW_AFK_ELEMENT_INST_U32(PCP, 0x08, 13, 3),
        MLXSW_AFK_ELEMENT_INST_U32(VID, 0x08, 0, 12),
        MLXSW_AFK_ELEMENT_INST_U32(SRC_SYS_PORT, 0x0C, 0, 16),
 };
 
 static struct mlxsw_afk_element_inst mlxsw_sp_afk_element_info_l2_smac_ex[] = {
-       MLXSW_AFK_ELEMENT_INST_BUF(SMAC, 0x02, 6),
+       MLXSW_AFK_ELEMENT_INST_BUF(SMAC_32_47, 0x02, 2),
+       MLXSW_AFK_ELEMENT_INST_BUF(SMAC_0_31, 0x04, 4),
        MLXSW_AFK_ELEMENT_INST_U32(ETHERTYPE, 0x0C, 0, 16),
 };
 
 static struct mlxsw_afk_element_inst mlxsw_sp_afk_element_info_ipv4_sip[] = {
-       MLXSW_AFK_ELEMENT_INST_U32(SRC_IP4, 0x00, 0, 32),
+       MLXSW_AFK_ELEMENT_INST_BUF(SRC_IP_0_31, 0x00, 4),
        MLXSW_AFK_ELEMENT_INST_U32(IP_PROTO, 0x08, 0, 8),
        MLXSW_AFK_ELEMENT_INST_U32(SRC_SYS_PORT, 0x0C, 0, 16),
 };
 
 static struct mlxsw_afk_element_inst mlxsw_sp_afk_element_info_ipv4_dip[] = {
-       MLXSW_AFK_ELEMENT_INST_U32(DST_IP4, 0x00, 0, 32),
+       MLXSW_AFK_ELEMENT_INST_BUF(DST_IP_0_31, 0x00, 4),
        MLXSW_AFK_ELEMENT_INST_U32(IP_PROTO, 0x08, 0, 8),
        MLXSW_AFK_ELEMENT_INST_U32(SRC_SYS_PORT, 0x0C, 0, 16),
 };
 
 static struct mlxsw_afk_element_inst mlxsw_sp_afk_element_info_ipv4[] = {
-       MLXSW_AFK_ELEMENT_INST_U32(SRC_IP4, 0x00, 0, 32),
+       MLXSW_AFK_ELEMENT_INST_BUF(SRC_IP_0_31, 0x00, 4),
        MLXSW_AFK_ELEMENT_INST_U32(IP_ECN, 0x04, 4, 2),
        MLXSW_AFK_ELEMENT_INST_U32(IP_TTL_, 0x04, 24, 8),
        MLXSW_AFK_ELEMENT_INST_U32(IP_DSCP, 0x08, 0, 6),
@@ -84,20 +87,24 @@ static struct mlxsw_afk_element_inst 
mlxsw_sp_afk_element_info_ipv4_ex[] = {
 };
 
 static struct mlxsw_afk_element_inst mlxsw_sp_afk_element_info_ipv6_dip[] = {
-       MLXSW_AFK_ELEMENT_INST_BUF(DST_IP6_LO, 0x00, 8),
+       MLXSW_AFK_ELEMENT_INST_BUF(DST_IP_32_63, 0x00, 4),
+       MLXSW_AFK_ELEMENT_INST_BUF(DST_IP_0_31, 0x04, 4),
 };
 
 static struct mlxsw_afk_element_inst mlxsw_sp_afk_element_info_ipv6_ex1[] = {
-       MLXSW_AFK_ELEMENT_INST_BUF(DST_IP6_HI, 0x00, 8),
+       MLXSW_AFK_ELEMENT_INST_BUF(DST_IP_96_127, 0x00, 4),
+       MLXSW_AFK_ELEMENT_INST_BUF(DST_IP_64_95, 0x04, 4),
        MLXSW_AFK_ELEMENT_INST_U32(IP_PROTO, 0x08, 0, 8),
 };
 
 static struct mlxsw_afk_element_inst mlxsw_sp_afk_element_info_ipv6_sip[] = {
-       MLXSW_AFK_ELEMENT_INST_BUF(SRC_IP6_LO, 0x00, 8),
+       MLXSW_AFK_ELEMENT_INST_BUF(SRC_IP_32_63, 0x00, 4),
+       MLXSW_AFK_ELEMENT_INST_BUF(SRC_IP_0_31, 0x04, 4),
 };
 
 static struct mlxsw_afk_element_inst mlxsw_sp_afk_element_info_ipv6_sip_ex[] = 
{
-       MLXSW_AFK_ELEMENT_INST_BUF(SRC_IP6_HI, 0x00, 8),
+       MLXSW_AFK_ELEMENT_INST_BUF(SRC_IP_96_127, 0x00, 4),
+       MLXSW_AFK_ELEMENT_INST_BUF(SRC_IP_64_95, 0x04, 4),
 };
 
 static struct mlxsw_afk_element_inst mlxsw_sp_afk_element_info_packet_type[] = 
{
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c 
b/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c
index 87fde93cec0c..efbd2062b6ec 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c
@@ -973,12 +973,14 @@ mlxsw_sp_acl_tcam_entry_activity_get(struct mlxsw_sp 
*mlxsw_sp,
 
 static const enum mlxsw_afk_element mlxsw_sp_acl_tcam_pattern_ipv4[] = {
        MLXSW_AFK_ELEMENT_SRC_SYS_PORT,
-       MLXSW_AFK_ELEMENT_DMAC,
-       MLXSW_AFK_ELEMENT_SMAC,
+       MLXSW_AFK_ELEMENT_DMAC_32_47,
+       MLXSW_AFK_ELEMENT_DMAC_0_31,
+       MLXSW_AFK_ELEMENT_SMAC_32_47,
+       MLXSW_AFK_ELEMENT_SMAC_0_31,
        MLXSW_AFK_ELEMENT_ETHERTYPE,
        MLXSW_AFK_ELEMENT_IP_PROTO,
-       MLXSW_AFK_ELEMENT_SRC_IP4,
-       MLXSW_AFK_ELEMENT_DST_IP4,
+       MLXSW_AFK_ELEMENT_SRC_IP_0_31,
+       MLXSW_AFK_ELEMENT_DST_IP_0_31,
        MLXSW_AFK_ELEMENT_DST_L4_PORT,
        MLXSW_AFK_ELEMENT_SRC_L4_PORT,
        MLXSW_AFK_ELEMENT_VID,
@@ -992,10 +994,14 @@ static const enum mlxsw_afk_element 
mlxsw_sp_acl_tcam_pattern_ipv4[] = {
 static const enum mlxsw_afk_element mlxsw_sp_acl_tcam_pattern_ipv6[] = {
        MLXSW_AFK_ELEMENT_ETHERTYPE,
        MLXSW_AFK_ELEMENT_IP_PROTO,
-       MLXSW_AFK_ELEMENT_SRC_IP6_HI,
-       MLXSW_AFK_ELEMENT_SRC_IP6_LO,
-       MLXSW_AFK_ELEMENT_DST_IP6_HI,
-       MLXSW_AFK_ELEMENT_DST_IP6_LO,
+       MLXSW_AFK_ELEMENT_SRC_IP_96_127,
+       MLXSW_AFK_ELEMENT_SRC_IP_64_95,
+       MLXSW_AFK_ELEMENT_SRC_IP_32_63,
+       MLXSW_AFK_ELEMENT_SRC_IP_0_31,
+       MLXSW_AFK_ELEMENT_DST_IP_96_127,
+       MLXSW_AFK_ELEMENT_DST_IP_64_95,
+       MLXSW_AFK_ELEMENT_DST_IP_32_63,
+       MLXSW_AFK_ELEMENT_DST_IP_0_31,
        MLXSW_AFK_ELEMENT_DST_L4_PORT,
        MLXSW_AFK_ELEMENT_SRC_L4_PORT,
 };
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_flower.c 
b/drivers/net/ethernet/mellanox/mlxsw/spectrum_flower.c
index 89dbf569dff5..201761a3539e 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_flower.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_flower.c
@@ -144,10 +144,12 @@ static void mlxsw_sp_flower_parse_ipv4(struct 
mlxsw_sp_acl_rule_info *rulei,
                                          FLOW_DISSECTOR_KEY_IPV4_ADDRS,
                                          f->mask);
 
-       mlxsw_sp_acl_rulei_keymask_u32(rulei, MLXSW_AFK_ELEMENT_SRC_IP4,
-                                      ntohl(key->src), ntohl(mask->src));
-       mlxsw_sp_acl_rulei_keymask_u32(rulei, MLXSW_AFK_ELEMENT_DST_IP4,
-                                      ntohl(key->dst), ntohl(mask->dst));
+       mlxsw_sp_acl_rulei_keymask_buf(rulei, MLXSW_AFK_ELEMENT_SRC_IP_0_31,
+                                      (char *) &key->src,
+                                      (char *) &mask->src, 4);
+       mlxsw_sp_acl_rulei_keymask_buf(rulei, MLXSW_AFK_ELEMENT_DST_IP_0_31,
+                                      (char *) &key->dst,
+                                      (char *) &mask->dst, 4);
 }
 
 static void mlxsw_sp_flower_parse_ipv6(struct mlxsw_sp_acl_rule_info *rulei,
@@ -161,24 +163,31 @@ static void mlxsw_sp_flower_parse_ipv6(struct 
mlxsw_sp_acl_rule_info *rulei,
                skb_flow_dissector_target(f->dissector,
                                          FLOW_DISSECTOR_KEY_IPV6_ADDRS,
                                          f->mask);
-       size_t addr_half_size = sizeof(key->src) / 2;
-
-       mlxsw_sp_acl_rulei_keymask_buf(rulei, MLXSW_AFK_ELEMENT_SRC_IP6_HI,
-                                      &key->src.s6_addr[0],
-                                      &mask->src.s6_addr[0],
-                                      addr_half_size);
-       mlxsw_sp_acl_rulei_keymask_buf(rulei, MLXSW_AFK_ELEMENT_SRC_IP6_LO,
-                                      &key->src.s6_addr[addr_half_size],
-                                      &mask->src.s6_addr[addr_half_size],
-                                      addr_half_size);
-       mlxsw_sp_acl_rulei_keymask_buf(rulei, MLXSW_AFK_ELEMENT_DST_IP6_HI,
-                                      &key->dst.s6_addr[0],
-                                      &mask->dst.s6_addr[0],
-                                      addr_half_size);
-       mlxsw_sp_acl_rulei_keymask_buf(rulei, MLXSW_AFK_ELEMENT_DST_IP6_LO,
-                                      &key->dst.s6_addr[addr_half_size],
-                                      &mask->dst.s6_addr[addr_half_size],
-                                      addr_half_size);
+
+       mlxsw_sp_acl_rulei_keymask_buf(rulei, MLXSW_AFK_ELEMENT_SRC_IP_96_127,
+                                      &key->src.s6_addr[0x0],
+                                      &mask->src.s6_addr[0x0], 4);
+       mlxsw_sp_acl_rulei_keymask_buf(rulei, MLXSW_AFK_ELEMENT_SRC_IP_64_95,
+                                      &key->src.s6_addr[0x4],
+                                      &mask->src.s6_addr[0x4], 4);
+       mlxsw_sp_acl_rulei_keymask_buf(rulei, MLXSW_AFK_ELEMENT_SRC_IP_32_63,
+                                      &key->src.s6_addr[0x8],
+                                      &mask->src.s6_addr[0x8], 4);
+       mlxsw_sp_acl_rulei_keymask_buf(rulei, MLXSW_AFK_ELEMENT_SRC_IP_0_31,
+                                      &key->src.s6_addr[0xC],
+                                      &mask->src.s6_addr[0xC], 4);
+       mlxsw_sp_acl_rulei_keymask_buf(rulei, MLXSW_AFK_ELEMENT_DST_IP_96_127,
+                                      &key->dst.s6_addr[0x0],
+                                      &mask->dst.s6_addr[0x0], 4);
+       mlxsw_sp_acl_rulei_keymask_buf(rulei, MLXSW_AFK_ELEMENT_DST_IP_64_95,
+                                      &key->dst.s6_addr[0x4],
+                                      &mask->dst.s6_addr[0x4], 4);
+       mlxsw_sp_acl_rulei_keymask_buf(rulei, MLXSW_AFK_ELEMENT_DST_IP_32_63,
+                                      &key->dst.s6_addr[0x8],
+                                      &mask->dst.s6_addr[0x8], 4);
+       mlxsw_sp_acl_rulei_keymask_buf(rulei, MLXSW_AFK_ELEMENT_DST_IP_0_31,
+                                      &key->dst.s6_addr[0xC],
+                                      &mask->dst.s6_addr[0xC], 4);
 }
 
 static int mlxsw_sp_flower_parse_ports(struct mlxsw_sp *mlxsw_sp,
@@ -340,13 +349,17 @@ static int mlxsw_sp_flower_parse(struct mlxsw_sp 
*mlxsw_sp,
                                                  f->mask);
 
                mlxsw_sp_acl_rulei_keymask_buf(rulei,
-                                              MLXSW_AFK_ELEMENT_DMAC,
-                                              key->dst, mask->dst,
-                                              sizeof(key->dst));
+                                              MLXSW_AFK_ELEMENT_DMAC_32_47,
+                                              key->dst, mask->dst, 2);
+               mlxsw_sp_acl_rulei_keymask_buf(rulei,
+                                              MLXSW_AFK_ELEMENT_DMAC_0_31,
+                                              key->dst + 2, mask->dst + 2, 4);
+               mlxsw_sp_acl_rulei_keymask_buf(rulei,
+                                              MLXSW_AFK_ELEMENT_SMAC_32_47,
+                                              key->src, mask->src, 2);
                mlxsw_sp_acl_rulei_keymask_buf(rulei,
-                                              MLXSW_AFK_ELEMENT_SMAC,
-                                              key->src, mask->src,
-                                              sizeof(key->src));
+                                              MLXSW_AFK_ELEMENT_SMAC_0_31,
+                                              key->src + 2, mask->src + 2, 4);
        }
 
        if (dissector_uses_key(f->dissector, FLOW_DISSECTOR_KEY_VLAN)) {
-- 
2.14.4

Reply via email to