[ovs-dev] [PATCH 1/2] ofproto-dpif-xlate: Don't stop processing after ct.

Joe Stringer joestringer at nicira.com
Mon Nov 9 18:56:07 UTC 2015


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 <rbryant at redhat.com>
Signed-off-by: Joe Stringer <joestringer at nicira.com>
---
 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




More information about the dev mailing list