1ff66a890SHiten Pandya.\" 2ff66a890SHiten Pandya.\" Copyright (c) 2004 Bruce M. Simpson <bms@spc.org> 3ff66a890SHiten Pandya.\" Copyright (c) 2004 Darron Broad <darron@kewl.org> 4ff66a890SHiten Pandya.\" All rights reserved. 5ff66a890SHiten Pandya.\" 6ff66a890SHiten Pandya.\" Redistribution and use in source and binary forms, with or without 7ff66a890SHiten Pandya.\" modification, are permitted provided that the following conditions 8ff66a890SHiten Pandya.\" are met: 9ff66a890SHiten Pandya.\" 1. Redistributions of source code must retain the above copyright 10ff66a890SHiten Pandya.\" notice, this list of conditions and the following disclaimer. 11ff66a890SHiten Pandya.\" 2. Redistributions in binary form must reproduce the above copyright 12ff66a890SHiten Pandya.\" notice, this list of conditions and the following disclaimer in the 13ff66a890SHiten Pandya.\" documentation and/or other materials provided with the distribution. 14ff66a890SHiten Pandya.\" 15ff66a890SHiten Pandya.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16ff66a890SHiten Pandya.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17ff66a890SHiten Pandya.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18ff66a890SHiten Pandya.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19ff66a890SHiten Pandya.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20ff66a890SHiten Pandya.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21ff66a890SHiten Pandya.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22ff66a890SHiten Pandya.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23ff66a890SHiten Pandya.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24ff66a890SHiten Pandya.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25ff66a890SHiten Pandya.\" SUCH DAMAGE. 26ff66a890SHiten Pandya.\" 27*05ac2d0dSSascha Wildner.\" $FreeBSD: src/share/man/man9/ieee80211_node.9,v 1.7 2010/03/29 17:39:38 trasz Exp $ 28ff66a890SHiten Pandya.\" 29*05ac2d0dSSascha Wildner.Dd April 28, 2010 30ff66a890SHiten Pandya.Dt IEEE80211_NODE 9 31ff66a890SHiten Pandya.Os 32ff66a890SHiten Pandya.Sh NAME 33*05ac2d0dSSascha Wildner.Nm ieee80211_node 34ff66a890SHiten Pandya.Nd software 802.11 stack node management functions 35ff66a890SHiten Pandya.Sh SYNOPSIS 36*05ac2d0dSSascha Wildner.In net80211/ieee80211_var.h 37*05ac2d0dSSascha Wildner.\" 38ff66a890SHiten Pandya.Ft struct ieee80211_node * 391102a27eSSascha Wildner.Fo ieee80211_find_rxnode 40*05ac2d0dSSascha Wildner.Fa "struct ieee80211com *" 41*05ac2d0dSSascha Wildner.Fa "const struct ieee80211_frame_min *" 421102a27eSSascha Wildner.Fc 43*05ac2d0dSSascha Wildner.\" 44ff66a890SHiten Pandya.Ft struct ieee80211_node * 45*05ac2d0dSSascha Wildner.Fo ieee80211_find_rxnode_withkey 46*05ac2d0dSSascha Wildner.Fa "struct ieee80211com *" 47*05ac2d0dSSascha Wildner.Fa "const struct ieee80211_frame_min *" 48*05ac2d0dSSascha Wildner.Fa "ieee80211_keyix" 49ff66a890SHiten Pandya.Fc 50*05ac2d0dSSascha Wildner.\" 51*05ac2d0dSSascha Wildner.Ft struct ieee80211_node * 52*05ac2d0dSSascha Wildner.Fn ieee80211_ref_node "struct ieee80211_node *" 53*05ac2d0dSSascha Wildner.\" 54ff66a890SHiten Pandya.Ft void 55*05ac2d0dSSascha Wildner.Fn ieee80211_unref_node "struct ieee80211_node *" 56*05ac2d0dSSascha Wildner.\" 57*05ac2d0dSSascha Wildner.Ft void 58*05ac2d0dSSascha Wildner.Fn ieee80211_free_node "struct ieee80211_node *" 59*05ac2d0dSSascha Wildner.\" 60ff66a890SHiten Pandya.Ft void 61ff66a890SHiten Pandya.Fo ieee80211_iterate_nodes 62*05ac2d0dSSascha Wildner.Fa "struct ieee80211_node_table *" 63*05ac2d0dSSascha Wildner.Fa "ieee80211_iter_func *f" 64*05ac2d0dSSascha Wildner.Fa "void *arg" 65*05ac2d0dSSascha Wildner.Fc 66*05ac2d0dSSascha Wildner.\" 67*05ac2d0dSSascha Wildner.Ft void 68*05ac2d0dSSascha Wildner.Fo ieee80211_dump_nodes 69*05ac2d0dSSascha Wildner.Fa "struct ieee80211_node_table *" 70*05ac2d0dSSascha Wildner.Fc 71*05ac2d0dSSascha Wildner.\" 72*05ac2d0dSSascha Wildner.Ft void 73*05ac2d0dSSascha Wildner.Fo ieee80211_dump_node 74*05ac2d0dSSascha Wildner.Fa "struct ieee80211_node *" 75ff66a890SHiten Pandya.Fc 76ff66a890SHiten Pandya.Sh DESCRIPTION 77ff66a890SHiten PandyaThe 78*05ac2d0dSSascha Wildner.Nm net80211 79*05ac2d0dSSascha Wildnerlayer that supports 802.11 device drivers maintains a database of 80*05ac2d0dSSascha Wildnerpeer stations called the 81*05ac2d0dSSascha Wildner.Dq node table 82*05ac2d0dSSascha Wildnerin the 83*05ac2d0dSSascha Wildner.Vt ic_sta 84*05ac2d0dSSascha Wildnerentry of the 85*05ac2d0dSSascha Wildner.Vt ieee80211com 86*05ac2d0dSSascha Wildnerstructure. 87*05ac2d0dSSascha WildnerStation mode vaps create an entry for the access point 88*05ac2d0dSSascha Wildnerthe station is associated to. 89*05ac2d0dSSascha WildnerAP mode vaps create entries for associated stations. 90*05ac2d0dSSascha WildnerAdhoc and mesh mode vaps create entries for neighbor stations. 91*05ac2d0dSSascha WildnerWDS mode vaps create an entry for the peer station. 92*05ac2d0dSSascha WildnerStations for all vaps reside in the same table; each node 93*05ac2d0dSSascha Wildnerentry has a 94*05ac2d0dSSascha Wildner.Vt ni_vap 95*05ac2d0dSSascha Wildnerfield that identifies the vap that created it. 96*05ac2d0dSSascha WildnerIn some instances an entry is used by multiple vaps (e.g. for 97*05ac2d0dSSascha Wildnerdynamic WDS a station associated to an ap vap may also be the peer 98*05ac2d0dSSascha Wildnerof a WDS vap). 99ff66a890SHiten Pandya.Pp 100*05ac2d0dSSascha WildnerNode table entries are reference counted. 101*05ac2d0dSSascha WildnerThat is, there is a count of all long term references that determines 102*05ac2d0dSSascha Wildnerwhen an entry may be reclaimed. 103*05ac2d0dSSascha WildnerReferences are held by every in-flight frame sent to a station to 104*05ac2d0dSSascha Wildnerinsure the entry is not reclaimed while the frame is queued or otherwise 105*05ac2d0dSSascha Wildnerheld by a driver. 106*05ac2d0dSSascha WildnerRoutines that lookup a table entry return a 107*05ac2d0dSSascha Wildner.Dq held reference 108*05ac2d0dSSascha Wildner(i.e. a pointer to a table entry with the reference count incremented). 109ff66a890SHiten PandyaThe 110*05ac2d0dSSascha Wildner.Fn ieee80211_ref_node 111ff66a890SHiten Pandyaand 112*05ac2d0dSSascha Wildner.Fn ieee80211_unref_node 113*05ac2d0dSSascha Wildnercalls explicitly increment/decrement the reference count of a node, 114*05ac2d0dSSascha Wildnerbut are rarely used. 115*05ac2d0dSSascha WildnerInstead most callers use 116*05ac2d0dSSascha Wildner.Fn ieee80211_free_node 117*05ac2d0dSSascha Wildnerto release a reference and, if the count goes to zero, reclaim the 118*05ac2d0dSSascha Wildnertable entry. 119*05ac2d0dSSascha Wildner.Pp 120*05ac2d0dSSascha WildnerThe station table and its entries are exposed to drivers in several ways. 121*05ac2d0dSSascha WildnerEach frame transmitted to a station includes a reference to the 122*05ac2d0dSSascha Wildnerassociated node in the 123*05ac2d0dSSascha Wildner.Vt m_pkthdr.rcvif 124*05ac2d0dSSascha Wildnerfield. 125*05ac2d0dSSascha WildnerThis reference must be reclaimed by the driver when transmit processing 126*05ac2d0dSSascha Wildneris done. 127*05ac2d0dSSascha WildnerFor each frame received the driver must lookup the table entry to 128*05ac2d0dSSascha Wildneruse in dispatching the frame 129*05ac2d0dSSascha Wildner.Dq up the stack . 130*05ac2d0dSSascha WildnerThis lookup implicitly obtains a reference to the table entry and 131*05ac2d0dSSascha Wildnerthe driver must reclaim the reference when frame processing is completed. 132*05ac2d0dSSascha WildnerOtherwise drivers frequently inspect the contents of the 133*05ac2d0dSSascha Wildner.Vt iv_bss 134*05ac2d0dSSascha Wildnernode when handling state machine changes as important information 135*05ac2d0dSSascha Wildneris maintained in the data structure. 136*05ac2d0dSSascha Wildner.Pp 137*05ac2d0dSSascha WildnerThe node table is opaque to drivers. 138*05ac2d0dSSascha WildnerEntries may be looked up using one of the pre-defined API's or the 139*05ac2d0dSSascha Wildner.Fn ieee80211_iterate_nodes 140*05ac2d0dSSascha Wildnercall may be used to iterate through all entries to do per-node 141*05ac2d0dSSascha Wildnerprocessing or implement some non-standard search mechanism. 142*05ac2d0dSSascha WildnerNote that 143*05ac2d0dSSascha Wildner.Fn ieee80211_iterate_nodes 144*05ac2d0dSSascha Wildneris single-threaded per-device 145*05ac2d0dSSascha Wildnerand the effort processing involved is fairly 146*05ac2d0dSSascha Wildnersubstantial so it should be used carefully. 147*05ac2d0dSSascha Wildner.Pp 148*05ac2d0dSSascha WildnerTwo routines are provided to print the contents of nodes to the console 149*05ac2d0dSSascha Wildnerfor debugging: 150*05ac2d0dSSascha Wildner.Fn ieee80211_dump_node 151*05ac2d0dSSascha Wildnerdisplays the contents of a single node while 152*05ac2d0dSSascha Wildner.Fn ieee80211_dump_nodes 153*05ac2d0dSSascha Wildnerdisplays the contents of the specified node table. 154*05ac2d0dSSascha WildnerNodes may also be displayed using 155*05ac2d0dSSascha Wildner.Xr ddb 9 156*05ac2d0dSSascha Wildnerwith the 157*05ac2d0dSSascha Wildner.Dq show node 158*05ac2d0dSSascha Wildnerdirective and the station node table can be displayed with 159*05ac2d0dSSascha Wildner.Dq show statab . 160*05ac2d0dSSascha Wildner.Sh DRIVER PRIVATE STATE 161*05ac2d0dSSascha WildnerNode data structures may be extended by the driver to include 162*05ac2d0dSSascha Wildnerdriver-private state. 163*05ac2d0dSSascha WildnerThis is done by overriding the 164*05ac2d0dSSascha Wildner.Vt ic_node_alloc 165*05ac2d0dSSascha Wildnermethod used to allocate a node table entry. 166*05ac2d0dSSascha WildnerThe driver method must allocate a structure that is an extension 167*05ac2d0dSSascha Wildnerof the 168*05ac2d0dSSascha Wildner.Vt ieee80211_node 169*05ac2d0dSSascha Wildnerstructure. 170*05ac2d0dSSascha WildnerFor example the 171*05ac2d0dSSascha Wildner.Xr iwi 4 172*05ac2d0dSSascha Wildnerdriver defines a private node structure as: 173*05ac2d0dSSascha Wildner.Bd -literal -offset indent 174*05ac2d0dSSascha Wildnerstruct iwi_node { 175*05ac2d0dSSascha Wildner struct ieee80211_node in_node; 176*05ac2d0dSSascha Wildner int in_station; 177*05ac2d0dSSascha Wildner}; 178*05ac2d0dSSascha Wildner.Ed 179*05ac2d0dSSascha Wildner.Pp 180*05ac2d0dSSascha Wildnerand then provides a private allocation routine that does this: 181*05ac2d0dSSascha Wildner.Bd -literal -offset indent 182*05ac2d0dSSascha Wildnerstatic struct ieee80211_node * 183*05ac2d0dSSascha Wildneriwi_node_alloc(struct ieee80211vap *vap, 184*05ac2d0dSSascha Wildner const uint8_t mac[IEEE80211_ADDR_LEN]) 185*05ac2d0dSSascha Wildner{ 186*05ac2d0dSSascha Wildner struct iwi_node *in; 187*05ac2d0dSSascha Wildner 188*05ac2d0dSSascha Wildner in = malloc(sizeof (struct iwi_node), M_80211_NODE, 189*05ac2d0dSSascha Wildner M_NOWAIT | M_ZERO); 190*05ac2d0dSSascha Wildner if (in == NULL) 191*05ac2d0dSSascha Wildner return NULL; 192*05ac2d0dSSascha Wildner in->in_station = -1; 193*05ac2d0dSSascha Wildner return &in->in_node; 194*05ac2d0dSSascha Wildner} 195*05ac2d0dSSascha Wildner.Ed 196*05ac2d0dSSascha Wildner.Pp 197*05ac2d0dSSascha WildnerNote that when reclaiming a node allocated by the driver the 198*05ac2d0dSSascha Wildner.Dq parent method 199*05ac2d0dSSascha Wildnermust be called to ensure 200*05ac2d0dSSascha Wildner.Nm net80211 201*05ac2d0dSSascha Wildnerstate is reclaimed; for example: 202*05ac2d0dSSascha Wildner.Bd -literal -offset indent 203*05ac2d0dSSascha Wildnerstatic void 204*05ac2d0dSSascha Wildneriwi_node_free(struct ieee80211_node *ni) 205*05ac2d0dSSascha Wildner{ 206*05ac2d0dSSascha Wildner struct ieee80211com *ic = ni->ni_ic; 207*05ac2d0dSSascha Wildner struct iwi_softc *sc = ic->ic_ifp->if_softc; 208*05ac2d0dSSascha Wildner struct iwi_node *in = (struct iwi_node *)ni; 209*05ac2d0dSSascha Wildner 210*05ac2d0dSSascha Wildner if (in->in_station != -1) 211*05ac2d0dSSascha Wildner free_unr(sc->sc_unr, in->in_station); 212*05ac2d0dSSascha Wildner sc->sc_node_free(ni); /* invoke net80211 free handler */ 213*05ac2d0dSSascha Wildner} 214*05ac2d0dSSascha Wildner.Ed 215*05ac2d0dSSascha Wildner.Pp 216*05ac2d0dSSascha WildnerBeware that care must be taken to avoid holding references that 217*05ac2d0dSSascha Wildnermight cause nodes from being reclaimed. 218*05ac2d0dSSascha Wildner.Nm net80211 219*05ac2d0dSSascha Wildnerwill reclaim a node when the last reference is reclaimed in 220*05ac2d0dSSascha Wildnerits data structures. 221*05ac2d0dSSascha WildnerHowever if a driver holds additional references then 222*05ac2d0dSSascha Wildner.Nm net80211 223*05ac2d0dSSascha Wildnerwill not recognize this and table entries will not be reclaimed. 224*05ac2d0dSSascha WildnerSuch references should not be needed if the driver overrides the 225*05ac2d0dSSascha Wildner.Vt ic_node_cleanup 226*05ac2d0dSSascha Wildnerand/or 227*05ac2d0dSSascha Wildner.Vt ic_node_free 228*05ac2d0dSSascha Wildnermethods. 229*05ac2d0dSSascha Wildner.Sh KEY TABLE SUPPORT 230*05ac2d0dSSascha WildnerNode table lookups are typically done using a hash of the stations' 231*05ac2d0dSSascha Wildnermac address. 232*05ac2d0dSSascha WildnerWhen receiving frames this is sufficient to find the node table entry 233*05ac2d0dSSascha Wildnerfor the transmitter. 234*05ac2d0dSSascha WildnerBut some devices also identify the sending station in the device 235*05ac2d0dSSascha Wildnerstate received with each frame and this data can be used to optimize 236*05ac2d0dSSascha Wildnerlookups on receive using a companion table called the 237*05ac2d0dSSascha Wildner.Dq keytab . 238*05ac2d0dSSascha WildnerThis table records a separate node table reference that can be fetched 239*05ac2d0dSSascha Wildnerwithout any locking using the table index. 240*05ac2d0dSSascha WildnerThis logic is handled with the 241*05ac2d0dSSascha Wildner.Fn ieee80211_find_rxnode_withkey 242*05ac2d0dSSascha Wildnercall: if a keytab entry is found using the specified index then it is 243*05ac2d0dSSascha Wildnerreturned directly; otherwise a normal lookup is done and the keytab 244*05ac2d0dSSascha Wildnerentry is written using the specified index. 245*05ac2d0dSSascha WildnerIf the specified index is 246*05ac2d0dSSascha Wildner.Dv IEEE80211_KEYIX_NONE 247*05ac2d0dSSascha Wildnerthen a normal lookup is done without a table update. 248*05ac2d0dSSascha Wildner.Sh SEE ALSO 249*05ac2d0dSSascha Wildner.Xr ddb 9 , 250*05ac2d0dSSascha Wildner.Xr ieee80211 9 , 251*05ac2d0dSSascha Wildner.Xr ieee80211_proto 9 252