On Tue, 2018-02-27 at 08:52 +0100, Felix Fietkau wrote: > > if (fast_rx->key && !(status->flag & RX_FLAG_IV_STRIPPED)) { > + if (status->rx_flags & IEEE80211_RX_AMSDU) > + return false; This seemed really odd to me. > /* GCMP header length is the same */ > snap_offs += IEEE80211_CCMP_HDR_LEN; I understand now though - the problem is that snap_offs isn't used in __ieee80211_rx_h_amsdu(), and thus we can't do the necessary adjustments. I think though that perhaps it'd be better to teach __ieee80211_rx_h_amsdu() about snap_offs, because assuming in the AMSDU decap code that snap_offs is more-or-less constant will just make the dependencies much harder to understand. Better teach __ieee80211_rx_h_amsdu() about snap_offs, and make the assumption on the constant in ieee80211_rx_h_amsdu()? > + if (status->rx_flags & IEEE80211_RX_AMSDU) { > + res = __ieee80211_rx_h_amsdu(rx); > + if (res != RX_QUEUED) > + goto drop; > + > + return true; > + } Btw, you also don't need the "res" variable, much less at function scope; this block would do if at all, but also it should probably use the right enum type or just be removed. johannes