Cleanup the UDP decapsulation code.
MFC after: 3 days
This commit is contained in:
parent
06de588446
commit
285052f0aa
@ -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:
|
||||
|
Loading…
x
Reference in New Issue
Block a user