A clone action saves the action_set prior to performing the clone, then restores it afterwards. However when xlating the actions it neglects to consider the action_set so any write_action() inside a clone() are ignored. Unfortunately patch ports are internally implemented via clone(). So a frame traversing to a second bridge via patch port will never be affected by write_action() in the second bridge's flow table.
Lets make clone() aware of the action_set. Signed-off-by: Eric Garver <e...@erig.me> --- ofproto/ofproto-dpif-xlate.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c index cc450a896948..bc6429c25346 100644 --- a/ofproto/ofproto-dpif-xlate.c +++ b/ofproto/ofproto-dpif-xlate.c @@ -5303,6 +5303,9 @@ clone_xlate_actions(const struct ofpact *actions, size_t actions_len, if (reversible_actions(actions, actions_len) || is_last_action) { old_flow = ctx->xin->flow; do_xlate_actions(actions, actions_len, ctx, is_last_action); + if (!ctx->freezing) { + xlate_action_set(ctx); + } if (ctx->freezing) { finish_freezing(ctx); } @@ -5324,6 +5327,9 @@ clone_xlate_actions(const struct ofpact *actions, size_t actions_len, /* Use clone action as datapath clone. */ offset = nl_msg_start_nested(ctx->odp_actions, OVS_ACTION_ATTR_CLONE); do_xlate_actions(actions, actions_len, ctx, true); + if (!ctx->freezing) { + xlate_action_set(ctx); + } if (ctx->freezing) { finish_freezing(ctx); } @@ -5337,6 +5343,9 @@ clone_xlate_actions(const struct ofpact *actions, size_t actions_len, ac_offset = nl_msg_start_nested(ctx->odp_actions, OVS_SAMPLE_ATTR_ACTIONS); do_xlate_actions(actions, actions_len, ctx, true); + if (!ctx->freezing) { + xlate_action_set(ctx); + } if (ctx->freezing) { finish_freezing(ctx); } -- 2.11.0 _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev