Sure, on the way.
On 6/9/17, 2:35 PM, "Ben Pfaff" <[email protected]> wrote:
OK. Do you want to post a new version of the series that adds your
changes and acks?
On Fri, Jun 09, 2017 at 09:23:44PM +0000, Darrell Ball wrote:
> I noticed the pre-existing hash function, conn_key_hash() was missing
> hash_finish(), I added it locally and retested.
>
>
>
> On 6/8/17, 8:34 PM, "[email protected] on behalf of Darrell
Ball" <[email protected] on behalf of [email protected]> wrote:
>
> Acked-by: Darrell Ball [email protected]
>
>
>
> I added an incremental so we can use the new abstraction in the
pre-existing
>
> hash function – conn_key_hash(). I am not sure if we need a separate
patch ?
>
>
>
> diff --git a/lib/conntrack.c b/lib/conntrack.c
>
> index 55029c8..d3e514d 100644
>
> --- a/lib/conntrack.c
>
> +++ b/lib/conntrack.c
>
> @@ -1509,20 +1509,30 @@ conn_key_extract(struct conntrack *ct, struct
dp_packet *pkt, ovs_be16 dl_type,
>
>
>
> return false;
>
> }
>
> +
>
> +static uint32_t
>
> +ct_addr_hash_add(uint32_t hash, const struct ct_addr *addr)
>
> +{
>
> + BUILD_ASSERT_DECL(sizeof *addr % 4 == 0);
>
> + return hash_add_bytes32(hash, (const uint32_t *) addr, sizeof
*addr);
>
> +}
>
> +
>
> +static uint32_t
>
> +ct_endpoint_hash_add(uint32_t hash, const struct ct_endpoint *ep)
>
> +{
>
> + BUILD_ASSERT_DECL(sizeof *ep % 4 == 0);
>
> + return hash_add_bytes32(hash, (const uint32_t *) ep, sizeof *ep);
>
> +}
>
> ^L
>
> /* Symmetric */
>
> static uint32_t
>
> conn_key_hash(const struct conn_key *key, uint32_t basis)
>
> {
>
> uint32_t hsrc, hdst, hash;
>
> - int i;
>
>
>
> hsrc = hdst = basis;
>
> -
>
> - for (i = 0; i < sizeof(key->src) / sizeof(uint32_t); i++) {
>
> - hsrc = hash_add(hsrc, ((uint32_t *) &key->src)[i]);
>
> - hdst = hash_add(hdst, ((uint32_t *) &key->dst)[i]);
>
> - }
>
> + hsrc = ct_endpoint_hash_add(hsrc, &key->src);
>
> + hdst = ct_endpoint_hash_add(hdst, &key->dst);
>
>
>
> /* Even if source and destination are swapped the hash will be
the same. */
>
> hash = hsrc ^ hdst;
>
> @@ -1613,20 +1623,6 @@ nat_ipv6_addr_increment(struct in6_addr
*ipv6_aligned, uint32_t increment)
>
> }
>
>
>
> static uint32_t
>
> -ct_addr_hash_add(uint32_t hash, const struct ct_addr *addr)
>
> -{
>
> - BUILD_ASSERT_DECL(sizeof *addr % 4 == 0);
>
> - return hash_add_bytes32(hash, (const uint32_t *) addr, sizeof
*addr);
>
> -}
>
> -
>
> -static uint32_t
>
> -ct_endpoint_hash_add(uint32_t hash, const struct ct_endpoint *ep)
>
> -{
>
> - BUILD_ASSERT_DECL(sizeof *ep % 4 == 0);
>
> - return hash_add_bytes32(hash, (const uint32_t *) ep, sizeof *ep);
>
> -}
>
> -
>
> -static uint32_t
>
> nat_range_hash(const struct conn *conn, uint32_t basis)
>
> {
>
> uint32_t hash = basis;
>
> (END)
>
>
>
>
>
>
>
>
>
> On 6/7/17, 9:37 AM, "[email protected] on behalf of Ben
Pfaff" <[email protected] on behalf of [email protected]> wrote:
>
>
>
> From: Darrell Ball <[email protected]>
>
>
>
> Part of the hash input for nat_range_hash() was accidentally
>
> omitted, so this fixes the problem. Also, add a missing call to
>
> hash_finish().
>
>
>
> Fixes: 286de2729955 ("dpdk: Userspace Datapath: Introduce NAT
Support.")
>
> Signed-off-by: Darrell Ball <[email protected]>
>
> Signed-off-by: Ben Pfaff <[email protected]>
>
> ---
>
> lib/conntrack-private.h | 4 ++++
>
> lib/conntrack.c | 47
++++++++++++++++++++++++++---------------------
>
> 2 files changed, 30 insertions(+), 21 deletions(-)
>
>
>
> diff --git a/lib/conntrack-private.h b/lib/conntrack-private.h
>
> index bfa88f0fe7e2..55084d3ea64e 100644
>
> --- a/lib/conntrack-private.h
>
> +++ b/lib/conntrack-private.h
>
> @@ -42,6 +42,10 @@ struct ct_endpoint {
>
> };
>
> };
>
>
>
> +/* Verify that there is no padding in struct ct_endpoint, to
facilitate
>
> + * hashing in ct_endpoint_hash_add(). */
>
> +BUILD_ASSERT_DECL(sizeof(struct ct_endpoint) == sizeof(struct
ct_addr) + 4);
>
> +
>
> /* Changes to this structure need to be reflected in
conn_key_hash() */
>
> struct conn_key {
>
> struct ct_endpoint src;
>
> diff --git a/lib/conntrack.c b/lib/conntrack.c
>
> index 44a6bc4e3ccf..55029c82e7a6 100644
>
> --- a/lib/conntrack.c
>
> +++ b/lib/conntrack.c
>
> @@ -1613,36 +1613,41 @@ nat_ipv6_addr_increment(struct in6_addr
*ipv6_aligned, uint32_t increment)
>
> }
>
>
>
> static uint32_t
>
> -nat_range_hash(const struct conn *conn, uint32_t basis)
>
> +ct_addr_hash_add(uint32_t hash, const struct ct_addr *addr)
>
> {
>
> - uint32_t hash = basis;
>
> - int i;
>
> - uint16_t port;
>
> + BUILD_ASSERT_DECL(sizeof *addr % 4 == 0);
>
> + return hash_add_bytes32(hash, (const uint32_t *) addr,
sizeof *addr);
>
> +}
>
>
>
> - for (i = 0;
>
> - i < sizeof(conn->nat_info->min_addr) / sizeof(uint32_t);
>
> - i++) {
>
> - hash = hash_add(hash, ((uint32_t *)
&conn->nat_info->min_addr)[i]);
>
> - hash = hash_add(hash, ((uint32_t *)
&conn->nat_info->max_addr)[i]);
>
> - }
>
> +static uint32_t
>
> +ct_endpoint_hash_add(uint32_t hash, const struct ct_endpoint *ep)
>
> +{
>
> + BUILD_ASSERT_DECL(sizeof *ep % 4 == 0);
>
> + return hash_add_bytes32(hash, (const uint32_t *) ep, sizeof
*ep);
>
> +}
>
>
>
> - memcpy(&port, &conn->nat_info->min_port, sizeof port);
>
> - hash = hash_add(hash, port);
>
> +static uint32_t
>
> +nat_range_hash(const struct conn *conn, uint32_t basis)
>
> +{
>
> + uint32_t hash = basis;
>
>
>
> - for (i = 0; i < sizeof(conn->key.src.addr) /
sizeof(uint32_t); i++) {
>
> - hash = hash_add(hash, ((uint32_t *) &conn->key.src)[i]);
>
> - hash = hash_add(hash, ((uint32_t *) &conn->key.dst)[i]);
>
> - }
>
> + hash = ct_addr_hash_add(hash, &conn->nat_info->min_addr);
>
> + hash = ct_addr_hash_add(hash, &conn->nat_info->max_addr);
>
> + hash = hash_add(hash,
>
> + (conn->nat_info->max_port << 16)
>
> + | conn->nat_info->min_port);
>
>
>
> - memcpy(&port, &conn->key.src.port, sizeof port);
>
> - hash = hash_add(hash, port);
>
> - memcpy(&port, &conn->key.dst.port, sizeof port);
>
> - hash = hash_add(hash, port);
>
> + hash = ct_endpoint_hash_add(hash, &conn->key.src);
>
> + hash = ct_endpoint_hash_add(hash, &conn->key.dst);
>
>
>
> hash = hash_add(hash, (OVS_FORCE uint32_t)
conn->key.dl_type);
>
> hash = hash_add(hash, conn->key.nw_proto);
>
> hash = hash_add(hash, conn->key.zone);
>
> - return hash;
>
> +
>
> + /* The purpose of the second parameter is to distinguish
hashes of data of
>
> + * different length; our data always has the same length so
there is no
>
> + * value in counting. */
>
> + return hash_finish(hash, 0);
>
> }
>
>
>
> static bool
>
>
>
> --
>
> 2.10.2
>
>
>
> _______________________________________________
>
> dev mailing list
>
> [email protected]
>
>
https://urldefense.proofpoint.com/v2/url?u=https-3A__mail.openvswitch.org_mailman_listinfo_ovs-2Ddev&d=DwIGaQ&c=uilaK90D4TOVoH58JNXRgQ&r=BVhFA09CGX7JQ5Ih-uZnsw&m=0-D9j1lxPv8FuvIlzvLsBxXMvnqlIWhS_O_iGeh0O_E&s=DMIKKrfIU2O9SgvyTV0Yvs6CSu3pnRc6u4-ZBL_pRho&e=
>
>
>
>
>
> _______________________________________________
> dev mailing list
> [email protected]
>
https://urldefense.proofpoint.com/v2/url?u=https-3A__mail.openvswitch.org_mailman_listinfo_ovs-2Ddev&d=DwIGaQ&c=uilaK90D4TOVoH58JNXRgQ&r=BVhFA09CGX7JQ5Ih-uZnsw&m=0-D9j1lxPv8FuvIlzvLsBxXMvnqlIWhS_O_iGeh0O_E&s=DMIKKrfIU2O9SgvyTV0Yvs6CSu3pnRc6u4-ZBL_pRho&e=
>
>
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev