Refactor offload rule creation as a pre-step towards tunnel matching
that depend on the netdev.
Signed-off-by: Eli Britstein <[email protected]>
Reviewed-by: Gaetan Rivet <[email protected]>
---
lib/netdev-offload-dpdk.c | 106 ++++++++++++++++----------------------
1 file changed, 45 insertions(+), 61 deletions(-)
diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c
index 493cc9159..f6e668bff 100644
--- a/lib/netdev-offload-dpdk.c
+++ b/lib/netdev-offload-dpdk.c
@@ -1009,30 +1009,6 @@ add_flow_mark_rss_actions(struct flow_actions *actions,
add_flow_action(actions, RTE_FLOW_ACTION_TYPE_END, NULL);
}
-static struct rte_flow *
-netdev_offload_dpdk_mark_rss(struct flow_patterns *patterns,
- struct netdev *netdev,
- uint32_t flow_mark)
-{
- struct flow_actions actions = { .actions = NULL, .cnt = 0 };
- const struct rte_flow_attr flow_attr = {
- .group = 0,
- .priority = 0,
- .ingress = 1,
- .egress = 0
- };
- struct rte_flow_error error;
- struct rte_flow *flow;
-
- add_flow_mark_rss_actions(&actions, flow_mark, netdev);
-
- flow = netdev_offload_dpdk_flow_create(netdev, &flow_attr, patterns->items,
- &actions, &error);
-
- free_flow_actions(&actions);
- return flow;
-}
-
static void
add_count_action(struct flow_actions *actions)
{
@@ -1509,27 +1485,48 @@ parse_flow_actions(struct netdev *netdev,
return 0;
}
-static struct rte_flow *
-netdev_offload_dpdk_actions(struct netdev *netdev,
- struct flow_patterns *patterns,
- struct nlattr *nl_actions,
- size_t actions_len)
+static struct ufid_to_rte_flow_data *
+create_netdev_offload(struct netdev *netdev,
+ const ovs_u128 *ufid,
+ struct flow_patterns *flow_patterns,
+ struct flow_actions *flow_actions,
+ bool enable_full,
+ uint32_t flow_mark)
{
- const struct rte_flow_attr flow_attr = { .ingress = 1, .transfer = 1 };
- struct flow_actions actions = { .actions = NULL, .cnt = 0 };
+ struct rte_flow_attr flow_attr = { .ingress = 1, .transfer = 1, };
+ struct flow_actions rss_actions = { .actions = NULL, .cnt = 0 };
+ struct rte_flow_item *items = flow_patterns->items;
+ struct ufid_to_rte_flow_data *flow_data = NULL;
+ bool actions_offloaded = true;
struct rte_flow *flow = NULL;
struct rte_flow_error error;
- int ret;
- ret = parse_flow_actions(netdev, &actions, nl_actions, actions_len);
- if (ret) {
- goto out;
+ if (enable_full) {
+ flow = netdev_offload_dpdk_flow_create(netdev, &flow_attr, items,
+ flow_actions, &error);
}
- flow = netdev_offload_dpdk_flow_create(netdev, &flow_attr, patterns->items,
- &actions, &error);
-out:
- free_flow_actions(&actions);
- return flow;
+
+ if (!flow) {
+ /* If we failed to offload the rule actions fallback to MARK+RSS
+ * actions.
+ */