From 8073bc818ce11feab570b87efdae410357a581f9 Mon Sep 17 00:00:00 2001 From: Matan Azrad Date: Tue, 3 Oct 2017 14:55:56 +0000 Subject: [PATCH] net/tap: allow RSS flow action One of the main identified use cases for the tap PMD is to be used in combination with the fail-safe PMD as a fallback for a physical device. Fail-safe is very strict about making sure its current configuration is properly applied to all slave devices, they get rejected otherwise in order to maintain a consistent state. The problem is that tap's RSS support is currently limited to the default (non-Toeplitz) balancing performed by the kernel on all Rx queues. While proper RSS support emulation in the tap PMD is a work in progress, the lack of rte_flow counterpart prevents validation of the above use case in the meantime. Given that unlike most PMDs, tap is more about convenience than performance, support for the RSS action can be temporarily faked with a minimum amount of code and mostly correct behavior by treating it like a QUEUE action. Traffic is directed to the first queue of the set. Signed-off-by: Matan Azrad Acked-by: Pascal Mazon --- drivers/net/tap/tap_flow.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/drivers/net/tap/tap_flow.c b/drivers/net/tap/tap_flow.c index aa339608b9..28d793fbf8 100644 --- a/drivers/net/tap/tap_flow.c +++ b/drivers/net/tap/tap_flow.c @@ -1089,6 +1089,7 @@ priv_flow_process(struct pmd_internals *pmd, const struct rte_flow_action_queue *queue = (const struct rte_flow_action_queue *) actions->conf; + if (action) goto exit_action_not_supported; action = 1; @@ -1097,6 +1098,20 @@ priv_flow_process(struct pmd_internals *pmd, goto exit_action_not_supported; if (flow) err = add_action_skbedit(flow, queue->index); + } else if (actions->type == RTE_FLOW_ACTION_TYPE_RSS) { + /* Fake RSS support. */ + const struct rte_flow_action_rss *rss = + (const struct rte_flow_action_rss *) + actions->conf; + + if (action) + goto exit_action_not_supported; + action = 1; + if (!rss || rss->num < 1 || + (rss->queue[0] > pmd->dev->data->nb_rx_queues - 1)) + goto exit_action_not_supported; + if (flow) + err = add_action_skbedit(flow, rss->queue[0]); } else { goto exit_action_not_supported; } -- 2.20.1