aboutsummaryrefslogtreecommitdiff
path: root/datapath
diff options
context:
space:
mode:
authorPravin B Shelar <pshelar@nicira.com>2011-10-04 17:48:33 -0700
committerPravin B Shelar <pshelar@nicira.com>2011-10-04 17:48:33 -0700
commitbd85a68f94b890c2d9b62788d68150770dc48a42 (patch)
tree444e12b1c2f157b78ec5877aabc34ab8456aef34 /datapath
parentdc56021df437b866c372085c195b8bdd12bd87b2 (diff)
datapath: Fix tunnel hashing.
struct port_lookup_key is getting extra 4 bytes due to alignment on x86_64. That is messing with hash calculation which uses sizeof operator to calculate key length. Following patch fixes tunnel hashing by using correct key length. This bug was introduced by commit f686a33af8cb41ee228e6a35410c9a488fba3eb1 "datapath: Streamline tunnel port lookup" Signed-off-by: Pravin B Shelar <pshelar@nicira.com> Acked-by: Jesse Gross <jesse@nicira.com> Bug #7622
Diffstat (limited to 'datapath')
-rw-r--r--datapath/tunnel.c4
-rw-r--r--datapath/tunnel.h3
2 files changed, 5 insertions, 2 deletions
diff --git a/datapath/tunnel.c b/datapath/tunnel.c
index 100794e0..3576df84 100644
--- a/datapath/tunnel.c
+++ b/datapath/tunnel.c
@@ -174,7 +174,7 @@ static unsigned int *find_port_pool(const struct tnl_mutable_config *mutable)
static u32 port_hash(const struct port_lookup_key *key)
{
- return jhash2((u32*)key, (sizeof(*key) / sizeof(u32)), 0);
+ return jhash2((u32*)key, (PORT_KEY_LEN / sizeof(u32)), 0);
}
static inline struct hlist_head *find_bucket(u32 hash)
@@ -241,7 +241,7 @@ static struct tnl_vport *port_table_lookup(struct port_lookup_key *key,
struct tnl_mutable_config *mutable;
mutable = rcu_dereference_rtnl(tnl_vport->mutable);
- if (!memcmp(&mutable->key, key, sizeof(*key))) {
+ if (!memcmp(&mutable->key, key, PORT_KEY_LEN)) {
*pmutable = mutable;
return tnl_vport;
}
diff --git a/datapath/tunnel.h b/datapath/tunnel.h
index b3e21fa9..e7bafbc9 100644
--- a/datapath/tunnel.h
+++ b/datapath/tunnel.h
@@ -58,6 +58,9 @@ struct port_lookup_key {
u32 tunnel_type;
};
+#define PORT_KEY_LEN (offsetof(struct port_lookup_key, tunnel_type) + \
+ FIELD_SIZEOF(struct port_lookup_key, tunnel_type))
+
/**
* struct tnl_mutable_config - modifiable configuration for a tunnel.
* @key: Used as key for tunnel port. Configured via OVS_TUNNEL_ATTR_*