ieee80211_regdomain
—
802.11 regulatory support
#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 *);
The net80211
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.
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.