When a "packet out" sent a packet to the datapath and then the datapath
sent the packet back via ODP_ACTION_ATTR_CONTROLLER, the in_port included
in the "packet out" was lost (it became OFPP_LOCAL) because the datapath's
"execute" operation doesn't accept an in_port.

This commit fixes the problem by including the in_port in the userdata
argument to ODP_ACTION_ATTR_CONTROLLER.

NICS-15.
Reported-by: Zoltan Kiss <zoltan.k...@citrix.com>
CC: David Tsai <dt...@nicira.com>
Signed-off-by: Ben Pfaff <b...@nicira.com>
---
Apologies if you receive multiple copies of this patch.  This
version adds a CC to David Tsai.

 AUTHORS           |    1 +
 ofproto/ofproto.c |    6 ++++--
 2 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/AUTHORS b/AUTHORS
index 84cb387..9033908 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -80,6 +80,7 @@ Takayuki HAMA           t-h...@cb.jp.nec.com
 Teemu Koponen           kopo...@nicira.com
 Vishal Swarankar        vishal.swarn...@gmail.com
 Yongqiang Liu           liuyq7...@gmail.com
+Zoltan Kiss             zoltan.k...@citrix.com
 kk yap                  yap...@stanford.edu
 
 Thanks to all Open vSwitch contributors.  If you are not listed above
diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c
index 37e2ad9..975e434 100644
--- a/ofproto/ofproto.c
+++ b/ofproto/ofproto.c
@@ -2752,7 +2752,8 @@ xlate_output_action__(struct action_xlate_ctx *ctx,
                       &ctx->nf_output_iface, ctx->odp_actions);
         break;
     case OFPP_CONTROLLER:
-        nl_msg_put_u64(ctx->odp_actions, ODP_ACTION_ATTR_CONTROLLER, max_len);
+        nl_msg_put_u64(ctx->odp_actions, ODP_ACTION_ATTR_CONTROLLER,
+                       max_len | (ctx->flow.in_port << 16));
         break;
     case OFPP_LOCAL:
         add_output_action(ctx, ODPP_LOCAL);
@@ -4463,6 +4464,7 @@ handle_upcall(struct ofproto *p, struct dpif_upcall 
*upcall)
     case DPIF_UC_ACTION:
         COVERAGE_INC(ofproto_ctlr_action);
         odp_flow_key_to_flow(upcall->key, upcall->key_len, &flow);
+        flow.in_port = upcall->userdata >> 16;
         send_packet_in(p, upcall, &flow, false);
         break;
 
@@ -4902,7 +4904,7 @@ schedule_packet_in(struct ofconn *ofconn, struct 
dpif_upcall *upcall,
         send_len = MIN(send_len, ofconn->miss_send_len);
     }
     if (upcall->type == DPIF_UC_ACTION) {
-        send_len = MIN(send_len, upcall->userdata);
+        send_len = MIN(send_len, upcall->userdata & 0xffff);
     }
 
     /* Copy or steal buffer for OFPT_PACKET_IN. */
-- 
1.7.2.5

_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to