First (early) draft of net80211 documentation. Note this is
focused on driver writers (as opposed to folks adding to net80211). Reviewed by: wkoszek Approved by: re (rwatson)
This commit is contained in:
parent
09b0354839
commit
692eebe092
@ -121,13 +121,19 @@ MAN= accept_filter.9 \
|
||||
hashinit.9 \
|
||||
hexdump.9 \
|
||||
ieee80211.9 \
|
||||
ieee80211_amrr.9 \
|
||||
ieee80211_beacon.9 \
|
||||
ieee80211_bmiss.9 \
|
||||
ieee80211_crypto.9 \
|
||||
ieee80211_ddb.9 \
|
||||
ieee80211_input.9 \
|
||||
ieee80211_ioctl.9 \
|
||||
ieee80211_node.9 \
|
||||
ieee80211_output.9 \
|
||||
ieee80211_proto.9 \
|
||||
ieee80211_radiotap.9 \
|
||||
ieee80211_regdomain.9 \
|
||||
ieee80211_scan.9 \
|
||||
ieee80211_vap.9 \
|
||||
ifnet.9 \
|
||||
inittodr.9 \
|
||||
insmntque.9 \
|
||||
@ -627,52 +633,62 @@ MLINKS+=hash.9 hash32.9 \
|
||||
MLINKS+=hashinit.9 hashdestroy.9 \
|
||||
hashinit.9 hashinit_flags.9 \
|
||||
hashinit.9 phashinit.9
|
||||
MLINKS+=ieee80211.9 ieee80211_attach.9 \
|
||||
ieee80211.9 ieee80211_chan2ieee.9 \
|
||||
ieee80211.9 ieee80211_chan2mode.9 \
|
||||
ieee80211.9 ieee80211_ieee2mhz.9 \
|
||||
ieee80211.9 ieee80211_ifattach.9 \
|
||||
ieee80211.9 ieee80211_ifdetach.9 \
|
||||
ieee80211.9 ieee80211_media2rate.9 \
|
||||
ieee80211.9 ieee80211_media_change.9 \
|
||||
ieee80211.9 ieee80211_media_init.9 \
|
||||
ieee80211.9 ieee80211_media_status.9 \
|
||||
ieee80211.9 ieee80211_mhz2ieee.9 \
|
||||
ieee80211.9 ieee80211_rate2media.9 \
|
||||
ieee80211.9 ieee80211_setmode.9 \
|
||||
ieee80211.9 ieee80211_watchdog.9
|
||||
MLINKS+=ieee80211_crypto.9 ieee80211_crypto_attach.9 \
|
||||
ieee80211_crypto.9 ieee80211_crypto_detach.9 \
|
||||
ieee80211_crypto.9 ieee80211_wep_crypt.9
|
||||
MLINKS+=ieee80211_input.9 ieee80211_decap.9 \
|
||||
ieee80211_input.9 ieee80211_recv_mgmt.9
|
||||
MLINKS+=ieee80211_ioctl.9 ieee80211_cfgget.9 \
|
||||
ieee80211_ioctl.9 ieee80211_cfgset.9
|
||||
MLINKS+=ieee80211_node.9 ieee80211_alloc_node.9 \
|
||||
ieee80211_node.9 ieee80211_begin_scan.9 \
|
||||
ieee80211_node.9 ieee80211_create_ibss.9 \
|
||||
ieee80211_node.9 ieee80211_dup_bss.9 \
|
||||
ieee80211_node.9 ieee80211_end_scan.9 \
|
||||
ieee80211_node.9 ieee80211_find_node.9 \
|
||||
ieee80211_node.9 ieee80211_free_allnodes.9 \
|
||||
MLINKS+=ieee80211.9 ieee80211_ifattach.9 \
|
||||
ieee80211.9 ieee80211_ifdetach.9
|
||||
MLINKS+=ieee80211_amrr.9 ieee80211_amrr_init.9 \
|
||||
ieee80211_amrr.9 ieee80211_amrr_cleanup.9 \
|
||||
ieee80211_amrr.9 ieee80211_amrr_setinterval.9 \
|
||||
ieee80211_amrr.9 ieee80211_amrr_node_init.9 \
|
||||
ieee80211_amrr.9 ieee80211_amrr_tx_complete.9 \
|
||||
ieee80211_amrr.9 ieee80211_amrr_tx_update.9
|
||||
MLINKS+=ieee80211_beacon.9 ieee80211_beacon_alloc.9 \
|
||||
ieee80211_beacon.9 ieee80211_beacon_update.9 \
|
||||
ieee80211_beacon.9 ieee80211_beacon_notify.9
|
||||
MLINKS+=ieee80211_bmiss.9 ieee80211_beacon_miss.9
|
||||
MLINKS+=ieee80211_crypto.9 ieee80211_key_update_begin.9 \
|
||||
ieee80211_crypto.9 ieee80211_key_update_end.9 \
|
||||
ieee80211_crypto.9 ieee80211_crypto_newkey.9 \
|
||||
ieee80211_crypto.9 ieee80211_crypto_setkey.9 \
|
||||
ieee80211_crypto.9 ieee80211_crypto_delglobalkeys.9 \
|
||||
ieee80211_crypto.9 ieee80211_crypto_reload_keys.9 \
|
||||
ieee80211_crypto.9 ieee80211_crypto_decap.9 \
|
||||
ieee80211_crypto.9 ieee80211_crypto_encap.9 \
|
||||
ieee80211_crypto.9 ieee80211_crypto_demic.9 \
|
||||
ieee80211_crypto.9 ieee80211_crypto_enmic.9 \
|
||||
ieee80211_crypto.9 ieee80211_notify_michael_failure.9 \
|
||||
ieee80211_crypto.9 ieee80211_notify_replay_failure.9 \
|
||||
ieee80211_crypto.9 ieee80211_crypto_register.9 \
|
||||
ieee80211_crypto.9 ieee80211_crypto_unregister.9 \
|
||||
ieee80211_crypto.9 ieee80211_crypto_available.9
|
||||
MLINKS+=ieee80211_input.9 ieee80211_input_all.9
|
||||
MLINKS+=ieee80211_node.9 ieee80211_find_rxnode.9 \
|
||||
ieee80211_node.9 ieee80211_find_rxnode_withkey.9 \
|
||||
ieee80211_node.9 ieee80211_ref_node.9 \
|
||||
ieee80211_node.9 ieee80211_unref_node.9 \
|
||||
ieee80211_node.9 ieee80211_free_node.9 \
|
||||
ieee80211_node.9 ieee80211_iterate_nodes.9 \
|
||||
ieee80211_node.9 ieee80211_lookup_node.9 \
|
||||
ieee80211_node.9 ieee80211_next_scan.9 \
|
||||
ieee80211_node.9 ieee80211_node_attach.9 \
|
||||
ieee80211_node.9 ieee80211_node_detach.9 \
|
||||
ieee80211_node.9 ieee80211_node_lateattach.9 \
|
||||
ieee80211_node.9 ieee80211_timeout_nodes.9
|
||||
MLINKS+=ieee80211_output.9 ieee80211_add_rates.9 \
|
||||
ieee80211_output.9 ieee80211_add_xrates.9 \
|
||||
ieee80211_output.9 ieee80211_encap.9 \
|
||||
ieee80211_output.9 ieee80211_send_mgmt.9
|
||||
MLINKS+=ieee80211_proto.9 ieee80211_dump_pkt.9 \
|
||||
ieee80211_proto.9 ieee80211_fix_rate.9 \
|
||||
ieee80211_proto.9 ieee80211_print_essid.9 \
|
||||
ieee80211_proto.9 ieee80211_proto_attach.9 \
|
||||
ieee80211_proto.9 ieee80211_proto_detach.9
|
||||
MLINKS+=ieee80211_radiotap.9 radiotap.9
|
||||
ieee80211_node.9 ieee80211_dump_node.9 \
|
||||
ieee80211_node.9 ieee80211_dump_nodes.9
|
||||
MLINKS+=ieee80211_output.9 M_WME_GETAC.9 \
|
||||
ieee80211_output.9 M_SEQNO_GET.9 \
|
||||
ieee80211_output.9 ieee80211_process_callback.9
|
||||
MLINKS+=ieee80211_proto.9 ieee80211_new_state.9 \
|
||||
ieee80211_proto.9 ieee80211_start_all.9 \
|
||||
ieee80211_proto.9 ieee80211_stop_all.9 \
|
||||
ieee80211_proto.9 ieee80211_suspend_all.9 \
|
||||
ieee80211_proto.9 ieee80211_resume_all.9 \
|
||||
ieee80211_proto.9 ieee80211_waitfor_parent.9
|
||||
MLINKS+=ieee80211_radiotap.9 radiotap.9 \
|
||||
ieee80211_radiotap.9 ieee80211_radiotap_attach.9 \
|
||||
ieee80211_radiotap.9 ieee80211_radiotap_active_vap.9 \
|
||||
ieee80211_radiotap.9 ieee80211_radiotap_active.9 \
|
||||
ieee80211_radiotap.9 ieee80211_radiotap_tx.9
|
||||
MLINKS+=ieee80211_regdomain.9 ieee80211_init_channels.9 \
|
||||
ieee80211_regdomain.9 ieee80211_sort_channels.9 \
|
||||
ieee80211_regdomain.9 ieee80211_alloc_countryie.9
|
||||
MLINKS+=ieee80211_vap.9 ieee80211_vap_setup.9 \
|
||||
ieee80211_vap.9 ieee80211_vap_attach.9 \
|
||||
ieee80211_vap.9 ieee80211_vap_detach.9
|
||||
MLINKS+=ifnet.9 ifaddr.9 \
|
||||
ifnet.9 if_data.9 \
|
||||
ifnet.9 ifqueue.9
|
||||
|
@ -1,6 +1,5 @@
|
||||
.\"
|
||||
.\" Copyright (c) 2004 Bruce M. Simpson <bms@spc.org>
|
||||
.\" Copyright (c) 2004 Darron Broad <darron@kewl.org>
|
||||
.\" Copyright (c) 2009 Sam Leffler, Errno Consulting
|
||||
.\" All rights reserved.
|
||||
.\"
|
||||
.\" Redistribution and use in source and binary forms, with or without
|
||||
@ -25,236 +24,538 @@
|
||||
.\" SUCH DAMAGE.
|
||||
.\"
|
||||
.\" $FreeBSD$
|
||||
.\" $Id: ieee80211.9,v 1.5 2004/03/04 12:33:27 bruce Exp $
|
||||
.\"
|
||||
.Dd March 2, 2004
|
||||
.Dt IEEE80211 9
|
||||
.Dd August 4, 2009
|
||||
.Dt NET80211 9
|
||||
.Os
|
||||
.Sh NAME
|
||||
.Nm ieee80211_ifattach , ieee80211_ifdetach ,
|
||||
.Nm ieee80211_mhz2ieee , ieee80211_chan2ieee , ieee80211_ieee2mhz ,
|
||||
.Nm ieee80211_media_init , ieee80211_media_change , ieee80211_media_status ,
|
||||
.Nm ieee80211_watchdog ,
|
||||
.Nm ieee80211_setmode , ieee80211_chan2mode ,
|
||||
.Nm ieee80211_rate2media , ieee80211_media2rate
|
||||
.Nd core 802.11 network stack functions
|
||||
.Nm net80211
|
||||
.Nd 802.11 network layer
|
||||
.Sh SYNOPSIS
|
||||
.In net80211/ieee80211_var.h
|
||||
.In net80211/ieee80211_proto.h
|
||||
.Ft void
|
||||
.Fn ieee80211_ifattach "struct ifnet *ifp"
|
||||
.Fn ieee80211_ifattach "struct ieee80211com *ic" "const uint8_t macaddr[IEEE80211_ADDR_LEN]"
|
||||
.Ft void
|
||||
.Fn ieee80211_ifdetach "struct ifnet *ifp"
|
||||
.Ft u_int
|
||||
.Fn ieee80211_mhz2ieee "u_int freq" "u_int flags"
|
||||
.Ft u_int
|
||||
.Fn ieee80211_chan2ieee "struct ieee80211com *ic" "struct ieee80211_channel *c"
|
||||
.Ft u_int
|
||||
.Fn ieee80211_ieee2mhz "u_int chan" "u_int flags"
|
||||
.Ft void
|
||||
.Fo ieee80211_media_init
|
||||
.Fa "struct ifnet *ifp" "ifm_change_cb_t media_change"
|
||||
.Fa "ifm_stat_cb_t media_stat"
|
||||
.Fc
|
||||
.Fa int
|
||||
.Fn ieee80211_media_change "struct ifnet *ifp"
|
||||
.Fa void
|
||||
.Fn ieee80211_media_status "struct ifnet *ifp" "struct ifmediareq *imr"
|
||||
.Ft void
|
||||
.Fn ieee80211_watchdog "struct ifnet *ifp"
|
||||
.Ft int
|
||||
.Fn ieee80211_setmode "struct ieee80211com *ic" "enum ieee80211_phymode mode"
|
||||
.Ft enum ieee80211_phymode
|
||||
.Fo ieee80211_chan2mode
|
||||
.Fa "struct ieee80211com *ic" "struct ieee80211_channel *chan"
|
||||
.Fc
|
||||
.Ft int
|
||||
.Fo ieee80211_rate2media
|
||||
.Fa "struct ieee80211com *ic" "int rate" "enum ieee80211_phymode mode"
|
||||
.Fc
|
||||
.Ft int
|
||||
.Fn ieee80211_media2rate "int mword"
|
||||
.Fn ieee80211_ifdetach "struct ieee80211com *ic"
|
||||
.Sh DESCRIPTION
|
||||
The
|
||||
.Nm ieee80211
|
||||
collection of functions are used to manage wireless network interfaces in the
|
||||
system which use the system's software 802.11 network stack.
|
||||
Most of these functions require that attachment to the stack is performed
|
||||
before calling.
|
||||
Several utility functions are also provided; these are safe to call from
|
||||
any driver without prior initialization.
|
||||
IEEE 802.11 device drivers are written to use the infrastructure provided
|
||||
by the
|
||||
.Nm
|
||||
software layer.
|
||||
This software provides a support framework for drivers that includes
|
||||
ifnet cloning, state management, and a user management API by which
|
||||
applications interact with 802.11 devices.
|
||||
Most drivers depend on the
|
||||
.Nm
|
||||
layer for protocol services but devices that off-load functionality
|
||||
may bypass the layer to connect directly to the device
|
||||
(e.g. the
|
||||
.Xr ndis 4
|
||||
emulation support does this).
|
||||
.Pp
|
||||
.\"
|
||||
A
|
||||
.Nm
|
||||
device driver implements a virtual radio API that is exported to
|
||||
users through network interfaces (aka vaps) that are cloned from the
|
||||
underlying device.
|
||||
These interfaces have an operating mode
|
||||
(station, adhoc, hostap, wds, monitor, etc.)
|
||||
that is fixed for the lifetime of the interface.
|
||||
Devices that can support multiple concurrent interfaces allow
|
||||
multiple vaps to be cloned.
|
||||
This enables construction of interesting applications such as
|
||||
an AP vap and one or more WDS vaps
|
||||
or multiple AP vaps, each with a different security model.
|
||||
The
|
||||
.Nm
|
||||
layer virtualizes most 802.11 state
|
||||
and coordinates vap state changes including scheduling multiple vaps.
|
||||
State that is not virtualized includes the current channel and
|
||||
WME/WMM parameters.
|
||||
Protocol processing is typically handled entirely in the
|
||||
.Nm
|
||||
layer with drivers responsible purely for moving data between the host
|
||||
and device.
|
||||
Similarly,
|
||||
.Nm
|
||||
handles most
|
||||
.Xr ioctl 2
|
||||
requests without entering the driver;
|
||||
instead drivers are notified of state changes that
|
||||
require their involvement.
|
||||
.Pp
|
||||
The virtual radio interface defined by the
|
||||
.Nm
|
||||
layer means that drivers must be structured to follow specific rules.
|
||||
Drivers that support only a single interface at any time must still
|
||||
follow these rules.
|
||||
.Sh DATA STRUCTURES
|
||||
The virtual radio architecture splits state between a single per-device
|
||||
.Vt ieee80211com
|
||||
structure and one or more
|
||||
.Vt ieee80211vap
|
||||
structures.
|
||||
Drivers are expected to setup various shared state in these structures
|
||||
at device attach and during vap creation but otherwise should treat them
|
||||
as read-only.
|
||||
The
|
||||
.Vt ieee80211com
|
||||
structure is allocated by the
|
||||
.Nm
|
||||
layer as adjunct data to a device's
|
||||
.Vt ifnet ;
|
||||
it is accessed through the
|
||||
.Vt if_l2com
|
||||
structure member.
|
||||
The
|
||||
.Vt ieee80211vap
|
||||
structure is allocated by the driver in the
|
||||
.Dq vap create
|
||||
method
|
||||
and should be extended with any driver-private state.
|
||||
This technique of giving the driver control to allocate data structures
|
||||
is used for other
|
||||
.Nm
|
||||
data structures and should be exploited to maintain driver-private state
|
||||
together with public
|
||||
.Nm
|
||||
state.
|
||||
.Pp
|
||||
The other main data structures are the station, or node, table
|
||||
that tracks peers in the local BSS, and the channel table that defines
|
||||
the current set of available radio channels.
|
||||
Both tables are bound to the
|
||||
.Vt ieee80211com
|
||||
structure and shared by all vaps.
|
||||
Long-lasting references to a node are counted to guard against
|
||||
premature reclamation.
|
||||
In particular every packet sent/received holds a node reference
|
||||
(either explicitly for transmit or implicitly on receive).
|
||||
.Pp
|
||||
The
|
||||
.Vt ieee80211com
|
||||
and
|
||||
.Vt ieee80211vap
|
||||
structures also hold a collection of method pointers that drivers
|
||||
fill-in and/or override to take control of certain operations.
|
||||
These methods are the primary way drivers are bound to the
|
||||
.Nm
|
||||
layer and are described below.
|
||||
.Sh DRIVER ATTACH/DETACH
|
||||
Drivers attach to the
|
||||
.Nm
|
||||
layer with the
|
||||
.Fn ieee80211_ifattach
|
||||
function attaches the network interface
|
||||
.Fa ifp
|
||||
to the 802.11 network stack layer.
|
||||
This function must be called before using any of the
|
||||
.Nm ieee80211
|
||||
functions which need to store driver state across invocations;
|
||||
function.
|
||||
The driver is expected to allocate and setup any device-private
|
||||
data structures before passing control.
|
||||
The
|
||||
.Vt struct ifnet
|
||||
instance pointed to by
|
||||
.Fa ifp
|
||||
MUST be an instance of
|
||||
.Vt struct ieee80211com ,
|
||||
with various fields initialized to tell
|
||||
.Nm ieee80211
|
||||
about its capabilities.
|
||||
This function performs Ethernet and BPF attachment (by calling
|
||||
.Fn ether_ifattach
|
||||
and
|
||||
.Fn bpfattach2 )
|
||||
on behalf of the caller.
|
||||
It also implements the
|
||||
.Vt ifmedia
|
||||
interface.
|
||||
.Vt ieee80211com
|
||||
structure must be pre-initialized with state required to setup the
|
||||
.Nm
|
||||
layer:
|
||||
.Bl -tag -width ic_channels
|
||||
.It Dv ic_ifp
|
||||
Backpointer to the physical device's ifnet.
|
||||
.It Dv ic_caps
|
||||
Device/driver capabilities; see below for a complete description.
|
||||
.It Dv ic_channels
|
||||
Table of channels the device is capable of operating on.
|
||||
This is initially provided by the driver but may be changed
|
||||
through calls that change the regulatory state.
|
||||
.It Dv ic_nchan
|
||||
Number of entries in
|
||||
.Dv ic_channels .
|
||||
.El
|
||||
.Pp
|
||||
.\"
|
||||
The
|
||||
On return from
|
||||
.Fn ieee80211_ifattach
|
||||
the driver is expected to override default callback functions in the
|
||||
.Vt ieee80211com
|
||||
structure to register it's private routines.
|
||||
Methods marked with a
|
||||
.Dq *
|
||||
must be provided by the driver.
|
||||
.Bl -tag -width ic_channels
|
||||
.It Dv ic_vap_create*
|
||||
Create a vap instance of the specified type (operating mode).
|
||||
Any fixed BSSID and/or MAC address is provided.
|
||||
Drivers that support multi-bssid operation may honor the requested BSSID
|
||||
or assign their own.
|
||||
.It Dv ic_vap_delete*
|
||||
Destroy a vap instance created with
|
||||
.Dv ic_vap_create .
|
||||
.It Dv ic_getradiocaps
|
||||
Return the list of calibrated channels for the radio.
|
||||
The default method returns the current list of channels
|
||||
(space permitting).
|
||||
.It Dv ic_setregdomain
|
||||
Process a request to change regulatory state.
|
||||
The routine may reject a request or constrain changes (e.g. reduce
|
||||
transmit power caps).
|
||||
The default method accepts all proposed changes.
|
||||
.It Dv ic_send_mgmt
|
||||
Send an 802.11 management frame.
|
||||
The default method fabricates the frame using
|
||||
.Nm
|
||||
state and passes it to the driver through the
|
||||
.Dv ic_raw_xmit
|
||||
method.
|
||||
.It Dv ic_raw_xmit
|
||||
Transmit a raw 802.11 frame.
|
||||
The default method drops the frame and generates a message on the console.
|
||||
.It Dv ic_updateslot
|
||||
Update hardware state after an 802.11 IFS slot time change,
|
||||
There is no default method; the pointer may be NULL in which case
|
||||
it will not be used.
|
||||
.It Dv ic_update_mcast
|
||||
Update hardware for a change in the multicast packet filter,
|
||||
The default method prints a console message.
|
||||
.It Dv ic_update_promisc
|
||||
Update hardware for a change in the promiscuous mode setting.
|
||||
The default method prints a console message.
|
||||
.It Dv ic_newassoc
|
||||
Update driver/device state for association to a new AP (in station mode)
|
||||
or when a new station associates (e.g. in AP mode).
|
||||
There is no default method; the pointer may be NULL in which case
|
||||
it will not be used.
|
||||
.It Dv ic_node_alloc
|
||||
Allocate and initialize a
|
||||
.Vt ieee80211_node
|
||||
structure.
|
||||
This method cannot sleep.
|
||||
The default method allocates zero'd memory using
|
||||
.Xr malloc 9.
|
||||
Drivers should override this method to allocate extended storage
|
||||
for their own needs.
|
||||
Memory allocated by the driver must be tagged with
|
||||
.Dv M_80211_NODE
|
||||
to balance the memory allocation statistics.
|
||||
.It Dv ic_node_free
|
||||
Reclaim storage of a node allocated by
|
||||
.Dv ic_node_alloc .
|
||||
Drivers are expected to
|
||||
.Em interpose
|
||||
their own method to cleanup private state but must call through
|
||||
this method to allow
|
||||
.Nm
|
||||
to reclaim it's private state.
|
||||
.It Dv ic_node_cleanup
|
||||
Cleanup state in a
|
||||
.Vt ieee80211_node
|
||||
created by
|
||||
.Dv ic_node_alloc .
|
||||
This operation is distinguished from
|
||||
.Dv ic_node_free
|
||||
in that it may be called long before the node is actually reclaimed
|
||||
to cleanup adjunct state.
|
||||
This can happen, for example, when a node must not be reclaimed
|
||||
due to references held by packets in the transmit queue.
|
||||
Drivers typically interpose
|
||||
.Dv ic_node_cleanup
|
||||
instead of
|
||||
.Dv ic_node_free .
|
||||
.It Dv ic_node_age
|
||||
Age, and potentially reclaim, resources associated with a node.
|
||||
The default method ages frames on the power-save queue (in AP mode)
|
||||
and pending frames in the receive reorder queues (for stations using A-MPDU).
|
||||
.It Dv ic_node_drain
|
||||
Reclaim all optional resources associated with a node.
|
||||
This call is used to free up resources when they are in short supply,
|
||||
.It Dv ic_node_getrssi
|
||||
Return the Receive Signal Strength Indication (RSSI) in .5 dBm units for
|
||||
the specified node.
|
||||
This interface returns a subset of the information
|
||||
returned by
|
||||
.Dv ic_node_getsignal ,
|
||||
The default method calculates a filtered average over the last ten
|
||||
samples passed in to
|
||||
.Xr ieee80211_input 9
|
||||
or
|
||||
.Xr ieee80211_input_all 9 .
|
||||
.It Dv ic_node_getsignal
|
||||
Return the RSSI and noise floor (in .5 dBm units) for a station.
|
||||
The default method calculates RSSI as described above;
|
||||
the noise floor returned is the last value supplied to
|
||||
.Xr ieee80211_input 9
|
||||
or
|
||||
.Xr ieee80211_input_all 9 .
|
||||
.It Dv ic_node_getmimoinfo
|
||||
Return MIMO radio state for a station in support of the
|
||||
.Dv IEEE80211_IOC_STA_INFO
|
||||
ioctl request.
|
||||
The default method returns nothing.
|
||||
.It Dv ic_scan_start*
|
||||
Prepare driver/hardware state for scanning.
|
||||
This callback is done in a sleepable context.
|
||||
.It Dv ic_scan_end*
|
||||
Restore driver/hardware state after scanning completes.
|
||||
This callback is done in a sleepable context.
|
||||
.It Dv ic_set_channel*
|
||||
Set the current radio channel using
|
||||
.Vt ic_curchan .
|
||||
This callback is done in a sleepable context.
|
||||
.It Dv ic_scan_curchan
|
||||
Start scanning on a channel.
|
||||
This method is called immediately after each channel change
|
||||
and must initiate the work to scan a channel and schedule a timer
|
||||
to advance to the next channel in the scan list.
|
||||
This callback is done in a sleepable context.
|
||||
The default method handles active scan work (e.g. sending ProbRequest
|
||||
frames), and schedules a call to
|
||||
.Xr ieee80211_scan_next 9
|
||||
according to the maximum dwell time for the channel.
|
||||
Drivers that off-load scan work to firmware typically use this method
|
||||
to trigger per-channel scan activity.
|
||||
.It Dv ic_scan_mindwell
|
||||
Handle reaching the minimum dwell time on a channel when scanning.
|
||||
This event is triggered when one or more stations have been found on
|
||||
a channel and the minimum dwell time has been reached.
|
||||
This callback is done in a sleepable context.
|
||||
The default method signals the scan machinery to advance
|
||||
to the next channel as soon as possible.
|
||||
Drivers can use this method to preempt further work (e.g. if scanning
|
||||
is handled by firmware) or ignore the request to force maximum dwell time
|
||||
on a channel.
|
||||
.It Dv ic_recv_action
|
||||
Process a received Action frame.
|
||||
The default method points to
|
||||
.Xr ieee80211_recv_action 9
|
||||
which provides a mechanism for setting up handlers for each Action frame class.
|
||||
.It Dv ic_send_action
|
||||
Transmit an Action frame.
|
||||
The default method points to
|
||||
.Xr ieee80211_send_action 9
|
||||
which provides a mechanism for setting up handlers for each Action frame class.
|
||||
.It Dv ic_ampdu_enable
|
||||
Check if transmit A-MPDU should be enabled for the specified station and AC.
|
||||
The default method checks a per-AC traffic rate against a per-vap
|
||||
threshold to decide if A-MPDU should be enabled.
|
||||
This method also rate-limits ADDBA requests so that requests are not
|
||||
made too frequently when a receiver has limited resources.
|
||||
.It Dv ic_addba_request
|
||||
Request A-MPDU transmit aggregation.
|
||||
The default method sets up local state and issues an
|
||||
ADDBA Request Action frame.
|
||||
Drivers may interpose this method if they need to setup private state
|
||||
for handling transmit A-MPDU.
|
||||
.It Dv ic_addb_response
|
||||
Process a received ADDBA Response Action frame and setup resources as
|
||||
needed for doing transmit A-MPDU,
|
||||
.It Dv ic_addb_stop
|
||||
Shutdown an A-MPDU transmit stream for the specified station and AC.
|
||||
The default method reclaims local state after sending a DelBA Action frame.
|
||||
.It Dv ic_bar_response
|
||||
Process a response to a transmitted BAR control frame.
|
||||
.It Dv ic_ampdu_rx_start
|
||||
Prepare to receive A-MPDU data from the specified station for the TID.
|
||||
.It Dv ic_ampdu_rx_stop
|
||||
Terminate receipt of A-MPDU data from the specified station for the TID.
|
||||
.El
|
||||
.Pp
|
||||
Once the
|
||||
.Nm
|
||||
layer is attached to a driver there are two more steps typically done
|
||||
to complete the work:
|
||||
.Bl -enum
|
||||
.It
|
||||
Setup
|
||||
.Dq radiotap support
|
||||
for capturing raw 802.11 packets that pass through the device.
|
||||
This is done with a call to
|
||||
.Xr ieee80211_radiotap_attach 9 .
|
||||
.It
|
||||
Do any final device setup like enabling interrupts.
|
||||
.El
|
||||
.Pp
|
||||
State is torn down and reclaimed with a call to
|
||||
.Fn ieee80211_ifdetach .
|
||||
Note this call may result in multiple callbacks into the driver
|
||||
so it should be done before any critical driver state is reclaimed.
|
||||
On return from
|
||||
.Fn ieee80211_ifdetach
|
||||
function frees any
|
||||
.Nm ieee80211
|
||||
structures associated with the driver, and performs Ethernet and BPF
|
||||
detachment on behalf of the caller.
|
||||
.Pp
|
||||
.\"
|
||||
all associated vaps and ifnet structures are reclaimed or inaccessible
|
||||
to user applications so it is safe to teardown driver state without
|
||||
worry about being re-entered.
|
||||
The driver is responsible for calling
|
||||
.Xr if_free 9
|
||||
on the ifnet it allocated for the physical device.
|
||||
.Sh DRIVER CAPABILITIES
|
||||
Driver/device capabilities are specified using several sets of flags
|
||||
in the
|
||||
.Vt ieee80211com
|
||||
structure.
|
||||
General capabilities are specified by
|
||||
.Vt ic_caps .
|
||||
Hardware cryptographic capabilities are specified by
|
||||
.Vt ic_cryptocaps .
|
||||
802.11n capabilities, if any, are specified by
|
||||
.Vt ic_htcaps .
|
||||
The
|
||||
.Fn ieee80211_mhz2ieee
|
||||
utility function converts the frequency
|
||||
.Fa freq
|
||||
(specified in MHz) to an IEEE 802.11 channel number.
|
||||
The
|
||||
.Fa flags
|
||||
argument is a hint which specifies whether the frequency is in
|
||||
the 2GHz ISM band
|
||||
.Pq Vt IEEE80211_CHAN_2GHZ
|
||||
or the 5GHz band
|
||||
.Pq Vt IEEE80211_CHAN_5GHZ ;
|
||||
appropriate clipping of the result is then performed.
|
||||
.Pp
|
||||
.\"
|
||||
The
|
||||
.Fn ieee80211_chan2ieee
|
||||
function converts the channel specified in
|
||||
.Fa *c
|
||||
to an IEEE channel number for the driver
|
||||
.Fa ic .
|
||||
If the conversion would be invalid, an error message is printed to the
|
||||
system console.
|
||||
This function REQUIRES that the driver is hooked up to the
|
||||
.Nm ieee80211
|
||||
subsystem.
|
||||
.Pp
|
||||
.\"
|
||||
The
|
||||
.Fn ieee80211_ieee2mhz
|
||||
utility function converts the IEEE channel number
|
||||
.Ft chan
|
||||
to a frequency (in MHz).
|
||||
The
|
||||
.Fa flags
|
||||
argument is a hint which specifies whether the frequency is in
|
||||
the 2GHz ISM band
|
||||
.Pq Vt IEEE80211_CHAN_2GHZ
|
||||
or the 5GHz band
|
||||
.Pq Vt IEEE80211_CHAN_5GHZ ;
|
||||
appropriate clipping of the result is then performed.
|
||||
.Pp
|
||||
.\"
|
||||
The
|
||||
.Fn ieee80211_media_init
|
||||
function initializes media data structures used by the
|
||||
.Vt ifmedia
|
||||
interface, for the driver
|
||||
.Fa ifp .
|
||||
It must be called by the driver after calling
|
||||
.Fn ieee80211_attach
|
||||
and before calling most
|
||||
.Nm ieee80211
|
||||
functions.
|
||||
The
|
||||
.Fa media_change
|
||||
.Nm
|
||||
layer propagates a subset of these capabilities to each vap through
|
||||
the equivalent fields:
|
||||
.Vt iv_caps ,
|
||||
.Vt iv_cryptocaps ,
|
||||
and
|
||||
.Fa media_stat
|
||||
arguments specify helper functions which will be invoked by the
|
||||
.Vt ifmedia
|
||||
framework when the user changes or queries media options,
|
||||
using a command such as
|
||||
.Xr ifconfig 8 .
|
||||
.Vt iv_htcaps .
|
||||
The following general capabilities are defined:
|
||||
.Bl -tag -width IEEE80211_C_8023ENCAP
|
||||
.It Dv IEEE80211_C_STA
|
||||
Device is capable of operating in station (aka Infrastructure) mode.
|
||||
.It Dv IEEE80211_C_8023ENCAP
|
||||
Device requires 802.3-encapsulated frames be passed for transmit.
|
||||
By default
|
||||
.Nm
|
||||
will encapsulate all outbound frames as 802.11 frames (without a PLCP header).
|
||||
.It Dv IEEE80211_C_FF
|
||||
Device supports Atheros Fast-Frames.
|
||||
.It Dv IEEE80211_C_TURBOP
|
||||
Device supports Atheros Dynamic Turbo mode.
|
||||
.It Dv IEEE80211_C_IBSS
|
||||
Device is capable of operating in adhoc/IBSS mode.
|
||||
.It Dv IEEE80211_C_PMGT
|
||||
Device supports dynamic power-management (aka power save) in station mode.
|
||||
.It Dv IEEE80211_C_HOSTAP
|
||||
Device is capable of operating as an Access Point in Infrastructure mode.
|
||||
.It Dv IEEE80211_C_AHDEMO
|
||||
Device is capable of operating in Adhoc Demo mode.
|
||||
In this mode the device is used purely to send/receive raw 802.11 frames.
|
||||
.It Dv IEEE80211_C_SWRETRY
|
||||
Device supports software retry of transmitted frames.
|
||||
.It Dv IEEE80211_C_TXPMGT
|
||||
Device support dynamic transmit power changes on transmitted frames;
|
||||
also known as Transmit Power Control (TPC).
|
||||
.It Dv IEEE80211_C_SHSLOT
|
||||
Device supports short slot time operation (for 802.11g).
|
||||
.It Dv IEEE80211_C_SHPREAMBLE
|
||||
Device supports short preamble operation (for 802.11g).
|
||||
.It Dv IEEE80211_C_MONITOR
|
||||
Device is capable of operating in monitor mode.
|
||||
.It Dv IEEE80211_C_DFS
|
||||
Device supports radar detection and/or DFS.
|
||||
DFS protocol support can be handled by
|
||||
.Nm
|
||||
but the device must be capable of detecting radar events.
|
||||
.It Dv IEEE80211_C_MBSS
|
||||
Device is capable of operating in MeshBSS (MBSS) mode
|
||||
(as defined by 802.11s Draft 3.0).
|
||||
.It Dv IEEE80211_C_WPA1
|
||||
Device supports WPA1 operation.
|
||||
.It Dv IEEE80211_C_WPA2
|
||||
Device supports WPA2/802.11i operation.
|
||||
.It Dv IEEE80211_C_BURST
|
||||
Device supports frame bursting.
|
||||
.It Dv IEEE80211_C_WME
|
||||
Device supports WME/WMM operation
|
||||
(at the moment this is mostly support for sending and receiving
|
||||
QoS frames with EDCF).
|
||||
.It Dv IEEE80211_C_WDS
|
||||
Device supports transmit/receive of 4-address frames.
|
||||
.It Dv IEEE80211_C_BGSCAN
|
||||
Device supports background scanning.
|
||||
.It Dv IEEE80211_C_TXFRAG
|
||||
Device supports transmit of fragmented 802.11 frames.
|
||||
.It Dv IEEE80211_C_TDMA
|
||||
Device is capable of operating in TDMA mode.
|
||||
.El
|
||||
.Pp
|
||||
.\"
|
||||
The
|
||||
.Fn ieee80211_media_status
|
||||
and
|
||||
.Fn ieee80211_media_change
|
||||
functions are device-independent handlers for
|
||||
.Vt ifmedia
|
||||
commands and are not intended to be called directly.
|
||||
The follow general crypto capabilities are defined.
|
||||
In general
|
||||
.Nm
|
||||
will fall-back to software support when a device is not capable
|
||||
of hardware acceleration of a cipher.
|
||||
This can be done on a per-key basis.
|
||||
.Nm
|
||||
can also handle software
|
||||
.Dv Michael
|
||||
calculation combined with hardware
|
||||
.Dv AES
|
||||
acceleration.
|
||||
.Bl -tag -width IEEE80211_C_8023ENCAP
|
||||
.It Dv IEEE80211_CRYPTO_WEP
|
||||
Device supports hardware WEP cipher.
|
||||
.It Dv IEEE80211_CRYPTO_TKIP
|
||||
Device supports hardware TKIP cipher.
|
||||
.It Dv IEEE80211_CRYPTO_AES_OCB
|
||||
Device supports hardware AES-OCB cipher.
|
||||
.It Dv IEEE80211_CRYPTO_AES_CCM
|
||||
Device supports hardware AES-CCM cipher.
|
||||
.It Dv IEEE80211_CRYPTO_TKIPMIC
|
||||
Device supports hardware Michael for use with TKIP.
|
||||
.It Dv IEEE80211_CRYPTO_CKIP
|
||||
Devices supports hardware CKIP cipher.
|
||||
.El
|
||||
.Pp
|
||||
.\"
|
||||
The
|
||||
.Fn ieee80211_watchdog
|
||||
function is intended to be called from a driver's
|
||||
.Va if_watchdog
|
||||
routine.
|
||||
It is used to perform periodic cleanup of state within the software 802.11
|
||||
stack, as well as timing out scans.
|
||||
.Pp
|
||||
.\"
|
||||
The
|
||||
.Fn ieee80211_setmode
|
||||
function is called from within the 802.11 stack to change the mode
|
||||
of the driver's PHY; it is not intended to be called directly.
|
||||
.Pp
|
||||
.\"
|
||||
The
|
||||
.Fn ieee80211_chan2mode
|
||||
function returns the PHY mode required for use with the channel
|
||||
.Fa chan
|
||||
on the device
|
||||
.Fa ic .
|
||||
This is typically used when selecting a rate set, to be advertised in
|
||||
beacons, for example.
|
||||
.Pp
|
||||
.\"
|
||||
The
|
||||
.Fn ieee80211_rate2media
|
||||
function converts the bit rate
|
||||
.Fa rate
|
||||
(measured in units of 0.5Mbps) to an
|
||||
.Vt ifmedia
|
||||
sub-type, for the device
|
||||
.Fa ic
|
||||
running in PHY mode
|
||||
.Fa mode .
|
||||
The
|
||||
.Fn ieee80211_media2rate
|
||||
performs the reverse of this conversion, returning the bit rate (in 0.5Mbps
|
||||
units) corresponding to an
|
||||
.Vt ifmedia
|
||||
sub-type.
|
||||
.\"
|
||||
The follow general 802.11n capabilities are defined.
|
||||
The first capabilities are defined exactly as they appear in the
|
||||
802.11n specification.
|
||||
Capabilities beginning with IEEE80211_HTC_AMPDU are used soley by the
|
||||
.Nm
|
||||
layer.
|
||||
.Bl -tag -width IEEE80211_C_8023ENCAP
|
||||
.It Dv IEEE80211_HTCAP_CHWIDTH40
|
||||
Device supports 20/40 channel width operation.
|
||||
.It Dv IEEE80211_HTCAP_SMPS_DYNAMIC
|
||||
Device supports dynamic SM power save operation.
|
||||
.It Dv IEEE80211_HTCAP_SMPS_ENA
|
||||
Device supports static SM power save operation.
|
||||
.It Dv IEEE80211_HTCAP_GREENFIELD
|
||||
Device supports Greenfield preamble.
|
||||
.It Dv IEEE80211_HTCAP_SHORTGI20
|
||||
Device supports Short Guard Interval on 20MHz channels.
|
||||
.It Dv IEEE80211_HTCAP_SHORTGI40
|
||||
Device supports Short Guard Interval on 40MHz channels.
|
||||
.It Dv IEEE80211_HTCAP_TXSTBC
|
||||
Device supports Space Time Block Convolution (STBC) for transmit.
|
||||
.It Dv IEEE80211_HTCAP_RXSTBC_1STREAM
|
||||
Device supports 1 spatial stream for STBC receive.
|
||||
.It Dv IEEE80211_HTCAP_RXSTBC_2STREAM
|
||||
Device supports 1-2 spatial streams for STBC receive.
|
||||
.It Dv IEEE80211_HTCAP_RXSTBC_3STREAM
|
||||
Device supports 1-3 spatial streams for STBC receive.
|
||||
.It Dv IEEE80211_HTCAP_MAXAMSDU_7935
|
||||
Device supports A-MSDU frames up to 7935 octets.
|
||||
.It Dv IEEE80211_HTCAP_MAXAMSDU_3839
|
||||
Device supports A-MSDU frames up to 3839 octets.
|
||||
.It Dv IEEE80211_HTCAP_DSSSCCK40
|
||||
Device supports use of DSSS/CCK on 40MHz channels.
|
||||
.It Dv IEEE80211_HTCAP_PSMP
|
||||
Device supports PSMP.
|
||||
.It Dv IEEE80211_HTCAP_40INTOLERANT
|
||||
Device is intolerant of 40MHz wide channel use.
|
||||
.It Dv IEEE80211_HTCAP_LSIGTXOPPROT
|
||||
Device supports L-SIG TXOP protection.
|
||||
.It Dv IEEE80211_HTC_AMPDU
|
||||
Device supports A-MPDU aggregation.
|
||||
Note that any 802.11n compliant device must support A-MPDU receive
|
||||
so this implicitly means support for
|
||||
.Em transmit
|
||||
of A-MPDU frames.
|
||||
.It Dv IEEE80211_HTC_AMSDU
|
||||
Device supports A-MSDU aggregation.
|
||||
Note that any 802.11n compliant device must support A-MSDU receive
|
||||
so this implicitly means support for
|
||||
.Em transmit
|
||||
of A-MSDU frames.
|
||||
.It Dv IEEE80211_HTC_HT
|
||||
Device supports High Throughput (HT) operation.
|
||||
This capability must be set to enable 802.11n functionality
|
||||
in
|
||||
.Nm .
|
||||
.It Dv IEEE80211_HTC_SMPS
|
||||
Device supports MIMO Power Save operation.
|
||||
.It Dv IEEE80211_HTC_RIFS
|
||||
Device supports Reduced Inter Frame Spacing (RIFS).
|
||||
.El
|
||||
.Sh SEE ALSO
|
||||
.Xr ieee80211_crypto 9 ,
|
||||
.Xr ioctl 2 ,
|
||||
.Xr ndis 4 ,
|
||||
.Xr ieee80211_input 9 ,
|
||||
.Xr ieee80211_ioctl 9 ,
|
||||
.Xr ieee80211_node 9 ,
|
||||
.Xr ieee80211_output 9 ,
|
||||
.Xr ieee80211_proto 9 ,
|
||||
.Xr ieee80211_radiotap 9 ,
|
||||
.Xr ifnet 9
|
||||
.Sh HISTORY
|
||||
The
|
||||
.Nm ieee80211
|
||||
series of functions first appeared in
|
||||
.Nx 1.5 ,
|
||||
and were later ported to
|
||||
.Fx 4.6 .
|
||||
.Sh AUTHORS
|
||||
.An -nosplit
|
||||
This manual page was written by
|
||||
.An Bruce M. Simpson Aq bms@FreeBSD.org
|
||||
and
|
||||
.An Darron Broad Aq darron@kewl.org .
|
||||
.Xr ieee80211_input_all 9 ,
|
||||
.Xr ieee80211_scan_next 9 ,
|
||||
.Xr ieee80211_recv_action 9 ,
|
||||
.Xr ieee80211_send_action 9 ,
|
||||
.Xr ieee80211_radiotap_attach 9 ,
|
||||
.Xr ifnet 9 ,
|
||||
.Xr malloc 9 .
|
||||
|
194
share/man/man9/ieee80211_amrr.9
Normal file
194
share/man/man9/ieee80211_amrr.9
Normal file
@ -0,0 +1,194 @@
|
||||
.\"
|
||||
.\" Copyright (c) 2009 Sam Leffler, Errno Consulting
|
||||
.\" All rights reserved.
|
||||
.\"
|
||||
.\" Redistribution and use in source and binary forms, with or without
|
||||
.\" modification, are permitted provided that the following conditions
|
||||
.\" are met:
|
||||
.\" 1. Redistributions of source code must retain the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer.
|
||||
.\" 2. Redistributions in binary form must reproduce the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer in the
|
||||
.\" documentation and/or other materials provided with the distribution.
|
||||
.\"
|
||||
.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
.\" SUCH DAMAGE.
|
||||
.\"
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd August 4, 2009
|
||||
.Dt IEEE8021_AMRR 9
|
||||
.Os
|
||||
.Sh NAME
|
||||
.Nm ieee80211_amrr
|
||||
.Nd 802.11 network driver transmit rate control support
|
||||
.Sh SYNOPSIS
|
||||
.In net80211/ieee80211_amrr.h
|
||||
.Ft void
|
||||
.Fo ieee80211_amrr_init
|
||||
.Fa "struct ieee80211_amrr *"
|
||||
.Fa "struct ieee80211vap *"
|
||||
.Fa "int amin"
|
||||
.Fa "int amax"
|
||||
.Fa "int interval"
|
||||
.Fc
|
||||
.\"
|
||||
.Ft void
|
||||
.Fn ieee80211_amrr_cleanup "struct ieee80211_amrr *"
|
||||
.\"
|
||||
.Ft void
|
||||
.Fn ieee80211_amrr_setinterval "struct ieee80211_amrr *" "int interval"
|
||||
.\"
|
||||
.Ft void
|
||||
.Fo ieee80211_amrr_node_init
|
||||
.Fa "struct ieee80211_amrr *"
|
||||
.Fa "struct ieee80211_amrr_node *"
|
||||
.Fa "struct ieee80211_node *"
|
||||
.Fc
|
||||
.\"
|
||||
.Ft int
|
||||
.Fo ieee80211_amrr_choose
|
||||
.Fa "struct ieee80211_node *"
|
||||
.Fa "struct ieee80211_amrr_node *"
|
||||
.Fc
|
||||
.\"
|
||||
.Ft void
|
||||
.Fo ieee80211_amrr_tx_complete
|
||||
.Fa "struct ieee80211_amrr_node *"
|
||||
.Fa "int ok"
|
||||
.Fa "int retries"
|
||||
.Fc
|
||||
.\"
|
||||
.Ft void
|
||||
.Fo ieee80211_amrr_tx_update
|
||||
.Fa "struct ieee80211_amrr_node *"
|
||||
.Fa "int txnct"
|
||||
.Fa "int success"
|
||||
.Fa "int retrycnt"
|
||||
.Fc
|
||||
.Sh DESCRIPTION
|
||||
.Nm
|
||||
is an implementation of the AMRR transmit rate control algorithm
|
||||
for drivers that use the
|
||||
.Nm net80211
|
||||
software layer.
|
||||
A rate control algorithm is responsible for choosing the transmit
|
||||
rate for each frame.
|
||||
To maximize throughput algorithms try to use the highest rate that
|
||||
is appropriate for the operating conditions.
|
||||
The rate will vary as conditions change; the distance between two stations
|
||||
may change, transient noise may be present that affects signal quality,
|
||||
etc.
|
||||
.Nm
|
||||
uses very simple information from a driver to do it's job:
|
||||
whether a frame was successfully delivered and how many transmit
|
||||
attempts were made.
|
||||
While this enables its use with virtually any wireless device it
|
||||
limits it's effectiveness--do not expect it to function well in
|
||||
difficult environments and/or respond quickly to changing conditions.
|
||||
.Pp
|
||||
.Nm
|
||||
requires per-vap state and per-node state for each station it is to
|
||||
select rates for.
|
||||
The API's are designed for drivers to pre-allocate state in the
|
||||
driver-private extension areas of each vap and node.
|
||||
For example the
|
||||
.Xr ral 4
|
||||
driver defines a vap as:
|
||||
.Bd -literal -offset indent
|
||||
struct rt2560_vap {
|
||||
struct ieee80211vap ral_vap;
|
||||
struct ieee80211_beacon_offsets ral_bo;
|
||||
struct ieee80211_amrr amrr;
|
||||
|
||||
int (*ral_newstate)(struct ieee80211vap *,
|
||||
enum ieee80211_state, int);
|
||||
};
|
||||
.Ed
|
||||
.Pp
|
||||
The
|
||||
.Vt amrr
|
||||
structure member holds the per-vap state for
|
||||
.Nm
|
||||
and
|
||||
.Xr ral 4
|
||||
initializes it in the vap create method with:
|
||||
.Bd -literal -offset indent
|
||||
ieee80211_amrr_init(&rvp->amrr, vap,
|
||||
IEEE80211_AMRR_MIN_SUCCESS_THRESHOLD,
|
||||
IEEE80211_AMRR_MAX_SUCCESS_THRESHOLD,
|
||||
500 /* ms */);
|
||||
.Ed
|
||||
.Pp
|
||||
The node is defined as:
|
||||
.Bd -literal -offset indent
|
||||
struct rt2560_node {
|
||||
struct ieee80211_node ni;
|
||||
struct ieee80211_amrr_node amrr;
|
||||
};
|
||||
.Ed
|
||||
.Pp
|
||||
with initialization done in the driver's
|
||||
.Vt iv_newassoc
|
||||
method:
|
||||
.Bd -literal -offset indent
|
||||
static void
|
||||
rt2560_newassoc(struct ieee80211_node *ni, int isnew)
|
||||
{
|
||||
struct ieee80211vap *vap = ni->ni_vap;
|
||||
|
||||
ieee80211_amrr_node_init(&RT2560_VAP(vap)->amrr,
|
||||
&RT2560_NODE(ni)->amrr, ni);
|
||||
}
|
||||
.Ed
|
||||
.Pp
|
||||
Once
|
||||
.Nm
|
||||
state is setup, transmit rates are requested by calling
|
||||
.Fn ieee80211_amrr_choose
|
||||
in the transmit path; e.g.:
|
||||
.Bd -literal -offset indent
|
||||
tp = &vap->iv_txparms[ieee80211_chan2mode(ni->ni_chan)];
|
||||
if (IEEE80211_IS_MULTICAST(wh->i_addr1)) {
|
||||
rate = tp->mcastrate;
|
||||
} else if (m0->m_flags & M_EAPOL) {
|
||||
rate = tp->mgmtrate;
|
||||
} else if (tp->ucastrate != IEEE80211_FIXED_RATE_NONE) {
|
||||
rate = tp->ucastrate;
|
||||
} else {
|
||||
(void) ieee80211_amrr_choose(ni, &RT2560_NODE(ni)->amrr);
|
||||
rate = ni->ni_txrate;
|
||||
}
|
||||
.Ed
|
||||
.Pp
|
||||
Note a rate is chosen only for unicast data frames when a fixed
|
||||
transmit rate is not configured; the other cases are handled with
|
||||
the
|
||||
.Nm net80211
|
||||
transmit parameters.
|
||||
Note also that
|
||||
.Fn ieee80211_amrr_choose
|
||||
writes the chosen rate in
|
||||
.Vt ni_txrate ;
|
||||
this eliminates copying the value as it is exported to user applications so
|
||||
they can display the current transmit rate in status.
|
||||
.Pp
|
||||
The remaining work a driver must do is feed status back to
|
||||
.Nm
|
||||
when a frame transmit completes using
|
||||
.Fn ieee80211_amrr_tx_complete .
|
||||
Drivers that poll a device to retrieve statistics can use
|
||||
.Fn ieee80211_amrr_tx_update
|
||||
(instead or in addition).
|
||||
.Sh SEE ALSO
|
||||
.Xr ieee80211 9 ,
|
||||
.Xr ieee80211_output 9 ,
|
115
share/man/man9/ieee80211_beacon.9
Normal file
115
share/man/man9/ieee80211_beacon.9
Normal file
@ -0,0 +1,115 @@
|
||||
.\"
|
||||
.\" Copyright (c) 2009 Sam Leffler, Errno Consulting
|
||||
.\" All rights reserved.
|
||||
.\"
|
||||
.\" Redistribution and use in source and binary forms, with or without
|
||||
.\" modification, are permitted provided that the following conditions
|
||||
.\" are met:
|
||||
.\" 1. Redistributions of source code must retain the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer.
|
||||
.\" 2. Redistributions in binary form must reproduce the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer in the
|
||||
.\" documentation and/or other materials provided with the distribution.
|
||||
.\"
|
||||
.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
.\" SUCH DAMAGE.
|
||||
.\"
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd August 4, 2009
|
||||
.Dt IEEE80211_BEACON 9
|
||||
.Os
|
||||
.Sh NAME
|
||||
.Nm ieee80211_beacon
|
||||
.Nd 802.11 beacon support
|
||||
.Sh SYNOPSIS
|
||||
.In net80211/ieee80211_var.h
|
||||
.Pp
|
||||
.Ft "struct mbuf *"
|
||||
.Fo ieee80211_beacon_alloc
|
||||
.Fa "struct ieee80211_node *"
|
||||
.Fa "struct ieee80211_beacon_offsets *"
|
||||
.Fc
|
||||
.\"
|
||||
.Ft int
|
||||
.Fo ieee80211_beacon_update
|
||||
.Fa "struct ieee80211_node *"
|
||||
.Fa "struct ieee80211_beacon_offsets *"
|
||||
.Fa "struct mbuf *"
|
||||
.Fa "int mcast"
|
||||
.Fc
|
||||
.\"
|
||||
.Ft void
|
||||
.Fn ieee80211_beacon_notify "struct ieee80211vap *" "int what"
|
||||
.Sh DESCRIPTION
|
||||
The
|
||||
.Nm net80211
|
||||
software layer provides a support framework for drivers that includes
|
||||
a template-based mechanism for dynamic update of beacon frames transmit
|
||||
in hostap, adhoc, and mesh operating modes.
|
||||
Drivers should use
|
||||
.Fn ieee80211_beacon_alloc
|
||||
to create an initial beacon frame.
|
||||
The
|
||||
.Vt ieee80211_beacon_offsets
|
||||
structure holds information about the beacon contents that is used
|
||||
to optimize updates done with
|
||||
.Fn ieee80211_beacon_update .
|
||||
.Pp
|
||||
Update calls should only be done when something changes that
|
||||
affects the contents of the beacon frame.
|
||||
When this happens the
|
||||
.Dv iv_update_beacon
|
||||
method is invoked and a driver-supplied routine must do the right thing.
|
||||
For devices that involve the host to transmit each
|
||||
beacon frame this work may be as simple as marking a bit in the
|
||||
.Vt ieee80211_beacon_offsets
|
||||
structure:
|
||||
.Bd -literal
|
||||
static void
|
||||
ath_beacon_update(struct ieee80211vap *vap, int item)
|
||||
{
|
||||
struct ieee80211_beacon_offsets *bo = &ATH_VAP(vap)->av_boff;
|
||||
setbit(bo->bo_flags, item);
|
||||
}
|
||||
.Ed
|
||||
.Pp
|
||||
with the
|
||||
.Fn ieee80211_beacon_update
|
||||
call done before the next beacon is to be sent.
|
||||
.Pp
|
||||
Devices that off-load beacon generation may instead choose to use
|
||||
this callback to push updates immediately to the device.
|
||||
Exactly how that is accomplished is unspecified.
|
||||
One possibility is to update the beacon frame contents and extract
|
||||
the appropriate information element, but other scenarios are possible.
|
||||
.Sh MULTI-VAP BEACON SCHEDULING
|
||||
Drivers that support multiple vaps that can each beacon need to consider
|
||||
how to schedule beacon frames.
|
||||
There are two possibilities at the moment:
|
||||
.Em burst
|
||||
all beacons at TBTT or
|
||||
.Em stagger beacons
|
||||
over the beacon interval.
|
||||
Bursting beacon frames may result in aperiodic delivery that can affect
|
||||
power save operation of associated stations.
|
||||
Applying some jitter (e.g. by randomly ordering burst frames) may be
|
||||
sufficient to combat this and typically this is not an issue unless
|
||||
stations are using aggressive power save techniques
|
||||
such as U-APSD (sometimes employed by VoIP phones).
|
||||
Staggering frames requires more interrupts and device support that
|
||||
may not be available.
|
||||
Staggering beacon frames is usually superior to bursting frames, up to
|
||||
about eight vaps, at which point the overhead becomes significant and
|
||||
the channel becomes noticeably busy anyway.
|
||||
.Sh SEE ALSO
|
||||
.Xr ieee80211 9 .
|
91
share/man/man9/ieee80211_bmiss.9
Normal file
91
share/man/man9/ieee80211_bmiss.9
Normal file
@ -0,0 +1,91 @@
|
||||
.\"
|
||||
.\" Copyright (c) 2009 Sam Leffler, Errno Consulting
|
||||
.\" All rights reserved.
|
||||
.\"
|
||||
.\" Redistribution and use in source and binary forms, with or without
|
||||
.\" modification, are permitted provided that the following conditions
|
||||
.\" are met:
|
||||
.\" 1. Redistributions of source code must retain the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer.
|
||||
.\" 2. Redistributions in binary form must reproduce the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer in the
|
||||
.\" documentation and/or other materials provided with the distribution.
|
||||
.\"
|
||||
.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
.\" SUCH DAMAGE.
|
||||
.\"
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd August 4, 2009
|
||||
.Dt IEEE80211_BMISS 9
|
||||
.Os
|
||||
.Sh NAME
|
||||
.Nm ieee80211_bmiss
|
||||
.Nd 802.11 beacon miss support
|
||||
.Sh SYNOPSIS
|
||||
.In net80211/ieee80211_var.h
|
||||
.Pp
|
||||
.Ft void
|
||||
.Fn ieee80211_beacon_miss "struct ieee80211com *"
|
||||
.Sh DESCRIPTION
|
||||
The
|
||||
.Nm net80211
|
||||
software layer provides a support framework for drivers that includes
|
||||
handling beacon miss events in station mode.
|
||||
Drivers can dispatch beacon miss events that are recognized in hardware or
|
||||
.Nm net80211
|
||||
can detect beacon miss if the driver dispatches received beacon frames
|
||||
through the normal receive path.
|
||||
Software beacon miss support is especially useful when multiple vaps
|
||||
are operating and any hardware beacon miss support is not available
|
||||
(e.g. operating as an access point together with one or more station
|
||||
mode vaps).
|
||||
.Pp
|
||||
Drivers should dispatch beacon miss events recognized in the driver with
|
||||
.Fn ieee80211_beacon_miss .
|
||||
This causes some number of ProbeRequest frames to be sent to the
|
||||
access point to check if the association is still alive.
|
||||
If no response is received and roaming mode is set to
|
||||
.Dv IEEE80211_ROAMING_AUTO
|
||||
then
|
||||
.Nm net80211
|
||||
will try to re-associate and if that fails
|
||||
trigger a scan to look for the access point or another suitable AP.
|
||||
When the
|
||||
.Nm net80211
|
||||
state machine is being operated manually, e.g. by
|
||||
.Xr wpa_supplicant 8 ,
|
||||
then applications are notified of the state change and are responsible
|
||||
for handling the work of scanning for a new access point.
|
||||
The number of beacon miss events (without a ProbeResponse) is user
|
||||
settable with the
|
||||
.Dv IEEE80211_IOC_BMISSTHRESHOLD
|
||||
request.
|
||||
.Pp
|
||||
Software beacon miss detection is enabled per-vap by setting the
|
||||
.Dv IEEE80211_FEXT_SWBMISS
|
||||
flag.
|
||||
Typically this is done when a vap is setup
|
||||
when the
|
||||
.Dv IEEE80211_CLONE_NOBEACONS
|
||||
option is supplied to the clone operation.
|
||||
But drivers may also force this when they know they need help detecting
|
||||
beacon miss.
|
||||
When beacon miss is detected in software the event is dispatched without
|
||||
driver involvement.
|
||||
Note that software beacon miss handling is not limited to station mode;
|
||||
it can be used in any operating mode where beacons from a peer station
|
||||
are received.
|
||||
.Sh SEE ALSO
|
||||
.Xr ieee80211 9 ,
|
||||
.Xr ieee80211_vap 9 ,
|
||||
.Xr wpa_supplicant 8 ,
|
@ -27,76 +27,233 @@
|
||||
.\" $FreeBSD$
|
||||
.\" $Id: ieee80211_crypto.9,v 1.3 2004/03/04 10:42:56 bruce Exp $
|
||||
.\"
|
||||
.Dd March 2, 2004
|
||||
.Dd August 4, 2009
|
||||
.Dt IEEE80211_CRYPTO 9
|
||||
.Os
|
||||
.Sh NAME
|
||||
.Nm ieee80211_crypto_attach , ieee80211_crypto_detach , ieee80211_wep_crypt
|
||||
.Nd 802.11 WEP encryption functions
|
||||
.Nm ieee80211_crypto
|
||||
.Nd 802.11 cryptographic support
|
||||
.Sh SYNOPSIS
|
||||
.In net80211/ieee80211_var.h
|
||||
.\"
|
||||
.Pp
|
||||
.Ft void
|
||||
.Fn ieee80211_crypto_attach "struct ifnet *ifp"
|
||||
.Fn ieee80211_crypto_register "const struct ieee80211_cipher *"
|
||||
.\"
|
||||
.Ft void
|
||||
.Fn ieee80211_crypto_detach "struct ifnet *ifp"
|
||||
.Ft struct mbuf *
|
||||
.Fn ieee80211_wep_crypt "struct ifnet *ifp" "struct mbuf *m0" "int txflag"
|
||||
.Fn ieee80211_crypto_unregister "const struct ieee80211_cipher *"
|
||||
.\"
|
||||
.Ft int
|
||||
.Fn ieee80211_crypto_available "int cipher"
|
||||
.\"
|
||||
.Pp
|
||||
.Ft void
|
||||
.Fo ieee80211_notify_replay_failure
|
||||
.Fa "struct ieee80211vap *"
|
||||
.Fa "const struct ieee80211_frame *"
|
||||
.Fa "const struct ieee80211_key *"
|
||||
.Fa "uint64_t rsc"
|
||||
.Fa "int tid"
|
||||
.Fc
|
||||
.\"
|
||||
.Ft void
|
||||
.Fo ieee80211_notify_michael_failure
|
||||
.Fa "struct ieee80211vap *"
|
||||
.Fa "const struct ieee80211_frame *"
|
||||
.Fa "u_int keyix"
|
||||
.Fc
|
||||
.\"
|
||||
.Ft int
|
||||
.Fo ieee80211_crypto_newkey
|
||||
.Fa "struct ieee80211vap *
|
||||
.Fa "int cipher
|
||||
.Fa "int flags
|
||||
.Fa "struct ieee80211_key *
|
||||
.Fc
|
||||
.\"
|
||||
.Ft int
|
||||
.Fn ieee80211_crypto_setkey "struct ieee80211vap *" "struct ieee80211_key *"
|
||||
.\"
|
||||
.Ft int
|
||||
.Fn ieee80211_crypto_delkey "struct ieee80211vap *" "struct ieee80211_key *"
|
||||
.\"
|
||||
.Ft void
|
||||
.Fn ieee80211_key_update_begin "struct ieee80211vap *"
|
||||
.\"
|
||||
.Ft void
|
||||
.Fn ieee80211_key_update_end "struct ieee80211vap *"
|
||||
.\"
|
||||
.Ft void
|
||||
.Fn ieee80211_crypto_delglobalkeys "struct ieee80211vap *"
|
||||
.\"
|
||||
.Ft void
|
||||
.Fn ieee80211_crypto_reload_keys "struct ieee80211com *"
|
||||
.\"
|
||||
.Pp
|
||||
.Ft struct ieee80211_key *
|
||||
.Fn ieee80211_crypto_encap "struct ieee80211_node *" "struct mbuf *"
|
||||
.\"
|
||||
.Ft struct ieee80211_key *
|
||||
.Fn ieee80211_crypto_decap "struct ieee80211_node *" "struct mbuf *" "int flags"
|
||||
.\"
|
||||
.Ft int
|
||||
.Fo ieee80211_crypto_demic
|
||||
.Fa "struct ieee80211vap *"
|
||||
.Fa "struct ieee80211_key *"
|
||||
.Fa "struct mbuf *"
|
||||
.Fa "int force"
|
||||
.Fc
|
||||
.\"
|
||||
.Ft int
|
||||
.Fo ieee80211_crypto_enmic
|
||||
.Fa "struct ieee80211vap *"
|
||||
.Fa "struct ieee80211_key *"
|
||||
.Fa "struct mbuf *"
|
||||
.Fa "int force"
|
||||
.Fc
|
||||
.Sh DESCRIPTION
|
||||
These functions provide software encryption support
|
||||
for 802.11 device drivers.
|
||||
The
|
||||
.Nm net80211
|
||||
layer includes comprehensive cryptographic support for 802.11 protocols.
|
||||
Software implementations of ciphers required by
|
||||
WPA and 802.11i are provided as well as encap/decap processing of 802.11 frames.
|
||||
Software ciphers are written as kernel modules and
|
||||
register with the core crypto support.
|
||||
The cryptographic framework supports hardware acceleration of ciphers
|
||||
by drivers with automatic fall-back to software implementations when a
|
||||
driver is unable to provide necessary hardware services.
|
||||
.Sh CRYPTO CIPHER MODULES
|
||||
.Nm net80211
|
||||
cipher modules register their services using
|
||||
.Fn ieee80211_crypto_register
|
||||
and supply a template that describes their operation.
|
||||
This
|
||||
.Vt ieee80211_cipher
|
||||
structure defines protocol-related state such as the number of bytes
|
||||
of space in the 802.11 header to reserve/remove during encap/decap
|
||||
and entry points for setting up keys and doing cryptographic operations.
|
||||
.Pp
|
||||
.\"
|
||||
The
|
||||
.Fn ieee80211_crypto_attach
|
||||
function initializes crypto support for the interface
|
||||
.Fa ifp ,
|
||||
and sets the initialization vector (IV) for WEP encryption to
|
||||
a random number derived from a secure PRNG.
|
||||
Cipher modules can associate private state to each key through the
|
||||
.Vt wk_private
|
||||
structure member.
|
||||
If state is setup by the module it will be called before a key is destroyed
|
||||
so it can reclaim resources.
|
||||
.Pp
|
||||
.\"
|
||||
Crypto modules can notify the system of two events.
|
||||
When a packet replay event is recognized
|
||||
.Fn ieee80111_notify_replay_failure
|
||||
can be used to signal the event.
|
||||
When a
|
||||
.Dv TKIP
|
||||
Michael failure is detected
|
||||
.Fn ieee80211_notify_michael_failure
|
||||
can be invoked.
|
||||
Drivers may also use these routines to signal events detected by the
|
||||
hardware.
|
||||
.Sh CRYPTO KEY MANAGEMENT
|
||||
The
|
||||
.Fn ieee80211_crypto_detach
|
||||
function frees data structures associated with crypto support
|
||||
for the interface
|
||||
.Fa ifp .
|
||||
.Nm net80211
|
||||
layer implements a per-vap 4-element
|
||||
.Dq global key table
|
||||
and a per-station
|
||||
.Dq unicast key
|
||||
for protocols such as WPA, 802.1x, and 802.11i.
|
||||
The global key table is designed to support legacy WEP operation
|
||||
and Multicast/Group keys,
|
||||
though some applications also use it to implement WPA in station mode.
|
||||
Keys in the global table are identified by a key index in the range 0-3.
|
||||
Per-station keys are identified by the MAC address of the station and
|
||||
are typically used for unicast PTK bindings.
|
||||
.Pp
|
||||
.\"
|
||||
.Nm net80211
|
||||
provides
|
||||
.Xr ioctl 2
|
||||
operations for managing both global and per-station keys.
|
||||
Drivers typically do not participate in software key management;
|
||||
they are involved only when providing hardware acceleration of
|
||||
cryptographic operations.
|
||||
.Pp
|
||||
.Fn ieee80211_crypto_newkey
|
||||
is used to allocate a new
|
||||
.Nm net80211
|
||||
key or reconfigure an existing key.
|
||||
The cipher must be specified along with any fixed key index.
|
||||
The
|
||||
.Fn ieee80211_wep_crypt
|
||||
function runs the appropriate WEP encryption algorithm over the 802.11
|
||||
encapsulated frame held in the mbuf chain
|
||||
.Fa m0 ,
|
||||
for transmission or reception on the interface
|
||||
.Fa ifp .
|
||||
The
|
||||
.Fa txflag
|
||||
argument specifies whether the frame is being received or transmitted.
|
||||
A value of 0 indicates that the frame is being received and should
|
||||
therefore be decrypted; a non-zero value indicates that the frame
|
||||
is being transmitted
|
||||
and should be encrypted.
|
||||
.\"
|
||||
.Sh IMPLEMENTATION NOTES
|
||||
The
|
||||
.Fn ieee80211_wep_crypt
|
||||
function stores its IV in the interface's embedded
|
||||
.Vt struct ieee80211com
|
||||
instance.
|
||||
.Sh SEE ALSO
|
||||
.Xr awi 4 ,
|
||||
.Xr wi 4 ,
|
||||
.Xr arc4random 9 ,
|
||||
.Xr ieee80211 9 ,
|
||||
.Xr ifnet 9
|
||||
.Sh HISTORY
|
||||
The
|
||||
.Nm ieee80211
|
||||
series of functions first appeared in
|
||||
.Nx 1.5 ,
|
||||
and were later ported to
|
||||
.Fx 4.6 .
|
||||
.Sh AUTHORS
|
||||
.An -nosplit
|
||||
This manual page was written by
|
||||
.An Bruce M. Simpson Aq bms@FreeBSD.org
|
||||
.Nm net80211
|
||||
layer will handle allocating cipher and driver resources to support the key.
|
||||
.Pp
|
||||
Once a key is allocated it's contents can be set using
|
||||
.Fn ieee80211_crypto_setkey
|
||||
and deleted with
|
||||
.Fn ieee80211_crypto_delkey
|
||||
(with any cipher and driver resources reclaimed).
|
||||
.Pp
|
||||
.Fn ieee80211_crypto_delglobalkeys
|
||||
is used to reclaim all keys in the global key table for a vap; it
|
||||
typically is used only within the
|
||||
.Nm net80211
|
||||
layer.
|
||||
.Pp
|
||||
.Fn ieee80211_crypto_reload_keys
|
||||
handles hardware key state reloading from software key state, such
|
||||
as required after a suspend/resume cycle.
|
||||
.Sh DRIVER CRYPTO SUPPORT
|
||||
Drivers identify ciphers they have hardware support for through the
|
||||
.Vt ic_cryptocaps
|
||||
field of the
|
||||
.Vt ieee80211com
|
||||
structure.
|
||||
If hardware support is available then a driver should also fill in the
|
||||
.Dv iv_key_alloc ,
|
||||
.Dv iv_key_set ,
|
||||
and
|
||||
.An Darron Broad Aq darron@kewl.org .
|
||||
.Dv iv_key_delete
|
||||
methods of each
|
||||
.Vt ieee80211vap
|
||||
created for use with the device.
|
||||
In addition the methods
|
||||
.Dv iv_key_update_begin
|
||||
and
|
||||
.Dv iv_key_update_end
|
||||
can be setup to handle synchronization requirements
|
||||
for updating hardware key state.
|
||||
.Pp
|
||||
When
|
||||
.Nm net80211
|
||||
allocates a software key and the driver can accelerate the
|
||||
cipher operations the
|
||||
.Dv iv_key_alloc
|
||||
method will be invoked.
|
||||
Drivers may return a token that is associated with outbound traffic
|
||||
(for use in encrypting frames).
|
||||
Otherwise, e.g. if hardware resources are not available, the driver will
|
||||
not return a token and
|
||||
.Nm net80211
|
||||
will arrange to do the work in software and pass frames
|
||||
to the driver that are already prepared for transmission.
|
||||
.Pp
|
||||
For receive, drivers mark frames with the
|
||||
.Dv M_WEP
|
||||
mbuf flag to indicate the hardware has decrypted the payload.
|
||||
If frames have the
|
||||
.Dv IEEE80211_FC1_WEP
|
||||
bit marked in their 802.11 header and are not tagged with
|
||||
.Dv M_WEP
|
||||
then decryption is done in software.
|
||||
For more complicated scenarios the software key state is consulted; e.g.
|
||||
to decide if Michael verification needs to be done in software after
|
||||
the hardware has handled TKIP decryption.
|
||||
.Pp
|
||||
Drivers that manage complicated key data structures, e.g. faulting
|
||||
software keys into a hardware key cache, can safely manipulate software
|
||||
key state by bracketing their work with calls to
|
||||
.Fn ieee80211_key_update_begin
|
||||
and
|
||||
.Fn ieee80211_key_update_end .
|
||||
These calls also synchronize hardware key state update
|
||||
when receive traffic is active.
|
||||
.Sh SEE ALSO
|
||||
.Xr ioctl 2 ,
|
||||
.Xr wlan_ccmp 4 ,
|
||||
.Xr wlan_tkip 4 ,
|
||||
.Xr wlan_wep 4 .
|
||||
|
72
share/man/man9/ieee80211_ddb.9
Normal file
72
share/man/man9/ieee80211_ddb.9
Normal file
@ -0,0 +1,72 @@
|
||||
.\"
|
||||
.\" Copyright (c) 2009 Sam Leffler, Errno Consulting
|
||||
.\" All rights reserved.
|
||||
.\"
|
||||
.\" Redistribution and use in source and binary forms, with or without
|
||||
.\" modification, are permitted provided that the following conditions
|
||||
.\" are met:
|
||||
.\" 1. Redistributions of source code must retain the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer.
|
||||
.\" 2. Redistributions in binary form must reproduce the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer in the
|
||||
.\" documentation and/or other materials provided with the distribution.
|
||||
.\"
|
||||
.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
.\" SUCH DAMAGE.
|
||||
.\"
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd August 4, 2009
|
||||
.Dt IEEE80211_DDB 9
|
||||
.Os
|
||||
.Sh NAME
|
||||
.Nm ieee80211_ddb
|
||||
.Nd 802.11 ddb support
|
||||
.Sh SYNOPSIS
|
||||
.Bd -ragged
|
||||
.Cd options DDB
|
||||
.Ed
|
||||
.Pp
|
||||
.Bd -ragged
|
||||
.Cd show vap [addr]
|
||||
.Cd show all vaps
|
||||
.Cd show com [addr]
|
||||
.Cd show sta [addr]
|
||||
.Cd show statab [addr]
|
||||
.Cd show mesh [addr]
|
||||
.Ed
|
||||
.Sh DESCRIPTION
|
||||
The
|
||||
.Nm net80211
|
||||
layer includes
|
||||
.Xr ddb 4
|
||||
support for displaying important data structures.
|
||||
This is especially important because wireless applications are often
|
||||
built for embedded environments where cross-machine or post-mortem
|
||||
debugging facilities like
|
||||
.Xr kgdb 1
|
||||
infeasible.
|
||||
.Pp
|
||||
The most commonly used command is
|
||||
.Bd -literal -offset indent
|
||||
show all vaps/a
|
||||
.Ed
|
||||
.Pp
|
||||
which dumps the contents of all
|
||||
.Vt ieee80211vap ,
|
||||
.Vt ieee80211com ,
|
||||
and
|
||||
.Vt ieee80211_node
|
||||
data structures in the system.
|
||||
.Sh SEE ALSO
|
||||
.Xr ddb 4 ,
|
||||
.Xr ieee80211 9 .
|
@ -25,89 +25,92 @@
|
||||
.\" SUCH DAMAGE.
|
||||
.\"
|
||||
.\" $FreeBSD$
|
||||
.\" $Id: ieee80211_input.9,v 1.6 2004/03/04 12:33:27 bruce Exp $
|
||||
.\"
|
||||
.Dd March 2, 2004
|
||||
.Dd August 4, 2009
|
||||
.Dt IEEE80211_INPUT 9
|
||||
.Os
|
||||
.Sh NAME
|
||||
.Nm ieee80211_input , ieee80211_decap , ieee80211_recv_mgmt
|
||||
.Nm ieee80211_input
|
||||
.Nd software 802.11 stack input functions
|
||||
.Sh SYNOPSIS
|
||||
.In net80211/ieee80211_var.h
|
||||
.In net80211/ieee80211_proto.h
|
||||
.Ft void
|
||||
.Fo ieee80211_input
|
||||
.Fa "struct ifnet *ifp" "struct mbuf *m" "struct ieee80211_node *ni"
|
||||
.Fa "int rssi" "u_int32_t rstamp"
|
||||
.Fa "struct ieee80211_node *"
|
||||
.Fa "struct mbuf *"
|
||||
.Fa "int rssi"
|
||||
.Fa "int noise"
|
||||
.Fc
|
||||
.Ft struct mbuf *
|
||||
.Fn ieee80211_decap "struct ifnet *ifp" "struct mbuf *m"
|
||||
.Ft void
|
||||
.Fo ieee80211_recv_mgmt
|
||||
.Fa "struct ieee80211com *ic" "struct mbuf *m0" "struct ieee80211_node *ni"
|
||||
.Fa "int subtype" "int rssi" "u_int32_t rstamp"
|
||||
.Fo ieee80211_input_all
|
||||
.Fa "struct ieee80211com *"
|
||||
.Fa "struct mbuf *"
|
||||
.Fa "int rssi"
|
||||
.Fa "int noise"
|
||||
.Fc
|
||||
.Sh DESCRIPTION
|
||||
These
|
||||
functions process received 802.11 frames.
|
||||
.Pp
|
||||
.\"
|
||||
The
|
||||
.Nm net80211
|
||||
layer that supports 802.11 device drivers requires that
|
||||
receive processing be single-threaded.
|
||||
Typically this is done using a dedicated driver
|
||||
.Xr taskqueue 9
|
||||
thread.
|
||||
.Fn ieee80211_input
|
||||
function takes an mbuf chain
|
||||
.Fa m
|
||||
containing a complete 802.11 frame from the driver
|
||||
.Fa ifp
|
||||
and passes it to the software 802.11 stack for input processing.
|
||||
The
|
||||
.Fa ni
|
||||
argument specifies an instance of
|
||||
.Vt struct ieee80211_node
|
||||
(which may be driver-specific) representing the node from which the
|
||||
frame was received.
|
||||
The arguments
|
||||
.Fa rssi
|
||||
and
|
||||
.Fa stamp
|
||||
are typically derived from on-card data structures; they are used for
|
||||
recording the signal strength and time received of the frame respectively.
|
||||
.Fn ieee80211_input_all
|
||||
process received 802.11 frames and are designed
|
||||
for use in that context; e.g. no driver locks may be held.
|
||||
.Pp
|
||||
.\"
|
||||
The
|
||||
.Fn ieee80211_decap
|
||||
function performs decapsulation of the 802.11 frame in the mbuf chain
|
||||
.Fa m
|
||||
received by the device
|
||||
.Fa ifp ,
|
||||
taking the form of the 802.11 address fields into account;
|
||||
the structure of 802.11 addresses vary according to the intended
|
||||
source and destination of the frame.
|
||||
It is typically called from within
|
||||
.Fn ieee80211_input .
|
||||
The frame passed up in the
|
||||
.Vt mbuf
|
||||
must have the 802.11 protocol header at the front; all device-specific
|
||||
information and/or PLCP must be removed.
|
||||
Any CRC must be stripped from the end of the frame.
|
||||
The 802.11 protocol header should be 32-bit aligned for
|
||||
optimal performance but receive processing does not require it.
|
||||
If the frame holds a payload and that is not aligned to a 32-bit
|
||||
boundary then the payload will be re-aligned so that it is suitable
|
||||
for processing by protocols such as
|
||||
.Xr ip 4 .
|
||||
.Pp
|
||||
If a device (such as
|
||||
.Xr ath 4 )
|
||||
inserts padding after the 802.11 header to align
|
||||
the payload to a 32-bit boundary the
|
||||
.Dv IEEE80211_C_DATAPAD
|
||||
capability must be set.
|
||||
Otherwise header and payload are assumed contiguous in the mbuf chain.
|
||||
.Pp
|
||||
If a received frame must pass
|
||||
through the A-MPDU receive reorder buffer then the mbuf
|
||||
must be marked with the
|
||||
.Dv M_AMPDU
|
||||
flag.
|
||||
Note that for the moment this is required of all frames received from
|
||||
a station and TID where a Block ACK stream is active, not just A-MPDU
|
||||
aggregates.
|
||||
It is sufficient to check for
|
||||
.Dv IEEE80211_NODE_HT
|
||||
in the
|
||||
.Vt ni_flags
|
||||
of the station's node table entry, any frames that do not require reorder
|
||||
processing will be dispatched with only minimal overhead.
|
||||
.Pp
|
||||
.\"
|
||||
The
|
||||
.Fn ieee80211_recv_mgmt
|
||||
performs input processing for 802.11 management frames.
|
||||
It is typically called from within
|
||||
.Fn ieee80211_input .
|
||||
.\"
|
||||
.Vt rssi
|
||||
parameter is the Receive Signal Strength Indication of the frame
|
||||
measured in 0.5dBm units relative to the noise floor.
|
||||
The
|
||||
.Vt noise
|
||||
parameter is the best approximation of the noise floor in
|
||||
dBm units at the time the frame was received.
|
||||
RSSI and noise are used by the
|
||||
.Nm net80211
|
||||
layer to make scanning and roaming decisions in station mode
|
||||
and to do auto channel selection for hostap and similar modes.
|
||||
Otherwise the values are made available to user applications
|
||||
(with the rssi presented as a filtered average over the last ten values
|
||||
and the noise floor the last reported value).
|
||||
.Sh SEE ALSO
|
||||
.Xr ieee80211 9 ,
|
||||
.Xr ifnet 9
|
||||
.Sh HISTORY
|
||||
The
|
||||
.Nm ieee80211
|
||||
series of functions first appeared in
|
||||
.Nx 1.5 ,
|
||||
and were later ported to
|
||||
.Fx 4.6 .
|
||||
.Sh AUTHORS
|
||||
.An -nosplit
|
||||
This manual page was written by
|
||||
.An Bruce M. Simpson Aq bms@FreeBSD.org
|
||||
and
|
||||
.An Darron Broad Aq darron@kewl.org .
|
||||
.Sh BUGS
|
||||
There is no netisr queue specifically for the software 802.11 stack yet.
|
||||
.Xr ieee80211 9 .
|
||||
|
@ -1,92 +0,0 @@
|
||||
.\"
|
||||
.\" Copyright (c) 2004 Bruce M. Simpson <bms@spc.org>
|
||||
.\" Copyright (c) 2004 Darron Broad <darron@kewl.org>
|
||||
.\" All rights reserved.
|
||||
.\"
|
||||
.\" Redistribution and use in source and binary forms, with or without
|
||||
.\" modification, are permitted provided that the following conditions
|
||||
.\" are met:
|
||||
.\" 1. Redistributions of source code must retain the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer.
|
||||
.\" 2. Redistributions in binary form must reproduce the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer in the
|
||||
.\" documentation and/or other materials provided with the distribution.
|
||||
.\"
|
||||
.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
.\" SUCH DAMAGE.
|
||||
.\"
|
||||
.\" $FreeBSD$
|
||||
.\" $Id: ieee80211_ioctl.9,v 1.5 2004/03/04 12:33:27 bruce Exp $
|
||||
.\"
|
||||
.Dd March 2, 2004
|
||||
.Dt IEEE80211_IOCTL 9
|
||||
.Os
|
||||
.Sh NAME
|
||||
.Nm ieee80211_cfgget , ieee80211_cfgset , ieee80211_ioctl
|
||||
.Nd 802.11 interface ioctl commands
|
||||
.Sh SYNOPSIS
|
||||
.In net80211/ieee80211_var.h
|
||||
.In net80211/ieee80211_proto.h
|
||||
.In net80211/ieee80211_ioctl.h
|
||||
.Ft int
|
||||
.Fn ieee80211_cfgget "struct ifnet *ifp" "u_long cmd" "caddr_t data"
|
||||
.Ft int
|
||||
.Fn ieee80211_cfgset "struct ifnet *ifp" "u_long cmd" "caddr_t data"
|
||||
.Ft int
|
||||
.Fn ieee80211_ioctl "struct ifnet *ifp" "u_long cmd" "caddr_t data"
|
||||
.Sh DESCRIPTION
|
||||
These
|
||||
functions are typically invoked by drivers in response to requests
|
||||
for information or to change settings from the userland.
|
||||
.Pp
|
||||
.\"
|
||||
The
|
||||
.Fn ieee80211_cfgget
|
||||
and
|
||||
.Fn ieee80211_cfgset
|
||||
functions implement a legacy interface for getting and setting 802.11
|
||||
interface attributes respectively.
|
||||
.Pp
|
||||
.\"
|
||||
The
|
||||
.Fn ieee80211_ioctl
|
||||
function provides a default implementation of the
|
||||
.Dv SIOCS80211
|
||||
and
|
||||
.Dv SIOCG80211
|
||||
ifioctls commands for 802.11 drivers.
|
||||
The call signature is identical to that of the
|
||||
.Va if_ioctl
|
||||
member found in
|
||||
.Vt struct ifnet ,
|
||||
however, many drivers store attributes such as
|
||||
.Dv IEEE80211_IOC_STATIONNAME
|
||||
in the driver's private soft state structure, so driver writers may prefer
|
||||
to use this as the catch-all in a switch statement to avoid code duplication.
|
||||
.\"
|
||||
.Sh SEE ALSO
|
||||
.Xr ifconfig 8 ,
|
||||
.Xr ieee80211 9 ,
|
||||
.Xr ifnet 9
|
||||
.Sh HISTORY
|
||||
The
|
||||
.Nm ieee80211
|
||||
series of functions first appeared in
|
||||
.Nx 1.5 ,
|
||||
and were later ported to
|
||||
.Fx 4.6 .
|
||||
.Sh AUTHORS
|
||||
.An -nosplit
|
||||
This manual page was written by
|
||||
.An Bruce M. Simpson Aq bms@FreeBSD.org
|
||||
and
|
||||
.An Darron Broad Aq darron@kewl.org .
|
@ -25,269 +25,227 @@
|
||||
.\" SUCH DAMAGE.
|
||||
.\"
|
||||
.\" $FreeBSD$
|
||||
.\" $Id: ieee80211_node.9,v 1.6 2004/03/04 12:33:27 bruce Exp $
|
||||
.\"
|
||||
.Dd July 4, 2004
|
||||
.Dd August 4, 2009
|
||||
.Dt IEEE80211_NODE 9
|
||||
.Os
|
||||
.Sh NAME
|
||||
.Nm ieee80211_node_attach ,
|
||||
.Nm ieee80211_node_lateattach ,
|
||||
.Nm ieee80211_node_detach ,
|
||||
.Nm ieee80211_begin_scan ,
|
||||
.Nm ieee80211_next_scan ,
|
||||
.Nm ieee80211_create_ibss ,
|
||||
.Nm ieee80211_end_scan ,
|
||||
.Nm ieee80211_alloc_node ,
|
||||
.Nm ieee80211_dup_bss ,
|
||||
.Nm ieee80211_find_node ,
|
||||
.Nm ieee80211_lookup_node ,
|
||||
.Nm ieee80211_free_node ,
|
||||
.Nm ieee80211_free_allnodes ,
|
||||
.Nm ieee80211_timeout_nodes ,
|
||||
.Nm ieee80211_iterate_nodes
|
||||
.Nm ieee80211_node
|
||||
.Nd software 802.11 stack node management functions
|
||||
.Sh SYNOPSIS
|
||||
.In net80211/ieee80211_var.h
|
||||
.In net80211/ieee80211_proto.h
|
||||
.In net80211/ieee80211_node.h
|
||||
.Ft void
|
||||
.Fn ieee80211_node_attach "struct ifnet *ifp"
|
||||
.Ft void
|
||||
.Fn ieee80211_node_lateattach "struct ifnet *ifp"
|
||||
.Ft void
|
||||
.Fn ieee80211_node_detach "struct ifnet *ifp"
|
||||
.Ft void
|
||||
.Fn ieee80211_begin_scan "struct ifnet *ifp"
|
||||
.Ft void
|
||||
.Fn ieee80211_next_scan "struct ifnet *ifp"
|
||||
.Ft void
|
||||
.Fo ieee80211_create_ibss
|
||||
.Fa "struct ieee80211com *ic" "struct ieee80211_channel *chan"
|
||||
.\"
|
||||
.Ft struct ieee80211_node *
|
||||
.Fo ieee80211_find_rxnode
|
||||
.Fa "struct ieee80211com *"
|
||||
.Fa "const struct ieee80211_frame_min *"
|
||||
.Fc
|
||||
.Ft void
|
||||
.Fn ieee80211_end_scan "struct ifnet *ifp"
|
||||
.\"
|
||||
.Ft struct ieee80211_node *
|
||||
.Fn ieee80211_alloc_node "struct ieee80211com *ic" "u_int8_t *macaddr"
|
||||
.Ft struct ieee80211_node *
|
||||
.Fn ieee80211_dup_bss "struct ieee80211com *ic" "u_int8_t *macaddr"
|
||||
.Ft struct ieee80211_node *
|
||||
.Fn ieee80211_find_node "struct ieee80211com *ic" "u_int8_t *macaddr"
|
||||
.Ft struct ieee80211_node *
|
||||
.Fo ieee80211_lookup_node
|
||||
.Fa "struct ieee80211com *ic" "u_int8_t *macaddr"
|
||||
.Fa "struct ieee80211_channel *chan"
|
||||
.Fo ieee80211_find_rxnode_withkey
|
||||
.Fa "struct ieee80211com *"
|
||||
.Fa "const struct ieee80211_frame_min *"
|
||||
.Fa "ieee80211_keyix"
|
||||
.Fc
|
||||
.\"
|
||||
.Ft struct ieee80211_node *
|
||||
.Fn ieee80211_ref_node "struct ieee80211_node *"
|
||||
.\"
|
||||
.Ft void
|
||||
.Fn ieee80211_free_node "struct ieee80211com *ic" "struct ieee80211_node *ni"
|
||||
.Fn ieee80211_unref_node "struct ieee80211_node *"
|
||||
.\"
|
||||
.Ft void
|
||||
.Fn ieee80211_free_allnodes "struct ieee80211com *ic"
|
||||
.Ft void
|
||||
.Fn ieee80211_timeout_nodes "struct ieee80211com *ic"
|
||||
.Fn ieee80211_free_node "struct ieee80211_node *"
|
||||
.\"
|
||||
.Ft void
|
||||
.Fo ieee80211_iterate_nodes
|
||||
.Fa "struct ieee80211com *ic" "ieee80211_iter_func *f" "void *arg"
|
||||
.Fa "struct ieee80211_node_table *"
|
||||
.Fa "ieee80211_iter_func *f"
|
||||
.Fa "void *arg"
|
||||
.Fc
|
||||
.\"
|
||||
.Ft void
|
||||
.Fo ieee80211_dump_nodes
|
||||
.Fa "struct ieee80211_node_table *"
|
||||
.Fc
|
||||
.\"
|
||||
.Ft void
|
||||
.Fo ieee80211_dump_node
|
||||
.Fa "struct ieee80211_node *"
|
||||
.Fc
|
||||
.Sh DESCRIPTION
|
||||
These functions are used to manage node lists within the software
|
||||
802.11 stack.
|
||||
These lists are typically used for implementing host-mode AP functionality,
|
||||
or providing signal quality information about neighbouring nodes.
|
||||
The
|
||||
.Nm net80211
|
||||
layer that supports 802.11 device drivers maintains a database of
|
||||
peer stations called the
|
||||
.Dq node table
|
||||
in the
|
||||
.Vt ic_sta
|
||||
entry of the
|
||||
.Vt ieee80211com
|
||||
structure.
|
||||
Station mode vaps create an entry for the access point
|
||||
the station is associated to.
|
||||
AP mode vaps create entries for associated stations.
|
||||
Adhoc and mesh mode vaps create entries for neighbor stations.
|
||||
WDS mode vaps create an entry for the peer station.
|
||||
Stations for all vaps reside in the same table; each node
|
||||
entry has a
|
||||
.Vt ni_vap
|
||||
field that identifies the vap that created it.
|
||||
In some instances an entry is used by multiple vaps (e.g. for
|
||||
dynamic WDS a station associated to an ap vap may also be the peer
|
||||
of a WDS vap).
|
||||
.Pp
|
||||
.\"
|
||||
Node table entries are reference counted.
|
||||
That is, there is a count of all long term references that determines
|
||||
when an entry may be reclaimed.
|
||||
References are held by every in-flight frame sent to a station to
|
||||
insure the entry is not reclaimed while the frame is queued or otherwise
|
||||
held by a driver.
|
||||
Routines that lookup a table entry return a
|
||||
.Dq held reference
|
||||
(i.e. a pointer to a table entry with the reference count incremented).
|
||||
The
|
||||
.Fn ieee80211_node_attach
|
||||
function is called from
|
||||
.Xr ieee80211_ifattach 9
|
||||
to initialize node database management callbacks for the interface
|
||||
.Fa ifp
|
||||
(specifically for memory allocation, node copying and node
|
||||
signal inspection).
|
||||
These functions may be overridden in special circumstances,
|
||||
as long as this is done after calling
|
||||
.Xr ieee80211_ifattach 9
|
||||
and prior to any other call which may allocate a node.
|
||||
.Pp
|
||||
.\"
|
||||
The
|
||||
.Fn ieee80211_node_lateattach
|
||||
function initialises the
|
||||
.Va ic_bss
|
||||
node element of the interface
|
||||
.Fa ifp
|
||||
during
|
||||
.Xr ieee80211_media_init 9 .
|
||||
This late attachment is to account for certain special cases described under
|
||||
.Fn ieee80211_node_attach .
|
||||
.Pp
|
||||
.\"
|
||||
The
|
||||
.Fn ieee80211_node_detach
|
||||
function destroys all node database state associated with the interface
|
||||
.Fa ifp ,
|
||||
and is usually called during device detach.
|
||||
.Pp
|
||||
.\"
|
||||
The
|
||||
.Fn ieee80211_begin_scan
|
||||
function initialises the node database in preparation of an active
|
||||
scan for an access point on the interface
|
||||
.Fa ifp .
|
||||
The scan begins on the next radio channel by calling
|
||||
.Fn ieee80211_next_scan
|
||||
internally.
|
||||
The actual scanning for an access point is not automated;
|
||||
the device driver itself only handles setting the radio frequency
|
||||
of the card and stepping through the channels.
|
||||
.Pp
|
||||
.\"
|
||||
The
|
||||
.Fn ieee80211_next_scan
|
||||
function is used to inform the
|
||||
.Xr ieee80211 9
|
||||
layer that the interface
|
||||
.Fa ifp
|
||||
is now scanning for an access point on the next radio channel.
|
||||
A device driver is expected to first call
|
||||
.Fn ieee80211_begin_scan ,
|
||||
to initialize the node database,
|
||||
then set the radio channel on the device;
|
||||
then, after a certain time has elapsed (200ms for example), call
|
||||
.Fn ieee80211_next_scan
|
||||
to move to the next channel.
|
||||
Typically, a callout is used to automate this process; see
|
||||
.Xr callout_init 9
|
||||
for more information on how to use callouts.
|
||||
.Pp
|
||||
.\"
|
||||
The
|
||||
.Fn ieee80211_create_ibss
|
||||
function sets up the net80211-specific portion of an interface's softc,
|
||||
.Fa ic ,
|
||||
for use in IBSS mode.
|
||||
.Pp
|
||||
.\"
|
||||
The
|
||||
.Fn ieee80211_end_scan
|
||||
function is called by
|
||||
.Fn ieee80211_next_scan
|
||||
when the state machine has peformed a full cycle of scanning on
|
||||
all available radio channels.
|
||||
Internally,
|
||||
.Fn ieee80211_end_scan
|
||||
will inspect the node cache associated with the interface
|
||||
.Fa ifp
|
||||
for suitable access points found during scanning, and associate with one,
|
||||
should the parameters of the node match those of the configuration
|
||||
requested from userland.
|
||||
.Pp
|
||||
.\"
|
||||
The
|
||||
.Fn ieee80211_alloc_node
|
||||
function allocates an instance of
|
||||
.Vt "struct ieee80211_node"
|
||||
for a node having the MAC address
|
||||
.Fa macaddr ,
|
||||
and associates it with the interface
|
||||
.Fa ic .
|
||||
If the allocation is successful, the node structure is initialised by
|
||||
.Fn ieee80211_setup_node ;
|
||||
otherwise,
|
||||
.Dv NULL
|
||||
is returned.
|
||||
.Pp
|
||||
.\"
|
||||
The
|
||||
.Fn ieee80211_dup_bss
|
||||
function is similar to
|
||||
.Fn ieee80211_alloc_node ,
|
||||
but is instead used to create a node database entry for the BSSID
|
||||
.Fa macaddr
|
||||
associated with the interface
|
||||
.Fa ic .
|
||||
If the allocation is successful, the node structure is initialised by
|
||||
.Fn ieee80211_setup_node ;
|
||||
otherwise,
|
||||
.Dv NULL
|
||||
is returned.
|
||||
.Pp
|
||||
.\"
|
||||
The
|
||||
.Fn ieee80211_find_node
|
||||
function will iterate through the node list associated with the interface
|
||||
.Fa ic ,
|
||||
searching for a node entry which matches
|
||||
.Fa macaddr .
|
||||
If the entry is found, its reference count is incremented, and
|
||||
a pointer to the node is returned; otherwise,
|
||||
.Dv NULL
|
||||
will be returned.
|
||||
.Pp
|
||||
.\"
|
||||
The
|
||||
.Fn ieee80211_lookup_node
|
||||
function is similar to
|
||||
.Fn ieee80211_find_node ,
|
||||
with an additional argument
|
||||
.Fa chan
|
||||
which is used to specify a channel for the match.
|
||||
If the entry is found, its reference count is incremented, and
|
||||
a pointer to the node is returned; otherwise,
|
||||
.Dv NULL
|
||||
will be returned.
|
||||
.Pp
|
||||
.\"
|
||||
The
|
||||
.Fn ieee80211_free_node
|
||||
function will remove the node
|
||||
.Fa ni
|
||||
from the node database entries associated with the interface
|
||||
.Fa ic ,
|
||||
and free any memory associated with the node.
|
||||
This private method can be overridden in
|
||||
.Fn ieee80211_node_attach .
|
||||
.\"
|
||||
.Pp
|
||||
The
|
||||
.Fn ieee80211_free_allnodes
|
||||
function will iterate through the node list calling
|
||||
.Fn ieee80211_free_node
|
||||
for all nodes associated with the interface
|
||||
.Fa ic .
|
||||
.Pp
|
||||
.\"
|
||||
The
|
||||
.Fn ieee80211_timeout_nodes
|
||||
checks if the inactivity timer of each node associated with the interface
|
||||
.Fa ic
|
||||
has exceeded the pre-defined constant
|
||||
.Dv IEEE80211_INACT_MAX .
|
||||
If so, then the node is freed, after sending a deauthentication message.
|
||||
.Pp
|
||||
.\"
|
||||
The
|
||||
.Fn ieee80211_iterate_nodes
|
||||
function will call the user-defined callback function
|
||||
.Fa f
|
||||
for all nodes in the node database associated with the interface
|
||||
.Fa ic .
|
||||
The callback is invoked with the with the user-supplied value
|
||||
.Fa arg
|
||||
and a pointer to the current node.
|
||||
.\"
|
||||
.Sh SEE ALSO
|
||||
.Xr ieee80211 9 ,
|
||||
.Xr ifnet 9
|
||||
.Sh HISTORY
|
||||
The
|
||||
.Nm ieee80211
|
||||
series of functions first appeared in
|
||||
.Nx 1.5 ,
|
||||
and were later ported to
|
||||
.Fx 4.6 .
|
||||
.Sh AUTHORS
|
||||
.An -nosplit
|
||||
This manual page was written by
|
||||
.An Bruce M. Simpson Aq bms@FreeBSD.org
|
||||
.Fn ieee80211_ref_node
|
||||
and
|
||||
.An Darron Broad Aq darron@kewl.org .
|
||||
.Fn ieee80211_unref_node
|
||||
calls explicitly increment/decrement the reference count of a node,
|
||||
but are rarely used.
|
||||
Instead most callers use
|
||||
.Fn ieee80211_free_node
|
||||
to release a reference and, if the count goes to zero, reclaim the
|
||||
table entry.
|
||||
.Pp
|
||||
The station table and its entries are exposed to drivers in several ways.
|
||||
Each frame transmitted to a station includes a reference to the
|
||||
associated node in the
|
||||
.Vt m_pkthdr.rcvif
|
||||
field.
|
||||
This reference must be reclaimed by the driver when transmit processing
|
||||
is done.
|
||||
For each frame received the driver must lookup the table entry to
|
||||
use in dispatching the frame
|
||||
.Dq up the stack .
|
||||
This lookup implicitly obtains a reference to the table entry and
|
||||
the driver must reclaim the reference when frame processing is completed.
|
||||
Otherwise drivers frequently inspect the contents of the
|
||||
.Vt iv_bss
|
||||
node when handling state machine changes as important information
|
||||
is maintained in the data structure.
|
||||
.Pp
|
||||
The node table is opaque to drivers.
|
||||
Entries may be looked up using one of the pre-defined API's or the
|
||||
.Fn ieee80211_iterate_nodes
|
||||
call may be used to iterate through all entries to do per-node
|
||||
processing or implement some non-standard search mechanism.
|
||||
Note that
|
||||
.Fn ieee80211_iterate_nodes
|
||||
is single-threaded per-device
|
||||
and the effort processing involved is fairly
|
||||
substantial so it should be used carefully.
|
||||
.Pp
|
||||
Two routines are provided to print the contents of nodes to the console
|
||||
for debugging:
|
||||
.Fn ieee80211_dump_node
|
||||
displays the contents of a single node while
|
||||
.Fn ieee80211_dump_nodes
|
||||
displays the contents of the specified node table.
|
||||
Nodes may also be displayed using
|
||||
.Xr ddb 9
|
||||
with the
|
||||
.Dq show node
|
||||
directive and the station node table can be displayed with
|
||||
.Dq show statab .
|
||||
.Sh DRIVER PRIVATE STATE
|
||||
Node data structures may be extended by the driver to include
|
||||
driver-private state.
|
||||
This is done by overriding the
|
||||
.Vt ic_node_alloc
|
||||
method used to allocate a node table entry.
|
||||
The driver method must allocate a structure that is an extension
|
||||
of the
|
||||
.Vt ieee80211_node
|
||||
structure.
|
||||
For example the
|
||||
.Xr iwi 4
|
||||
driver defines a private node structure as:
|
||||
.Bd -literal -offset indent
|
||||
struct iwi_node {
|
||||
struct ieee80211_node in_node;
|
||||
int in_station;
|
||||
};
|
||||
.Ed
|
||||
.Pp
|
||||
and then provides a private allocation routine that does this:
|
||||
.Bd -literal -offset indent
|
||||
static struct ieee80211_node *
|
||||
iwi_node_alloc(struct ieee80211vap *vap,
|
||||
const uint8_t mac[IEEE80211_ADDR_LEN])
|
||||
{
|
||||
struct iwi_node *in;
|
||||
|
||||
in = malloc(sizeof (struct iwi_node), M_80211_NODE,
|
||||
M_NOWAIT | M_ZERO);
|
||||
if (in == NULL)
|
||||
return NULL;
|
||||
in->in_station = -1;
|
||||
return &in->in_node;
|
||||
}
|
||||
.Ed
|
||||
.Pp
|
||||
Note that when reclaiming a node allocated by the driver the
|
||||
.Dq parent method
|
||||
must be called to ensure
|
||||
.Nm net80211
|
||||
state is reclaimed; for example:
|
||||
.Bd -literal -offset indent
|
||||
static void
|
||||
iwi_node_free(struct ieee80211_node *ni)
|
||||
{
|
||||
struct ieee80211com *ic = ni->ni_ic;
|
||||
struct iwi_softc *sc = ic->ic_ifp->if_softc;
|
||||
struct iwi_node *in = (struct iwi_node *)ni;
|
||||
|
||||
if (in->in_station != -1)
|
||||
free_unr(sc->sc_unr, in->in_station);
|
||||
sc->sc_node_free(ni); /* invoke net80211 free handler */
|
||||
}
|
||||
.Ed
|
||||
.Pp
|
||||
Beware that care must be taken to avoid holding references that
|
||||
might cause nodes from being reclaimed.
|
||||
.Nm net80211
|
||||
will reclaim a node when the last reference is reclaimed in
|
||||
its data structures.
|
||||
However if a driver holds additional references then
|
||||
.Nm net80211
|
||||
will not recognize this and table entries will not be reclaimed.
|
||||
Such references should not be needed if the driver overrides the
|
||||
.Vt ic_node_cleanup
|
||||
and/or
|
||||
.Vt ic_node_free
|
||||
methods.
|
||||
.Sh KEY TABLE SUPPORT
|
||||
Node table lookups are typically done using a hash of the stations'
|
||||
mac address.
|
||||
When receiving frames this is sufficient to find the node table entry
|
||||
for the transmitter.
|
||||
But some devices also identify the sending station in the device
|
||||
state received with each frame and this data can be used to optimize
|
||||
lookups on receive using a companion table called the
|
||||
.Dq keytab .
|
||||
This table records a separate node table reference that can be fetched
|
||||
without any locking using the table index.
|
||||
This logic is handled with the
|
||||
.Fn ieee80211_find_rxnode_withkey
|
||||
call: if a keytab entry is found using the specified index then it is
|
||||
returned directly; otherwise a normal lookup is done and the keytab
|
||||
entry is written using the specified index.
|
||||
If the specified index is
|
||||
.Dv IEEE80211_KEYIX_NONE
|
||||
then a normal lookup is done without a table update.
|
||||
.Sh SEE ALSO
|
||||
.Xr ddb 9
|
||||
.Xr ieee80211 9 ,
|
||||
.Xr ieee80211_proto 9 ,
|
||||
|
@ -27,125 +27,168 @@
|
||||
.\" $FreeBSD$
|
||||
.\" $Id: ieee80211_output.9,v 1.5 2004/03/04 12:31:18 bruce Exp $
|
||||
.\"
|
||||
.Dd March 2, 2004
|
||||
.Dd August 4, 2009
|
||||
.Dt IEEE80211_OUTPUT 9
|
||||
.Os
|
||||
.Sh NAME
|
||||
.Nm ieee80211_encap , ieee80211_add_rates ,
|
||||
.Nm ieee80211_add_xrates , ieee80211_send_mgmt
|
||||
.Nm ieee80211_output
|
||||
.Nd software 802.11 stack output functions
|
||||
.Sh SYNOPSIS
|
||||
.In net80211/ieee80211_var.h
|
||||
.In net80211/ieee80211_proto.h
|
||||
.Ft struct mbuf *
|
||||
.Fo ieee80211_encap
|
||||
.Fa "struct ifnet *ifp" "struct mbuf *m" "struct ieee80211_node **pni"
|
||||
.Fc
|
||||
.Ft u_int8_t *
|
||||
.Fn ieee80211_add_rates "u_int8_t *frm" "const struct ieee80211_rateset *rs"
|
||||
.Ft u_int8_t *
|
||||
.Fn ieee80211_add_xrates "u_int8_t *frm" "const struct ieee80211_rateset *rs"
|
||||
.\"
|
||||
.Ft int
|
||||
.Fo ieee80211_send_mgmt
|
||||
.Fa "struct ieee80211com *ic" "struct ieee80211_node *ni" "int type" "int arg"
|
||||
.Fn M_WME_GETAC "struct mbuf *"
|
||||
.\"
|
||||
.Ft int
|
||||
.Fn M_SEQNO_GET "struct mbuf *"
|
||||
.\"
|
||||
.Ft struct ieee80211_key *
|
||||
.Fn ieee80211_crypto_encap "struct ieee80211_node *" "struct mbuf *"
|
||||
.\"
|
||||
.Ft void
|
||||
.Fo ieee80211_process_callback
|
||||
.Fa struct ieee80211_node *
|
||||
.Fa struct mbuf *
|
||||
.Fa int
|
||||
.Fc
|
||||
.Sh DESCRIPTION
|
||||
These functions handle the encapsulation and transmission of 802.11 frames
|
||||
within the software 802.11 stack.
|
||||
.Pp
|
||||
The
|
||||
.Fn ieee80211_encap
|
||||
function encapsulates an outbound data frame contained within the
|
||||
mbuf chain
|
||||
.Fa m
|
||||
from the interface
|
||||
.Fa ifp .
|
||||
The argument
|
||||
.Fa *pni
|
||||
is a reference to the destination node.
|
||||
.Nm net80211
|
||||
layer that supports 802.11 device drivers handles most of the
|
||||
work required to transmit frames.
|
||||
Drivers usually receive fully-encapsulated 802.11 frames that
|
||||
have been classified and assigned a transmit priority;
|
||||
all that is left is to do
|
||||
crypto encapsulation,
|
||||
prepare any hardware-specific state,
|
||||
and
|
||||
push the packet out to the device.
|
||||
Outbound frames are either generated by the
|
||||
.Nm net80211
|
||||
layer (e.g. management frames) or are passed down
|
||||
from upper layers through the
|
||||
.Xr ifnet 9
|
||||
transmit queue.
|
||||
Data frames passed down for transmit flow through
|
||||
.Nm net80211
|
||||
which handles aggregation, 802.11 encapsulation, and then
|
||||
dispatches the frames to the driver through it's transmit queue.
|
||||
.Pp
|
||||
If the function is successful, the mbuf chain is updated with the
|
||||
802.11 frame header prepended, and a pointer to the head of the chain
|
||||
is returned.
|
||||
If an error occurs,
|
||||
.Dv NULL
|
||||
will be returned, and
|
||||
.Fa *pni
|
||||
is also set to
|
||||
.Dv NULL .
|
||||
The caller is responsible for freeing the node reference if
|
||||
.Fa *pni
|
||||
is
|
||||
.Pf non- Dv NULL
|
||||
on return.
|
||||
The convention is that
|
||||
.Va ic_bss
|
||||
is not reference counted; the caller is responsible for maintaining this
|
||||
reference count.
|
||||
There are two control paths by which frames reach a driver for transmit.
|
||||
Data packets are queued to the device's
|
||||
.Vt if_snd
|
||||
queue and the driver's
|
||||
.Vt if_start
|
||||
method is called.
|
||||
Other frames are passed down using the
|
||||
.Vt ic_raw_xmit
|
||||
method without queueing (unless done by the driver).
|
||||
The raw transmit path may include data frames from user applications
|
||||
that inject them through
|
||||
.Xr bpf 4
|
||||
and NullData frames generated by
|
||||
.Nm net80211
|
||||
to probe for idle stations (when operating as an access point).
|
||||
.Pp
|
||||
.\"
|
||||
.Nm net80211
|
||||
handles all state-related bookkeeping and management for the handling
|
||||
of data frames.
|
||||
Data frames are only transmit for a vap in the
|
||||
.Dv IEEE80211_S_RUN
|
||||
state; there is no need, for example, to check for frames sent down
|
||||
when CAC or CSA is active.
|
||||
Similarly,
|
||||
.Nm net80211
|
||||
handles activities such as background scanning and power save mode,
|
||||
frames will not be sent to a driver unless it is operating on the
|
||||
BSS channel will
|
||||
.Dq full power .
|
||||
.Pp
|
||||
All frames passed to a driver for transmit hold a reference to a
|
||||
node table entry in the
|
||||
.Vt m_pkthdr.rcvif
|
||||
field.
|
||||
The node is associated with the frame destination.
|
||||
Typically it is the receiver's entry but in some situations it may be
|
||||
a placeholder entry or the
|
||||
.Dq next hop station
|
||||
(such as in a mesh network).
|
||||
In all cases the reference must be reclaimed with
|
||||
.Fn ieee80211_free_node
|
||||
when the transmit work is completed.
|
||||
The rule to remember is:
|
||||
.Nm net80211
|
||||
passes responsibility for the
|
||||
.Vt mbuf
|
||||
and
|
||||
.Dq node reference
|
||||
to the driver with each frame it hands off for transmit.
|
||||
.Sh PACKET CLASSIFICATION
|
||||
All frames passed by
|
||||
.Nm net80211
|
||||
for transmit are assigned a priority based on any vlan tag
|
||||
assigned to the receiving station and/or any Diffserv setting
|
||||
in an IP or IPv6 header.
|
||||
If both vlan and Diffserv priority are present the higher of the
|
||||
two is used.
|
||||
If WME/WMM is being used then any ACM policy (in station mode) is
|
||||
also enforced.
|
||||
The resulting AC is attached to the mbuf and may be read back using the
|
||||
.Fn M_WME_GETAC
|
||||
macro.
|
||||
.Pp
|
||||
PAE/EAPOL frames are tagged with an
|
||||
.Dv M_EAPOL
|
||||
mbuf flag; drivers should transmit them with care, usually by
|
||||
using the transmit rate for management frames.
|
||||
Multicast/broadcast frames are marked with the
|
||||
.Dv M_MCAST
|
||||
mbuf flag.
|
||||
Frames coming out of a station's power save queue and that have
|
||||
more frames immediately following are marked with the
|
||||
.Dv M_MORE_DATA
|
||||
mbuf flag.
|
||||
Such frames will be queued consecutively in the driver's
|
||||
.Vt if_snd
|
||||
queue and drivers should preserve the ordering when passing
|
||||
them to the device.
|
||||
.Sh FRAGMENTED FRAMES
|
||||
The
|
||||
.Fn ieee80211_add_rates
|
||||
utility function is used to add the rate set element
|
||||
.Fa *rs
|
||||
to the frame
|
||||
.Fa frm .
|
||||
A pointer to the location in the buffer after the addition of the rate set
|
||||
is returned.
|
||||
It is typically used when constructing management frames from within the
|
||||
software 802.11 stack.
|
||||
.Pp
|
||||
.\"
|
||||
The
|
||||
.Fn ieee80211_add_xrates
|
||||
utility function is used to add the extended rate set element
|
||||
.Fa *rs
|
||||
to the frame
|
||||
.Fa frm .
|
||||
A pointer to the location in the buffer after the addition of the rate set
|
||||
is returned.
|
||||
It is typically used when constructing management frames from within the
|
||||
software 802.11 stack in 802.11g mode.
|
||||
.Pp
|
||||
.\"
|
||||
The
|
||||
.Fn ieee80211_send_mgmt
|
||||
function transmits a management frame on the interface
|
||||
.Fa ic
|
||||
to the destination node
|
||||
.Fa ni
|
||||
of type
|
||||
.Fa type .
|
||||
.Pp
|
||||
The argument
|
||||
.Fa arg
|
||||
specifies either a sequence number for authentication operations,
|
||||
a status code for [re]association operations,
|
||||
or a reason for deauthentication and deassociation operations.
|
||||
.Pp
|
||||
Nodes other than
|
||||
.Va ic_bss
|
||||
have their reference count incremented to reflect their use for an
|
||||
indeterminate amount of time.
|
||||
This reference is freed when the function returns.
|
||||
.Pp
|
||||
The function returns 0 if successful; if temporary buffer space is not
|
||||
available, the function returns
|
||||
.Er ENOMEM .
|
||||
.\"
|
||||
.Nm net80211
|
||||
layer will fragment data frames according to the setting of
|
||||
.Vt iv_fragthreshold
|
||||
if a driver marks the
|
||||
.Dv IEEE80211_C_TXFRAG
|
||||
capability.
|
||||
Fragmented frames are placed
|
||||
in the devices transmit queue with the fragments chained together with
|
||||
.Vt m_nextpkt .
|
||||
Each frame is marked with the
|
||||
.Dv M_FRAG
|
||||
mbuf flag, and the first and last are marked with
|
||||
.Dv M_FIRSTFRAG
|
||||
and
|
||||
.Dv M_LASTFRAG ,
|
||||
respectively.
|
||||
Drivers are expected to process all fragments or none.
|
||||
.Sh TRANSMIT CALLBACKS
|
||||
Frames sent by
|
||||
.Nm net80211
|
||||
may be tagged with the
|
||||
.Dv M_TXCB
|
||||
mbuf flag to indicate a callback should be done
|
||||
when their transmission completes.
|
||||
The callback is done using
|
||||
.Fn ieee80211_process_callback
|
||||
with the last parameter set to a non-zero value if an error occurred
|
||||
and zero otherwise.
|
||||
Note
|
||||
.Nm net80211
|
||||
understands that drivers may be incapable of determining status;
|
||||
a device may not report if an ACK frame is received and/or a device may queue
|
||||
transmit requests in its hardware and only report status on whether
|
||||
the frame was successfully queued.
|
||||
.Sh SEE ALSO
|
||||
.Xr bpf 4
|
||||
.Xr ieee80211 9 ,
|
||||
.Xr ifnet 9
|
||||
.Sh HISTORY
|
||||
The
|
||||
.Nm ieee80211
|
||||
series of functions first appeared in
|
||||
.Nx 1.5 ,
|
||||
and were later ported to
|
||||
.Fx 4.6 .
|
||||
.Sh AUTHORS
|
||||
.An -nosplit
|
||||
This manual page was written by
|
||||
.An Bruce M. Simpson Aq bms@FreeBSD.org
|
||||
and
|
||||
.An Darron Broad Aq darron@kewl.org .
|
||||
|
@ -1,6 +1,5 @@
|
||||
.\"
|
||||
.\" Copyright (c) 2004 Bruce M. Simpson <bms@spc.org>
|
||||
.\" Copyright (c) 2004 Darron Broad <darron@kewl.org>
|
||||
.\" Copyright (c) 2009 Sam Leffler, Errno Consulting
|
||||
.\" All rights reserved.
|
||||
.\"
|
||||
.\" Redistribution and use in source and binary forms, with or without
|
||||
@ -25,51 +24,218 @@
|
||||
.\" SUCH DAMAGE.
|
||||
.\"
|
||||
.\" $FreeBSD$
|
||||
.\" $Id: ieee80211_proto.9,v 1.5 2004/03/04 12:33:27 bruce Exp $
|
||||
.\"
|
||||
.Dd March 2, 2004
|
||||
.Dd August 4, 2009
|
||||
.Dt IEEE80211_PROTO 9
|
||||
.Os
|
||||
.Sh NAME
|
||||
.Nm ieee80211_proto_attach ,
|
||||
.Nm ieee80211_proto_detach ,
|
||||
.Nm ieee80211_print_essid ,
|
||||
.Nm ieee80211_dump_pkt ,
|
||||
.Nm ieee80211_fix_rate ,
|
||||
.Nm ieee80211_proto
|
||||
.Nd software 802.11 stack protocol helper functions
|
||||
.Nd 802.11 state machine support
|
||||
.Sh SYNOPSIS
|
||||
.In net80211/ieee80211_var.h
|
||||
.In net80211/ieee80211_proto.h
|
||||
.Pp
|
||||
.Ft void
|
||||
.Fn ieee80211_proto_attach "struct ifnet *ifp"
|
||||
.Fn ieee80211_start_all "struct ieee80211com *"
|
||||
.Ft void
|
||||
.Fn ieee80211_proto_detach "struct ifnet *ifp"
|
||||
.Fn ieee80211_stop_all "struct ieee80211com *"
|
||||
.Ft void
|
||||
.Fn ieee80211_print_essid "u_int8_t *essid" "int len"
|
||||
.Fn ieee80211_suspend_all "struct ieee80211com *"
|
||||
.Ft void
|
||||
.Fn ieee80211_dump_pkt "u_int8_t *buf" "int len" "int rate" "int rssi"
|
||||
.Fn ieee80211_resume_all "struct ieee80211com *"
|
||||
.Pp
|
||||
.Dv enum ieee80211_state ;
|
||||
.Ft int
|
||||
.Fo ieee80211_fix_rate
|
||||
.Fa "struct ieee80211com *ic" "struct ieee80211_node *ni" "int flags"
|
||||
.Fc
|
||||
.Fn ieee80211_new_state "struct ieee80211vap *" "enum ieee80211_state" "int"
|
||||
.Pp
|
||||
.Ft void
|
||||
.Fn ieee80211_wait_for_parent "struct ieee80211com *"
|
||||
.Sh DESCRIPTION
|
||||
These
|
||||
functions are helper functions used throughout the software 802.11 protocol
|
||||
stack.
|
||||
The
|
||||
.Nm net80211
|
||||
layer that supports 802.11 device drivers uses a state machine
|
||||
to control operation of vaps.
|
||||
These state machines vary according to the vap operating mode.
|
||||
Station mode state machines follow the 802.11 MLME states
|
||||
in the protocol specification.
|
||||
Other state machines are simpler and reflect operational work
|
||||
such as scanning for a BSS or automatically selecting a channel to
|
||||
operate on.
|
||||
When multiple vaps are operational the state machines are used to
|
||||
coordinate operation such as choosing a channel.
|
||||
The state machine mechanism also serves to bind the
|
||||
.Nm net80211
|
||||
layer to a driver; this is described more below.
|
||||
.Pp
|
||||
The following states are defined for state machines:
|
||||
.Bl -tag -width IEEE80211_S_ASSOC
|
||||
.It Dv IEEE80211_S_INIT
|
||||
Default/initial state.
|
||||
A vap in this state should not hold any dynamic state (e.g. entries
|
||||
for associated stations in the node table).
|
||||
The driver must quiesce the hardware; e.g. there should be no
|
||||
interrupts firing.
|
||||
.It Dv IEEE80211_S_SCAN
|
||||
Scanning for a BSS or choosing a channel to operate on.
|
||||
Note that scanning can also take place in other states (e.g. when
|
||||
background scanning is active); this state is entered when
|
||||
initially bringing a vap to an operational state or after an
|
||||
event such as a beacon miss (in station mode).
|
||||
.It Dv IEEE80211_S_AUTH
|
||||
Authenticating to an access point (in station mode).
|
||||
This state is normally reached from
|
||||
.Dv IEEE80211_S_SCAN
|
||||
after selecting a BSS, but may also be reached from
|
||||
.Dv IEEE80211_S_ASSOC
|
||||
or
|
||||
.Dv IEEE80211_S_RUN
|
||||
if the authentication handshake fails.
|
||||
.It Dv IEEE80211_S_ASSOC
|
||||
Associating to an access point (in station mode).
|
||||
This state is reached from
|
||||
.Dv IEEE80211_S_AUTH
|
||||
after successfully authenticating or from
|
||||
.Dv IEEE80211_S_RUN
|
||||
if a DisAssoc frame is received.
|
||||
.It Dv IEEE80211_S_CAC
|
||||
Doing Channel Availability Check (CAC).
|
||||
This state is entered only when DFS is enabled and the channel selected
|
||||
for operation requires CAC.
|
||||
.It Dv IEEE80211_S_RUN
|
||||
Operational.
|
||||
In this state a vap can transmit data frames, accept requests for
|
||||
stations associating, etc.
|
||||
Beware that data traffic is also gated by whether the associated
|
||||
.Dq port
|
||||
is authorized.
|
||||
When WPA/802.11i/802.1x is operational authorization may happen separately;
|
||||
e.g. in station mode
|
||||
.Xr wpa_supplicant 8
|
||||
must complete the handshakes and plumb the necessary keys before a port
|
||||
is authorized.
|
||||
In this state a BSS is operational and associated state is valid and may
|
||||
be used; e.g.
|
||||
.Vt ic_bss
|
||||
and
|
||||
.Vt ic_bsschan
|
||||
are guaranteed to be usable.
|
||||
.It Dv IEEE80211_S_CSA
|
||||
Channel Switch Annoucememnt (CSA) is pending.
|
||||
This state is reached only from
|
||||
.Dv IEEE80211_S_RUN
|
||||
when either a CSA is received from an access point (in station mode)
|
||||
or the local station is preparing to change channel.
|
||||
In this state traffic may be muted depending on the Mute setting in the CSA.
|
||||
.It Dv IEEE80211_S_SLEEP
|
||||
Asleep to save power (in station mode).
|
||||
This state is reached only from
|
||||
.Dv IEEE80211_S_RUN
|
||||
when power save operation is enabled and the local station is deemed
|
||||
sufficiently idle to enter low power mode.
|
||||
.El
|
||||
.Pp
|
||||
Note that states are ordered (as shown above);
|
||||
e.g. a vap must be in the
|
||||
.Dv IEEE80211_S_RUN
|
||||
or
|
||||
.Dq greater
|
||||
before it can transmit frames.
|
||||
Certain
|
||||
.Nm net80211
|
||||
data are valid only in certain states; e.g. the
|
||||
.Vt iv_bsschan
|
||||
that specifies the channel for the operating BSS should never be used
|
||||
except in
|
||||
.Dv IEEE80211_S_RUN
|
||||
or greater.
|
||||
.Sh STATE CHANGES
|
||||
State machine changes are typically handled internal to the
|
||||
.Nm net80211
|
||||
layer in response to
|
||||
.Xr ioctl 2
|
||||
requests, received frames, or external events such as a beacon miss.
|
||||
The
|
||||
.Fn ieee80211_new_state
|
||||
function is used to initiate a state machine change on a vap.
|
||||
The new state and an optional argument are supplied.
|
||||
The request is initially processed to handle coordination of multiple vaps.
|
||||
For example, only one vap at a time can be scanning, if multiple vaps
|
||||
request a change to
|
||||
.Dv IEEE80211_S_SCAN
|
||||
the first will be permitted to run and the others will be
|
||||
.Em deferred
|
||||
until the scan operation completes at which time the selected channel
|
||||
will be adopted.
|
||||
Similarly
|
||||
.Nm net80211
|
||||
handles coordination of combinations of vaps such as an AP and station vap
|
||||
where the station may need to roam to follow the AP it is associated to
|
||||
(dragging along the AP vap to the new channel).
|
||||
Another important coordination is the handling of
|
||||
.Dv IEEE80211_S_CAC
|
||||
and
|
||||
.Dv IEEE80211_S_CSA .
|
||||
No more than one vap can ever be actively changing state at a time.
|
||||
In fact
|
||||
.Nm net80211
|
||||
single-threads the state machine logic in a dedicated
|
||||
.Xr taskqueue 9
|
||||
thread that is also used to synchronize work such as scanning and
|
||||
beacon miss handling.
|
||||
.Pp
|
||||
After multi-vap scheduling/coordination is done the per-vap
|
||||
.Vt iv_newstate
|
||||
method is called to carry out the state change work.
|
||||
Drivers use this entry to setup private state and then dispatch
|
||||
the call to the
|
||||
.Nm net80211
|
||||
layer using the previously defined method pointer (in OOP-parlance they
|
||||
call the
|
||||
.Dq super method
|
||||
).
|
||||
.Pp
|
||||
.Nm net80211
|
||||
handles two state changes specially.
|
||||
On transition to
|
||||
.Dv IEEE80211_S_RUN
|
||||
the
|
||||
.Dv IFF_DRV_OACTIVE
|
||||
bit on the vap's transmit queue is cleared so traffic can flow.
|
||||
On transition to
|
||||
.Dv IEEE80211_S_INIT
|
||||
any state in the scan cache associated with the vap is flushed
|
||||
and any frames pending on the transmit queue are flushed.
|
||||
.Sh DRIVER INTEGRATION
|
||||
Drivers are expected to override the
|
||||
.Vt iv_newstate
|
||||
method to interpose their own code and handle setup work required
|
||||
by state changes.
|
||||
Otherwise drivers must call
|
||||
.Fn ieee80211_start_all
|
||||
in response to being marked up through an
|
||||
.Dv SIOCSIFFLAGS
|
||||
ioctl request and they should use
|
||||
.Fn ieee80211_suspend_all
|
||||
and
|
||||
.Fn ieee80211_resume_all
|
||||
to implement suspend/resume support.
|
||||
.Pp
|
||||
There is also an
|
||||
.Fn ieee80211_stop_all
|
||||
call to force all vaps to an
|
||||
.Dv IEEE80211_S_INIT
|
||||
state but this should not be needed by a driver; control is usually
|
||||
handled by
|
||||
.Nm net80211
|
||||
or, in the case of card eject or vap destroy,
|
||||
work will be initiated outside the driver.
|
||||
.Sh SEE ALSO
|
||||
.Xr ioctl 2
|
||||
.Xr ieee80211 9 ,
|
||||
.Xr ifnet 9
|
||||
.Xr taskqueue 9
|
||||
.Xr wpa_supplicant 8
|
||||
.Sh HISTORY
|
||||
The
|
||||
The state machine concept was part of the original
|
||||
.Nm ieee80211
|
||||
series of functions first appeared in
|
||||
code base that first appeared in
|
||||
.Nx 1.5 ,
|
||||
and were later ported to
|
||||
.Fx 4.6 .
|
||||
.Sh AUTHORS
|
||||
.An -nosplit
|
||||
This manual page was written by
|
||||
.An Bruce M. Simpson Aq bms@FreeBSD.org
|
||||
and
|
||||
.An Darron Broad Aq darron@kewl.org .
|
||||
|
@ -26,210 +26,280 @@
|
||||
.\" SUCH DAMAGE.
|
||||
.\"
|
||||
.\" $FreeBSD$
|
||||
.\" $Id: ieee80211_radiotap.9,v 1.3 2004/03/04 11:38:52 bruce Exp $
|
||||
.\"
|
||||
.Dd March 17, 2008
|
||||
.Dd August 4, 2009
|
||||
.Dt IEEE80211_RADIOTAP 9
|
||||
.Os
|
||||
.Sh NAME
|
||||
.Nm ieee80211_radiotap
|
||||
.Nd software 802.11 stack packet capture definitions
|
||||
.Nd 802.11 device packet capture support
|
||||
.Sh SYNOPSIS
|
||||
.In net80211/ieee80211_var.h
|
||||
.In net80211/ieee80211_ioctl.h
|
||||
.In net80211/ieee80211_radiotap.h
|
||||
.In net/bpf.h
|
||||
.\"
|
||||
.Pp
|
||||
.Ft void
|
||||
.Fo ieee80211_radiotap_attach
|
||||
.Fa "struct ieee80211com *"
|
||||
.Fa "struct ieee80211_radiotap_header *th"
|
||||
.Fa "int tlen"
|
||||
.Fa "uint32_t tx_radiotap"
|
||||
.Fa "struct ieee80211_radiotap_header *rh"
|
||||
.Fa "int rlen"
|
||||
.Fa "uint32_t rx_radiotap"
|
||||
.Fc
|
||||
.\"
|
||||
.Ft int
|
||||
.Fn ieee80211_radiotap_active_vap "struct ieee80211vap *"
|
||||
.\"
|
||||
.Ft int
|
||||
.Fn ieee80211_radiotap_active "struct ieee80211com *"
|
||||
.\"
|
||||
.Ft void
|
||||
.Fn ieee80211_radiotap_tx "struct ieee80211vap *" "struct mbuf *"
|
||||
.Sh DESCRIPTION
|
||||
The
|
||||
.Nm
|
||||
definitions provide a device-independent
|
||||
.Xr bpf 4
|
||||
attachment for the
|
||||
capture of information about 802.11 traffic which is not part of
|
||||
the 802.11 frame structure.
|
||||
.Nm net80211
|
||||
layer used by 802.11 drivers includes support for a device-independent
|
||||
packet capture format called
|
||||
.Nm radiotap
|
||||
that is understood by tools such as
|
||||
.Xr tcpdump 1 .
|
||||
This facility is designed for capturing 802.11 traffic,
|
||||
including information that is not part of the normal 802.11 frame structure.
|
||||
.Pp
|
||||
Radiotap was designed to balance the desire for a capture format
|
||||
that conserved CPU and memory bandwidth on embedded systems,
|
||||
with the desire for a hardware-independent, extensible format
|
||||
that would support the diverse capabilities of virtually all
|
||||
802.11
|
||||
radios.
|
||||
.Pp
|
||||
These considerations led radiotap to settle on a format consisting of
|
||||
Radiotap was designed to balance the desire for a hardware-independent,
|
||||
extensible capture format against the need to
|
||||
conserve CPU and memory bandwidth on embedded systems.
|
||||
These considerations led to a format consisting of
|
||||
a standard preamble followed by an extensible bitmap indicating the
|
||||
presence of optional capture fields.
|
||||
A
|
||||
.Nm net80211
|
||||
device driver supporting
|
||||
.Vt radiotap
|
||||
defines two packed structures that it shares with
|
||||
.Nm net80211 .
|
||||
These structures embed an instance of a
|
||||
.Vt ieee80211_radiotap_header
|
||||
structure at the beginning,
|
||||
with subsequent fields in the appropriate order,
|
||||
and macros to set the bits of the
|
||||
.Va it_present
|
||||
bitmap to indicate which fields exist and are filled in by the driver.
|
||||
This information is then supplied through the
|
||||
.Fn ieee80211_radiotap_attach
|
||||
call after a successful
|
||||
.Fn ieee80211_ifattach
|
||||
request.
|
||||
.Pp
|
||||
The capture fields were packed into the header as compactly as possible,
|
||||
modulo the requirements that they had to be packed swiftly,
|
||||
with suitable alignment, in the same order as the bits indicating
|
||||
their presence.
|
||||
With radiotap setup, drivers just need to fill in per-packet
|
||||
capture state for frames sent/received and dispatch capture state
|
||||
in the transmit path (since control is not returned to the
|
||||
.Nm net80211
|
||||
layer before the packet is handed to the device).
|
||||
To minimize overhead this work should be done only when one
|
||||
or more processes are actively capturing data;
|
||||
this is checked with one of
|
||||
.Fn ieee80211_radiotap_active_vap
|
||||
and
|
||||
.Fn ieee80211_radiotap_active .
|
||||
In the transmit path capture work looks like this:
|
||||
.Pp
|
||||
This typically includes information such as signal quality and
|
||||
timestamps.
|
||||
This information may be used by a variety of user agents, including
|
||||
.Xr tcpdump 1 .
|
||||
It is requested by using the
|
||||
.Xr bpf 4
|
||||
data-link type
|
||||
.Dv DLT_IEEE802_11_RADIO .
|
||||
.Pp
|
||||
.\"
|
||||
Each frame using this attachment has the following header prepended to it:
|
||||
.Bd -literal -offset indent
|
||||
struct ieee80211_radiotap_header {
|
||||
u_int8_t it_version; /* set to 0 */
|
||||
u_int8_t it_pad;
|
||||
u_int16_t it_len; /* entire length */
|
||||
u_int32_t it_present; /* fields present */
|
||||
} __attribute__((__packed__));
|
||||
if (ieee80211_radiotap_active_vap(vap)) {
|
||||
... /* record transmit state */
|
||||
ieee80211_radiotap_tx(vap, m); /* capture transmit event */
|
||||
}
|
||||
.Ed
|
||||
.Pp
|
||||
While in the receive path capture is handled in
|
||||
.Nm net80211
|
||||
but state must be captured before dispatching a frame:
|
||||
.Pp
|
||||
.Bd -literal -offset indent
|
||||
if (ieee80211_radiotap_active(ic)) {
|
||||
... /* record receive state */
|
||||
}
|
||||
\&...
|
||||
ieee80211_input(...); /* packet capture handled in net80211 */
|
||||
.Ed
|
||||
.Pp
|
||||
.\"
|
||||
A device driver implementing
|
||||
.Vt radiotap
|
||||
typically defines a packed structure embedding an instance of
|
||||
.Vt "struct ieee80211_radiotap_header"
|
||||
at the beginning,
|
||||
with subsequent fields in the appropriate order,
|
||||
and a macro to set the bits of the
|
||||
.Va it_present
|
||||
bitmap to indicate which fields exist and are filled in by the driver.
|
||||
.\"
|
||||
.Pp
|
||||
Radiotap headers are copied to the userland via a separate bpf attachment.
|
||||
It is necessary for the driver to create this attachment after calling
|
||||
.Xr ieee80211_ifattach 9
|
||||
by calling
|
||||
.Fn bpfattach2
|
||||
with the data-link type set to
|
||||
.Dv DLT_IEEE802_11_RADIO .
|
||||
.Pp
|
||||
.\"
|
||||
When the the information is available,
|
||||
usually immediately before a link-layer transmission or after a receive,
|
||||
the driver copies it to the bpf layer using the
|
||||
.Fn bpf_mtap2
|
||||
function.
|
||||
.Pp
|
||||
.\"
|
||||
The following extension fields are defined for
|
||||
The following fields are defined for
|
||||
.Vt radiotap ,
|
||||
in the order in which they should appear in the buffer copied to userland:
|
||||
in the order in which they should appear in the buffer supplied
|
||||
to
|
||||
.Nm net80211 .
|
||||
.Bl -tag -width indent
|
||||
.It Dv IEEE80211_RADIOTAP_TSFT
|
||||
This field contains the unsigned 64-bit value, in microseconds,
|
||||
of the MAC's 802.11 Time Synchronization Function timer,
|
||||
of the MAC's 802.11 Time Synchronization Function (TSF).
|
||||
In theory, for each received frame, this value is recorded
|
||||
when the first bit of the MPDU arrived at the MAC.
|
||||
This field should be present for received frames only.
|
||||
In practice, hardware snapshots the TSF otherwise and one cannot assume
|
||||
this data is accurate without driver adjustment.
|
||||
.It Dv IEEE80211_RADIOTAP_FLAGS
|
||||
This field contains a single unsigned 8-bit value, containing a bitmap
|
||||
of flags specifying properties of the frame being transmitted or received.
|
||||
This field contains a single unsigned 8-bit value, containing one or
|
||||
more of these bit flags:
|
||||
.Bl -tag -width indent
|
||||
.It Dv IEEE80211_RADIOTAP_F_CFP
|
||||
Frame was sent/received during the Contention Free Period (CFP).
|
||||
.It Dv IEEE80211_RADIOTAP_F_SHORTPRE
|
||||
Frame was sent/received with short preamble.
|
||||
.It Dv IEEE80211_RADIOTAP_F_WEP
|
||||
Frame was encrypted.
|
||||
.It Dv IEEE80211_RADIOTAP_F_FRAG
|
||||
Frame was an 802.11 fragment.
|
||||
.It Dv IEEE80211_RADIOTAP_F_FCS
|
||||
Frame contents includes the FCS.
|
||||
.It Dv IEEE80211_RADIOTAP_F_DATAPAD
|
||||
Frame contents potentially has padding between the 802.11 header and the
|
||||
data payload to align the payload to a 32-bit boundary.
|
||||
.It Dv IEEE80211_RADIOTAP_F_BADFCS
|
||||
Frame was received with an invalid FCS.
|
||||
.It Dv IEEE80211_RADIOTAP_F_SHORTGI
|
||||
Frame was sent/received with Short Guard Interval.
|
||||
.El
|
||||
.It Dv IEEE80211_RADIOTAP_RATE
|
||||
This field contains a single unsigned 8-bit value, which is the data rate in
|
||||
use in units of 500Kbps.
|
||||
This field contains a single unsigned 8-bit value that is the data rate.
|
||||
Legacy rates are in units of 500Kbps.
|
||||
MCS rates (used on 802.11n/HT channels) have the high bit set and
|
||||
the MCS in the low 7 bits.
|
||||
.It Dv IEEE80211_RADIOTAP_CHANNEL
|
||||
This field contains two unsigned 16-bit values.
|
||||
The first value is the frequency upon which this PDU was transmitted
|
||||
or received.
|
||||
The second value is a bitmap containing flags which specify properties of
|
||||
the channel in use.
|
||||
These are documented within the header file,
|
||||
.In net80211/ieee80211_radiotap.h .
|
||||
.It Dv IEEE80211_RADIOTAP_FHSS
|
||||
This field contains two 8-bit values.
|
||||
This field should be present for frequency-hopping radios only.
|
||||
The first byte is the hop set.
|
||||
The second byte is the pattern in use.
|
||||
The first value is the center frequency for the channel
|
||||
the frame was sent/received on.
|
||||
The second value is a bitmap containing flags that specify channel properties.
|
||||
.Pp
|
||||
This field is deprecated in favor of
|
||||
.Dv IEEE80211_RADIOTAP_XCHANNEL
|
||||
but may be used to save space in the capture file for legacy devices.
|
||||
.\".It Dv IEEE80211_RADIOTAP_FHSS
|
||||
.\"This field contains two 8-bit values.
|
||||
.\"This field should be present only for frequency-hopping radios.
|
||||
.\"The first byte is the hop set.
|
||||
.\"The second byte is the pattern in use.
|
||||
.It Dv IEEE80211_RADIOTAP_DBM_ANTSIGNAL
|
||||
This field contains a single signed 8-bit value, which indicates the
|
||||
This field contains a single signed 8-bit value that indicates the
|
||||
RF signal power at the antenna, in decibels difference from 1mW.
|
||||
.It Dv IEEE80211_RADIOTAP_DBM_ANTNOISE
|
||||
This field contains a single signed 8-bit value, which indicates the
|
||||
This field contains a single signed 8-bit value that indicates the
|
||||
RF noise power at the antenna, in decibels difference from 1mW.
|
||||
.It Dv IEEE80211_RADIOTAP_LOCK_QUALITY
|
||||
This field contains a single unsigned 16-bit value, indicating the
|
||||
quality of the Barker Code lock.
|
||||
No unit is specified for this field.
|
||||
There does not appear to be a standard way of measuring this at this time;
|
||||
this quantity is often referred to as
|
||||
.Dq "Signal Quality"
|
||||
in some datasheets.
|
||||
.It Dv IEEE80211_RADIOTAP_TX_ATTENUATION
|
||||
This field contains a single unsigned 16-bit value, expressing transmit
|
||||
power as unitless distance from maximum power set at factory calibration.
|
||||
0 indicates maximum transmit power.
|
||||
Monotonically nondecreasing with lower power levels.
|
||||
.It Dv IEEE80211_RADIOTAP_DB_TX_ATTENUATION
|
||||
This field contains a single unsigned 16-bit value, expressing transmit
|
||||
power as decibel distance from maximum power set at factory calibration.
|
||||
0 indicates maximum transmit power.
|
||||
Monotonically nondecreasing with lower power levels.
|
||||
.\".It Dv IEEE80211_RADIOTAP_LOCK_QUALITY
|
||||
.\"This field contains a single unsigned 16-bit value, indicating the
|
||||
.\"quality of the Barker Code lock.
|
||||
.\"No unit is specified for this field.
|
||||
.\"There does not appear to be a standard way of measuring this at this time;
|
||||
.\"this quantity is often referred to as
|
||||
.\".Dq "Signal Quality"
|
||||
.\"in some datasheets.
|
||||
.\".It Dv IEEE80211_RADIOTAP_TX_ATTENUATION
|
||||
.\"This field contains a single unsigned 16-bit value, expressing transmit
|
||||
.\"power as unitless distance from maximum power set at factory calibration.
|
||||
.\"0 indicates maximum transmit power.
|
||||
.\"Monotonically nondecreasing with lower power levels.
|
||||
\.".It Dv IEEE80211_RADIOTAP_DB_TX_ATTENUATION
|
||||
\."This field contains a single unsigned 16-bit value, expressing transmit
|
||||
\."power as decibel distance from maximum power set at factory calibration.
|
||||
\."0 indicates maximum transmit power.
|
||||
\."Monotonically nondecreasing with lower power levels.
|
||||
.It Dv IEEE80211_RADIOTAP_DBM_TX_POWER
|
||||
Transmit power expressed as decibels from a 1mW reference.
|
||||
This field is a single signed 8-bit value.
|
||||
This is the absolute power level measured at the antenna port.
|
||||
.It Dv IEEE80211_RADIOTAP_ANTENNA
|
||||
For radios which support antenna diversity, this field contains a single
|
||||
unsigned 8-bit value specifying which antenna is being used to transmit
|
||||
or receive this frame.
|
||||
The first antenna is antenna 0.
|
||||
This field contains a single unsigned 8-bit value that specifies
|
||||
which antenna was used to transmit or receive the frame.
|
||||
Antenna numbering is device-specific but typically the primary antenna has
|
||||
the lowest number.
|
||||
On transmit a value of zero may be seen which typically means
|
||||
antenna selection is left to the device.
|
||||
.It Dv IEEE80211_RADIOTAP_DB_ANTSIGNAL
|
||||
This field contains a single unsigned 8-bit value, which indicates the
|
||||
This field contains a single unsigned 8-bit value that indicates the
|
||||
RF signal power at the antenna, in decibels difference from an
|
||||
arbitrary, fixed reference.
|
||||
.It Dv IEEE80211_RADIOTAP_DB_ANTNOISE
|
||||
This field contains a single unsigned 8-bit value, which indicates the
|
||||
This field contains a single unsigned 8-bit value that indicates the
|
||||
RF noise power at the antenna, in decibels difference from an
|
||||
arbitrary, fixed reference.
|
||||
.It Dv IEEE80211_RADIOTAP_EXT
|
||||
This bit is reserved for any future extensions to the
|
||||
.Vt radiotap
|
||||
structure.
|
||||
It should not be used at this time.
|
||||
.It Dv IEEE80211_RADIOTAP_XCHANNEL
|
||||
This field containts four values: a 32-bit unsigned bitmap of
|
||||
flags that describe the channel attributes, a 16-bit unsigned
|
||||
freqeuncy in MHz (typically the channel center), an 8-bit
|
||||
unsigned IEEE channel number, and a signed 8-bit value that
|
||||
holds the maximum regulatory transmit power cap in .5 dBm
|
||||
(8 bytes total).
|
||||
Channel flags are defined in:
|
||||
.In net80211/_ieee80211.h
|
||||
(only a subset are found in
|
||||
.In net80211/ieee80211_radiotap.h ).
|
||||
This property supersedes
|
||||
.Dv IEEE80211_RADIOTAP_CHANNEL
|
||||
and is the only way to completely express all
|
||||
channel attributes and the
|
||||
mapping between channel freqeuncy and IEEE channel number.
|
||||
.El
|
||||
.Sh EXAMPLES
|
||||
Radiotap header for the Cisco Aironet driver:
|
||||
Radiotap receive definitions for the Intersil Prims driver:
|
||||
.Bd -literal -offset indent
|
||||
struct an_rx_radiotap_header {
|
||||
struct ieee80211_radiotap_header ar_ihdr;
|
||||
u_int8_t ar_flags;
|
||||
u_int8_t ar_rate;
|
||||
u_int16_t ar_chan_freq;
|
||||
u_int16_t ar_chan_flags;
|
||||
u_int8_t ar_antsignal;
|
||||
u_int8_t ar_antnoise;
|
||||
} __attribute__((__packed__));
|
||||
#define WI_RX_RADIOTAP_PRESENT \\
|
||||
((1 << IEEE80211_RADIOTAP_TSFT) \\
|
||||
(1 << IEEE80211_RADIOTAP_FLAGS) | \\
|
||||
(1 << IEEE80211_RADIOTAP_RATE) | \\
|
||||
(1 << IEEE80211_RADIOTAP_CHANNEL) | \\
|
||||
(1 << IEEE80211_RADIOTAP_DB_ANTSIGNAL) | \\
|
||||
(1 << IEEE80211_RADIOTAP_DB_ANTNOISE))
|
||||
|
||||
struct wi_rx_radiotap_header {
|
||||
struct ieee80211_radiotap_header wr_ihdr;
|
||||
uint64_t wr_tsf;
|
||||
uint8_t wr_flags;
|
||||
uint8_t wr_rate;
|
||||
uint16_t wr_chan_freq;
|
||||
uint16_t wr_chan_flags;
|
||||
uint8_t wr_antsignal;
|
||||
uint8_t wr_antnoise;
|
||||
} __packed;
|
||||
.Ed
|
||||
.Pp
|
||||
Bitmap indicating which fields are present in the above structure:
|
||||
and transmit definitions for the Atheros driver:
|
||||
.Bd -literal -offset indent
|
||||
#define AN_RX_RADIOTAP_PRESENT \\
|
||||
((1 << IEEE80211_RADIOTAP_FLAGS) | \\
|
||||
(1 << IEEE80211_RADIOTAP_RATE) | \\
|
||||
(1 << IEEE80211_RADIOTAP_CHANNEL) | \\
|
||||
(1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL) | \\
|
||||
(1 << IEEE80211_RADIOTAP_DBM_ANTNOISE))
|
||||
#define ATH_TX_RADIOTAP_PRESENT ( \\
|
||||
(1 << IEEE80211_RADIOTAP_TSFT) | \\
|
||||
(1 << IEEE80211_RADIOTAP_FLAGS) | \\
|
||||
(1 << IEEE80211_RADIOTAP_RATE) | \\
|
||||
(1 << IEEE80211_RADIOTAP_DBM_TX_POWER) | \\
|
||||
(1 << IEEE80211_RADIOTAP_ANTENNA) | \\
|
||||
(1 << IEEE80211_RADIOTAP_XCHANNEL) | \\
|
||||
0)
|
||||
|
||||
struct ath_tx_radiotap_header {
|
||||
struct ieee80211_radiotap_header wt_ihdr;
|
||||
uint64_t wt_tsf;
|
||||
uint8_t wt_flags;
|
||||
uint8_t wt_rate;
|
||||
uint8_t wt_txpower;
|
||||
uint8_t wt_antenna;
|
||||
uint32_t wt_chan_flags;
|
||||
uint16_t wt_chan_freq;
|
||||
uint8_t wt_chan_ieee;
|
||||
int8_t wt_chan_maxpow;
|
||||
} __packed;
|
||||
.Ed
|
||||
.Sh SEE ALSO
|
||||
.Xr tcpdump 1 ,
|
||||
.Xr bpf 4 ,
|
||||
.Xr ieee80211 9
|
||||
.Sh HISTORY
|
||||
The
|
||||
.Nm
|
||||
definitions first appeared in
|
||||
.Nx 1.5 ,
|
||||
and were later ported to
|
||||
.Fx 4.6 .
|
||||
.Nx 1.5 .
|
||||
.\"
|
||||
.Sh AUTHORS
|
||||
.An -nosplit
|
||||
The
|
||||
.Nm
|
||||
interface was designed and implemented by
|
||||
.An David Young Aq dyoung@pobox.com .
|
||||
.Pp
|
||||
This manual page was written by
|
||||
The original version of this manual page was written by
|
||||
.An Bruce M. Simpson Aq bms@FreeBSD.org
|
||||
and
|
||||
.An Darron Broad Aq darron@kewl.org .
|
||||
|
143
share/man/man9/ieee80211_regdomain.9
Normal file
143
share/man/man9/ieee80211_regdomain.9
Normal file
@ -0,0 +1,143 @@
|
||||
.\"
|
||||
.\" Copyright (c) 2009 Sam Leffler, Errno Consulting
|
||||
.\" All rights reserved.
|
||||
.\"
|
||||
.\" Redistribution and use in source and binary forms, with or without
|
||||
.\" modification, are permitted provided that the following conditions
|
||||
.\" are met:
|
||||
.\" 1. Redistributions of source code must retain the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer.
|
||||
.\" 2. Redistributions in binary form must reproduce the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer in the
|
||||
.\" documentation and/or other materials provided with the distribution.
|
||||
.\"
|
||||
.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
.\" SUCH DAMAGE.
|
||||
.\"
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd August 4, 2009
|
||||
.Dt IEEE80211_REGDOMAIN 9
|
||||
.Os
|
||||
.Sh NAME
|
||||
.Nm ieee80211_regdomain
|
||||
.Nd 802.11 regulatory support
|
||||
.Sh SYNOPSIS
|
||||
.In net80211/ieee80211_var.h
|
||||
.In net80211/ieee80211_regdomain.h
|
||||
.Pp
|
||||
.Ft int
|
||||
.Fo ieee80211_init_channels
|
||||
.Fa "struct ieee80211com *"
|
||||
.Fa "const struct ieee80211_regdomain *"
|
||||
.Fa "const uint8_t bands[]"
|
||||
.Fc
|
||||
.\"
|
||||
.Ft void
|
||||
.Fo ieee80211_sort_channels
|
||||
.Fa "struct ieee80211_channel *"
|
||||
.Fa "int nchans"
|
||||
.Fc
|
||||
.\"
|
||||
.Ft "struct ieee80211_appie *"
|
||||
.Fn ieee80211_alloc_countryie "struct ieee80211com *"
|
||||
.Sh DESCRIPTION
|
||||
The
|
||||
.Nm net80211
|
||||
software layer provides a support framework for drivers that includes
|
||||
comprehensive regulatory support.
|
||||
.Nm net80211
|
||||
provides mechanisms that enforce
|
||||
.Em "regulatory policy"
|
||||
by privileged user applications.
|
||||
.Pp
|
||||
Drivers define a device's capabilities and can
|
||||
intercept and control regulatory changes requested through
|
||||
.Nm net80211 .
|
||||
The initial regulatory state, including the channel list, must be
|
||||
filled in by the driver before calling
|
||||
.Fn ieee80211_ifattach .
|
||||
The channel list should reflect the set of channels the device is
|
||||
.Em calibrated
|
||||
for use on.
|
||||
This list may also be requested later through the
|
||||
.Vt ic_getradiocaps
|
||||
method in the
|
||||
.Vt ieee80211com
|
||||
structure.
|
||||
The
|
||||
.Fn ieee80211_init_channels
|
||||
function is provided as a rudimentary fallback for drivers that do not
|
||||
(or cannot) fill in a proper channel list.
|
||||
Default regulatory state is supplied such as the regulatory SKU,
|
||||
ISO country code, location (e.g. indoor, outdoor), and a set of
|
||||
frequency bands the device is capable of operating on.
|
||||
.Nm net80211
|
||||
populates the channel table in
|
||||
.Vt ic_channels
|
||||
with a default set of channels and capabilities.
|
||||
Note this mechanism should be used with care as any mismatch between
|
||||
the channel list created and the device's capabilities can result
|
||||
in runtime errors (e.g. a request to operate on a channel the device
|
||||
does not support).
|
||||
The SKU and country information are used for generating 802.11h protocol
|
||||
elements and related operation such as for 802.11d; mis-setup by a
|
||||
driver is not fatal, only potentially confusing.
|
||||
.Pp
|
||||
Devices that do not have a fixed/default regulatory state can set
|
||||
the regulatory SKU to
|
||||
.Dv SKU_DEBUG
|
||||
and country code to
|
||||
.Dv CTRY_DEFAULT
|
||||
and leave proper setup to user applications.
|
||||
If default settings are known they can be installed and/or an event
|
||||
can be dispatched to user space using
|
||||
.Fn ieee80211_notify_country
|
||||
so that
|
||||
.Xr devd 8
|
||||
will do the appropriate setup work at system boot (or device insertion).
|
||||
.Pp
|
||||
The channel table is sorted to optimize lookups using the
|
||||
.Fn ieee80211_sort_channels
|
||||
routine.
|
||||
This should be done whenever the channel table contents are modified.
|
||||
.Pp
|
||||
The
|
||||
.Fn ieee80211_alloc_countrie
|
||||
function allocates an information element as specified by 802.11h.
|
||||
Because this is expensive to generate it is cached in
|
||||
.Vt ic_countryie
|
||||
and generated only when regulatory state changes.
|
||||
Drivers that call
|
||||
.Fn ieee80211_alloc_countryie
|
||||
directly should not help with this caching; doing so may confuse the
|
||||
.Nm net80211
|
||||
layer.
|
||||
.Sh DRIVER REGULATORY CONTROL
|
||||
Drivers can control regulatory change requests by overriding the
|
||||
.Vt ic_setregdomain
|
||||
method that checks change requests.
|
||||
While drivers can reject any request that does not meet its requirements
|
||||
it is recommended that one be lenient in what is accepted and, whenever
|
||||
possible, instead of rejecting a request, alter it to be correct.
|
||||
For example, if the transmit power cap for a channel is too high the
|
||||
driver can either reject the request or (better) reduce the cap to be
|
||||
compliant.
|
||||
Requests that include unacceptable channels should cause the request
|
||||
to be rejected as otherwise a mismatch may be created between application
|
||||
state and the state managed by
|
||||
.Nm net80211 .
|
||||
The exact rules by which to operate are still being codified.
|
||||
.Sh SEE ALSO
|
||||
.Xr regdomain 5 ,
|
||||
.Xr ifconfig 8 ,
|
||||
.Xr ieee80211 9 .
|
350
share/man/man9/ieee80211_scan.9
Normal file
350
share/man/man9/ieee80211_scan.9
Normal file
@ -0,0 +1,350 @@
|
||||
.\"
|
||||
.\" Copyright (c) 2009 Sam Leffler, Errno Consulting
|
||||
.\" All rights reserved.
|
||||
.\"
|
||||
.\" Redistribution and use in source and binary forms, with or without
|
||||
.\" modification, are permitted provided that the following conditions
|
||||
.\" are met:
|
||||
.\" 1. Redistributions of source code must retain the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer.
|
||||
.\" 2. Redistributions in binary form must reproduce the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer in the
|
||||
.\" documentation and/or other materials provided with the distribution.
|
||||
.\"
|
||||
.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
.\" SUCH DAMAGE.
|
||||
.\"
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd August 4, 2009
|
||||
.Dt IEEE80211_SCAN 9
|
||||
.Os
|
||||
.Sh NAME
|
||||
.Nm ieee80211_scan
|
||||
.Nd 802.11 scanning support
|
||||
.Sh SYNOPSIS
|
||||
.In net80211/ieee80211_var.h
|
||||
.Pp
|
||||
.Ft int
|
||||
.Fo ieee80211_start_scan
|
||||
.Fa "struct ieee80211vap *"
|
||||
.Fa "int flags"
|
||||
.Fa "u_int duration"
|
||||
.Fa "u_int mindwell"
|
||||
.Fa "u_int maxdwell"
|
||||
.Fa "u_int nssid"
|
||||
.Fa "const struct ieee80211_scan_ssid ssids[]"
|
||||
.Fc
|
||||
.\"
|
||||
.Ft int
|
||||
.Fo ieee80211_check_scan
|
||||
.Fa "struct ieee80211vap *"
|
||||
.Fa "int flags"
|
||||
.Fa "u_int duration"
|
||||
.Fa "u_int mindwell"
|
||||
.Fa "u_int maxdwell"
|
||||
.Fa "u_int nssid"
|
||||
.Fa "const struct ieee80211_scan_ssid ssids[]"
|
||||
.Fc
|
||||
.\"
|
||||
.Ft int
|
||||
.Fn ieee80211_check_scan_current "struct ieee80211vap *"
|
||||
.\"
|
||||
.Ft int
|
||||
.Fn ieee80211_bg_scan "struct ieee80211vap *" "int"
|
||||
.\"
|
||||
.Ft int
|
||||
.Fn ieee80211_cancel_scan "struct ieee80211vap *"
|
||||
.\"
|
||||
.Ft int
|
||||
.Fn ieee80211_cancel_scan_any "struct ieee80211vap *"
|
||||
.\"
|
||||
.Ft int
|
||||
.Fn ieee80211_scan_next "struct ieee80211vap *"
|
||||
.\"
|
||||
.Ft int
|
||||
.Fn ieee80211_scan_done "struct ieee80211vap *"
|
||||
.\"
|
||||
.Ft int
|
||||
.Fn ieee80211_probe_curchan "struct ieee80211vap *" "int"
|
||||
.\"
|
||||
.Ft void
|
||||
.Fo ieee80211_add_scan
|
||||
.Fa "struct ieee80211vap *"
|
||||
.Fa "const struct ieee80211_scanparams *"
|
||||
.Fa "const struct ieee80211_frame *"
|
||||
.Fa "int subtype"
|
||||
.Fa "int rssi"
|
||||
.Fa "int noise"
|
||||
.Fc
|
||||
.\"
|
||||
.Ft void
|
||||
.Fn ieee80211_scan_timeout "struct ieee80211com *"
|
||||
.\"
|
||||
.Ft void
|
||||
.Fo ieee80211_scan_assoc_fail
|
||||
.Fa "struct ieee80211vap *"
|
||||
.Fa "const uint8_t mac[IEEE80211_ADDR_LEN]"
|
||||
.Fa "int reason"
|
||||
.Fc
|
||||
.\"
|
||||
.Ft void
|
||||
.Fn ieee80211_scan_flush "struct ieee80211vap *"
|
||||
.\"
|
||||
.Ft void
|
||||
.Fo ieee80211_scan_iterate
|
||||
.Fa "struct ieee80211vap *"
|
||||
.Fa "ieee80211_scan_iter_func"
|
||||
.Fa "void *"
|
||||
.Fc
|
||||
.\"
|
||||
.Ft void
|
||||
.Fn ieee80211_scan_dump_channels "const struct ieee80211_scan_state *"
|
||||
.\"
|
||||
.Ft void
|
||||
.Fo ieee80211_scanner_register
|
||||
.Fa "enum ieee80211_opmode"
|
||||
.Fa "const struct ieee80211_scanner *"
|
||||
.Fc
|
||||
.\"
|
||||
.Ft void
|
||||
.Fo ieee80211_scanner_unregister
|
||||
.Fa "enum ieee80211_opmode"
|
||||
.Fa "const struct ieee80211_scanner *"
|
||||
.Fc
|
||||
.\"
|
||||
.Ft void
|
||||
.Fn ieee80211_scanner_unregister_all "const struct ieee80211_scanner *"
|
||||
.\"
|
||||
.Ft const struct ieee80211_scanner *
|
||||
.Fn ieee80211_scanner_get "enum ieee80211_opmode"
|
||||
.Sh DESCRIPTION
|
||||
The
|
||||
.Nm net80211
|
||||
software layer provides an extensible framework for scanning.
|
||||
Scanning is the procedure by which a station locates a BSS to join
|
||||
(in infrastructure and IBSS mode), or a channel to use (when operating
|
||||
as an AP or an IBSS master).
|
||||
Scans are either
|
||||
.Dq active
|
||||
or
|
||||
.Dq passive .
|
||||
An active scan causes one or more ProbeRequest frames to be sent on
|
||||
visiting each channel.
|
||||
A passive request causes each channel in the scan set to be visited but
|
||||
no frames to be transmitted; the station only listens for traffic.
|
||||
Note that active scanning may still need to listen for traffic before
|
||||
sending ProbeRequest frames depending on regulatory constraints.
|
||||
.Pp
|
||||
A scan operation involves constructing a set of channels to inspect
|
||||
(the scan set),
|
||||
visiting each channel and collecting information
|
||||
(e.g. what BSS are present),
|
||||
and then analyzing the results to make decisions such as which BSS to join.
|
||||
This process needs to be as fast as possible so
|
||||
.Nm net80211
|
||||
does things like intelligently construct scan sets and dwell on a channel
|
||||
only as long as necessary.
|
||||
Scan results are cached and the scan cache is used to avoid scanning when
|
||||
possible and to enable roaming between access points when operating
|
||||
in infrastructure mode.
|
||||
.Pp
|
||||
Scanning is handled by pluggable modules that implement
|
||||
.Em policy
|
||||
per-operating mode.
|
||||
The core scanning support provides an infrastructure to support these
|
||||
modules and exports a common API to the rest of the
|
||||
.Nm net80211
|
||||
layer.
|
||||
Policy modules decide what channels to visit, what state to record to
|
||||
make decisions, and selects the final station/channel to return as the
|
||||
result of a scan.
|
||||
.Pp
|
||||
Scanning is done synchronously when initially bringing a vap to
|
||||
an operational state and optionally in the background to maintain
|
||||
the scan cache for doing roaming and rogue AP monitoring.
|
||||
Scanning is not tied to the
|
||||
.Nm net80211
|
||||
state machine that governs vaps except for linkage to the
|
||||
.Dv IEEE80211_S_SCAN
|
||||
state.
|
||||
One one vap at a time may be scanning; this scheduling policy
|
||||
is handle in
|
||||
.Fn ieee80211_new_state
|
||||
and is transparent to scanning code.
|
||||
.Pp
|
||||
Scanning is controlled by a set of parameters that (potentially)
|
||||
constrains the channel set and any desired SSID's and BSSID's.
|
||||
.Nm net80211
|
||||
comes with a standard scanner module that works with all available
|
||||
operating modes and supports
|
||||
.Dq background scanning
|
||||
and
|
||||
.Dq roaming
|
||||
operation.
|
||||
.Sh SCANNER MODULES
|
||||
Scanning modules use a registration mechanism to hook into the
|
||||
.Nm net80211
|
||||
layer.
|
||||
Use
|
||||
.Fn ieee80211_scanner_register
|
||||
to register a scan module for a particular operating mode and
|
||||
.Fn ieee80211_scanner_unregister
|
||||
or
|
||||
.Fn ieee80211_scanner_unregister_all
|
||||
to clear entries (typically on module unload).
|
||||
Only one scanner module can be registered at any time for an operating mode.
|
||||
.Sh DRIVER SUPPORT
|
||||
Scanning operations are usually managed by the
|
||||
.Nm net80211
|
||||
layer.
|
||||
Drivers must provide
|
||||
.Vt ic_scan_start
|
||||
and
|
||||
.Vt ic_scan_stop
|
||||
methods that are called at the start of a scan and when the
|
||||
work is done; these should handle work such as enabling receive
|
||||
of Beacon and ProbeResponse frames and disable any BSSID matching.
|
||||
The
|
||||
.Vt ic_set_channel
|
||||
method is used to change channels while scanning.
|
||||
.Nm net80211
|
||||
will generate ProbeRequest frames and transmit them using the
|
||||
.Nm ic_raw_xmit
|
||||
method.
|
||||
Frames received while scanning are dispatched to
|
||||
.Nm net80211
|
||||
using the normal receive path.
|
||||
Devices that off-load scan work to firmware most easily mesh with
|
||||
.Nm net80211
|
||||
by operating on a channel-at-a-time basis as this defers control to
|
||||
.Nm net80211's
|
||||
scan machine scheduler.
|
||||
But multi-channel scanning
|
||||
is supported if the driver manually dispatches results using
|
||||
.Fn ieee80211_add_scan
|
||||
routine to enter results into the scan cache.
|
||||
.Sh SCAN REQUESTS
|
||||
Scan requests occur by way of the
|
||||
.Dv IEEE80211_SCAN_REQUEST
|
||||
ioctl or through a change in a vap's state machine that requires
|
||||
scanning.
|
||||
In both cases the scan cache can be checked first and, if it is deemed
|
||||
suitably
|
||||
.Dq warm
|
||||
then it's contents are used without leaving the current channel.
|
||||
To start a scan without checking the cache
|
||||
.Fn ieee80211_start_scan
|
||||
can be called; otherwise
|
||||
.Fn ieee80211_check_scan
|
||||
can be used to first check the scan cache, kicking off a scan if
|
||||
the cache contents are out of date.
|
||||
There is also
|
||||
.Fn ieee80211_check_scan_current
|
||||
which is a shorthand for using previously set scan parameters for
|
||||
checking the scan cache and then scanning.
|
||||
.Pp
|
||||
Background scanning is done using
|
||||
.Fn ieee80211_bg_scan
|
||||
in a co-routine fashion.
|
||||
The first call to this routine will start a background scan that
|
||||
runs for a limited period of time before returning to the BSS channel.
|
||||
Subsequent calls advance through the scan set until all channels are
|
||||
visited.
|
||||
Typically these later calls are timed to allow receipt of
|
||||
frames buffered by an access point for the station.
|
||||
.Pp
|
||||
A scan operation can be canceled using
|
||||
.Fn ieee80211_cancel_scan
|
||||
if it was initiated by the specified vap, or
|
||||
.Fn ieee80211_cancel_scan_any
|
||||
to force termination regardless which vap started it.
|
||||
These requests are mostly used by
|
||||
.Nm net80211
|
||||
in the transmit path to cancel background scans when frames are to be sent.
|
||||
Drivers should not need to use these calls (or most of the calls described
|
||||
on this page).
|
||||
.Pp
|
||||
The
|
||||
.Fn ieee80211_scan_next
|
||||
and
|
||||
.Fn ieee80211_scan_done
|
||||
routines do explicit iteration through the scan set and should
|
||||
not normally be used by drivers.
|
||||
.Fn ieee80211_probe_curchan
|
||||
handles the work of transmitting ProbeRequest frames when visiting
|
||||
a channel during an active scan.
|
||||
When the channel attributes are marked with
|
||||
.Dv IEEE80211_CHAN_PASSIVE
|
||||
this function will arrange that before any frame is transmitted 802.11
|
||||
traffic is first received (in order to comply with regulatory constraints).
|
||||
.Pp
|
||||
Min/max dwell time parameters are used to constrain time spent visiting
|
||||
a channel.
|
||||
The maximum dwell time constrains the time spent listening for traffic.
|
||||
The minimum dwell time is used to reduce this time--when it is reached
|
||||
and one or more frames have been received then an immediate channel
|
||||
change will be done.
|
||||
Drivers can override this behaviour through the
|
||||
.Vt iv_scan_mindwell
|
||||
method.
|
||||
.Sh SCAN CACHE MANAGEMENT
|
||||
The scan cache contents are managed by the scan policy module and
|
||||
are opaque outside this module.
|
||||
The
|
||||
.Nm net80211
|
||||
scan framework defines API's for interacting.
|
||||
The validity of the scan cache contents are controlled by
|
||||
.Vt iv_scanvalid
|
||||
which is exported to user space through the
|
||||
.Dv IEEE80211_SCAN_VALID
|
||||
request.
|
||||
.Pp
|
||||
The cache contents can be explicitly flushed with
|
||||
.Fn ieee80211_scan_flush
|
||||
or by setting the
|
||||
.Dv IEEE80211_SCAN_FLUSH
|
||||
flag when starting a scan operation.
|
||||
.Pp
|
||||
Scan cache entries are created with the
|
||||
.Fn ieee80211_add_scan
|
||||
routine; usually on receipt of Beacon or ProbeResponse frames.
|
||||
Existing entries are typically updated based on the latest information
|
||||
though some information such as RSSI and noise floor readings may be
|
||||
combined to present an average.
|
||||
.Pp
|
||||
The cache contents is aged through
|
||||
.Fn ieee80211_scan_timeout
|
||||
calls.
|
||||
Typically these happen together with other station table activity; every
|
||||
.Dv IEEE80211_INACT_WAIT
|
||||
seconds (default 15).
|
||||
.Pp
|
||||
Individual cache entries are marked usable with
|
||||
.Fn ieee80211_scan_assoc_success
|
||||
and faulty with
|
||||
.Fn ieee80211_scan_assoc_fail
|
||||
with the latter taking an argument to identify if there was no response
|
||||
to Authentication/Association requests or if a negative response was
|
||||
received (which might hasten cache eviction or blacklist the entry).
|
||||
.Pp
|
||||
The cache contents can be viewed using the
|
||||
.Fn ieee80211_scan_iterate
|
||||
call.
|
||||
Cache entries are exported in a public format that is exported to user
|
||||
applications through the
|
||||
.Dv IEEE80211_SCAN_RESULTS
|
||||
request.
|
||||
.Sh SEE ALSO
|
||||
.Xr ioctl 2 ,
|
||||
.Xr ieee80211 9 .
|
||||
.Xr ieee80211_proto 9 .
|
154
share/man/man9/ieee80211_vap.9
Normal file
154
share/man/man9/ieee80211_vap.9
Normal file
@ -0,0 +1,154 @@
|
||||
.\"
|
||||
.\" Copyright (c) 2009 Sam Leffler, Errno Consulting
|
||||
.\" All rights reserved.
|
||||
.\"
|
||||
.\" Redistribution and use in source and binary forms, with or without
|
||||
.\" modification, are permitted provided that the following conditions
|
||||
.\" are met:
|
||||
.\" 1. Redistributions of source code must retain the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer.
|
||||
.\" 2. Redistributions in binary form must reproduce the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer in the
|
||||
.\" documentation and/or other materials provided with the distribution.
|
||||
.\"
|
||||
.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
.\" SUCH DAMAGE.
|
||||
.\"
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd August 4, 2009
|
||||
.Dt IEEE8021_VAP 9
|
||||
.Os
|
||||
.Sh NAME
|
||||
.Nm net80211_vap
|
||||
.Nd 802.11 network layer virtual radio support
|
||||
.Sh SYNOPSIS
|
||||
.In net80211/ieee80211_var.h
|
||||
.Ft int
|
||||
.Fo ieee80211_vap_setup
|
||||
.Fa "struct ieee80211com *"
|
||||
.Fa "struct ieee80211vap *"
|
||||
.Fa "const char name[IFNAMSIZ]"
|
||||
.Fa "int unit"
|
||||
.Fa "int opmode"
|
||||
.Fa "int flags"
|
||||
.Fa "const uint8_t bssid[IEEE80211_ADDR_LEN]"
|
||||
.Fa "const uint8_t macaddr[IEEE80211_ADDR_LEN]"
|
||||
.Fc
|
||||
.\"
|
||||
.Ft int
|
||||
.Fo ieee80211_vap_attach
|
||||
.Fa "struct ieee80211vap *"
|
||||
.Fa "ifm_change_cb_t media_change"
|
||||
.Fa "ifm_stat_cb_t media_stat"
|
||||
.Fc
|
||||
.\"
|
||||
.Ft void
|
||||
.Fn ieee80211_vap_detach "struct ieee80211vap *"
|
||||
.Sh DESCRIPTION
|
||||
The
|
||||
.Nm net80211
|
||||
software layer provides a support framework for drivers that includes
|
||||
a virtual radio API that is exported to
|
||||
users through network interfaces (aka vaps) that are cloned from the
|
||||
underlying device.
|
||||
These interfaces have an operating mode
|
||||
(station, adhoc, hostap, wds, monitor, etc.)
|
||||
that is fixed for the lifetime of the interface.
|
||||
Devices that can support multiple concurrent interfaces allow
|
||||
multiple vaps to be cloned.
|
||||
.Pp
|
||||
The virtual radio interface defined by the
|
||||
.Nm net80211
|
||||
layer means that drivers must be structured to follow specific rules.
|
||||
Drivers that support only a single interface at any time must still
|
||||
follow these rules.
|
||||
.Pp
|
||||
The virtual radio architecture splits state between a single per-device
|
||||
.Vt ieee80211com
|
||||
structure and one or more
|
||||
.Vt ieee80211vap
|
||||
structures.
|
||||
Vaps are created with the
|
||||
.Dv SIOCIFCREATE2
|
||||
request.
|
||||
This results in a call into the driver's
|
||||
.Vt ic_vap_create
|
||||
method where the driver can decide if the request should be accepted.
|
||||
.Pp
|
||||
The vap creation process is done in three steps.
|
||||
First the driver allocates the data structure with
|
||||
.Xr malloc 9 .
|
||||
This data structure must have an
|
||||
.Vt ieee80211vap
|
||||
structure at the front but is usually extended with driver-private state.
|
||||
Next the vap is setup with a call to
|
||||
.Fn ieee80211_vap_setup .
|
||||
This request initializes
|
||||
.Nm net80211
|
||||
state but does not activate the interface.
|
||||
The driver can then override methods setup by
|
||||
.Nm net80211
|
||||
and setup driver resources before finally calling
|
||||
.Fn ieee80211_vap_attach
|
||||
to complete the process.
|
||||
Both these calls must be done without holding any driver locks as
|
||||
work may require the process block/sleep.
|
||||
.Pp
|
||||
A vap is deleted when an
|
||||
.Dv SIOCIFDESTROY
|
||||
ioctl request is made or when the device detaches (causing all
|
||||
associated vaps to automatically be deleted).
|
||||
Delete requests cause the
|
||||
.Vt ic_vap_delete
|
||||
method to be called.
|
||||
Drivers must quiesce the device before calling
|
||||
.Fn ieee80211_vap_detach
|
||||
to deactivate the vap and isolate it from activities such as requests
|
||||
from user applications.
|
||||
The driver can then reclaim resources held by the vap and re-enable
|
||||
device operation.
|
||||
The exact procedure for quiesceing a device is unspecified but typically
|
||||
it involves blocking interrupts and stopping transmit and receive
|
||||
processing.
|
||||
.Sh MULTI-VAP OPERATION
|
||||
Drivers are responsible for deciding if multiple vaps can be created
|
||||
and how to manage them.
|
||||
Whether or not multiple concurrent vaps can be supported depends on a
|
||||
device's capabilities.
|
||||
For example, multiple hostap vaps can usually be supported but many
|
||||
devices do not support assigning each vap a unique BSSID.
|
||||
If a device supports hostap operation it can usually support concurrent
|
||||
station mode vaps but possibly with limitations such as losing support
|
||||
for hardware beacon miss support.
|
||||
Devices that are capable of hostap operation and can send and receive
|
||||
4-address frames should be able to support WDS vaps together with an
|
||||
ap vap.
|
||||
But in contrast some devices cannot support WDS vaps without at least one
|
||||
ap vap (this however can be finessed by forcing the ap vap to not transmit
|
||||
beacon frames).
|
||||
All devices should support the creation of any number of monitor mode vaps
|
||||
concurrent with other vaps but it is the responsibility of the driver to
|
||||
allow this.
|
||||
.Pp
|
||||
An important consequence of supporting multiple concurrent vaps is that
|
||||
a driver's
|
||||
.Vt iv_newstate
|
||||
method must be written to handle being called for each vap.
|
||||
Where necessary, drivers must track private state for all vaps
|
||||
and not just the one whose state is being changed (e.g. for
|
||||
handling beacon timers the driver may need to know if all vaps
|
||||
that beacon are stopped before stopping the hardware timers).
|
||||
.Sh SEE ALSO
|
||||
.Xr ieee80211 9 ,
|
||||
.Xr ifnet 9 ,
|
||||
.Xr malloc 9 .
|
Loading…
Reference in New Issue
Block a user