Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 6 Feb 2011 13:17:41 +0000 (UTC)
From:      Randall Stewart <rrs@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r218371 - head/sys/netinet
Message-ID:  <201102061317.p16DHfrW065985@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: rrs
Date: Sun Feb  6 13:17:40 2011
New Revision: 218371
URL: http://svn.freebsd.org/changeset/base/218371

Log:
  1) Use same scheme Michael and I discussed for a selected for a flowid
  2) If flowid is not set, arrange so it is stored.
  3) If flowid is set by lower layer, use it.
  
  MFC after:	3 Months

Modified:
  head/sys/netinet/sctp_input.c

Modified: head/sys/netinet/sctp_input.c
==============================================================================
--- head/sys/netinet/sctp_input.c	Sun Feb  6 12:21:29 2011	(r218370)
+++ head/sys/netinet/sctp_input.c	Sun Feb  6 13:17:40 2011	(r218371)
@@ -5946,32 +5946,32 @@ sctp_input(struct mbuf *m, int off)
 	struct sctphdr *sh;
 	int offset;
 	int cpu_to_use;
-	uint32_t tag;
+	uint32_t flowid, tag;
 
 	if (mp_ncpus > 1) {
-		ip = mtod(m, struct ip *);
-		offset = off + sizeof(*sh);
-		if (SCTP_BUF_LEN(m) < offset) {
-			if ((m = m_pullup(m, offset)) == 0) {
-				SCTP_STAT_INCR(sctps_hdrops);
-				return;
-			}
-			ip = mtod(m, struct ip *);
-		}
-		sh = (struct sctphdr *)((caddr_t)ip + off);
-		if (sh->v_tag) {
-			tag = htonl(sh->v_tag);
+		if (m->m_flags & M_FLOWID) {
+			flowid = m->m_pkthdr.flowid;
 		} else {
 			/*
-			 * Distribute new INIT's to all CPU's don't just
-			 * pick on 0.
+			 * No flow id built by lower layers fix it so we
+			 * create one.
 			 */
-			struct timeval tv;
-
-			(void)SCTP_GETTIME_TIMEVAL(&tv);
-			tag = (uint32_t) tv.tv_usec;
+			ip = mtod(m, struct ip *);
+			offset = off + sizeof(*sh);
+			if (SCTP_BUF_LEN(m) < offset) {
+				if ((m = m_pullup(m, offset)) == 0) {
+					SCTP_STAT_INCR(sctps_hdrops);
+					return;
+				}
+				ip = mtod(m, struct ip *);
+			}
+			sh = (struct sctphdr *)((caddr_t)ip + off);
+			tag = htonl(sh->v_tag);
+			flowid = tag ^ ntohs(sh->dest_port) ^ ntohs(sh->src_port);
+			m->m_pkthdr.flowid = flowid;
+			m->m_flags |= M_FLOWID;
 		}
-		cpu_to_use = sctp_cpuarry[tag % mp_ncpus];
+		cpu_to_use = sctp_cpuarry[flowid % mp_ncpus];
 		sctp_queue_to_mcore(m, off, cpu_to_use);
 		return;
 	}



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