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