net/mlx5e: Offload TC matching on tcp flags
[sfrench/cifs-2.6.git] / drivers / net / ethernet / mellanox / mlx5 / core / en_tc.c
index 7914a32a3036e5bd6bf621414ab4eccc9e22c2f9..066045b5eb4c1491ff54c949dea7fa79b3879639 100644 (file)
@@ -581,7 +581,8 @@ static int __parse_cls_flower(struct mlx5e_priv *priv,
              BIT(FLOW_DISSECTOR_KEY_ENC_IPV4_ADDRS) |
              BIT(FLOW_DISSECTOR_KEY_ENC_IPV6_ADDRS) |
              BIT(FLOW_DISSECTOR_KEY_ENC_PORTS) |
-             BIT(FLOW_DISSECTOR_KEY_ENC_CONTROL))) {
+             BIT(FLOW_DISSECTOR_KEY_ENC_CONTROL) |
+             BIT(FLOW_DISSECTOR_KEY_TCP))) {
                netdev_warn(priv->netdev, "Unsupported key used: 0x%x\n",
                            f->dissector->used_keys);
                return -EOPNOTSUPP;
@@ -808,6 +809,25 @@ static int __parse_cls_flower(struct mlx5e_priv *priv,
                        *min_inline = MLX5_INLINE_MODE_TCP_UDP;
        }
 
+       if (dissector_uses_key(f->dissector, FLOW_DISSECTOR_KEY_TCP)) {
+               struct flow_dissector_key_tcp *key =
+                       skb_flow_dissector_target(f->dissector,
+                                                 FLOW_DISSECTOR_KEY_TCP,
+                                                 f->key);
+               struct flow_dissector_key_tcp *mask =
+                       skb_flow_dissector_target(f->dissector,
+                                                 FLOW_DISSECTOR_KEY_TCP,
+                                                 f->mask);
+
+               MLX5_SET(fte_match_set_lyr_2_4, headers_c, tcp_flags,
+                        ntohs(mask->flags));
+               MLX5_SET(fte_match_set_lyr_2_4, headers_v, tcp_flags,
+                        ntohs(key->flags));
+
+               if (mask->flags)
+                       *min_inline = MLX5_INLINE_MODE_TCP_UDP;
+       }
+
        return 0;
 }