On Tue, Jan 15, 2019 at 12:50:33AM +0200, Lauri Tirkkonen wrote: > On Mon, Jan 14 2019 16:41:13 +0200, Lauri Tirkkonen wrote: > > > Indeed, my diff was bad as well. Thanks for spotting these issues. > > > I hadn't run this diff yet cause I was still building a new snapshot > > > to test it. Could you also test this new version please? > > > > I'm not currently physically near my AP, but the diff looks good and I > > can test it later today. > > I've had a chance to test your diff, and it seems to work well, but I > have one behavior change I can't explain (haven't looked at packet > captures at this point): without this diff applied, or with my own > previous diff applied, I can run iperf3 -s on my Android phone and > connect to it with UDP iperf3 -c from a wired host connected to the AP, > and measure packet loss. With this diff applied I'm unable to connect to > the phone's iperf server, and in fact am getting huge packet loss even > pinging the phone (and it seems that the times that it responds to pings > are correlated with times the phone was actually transmitting, eg. when > I hit refresh in the phone browser). > > Maybe it could be a good thing, perhaps related to aggressive power > management on the phone, but I don't know what it is with your diff that > could cause this behavior change. Maybe I need to do some packet > captures later.
Turns out we need to allow "no data" frames to pass a bit further into ieee80211_input() because they carry sequence numbers and because they are used to toggle power-saving state via IEEE80211_FC1_PWR_MGT in the frame header. I've checked what Linux mac80211 does -- it ignores "no data" frames for A-MPDU reordering like we already did (good!), but it drops them right before decryption. So your original diff was actually correct, apart from the memory leak ;-) Does this diff work? You should now be able to see 'no data' frames on your AP with 'tcpdump -n -i athn0 -y IEEE802_11_RADIO' as well. Index: ieee80211.h =================================================================== RCS file: /cvs/src/sys/net80211/ieee80211.h,v retrieving revision 1.60 diff -u -p -r1.60 ieee80211.h --- ieee80211.h 2 Jul 2017 14:48:19 -0000 1.60 +++ ieee80211.h 14 Jan 2019 13:29:35 -0000 @@ -140,13 +140,13 @@ struct ieee80211_htframe_addr4 { /* 11n #define IEEE80211_FC0_SUBTYPE_CF_END_ACK 0xf0 /* for TYPE_DATA (bit combination) */ #define IEEE80211_FC0_SUBTYPE_DATA 0x00 -#define IEEE80211_FC0_SUBTYPE_CF_ACK 0x10 -#define IEEE80211_FC0_SUBTYPE_CF_POLL 0x20 -#define IEEE80211_FC0_SUBTYPE_CF_ACPL 0x30 +#define IEEE80211_FC0_SUBTYPE_DATA_CF_ACK 0x10 +#define IEEE80211_FC0_SUBTYPE_DATA_CF_POLL 0x20 +#define IEEE80211_FC0_SUBTYPE_DATA_CF_ACKPOLL 0x30 #define IEEE80211_FC0_SUBTYPE_NODATA 0x40 -#define IEEE80211_FC0_SUBTYPE_CFACK 0x50 -#define IEEE80211_FC0_SUBTYPE_CFPOLL 0x60 -#define IEEE80211_FC0_SUBTYPE_CF_ACK_CF_ACK 0x70 +#define IEEE80211_FC0_SUBTYPE_NODATA_CF_ACK 0x50 +#define IEEE80211_FC0_SUBTYPE_NODATA_CF_POLL 0x60 +#define IEEE80211_FC0_SUBTYPE_NODATA_CF_ACKPOLL 0x70 #define IEEE80211_FC0_SUBTYPE_QOS 0x80 #define IEEE80211_FC1_DIR_MASK 0x03 Index: ieee80211_input.c =================================================================== RCS file: /cvs/src/sys/net80211/ieee80211_input.c,v retrieving revision 1.202 diff -u -p -r1.202 ieee80211_input.c --- ieee80211_input.c 7 Aug 2018 18:13:14 -0000 1.202 +++ ieee80211_input.c 15 Jan 2019 09:29:21 -0000 @@ -405,6 +405,13 @@ ieee80211_input(struct ifnet *ifp, struc goto out; } + /* Do not process "no data" frames any further. */ + if (subtype & IEEE80211_FC0_SUBTYPE_NODATA) { + if (ic->ic_rawbpf) + bpf_mtap(ic->ic_rawbpf, m, BPF_DIRECTION_IN); + goto out; + } + if ((ic->ic_flags & IEEE80211_F_WEPON) || ((ic->ic_flags & IEEE80211_F_RSNON) && (ni->ni_flags & IEEE80211_NODE_RXPROT))) {