All of the callers of hash_words() and hash_words64() actually find it easier to pass in the number of bytes instead of the number of 32-bit or 64-bit words. These new functions allow the callers to be a little simpler.
Signed-off-by: Ben Pfaff <b...@ovn.org> --- lib/flow.h | 5 ++--- lib/hash.h | 14 +++++++++++++- lib/odp-util.c | 5 ++--- lib/ofp-msgs.c | 6 +++--- ofproto/ofproto-dpif-rid.c | 19 ++++++++----------- 5 files changed, 28 insertions(+), 21 deletions(-) diff --git a/lib/flow.h b/lib/flow.h index 5d78615..dc7130d 100644 --- a/lib/flow.h +++ b/lib/flow.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015 Nicira, Inc. + * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016 Nicira, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -263,8 +263,7 @@ flow_equal(const struct flow *a, const struct flow *b) static inline size_t flow_hash(const struct flow *flow, uint32_t basis) { - return hash_words64((const uint64_t *)flow, - sizeof *flow / sizeof(uint64_t), basis); + return hash_bytes64((const uint64_t *)flow, sizeof *flow, basis); } static inline uint16_t diff --git a/lib/hash.h b/lib/hash.h index 65c52b9..114a419 100644 --- a/lib/hash.h +++ b/lib/hash.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009, 2010, 2012, 2013, 2014 Nicira, Inc. + * Copyright (c) 2008, 2009, 2010, 2012, 2013, 2014, 2016 Nicira, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -323,6 +323,18 @@ hash_words64(const uint64_t p[], size_t n_words, uint32_t basis) } #endif +static inline uint32_t +hash_bytes32(const uint32_t p[], size_t n_bytes, uint32_t basis) +{ + return hash_words(p, n_bytes / 4, basis); +} + +static inline uint32_t +hash_bytes64(const uint64_t p[], size_t n_bytes, uint32_t basis) +{ + return hash_words64(p, n_bytes / 8, basis); +} + static inline uint32_t hash_string(const char *s, uint32_t basis) { return hash_bytes(s, strlen(s), basis); diff --git a/lib/odp-util.c b/lib/odp-util.c index f16e113..6271601 100644 --- a/lib/odp-util.c +++ b/lib/odp-util.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2010, 2011, 2012, 2013, 2014, 2015 Nicira, Inc. + * Copyright (c) 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016 Nicira, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -4532,8 +4532,7 @@ uint32_t odp_flow_key_hash(const struct nlattr *key, size_t key_len) { BUILD_ASSERT_DECL(!(NLA_ALIGNTO % sizeof(uint32_t))); - return hash_words(ALIGNED_CAST(const uint32_t *, key), - key_len / sizeof(uint32_t), 0); + return hash_bytes32(ALIGNED_CAST(const uint32_t *, key), key_len, 0); } static void diff --git a/lib/ofp-msgs.c b/lib/ofp-msgs.c index cb27f79..944ab33 100644 --- a/lib/ofp-msgs.c +++ b/lib/ofp-msgs.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2013, 2014, 2015 Nicira, Inc. + * Copyright (c) 2012, 2013, 2014, 2015, 2016 Nicira, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -118,8 +118,8 @@ alloc_xid(void) static uint32_t ofphdrs_hash(const struct ofphdrs *hdrs) { - BUILD_ASSERT_DECL(sizeof *hdrs == 12); - return hash_words((const uint32_t *) hdrs, 3, 0); + BUILD_ASSERT_DECL(sizeof *hdrs % 4 == 0); + return hash_bytes32((const uint32_t *) hdrs, sizeof *hdrs, 0); } static bool diff --git a/ofproto/ofproto-dpif-rid.c b/ofproto/ofproto-dpif-rid.c index d142933..cb00301 100644 --- a/ofproto/ofproto-dpif-rid.c +++ b/ofproto/ofproto-dpif-rid.c @@ -135,25 +135,22 @@ recirc_metadata_hash(const struct recirc_state *state) if (flow_tnl_dst_is_set(state->metadata.tunnel)) { /* We may leave remainder bytes unhashed, but that is unlikely as * the tunnel is not in the datapath format. */ - hash = hash_words64((const uint64_t *) state->metadata.tunnel, - flow_tnl_size(state->metadata.tunnel) - / sizeof(uint64_t), hash); + hash = hash_bytes64((const uint64_t *) state->metadata.tunnel, + flow_tnl_size(state->metadata.tunnel), hash); } hash = hash_boolean(state->conntracked, hash); - hash = hash_words64((const uint64_t *) &state->metadata.metadata, - (sizeof state->metadata - sizeof state->metadata.tunnel) - / sizeof(uint64_t), + hash = hash_bytes64((const uint64_t *) &state->metadata.metadata, + sizeof state->metadata - sizeof state->metadata.tunnel, hash); if (state->stack && state->stack->size != 0) { - hash = hash_words64((const uint64_t *) state->stack->data, - state->stack->size / sizeof(uint64_t), hash); + hash = hash_bytes64((const uint64_t *) state->stack->data, + state->stack->size, hash); } hash = hash_int(state->mirrors, hash); hash = hash_int(state->action_set_len, hash); if (state->ofpacts_len) { - hash = hash_words64(ALIGNED_CAST(const uint64_t *, state->ofpacts), - state->ofpacts_len / sizeof(uint64_t), - hash); + hash = hash_bytes64(ALIGNED_CAST(const uint64_t *, state->ofpacts), + state->ofpacts_len, hash); } return hash; } -- 2.1.3 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev