diff mbox series

[ovs-dev,V2,1/1] dpif-netdev: Keep orig_in_port as a field of the flow

Message ID 20220207170933.812561-1-elibr@nvidia.com
State Accepted
Commit 635cb95e0cee843a773d73b020adfef8979f8883
Headers show
Series [ovs-dev,V2,1/1] dpif-netdev: Keep orig_in_port as a field of the flow | expand

Checks

Context Check Description
ovsrobot/apply-robot success apply and check: success
ovsrobot/github-robot-_Build_and_Test fail github build: failed
ovsrobot/intel-ovs-compilation success test: success

Commit Message

Eli Britstein Feb. 7, 2022, 5:09 p.m. UTC
A flow may be modified after its initial offload failed. In this case,
according to [1], the modification is handled as a flow add.
For a vport flow "add", the orig_in_port should be provided.
Keep that field in the flow struct, so it can be provided in the flow
modification use case.

[1] 0d25621e4d9f ("dpif-netdev: Fix flow modification after failure.")

Fixes: b5e6f6f6bfbe ("dpif-netdev: Provide orig_in_port in metadata for tunneled packets.")
Signed-off-by: Eli Britstein <elibr@nvidia.com>
---
 lib/dpif-netdev-private-flow.h | 1 +
 lib/dpif-netdev.c              | 9 +++++----
 2 files changed, 6 insertions(+), 4 deletions(-)

Comments

Ilya Maximets March 22, 2022, 11:18 p.m. UTC | #1
On 2/7/22 18:09, Eli Britstein via dev wrote:
> A flow may be modified after its initial offload failed. In this case,
> according to [1], the modification is handled as a flow add.
> For a vport flow "add", the orig_in_port should be provided.
> Keep that field in the flow struct, so it can be provided in the flow
> modification use case.
> 
> [1] 0d25621e4d9f ("dpif-netdev: Fix flow modification after failure.")
> 
> Fixes: b5e6f6f6bfbe ("dpif-netdev: Provide orig_in_port in metadata for tunneled packets.")
> Signed-off-by: Eli Britstein <elibr@nvidia.com>
> ---

Thanks!  Applied and backported down to 2.16.

Best regards, Ilya Maximets.
diff mbox series

Patch

diff --git a/lib/dpif-netdev-private-flow.h b/lib/dpif-netdev-private-flow.h
index 66016eb09..7425dd44e 100644
--- a/lib/dpif-netdev-private-flow.h
+++ b/lib/dpif-netdev-private-flow.h
@@ -104,6 +104,7 @@  struct dp_netdev_flow {
     bool dead;
     uint32_t mark;               /* Unique flow mark for netdev offloading. */
     uint64_t simple_match_mark;  /* Unique flow mark for the simple match. */
+    odp_port_t orig_in_port;
 
     /* Statistics. */
     struct dp_netdev_flow_stats stats;
diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
index e28e0b554..b4ff515a1 100644
--- a/lib/dpif-netdev.c
+++ b/lib/dpif-netdev.c
@@ -2993,7 +2993,7 @@  static void
 queue_netdev_flow_put(struct dp_netdev_pmd_thread *pmd,
                       struct dp_netdev_flow *flow, struct match *match,
                       const struct nlattr *actions, size_t actions_len,
-                      odp_port_t orig_in_port, int op)
+                      int op)
 {
     struct dp_offload_thread_item *item;
     struct dp_offload_flow_item *flow_offload;
@@ -3008,7 +3008,7 @@  queue_netdev_flow_put(struct dp_netdev_pmd_thread *pmd,
     flow_offload->actions = xmalloc(actions_len);
     memcpy(flow_offload->actions, actions, actions_len);
     flow_offload->actions_len = actions_len;
-    flow_offload->orig_in_port = orig_in_port;
+    flow_offload->orig_in_port = flow->orig_in_port;
 
     item->timestamp = pmd->ctx.now;
     dp_netdev_offload_flow_enqueue(item);
@@ -4084,6 +4084,7 @@  dp_netdev_flow_add(struct dp_netdev_pmd_thread *pmd,
     flow->dead = false;
     flow->batch = NULL;
     flow->mark = INVALID_FLOW_MARK;
+    flow->orig_in_port = orig_in_port;
     *CONST_CAST(unsigned *, &flow->pmd_id) = pmd->core_id;
     *CONST_CAST(struct flow *, &flow->flow) = match->flow;
     *CONST_CAST(ovs_u128 *, &flow->ufid) = *ufid;
@@ -4118,7 +4119,7 @@  dp_netdev_flow_add(struct dp_netdev_pmd_thread *pmd,
     }
 
     queue_netdev_flow_put(pmd, flow, match, actions, actions_len,
-                          orig_in_port, DP_NETDEV_FLOW_OFFLOAD_OP_ADD);
+                          DP_NETDEV_FLOW_OFFLOAD_OP_ADD);
     log_netdev_flow_change(flow, match, NULL, actions, actions_len);
 
     return flow;
@@ -4160,7 +4161,7 @@  flow_put_on_pmd(struct dp_netdev_pmd_thread *pmd,
             ovsrcu_set(&netdev_flow->actions, new_actions);
 
             queue_netdev_flow_put(pmd, netdev_flow, match,
-                                  put->actions, put->actions_len, ODPP_NONE,
+                                  put->actions, put->actions_len,
                                   DP_NETDEV_FLOW_OFFLOAD_OP_MOD);
             log_netdev_flow_change(netdev_flow, match, old_actions,
                                    put->actions, put->actions_len);