X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fsfc%2Fsfc_flow.c;h=4321045d1ada1384a2a896465305a0fedb124407;hb=c1d4e9d37abdc6c07a05f7d96928e624fea9ebb5;hp=f69dd6ac5d40c413cef53980ea58b4242802bc9e;hpb=8b61dd99a186d60cfa38bc385bce490e11a4f01c;p=dpdk.git diff --git a/drivers/net/sfc/sfc_flow.c b/drivers/net/sfc/sfc_flow.c index f69dd6ac5d..4321045d1a 100644 --- a/drivers/net/sfc/sfc_flow.c +++ b/drivers/net/sfc/sfc_flow.c @@ -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 * @@ -1201,6 +1201,8 @@ sfc_flow_parse_attr(struct sfc_adapter *sa, spec->type = SFC_FLOW_SPEC_MAE; 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; @@ -1286,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, @@ -1677,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: @@ -1775,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) { @@ -2428,7 +2427,7 @@ fail_bad_value: static int sfc_flow_parse_rte_to_mae(struct rte_eth_dev *dev, const struct rte_flow_item pattern[], - __rte_unused const struct rte_flow_action actions[], + const struct rte_flow_action actions[], struct rte_flow *flow, struct rte_flow_error *error) { @@ -2441,6 +2440,11 @@ sfc_flow_parse_rte_to_mae(struct rte_eth_dev *dev, if (rc != 0) return rc; + rc = sfc_mae_rule_parse_actions(sa, actions, &spec_mae->action_set, + error); + if (rc != 0) + return rc; + return 0; } @@ -2562,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) { @@ -2596,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; } @@ -2620,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) {