Index: if_vxlan.c =================================================================== RCS file: /cvs/src/sys/net/if_vxlan.c,v retrieving revision 1.48 diff -u -p -r1.48 if_vxlan.c --- if_vxlan.c 30 Sep 2016 10:22:05 -0000 1.48 +++ if_vxlan.c 7 Oct 2016 03:57:05 -0000 @@ -657,6 +657,17 @@ vxlan_lookup(struct mbuf *m, struct udph #if NPF > 0 pf_pkt_addr_changed(m); #endif + if ((m = m_pullup(m, sizeof(struct ether_header))) == NULL) + return (ENOBUFS); + + if (!ALIGNED_POINTER(mtod(m, caddr_t) + ETHER_HDR_LEN, uint32_t)) { + struct mbuf *m0 = m; + + m = m_dup_pkt(m0, ETHER_ALIGN, M_NOWAIT); + m_freem(m0); + if (m == NULL) + return (ENOBUFS); + } ml_enqueue(&ml, m); if_input(ifp, &ml); @@ -756,11 +767,27 @@ vxlan_output(struct ifnet *ifp, struct m int error, af; uint32_t tag; - /* VXLAN header */ - M_PREPEND(m, sizeof(*vu), M_DONTWAIT); - if (m == NULL) { - ifp->if_oerrors++; - return (ENOBUFS); + if (!ALIGNED_POINTER(mtod(m, caddr_t), uint32_t)) { + struct mbuf *m0; + + MGETHDR(m0, M_DONTWAIT, m->m_type); + if (m0 == NULL) { + ifp->if_oerrors++; + return (ENOBUFS); + } + M_MOVE_PKTHDR(m0, m); + m0->m_next = m; + m = m0; + MH_ALIGN(m, sizeof(*vu)); + m->m_len = sizeof(*vu); + m->m_pkthdr.len += sizeof(*vu); + } else { + /* VXLAN header */ + M_PREPEND(m, sizeof(*vu), M_DONTWAIT); + if (m == NULL) { + ifp->if_oerrors++; + return (ENOBUFS); + } } src = (struct sockaddr *)&sc->sc_src;