[ovs-dev] [PATCH] ovn: fix tunnel id overflow
liwei
liwei at anbutu.com
Thu Apr 5 02:09:46 UTC 2018
On Thu, Apr 5, 2018 at 1:16 AM, Ben Pfaff <blp at ovn.org> wrote:
> On Wed, Apr 04, 2018 at 02:57:38PM +0800, Wei Li wrote:
>> Need to check tnlid dosen't exceed max and wrap it when it dose.
>>
>> Signed-off-by: Wei Li <liwei at anbutu.com>
>> ---
>> ovn/northd/ovn-northd.c | 2 +-
>> 1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/ovn/northd/ovn-northd.c b/ovn/northd/ovn-northd.c
>> index 396381049..f286322b1 100644
>> --- a/ovn/northd/ovn-northd.c
>> +++ b/ovn/northd/ovn-northd.c
>> @@ -298,7 +298,7 @@ allocate_tnlid(struct hmap *set, const char *name, uint32_t max,
>> {
>> for (uint32_t tnlid = *hint + 1; tnlid != *hint;
>> tnlid = tnlid + 1 <= max ? tnlid + 1 : 1) {
>> - if (!tnlid_in_use(set, tnlid)) {
>> + if (tnlid <= max && !tnlid_in_use(set, tnlid)) {
>> add_tnlid(set, tnlid);
>> *hint = tnlid;
>> return tnlid;
>
> Thanks for the bug fix.
>
> This code has an inconsistency: the third clause of the "for" statement
> wraps around 'max' properly but the first clause does not. I think that
> a better fix would make them consistent. My suggestion is below. Does
> it also fix the problem?
Yes, it works.
Will you apply this patch directly or need I repost this patch as your
suggestion? will this patch be backported to old stable versions?
Thanks
>
> Thanks,
>
> Ben.
>
> diff --git a/ovn/northd/ovn-northd.c b/ovn/northd/ovn-northd.c
> index 07896be84d8f..9ca15bc2ff4b 100644
> --- a/ovn/northd/ovn-northd.c
> +++ b/ovn/northd/ovn-northd.c
> @@ -292,12 +292,18 @@ tnlid_in_use(const struct hmap *set, uint32_t tnlid)
> return false;
> }
>
> +static uint32_t
> +next_tnlid(uint32_t tnlid, uint32_t max)
> +{
> + return tnlid + 1 <= max ? tnlid + 1 : 1;
> +}
> +
> static uint32_t
> allocate_tnlid(struct hmap *set, const char *name, uint32_t max,
> uint32_t *hint)
> {
> - for (uint32_t tnlid = *hint + 1; tnlid != *hint;
> - tnlid = tnlid + 1 <= max ? tnlid + 1 : 1) {
> + for (uint32_t tnlid = next_tnlid(*hint, max); tnlid != *hint;
> + tnlid = next_tnlid(tnlid, max)) {
> if (!tnlid_in_use(set, tnlid)) {
> add_tnlid(set, tnlid);
> *hint = tnlid;
More information about the dev
mailing list