net/sfc: override match fields in tunnel offload jump rules
authorIvan Malov <ivan.malov@oktetlabs.ru>
Wed, 13 Oct 2021 13:15:10 +0000 (16:15 +0300)
committerFerruh Yigit <ferruh.yigit@intel.com>
Wed, 13 Oct 2021 19:30:13 +0000 (21:30 +0200)
The current HW/FW doesn't allow to match on MAC addresses in outer rules.
One day this will change for sure, but right now a workaround is needed.

Match on VLAN presence in outer rules is also unsupported. Ignore it.

Signed-off-by: Ivan Malov <ivan.malov@oktetlabs.ru>
Reviewed-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
drivers/net/sfc/sfc_mae.c

index 2515b9a..c972c2e 100644 (file)
@@ -1525,6 +1525,7 @@ sfc_mae_rule_parse_item_eth(const struct rte_flow_item *item,
                            struct rte_flow_error *error)
 {
        struct sfc_mae_parse_ctx *ctx_mae = ctx->mae;
+       struct rte_flow_item_eth override_mask;
        struct rte_flow_item_eth supp_mask;
        const uint8_t *spec = NULL;
        const uint8_t *mask = NULL;
@@ -1542,6 +1543,22 @@ sfc_mae_rule_parse_item_eth(const struct rte_flow_item *item,
        if (rc != 0)
                return rc;
 
+       if (ctx_mae->ft_rule_type == SFC_FT_RULE_JUMP && mask != NULL) {
+               /*
+                * The HW/FW hasn't got support for match on MAC addresses in
+                * outer rules yet (this will change). Match on VLAN presence
+                * isn't supported either. Ignore these match criteria.
+                */
+               memcpy(&override_mask, mask, sizeof(override_mask));
+               memset(&override_mask.hdr.dst_addr, 0,
+                      sizeof(override_mask.hdr.dst_addr));
+               memset(&override_mask.hdr.src_addr, 0,
+                      sizeof(override_mask.hdr.src_addr));
+               override_mask.has_vlan = 0;
+
+               mask = (const uint8_t *)&override_mask;
+       }
+
        if (spec != NULL) {
                struct sfc_mae_pattern_data *pdata = &ctx_mae->pattern_data;
                struct sfc_mae_ethertype *ethertypes = pdata->ethertypes;