If conntrack recirculates, it should not stop processing the current pipeline. The cloned packet will begin with a fresh action set in the table specified with the current metadata; The current copy of the packet will continue processing, including to return back to prior resubmit() calls.
Reported-by: Russell Bryant <[email protected]> Signed-off-by: Joe Stringer <[email protected]> --- ofproto/ofproto-dpif-xlate.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c index 325e308e3340..bc21fa894682 100644 --- a/ofproto/ofproto-dpif-xlate.c +++ b/ofproto/ofproto-dpif-xlate.c @@ -3591,6 +3591,16 @@ compose_recirculate_action(struct xlate_ctx *ctx) compose_recirculate_action__(ctx, 0); } +/* Fork the pipeline here. The recirculated packet will continue processing in + * 'table' with an empty action set, and the current packet will continue + * processing the current action list. */ +static void +compose_recirculate_and_fork(struct xlate_ctx *ctx, uint8_t table) +{ + ctx->recirc_action_offset = ctx->action_set.size; + compose_recirculate_action__(ctx, table); +} + static void compose_mpls_push_action(struct xlate_ctx *ctx, struct ofpact_push_mpls *mpls) { @@ -4239,8 +4249,7 @@ compose_conntrack_action(struct xlate_ctx *ctx, struct ofpact_conntrack *ofc) } else { /* Use ct_* fields from datapath during recirculation upcall. */ ctx->conntracked = true; - ctx_trigger_recirculation(ctx); - compose_recirculate_action__(ctx, ofc->recirc_table); + compose_recirculate_and_fork(ctx, ofc->recirc_table); } } -- 2.1.4 _______________________________________________ dev mailing list [email protected] http://openvswitch.org/mailman/listinfo/dev
