xref: /dflybsd-src/share/man/man9/ieee80211_node.9 (revision e4c06619483849b6d1d179ae56da763ed720062d)
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