diff --git a/sys/netinet6/udp6_usrreq.c b/sys/netinet6/udp6_usrreq.c index c44510e3b65..c8f91fff2b7 100644 --- a/sys/netinet6/udp6_usrreq.c +++ b/sys/netinet6/udp6_usrreq.c @@ -860,14 +860,18 @@ udp6_send(struct socket *so, int flags_arg, struct mbuf *m, hlen = sizeof(struct ip6_hdr); /* - * Calculate data length and get a mbuf - * for UDP and IP6 headers. + * Calculate data length and get a mbuf for UDP, IP6, and possible + * link-layer headers. Immediate slide the data pointer back forward + * since we won't use that space at this layer. */ - M_PREPEND(m, hlen + sizeof(struct udphdr), M_NOWAIT); + M_PREPEND(m, hlen + sizeof(struct udphdr) + max_linkhdr, M_NOWAIT); if (m == NULL) { error = ENOBUFS; goto release; } + m->m_data += max_linkhdr; + m->m_len -= max_linkhdr; + m->m_pkthdr.len -= max_linkhdr; /* * Stuff checksum and output datagram.