net/sfc: support encap flow items in transfer rules
[dpdk.git] / drivers / net / sfc / sfc_flow.c
index f4d53bf..4321045 100644 (file)
@@ -50,8 +50,8 @@ static const struct sfc_flow_ops_by_spec sfc_flow_ops_mae = {
        .parse = sfc_flow_parse_rte_to_mae,
        .verify = sfc_mae_flow_verify,
        .cleanup = sfc_mae_flow_cleanup,
-       .insert = NULL,
-       .remove = NULL,
+       .insert = sfc_mae_flow_insert,
+       .remove = sfc_mae_flow_remove,
 };
 
 static const struct sfc_flow_ops_by_spec *
@@ -1202,6 +1202,7 @@ sfc_flow_parse_attr(struct sfc_adapter *sa,
                spec_mae->priority = attr->priority;
                spec_mae->match_spec = NULL;
                spec_mae->action_set = NULL;
+               spec_mae->rule_id.id = EFX_MAE_RSRC_ID_INVALID;
        }
 
        return 0;
@@ -1287,7 +1288,8 @@ sfc_flow_parse_pattern(const struct sfc_flow_item *flow_items,
                        break;
 
                default:
-                       if (is_ifrm) {
+                       if (parse_ctx->type == SFC_FLOW_PARSE_CTX_FILTER &&
+                           is_ifrm) {
                                rte_flow_error_set(error, EINVAL,
                                        RTE_FLOW_ERROR_TYPE_ITEM,
                                        pattern,
@@ -1678,9 +1680,6 @@ sfc_flow_parse_actions(struct sfc_adapter *sa,
                return -rte_errno;
        }
 
-#define SFC_BUILD_SET_OVERFLOW(_action, _set) \
-       RTE_BUILD_BUG_ON(_action >= sizeof(_set) * CHAR_BIT)
-
        for (; actions->type != RTE_FLOW_ACTION_TYPE_END; actions++) {
                switch (actions->type) {
                case RTE_FLOW_ACTION_TYPE_VOID:
@@ -1776,7 +1775,6 @@ sfc_flow_parse_actions(struct sfc_adapter *sa,
 
                actions_set |= (1UL << actions->type);
        }
-#undef SFC_BUILD_SET_OVERFLOW
 
        /* When fate is unknown, drop traffic. */
        if ((actions_set & fate_actions_mask) == 0) {
@@ -2568,13 +2566,8 @@ sfc_flow_verify(struct sfc_adapter *sa, struct rte_flow *flow,
        }
 
        if (ops->verify != NULL) {
-               /*
-                * Use locking since verify method may need to
-                * access the list of already created rules.
-                */
-               sfc_adapter_lock(sa);
+               SFC_ASSERT(sfc_adapter_is_locked(sa));
                rc = ops->verify(sa, flow);
-               sfc_adapter_unlock(sa);
        }
 
        if (rc != 0) {
@@ -2602,12 +2595,16 @@ sfc_flow_validate(struct rte_eth_dev *dev,
        if (flow == NULL)
                return -rte_errno;
 
+       sfc_adapter_lock(sa);
+
        rc = sfc_flow_parse(dev, attr, pattern, actions, flow, error);
        if (rc == 0)
                rc = sfc_flow_verify(sa, flow, error);
 
        sfc_flow_free(sa, flow);
 
+       sfc_adapter_unlock(sa);
+
        return rc;
 }
 
@@ -2626,12 +2623,12 @@ sfc_flow_create(struct rte_eth_dev *dev,
        if (flow == NULL)
                goto fail_no_mem;
 
+       sfc_adapter_lock(sa);
+
        rc = sfc_flow_parse(dev, attr, pattern, actions, flow, error);
        if (rc != 0)
                goto fail_bad_value;
 
-       sfc_adapter_lock(sa);
-
        TAILQ_INSERT_TAIL(&sa->flow_list, flow, entries);
 
        if (sa->state == SFC_ADAPTER_STARTED) {