Index: sys/mbuf.h =================================================================== RCS file: /cvs/src/sys/sys/mbuf.h,v retrieving revision 1.220 diff -u -p -r1.220 mbuf.h --- sys/mbuf.h 17 Sep 2016 00:38:43 -0000 1.220 +++ sys/mbuf.h 10 Oct 2016 01:26:00 -0000 @@ -433,6 +435,7 @@ struct mbuf *m_pullup(struct mbuf *, int struct mbuf *m_split(struct mbuf *, int, int); struct mbuf *m_makespace(struct mbuf *, int, int, int *); struct mbuf *m_getptr(struct mbuf *, int, int *); +void * m_getaddr(struct mbuf *, int); int m_leadingspace(struct mbuf *); int m_trailingspace(struct mbuf *); struct mbuf *m_clget(struct mbuf *, int, u_int); Index: kern/uipc_mbuf.c =================================================================== RCS file: /cvs/src/sys/kern/uipc_mbuf.c,v retrieving revision 1.231 diff -u -p -r1.231 uipc_mbuf.c --- kern/uipc_mbuf.c 15 Sep 2016 02:00:16 -0000 1.231 +++ kern/uipc_mbuf.c 10 Oct 2016 01:26:00 -0000 @@ -932,6 +932,18 @@ m_getptr(struct mbuf *m, int loc, int *o return (NULL); } +void * +m_getaddr(struct mbuf *m, int loc) +{ + int off; + + m = m_getptr(m, loc, &off); + if (m == NULL) + return (NULL); + + return (mtod(m, caddr_t) + off); +} + /* * Partition an mbuf chain in two pieces, returning the tail -- * all but the first len0 bytes. In case of failure, it returns NULL and Index: net/if_vxlan.c =================================================================== RCS file: /cvs/src/sys/net/if_vxlan.c,v retrieving revision 1.49 diff -u -p -r1.49 if_vxlan.c --- net/if_vxlan.c 7 Oct 2016 06:16:03 -0000 1.49 +++ net/if_vxlan.c 10 Oct 2016 01:26:00 -0000 @@ -579,8 +579,6 @@ vxlan_lookup(struct mbuf *m, struct udph #if NBRIDGE > 0 struct bridge_tunneltag *brtag; #endif - struct mbuf *m0; - /* XXX Should verify the UDP port first before copying the packet */ skip = iphlen + sizeof(*uh); if (m->m_pkthdr.len - skip < sizeof(v)) @@ -661,8 +659,8 @@ vxlan_lookup(struct mbuf *m, struct udph if ((m = m_pullup(m, sizeof(struct ether_header))) == NULL) return (ENOBUFS); - if (!ALIGNED_POINTER(mtod(m, caddr_t) + ETHER_HDR_LEN, uint32_t)) { - m0 = m; + if (!ALIGNED_POINTER(m_getaddr(m, ETHER_HDR_LEN), uint32_t)) { + struct mbuf *m0 = m; m = m_dup_pkt(m0, ETHER_ALIGN, M_NOWAIT); m_freem(m0); if (m == NULL) Index: net80211/ieee80211_input.c =================================================================== RCS file: /cvs/src/sys/net80211/ieee80211_input.c,v retrieving revision 1.180 diff -u -p -r1.180 ieee80211_input.c --- net80211/ieee80211_input.c 21 Sep 2016 12:21:27 -0000 1.180 +++ net80211/ieee80211_input.c 10 Oct 2016 01:26:00 -0000 @@ -1008,7 +1009,8 @@ ieee80211_decap(struct ieee80211com *ic, m_adj(m, hdrlen - ETHER_HDR_LEN); } memcpy(mtod(m, caddr_t), &eh, ETHER_HDR_LEN); - if (!ALIGNED_POINTER(mtod(m, caddr_t) + ETHER_HDR_LEN, u_int32_t)) { + + if (!ALIGNED_POINTER(m_getaddr(m, ETHER_HDR_LEN), u_int32_t)) { struct mbuf *m0 = m; m = m_dup_pkt(m0, ETHER_ALIGN, M_NOWAIT); m_freem(m0); @@ -1017,6 +1019,7 @@ ieee80211_decap(struct ieee80211com *ic, return; } } + ieee80211_deliver_data(ic, m, ni); }