1*90211f92Snaddy.\" $OpenBSD: rssadapt.9,v 1.8 2015/02/16 16:38:54 naddy Exp $ 2061a67c2Sdamien.\" $NetBSD: rssadapt.9,v 1.4 2004/12/08 18:35:56 peter Exp $ 3061a67c2Sdamien.\" 4061a67c2Sdamien.\" Copyright (c) 2004 David Young. All rights reserved. 5061a67c2Sdamien.\" 6061a67c2Sdamien.\" This code is by David Young. 7061a67c2Sdamien.\" 8061a67c2Sdamien.\" Redistribution and use in source and binary forms, with or without 9061a67c2Sdamien.\" modification, are permitted provided that the following conditions 10061a67c2Sdamien.\" are met: 11061a67c2Sdamien.\" 1. Redistributions of source code must retain the above copyright 12061a67c2Sdamien.\" notice, this list of conditions and the following disclaimer. 13061a67c2Sdamien.\" 2. Redistributions in binary form must reproduce the above 14061a67c2Sdamien.\" copyright notice, this list of conditions and the following 15061a67c2Sdamien.\" disclaimer in the documentation and/or other materials 16061a67c2Sdamien.\" provided with the distribution. 17061a67c2Sdamien.\" 3. The name of David Young may not be used to endorse or promote 18061a67c2Sdamien.\" products derived from this software without specific prior 19061a67c2Sdamien.\" written permission. 20061a67c2Sdamien.\" 21061a67c2Sdamien.\" THIS SOFTWARE IS PROVIDED BY David Young ``AS IS'' AND ANY 22061a67c2Sdamien.\" EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 23061a67c2Sdamien.\" THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A 24061a67c2Sdamien.\" PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL David 25061a67c2Sdamien.\" Young BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 26061a67c2Sdamien.\" EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 27061a67c2Sdamien.\" TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 28061a67c2Sdamien.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 29061a67c2Sdamien.\" ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 30061a67c2Sdamien.\" OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 31061a67c2Sdamien.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 32061a67c2Sdamien.\" POSSIBILITY OF SUCH DAMAGE. 33061a67c2Sdamien.\" 34*90211f92Snaddy.Dd $Mdocdate: February 16 2015 $ 35061a67c2Sdamien.Dt RSSADAPT 9 36061a67c2Sdamien.Os 37061a67c2Sdamien.Sh NAME 38061a67c2Sdamien.Nm rssadapt , 39061a67c2Sdamien.Nm ieee80211_rssadapt_choose , 40061a67c2Sdamien.Nm ieee80211_rssadapt_input , 41061a67c2Sdamien.Nm ieee80211_rssadapt_lower_rate , 42061a67c2Sdamien.Nm ieee80211_rssadapt_raise_rate , 43061a67c2Sdamien.Nm ieee80211_rssadapt_updatestats 44061a67c2Sdamien.Nd rate adaptation based on received signal strength 45061a67c2Sdamien.Sh SYNOPSIS 46061a67c2Sdamien.In net80211/ieee80211_var.h 47061a67c2Sdamien.In net80211/ieee80211_rssadapt.h 48061a67c2Sdamien.Ft void 49061a67c2Sdamien.Fn ieee80211_rssadapt_input "struct ieee80211com *ic" \ 50f22d9adcSdamien"st construct ieee80211_node *ni" "struct ieee80211_rssadapt *ra" "int rssi" 51061a67c2Sdamien.Ft void 52061a67c2Sdamien.Fn ieee80211_rssadapt_lower_rate "struct ieee80211com *ic" \ 53f22d9adcSdamien"const struct ieee80211_node *ni" "struct ieee80211_rssadapt *ra" \ 54f22d9adcSdamien"const struct ieee80211_rssdesc *id" 55061a67c2Sdamien.Ft void 56061a67c2Sdamien.Fn ieee80211_rssadapt_raise_rate "struct ieee80211com *ic" \ 57f22d9adcSdamien"struct ieee80211_rssadapt *ra" "const struct ieee80211_rssdesc *id" 58061a67c2Sdamien.Ft void 59061a67c2Sdamien.Fn ieee80211_rssadapt_updatestats "struct ieee80211_rssadapt *ra" 60061a67c2Sdamien.Ft int 61061a67c2Sdamien.Fn ieee80211_rssadapt_choose "struct ieee80211_rssadapt *ra" \ 62f22d9adcSdamien"const struct ieee80211_rateset *rs" "const struct ieee80211_frame *wh" \ 63f22d9adcSdamien"u_int len" "int fixed_rate" "const char *dvname" "int do_not_adapt" 64061a67c2Sdamien.Sh DESCRIPTION 65061a67c2SdamienThe 66061a67c2Sdamien.Nm 67061a67c2Sdamienmodule provides rapid adaptation of transmission data rate to 802.11 68061a67c2Sdamiendevice drivers based on received-signal strength 69061a67c2Sdamien.Pq RSS . 70061a67c2SdamienA driver needs only to provide 71061a67c2Sdamien.Nm 72061a67c2Sdamienwith indications of RSS and failure/success of transmissions for 73061a67c2Sdamieneach 802.11 client or peer. 74061a67c2SdamienFor each transmit packet, 75061a67c2Sdamien.Nm 76061a67c2Sdamienchooses the transmission data rate that offers the best expected 77061a67c2Sdamienthroughput, given the packet's length and destination. 78061a67c2Sdamien.Pp 79061a67c2Sdamien.Nm 80061a67c2Sdamienmodels an 802.11 channel very simply 81061a67c2Sdamien.Po 82061a67c2Sdamiensee also the 83061a67c2Sdamien.Sx BUGS 84061a67c2Sdamiensection 85061a67c2Sdamien.Pc . 86061a67c2SdamienIt assumes that the packet-error rate 87061a67c2Sdamien.Pq PER 88061a67c2Sdamienis determined by the signal-to-noise ratio 89061a67c2Sdamien.Pq S/N 90061a67c2Sdamienat the receiver, the transmission data rate, and the packet length. 91061a67c2SdamienThe S/N determines the choice of data rate that yields the lowest 92061a67c2SdamienPER for all packets of a certain length. 93061a67c2Sdamien.Sh FUNCTIONS 94061a67c2Sdamien.Bl -tag -width Ds -compact 95061a67c2Sdamien.It Fn ieee80211_rssadapt_choose "ra" "rs" "wh" "len" "fixed_rate" "dvname" \ 96061a67c2Sdamien"do_not_adapt" 97061a67c2Sdamien.Pp 98061a67c2SdamienChoose the transmission data rate for a packet. 99061a67c2Sdamien.Pp 100061a67c2Sdamien.Bl -tag -width "do_not_adapt" -compact 101061a67c2Sdamien.It Fa ra 102061a67c2SdamienOrdinarily, the 103061a67c2Sdamien.Nm 104061a67c2Sdamienstate object belonging to the node which is the packet destination. 105061a67c2SdamienHowever, if the destination is a broadcast/multicast address, then 106061a67c2Sdamien.Fa ra 107061a67c2Sdamienbelongs to the BSS node, 108*90211f92Snaddy.Va ic->ic_bss . 109061a67c2Sdamien.It Fa rs 110061a67c2SdamienA list of eligible data rates for the node; for example, the 111061a67c2Sdamienrates negotiated when the node associated with the network. 112061a67c2Sdamien.It Fa len 113061a67c2SdamienThe packet length in bytes, including the 802.11 header and 114061a67c2Sdamienframe check sequence 115061a67c2Sdamien.Pq FCS . 116061a67c2Sdamien.It Fa fixed_rate 117061a67c2SdamienIf the operator has set the data rate using, for example, 118061a67c2Sdamien.Ic "ifconfig wi0 media ds1" , 119061a67c2Sdamienthen 120061a67c2Sdamien.Fa fixed_rate 121061a67c2Sdamientells the index of that rate in 122061a67c2Sdamien.Fa rs . 123061a67c2Sdamien.Nm 124061a67c2Sdamienobeys a fixed data rate whenever the 802.11 standard allows it: 125061a67c2Sdamiensometimes the standard requires multicast/broadcast packets to be 126061a67c2Sdamientransmitted at a so-called 127061a67c2Sdamien.Dq basic rate . 128061a67c2Sdamien.It Fa dvname 129061a67c2SdamienThe device driver uses 130061a67c2Sdamien.Fa dvname 131061a67c2Sdamiento indicate the name of the 132061a67c2Sdamieninterface for the purpose of diagnostic and debug messages. 133061a67c2SdamienThe driver sets 134061a67c2Sdamien.Fa dvname 135061a67c2Sdamiento 136061a67c2Sdamien.Dv NULL 137061a67c2Sdamienwhen no messages are desired. 138061a67c2Sdamien.It Fa do_not_adapt 139061a67c2SdamienIf 140061a67c2Sdamien.Fa do_not_adapt 141061a67c2Sdamienis non-zero, then 142061a67c2Sdamien.Fn ieee80211_rssadapt_choose 143061a67c2Sdamienwill choose the highest rate in 144061a67c2Sdamien.Fa rs 145061a67c2Sdamienthat suits the destination, regardless of the RSS. 146061a67c2Sdamien.El 147061a67c2SdamienThe return value of 148061a67c2Sdamien.Fn ieee80211_rssadapt_choose 149061a67c2Sdamienis an index into 150061a67c2Sdamien.Fa rs , 151061a67c2Sdamienindicating its choice of transmit data rate. 152061a67c2Sdamien.Pp 153061a67c2Sdamien.It Fn ieee80211_rssadapt_input "ic" "ni" "ra" "rssi" 154061a67c2SdamienThe RSS serves as a rough estimate of the S/N at each node. 155061a67c2SdamienA driver provides RSS updates using 156061a67c2Sdamien.Fn ieee80211_rssadapt_input , 157061a67c2Sdamienwhose arguments are: 158061a67c2Sdamien.Pp 159061a67c2Sdamien.Bl -tag -width "rssi" -compact 160061a67c2Sdamien.It Fa ic 161061a67c2SdamienThe wireless interface's 802.11 state object. 162061a67c2Sdamien.It Fa ni 163061a67c2SdamienThe 802.11 node whose RSS the driver is updating. 164061a67c2Sdamien.It Fa ra 165061a67c2SdamienThe node's 166061a67c2Sdamien.Nm 167061a67c2Sdamienstate object. 168061a67c2Sdamien.It Fa rssi 169061a67c2SdamienThe node's received signal strength indication. 170061a67c2SdamienThe range of 171061a67c2Sdamien.Fa rssi 172061a67c2Sdamienis from 0 to 255. 173061a67c2Sdamien.El 174061a67c2Sdamien.Pp 175061a67c2Sdamien.It Fn ieee80211_rssadapt_lower_rate "ic" "ni" "ra" "id" 176061a67c2Sdamien.It Fn ieee80211_rssadapt_raise_rate "ic" "ra" "id" 177061a67c2SdamienDrivers call 178061a67c2Sdamien.Fn ieee80211_rssadapt_raise_rate 179061a67c2Sdamienand 180061a67c2Sdamien.Fn ieee80211_rssadapt_lower_rate 181061a67c2Sdamiento indicate transmit successes and failures, respectively. 182061a67c2Sdamien.Pp 183061a67c2Sdamien.Bl -tag -width Ds -compact 184061a67c2Sdamien.It Fa ic 185061a67c2SdamienThe 802.11 state object. 186061a67c2Sdamien.It Fa ni 187061a67c2SdamienThe neighbor to whom the driver transmitted. 188061a67c2Sdamien.It Fa ra 189061a67c2SdamienThe neighbor's 190061a67c2Sdamien.Nm 191061a67c2Sdamienstate object. 192061a67c2Sdamien.It Fa id 193061a67c2SdamienDisplays statistics on the transmission attempt. 194061a67c2Sdamien.El 195061a67c2Sdamien.Pp 196061a67c2Sdamien.It Fn ieee80211_rssadapt_updatestats "ra" 197061a67c2SdamienAn 802.11 node is eligible for its RSS thresholds to decay every 198061a67c2Sdamien1/10 to 10 seconds. 199061a67c2SdamienIt is eligible more often (every 1/10 second) at high packet rates, 200061a67c2Sdamienand less often (every 10 seconds) at low packet rates. 201061a67c2SdamienA driver assists 202061a67c2Sdamien.Nm 203061a67c2Sdamienin tracking the exponential-average packet rate by calling 204061a67c2Sdamien.Fn ieee80211_rssadapt_updatestats 205061a67c2Sdamienevery 1/10th second for each node's 206061a67c2Sdamien.Vt ieee80211_rssadapt 207061a67c2Sdamienobject. 208061a67c2Sdamien.Pp 209061a67c2Sdamien.Bl -tag -width Ds -compact 210061a67c2Sdamien.It Fa ra 211061a67c2SdamienThe neighbor's 212061a67c2Sdamien.Nm 213061a67c2Sdamienstate object. 214061a67c2Sdamien.El 215061a67c2Sdamien.El 216061a67c2Sdamien.Sh ALGORITHM 217061a67c2Sdamien.Nm 218061a67c2Sdamienmonitors the RSS from neighboring 802.11 nodes, recording the 219061a67c2Sdamienexponential average RSS in each neighbor's 220061a67c2Sdamien.Vt ieee80211_rssadapt 221061a67c2Sdamienstructure. 222061a67c2Sdamien.Nm 223061a67c2Sdamienuses transmit success/failure feedback from the 224061a67c2Sdamiendevice driver to fill a table of RSS thresholds. 225061a67c2SdamienThe table is indexed by packet size, 226061a67c2Sdamien.Va L , 227061a67c2Sdamienand a data rate, 228061a67c2Sdamien.Va R , 229061a67c2Sdamiento find out the minimum exponential-average RSS that a node must show before 230061a67c2Sdamien.Nm 231061a67c2Sdamienwill indicate that a packet 232061a67c2Sdamien.Va L 233061a67c2Sdamienbytes long can be transmitted R bits per second with optimal expected 234061a67c2Sdamienthroughput. 235061a67c2Sdamien.Pp 236061a67c2SdamienWhen the driver indicates a unicast packet is transmitted unsuccessfully 237061a67c2Sdamien.Po 238061a67c2Sdamienthat is, the NIC received no ACK for the packet 239061a67c2Sdamien.Pc , 240061a67c2Sdamien.Nm 241061a67c2Sdamienwill move the corresponding RSS threshold toward the exponential 242061a67c2Sdamienaverage RSSI at the time of transmission. 243061a67c2SdamienThus several consecutive transmit failures for the same 244061a67c2Sdamien.Ao 245061a67c2Sdamien.Va L , 246061a67c2Sdamien.Va R 247061a67c2Sdamien.Ac 248061a67c2Sdamientuple will ensure that the RSS threshold rises high enough that 249061a67c2Sdamienrate 250061a67c2Sdamien.Va R 251061a67c2Sdamienis abandoned for packets 252061a67c2Sdamien.Va L 253061a67c2Sdamienbytes long. 254061a67c2SdamienWhen the driver indicates a successful transmission, 255061a67c2Sdamienthe RSS threshold corresponding to the same packet length, but the 256061a67c2Sdamiennext higher data rate, is lowered slightly. 257061a67c2SdamienThe RSS threshold is said to 258061a67c2Sdamien.Dq decay . 259061a67c2SdamienThis ensures that occasionally 260061a67c2Sdamien.Nm 261061a67c2Sdamienindicates the driver should try the next higher data rate, 262061a67c2Sdamienjust in case conditions at the receiver have changed 263061a67c2Sdamien.Po 264061a67c2Sdamienfor example, noise levels have fallen 265061a67c2Sdamien.Pc 266061a67c2Sdamienand a higher data rate can be supported at the same RSS level. 267061a67c2Sdamien.Pp 268061a67c2SdamienThe rate of decay is controlled. 269061a67c2SdamienIn an interval of 1/10th second 270061a67c2Sdamiento 10 seconds, only one RSS threshold per neighbor may decay. 271061a67c2SdamienThe interval is connected to the exponential-average rate that packets 272061a67c2Sdamienare being transmitted. 273061a67c2SdamienAt high packet rates, the interval is shortest. 274061a67c2SdamienIt is longest at low packet rates. 275061a67c2SdamienThe rationale for this is that RSS thresholds should not decay 276061a67c2Sdamienrapidly if there is no information from packet transmissions to 277061a67c2Sdamiencounteract their decay. 278061a67c2Sdamien.Sh DATA STRUCTURES 279061a67c2SdamienAn 280061a67c2Sdamien.Vt ieee80211_rssdesc 281061a67c2Sdamiendescribes a transmission attempt. 282061a67c2Sdamien.Bd -literal -offset indent 283061a67c2Sdamienstruct ieee80211_rssdesc { 284061a67c2Sdamien u_int id_len; 285061a67c2Sdamien u_int id_rateidx; 286061a67c2Sdamien struct ieee80211_node *id_node; 287061a67c2Sdamien u_int8_t id_rssi; 288061a67c2Sdamien}; 289061a67c2Sdamien.Ed 290061a67c2Sdamien.Pp 291061a67c2Sdamien.Fa id_len 292061a67c2Sdamienis the length, in bytes, of the transmitted packet. 293061a67c2Sdamien.Fa id_node 294061a67c2Sdamienpoints to the neighbor's 295061a67c2Sdamien.Vt ieee8021_node , 296061a67c2Sdamienand 297061a67c2Sdamien.Fa id_rssi 298061a67c2Sdamienis the exponential-average RSS at the time the packet was 299061a67c2Sdamientransmitted. 300061a67c2Sdamien.Fa id_rateidx 301061a67c2Sdamienis an index into the destination neighbor's rate-set, 302*90211f92Snaddy.Fa id_node->ni_rates , 303061a67c2Sdamienindicating the transmit data rate for the packet. 304061a67c2Sdamien.Pp 305061a67c2Sdamien.Vt ieee80211_rssadapt 306061a67c2Sdamiencontains the rate-adaptation state for a neighboring 802.11 node. 307061a67c2SdamienOrdinarily a driver will 308061a67c2Sdamien.Dq subclass 309061a67c2Sdamien.Vt ieee80211_node . 310061a67c2SdamienThe 311061a67c2Sdamien.Vt ieee80211_rssadapt 312061a67c2Sdamienstructure will be a subclass member. 313061a67c2SdamienIn this way, every node's 314061a67c2Sdamien.Nm 315061a67c2Sdamiencondition is independently tracked and stored in its node object. 316061a67c2Sdamien.Bd -literal -offset 4n 317061a67c2Sdamienstruct ieee80211_rssadapt { 318061a67c2Sdamien u_int16_t ra_avg_rssi; 319061a67c2Sdamien u_int32_t ra_nfail; 320061a67c2Sdamien u_int32_t ra_nok; 321061a67c2Sdamien u_int32_t ra_pktrate; 322061a67c2Sdamien u_int16_t ra_rate_thresh[IEEE80211_RSSADAPT_BKTS] 323061a67c2Sdamien [IEEE80211_RATE_SIZE]; 324061a67c2Sdamien struct timeval ra_last_raise; 325061a67c2Sdamien struct timeval ra_raise_interval; 326061a67c2Sdamien}; 327061a67c2Sdamien.Ed 328061a67c2Sdamien.Pp 329061a67c2Sdamien.Fa ra_avg_rssi 330061a67c2Sdamienis the exponential-average RSS, shifted left 8 bits. 331061a67c2Sdamien.Fa ra_nfail 332061a67c2Sdamienindicates the number of transmit failures in the current update interval; 333061a67c2Sdamien.Fa ra_nok 334061a67c2Sdamienthe number of transmit successes in the current update interval. 335061a67c2Sdamien.Fa ra_pktrate 336061a67c2Sdamienindicates the exponential average number of transmit failure/success 337061a67c2Sdamienindications over past update intervals. 338061a67c2SdamienThis approximates the rate of packet-transmission. 339061a67c2Sdamien.Fa ra_rate_thresh 340061a67c2Sdamiencontains RSS thresholds that are indexed by 341db1a25dfSjmc.Aq packet length, data rate 342061a67c2Sdamientuples. 343061a67c2SdamienWhen this node's exponential-average RSS exceeds 344061a67c2Sdamien.Fa ra_rate_thresh[i][j] , 345061a67c2Sdamienthen packets at most 128 x 8^i bytes long are eligible to be 346061a67c2Sdamientransmitted at the rate indexed by j. 347061a67c2Sdamien.Pp 348061a67c2Sdamien.Fa ra_last_raise 349061a67c2Sdamienand 350061a67c2Sdamien.Fa ra_raise_interval 351061a67c2Sdamienare used to control the rate that RSS thresholds 352061a67c2Sdamien.Dq decay . 353061a67c2Sdamien.Fa ra_last_raise 354061a67c2Sdamienindicates when 355061a67c2Sdamien.Fn ieee80211_rssadapt_raise_rate 356061a67c2Sdamienwas last called and 357061a67c2Sdamien.Fa ra_raise_interval 358061a67c2Sdamienindicates the minimum period between consecutive calls to 359061a67c2Sdamien.Fn ieee80211_rssadapt_raise_rate . 360061a67c2SdamienIf 361061a67c2Sdamien.Fn ieee80211_rssadapt_raise_rate 362061a67c2Sdamienis called more than once in any period, the second and subsequent 363061a67c2Sdamiencalls are ignored. 364061a67c2Sdamien.Sh CODE REFERENCES 365061a67c2SdamienThis section describes places within the 366061a67c2Sdamien.Ox 367061a67c2Sdamiensource tree where actual code implementing or using 368061a67c2Sdamien.Nm 369061a67c2Sdamiencan be found. 370061a67c2SdamienAll pathnames are relative to 371061a67c2Sdamien.Pa /usr/src . 372061a67c2Sdamien.Pp 373061a67c2SdamienThe code for 374061a67c2Sdamien.Nm 375061a67c2Sdamienis in the file 376061a67c2Sdamien.Pa sys/net80211/ieee80211_rssadapt.c . 377061a67c2Sdamien.Pp 3781ae0ddabSdamien.Xr ath 4 379061a67c2Sdamiencontains a reference implementation. 380061a67c2SdamienSee 3811ae0ddabSdamien.Pa sys/dev/ic/ath.c . 382061a67c2Sdamien.Sh SEE ALSO 3831ae0ddabSdamien.Xr ath 4 , 384d3603060Sjmc.Xr ieee80211 9 385061a67c2Sdamien.Rs 386061a67c2Sdamien.%A Javier del Prado Pavon 387061a67c2Sdamien.%A Sunghyun Choi 388061a67c2Sdamien.%T "Link Adaptation Strategy for IEEE 802.11 WLAN via Received Signal \ 389061a67c2SdamienStrength Measurement" 390061a67c2Sdamien.%J "ICC'03" 391061a67c2Sdamien.%P pp. 1108-1113 392061a67c2Sdamien.%C Anchorage, Alaska 393061a67c2Sdamien.%D May 2003 394061a67c2Sdamien.Re 395061a67c2Sdamien.Sh HISTORY 396061a67c2Sdamien.Nm 397061a67c2Sdamienfirst appeared in 398061a67c2Sdamien.Nx 399061a67c2Sdamienand was ported to 400061a67c2Sdamien.Ox 401061a67c2Sdamienby 402f0641c22Sschwarze.An Todd C. Miller Aq Mt millert@OpenBSD.org 403061a67c2Sdamien.Sh AUTHORS 404f0641c22Sschwarze.An David Young Aq Mt dyoung@NetBSD.org 405061a67c2Sdamien.Sh BUGS 406061a67c2SdamienTo cope with interference from microwave ovens, frequency-hopping 407061a67c2Sdamienradios, and other sources of RF pulse-trains and bursts, 408061a67c2Sdamien.Nm 409061a67c2Sdamienshould adapt the fragmentation threshold as well as the data rate. 410061a67c2Sdamien.Pp 411061a67c2SdamienFor improved throughput, 412061a67c2Sdamien.Nm 413061a67c2Sdamienshould indicate to drivers when they should use the 802.11b 414061a67c2Sdamienshort-preamble. 415061a67c2Sdamien.Pp 416061a67c2SdamienThe constants in 417061a67c2Sdamien.Fn ieee80211_rssadapt_updatestats 418061a67c2Sdamienshould be configurable. 419