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 <ho...@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 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev