[Madwifi-cvs] revision 3314 committed
Status: Beta
Brought to you by:
otaku
From: Michael T. <svn...@ma...> - 2008-01-30 23:50:26
|
Project : madwifi Revision : 3314 Author : mtaylor (Michael Taylor) Date : 2008-01-31 00:50:16 +0100 (Thu, 31 Jan 2008) Log Message : This patch adds iwpriv values for setting the time in ms, or the number of beacons for the beacon miss alarm. If we haven't had a beacon in this period, the alarm is sounded and action (i.e. roaming) is taken. This patch changes the storage of the beacon miss threshold to integral beacon count but corrects the previous intent. The default beacon miss alarm is going to be 850ms which is half way between the two hard coded limits that were there before. The old hard coded limits assumed that the beacon interval was 100ms and set the limit to 10 (1000ms) for software beacon miss timer and 7 for hardware beacon miss timer. The new default is 850ms (the midpoint between the two previous defaults). This value is rounded up to the next nearest beacon interval. There is no upper bound on the beacon miss threshold specified, since it may need to be wildly inflated with 25ms beacon interval, or wildly reduced with 1000ms beacon interval. The minimum is still 2 beacons, regardless of the beacon interval. Affected Files: * madwifi/trunk/ath/if_ath.c updated * madwifi/trunk/net80211/ieee80211.c updated * madwifi/trunk/net80211/ieee80211_ioctl.h updated * madwifi/trunk/net80211/ieee80211_proto.c updated * madwifi/trunk/net80211/ieee80211_var.h updated * madwifi/trunk/net80211/ieee80211_wireless.c updated Modified: madwifi/trunk/ath/if_ath.c =================================================================== --- madwifi/trunk/ath/if_ath.c 2008-01-30 21:07:22 UTC (rev 3313) +++ madwifi/trunk/ath/if_ath.c 2008-01-30 23:50:16 UTC (rev 3314) @@ -5240,17 +5240,11 @@ bs.bs_timoffset = ni->ni_timoff; #endif /* - * Calculate the number of consecutive beacons to miss - * before taking a BMISS interrupt. The configuration - * is specified in TU so we only need calculate based - * on the beacon interval. Note that we clamp the - * result to at most 10 beacons. + * Store the number of consecutive beacons to miss + * before taking a BMISS interrupt. */ - bs.bs_bmissthreshold = howmany(ic->ic_bmisstimeout, intval); - if (bs.bs_bmissthreshold > 10) - bs.bs_bmissthreshold = 10; - else if (bs.bs_bmissthreshold < 2) - bs.bs_bmissthreshold = 2; + bs.bs_bmissthreshold = + IEEE80211_BMISSTHRESH_SANITISE(ic->ic_bmissthreshold); /* * Calculate sleep duration. The configuration is Modified: madwifi/trunk/net80211/ieee80211.c =================================================================== --- madwifi/trunk/net80211/ieee80211.c 2008-01-30 21:07:22 UTC (rev 3313) +++ madwifi/trunk/net80211/ieee80211.c 2008-01-30 23:50:16 UTC (rev 3314) @@ -322,9 +322,18 @@ ic->ic_flags |= IEEE80211_F_WME; (void) ieee80211_setmode(ic, ic->ic_curmode); + /* Store default beacon interval, as nec. */ if (ic->ic_lintval == 0) ic->ic_lintval = IEEE80211_BINTVAL_DEFAULT; - ic->ic_bmisstimeout = 7 * ic->ic_lintval; /* default 7 beacons */ + + /* We store the beacon miss threshold in integral number of beacons, + * to keep the calculations on the critical path simple. */ + if (ic->ic_bmissthreshold == 0) { + ic->ic_bmissthreshold = howmany(roundup( + IEEE80211_MS_TO_TU(IEEE80211_BMISSTHRESH_DEFAULT_MS), + ic->ic_lintval), ic->ic_lintval); + } + IEEE80211_LOCK_INIT(ic, "ieee80211com"); IEEE80211_VAPS_LOCK_INIT(ic, "ieee80211com_vaps"); TAILQ_INIT(&ic->ic_vaps); Modified: madwifi/trunk/net80211/ieee80211_ioctl.h =================================================================== --- madwifi/trunk/net80211/ieee80211_ioctl.h 2008-01-30 21:07:22 UTC (rev 3313) +++ madwifi/trunk/net80211/ieee80211_ioctl.h 2008-01-30 23:50:16 UTC (rev 3314) @@ -638,6 +638,8 @@ IEEE80211_PARAM_DFS_EXCLPERIOD = 72, /* DFS no-occupancy limit - how long do we stay off a channel once radar is detected? FCC requires 30m, so that is the default. */ + IEEE80211_PARAM_BEACON_MISS_THRESH = 73, /* Beacon miss threshold (in beacons) */ + IEEE80211_PARAM_BEACON_MISS_THRESH_MS = 74, /* Beacon miss threshold (in ms) */ }; #define SIOCG80211STATS (SIOCDEVPRIVATE+2) Modified: madwifi/trunk/net80211/ieee80211_proto.c =================================================================== --- madwifi/trunk/net80211/ieee80211_proto.c 2008-01-30 21:07:22 UTC (rev 3313) +++ madwifi/trunk/net80211/ieee80211_proto.c 2008-01-30 23:50:16 UTC (rev 3314) @@ -1601,7 +1601,7 @@ vap->iv_swbmiss.function = ieee80211_sta_swbmiss; vap->iv_swbmiss.data = (unsigned long) vap; vap->iv_swbmiss_period = IEEE80211_TU_TO_JIFFIES( - IEEE80211_SWBMISS_THRESHOLD * ni->ni_intval); + vap->iv_ic->ic_bmissthreshold * ni->ni_intval); mod_timer(&vap->iv_swbmiss, jiffies + vap->iv_swbmiss_period); } Modified: madwifi/trunk/net80211/ieee80211_var.h =================================================================== --- madwifi/trunk/net80211/ieee80211_var.h 2008-01-30 21:07:22 UTC (rev 3313) +++ madwifi/trunk/net80211/ieee80211_var.h 2008-01-30 23:50:16 UTC (rev 3314) @@ -54,16 +54,16 @@ * - Atheros chips use 7 bits when power is specified in half dBm units, with * a value range from 0 to 127. */ -#define IEEE80211_TXPOWER_MAX 127 /* .5 dBm units */ -#define IEEE80211_TXPOWER_MIN 0 /* kill radio */ +#define IEEE80211_TXPOWER_MAX 127 /* .5 dBm units */ +#define IEEE80211_TXPOWER_MIN 0 /* kill radio */ -#define IEEE80211_DTIM_MAX 15 /* max DTIM period */ -#define IEEE80211_DTIM_MIN 1 /* min DTIM period */ -#define IEEE80211_DTIM_DEFAULT 1 /* default DTIM period */ +#define IEEE80211_DTIM_MAX 15 /* max DTIM period */ +#define IEEE80211_DTIM_MIN 1 /* min DTIM period */ +#define IEEE80211_DTIM_DEFAULT 1 /* default DTIM period */ -#define IEEE80211_BINTVAL_MAX 1000 /* max beacon interval (TUs) */ -#define IEEE80211_BINTVAL_MIN 25 /* min beacon interval (TUs) */ -#define IEEE80211_BINTVAL_DEFAULT 100 /* default beacon interval (TUs) */ +#define IEEE80211_BINTVAL_MAX 1000 /* max beacon interval (TUs) */ +#define IEEE80211_BINTVAL_MIN 25 /* min beacon interval (TUs) */ +#define IEEE80211_BINTVAL_DEFAULT 100 /* default beacon interval (TUs) */ #define IEEE80211_BINTVAL_VALID(_bi) \ ((IEEE80211_BINTVAL_MIN <= (_bi)) && \ ((_bi) <= IEEE80211_BINTVAL_MAX)) @@ -71,6 +71,21 @@ (IEEE80211_BINTVAL_VALID(_bi) ? \ (_bi) : IEEE80211_BINTVAL_DEFAULT) +#define IEEE80211_BMISSTHRESH_BMIN 2 /* min bmiss threshold (beacons) */ +/* Default beacon miss threshold is set to roundup from 850ms + * This is halfway between the 10@100ms default from prior hardcoded setting for + * software beacon miss timers, and the 7@100ms default from prior hardcoded + * timer value for hardware beacon miss timer. + * Based upon emperical evidence and practices of commercial vendors, I believe + * this should really be 2500ms by default. */ +#define IEEE80211_BMISSTHRESH_DEFAULT_MS 850 + +#define IEEE80211_BMISSTHRESH_VALID(_bmt) \ + (IEEE80211_BMISSTHRESH_BMIN <= (_bmt)) +#define IEEE80211_BMISSTHRESH_SANITISE(_bmt) \ + ((IEEE80211_BMISSTHRESH_BMIN > (_bmt)) ? \ + IEEE80211_BMISSTHRESH_BMIN : (_bmt)) + #define IEEE80211_BGSCAN_INTVAL_MIN 15 /* min bg scan intvl (secs) */ #define IEEE80211_BGSCAN_INTVAL_DEFAULT (5*60) /* default bg scan intvl */ @@ -89,8 +104,6 @@ #define IEEE80211_FIXED_RATE_NONE -1 -#define IEEE80211_SWBMISS_THRESHOLD 10 /* software beacon miss threshold, in TUs */ - #define DEV_NAME(_d) \ ((NULL == _d || NULL == _d->name || 0 == strncmp(_d->name, "wifi%d", 6)) ? \ "MadWifi" : \ @@ -303,7 +316,7 @@ u_int16_t ic_curmode; /* current mode */ u_int16_t ic_lintval; /* beacon interval */ u_int16_t ic_holdover; /* PM hold over duration */ - u_int16_t ic_bmisstimeout; /* beacon miss threshold (ms) */ + u_int16_t ic_bmissthreshold; /* beacon miss threshold (# beacons) */ unsigned long ic_bmiss_guard; /* when to cease ignoring bmiss (jiffies) */ u_int16_t ic_txpowlimit; /* global tx power limit (in 0.5 dBm) */ u_int16_t ic_newtxpowlimit; /* tx power limit to change to (in 0.5 dBm) */ Modified: madwifi/trunk/net80211/ieee80211_wireless.c =================================================================== --- madwifi/trunk/net80211/ieee80211_wireless.c 2008-01-30 21:07:22 UTC (rev 3313) +++ madwifi/trunk/net80211/ieee80211_wireless.c 2008-01-30 23:50:16 UTC (rev 3314) @@ -2264,7 +2264,7 @@ unsigned int param = i[0]; /* parameter id is 1st */ unsigned int value = i[1]; /* NB: most values are TYPE_INT */ int retv = 0; - int j, caps; + int j, caps, bmiss; const struct ieee80211_authenticator *auth; const struct ieee80211_aclator *acl; @@ -2567,12 +2567,43 @@ } else retv = EINVAL; break; + case IEEE80211_PARAM_BEACON_MISS_THRESH_MS: + if ((vap->iv_opmode != IEEE80211_M_IBSS) && + (vap->iv_opmode != IEEE80211_M_STA)) + return -EOPNOTSUPP; + /* Convert millis to TU to next highest integral # beacons */ + bmiss = howmany(roundup(IEEE80211_MS_TO_TU(value), + ic->ic_lintval), ic->ic_lintval); + if (IEEE80211_BMISSTHRESH_VALID(bmiss)) { + ic->ic_bmissthreshold = bmiss; + retv = ENETRESET; /* requires restart */ + } else + retv = EINVAL; + break; + case IEEE80211_PARAM_BEACON_MISS_THRESH: + if ((vap->iv_opmode != IEEE80211_M_IBSS) && + (vap->iv_opmode != IEEE80211_M_STA)) + return -EOPNOTSUPP; + if (IEEE80211_BMISSTHRESH_VALID(value)) { + ic->ic_bmissthreshold = value; + retv = ENETRESET; /* requires restart */ + } else + retv = EINVAL; + break; case IEEE80211_PARAM_BEACON_INTERVAL: if ((vap->iv_opmode != IEEE80211_M_HOSTAP) && (vap->iv_opmode != IEEE80211_M_IBSS)) return -EOPNOTSUPP; if (IEEE80211_BINTVAL_VALID(value)) { - ic->ic_lintval = value; /* XXX multi-bss */ + /* Convert millis to TU to next highest integral # beacons */ + bmiss = howmany(roundup(ic->ic_bmissthreshold * ic->ic_lintval, + value), value); + /* Adjust beacon miss interval during a beacon interval + * change so that the duration of missed beacons allowed + * is greater than or equal to the old allowed duration + * of missed beacons. */ + ic->ic_bmissthreshold = bmiss; + ic->ic_lintval = value; retv = ENETRESET; /* requires restart */ } else retv = EINVAL; @@ -3023,6 +3054,13 @@ case IEEE80211_PARAM_DTIM_PERIOD: param[0] = vap->iv_dtim_period; break; + case IEEE80211_PARAM_BEACON_MISS_THRESH_MS: + param[0] = IEEE80211_TU_TO_MS( + vap->iv_ic->ic_bmissthreshold * vap->iv_ic->ic_lintval); + break; + case IEEE80211_PARAM_BEACON_MISS_THRESH: + param[0] = vap->iv_ic->ic_bmissthreshold; + break; case IEEE80211_PARAM_BEACON_INTERVAL: /* NB: get from ic_bss for station mode */ param[0] = vap->iv_bss->ni_intval; @@ -5381,6 +5419,14 @@ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "bintval" }, { IEEE80211_PARAM_BEACON_INTERVAL, 0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "get_bintval" }, + { IEEE80211_PARAM_BEACON_MISS_THRESH_MS, + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "bmiss_ms" }, + { IEEE80211_PARAM_BEACON_MISS_THRESH_MS, + 0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "get_bmiss_ms" }, + { IEEE80211_PARAM_BEACON_MISS_THRESH, + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "bmiss" }, + { IEEE80211_PARAM_BEACON_MISS_THRESH, + 0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "get_bmiss" }, { IEEE80211_PARAM_DOTH, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "doth" }, { IEEE80211_PARAM_DOTH, |