X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fmultipath.c;h=83df6805d15ec27da26e866196af85e442a79bfa;hb=254f2dc8e3eb18debf4a8f238b9c87cf4d4dbd3f;hp=7d4b541ed42922bcdd8be0d32ee23b81debd0130;hpb=53ddd40ab56b6c31a2ced6b984c33ae27f458101;p=openvswitch diff --git a/lib/multipath.c b/lib/multipath.c index 7d4b541e..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 @@ -99,6 +100,7 @@ hash_symmetric_l4(const struct flow *flow, uint16_t basis) int i; + memset(&fields, 0, sizeof fields); for (i = 0; i < ETH_ADDR_LEN; i++) { fields.eth_addr[i] = flow->dl_src[i] ^ flow->dl_dst[i]; } @@ -193,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 @@ -267,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; @@ -278,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;