From: Krishna Kondaka Date: Fri, 11 Jan 2013 05:20:22 +0000 (-0800) Subject: alloc_ofp_port does not allocate the port number correctly X-Git-Tag: sliver-openvswitch-1.9.90-3~10^2~6 X-Git-Url: http://git.onelab.eu/?p=sliver-openvswitch.git;a=commitdiff_plain;h=6033d9d9d7058b1fb83f8235a6eed0572285b97c alloc_ofp_port does not allocate the port number correctly alloc_ofp_port() does not allocate the port number correctly if the port number passed initially is already in use. The following if block if (ofp_port >= ofproto->max_ports || bitmap_is_set(ofproto->ofp_port_ids, ofp_port)) { is entered when either of the two conditions is true but the while block after this is not entered if the second condition above is true and the first condition is false. This results in an existing port_number to be re-assigned! Signed-off-by: Krishna Kondaka Signed-off-by: Justin Pettit --- diff --git a/AUTHORS b/AUTHORS index 0639f7e3b..b34287ef2 100644 --- a/AUTHORS +++ b/AUTHORS @@ -44,6 +44,7 @@ Joe Stringer joe@wand.net.nz Jun Nakajima jun.nakajima@intel.com Justin Pettit jpettit@nicira.com Keith Amidon keith@nicira.com +Krishna Kondaka kkondaka@vmware.com Kyle Mestery kmestery@cisco.com Leo Alterman lalterman@nicira.com Luca Giraudo lgiraudo@nicira.com diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c index 98515c298..8e2ea6b52 100644 --- a/ofproto/ofproto.c +++ b/ofproto/ofproto.c @@ -1613,38 +1613,30 @@ static uint16_t alloc_ofp_port(struct ofproto *ofproto, const char *netdev_name) { uint16_t ofp_port; + uint16_t end_port_no = ofproto->alloc_port_no; ofp_port = simap_get(&ofproto->ofp_requests, netdev_name); ofp_port = ofp_port ? ofp_port : OFPP_NONE; if (ofp_port >= ofproto->max_ports || bitmap_is_set(ofproto->ofp_port_ids, ofp_port)) { - bool retry = ofproto->alloc_port_no ? true : false; - /* Search for a free OpenFlow port number. We try not to * immediately reuse them to prevent problems due to old * flows. */ - while (ofp_port >= ofproto->max_ports) { - for (ofproto->alloc_port_no++; - ofproto->alloc_port_no < ofproto->max_ports; - ofproto->alloc_port_no++) { - if (!bitmap_is_set(ofproto->ofp_port_ids, - ofproto->alloc_port_no)) { - ofp_port = ofproto->alloc_port_no; - break; - } + for (;;) { + if (++ofproto->alloc_port_no >= ofproto->max_ports) { + ofproto->alloc_port_no = 0; } - if (ofproto->alloc_port_no >= ofproto->max_ports) { - if (retry) { - ofproto->alloc_port_no = 0; - retry = false; - } else { - return OFPP_NONE; - } + if (!bitmap_is_set(ofproto->ofp_port_ids, + ofproto->alloc_port_no)) { + ofp_port = ofproto->alloc_port_no; + break; + } + if (ofproto->alloc_port_no == end_port_no) { + return OFPP_NONE; } } } - bitmap_set1(ofproto->ofp_port_ids, ofp_port); return ofp_port; }