From c2b283b7106653392b49cf95940dbd96c11d0107 Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Thu, 28 Jan 2016 16:27:32 -0800 Subject: [PATCH] ofproto-dpif-xlate: Improve recirc_unroll_actions() interface. This interface is still straightforward and easier for the client. Signed-off-by: Ben Pfaff Acked-by: Jarno Rajahalme --- ofproto/ofproto-dpif-xlate.c | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c index a6ea0679d..3d7dc08df 100644 --- a/ofproto/ofproto-dpif-xlate.c +++ b/ofproto/ofproto-dpif-xlate.c @@ -4163,16 +4163,14 @@ recirc_put_unroll_xlate(struct xlate_ctx *ctx) } -/* Copy remaining actions to the action_set to be executed after recirculation. - * UNROLL_XLATE action is inserted, if not already done so, before actions that - * may depend on the current table ID or flow cookie. */ +/* Copy actions 'a' through 'end' to the action_set to be executed after + * recirculation. UNROLL_XLATE action is inserted, if not already done so, + * before actions that may depend on the current table ID or flow cookie. */ static void -recirc_unroll_actions(const struct ofpact *ofpacts, size_t ofpacts_len, +recirc_unroll_actions(const struct ofpact *a, const struct ofpact *end, struct xlate_ctx *ctx) { - const struct ofpact *a; - - OFPACT_FOR_EACH (a, ofpacts, ofpacts_len) { + for (; a < end; a = ofpact_next(a)) { switch (a->type) { case OFPACT_OUTPUT_REG: case OFPACT_GROUP: @@ -4439,9 +4437,7 @@ do_xlate_actions(const struct ofpact *ofpacts, size_t ofpacts_len, /* Check if need to store the remaining actions for later * execution. */ if (exit_recirculates(ctx)) { - recirc_unroll_actions(a, OFPACT_ALIGN(ofpacts_len - - ((uint8_t *)a - - (uint8_t *)ofpacts)), + recirc_unroll_actions(a, ofpact_end(ofpacts, ofpacts_len), ctx); } break; @@ -4817,10 +4813,7 @@ do_xlate_actions(const struct ofpact *ofpacts, size_t ofpacts_len, /* Check if need to store this and the remaining actions for later * execution. */ if (!ctx->error && ctx->exit && ctx_first_recirculation_action(ctx)) { - recirc_unroll_actions(a, OFPACT_ALIGN(ofpacts_len - - ((uint8_t *)a - - (uint8_t *)ofpacts)), - ctx); + recirc_unroll_actions(a, ofpact_end(ofpacts, ofpacts_len), ctx); break; } } -- 2.20.1