Author: tuexen
Date: Mon Jun 18 17:09:39 2012
New Revision: 237229
URL: http://svn.freebsd.org/changeset/base/237229

Log:
  Cleanup the UDP decapsulation code.
  
  MFC after: 3 days

Modified:
  head/sys/netinet/sctputil.c

Modified: head/sys/netinet/sctputil.c
==============================================================================
--- head/sys/netinet/sctputil.c Mon Jun 18 16:21:59 2012        (r237228)
+++ head/sys/netinet/sctputil.c Mon Jun 18 17:09:39 2012        (r237229)
@@ -6837,83 +6837,61 @@ sctp_recv_udp_tunneled_packet(struct mbu
        struct ip *iph;
        struct mbuf *sp, *last;
        struct udphdr *uhdr;
-       uint16_t port = 0;
-       int header_size = sizeof(struct udphdr) + sizeof(struct sctphdr);
+       uint16_t port;
 
-       /*
-        * Split out the mbuf chain. Leave the IP header in m, place the
-        * rest in the sp.
-        */
        if ((m->m_flags & M_PKTHDR) == 0) {
                /* Can't handle one that is not a pkt hdr */
                goto out;
        }
-       /* pull the src port */
+       /* Pull the src port */
        iph = mtod(m, struct ip *);
        uhdr = (struct udphdr *)((caddr_t)iph + off);
-
        port = uhdr->uh_sport;
+       /*
+        * Split out the mbuf chain. Leave the IP header in m, place the
+        * rest in the sp.
+        */
        sp = m_split(m, off, M_DONTWAIT);
        if (sp == NULL) {
                /* Gak, drop packet, we can't do a split */
                goto out;
        }
-       if (sp->m_pkthdr.len < header_size) {
-               /* Gak, packet can't have an SCTP header in it - to small */
+       if (sp->m_pkthdr.len < sizeof(struct udphdr) + sizeof(struct sctphdr)) {
+               /* Gak, packet can't have an SCTP header in it - too small */
                m_freem(sp);
                goto out;
        }
-       /* ok now pull up the UDP header and SCTP header together */
-       sp = m_pullup(sp, header_size);
+       /* Now pull up the UDP header and SCTP header together */
+       sp = m_pullup(sp, sizeof(struct udphdr) + sizeof(struct sctphdr));
        if (sp == NULL) {
                /* Gak pullup failed */
                goto out;
        }
-       /* trim out the UDP header */
+       /* Trim out the UDP header */
        m_adj(sp, sizeof(struct udphdr));
 
        /* Now reconstruct the mbuf chain */
-       /* 1) find last one */
-       last = m;
-       while (last->m_next != NULL) {
-               last = last->m_next;
-       }
+       for (last = m; last->m_next; last = last->m_next);
        last->m_next = sp;
        m->m_pkthdr.len += sp->m_pkthdr.len;
-       last = m;
-       while (last != NULL) {
-               last = last->m_next;
-       }
-       /* Now its ready for sctp_input or sctp6_input */
        iph = mtod(m, struct ip *);
        switch (iph->ip_v) {
 #ifdef INET
        case IPVERSION:
-               {
-                       uint16_t len;
-
-                       /* its IPv4 */
-                       len = SCTP_GET_IPV4_LENGTH(iph);
-                       len -= sizeof(struct udphdr);
-                       SCTP_GET_IPV4_LENGTH(iph) = len;
-                       sctp_input_with_port(m, off, port);
-                       break;
-               }
+               iph->ip_len -= sizeof(struct udphdr);
+               sctp_input_with_port(m, off, port);
+               break;
 #endif
 #ifdef INET6
        case IPV6_VERSION >> 4:
-               {
-                       /* its IPv6 - NOT supported */
-                       goto out;
-                       break;
+               /* Not yet supported. */
+               goto out;
+               break;
 
-               }
 #endif
        default:
-               {
-                       m_freem(m);
-                       break;
-               }
+               goto out;
+               break;
        }
        return;
 out:
_______________________________________________
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