From 603f2ce04d000892cc4db841cff7b3b3fc95bb6c Mon Sep 17 00:00:00 2001 From: Ethan Jackson Date: Wed, 20 May 2015 16:55:17 -0700 Subject: [PATCH] dpif-netdev: Clear flow batches before execute. When executing actions, it's possible a recirculation will occur causing dp_netdev_input() to be called multiple times. If the batch pointers embedded in dp_netdev_flow aren't cleared, it's possible packets after the recirculation will be reinserted into a batch associated with the original lookup. This could be very bad. This patch fixes the problem by zeroing out flow batch pointers before calling packet_batch_execute(). This probably has a slightly negative performance impact, though I haven't tried it. Signed-off-by: Ethan Jackson Acked-by: Daniele Di Proietto --- lib/dpif-netdev.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index b4a42eb11..ff583e7b1 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -3066,7 +3066,6 @@ packet_batch_execute(struct packet_batch *batch, struct dp_netdev_actions *actions; struct dp_netdev_flow *flow = batch->flow; - flow->batch = NULL; dp_netdev_flow_used(flow, batch->packet_count, batch->byte_count, batch->tcp_flags, now); @@ -3298,6 +3297,10 @@ dp_netdev_input(struct dp_netdev_pmd_thread *pmd, fast_path_processing(pmd, packets, newcnt, keys, batches, &n_batches); } + for (i = 0; i < n_batches; i++) { + batches[i].flow->batch = NULL; + } + for (i = 0; i < n_batches; i++) { packet_batch_execute(&batches[i], pmd, now); } -- 2.20.1