Module Name: src
Committed By: knakahara
Date: Fri Sep 24 04:09:32 UTC 2021
Modified Files:
src/sys/net: toeplitz.c toeplitz.h
Log Message:
Import asymmetric toeplitz hash without memcpy implemented by [email protected].
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
To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 src/sys/net/toeplitz.c src/sys/net/toeplitz.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/net/toeplitz.c
diff -u src/sys/net/toeplitz.c:1.2 src/sys/net/toeplitz.c:1.3
--- src/sys/net/toeplitz.c:1.2 Mon Apr 5 06:56:47 2021
+++ src/sys/net/toeplitz.c Fri Sep 24 04:09:32 2021
@@ -202,3 +202,87 @@ stoeplitz_to_key(void *key, size_t klen)
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;
+}
Index: src/sys/net/toeplitz.h
diff -u src/sys/net/toeplitz.h:1.2 src/sys/net/toeplitz.h:1.3
--- src/sys/net/toeplitz.h:1.2 Mon Apr 5 06:53:45 2021
+++ src/sys/net/toeplitz.h Fri Sep 24 04:09:32 2021
@@ -120,4 +120,10 @@ extern const struct stoeplitz_cache *con
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_ */