projects
/
openvswitch
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
ofpbuf: New function ofpbuf_clone_data_with_headroom().
[openvswitch]
/
lib
/
multipath.c
diff --git
a/lib/multipath.c
b/lib/multipath.c
index 7d4b541ed42922bcdd8be0d32ee23b81debd0130..83df6805d15ec27da26e866196af85e442a79bfa 100644
(file)
--- 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.
*
* 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 <config.h>
#include "multipath.h"
#include <config.h>
#include "multipath.h"
+#include <arpa/inet.h>
#include <inttypes.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <inttypes.h>
#include <sys/types.h>
#include <netinet/in.h>
@@
-99,6
+100,7
@@
hash_symmetric_l4(const struct flow *flow, uint16_t basis)
int i;
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];
}
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 % 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
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;
{
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;
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 = "<unknown>";
}
fields = "<unknown>";
}
- 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;
case NX_MP_ALG_MODULO_N:
algorithm = "modulo_n";
break;