This code in iwm is supposed to match what Linux does. The Linux code looks like this:
if (ieee80211_is_data(fc) && len > mvm->rts_threshold && !is_multicast_ether_addr(ieee80211_get_DA(hdr))) tx_flags |= TX_CMD_FLG_PROT_REQUIRE; Our driver had the 'is data' check inverted since the beginning. Index: if_iwm.c =================================================================== RCS file: /cvs/src/sys/dev/pci/if_iwm.c,v retrieving revision 1.92 diff -u -p -r1.92 if_iwm.c --- if_iwm.c 22 Jun 2016 11:32:12 -0000 1.92 +++ if_iwm.c 3 Jul 2016 09:15:24 -0000 @@ -4516,7 +4516,7 @@ iwm_tx(struct iwm_softc *sc, struct mbuf flags |= IWM_TX_CMD_FLG_ACK; } - if (type != IEEE80211_FC0_TYPE_DATA + if (type == IEEE80211_FC0_TYPE_DATA && (totlen + IEEE80211_CRC_LEN > ic->ic_rtsthreshold) && !IEEE80211_IS_MULTICAST(wh->i_addr1)) { flags |= IWM_TX_CMD_FLG_PROT_REQUIRE;