X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fmultipath.c;h=83df6805d15ec27da26e866196af85e442a79bfa;hb=254f2dc8e3eb18debf4a8f238b9c87cf4d4dbd3f;hp=13f88ff023474151156a6abd69c32a12a13ef6b2;hpb=7cfb3c26b2abb82e95bbecaaf78317e7e7e343d4;p=openvswitch diff --git a/lib/multipath.c b/lib/multipath.c index 13f88ff0..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. @@ -17,6 +17,7 @@ #include #include "multipath.h" +#include #include #include #include @@ -194,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 @@ -268,7 +272,10 @@ multipath_format(const struct nx_action_multipath *mp, struct ds *s) { const char *fields, *algorithm; - switch ((enum nx_mp_fields) ntohs(mp->fields)) { + uint16_t mp_fields = ntohs(mp->fields); + uint16_t mp_algorithm = ntohs(mp->algorithm); + + switch ((enum nx_mp_fields) mp_fields) { case NX_MP_FIELDS_ETH_SRC: fields = "eth_src"; break; @@ -279,7 +286,7 @@ multipath_format(const struct nx_action_multipath *mp, struct ds *s) fields = ""; } - switch ((enum nx_mp_algorithm) ntohs(mp->algorithm)) { + switch ((enum nx_mp_algorithm) mp_algorithm) { case NX_MP_ALG_MODULO_N: algorithm = "modulo_n"; break;