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;
        }
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to