net/mlx5e: Move tc tunnel parsing logic with the rest at tc_tun module
authorPaul Blakey <paulb@mellanox.com>
Sun, 16 Feb 2020 10:01:32 +0000 (12:01 +0200)
committerSaeed Mahameed <saeedm@mellanox.com>
Thu, 20 Feb 2020 01:49:49 +0000 (17:49 -0800)
Currently, tunnel parsing is split between en_tc and tc_tun. The next
patch will replace the tunnel fields matching with a register match,
and will not need this parsing.

Move the tunnel parsing logic to tc_tun as a pre-step for skipping
it in the next patch.

Signed-off-by: Paul Blakey <paulb@mellanox.com>
Reviewed-by: Roi Dayan <roid@mellanox.com>
Reviewed-by: Oz Shlomo <ozsh@mellanox.com>
Reviewed-by: Mark Bloch <markb@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun.c
drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun.h
drivers/net/ethernet/mellanox/mlx5/core/en_tc.c

index af4ebd2..608d0e0 100644 (file)
@@ -469,10 +469,15 @@ int mlx5e_tc_tun_parse(struct net_device *filter_dev,
                       struct mlx5e_priv *priv,
                       struct mlx5_flow_spec *spec,
                       struct flow_cls_offload *f,
-                      void *headers_c,
-                      void *headers_v, u8 *match_level)
+                      u8 *match_level)
 {
        struct mlx5e_tc_tunnel *tunnel = mlx5e_get_tc_tun(filter_dev);
+       struct flow_rule *rule = flow_cls_offload_flow_rule(f);
+       void *headers_c = MLX5_ADDR_OF(fte_match_param, spec->match_criteria,
+                                      outer_headers);
+       void *headers_v = MLX5_ADDR_OF(fte_match_param, spec->match_value,
+                                      outer_headers);
+       struct netlink_ext_ack *extack = f->common.extack;
        int err = 0;
 
        if (!tunnel) {
@@ -499,6 +504,109 @@ int mlx5e_tc_tun_parse(struct net_device *filter_dev,
                        goto out;
        }
 
+       if (flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_ENC_CONTROL)) {
+               struct flow_match_control match;
+               u16 addr_type;
+
+               flow_rule_match_enc_control(rule, &match);
+               addr_type = match.key->addr_type;
+
+               /* For tunnel addr_type used same key id`s as for non-tunnel */
+               if (addr_type == FLOW_DISSECTOR_KEY_IPV4_ADDRS) {
+                       struct flow_match_ipv4_addrs match;
+
+                       flow_rule_match_enc_ipv4_addrs(rule, &match);
+                       MLX5_SET(fte_match_set_lyr_2_4, headers_c,
+                                src_ipv4_src_ipv6.ipv4_layout.ipv4,
+                                ntohl(match.mask->src));
+                       MLX5_SET(fte_match_set_lyr_2_4, headers_v,
+                                src_ipv4_src_ipv6.ipv4_layout.ipv4,
+                                ntohl(match.key->src));
+
+                       MLX5_SET(fte_match_set_lyr_2_4, headers_c,
+                                dst_ipv4_dst_ipv6.ipv4_layout.ipv4,
+                                ntohl(match.mask->dst));
+                       MLX5_SET(fte_match_set_lyr_2_4, headers_v,
+                                dst_ipv4_dst_ipv6.ipv4_layout.ipv4,
+                                ntohl(match.key->dst));
+
+                       MLX5_SET_TO_ONES(fte_match_set_lyr_2_4, headers_c,
+                                        ethertype);
+                       MLX5_SET(fte_match_set_lyr_2_4, headers_v, ethertype,
+                                ETH_P_IP);
+               } else if (addr_type == FLOW_DISSECTOR_KEY_IPV6_ADDRS) {
+                       struct flow_match_ipv6_addrs match;
+
+                       flow_rule_match_enc_ipv6_addrs(rule, &match);
+                       memcpy(MLX5_ADDR_OF(fte_match_set_lyr_2_4, headers_c,
+                                           src_ipv4_src_ipv6.ipv6_layout.ipv6),
+                              &match.mask->src, MLX5_FLD_SZ_BYTES(ipv6_layout,
+                                                                  ipv6));
+                       memcpy(MLX5_ADDR_OF(fte_match_set_lyr_2_4, headers_v,
+                                           src_ipv4_src_ipv6.ipv6_layout.ipv6),
+                              &match.key->src, MLX5_FLD_SZ_BYTES(ipv6_layout,
+                                                                 ipv6));
+
+                       memcpy(MLX5_ADDR_OF(fte_match_set_lyr_2_4, headers_c,
+                                           dst_ipv4_dst_ipv6.ipv6_layout.ipv6),
+                              &match.mask->dst, MLX5_FLD_SZ_BYTES(ipv6_layout,
+                                                                  ipv6));
+                       memcpy(MLX5_ADDR_OF(fte_match_set_lyr_2_4, headers_v,
+                                           dst_ipv4_dst_ipv6.ipv6_layout.ipv6),
+                              &match.key->dst, MLX5_FLD_SZ_BYTES(ipv6_layout,
+                                                                 ipv6));
+
+                       MLX5_SET_TO_ONES(fte_match_set_lyr_2_4, headers_c,
+                                        ethertype);
+                       MLX5_SET(fte_match_set_lyr_2_4, headers_v, ethertype,
+                                ETH_P_IPV6);
+               }
+       }
+
+       if (flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_ENC_IP)) {
+               struct flow_match_ip match;
+
+               flow_rule_match_enc_ip(rule, &match);
+               MLX5_SET(fte_match_set_lyr_2_4, headers_c, ip_ecn,
+                        match.mask->tos & 0x3);
+               MLX5_SET(fte_match_set_lyr_2_4, headers_v, ip_ecn,
+                        match.key->tos & 0x3);
+
+               MLX5_SET(fte_match_set_lyr_2_4, headers_c, ip_dscp,
+                        match.mask->tos >> 2);
+               MLX5_SET(fte_match_set_lyr_2_4, headers_v, ip_dscp,
+                        match.key->tos  >> 2);
+
+               MLX5_SET(fte_match_set_lyr_2_4, headers_c, ttl_hoplimit,
+                        match.mask->ttl);
+               MLX5_SET(fte_match_set_lyr_2_4, headers_v, ttl_hoplimit,
+                        match.key->ttl);
+
+               if (match.mask->ttl &&
+                   !MLX5_CAP_ESW_FLOWTABLE_FDB
+                       (priv->mdev,
+                        ft_field_support.outer_ipv4_ttl)) {
+                       NL_SET_ERR_MSG_MOD(extack,
+                                          "Matching on TTL is not supported");
+                       err = -EOPNOTSUPP;
+                       goto out;
+               }
+       }
+
+       /* Enforce DMAC when offloading incoming tunneled flows.
+        * Flow counters require a match on the DMAC.
+        */
+       MLX5_SET_TO_ONES(fte_match_set_lyr_2_4, headers_c, dmac_47_16);
+       MLX5_SET_TO_ONES(fte_match_set_lyr_2_4, headers_c, dmac_15_0);
+       ether_addr_copy(MLX5_ADDR_OF(fte_match_set_lyr_2_4, headers_v,
+                                    dmac_47_16), priv->netdev->dev_addr);
+
+       /* let software handle IP fragments */
+       MLX5_SET(fte_match_set_lyr_2_4, headers_c, frag, 1);
+       MLX5_SET(fte_match_set_lyr_2_4, headers_v, frag, 0);
+
+       return 0;
+
 out:
        return err;
 }
