From d7bf2b001f07e63054bbc0d58fe64ce47bc3ab21 Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Fri, 21 Jan 2011 17:09:21 -0800 Subject: [PATCH] multipath: Fix off-by-one in hash_threshold multipath calculation. 0xffffffff / (0xffffffff / n) can have a value as large as n (consider the n == 1 case), but we need a value no bigger than n-1. So add 1 before dividing to fix the problem. This caused a test failure on Debian "lenny" amd64 when apparently unrelated code changed. Reported-by: Justin Pettit --- lib/multipath.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/multipath.c b/lib/multipath.c index af0ebffe..83df6805 100644 --- a/lib/multipath.c +++ b/lib/multipath.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010 Nicira Networks. + * Copyright (c) 2010, 2011 Nicira Networks. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -195,7 +195,10 @@ multipath_algorithm(uint32_t hash, enum nx_mp_algorithm algorithm, return hash % n_links; case NX_MP_ALG_HASH_THRESHOLD: - return hash / (UINT32_MAX / n_links); + if (n_links == 1) { + return 0; + } + return hash / (UINT32_MAX / n_links + 1); case NX_MP_ALG_HRW: return (n_links <= 64 -- 2.30.2