according to the specs, if a packet is not buffered for some reasons, we should send the entire packet, regardless of max_len.
Signed-off-by: YAMAMOTO Takashi <yamam...@valinux.co.jp> --- ofproto/connmgr.c | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/ofproto/connmgr.c b/ofproto/connmgr.c index 02da1f6..8bb96f0 100644 --- a/ofproto/connmgr.c +++ b/ofproto/connmgr.c @@ -1516,11 +1516,20 @@ static void schedule_packet_in(struct ofconn *ofconn, struct ofputil_packet_in pin) { struct connmgr *mgr = ofconn->connmgr; + uint16_t controller_max_len; pin.total_len = pin.packet_len; - /* Get OpenFlow buffer_id. */ if (pin.reason == OFPR_ACTION) { + controller_max_len = pin.send_len; /* max_len */ + } else { + controller_max_len = ofconn->miss_send_len; + } + + /* Get OpenFlow buffer_id. + * For OpenFlow 1.2+, OFPCML_NO_BUFFER (== UINT16_MAX) specifies + * unbuffered. This behaviour doesn't violate prior versions, too. */ + if (controller_max_len == UINT16_MAX) { pin.buffer_id = UINT32_MAX; } else if (mgr->fail_open && fail_open_is_active(mgr->fail_open)) { pin.buffer_id = pktbuf_get_null(); @@ -1531,15 +1540,13 @@ schedule_packet_in(struct ofconn *ofconn, struct ofputil_packet_in pin) pin.fmd.in_port); } - /* Figure out how much of the packet to send. */ - if (pin.reason == OFPR_NO_MATCH) { + /* Figure out how much of the packet to send. + * If not buffered, send the entire packet. Otherwise, depending on + * the reason of packet-in, send what requested by the controller. */ + if (pin.buffer_id == UINT32_MAX) { pin.send_len = pin.packet_len; } else { - /* Caller should have initialized 'send_len' to 'max_len' specified in - * output action. */ - } - if (pin.buffer_id != UINT32_MAX) { - pin.send_len = MIN(pin.send_len, ofconn->miss_send_len); + pin.send_len = MIN(pin.packet_len, controller_max_len); } /* Make OFPT_PACKET_IN and hand over to packet scheduler. It might -- 1.8.3.1 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev