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.

Reply via email to