Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/net Import asymmetric toeplitz hash without memcpy imple...



details:   https://anonhg.NetBSD.org/src/rev/377a0705724f
branches:  trunk
changeset: 987342:377a0705724f
user:      knakahara <knakahara%NetBSD.org@localhost>
date:      Fri Sep 24 04:09:32 2021 +0000

description:
Import asymmetric toeplitz hash without memcpy implemented by ryo@n.o.

This implementation has better performance than memcpy'ed one.
(30%-60% improvement in micro benchmark)

import from
    https://github.com/ryo/l2pkt/blob/master/l2pkt/toeplitz_hash.c

diffstat:

 sys/net/toeplitz.c |  84 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 sys/net/toeplitz.h |   6 +++
 2 files changed, 90 insertions(+), 0 deletions(-)

diffs (105 lines):

diff -r 3ffba5949bd1 -r 377a0705724f sys/net/toeplitz.c
--- a/sys/net/toeplitz.c        Fri Sep 24 00:29:46 2021 +0000
+++ b/sys/net/toeplitz.c        Fri Sep 24 04:09:32 2021 +0000
@@ -202,3 +202,87 @@
                k[i + 1] = skey;
        }
 }
+
+/*
+ * e.g.)
+ *
+ * struct in_addr src, dst;
+ * uint16_t srcport, dstport;
+ * toeplitz_vhash(rsskey[], sizeof(rsskey),
+ *                    &src, sizeof(src),
+ *                    &dst, sizeof(dst),
+ *                    &srcport, sizeof(srcport),
+ *                    &dstport, sizeof(dstport),
+ *                    NULL);
+ *
+ * struct in6_addr src6, dst6;
+ * toeplitz_vhash(rsskey[], sizeof(rsskey),
+ *                    &src6, sizeof(src6),
+ *                    &dst6, sizeof(dst6),
+ *                    NULL);
+ *
+ * struct ip *ip;
+ * struct tcphdr *tcp;
+ * toeplitz_vhash(rsskey[], sizeof(rsskey),
+ *                    &ip->ip_src, sizeof(ip->ip_src),
+ *                    &ip->ip_dst, sizeof(ip->ip_dst),
+ *                    &tcp->th_sport, sizeof(tcp->th_sport),
+ *                    &tcp->th_dport, sizeof(tcp->th_dport),
+ *                    NULL);
+ *
+ */
+uint32_t
+toeplitz_vhash(const uint8_t *keyp, size_t keylen, ...)
+{
+       va_list ap;
+       uint32_t hash, v;
+       size_t datalen;
+       uint8_t *datap, key, data;
+       const uint8_t *keyend;
+
+       keyend = keyp + keylen;
+
+       /* first 32bit is initial vector */
+       v = *keyp++;
+       v <<= 8;
+       v |= *keyp++;
+       v <<= 8;
+       v |= *keyp++;
+       v <<= 8;
+       v |= *keyp++;
+
+       hash = 0;
+       va_start(ap, keylen);
+
+       while ((datap = va_arg(ap, uint8_t *)) != NULL) {
+               for (datalen = va_arg(ap, size_t); datalen > 0; datalen--) {
+                       /* fetch key and input data by 8bit */
+                       if (keyp < keyend)
+                               key = *keyp++;
+                       else
+                               key = 0;
+                       data = *datap++;
+
+#define XOR_AND_FETCH_BIT(x)                   \
+                       if (data & __BIT(x))            \
+                               hash ^= v;              \
+                       v <<= 1;                        \
+                       if (key & __BIT(x))             \
+                               v |= 1;
+
+                       XOR_AND_FETCH_BIT(7);
+                       XOR_AND_FETCH_BIT(6);
+                       XOR_AND_FETCH_BIT(5);
+                       XOR_AND_FETCH_BIT(4);
+                       XOR_AND_FETCH_BIT(3);
+                       XOR_AND_FETCH_BIT(2);
+                       XOR_AND_FETCH_BIT(1);
+                       XOR_AND_FETCH_BIT(0);
+
+#undef XOR_AND_FETCH_BIT
+               }
+       }
+       va_end(ap);
+
+       return hash;
+}
diff -r 3ffba5949bd1 -r 377a0705724f sys/net/toeplitz.h
--- a/sys/net/toeplitz.h        Fri Sep 24 00:29:46 2021 +0000
+++ b/sys/net/toeplitz.h        Fri Sep 24 04:09:32 2021 +0000
@@ -120,4 +120,10 @@
        stoeplitz_hash_ip6port(stoeplitz_cache, (_sa6), (_da6), (_sp), (_dp))
 #endif
 
+/*
+ * system also provided asymmetric toeplitz
+ */
+
+uint32_t       toeplitz_vhash(const uint8_t *, size_t, ...);
+
 #endif /* _SYS_NET_TOEPLITZ_H_ */



Home | Main Index | Thread Index | Old Index