X-Git-Url: http://git.cascardo.eti.br/?a=blobdiff_plain;f=ofproto%2Fofproto-dpif-xlate.c;h=1738394b5c50003bd208a7a35be67bc3d735d0e2;hb=ac6d120f8e8ad1802b7d89dcf3c6e6d9d399cdf7;hp=a4007e31c3bd3972ab103382a5f33d7da02eae31;hpb=d787ad39b8eb8fb9136837e1c65d0a18a1056eda;p=cascardo%2Fovs.git diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c index a4007e31c..1738394b5 100644 --- a/ofproto/ofproto-dpif-xlate.c +++ b/ofproto/ofproto-dpif-xlate.c @@ -3591,6 +3591,17 @@ compose_recirculate_action(struct xlate_ctx *ctx) compose_recirculate_action__(ctx, 0); } +/* Fork the pipeline here. The current packet will continue processing the + * current action list. A clone of the current packet will recirculate, skip + * the remainder of the current action list and asynchronously resume pipeline + * processing in 'table' with the current metadata and action set. */ +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 +4250,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); } } @@ -4448,7 +4458,7 @@ do_xlate_actions(const struct ofpact *ofpacts, size_t ofpacts_len, && !eth_type_mpls(flow->dl_type)) { break; } - /* A flow may wildcard nw_frag. Do nothing if setting a trasport + /* A flow may wildcard nw_frag. Do nothing if setting a transport * header field on a packet that does not have them. */ mf_mask_field_and_prereqs(mf, wc); if (mf_are_prereqs_ok(mf, flow)) {