Hi, (disclaimer: I know basically nothing about 802.11)
I noticed on my AP a high counter on netstat -W "input unencrypted
packets with wep/wpa config discarded", aka is_rx_unencrypted. After
investigation it looked like all of these were frames with type Data,
but with the "No data" bit set in FC0. Per IEEE's 80211-2016.pdf
9.2.4.1.9 (page 644) the Protected bit is set to 0 for these frames, so
don't insist on them being encrypted. (See also 9.2.4.1.3, p. 640, about
bit 6 (ie. FC0_SUBTYPE_NODATA) implying no Frame Body).
diff --git a/sys/net80211/ieee80211_input.c b/sys/net80211/ieee80211_input.c
index a614a67cc59..1d1720268f4 100644
--- a/sys/net80211/ieee80211_input.c
+++ b/sys/net80211/ieee80211_input.c
@@ -164,7 +164,7 @@ ieee80211_input(struct ifnet *ifp, struct mbuf *m, struct
ieee80211_node *ni,
struct ieee80211_frame *wh;
u_int16_t *orxseq, nrxseq, qos;
u_int8_t dir, type, subtype, tid;
- int hdrlen, hasqos;
+ int hdrlen, hasqos, hasdata;
KASSERT(ni != NULL);
@@ -209,9 +209,10 @@ ieee80211_input(struct ifnet *ifp, struct mbuf *m, struct
ieee80211_node *ni,
qos = 0;
tid = 0;
}
+ hasdata = (type == IEEE80211_FC0_TYPE_DATA &&
+ (subtype & IEEE80211_FC0_SUBTYPE_NODATA) == 0);
- if (type == IEEE80211_FC0_TYPE_DATA && hasqos &&
- (subtype & IEEE80211_FC0_SUBTYPE_NODATA) == 0 &&
+ if (hasdata && hasqos &&
!(rxi->rxi_flags & IEEE80211_RXI_AMPDU_DONE)) {
int ba_state = ni->ni_rx_ba[tid].ba_state;
@@ -411,6 +412,12 @@ ieee80211_input(struct ifnet *ifp, struct mbuf *m, struct
ieee80211_node *ni,
/* protection is on for Rx */
if (!(rxi->rxi_flags & IEEE80211_RXI_HWDEC)) {
if (!(wh->i_fc[1] & IEEE80211_FC1_PROTECTED)) {
+ /*
+ * 9.2.4.1.9 frames without data are
+ * not protected
+ */
+ if (!hasdata)
+ return;
/* drop unencrypted */
ic->ic_stats.is_rx_unencrypted++;
goto err;
--
Lauri Tirkkonen | lotheac @ IRCnet