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