Author: adrian
Date: Tue Sep  9 04:19:36 2014
New Revision: 271301
URL: http://svnweb.freebsd.org/changeset/base/271301

Log:
  Calculate the RSS hash for outbound UDPv4 frames.
  
  Differential Revision:        https://reviews.freebsd.org/D527
  Reviewed by:  grehan

Modified:
  head/sys/netinet/udp_usrreq.c

Modified: head/sys/netinet/udp_usrreq.c
==============================================================================
--- head/sys/netinet/udp_usrreq.c       Tue Sep  9 04:18:20 2014        
(r271300)
+++ head/sys/netinet/udp_usrreq.c       Tue Sep  9 04:19:36 2014        
(r271301)
@@ -90,6 +90,7 @@ __FBSDID("$FreeBSD$");
 #include <netinet/udp.h>
 #include <netinet/udp_var.h>
 #include <netinet/udplite.h>
+#include <netinet/in_rss.h>
 
 #ifdef IPSEC
 #include <netipsec/ipsec.h>
@@ -207,6 +208,13 @@ void
 udp_init(void)
 {
 
+       /*
+        * For now default to 2-tuple UDP hashing - until the fragment
+        * reassembly code can also update the flowid.
+        *
+        * Once we can calculate the flowid that way and re-establish
+        * a 4-tuple, flip this to 4-tuple.
+        */
        in_pcbinfo_init(&V_udbinfo, "udp", &V_udb, UDBHASHSIZE, UDBHASHSIZE,
            "udp_inpcb", udp_inpcb_init, NULL, UMA_ZONE_NOFREE,
            IPI_HASHFIELDS_2TUPLE);
@@ -1435,9 +1443,46 @@ udp_output(struct inpcb *inp, struct mbu
                m->m_flags |= M_FLOWID;
                m->m_pkthdr.flowid = flowid;
                M_HASHTYPE_SET(m, flowid_type);
+#ifdef RSS
+       } else {
+               uint32_t hash_val, hash_type;
+               /*
+                * Calculate an appropriate RSS hash for UDP and
+                * UDP Lite.
+                *
+                * The called function will take care of figuring out
+                * whether a 2-tuple or 4-tuple hash is required based
+                * on the currently configured scheme.
+                *
+                * Later later on connected socket values should be
+                * cached in the inpcb and reused, rather than constantly
+                * re-calculating it.
+                *
+                * UDP Lite is a different protocol number and will
+                * likely end up being hashed as a 2-tuple until
+                * RSS / NICs grow UDP Lite protocol awareness.
+                */
+               if (rss_proto_software_hash_v4(faddr, laddr, fport, lport,
+                   pr, &hash_val, &hash_type) == 0) {
+                       m->m_pkthdr.flowid = hash_val;
+                       m->m_flags |= M_FLOWID;
+                       M_HASHTYPE_SET(m, hash_type);
+               }
+#endif
        }
 
 #ifdef RSS
+       /*
+        * Don't override with the inp cached flowid value.
+        *
+        * Depending upon the kind of send being done, the inp
+        * flowid/flowtype values may actually not be appropriate
+        * for this particular socket send.
+        *
+        * We should either leave the flowid at zero (which is what is
+        * currently done) or set it to some software generated
+        * hash value based on the packet contents.
+        */
        ipflags |= IP_NODEFAULTFLOWID;
 #endif /* RSS */
 
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to