index 6f9a78c..1630f0e 100644 (file)
@@ -76,8 +76,7 @@ int mlx5e_tc_tun_parse(struct net_device *filter_dev,
                       struct mlx5e_priv *priv,
                       struct mlx5_flow_spec *spec,
                       struct flow_cls_offload *f,
-                      void *headers_c,
-                      void *headers_v, u8 *match_level);
+                      u8 *match_level);
 
 int mlx5e_tc_tun_parse_udp_ports(struct mlx5e_priv *priv,
                                 struct mlx5_flow_spec *spec,
index d844c05..1ddb360 100644 (file)
@@ -1677,122 +1677,15 @@ static int parse_tunnel_attr(struct mlx5e_priv *priv,
                             struct net_device *filter_dev, u8 *match_level)
 {
        struct netlink_ext_ack *extack = f->common.extack;
-       void *headers_c = MLX5_ADDR_OF(fte_match_param, spec->match_criteria,
-                                      outer_headers);
-       void *headers_v = MLX5_ADDR_OF(fte_match_param, spec->match_value,
-                                      outer_headers);
-       struct flow_rule *rule = flow_cls_offload_flow_rule(f);
        int err;
 
-       err = mlx5e_tc_tun_parse(filter_dev, priv, spec, f,
-                                headers_c, headers_v, match_level);
+       err = mlx5e_tc_tun_parse(filter_dev, priv, spec, f, match_level);
        if (err) {
                NL_SET_ERR_MSG_MOD(extack,
                                   "failed to parse tunnel attributes");
                return err;
        }
 
-       if (flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_ENC_CONTROL)) {
-               struct flow_match_control match;
-               u16 addr_type;
-
-               flow_rule_match_enc_control(rule, &match);
-               addr_type = match.key->addr_type;
-
-               /* For tunnel addr_type used same key id`s as for non-tunnel */
-               if (addr_type == FLOW_DISSECTOR_KEY_IPV4_ADDRS) {
-                       struct flow_match_ipv4_addrs match;
-
-                       flow_rule_match_enc_ipv4_addrs(rule, &match);
-                       MLX5_SET(fte_match_set_lyr_2_4, headers_c,
-                                src_ipv4_src_ipv6.ipv4_layout.ipv4,
-                                ntohl(match.mask->src));
-                       MLX5_SET(fte_match_set_lyr_2_4, headers_v,
-                                src_ipv4_src_ipv6.ipv4_layout.ipv4,
-                                ntohl(match.key->src));
-
-                       MLX5_SET(fte_match_set_lyr_2_4, headers_c,
-                                dst_ipv4_dst_ipv6.ipv4_layout.ipv4,
-                                ntohl(match.mask->dst));
-                       MLX5_SET(fte_match_set_lyr_2_4, headers_v,
-                                dst_ipv4_dst_ipv6.ipv4_layout.ipv4,
-                                ntohl(match.key->dst));
-
-                       MLX5_SET_TO_ONES(fte_match_set_lyr_2_4, headers_c,
-                                        ethertype);
-                       MLX5_SET(fte_match_set_lyr_2_4, headers_v, ethertype,
-                                ETH_P_IP);
-               } else if (addr_type == FLOW_DISSECTOR_KEY_IPV6_ADDRS) {
-                       struct flow_match_ipv6_addrs match;
-
-                       flow_rule_match_enc_ipv6_addrs(rule, &match);
-                       memcpy(MLX5_ADDR_OF(fte_match_set_lyr_2_4, headers_c,
-                                           src_ipv4_src_ipv6.ipv6_layout.ipv6),
-                              &match.mask->src, MLX5_FLD_SZ_BYTES(ipv6_layout,
-                                                                  ipv6));
-                       memcpy(MLX5_ADDR_OF(fte_match_set_lyr_2_4, headers_v,
-                                           src_ipv4_src_ipv6.ipv6_layout.ipv6),
-                              &match.key->src, MLX5_FLD_SZ_BYTES(ipv6_layout,
-                                                                 ipv6));
-
-                       memcpy(MLX5_ADDR_OF(fte_match_set_lyr_2_4, headers_c,
-                                           dst_ipv4_dst_ipv6.ipv6_layout.ipv6),
-                              &match.mask->dst, MLX5_FLD_SZ_BYTES(ipv6_layout,
-                                                                  ipv6));
-                       memcpy(MLX5_ADDR_OF(fte_match_set_lyr_2_4, headers_v,
-                                           dst_ipv4_dst_ipv6.ipv6_layout.ipv6),
-                              &match.key->dst, MLX5_FLD_SZ_BYTES(ipv6_layout,
-                                                                 ipv6));
-
-                       MLX5_SET_TO_ONES(fte_match_set_lyr_2_4, headers_c,
-                                        ethertype);
-                       MLX5_SET(fte_match_set_lyr_2_4, headers_v, ethertype,
-                                ETH_P_IPV6);
-               }
-       }
-
-       if (flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_ENC_IP)) {
-               struct flow_match_ip match;
-
-               flow_rule_match_enc_ip(rule, &match);
-               MLX5_SET(fte_match_set_lyr_2_4, headers_c, ip_ecn,
-                        match.mask->tos & 0x3);
-               MLX5_SET(fte_match_set_lyr_2_4, headers_v, ip_ecn,
-                        match.key->tos & 0x3);
-
-               MLX5_SET(fte_match_set_lyr_2_4, headers_c, ip_dscp,
-                        match.mask->tos >> 2);
-               MLX5_SET(fte_match_set_lyr_2_4, headers_v, ip_dscp,
-                        match.key->tos  >> 2);
-
-               MLX5_SET(fte_match_set_lyr_2_4, headers_c, ttl_hoplimit,
-                        match.mask->ttl);
-               MLX5_SET(fte_match_set_lyr_2_4, headers_v, ttl_hoplimit,
-                        match.key->ttl);
-
-               if (match.mask->ttl &&
-                   !MLX5_CAP_ESW_FLOWTABLE_FDB
-                       (priv->mdev,
-                        ft_field_support.outer_ipv4_ttl)) {
-                       NL_SET_ERR_MSG_MOD(extack,
-                                          "Matching on TTL is not supported");
-                       return -EOPNOTSUPP;
-               }
-
-       }
-
-       /* Enforce DMAC when offloading incoming tunneled flows.
-        * Flow counters require a match on the DMAC.
-        */
-       MLX5_SET_TO_ONES(fte_match_set_lyr_2_4, headers_c, dmac_47_16);
-       MLX5_SET_TO_ONES(fte_match_set_lyr_2_4, headers_c, dmac_15_0);
-       ether_addr_copy(MLX5_ADDR_OF(fte_match_set_lyr_2_4, headers_v,
-                                    dmac_47_16), priv->netdev->dev_addr);
-
-       /* let software handle IP fragments */
-       MLX5_SET(fte_match_set_lyr_2_4, headers_c, frag, 1);
-       MLX5_SET(fte_match_set_lyr_2_4, headers_v, frag, 0);
-
        return 0;
 }