From: Mesut Ali Ergin Date: Thu, 16 May 2019 04:28:03 +0000 (-0700) Subject: net/i40e: support MARK and RSS flow action X-Git-Url: http://git.droids-corp.org/?a=commitdiff_plain;h=0bbcfc706a2bf4a4767115b532aecdb83ba9e183;p=dpdk.git net/i40e: support MARK and RSS flow action Currently, i40e Flow Director action parser only allows following nine action combinations: (QUEUE, PASSTHRU, DROP, QUEUE + MARK, PASSTHRU + MARK, DROP + MARK, QUEUE + FLAG, PASSTHRU + FLAG, DROP + FLAG) Using the existing Cloud Filter profile on the NIC, it is possible to add support for two more combinations as: (MARK + RSS, MARK + FLAG + RSS) Addition of these new combinations would allow more applications to utilize DPDK rte_flow to implement hardware flow offloads with Intel Ethernet 700 series network adapters, including but not limited to the existing OVS DPDK partial hardware flow offload feature. Signed-off-by: Mesut Ali Ergin Acked-by: Qi Zhang --- diff --git a/drivers/net/i40e/i40e_flow.c b/drivers/net/i40e/i40e_flow.c index 3053d1fce0..8b2e2975e9 100644 --- a/drivers/net/i40e/i40e_flow.c +++ b/drivers/net/i40e/i40e_flow.c @@ -3078,6 +3078,12 @@ i40e_flow_parse_fdir_action(struct rte_eth_dev *dev, case RTE_FLOW_ACTION_TYPE_PASSTHRU: filter->action.behavior = I40E_FDIR_PASSTHRU; break; + case RTE_FLOW_ACTION_TYPE_MARK: + filter->action.behavior = I40E_FDIR_PASSTHRU; + mark_spec = act->conf; + filter->action.report_status = I40E_FDIR_REPORT_ID; + filter->soft_id = mark_spec->id; + break; default: rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_ACTION, act, @@ -3090,13 +3096,36 @@ i40e_flow_parse_fdir_action(struct rte_eth_dev *dev, NEXT_ITEM_OF_ACTION(act, actions, index); switch (act->type) { case RTE_FLOW_ACTION_TYPE_MARK: + if (!mark_spec) { + /* Double MARK actions requested */ + rte_flow_error_set(error, EINVAL, + RTE_FLOW_ERROR_TYPE_ACTION, act, + "Invalid action."); + return -rte_errno; + } mark_spec = act->conf; filter->action.report_status = I40E_FDIR_REPORT_ID; filter->soft_id = mark_spec->id; break; case RTE_FLOW_ACTION_TYPE_FLAG: + if (!mark_spec) { + /* MARK + FLAG not supported */ + rte_flow_error_set(error, EINVAL, + RTE_FLOW_ERROR_TYPE_ACTION, act, + "Invalid action."); + return -rte_errno; + } filter->action.report_status = I40E_FDIR_NO_REPORT_STATUS; break; + case RTE_FLOW_ACTION_TYPE_RSS: + if (filter->action.behavior != I40E_FDIR_PASSTHRU) { + /* RSS filter won't be next if FDIR did not pass thru */ + rte_flow_error_set(error, EINVAL, + RTE_FLOW_ERROR_TYPE_ACTION, act, + "Invalid action."); + return -rte_errno; + } + break; case RTE_FLOW_ACTION_TYPE_END: return 0; default: