aboutsummaryrefslogtreecommitdiff
path: root/sys/netinet6
diff options
context:
space:
mode:
authorAdrian Chadd <adrian@FreeBSD.org>2015-08-24 05:36:08 +0000
committerAdrian Chadd <adrian@FreeBSD.org>2015-08-24 05:36:08 +0000
commit20dbdf88a5cff9ea3e52e81462598de65d12cec5 (patch)
tree3e3cfa429d4ab8e7af8e23b810ff959b6f7ad831 /sys/netinet6
parentf34065a7fd61f05cfdb11dd2c070c9fb179903ff (diff)
downloadsrc-20dbdf88a5cff9ea3e52e81462598de65d12cec5.tar.gz
src-20dbdf88a5cff9ea3e52e81462598de65d12cec5.zip
Implement the IPv6 RSS software hash function.
This isn't yet linked into the receive/transmit paths anywhere just yet. This is part of a GSoC 2015 project. Submitted by: Tiwei Bie <btw@mail.ustc.edu.cn> Reviewed by: hiren, gnn Differential Revision: https://reviews.freebsd.org/D3423
Notes
Notes: svn path=/head/; revision=287096
Diffstat (limited to 'sys/netinet6')
-rw-r--r--sys/netinet6/in6_rss.c49
-rw-r--r--sys/netinet6/in6_rss.h8
2 files changed, 57 insertions, 0 deletions
diff --git a/sys/netinet6/in6_rss.c b/sys/netinet6/in6_rss.c
index 40d54d94c9ec..f125b361daa3 100644
--- a/sys/netinet6/in6_rss.c
+++ b/sys/netinet6/in6_rss.c
@@ -101,3 +101,52 @@ rss_hash_ip6_4tuple(const struct in6_addr *src, u_short srcport,
datalen += sizeof(dstport);
return (rss_hash(datalen, data));
}
+
+/*
+ * Calculate an appropriate ipv6 2-tuple or 4-tuple given the given
+ * IPv6 source/destination address, UDP or TCP source/destination ports
+ * and the protocol type.
+ *
+ * The protocol code may wish to do a software hash of the given
+ * tuple. This depends upon the currently configured RSS hash types.
+ *
+ * This assumes that the packet in question isn't a fragment.
+ *
+ * It also assumes the packet source/destination address
+ * are in "incoming" packet order (ie, source is "far" address.)
+ */
+int
+rss_proto_software_hash_v6(const struct in6_addr *s, const struct in6_addr *d,
+ u_short sp, u_short dp, int proto,
+ uint32_t *hashval, uint32_t *hashtype)
+{
+ uint32_t hash;
+
+ /*
+ * Next, choose the hash type depending upon the protocol
+ * identifier.
+ */
+ if ((proto == IPPROTO_TCP) &&
+ (rss_gethashconfig() & RSS_HASHTYPE_RSS_TCP_IPV6)) {
+ hash = rss_hash_ip6_4tuple(s, sp, d, dp);
+ *hashval = hash;
+ *hashtype = M_HASHTYPE_RSS_TCP_IPV6;
+ return (0);
+ } else if ((proto == IPPROTO_UDP) &&
+ (rss_gethashconfig() & RSS_HASHTYPE_RSS_UDP_IPV6)) {
+ hash = rss_hash_ip6_4tuple(s, sp, d, dp);
+ *hashval = hash;
+ *hashtype = M_HASHTYPE_RSS_UDP_IPV6;
+ return (0);
+ } else if (rss_gethashconfig() & RSS_HASHTYPE_RSS_IPV6) {
+ /* RSS doesn't hash on other protocols like SCTP; so 2-tuple */
+ hash = rss_hash_ip6_2tuple(s, d);
+ *hashval = hash;
+ *hashtype = M_HASHTYPE_RSS_IPV6;
+ return (0);
+ }
+
+ /* No configured available hashtypes! */
+ printf("%s: no available hashtypes!\n", __func__);
+ return (-1);
+}
diff --git a/sys/netinet6/in6_rss.h b/sys/netinet6/in6_rss.h
index b215b5b80a0c..8da449f11f3c 100644
--- a/sys/netinet6/in6_rss.h
+++ b/sys/netinet6/in6_rss.h
@@ -42,4 +42,12 @@ uint32_t rss_hash_ip6_4tuple(const struct in6_addr *src, u_short srcport,
uint32_t rss_hash_ip6_2tuple(const struct in6_addr *src,
const struct in6_addr *dst);
+/*
+ * Functions to calculate a software RSS hash for a given mbuf or
+ * packet detail.
+ */
+int rss_proto_software_hash_v6(const struct in6_addr *src,
+ const struct in6_addr *dst, u_short src_port,
+ u_short dst_port, int proto, uint32_t *hashval,
+ uint32_t *hashtype);
#endif /* !_NETINET6_IN6_RSS_H_ */