Cleanup the UDP decapsulation code.

MFC after: 3 days
This commit is contained in:
Michael Tuexen 2012-06-18 17:09:39 +00:00
parent 06de588446
commit 285052f0aa

View File

@ -6837,83 +6837,61 @@ sctp_recv_udp_tunneled_packet(struct mbuf *m, int off, struct inpcb *ignored)
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: