[ovs-dev] [PATCH v3 06/16] ofproto-dpif: Execute with helper if recirc actions are present

Simon Horman horms at verge.net.au
Tue Apr 22 08:54:54 UTC 2014


In the case where packet is being processed by
ofproto_dpif_execute_actions*() it may have an in_port
that does not exist in the datapath: e.g. a packet from a packet_out message
with the CONTROLLER as the in_port.

In such cases it seems to make little sense to perform execution
in the datapath if a recirc action is present as it will cause
an upcall with an in_port that doesn't exist. Indeed, in this case
packets are dropped.

Resolve this problem by executing packets in ovs-vswtichd if
they handled by ofproto_dpif_execute_actions*() and translation
adds a recirc actions.

Signed-off-by: Simon Horman <horms at verge.net.au>
---
 ofproto/ofproto-dpif.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c
index 7a4f130..7255dda 100644
--- a/ofproto/ofproto-dpif.c
+++ b/ofproto/ofproto-dpif.c
@@ -3116,7 +3116,11 @@ ofproto_dpif_execute_actions__(struct ofproto_dpif *ofproto,
     execute.md.skb_priority = flow->skb_priority;
     execute.md.pkt_mark = flow->pkt_mark;
     execute.md.in_port.odp_port = ofp_port_to_odp_port(ofproto, in_port);
-    execute.needs_help = (xout.slow & SLOW_ACTION) != 0;
+    /* If recirculation occurred execution needs help in case
+     * the packet was received from a port that doesn't exist
+     * in the datapath: e.g. the CONTROLLER port. */
+    execute.needs_help = (xout.slow & SLOW_ACTION) != 0
+        || xout.has_recirc;
     execute.recirc_list = recirc_list;
 
     error = dpif_execute(ofproto->backer->dpif, &execute);
-- 
1.8.5.2




More information about the dev mailing list