1*01869ca4Swiz.\" $NetBSD: rssadapt.9,v 1.10 2017/07/03 21:28:48 wiz Exp $ 2061f5fc4Sdyoung.\" 3061f5fc4Sdyoung.\" Copyright (c) 2004 David Young. All rights reserved. 4061f5fc4Sdyoung.\" 5061f5fc4Sdyoung.\" This code is by David Young. 6061f5fc4Sdyoung.\" 7061f5fc4Sdyoung.\" Redistribution and use in source and binary forms, with or without 8061f5fc4Sdyoung.\" modification, are permitted provided that the following conditions 9061f5fc4Sdyoung.\" are met: 10061f5fc4Sdyoung.\" 1. Redistributions of source code must retain the above copyright 11061f5fc4Sdyoung.\" notice, this list of conditions and the following disclaimer. 12061f5fc4Sdyoung.\" 2. Redistributions in binary form must reproduce the above 13061f5fc4Sdyoung.\" copyright notice, this list of conditions and the following 14061f5fc4Sdyoung.\" disclaimer in the documentation and/or other materials 15061f5fc4Sdyoung.\" provided with the distribution. 16061f5fc4Sdyoung.\" 17061f5fc4Sdyoung.\" THIS SOFTWARE IS PROVIDED BY David Young ``AS IS'' AND ANY 18061f5fc4Sdyoung.\" EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 19061f5fc4Sdyoung.\" THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A 20061f5fc4Sdyoung.\" PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL David 21061f5fc4Sdyoung.\" Young BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 22061f5fc4Sdyoung.\" EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 23061f5fc4Sdyoung.\" TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24061f5fc4Sdyoung.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 25061f5fc4Sdyoung.\" ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 26061f5fc4Sdyoung.\" OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 27061f5fc4Sdyoung.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28061f5fc4Sdyoung.\" POSSIBILITY OF SUCH DAMAGE. 29061f5fc4Sdyoung.\" 30061f5fc4Sdyoung.Dd March 23, 2004 31061f5fc4Sdyoung.Dt RSSADAPT 9 32061f5fc4Sdyoung.Os 33061f5fc4Sdyoung.Sh NAME 34061f5fc4Sdyoung.Nm rssadapt , 35061f5fc4Sdyoung.Nm ieee80211_rssadapt_choose , 36061f5fc4Sdyoung.Nm ieee80211_rssadapt_input , 37061f5fc4Sdyoung.Nm ieee80211_rssadapt_lower_rate , 38061f5fc4Sdyoung.Nm ieee80211_rssadapt_raise_rate , 39061f5fc4Sdyoung.Nm ieee80211_rssadapt_updatestats 40061f5fc4Sdyoung.Nd rate adaptation based on received signal strength 41061f5fc4Sdyoung.Sh SYNOPSIS 42061f5fc4Sdyoung.In net80211/ieee80211_var.h 43061f5fc4Sdyoung.In net80211/ieee80211_rssadapt.h 44061f5fc4Sdyoung.Ft void 45061f5fc4Sdyoung.Fn ieee80211_rssadapt_input "struct ieee80211com *ic" \ 46061f5fc4Sdyoung"struct ieee80211_node *ni" "struct ieee80211_rssadapt *ra" "int rssi" 47061f5fc4Sdyoung.Ft void 48061f5fc4Sdyoung.Fn ieee80211_rssadapt_lower_rate "struct ieee80211com *ic" \ 49061f5fc4Sdyoung"struct ieee80211_node *ni" "struct ieee80211_rssadapt *ra" \ 50061f5fc4Sdyoung"struct ieee80211_rssdesc *id" 51061f5fc4Sdyoung.Ft void 52061f5fc4Sdyoung.Fn ieee80211_rssadapt_raise_rate "struct ieee80211com *ic" \ 53061f5fc4Sdyoung"struct ieee80211_rssadapt *ra" "struct ieee80211_rssdesc *id" 54061f5fc4Sdyoung.Ft void 55061f5fc4Sdyoung.Fn ieee80211_rssadapt_updatestats "struct ieee80211_rssadapt *ra" 56061f5fc4Sdyoung.Ft int 57061f5fc4Sdyoung.Fn ieee80211_rssadapt_choose "struct ieee80211_rssadapt *ra" \ 58061f5fc4Sdyoung"struct ieee80211_rateset *rs" "struct ieee80211_frame *wh" "u_int len" \ 59061f5fc4Sdyoung"int fixed_rate" "const char *dvname" "int do_not_adapt" 60061f5fc4Sdyoung.Sh DESCRIPTION 61061f5fc4SdyoungThe 62061f5fc4Sdyoung.Nm 63061f5fc4Sdyoungmodule provides rapid adaptation of transmission data rate to 802.11 64061f5fc4Sdyoungdevice drivers based on received-signal strength 65061f5fc4Sdyoung.Pq RSS . 66061f5fc4SdyoungA driver needs only to provide 67061f5fc4Sdyoung.Nm 68061f5fc4Sdyoungwith indications of RSS and failure/success of transmissions for 69061f5fc4Sdyoungeach 802.11 client or peer. 70061f5fc4SdyoungFor each transmit packet, 71061f5fc4Sdyoung.Nm 72061f5fc4Sdyoungchooses the transmission data rate that offers the best expected 73061f5fc4Sdyoungthroughput, given the packet's length and destination. 74061f5fc4Sdyoung.Pp 75061f5fc4Sdyoung.Nm 76061f5fc4Sdyoungmodels an 802.11 channel very simply 77061f5fc4Sdyoung.Po 78061f5fc4Sdyoungsee also the 79061f5fc4Sdyoung.Sx BUGS 80061f5fc4Sdyoungsection 81061f5fc4Sdyoung.Pc . 82061f5fc4SdyoungIt assumes that the packet-error rate 83061f5fc4Sdyoung.Pq PER 84061f5fc4Sdyoungis determined by the signal-to-noise ratio 85061f5fc4Sdyoung.Pq S/N 86061f5fc4Sdyoungat the receiver, the transmission data rate, and the packet length. 87061f5fc4SdyoungThe S/N determines the choice of data rate that yields the lowest 88061f5fc4SdyoungPER for all packets of a certain length. 89061f5fc4Sdyoung.Sh FUNCTIONS 90061f5fc4Sdyoung.Bl -tag -width 18n -compact 91061f5fc4Sdyoung.It Fn ieee80211_rssadapt_choose "ra" "rs" "wh" "len" "fixed_rate" "dvname" \ 92061f5fc4Sdyoung"do_not_adapt" 93061f5fc4SdyoungChoose the transmission data rate for a packet. 94061f5fc4Sdyoung.Bl -tag -width "do_not_adapt" -compact 95061f5fc4Sdyoung.It Fa ra 96c1ab60f5SwizOrdinarily, the 97061f5fc4Sdyoung.Nm 98c1ab60f5Swizstate object belonging to the node which is the packet destination. 99061f5fc4SdyoungHowever, if the destination is a broadcast/multicast address, then 100061f5fc4Sdyoung.Fa ra 101061f5fc4Sdyoungbelongs to the BSS node, 102*01869ca4Swiz.Va ic->ic_bss . 103061f5fc4Sdyoung.It Fa rs 104c1ab60f5SwizA list of eligible data rates for the node; for example, the 105061f5fc4Sdyoungrates negotiated when the node associated with the network. 106061f5fc4Sdyoung.It Fa len 107c1ab60f5SwizThe packet length in bytes, including the 802.11 header and 108c1ab60f5Swizframe check sequence 109061f5fc4Sdyoung.Pq FCS . 110061f5fc4Sdyoung.It Fa fixed_rate 111061f5fc4SdyoungIf the operator has set the data rate using, for example, 112061f5fc4Sdyoung.Ic "ifconfig wi0 media ds1" , 113061f5fc4Sdyoungthen 114061f5fc4Sdyoung.Fa fixed_rate 115061f5fc4Sdyoungtells the index of that rate in 116061f5fc4Sdyoung.Fa rs . 117061f5fc4Sdyoung.Nm 118061f5fc4Sdyoungobeys a fixed data rate whenever the 802.11 standard allows it: 119061f5fc4Sdyoungsometimes the standard requires multicast/broadcast packets to be 120061f5fc4Sdyoungtransmitted at a so-called 121061f5fc4Sdyoung.Dq basic rate . 122061f5fc4Sdyoung.It Fa dvname 123061f5fc4SdyoungThe device driver uses 124061f5fc4Sdyoung.Fa dvname 125061f5fc4Sdyoungto indicate the name of the 126061f5fc4Sdyounginterface for the purpose of diagnostic and debug messages. 127061f5fc4SdyoungThe driver sets 128061f5fc4Sdyoung.Fa dvname 129061f5fc4Sdyoungto 130061f5fc4Sdyoung.Dv NULL 131061f5fc4Sdyoungwhen no messages are desired. 132061f5fc4Sdyoung.It Fa do_not_adapt 133061f5fc4SdyoungIf 134061f5fc4Sdyoung.Fa do_not_adapt 135061f5fc4Sdyoungis non-zero, then 136061f5fc4Sdyoung.Fn ieee80211_rssadapt_choose 137061f5fc4Sdyoungwill choose the highest rate in 138061f5fc4Sdyoung.Fa rs 139061f5fc4Sdyoungthat suits the destination, regardless of the RSS. 140061f5fc4Sdyoung.El 141061f5fc4SdyoungThe return value of 142061f5fc4Sdyoung.Fn ieee80211_rssadapt_choose 143061f5fc4Sdyoungis an index into 144061f5fc4Sdyoung.Fa rs , 145061f5fc4Sdyoungindicating its choice of transmit data rate. 146061f5fc4Sdyoung.It Fn ieee80211_rssadapt_input "ic" "ni" "ra" "rssi" 147061f5fc4SdyoungThe RSS serves as a rough estimate of the S/N at each node. 148061f5fc4SdyoungA driver provides RSS updates using 149061f5fc4Sdyoung.Fn ieee80211_rssadapt_input , 150c1ab60f5Swizwhose arguments are: 151061f5fc4Sdyoung.Bl -tag -width "rssi" -compact 152061f5fc4Sdyoung.It Fa ic 153c1ab60f5SwizThe wireless interface's 802.11 state object. 154061f5fc4Sdyoung.It Fa ni 155c1ab60f5SwizThe 802.11 node whose RSS the driver is updating. 156061f5fc4Sdyoung.It Fa ra 157c1ab60f5SwizThe node's 158061f5fc4Sdyoung.Nm 159c1ab60f5Swizstate object. 160061f5fc4Sdyoung.It Fa rssi 161c1ab60f5SwizThe node's received signal strength indication. 162061f5fc4SdyoungThe range of 163061f5fc4Sdyoung.Fa rssi 164061f5fc4Sdyoungis from 0 to 255. 165061f5fc4Sdyoung.El 166061f5fc4Sdyoung.It Fn ieee80211_rssadapt_lower_rate "ic" "ni" "ra" "id" 167061f5fc4Sdyoung.It Fn ieee80211_rssadapt_raise_rate "ic" "ra" "id" 168061f5fc4SdyoungDrivers call 169061f5fc4Sdyoung.Fn ieee80211_rssadapt_raise_rate 170061f5fc4Sdyoungand 171061f5fc4Sdyoung.Fn ieee80211_rssadapt_lower_rate 172061f5fc4Sdyoungto indicate transmit successes and failures, respectively. 173061f5fc4Sdyoung.Bl -tag -width "ni" -compact 174061f5fc4Sdyoung.It Fa ic 175c1ab60f5SwizThe 802.11 state object. 176061f5fc4Sdyoung.It Fa ni 177c1ab60f5SwizThe neighbor to whom the driver transmitted. 178061f5fc4Sdyoung.It Fa ra 179c1ab60f5SwizThe neighbor's 180061f5fc4Sdyoung.Nm 181c1ab60f5Swizstate object. 182061f5fc4Sdyoung.It Fa id 183c1ab60f5SwizDIsplays statistics on the transmission attempt. 184061f5fc4Sdyoung.El 185061f5fc4Sdyoung.It Fn ieee80211_rssadapt_updatestats "ra" 186061f5fc4SdyoungAn 802.11 node is eligible for its RSS thresholds to decay every 187061f5fc4Sdyoung1/10 to 10 seconds. 188061f5fc4SdyoungIt is eligible more often (every 1/10 second) at high packet rates, 189061f5fc4Sdyoungand less often (every 10 seconds) at low packet rates. 190061f5fc4SdyoungA driver assists 191061f5fc4Sdyoung.Nm 192061f5fc4Sdyoungin tracking the exponential-average packet rate by calling 193061f5fc4Sdyoung.Fn ieee80211_rssadapt_updatestats 194061f5fc4Sdyoungevery 1/10th second for each node's 195061f5fc4Sdyoung.Vt ieee80211_rssadapt 196061f5fc4Sdyoungobject. 197061f5fc4Sdyoung.Bl -tag -width "ra" -compact 198061f5fc4Sdyoung.It Fa ra 199c1ab60f5SwizThe neighbor's 200061f5fc4Sdyoung.Nm 201061f5fc4Sdyoungstate object. 202061f5fc4Sdyoung.El 203061f5fc4Sdyoung.El 204061f5fc4Sdyoung.Sh ALGORITHM 205061f5fc4Sdyoung.Nm 206061f5fc4Sdyoungmonitors the RSS from neighboring 802.11 nodes, recording the 207061f5fc4Sdyoungexponential average RSS in each neighbor's 208061f5fc4Sdyoung.Vt ieee80211_rssadapt 209061f5fc4Sdyoungstructure. 210061f5fc4Sdyoung.Nm 211061f5fc4Sdyounguses transmit success/failure feedback from the 212061f5fc4Sdyoungdevice driver to fill a table of RSS thresholds. 213061f5fc4SdyoungThe table is indexed by packet size, 214061f5fc4Sdyoung.Va L , 215061f5fc4Sdyoungand a data rate, 216061f5fc4Sdyoung.Va R , 2179bc855a9Ssimonbto find out the minimum exponential-average RSS that a node must show before 218061f5fc4Sdyoung.Nm 219061f5fc4Sdyoungwill indicate that a packet 220061f5fc4Sdyoung.Va L 221061f5fc4Sdyoungbytes long can be transmitted R bits per second with optimal expected 222061f5fc4Sdyoungthroughput. 223061f5fc4SdyoungWhen the driver indicates a unicast packet is transmitted unsuccessfully 224061f5fc4Sdyoung.Po 225061f5fc4Sdyoungthat is, the NIC received no ACK for the packet 226061f5fc4Sdyoung.Pc , 227061f5fc4Sdyoung.Nm 228061f5fc4Sdyoungwill move the corresponding RSS threshold toward the exponential 229061f5fc4Sdyoungaverage RSSI at the time of transmission. 230061f5fc4SdyoungThus several consecutive transmit failures for the same 231061f5fc4Sdyoung.Ao 232061f5fc4Sdyoung.Va L , 233061f5fc4Sdyoung.Va R 234061f5fc4Sdyoung.Ac 235061f5fc4Sdyoungtuple will ensure that the RSS threshold rises high enough that 236061f5fc4Sdyoungrate 237061f5fc4Sdyoung.Va R 238061f5fc4Sdyoungis abandoned for packets 239061f5fc4Sdyoung.Va L 240061f5fc4Sdyoungbytes long. 241061f5fc4SdyoungWhen the driver indicates a successful transmission, 242061f5fc4Sdyoungthe RSS threshold corresponding to the same packet length, but the 243061f5fc4Sdyoungnext higher data rate, is lowered slightly. 244061f5fc4SdyoungThe RSS threshold is said to 245061f5fc4Sdyoung.Dq decay . 246061f5fc4SdyoungThis ensures that occasionally 247061f5fc4Sdyoung.Nm 248061f5fc4Sdyoungindicates the driver should try the next higher data rate, 249061f5fc4Sdyoungjust in case conditions at the receiver have changed 250061f5fc4Sdyoung.Po 251061f5fc4Sdyoungfor example, noise levels have fallen 252061f5fc4Sdyoung.Pc 253061f5fc4Sdyoungand a higher data rate can be supported at the same RSS level. 254061f5fc4Sdyoung.Pp 255061f5fc4SdyoungThe rate of decay is controlled. 256061f5fc4SdyoungIn an interval of 1/10th second 257061f5fc4Sdyoungto 10 seconds, only one RSS threshold per neighbor may decay. 258061f5fc4SdyoungThe interval is connected to the exponential-average rate that packets 259061f5fc4Sdyoungare being transmitted. 260061f5fc4SdyoungAt high packet rates, the interval is shortest. 261061f5fc4SdyoungIt is longest at low packet rates. 262061f5fc4SdyoungThe rationale for this is that RSS thresholds should not decay 263061f5fc4Sdyoungrapidly if there is no information from packet transmissions to 264061f5fc4Sdyoungcounteract their decay. 265061f5fc4Sdyoung.Sh DATA STRUCTURES 266061f5fc4SdyoungAn 267061f5fc4Sdyoung.Vt ieee80211_rssdesc 268061f5fc4Sdyoungdescribes a transmission attempt. 269061f5fc4Sdyoung.Pp 270061f5fc4Sdyoung.Bd -literal -offset indent 271061f5fc4Sdyoungstruct ieee80211_rssdesc { 272061f5fc4Sdyoung u_int id_len; 273061f5fc4Sdyoung u_int id_rateidx; 274061f5fc4Sdyoung struct ieee80211_node *id_node; 275061f5fc4Sdyoung u_int8_t id_rssi; 276061f5fc4Sdyoung}; 277061f5fc4Sdyoung.Ed 278061f5fc4Sdyoung.Pp 279061f5fc4Sdyoung.Fa id_len 280c1ab60f5Swizis the length, in bytes, of the transmitted packet. 281061f5fc4Sdyoung.Fa id_node 282c1ab60f5Swizpoints to the neighbor's 283061f5fc4Sdyoung.Vt ieee8021_node , 284061f5fc4Sdyoungand 285061f5fc4Sdyoung.Fa id_rssi 286c1ab60f5Swizis the exponential-average RSS at the time the packet was 287061f5fc4Sdyoungtransmitted. 288061f5fc4Sdyoung.Fa id_rateidx 289061f5fc4Sdyoungis an index into the destination-neighbor's rate-set, 290*01869ca4Swiz.Fa id_node->ni_rates , 291061f5fc4Sdyoungindicating the transmit data rate for the packet. 292061f5fc4Sdyoung.Pp 293061f5fc4SdyoungAn 294061f5fc4Sdyoung.Vt ieee80211_rssadapt 295061f5fc4Sdyoungcontains the rate-adaptation state for a neighboring 802.11 node. 296061f5fc4SdyoungOrdinarily a driver will 297061f5fc4Sdyoung.Dq subclass 298061f5fc4Sdyoung.Vt ieee80211_node . 299061f5fc4SdyoungThe 300061f5fc4Sdyoung.Vt ieee80211_rssadapt 301061f5fc4Sdyoungstructure will be a subclass member. 302061f5fc4SdyoungIn this way, every node's 303061f5fc4Sdyoung.Nm 304061f5fc4Sdyoungcondition is independently tracked and stored in its node object. 305061f5fc4Sdyoung.Pp 306061f5fc4Sdyoung.Bd -literal -offset indent 307061f5fc4Sdyoungstruct ieee80211_rssadapt { 308061f5fc4Sdyoung u_int16_t ra_avg_rssi; 309061f5fc4Sdyoung u_int32_t ra_nfail; 310061f5fc4Sdyoung u_int32_t ra_nok; 311061f5fc4Sdyoung u_int32_t ra_pktrate; 312061f5fc4Sdyoung u_int16_t ra_rate_thresh[IEEE80211_RSSADAPT_BKTS] 313061f5fc4Sdyoung [IEEE80211_RATE_SIZE]; 314061f5fc4Sdyoung struct timeval ra_last_raise; 315061f5fc4Sdyoung struct timeval ra_raise_interval; 316061f5fc4Sdyoung}; 317061f5fc4Sdyoung.Ed 318061f5fc4Sdyoung.Pp 319061f5fc4Sdyoung.Fa ra_avg_rssi 320061f5fc4Sdyoungis the exponential-average RSS, shifted left 8 bits. 321061f5fc4Sdyoung.Fa ra_nfail 322061f5fc4Sdyoungtells the number of transmit failures in the current update interval. 323061f5fc4Sdyoung.Fa ra_nok 324061f5fc4Sdyoungtells the number of transmit successes in the current update interval. 325061f5fc4Sdyoung.Fa ra_pktrate 326061f5fc4Sdyoungtells the exponential average number of transmit failure/success 327061f5fc4Sdyoungindications over past update intervals. 328061f5fc4SdyoungThis approximates the rate of packet-transmission. 329061f5fc4Sdyoung.Fa ra_rate_thresh 330061f5fc4Sdyoungcontains RSS thresholds that are indexed by 331061f5fc4Sdyoung.Aq "packet length, data rate" 332061f5fc4Sdyoungtuples. 333061f5fc4SdyoungWhen this node's exponential-average RSS exceeds 334061f5fc4Sdyoung.Fa ra_rate_thresh[i][j] , 335061f5fc4Sdyoungthen packets at most 128 x 8^i bytes long are eligible to be 336061f5fc4Sdyoungtransmitted at the rate indexed by j. 337061f5fc4Sdyoung.Fa ra_last_raise 338061f5fc4Sdyoungand 339061f5fc4Sdyoung.Fa ra_raise_interval 340061f5fc4Sdyoungare used to control the rate that RSS thresholds 341061f5fc4Sdyoung.Dq decay . 342061f5fc4Sdyoung.Fa ra_last_raise 343c1ab60f5Swizindicates when 344061f5fc4Sdyoung.Fn ieee80211_rssadapt_raise_rate 345061f5fc4Sdyoungwas last called. 346061f5fc4Sdyoung.Fa ra_raise_interval 347061f5fc4Sdyoungtells the minimum period between consecutive calls to 348061f5fc4Sdyoung.Fn ieee80211_rssadapt_raise_rate . 349061f5fc4SdyoungIf 350061f5fc4Sdyoung.Fn ieee80211_rssadapt_raise_rate 351061f5fc4Sdyoungis called more than once in any period, the second and subsequent 352061f5fc4Sdyoungcalls are ignored. 353061f5fc4Sdyoung.Sh CODE REFERENCES 354061f5fc4SdyoungThe code for 355061f5fc4Sdyoung.Nm 356061f5fc4Sdyoungis in the file 357061f5fc4Sdyoung.Pa sys/net80211/ieee80211_rssadapt.c . 358061f5fc4Sdyoung.Pp 359061f5fc4Sdyoung.Xr wi 4 360061f5fc4Sdyoungcontains a reference implementation. 361061f5fc4SdyoungSee 362061f5fc4Sdyoung.Pa sys/dev/ic/wi.c . 363061f5fc4Sdyoung.Sh SEE ALSO 364061f5fc4Sdyoung.Xr wi 4 365061f5fc4Sdyoung.Rs 366061f5fc4Sdyoung.%A Javier del Prado Pavon 367061f5fc4Sdyoung.%A Sunghyun Choi 368061f5fc4Sdyoung.%T "Link Adaptation Strategy for IEEE 802.11 WLAN via Received Signal \ 369061f5fc4SdyoungStrength Measurement" 370061f5fc4Sdyoung.%J "ICC'03" 371061f5fc4Sdyoung.%P pp. 1108-1113 372061f5fc4Sdyoung.%C Anchorage, Alaska 373061f5fc4Sdyoung.%D May 2003 374061f5fc4Sdyoung.Re 375061f5fc4Sdyoung.Sh HISTORY 376061f5fc4Sdyoung.Nm 377061f5fc4Sdyoungfirst appeared in 3789e45393aSpeter.Nx 3.0 . 379061f5fc4Sdyoung.Sh AUTHORS 380a5684d07Swiz.An David Young Aq Mt dyoung@NetBSD.org 381061f5fc4Sdyoung.Sh BUGS 382061f5fc4SdyoungTo cope with interference from microwave ovens, frequency-hopping 383061f5fc4Sdyoungradios, and other sources of RF pulse-trains and bursts, 384061f5fc4Sdyoung.Nm 385061f5fc4Sdyoungshould adapt the fragmentation threshold as well as the data rate. 386061f5fc4Sdyoung.Pp 387061f5fc4SdyoungFor improved throughput, 388061f5fc4Sdyoung.Nm 389061f5fc4Sdyoungshould indicate to drivers when they should use the 802.11b 390061f5fc4Sdyoungshort-preamble. 391061f5fc4Sdyoung.Pp 392061f5fc4SdyoungThe constants in 393061f5fc4Sdyoung.Fn ieee80211_rssadapt_updatestats 394061f5fc4Sdyoungshould be configurable. 395