@@ -101,6 +101,7 @@ struct dp_netdev_flow {
bool dead;
uint32_t mark; /* Unique flow mark assigned to a flow */
+ odp_port_t orig_in_port;
/* Statistics. */
struct dp_netdev_flow_stats stats;
@@ -2779,7 +2779,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_flow_offload_item *offload;
@@ -2799,7 +2799,7 @@ queue_netdev_flow_put(struct dp_netdev_pmd_thread *pmd,
offload->actions = xmalloc(actions_len);
memcpy(offload->actions, actions, actions_len);
offload->actions_len = actions_len;
- offload->orig_in_port = orig_in_port;
+ offload->orig_in_port = flow->orig_in_port;
dp_netdev_append_flow_offload(offload);
}
@@ -3614,6 +3614,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;
@@ -3643,7 +3644,7 @@ dp_netdev_flow_add(struct dp_netdev_pmd_thread *pmd,
dp_netdev_flow_hash(&flow->ufid));
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;
@@ -3685,7 +3686,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);
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(-)