NAME
ieee80211_regdomain
—
802.11 regulatory support
SYNOPSIS
#include
<net80211/ieee80211_var.h>
#include
<net80211/ieee80211_regdomain.h>
int
ieee80211_init_channels
(struct
ieee80211com *, const struct ieee80211_regdomain
*, const uint8_t bands[]);
void
ieee80211_sort_channels
(struct
ieee80211_channel *, int nchans);
struct ieee80211_appie *
ieee80211_alloc_countryie
(struct
ieee80211com *);
DESCRIPTION
Thenet80211
software layer provides a support framework
for drivers that includes comprehensive regulatory support.
net80211
provides mechanisms that enforce
regulatory
policy by privileged user applications.
Drivers define a device's capabilities and
can intercept and control regulatory changes requested through
net80211
. The initial regulatory state, including
the channel list, must be filled in by the driver before calling
ieee80211_ifattach
().
The channel list should reflect the set of channels the device is
calibrated
for use on. This list may also be requested later through the
ic_getradiocaps method in the
ieee80211com structure. The
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. net80211
populates the channel table in
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.
Devices that do not have a
fixed/default regulatory state can set the regulatory SKU to
SKU_DEBUG
and country code to
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
ieee80211_notify_country
()
so that devd(8) will do the appropriate setup work at system boot (or device
insertion).
The channel table is sorted to
optimize lookups using the
ieee80211_sort_channels
()
routine. This should be done whenever the channel table contents are
modified.
The
ieee80211_alloc_countryie
()
function allocates an information element as specified by 802.11h. Because
this is expensive to generate it is cached in
ic_countryie and generated only when regulatory state
changes. Drivers that call
ieee80211_alloc_countryie
() directly should not help
with this caching; doing so may confuse the net80211
layer.
DRIVER REGULATORY CONTROL
Drivers can control regulatory change requests by overriding the
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 net80211
. The exact rules
by which to operate are still being codified.