svn commit: r237912 - stable/9/sys/netinet
Michael Tuexen
tuexen at FreeBSD.org
Sun Jul 1 08:57:29 UTC 2012
Author: tuexen
Date: Sun Jul 1 08:57:28 2012
New Revision: 237912
URL: http://svn.freebsd.org/changeset/base/237912
Log:
MFC r237229:
Cleanup the UDP decapsulation code.
Modified:
stable/9/sys/netinet/sctputil.c
Directory Properties:
stable/9/sys/ (props changed)
Modified: stable/9/sys/netinet/sctputil.c
==============================================================================
--- stable/9/sys/netinet/sctputil.c Sun Jul 1 08:53:55 2012 (r237911)
+++ stable/9/sys/netinet/sctputil.c Sun Jul 1 08:57:28 2012 (r237912)
@@ -6827,83 +6827,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:
More information about the svn-src-stable-9
mailing list