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.\" 2705ac2d0dSSascha Wildner.\" $FreeBSD: src/share/man/man9/ieee80211_node.9,v 1.7 2010/03/29 17:39:38 trasz Exp $ 28ff66a890SHiten Pandya.\" 2905ac2d0dSSascha Wildner.Dd April 28, 2010 30ff66a890SHiten Pandya.Dt IEEE80211_NODE 9 31ff66a890SHiten Pandya.Os 32ff66a890SHiten Pandya.Sh NAME 3305ac2d0dSSascha Wildner.Nm ieee80211_node 34ff66a890SHiten Pandya.Nd software 802.11 stack node management functions 35ff66a890SHiten Pandya.Sh SYNOPSIS 36737edb20SSascha Wildner.In netproto/802_11/ieee80211_var.h 3705ac2d0dSSascha Wildner.\" 38ff66a890SHiten Pandya.Ft struct ieee80211_node * 391102a27eSSascha Wildner.Fo ieee80211_find_rxnode 4005ac2d0dSSascha Wildner.Fa "struct ieee80211com *" 4105ac2d0dSSascha Wildner.Fa "const struct ieee80211_frame_min *" 421102a27eSSascha Wildner.Fc 4305ac2d0dSSascha Wildner.\" 44ff66a890SHiten Pandya.Ft struct ieee80211_node * 4505ac2d0dSSascha Wildner.Fo ieee80211_find_rxnode_withkey 4605ac2d0dSSascha Wildner.Fa "struct ieee80211com *" 4705ac2d0dSSascha Wildner.Fa "const struct ieee80211_frame_min *" 4805ac2d0dSSascha Wildner.Fa "ieee80211_keyix" 49ff66a890SHiten Pandya.Fc 5005ac2d0dSSascha Wildner.\" 5105ac2d0dSSascha Wildner.Ft struct ieee80211_node * 5205ac2d0dSSascha Wildner.Fn ieee80211_ref_node "struct ieee80211_node *" 5305ac2d0dSSascha Wildner.\" 54ff66a890SHiten Pandya.Ft void 5505ac2d0dSSascha Wildner.Fn ieee80211_unref_node "struct ieee80211_node *" 5605ac2d0dSSascha Wildner.\" 5705ac2d0dSSascha Wildner.Ft void 5805ac2d0dSSascha Wildner.Fn ieee80211_free_node "struct ieee80211_node *" 5905ac2d0dSSascha Wildner.\" 60ff66a890SHiten Pandya.Ft void 61ff66a890SHiten Pandya.Fo ieee80211_iterate_nodes 6205ac2d0dSSascha Wildner.Fa "struct ieee80211_node_table *" 6305ac2d0dSSascha Wildner.Fa "ieee80211_iter_func *f" 6405ac2d0dSSascha Wildner.Fa "void *arg" 6505ac2d0dSSascha Wildner.Fc 6605ac2d0dSSascha Wildner.\" 6705ac2d0dSSascha Wildner.Ft void 6805ac2d0dSSascha Wildner.Fo ieee80211_dump_nodes 6905ac2d0dSSascha Wildner.Fa "struct ieee80211_node_table *" 7005ac2d0dSSascha Wildner.Fc 7105ac2d0dSSascha Wildner.\" 7205ac2d0dSSascha Wildner.Ft void 7305ac2d0dSSascha Wildner.Fo ieee80211_dump_node 7405ac2d0dSSascha Wildner.Fa "struct ieee80211_node *" 75ff66a890SHiten Pandya.Fc 76ff66a890SHiten Pandya.Sh DESCRIPTION 77ff66a890SHiten PandyaThe 7805ac2d0dSSascha Wildner.Nm net80211 7905ac2d0dSSascha Wildnerlayer that supports 802.11 device drivers maintains a database of 8005ac2d0dSSascha Wildnerpeer stations called the 8105ac2d0dSSascha Wildner.Dq node table 8205ac2d0dSSascha Wildnerin the 8305ac2d0dSSascha Wildner.Vt ic_sta 8405ac2d0dSSascha Wildnerentry of the 8505ac2d0dSSascha Wildner.Vt ieee80211com 8605ac2d0dSSascha Wildnerstructure. 8705ac2d0dSSascha WildnerStation mode vaps create an entry for the access point 8805ac2d0dSSascha Wildnerthe station is associated to. 8905ac2d0dSSascha WildnerAP mode vaps create entries for associated stations. 9005ac2d0dSSascha WildnerAdhoc and mesh mode vaps create entries for neighbor stations. 9105ac2d0dSSascha WildnerWDS mode vaps create an entry for the peer station. 9205ac2d0dSSascha WildnerStations for all vaps reside in the same table; each node 9305ac2d0dSSascha Wildnerentry has a 9405ac2d0dSSascha Wildner.Vt ni_vap 9505ac2d0dSSascha Wildnerfield that identifies the vap that created it. 9605ac2d0dSSascha WildnerIn some instances an entry is used by multiple vaps (e.g. for 9705ac2d0dSSascha Wildnerdynamic WDS a station associated to an ap vap may also be the peer 9805ac2d0dSSascha Wildnerof a WDS vap). 99ff66a890SHiten Pandya.Pp 10005ac2d0dSSascha WildnerNode table entries are reference counted. 10105ac2d0dSSascha WildnerThat is, there is a count of all long term references that determines 10205ac2d0dSSascha Wildnerwhen an entry may be reclaimed. 10305ac2d0dSSascha WildnerReferences are held by every in-flight frame sent to a station to 10405ac2d0dSSascha Wildnerinsure the entry is not reclaimed while the frame is queued or otherwise 10505ac2d0dSSascha Wildnerheld by a driver. 10605ac2d0dSSascha WildnerRoutines that lookup a table entry return a 10705ac2d0dSSascha Wildner.Dq held reference 10805ac2d0dSSascha Wildner(i.e. a pointer to a table entry with the reference count incremented). 109ff66a890SHiten PandyaThe 11005ac2d0dSSascha Wildner.Fn ieee80211_ref_node 111ff66a890SHiten Pandyaand 11205ac2d0dSSascha Wildner.Fn ieee80211_unref_node 11305ac2d0dSSascha Wildnercalls explicitly increment/decrement the reference count of a node, 11405ac2d0dSSascha Wildnerbut are rarely used. 11505ac2d0dSSascha WildnerInstead most callers use 11605ac2d0dSSascha Wildner.Fn ieee80211_free_node 11705ac2d0dSSascha Wildnerto release a reference and, if the count goes to zero, reclaim the 11805ac2d0dSSascha Wildnertable entry. 11905ac2d0dSSascha Wildner.Pp 12005ac2d0dSSascha WildnerThe station table and its entries are exposed to drivers in several ways. 12105ac2d0dSSascha WildnerEach frame transmitted to a station includes a reference to the 12205ac2d0dSSascha Wildnerassociated node in the 12305ac2d0dSSascha Wildner.Vt m_pkthdr.rcvif 12405ac2d0dSSascha Wildnerfield. 12505ac2d0dSSascha WildnerThis reference must be reclaimed by the driver when transmit processing 12605ac2d0dSSascha Wildneris done. 12705ac2d0dSSascha WildnerFor each frame received the driver must lookup the table entry to 12805ac2d0dSSascha Wildneruse in dispatching the frame 12905ac2d0dSSascha Wildner.Dq up the stack . 13005ac2d0dSSascha WildnerThis lookup implicitly obtains a reference to the table entry and 13105ac2d0dSSascha Wildnerthe driver must reclaim the reference when frame processing is completed. 13205ac2d0dSSascha WildnerOtherwise drivers frequently inspect the contents of the 13305ac2d0dSSascha Wildner.Vt iv_bss 13405ac2d0dSSascha Wildnernode when handling state machine changes as important information 13505ac2d0dSSascha Wildneris maintained in the data structure. 13605ac2d0dSSascha Wildner.Pp 13705ac2d0dSSascha WildnerThe node table is opaque to drivers. 13805ac2d0dSSascha WildnerEntries may be looked up using one of the pre-defined API's or the 13905ac2d0dSSascha Wildner.Fn ieee80211_iterate_nodes 14005ac2d0dSSascha Wildnercall may be used to iterate through all entries to do per-node 14105ac2d0dSSascha Wildnerprocessing or implement some non-standard search mechanism. 14205ac2d0dSSascha WildnerNote that 14305ac2d0dSSascha Wildner.Fn ieee80211_iterate_nodes 14405ac2d0dSSascha Wildneris single-threaded per-device 14505ac2d0dSSascha Wildnerand the effort processing involved is fairly 14605ac2d0dSSascha Wildnersubstantial so it should be used carefully. 14705ac2d0dSSascha Wildner.Pp 14805ac2d0dSSascha WildnerTwo routines are provided to print the contents of nodes to the console 14905ac2d0dSSascha Wildnerfor debugging: 15005ac2d0dSSascha Wildner.Fn ieee80211_dump_node 15105ac2d0dSSascha Wildnerdisplays the contents of a single node while 15205ac2d0dSSascha Wildner.Fn ieee80211_dump_nodes 15305ac2d0dSSascha Wildnerdisplays the contents of the specified node table. 15405ac2d0dSSascha WildnerNodes may also be displayed using 1558752be81SSascha Wildner.Xr ddb 4 15605ac2d0dSSascha Wildnerwith the 15705ac2d0dSSascha Wildner.Dq show node 15805ac2d0dSSascha Wildnerdirective and the station node table can be displayed with 15905ac2d0dSSascha Wildner.Dq show statab . 16005ac2d0dSSascha Wildner.Sh DRIVER PRIVATE STATE 16105ac2d0dSSascha WildnerNode data structures may be extended by the driver to include 16205ac2d0dSSascha Wildnerdriver-private state. 16305ac2d0dSSascha WildnerThis is done by overriding the 16405ac2d0dSSascha Wildner.Vt ic_node_alloc 16505ac2d0dSSascha Wildnermethod used to allocate a node table entry. 16605ac2d0dSSascha WildnerThe driver method must allocate a structure that is an extension 16705ac2d0dSSascha Wildnerof the 16805ac2d0dSSascha Wildner.Vt ieee80211_node 16905ac2d0dSSascha Wildnerstructure. 170*1d97534aSSascha WildnerFor example the 171*1d97534aSSascha Wildner.Xr iwi 4 172*1d97534aSSascha Wildnerdriver defines a private node structure as: 173*1d97534aSSascha Wildner.Bd -literal -offset indent 174*1d97534aSSascha Wildnerstruct iwi_node { 175*1d97534aSSascha Wildner struct ieee80211_node in_node; 176*1d97534aSSascha Wildner int in_station; 177*1d97534aSSascha Wildner}; 178*1d97534aSSascha Wildner.Ed 17905ac2d0dSSascha Wildner.Pp 18005ac2d0dSSascha Wildnerand then provides a private allocation routine that does this: 18105ac2d0dSSascha Wildner.Bd -literal -offset indent 18205ac2d0dSSascha Wildnerstatic struct ieee80211_node * 18305ac2d0dSSascha Wildneriwi_node_alloc(struct ieee80211vap *vap, 18405ac2d0dSSascha Wildner const uint8_t mac[IEEE80211_ADDR_LEN]) 18505ac2d0dSSascha Wildner{ 18605ac2d0dSSascha Wildner struct iwi_node *in; 18705ac2d0dSSascha Wildner 18805ac2d0dSSascha Wildner in = malloc(sizeof (struct iwi_node), M_80211_NODE, 18905ac2d0dSSascha Wildner M_NOWAIT | M_ZERO); 19005ac2d0dSSascha Wildner if (in == NULL) 19105ac2d0dSSascha Wildner return NULL; 19205ac2d0dSSascha Wildner in->in_station = -1; 19305ac2d0dSSascha Wildner return &in->in_node; 19405ac2d0dSSascha Wildner} 19505ac2d0dSSascha Wildner.Ed 19605ac2d0dSSascha Wildner.Pp 19705ac2d0dSSascha WildnerNote that when reclaiming a node allocated by the driver the 19805ac2d0dSSascha Wildner.Dq parent method 19905ac2d0dSSascha Wildnermust be called to ensure 20005ac2d0dSSascha Wildner.Nm net80211 20105ac2d0dSSascha Wildnerstate is reclaimed; for example: 20205ac2d0dSSascha Wildner.Bd -literal -offset indent 20305ac2d0dSSascha Wildnerstatic void 20405ac2d0dSSascha Wildneriwi_node_free(struct ieee80211_node *ni) 20505ac2d0dSSascha Wildner{ 20605ac2d0dSSascha Wildner struct ieee80211com *ic = ni->ni_ic; 20705ac2d0dSSascha Wildner struct iwi_softc *sc = ic->ic_ifp->if_softc; 20805ac2d0dSSascha Wildner struct iwi_node *in = (struct iwi_node *)ni; 20905ac2d0dSSascha Wildner 21005ac2d0dSSascha Wildner if (in->in_station != -1) 21105ac2d0dSSascha Wildner free_unr(sc->sc_unr, in->in_station); 21205ac2d0dSSascha Wildner sc->sc_node_free(ni); /* invoke net80211 free handler */ 21305ac2d0dSSascha Wildner} 21405ac2d0dSSascha Wildner.Ed 21505ac2d0dSSascha Wildner.Pp 21605ac2d0dSSascha WildnerBeware that care must be taken to avoid holding references that 21705ac2d0dSSascha Wildnermight cause nodes from being reclaimed. 21805ac2d0dSSascha Wildner.Nm net80211 21905ac2d0dSSascha Wildnerwill reclaim a node when the last reference is reclaimed in 22005ac2d0dSSascha Wildnerits data structures. 22105ac2d0dSSascha WildnerHowever if a driver holds additional references then 22205ac2d0dSSascha Wildner.Nm net80211 22305ac2d0dSSascha Wildnerwill not recognize this and table entries will not be reclaimed. 22405ac2d0dSSascha WildnerSuch references should not be needed if the driver overrides the 22505ac2d0dSSascha Wildner.Vt ic_node_cleanup 22605ac2d0dSSascha Wildnerand/or 22705ac2d0dSSascha Wildner.Vt ic_node_free 22805ac2d0dSSascha Wildnermethods. 22905ac2d0dSSascha Wildner.Sh KEY TABLE SUPPORT 23005ac2d0dSSascha WildnerNode table lookups are typically done using a hash of the stations' 23105ac2d0dSSascha Wildnermac address. 23205ac2d0dSSascha WildnerWhen receiving frames this is sufficient to find the node table entry 23305ac2d0dSSascha Wildnerfor the transmitter. 23405ac2d0dSSascha WildnerBut some devices also identify the sending station in the device 23505ac2d0dSSascha Wildnerstate received with each frame and this data can be used to optimize 23605ac2d0dSSascha Wildnerlookups on receive using a companion table called the 23705ac2d0dSSascha Wildner.Dq keytab . 23805ac2d0dSSascha WildnerThis table records a separate node table reference that can be fetched 23905ac2d0dSSascha Wildnerwithout any locking using the table index. 24005ac2d0dSSascha WildnerThis logic is handled with the 24105ac2d0dSSascha Wildner.Fn ieee80211_find_rxnode_withkey 24205ac2d0dSSascha Wildnercall: if a keytab entry is found using the specified index then it is 24305ac2d0dSSascha Wildnerreturned directly; otherwise a normal lookup is done and the keytab 24405ac2d0dSSascha Wildnerentry is written using the specified index. 24505ac2d0dSSascha WildnerIf the specified index is 24605ac2d0dSSascha Wildner.Dv IEEE80211_KEYIX_NONE 24705ac2d0dSSascha Wildnerthen a normal lookup is done without a table update. 24805ac2d0dSSascha Wildner.Sh SEE ALSO 2498752be81SSascha Wildner.Xr ddb 4 , 25005ac2d0dSSascha Wildner.Xr ieee80211 9 , 25105ac2d0dSSascha Wildner.Xr ieee80211_proto 9 252