diff options
author | Adrian Chadd <adrian@FreeBSD.org> | 2015-08-24 05:36:08 +0000 |
---|---|---|
committer | Adrian Chadd <adrian@FreeBSD.org> | 2015-08-24 05:36:08 +0000 |
commit | 20dbdf88a5cff9ea3e52e81462598de65d12cec5 (patch) | |
tree | 3e3cfa429d4ab8e7af8e23b810ff959b6f7ad831 /sys/netinet6 | |
parent | f34065a7fd61f05cfdb11dd2c070c9fb179903ff (diff) | |
download | src-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.c | 49 | ||||
-rw-r--r-- | sys/netinet6/in6_rss.h | 8 |
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_ */ |