Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 24 Aug 2015 05:36:08 +0000 (UTC)
From:      Adrian Chadd <adrian@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r287096 - head/sys/netinet6
Message-ID:  <201508240536.t7O5a8dK031674@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: adrian
Date: Mon Aug 24 05:36:08 2015
New Revision: 287096
URL: https://svnweb.freebsd.org/changeset/base/287096

Log:
  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

Modified:
  head/sys/netinet6/in6_rss.c
  head/sys/netinet6/in6_rss.h

Modified: head/sys/netinet6/in6_rss.c
==============================================================================
--- head/sys/netinet6/in6_rss.c	Mon Aug 24 05:28:23 2015	(r287095)
+++ head/sys/netinet6/in6_rss.c	Mon Aug 24 05:36:08 2015	(r287096)
@@ -101,3 +101,52 @@ rss_hash_ip6_4tuple(const struct in6_add
 	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);
+}

Modified: head/sys/netinet6/in6_rss.h
==============================================================================
--- head/sys/netinet6/in6_rss.h	Mon Aug 24 05:28:23 2015	(r287095)
+++ head/sys/netinet6/in6_rss.h	Mon Aug 24 05:36:08 2015	(r287096)
@@ -42,4 +42,12 @@ uint32_t	rss_hash_ip6_4tuple(const struc
 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_ */



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201508240536.t7O5a8dK031674>