OK
On 2016 Sep 20 (Tue) at 14:14:49 +0200 (+0200), Stefan Sperling wrote: :Parse the DTIM count and period advertised in beacons and store them :in the node structure. This should be useful for iwm(4) in the future. :The TIM IE is documented in 802.11-2012 section "8.4.2.7 TIM element". : :ok? : :There used to be code in iwm(4) which read these values from the ic :(ic->ic_dtim_count and ic->ic_dtim_period) and did math based on them. :An obvious bug in hindsight. The device needs live values from the AP :and not some static values we set in our stack. The driver code that did :this has already been deleted because it didn't allow 8k devices to work. : :Index: net80211/ieee80211_input.c :=================================================================== :RCS file: /cvs/src/sys/net80211/ieee80211_input.c,v :retrieving revision 1.178 :diff -u -p -r1.178 ieee80211_input.c :--- net80211/ieee80211_input.c 18 May 2016 08:15:28 -0000 1.178 :+++ net80211/ieee80211_input.c 20 Sep 2016 12:02:11 -0000 :@@ -1393,7 +1393,7 @@ ieee80211_recv_probe_resp(struct ieee802 : const u_int8_t *tstamp, *ssid, *rates, *xrates, *edcaie, *wmmie; : const u_int8_t *rsnie, *wpaie, *htcaps, *htop; : u_int16_t capinfo, bintval; :- u_int8_t chan, bchan, erp; :+ u_int8_t chan, bchan, erp, dtim_count, dtim_period; : int is_new; : : /* :@@ -1436,6 +1436,7 @@ ieee80211_recv_probe_resp(struct ieee802 : bchan = ieee80211_chan2ieee(ic, ic->ic_bss->ni_chan); : chan = bchan; : erp = 0; :+ dtim_count = dtim_period = 0; : while (frm + 2 <= efrm) { : if (frm + 2 + frm[1] > efrm) { : ic->ic_stats.is_rx_elem_toosmall++; :@@ -1477,6 +1478,12 @@ ieee80211_recv_probe_resp(struct ieee802 : case IEEE80211_ELEMID_HTOP: : htop = frm; : break; :+ case IEEE80211_ELEMID_TIM: :+ if (frm[1] > 3) { :+ dtim_count = frm[2]; :+ dtim_period = frm[3]; :+ } :+ break; : case IEEE80211_ELEMID_VENDOR: : if (frm[1] < 4) { : ic->ic_stats.is_rx_elem_toosmall++; :@@ -1567,6 +1574,9 @@ ieee80211_recv_probe_resp(struct ieee802 : ieee80211_setup_htcaps(ni, htcaps + 2, htcaps[1]); : if (htop && !ieee80211_setup_htop(ni, htop + 2, htop[1])) : htop = NULL; /* invalid HTOP */ :+ :+ ni->ni_dtimcount = dtim_count; :+ ni->ni_dtimperiod = dtim_period; : : /* : * When operating in station mode, check for state updates :Index: net80211/ieee80211_node.h :=================================================================== :RCS file: /cvs/src/sys/net80211/ieee80211_node.h,v :retrieving revision 1.60 :diff -u -p -r1.60 ieee80211_node.h :--- net80211/ieee80211_node.h 28 Apr 2016 08:18:10 -0000 1.60 :+++ net80211/ieee80211_node.h 20 Sep 2016 12:01:37 -0000 :@@ -188,9 +188,10 @@ struct ieee80211_node { : struct ieee80211_channel *ni_chan; : u_int8_t ni_erp; /* 11g only */ : :-#ifdef notyet : /* DTIM and contention free period (CFP) */ :+ u_int8_t ni_dtimcount; : u_int8_t ni_dtimperiod; :+#ifdef notyet : u_int8_t ni_cfpperiod; /* # of DTIMs between CFPs */ : u_int16_t ni_cfpduremain; /* remaining cfp duration */ : u_int16_t ni_cfpmaxduration;/* max CFP duration in TU */ : -- An architect fellow named Yoric Could, when feeling euphoric, Display for selection Three kinds of erection -- Corinthian, ionic, and doric.