Since m_split() in some cases returns an mbuf chain, where the pkthdr element
contains no data (i.e. m_len == 0), the n->m_len == 0 check in
sys/net80211/ieee80211_input.c in the amsdu_decap() function sometimes
signals the end of the AMSDU frame too early.
Instead it should check the actual length of the data in the remaining
mbuf chain with n->m_pkthdr.len == 0.
Index: sys/net80211/ieee80211_input.c
===================================================================
RCS file: /cvs/src/sys/net80211/ieee80211_input.c,v
retrieving revision 1.184
diff -u -r1.184 ieee80211_input.c
--- sys/net80211/ieee80211_input.c 16 Jan 2017 09:35:06 -0000 1.184
+++ sys/net80211/ieee80211_input.c 24 Jan 2017 14:26:19 -0000
@@ -1096,7 +1096,7 @@
}
ieee80211_deliver_data(ic, m, ni, mcast);
- if (n->m_len == 0) {
+ if (n->m_pkthdr.len == 0) {
m_freem(n);
break;
}