From 9396b53f894c322f34293c769dd85f3cb5db000c Mon Sep 17 00:00:00 2001 From: Augustin Cavalier Date: Sat, 30 Jun 2018 22:20:32 -0400 Subject: [PATCH] freebsd11_wlan: Add ieee80211_realign. It is technically "used", but only in blocks that evaluate to false via preprocessor macros, and so it was usually optimized out completely. This is not the case for the debug build however, so the lack of it broke that. --- .../net80211/ieee80211_haiku.cpp | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/src/libs/compat/freebsd11_wlan/net80211/ieee80211_haiku.cpp b/src/libs/compat/freebsd11_wlan/net80211/ieee80211_haiku.cpp index 3302422a27..5b317e3521 100644 --- a/src/libs/compat/freebsd11_wlan/net80211/ieee80211_haiku.cpp +++ b/src/libs/compat/freebsd11_wlan/net80211/ieee80211_haiku.cpp @@ -485,6 +485,46 @@ ieee80211_flush_ifq(struct ifqueue* ifq, struct ieee80211vap* vap) } +#ifndef __NO_STRICT_ALIGNMENT +/* + * Re-align the payload in the mbuf. This is mainly used (right now) + * to handle IP header alignment requirements on certain architectures. + */ +struct mbuf * +ieee80211_realign(struct ieee80211vap *vap, struct mbuf *m, size_t align) +{ + int pktlen, space; + struct mbuf *n; + + pktlen = m->m_pkthdr.len; + space = pktlen + align; + if (space < MINCLSIZE) + n = m_gethdr(M_NOWAIT, MT_DATA); + else { + n = m_getjcl(M_NOWAIT, MT_DATA, M_PKTHDR, + space <= MCLBYTES ? MCLBYTES : +#if MJUMPAGESIZE != MCLBYTES + space <= MJUMPAGESIZE ? MJUMPAGESIZE : +#endif + space <= MJUM9BYTES ? MJUM9BYTES : MJUM16BYTES); + } + if (__predict_true(n != NULL)) { + m_move_pkthdr(n, m); + n->m_data = (caddr_t)(ALIGN(n->m_data + align) - align); + m_copydata(m, 0, pktlen, mtod(n, caddr_t)); + n->m_len = pktlen; + } else { + IEEE80211_DISCARD(vap, IEEE80211_MSG_ANY, + mtod(m, const struct ieee80211_frame *), NULL, + "%s", "no mbuf to realign"); + vap->iv_stats.is_rx_badalign++; + } + m_freem(m); + return n; +} +#endif /* !__NO_STRICT_ALIGNMENT */ + + int ieee80211_add_callback(struct mbuf* m, void (*func)(struct ieee80211_node*, void*, int), void* arg)