From: Simon Horman Date: Wed, 24 Sep 2014 12:41:02 +0000 (+0000) Subject: ofproto-dpif-rid: correct logic error in rid_pool_alloc_id() X-Git-Tag: v2.3.1~31 X-Git-Url: http://git.cascardo.eti.br/?p=cascardo%2Fovs.git;a=commitdiff_plain;h=8dba24782fa8a9786184cb24718abbd28e115dd6 ofproto-dpif-rid: correct logic error in rid_pool_alloc_id() When searching through the valid ids an id should be used if is not found rather than if it is found. It appears to me that without this change duplicate recirculation ids may used in cases where the last recirculation id has been allocated; selection loops back to the beginning of the pool and; reaches a recirculation id that is still in use. As the number of recirculation ids is currently RECIRC_ID_N_IDS = 1024 this does not seem beyond the bounds of possibility. I have not verified that such a scenario can actually occur. But it seems that a likely consequence would be that some packets may be forwarded incorrectly. Signed-off-by: Simon Horman Signed-off-by: Andy Zhou --- diff --git a/ofproto/ofproto-dpif-rid.c b/ofproto/ofproto-dpif-rid.c index b3d98ebdd..e75dfc857 100644 --- a/ofproto/ofproto-dpif-rid.c +++ b/ofproto/ofproto-dpif-rid.c @@ -157,7 +157,7 @@ rid_pool_alloc_id(struct rid_pool *rids) } for(id = rids->base; id < rids->base + rids->n_ids; id++) { - if (rid_pool_find(rids, id)) { + if (!rid_pool_find(rids, id)) { goto found_free_id; } }