Multi-bss (aka vap) support for 802.11 devices.

Note this includes changes to all drivers and moves some device firmware
loading to use firmware(9) and a separate module (e.g. ral).  Also there
no longer are separate wlan_scan* modules; this functionality is now
bundled into the wlan module.

Supported by:	Hobnob and Marvell
Reviewed by:	many
Obtained from:	Atheros (some bits)
This commit is contained in:
Sam Leffler 2008-04-20 20:35:46 +00:00
parent f446360711
commit b032f27c36
155 changed files with 29730 additions and 22749 deletions

View File

@ -23,7 +23,10 @@ SRCS+= ifclone.c # clone device support
SRCS+= ifmac.c # MAC support
SRCS+= ifmedia.c # SIOC[GS]IFMEDIA support
SRCS+= ifvlan.c # SIOC[GS]ETVLAN support
SRCS+= ifieee80211.c # SIOC[GS]IEEE80211 support
SRCS+= ifieee80211.c regdomain.c # SIOC[GS]IEEE80211 support
DPADD+= ${LIBBSDXML} ${LIBSBUF}
LDADD+= -lbsdxml -lsbuf
SRCS+= ifcarp.c # SIOC[GS]VH support
SRCS+= ifgroup.c # ...
@ -34,8 +37,8 @@ SRCS+= iflagg.c # lagg support
.if ${MK_IPX_SUPPORT} != "no" && !defined(RELEASE_CRUNCH)
SRCS+= af_ipx.c # IPX support
DPADD= ${LIBIPX}
LDADD= -lipx
DPADD+= ${LIBIPX}
LDADD+= -lipx
.endif
MAN= ifconfig.8

View File

@ -28,7 +28,7 @@
.\" From: @(#)ifconfig.8 8.3 (Berkeley) 1/5/94
.\" $FreeBSD$
.\"
.Dd February 29, 2008
.Dd April 11, 2008
.Dt IFCONFIG 8
.Os
.Sh NAME
@ -584,8 +584,137 @@ If the interface was reset when previously marked down,
the hardware will be re-initialized.
.El
.Pp
The following parameters are specific to IEEE 802.11 wireless interfaces:
The following parameters are specific to cloning
IEEE 802.11 wireless interfaces with the
.Cm create
request:
.Bl -tag -width indent
.It Cm wlandev Ar device
Use
.Ar device
as the parent for the cloned device.
.It Cm wlanmode Ar mode
Specify the operating mode for this cloned device.
.Ar mode
is one of
.Cm sta ,
.Cm ahdemo
(or
.Cm adhoc-demo ),
.Cm ibss ,
(or
.Cm adhoc ),
.Cm ap ,
(or
.Cm hostap ),
.Cm wds ,
and
.Cm monitor .
The operating mode of a cloned interface cannot be changed.
.It Cm wlanbssid Ar bssid
The 802.11 mac address to use for the bssid.
This must be specified at create time for a legacy
.Cm wds
device.
.It Cm wlanaddr Ar address
The local mac address.
If this is not specified then a mac address will automatically be assigned
to the cloned device.
Typically this address is the same as the address of the parent device
but if the
.Cm bssid
parameter is specified then the driver will craft a unique address for
the device (if supported).
.It Cm wdslegacy
Mark a
.Cm wds
device as operating in ``legacy mode''.
Legacy
.Cm wds
devices have a fixed peer relationship and do not, for example, roam
if their peer stops communicating.
For completeness a Dynamic WDS (DWDS) interface may marked as
.Fl wdslegacy .
.It Cm bssid
Request a unique local mac address for the cloned device.
This is only possible if the device supports multiple mac addresses.
To force use of the parent's mac address use
.Fl bssid .
.It Cm beacons
Mark the cloned interface as depending on hardware support to
track received beacons.
To have beacons tracked in software use
.Fl beacons .
For
.Cm hostap
mode
.Fl beacons
can also be used to indicate no beacons should
be transmitted; this can be useful when creating a WDS configuration but
.Cm wds
interfaces can only be created as companions to an access point.
.El
.Pp
The following parameters are specific to IEEE 802.11 wireless interfaces
cloned with a
.Cm create
operation:
.Bl -tag -width indent
.It Cm ampdu
Enable sending and receiving AMPDU frames when using 802.11n (default).
The 802.11n specification states a compliant station must be capable
of receiving AMPDU frames but transmision is optional.
Use
.Fl ampdu
to disable all use of AMPDU with 802.11n.
For testing and/or to work around interoperability problems one can use
.Cm ampdutx
and
.Cm ampdurx
to control use of AMPDU in one direction.
.It Cm ampdudensity Ar density
Set the AMPDU density parameter used when operating with 802.11n.
This parameter controls the inter-packet gap for AMPDU frames.
The sending device normally controls this setting but a receiving station
may request wider gaps.
Legal values for
.Ar density
are 0, .25, .5, 1, 2, 4, 8, and 16 (microseconds).
A value of
.Cm -
is treated the same as 0.
.It Cm ampdulimit Ar limit
Set the limit on packet size for receiving AMPDU frames when operating
with 802.11n.
Legal values for
.Ar limit
are 8192, 16384, 32768, and 65536 but one can also specify
just the unique prefix: 8, 16, 32, 64.
Note the sender may limit the size of AMPDU frames to be less
than the maximum specified by the receiving station.
.It Cm amsdu
Enable sending and receiving AMSDU frames when using 802.11n.
By default AMSDU is received but not transmitted.
Use
.Fl amsdu
to disable all use of AMSDU with 802.11n.
For testing and/or to work around interoperability problems one can use
.Cm amsdutx
and
.Cm amsdurx
to control use of AMSDU in one direction.
.It Cm amsdulimit Ar limit
Set the limit on packet size for sending and receiving AMSDU frames
when operating with 802.11n.
Legal values for
.Ar limit
are 7935 and 3839 (bytes).
Note the sender may limit the size of AMSDU frames to be less
than the maximum specified by the receiving station.
Note also that devices are not required to support the 7935 limit,
only 3839 is required by the specification and the larger value
may require more memory to be dedicated to support functionality
that is rarely used.
.It Cm apbridge
When operating as an access point, pass packets between
wireless clients directly (default).
@ -597,7 +726,7 @@ is useful when traffic is to be processed with
packet filtering.
.It Cm authmode Ar mode
Set the desired authentication mode in infrastructure mode.
Not all adaptors support all modes.
Not all adapters support all modes.
The set of
valid modes is
.Cm none , open , shared
@ -725,7 +854,7 @@ or
.Cm -
will give you the default for your adaptor.
Some
adaptors ignore this setting unless you are in ad-hoc mode.
adapters ignore this setting unless you are in ad-hoc mode.
Alternatively the frequency, in megahertz, may be specified
instead of the channel number.
.Pp
@ -770,9 +899,61 @@ a 40MHz HT channel specification may include the location
of the extension channel by appending ``+'' or ``-'' for above and below,
respectively; e.g. ``2437:ht/40+'' specifies 40MHz wide HT operation
with the center channel at frequency 2437 and the extension channel above.
.It Cm country Ar name
Set the country code to use in calculating the regulatory constraints
for operation.
In particular the set of available channels, how the wireless device
will operation on the channels, and the maximum transmit power that
can be used on a channel are defined by this setting.
Country/Region codes are specified as a 2-character abbreviation
defined by ISO 3166 or using a longer, but possibly ambiguous, spelling;
e.g. "ES" and "Spain".
The set of country codes are taken from /etc/regdomain.xml and can also
be viewed with the ``list countries'' request.
Note that not all devices support changing the country code from a default
setting; typically stored in EEPROM.
See also
.Cm regdomain ,
.Cm indoor ,
.Cm outdoor ,
and
.Cm anywhere .
.It Cm dfs
Enable Dynamic Frequency Selection (DFS) as specified in 802.11h.
DFS embodies several facilities including detection of overlapping
radar signals, dynamic transmit power control, and channel selection
according to a least-congested criteria.
DFS support is mandatory for some 5Ghz frequencies in certain
locales (e.g. ETSI).
By default DFS is enabled according to the regulatory definitions
specified in /etc/regdomain.xml and the curent country code, regdomain,
and channel.
Note the underlying device (and driver) must support radar detection
for full DFS support to work.
To be fully compliant with the local regulatory agency frequencies that
require DFS should not be used unless it is fully supported.
Use
.Fl dfs
to disable this functionality for testing.
.It Cm dotd
Enable support for the 802.11d specification (default).
When this support is enabled in station mode, beacon frames that advertise
a country code different than the currently configured country code will
cause an event to be dispatched to user applications.
This event can be used by the station to adopt that country code and
operate according to the associated regulatory constraints.
When operating as an access point with 802.11d enabled the beacon and
probe response frames transmitted will advertise the current regulatory
domain settings.
To disable 802.11d use
.Fl dotd .
.It Cm doth
Enable inclusion of an 802.11h country information element in beacon
frames transmitted when operating as an access point.
Enable 802.11h support including spectrum management.
When 802.11h is enabled beacon and probe response frames will have
the SpectrumMgt bit set in the capabilities field and
country and power constraint information elements will be present.
802.11h support also includes handling Channel Switch Announcements (CSA)
which are a mechanism to coordinate channel changes by an access point.
By default 802.11h is enabled if the device is capable.
To disable 802.11h use
.Fl doth .
@ -811,28 +992,35 @@ channels depending on the regulatory constraints; use the
command to identify the channels where turbo mode may be used.
To disable Dynamic Turbo mode use
.Fl dturbo .
.It Cm fragthreshold Ar length
Set the threshold for which transmitted frames are broken into fragments.
The
.Ar length
argument is the frame size in bytes and must be in the range 256 to 2346.
Setting
.Ar length
to
.Li 2346 ,
.Cm any ,
or
.Cm -
disables transmit fragmentation.
Not all adaptors honor the fragmentation threshold.
.It Cm hidessid
When operating as an access point, do not broadcast the SSID
in beacon frames or respond to probe request frames unless
they are directed to the ap (i.e., they include the ap's SSID).
By default, the SSID is included in beacon frames and
undirected probe request frames are answered.
To re-enable the broadcast of the SSID etc., use
.Fl hidessid .
.It Cm dwds
Enable Dynamic WDS (DWDS) support.
DWDS is a facility by which 4-address traffic can be carried between
stations operating in infrastructure mode.
A station first associates to an access point and authenticates using
normal procedures (e.g. WPA).
Then 4-address frames are passed to carry traffic for stations
operating on either side of the wireless link.
DWDS extends the normal WDS mechanism by leveraging existing security
protocols and eliminating static binding.
.Pp
When DWDS is enabled on an access point 4-address frames received from
an authorized station will generate a ``DWDS discovery'' event to user
applications.
This event should be used to create a WDS interface that is bound
to the remote station (and usually plumbed into a bridge).
Once the WDS interface is up and running 4-address traffic then logically
flows through that interface.
.Pp
When DWDS is enabled on a station, traffic with a destination address
different from the peer station are encapsulated in a 4-address frame
and transmitted to the peer.
All 4-address traffic uses the security information of the stations
(e.g. cryptographic keys).
A station is associated using 802.11n facilities may transport
4-address traffic using these same mechanisms; this depends on available
resources and capabilities of the device.
The DWDS implementation guards against layer 2 routing loops of
multicast traffic.
.It Cm ff
Enable the use of Atheros Fast Frames when communicating with
another Fast Frames-capable station.
@ -846,6 +1034,98 @@ non-Atheros devices.
By default, use of fast frames is enabled if the device is capable.
To explicitly disable fast frames, use
.Fl ff .
.It Cm fragthreshold Ar length
Set the threshold for which transmitted frames are broken into fragments.
The
.Ar length
argument is the frame size in bytes and must be in the range 256 to 2346.
Setting
.Ar length
to
.Li 2346 ,
.Cm any ,
or
.Cm -
disables transmit fragmentation.
Not all adapters honor the fragmentation threshold.
.It Cm hidessid
When operating as an access point, do not broadcast the SSID
in beacon frames or respond to probe request frames unless
they are directed to the ap (i.e., they include the ap's SSID).
By default, the SSID is included in beacon frames and
undirected probe request frames are answered.
To re-enable the broadcast of the SSID etc., use
.Fl hidessid .
.It Cm ht
Enable use of High Throughput (HT) when using 802.11n (default).
The 802.11n specification includes mechanisms for operation
on 20MHz and 40MHz wide channels using different signalling mechanisms
than specified in 802.11b, 802.11g, and 802.11a.
Stations negotiate use of these facilities, termed HT20 and HT40,
when they associate.
To disable all use of 802.11n use
.Fl ht .
To disable use of HT20 (e.g. to force only HT40 use) use
.Fl ht20 .
To disable use of HT40 use
.Fl ht40 .
.Pp
HT configuration is used to ``auto promote'' operation
when several choices are available.
For example, if a station associates to an 11n-capable access point
it controls whether the station uses legacy operation, HT20, or HT40.
When an 11n-capable device is setup as an access point and
Auto Channel Selection is used to locate a channel to operate on,
HT configuration controls whether legacy, HT20, or HT40 operation is setup
on the selected channel.
If a fixed channel is specified for a station then HT configuration can
be given as part of the channel specification; e.g. 6:ht/20 to setup
HT20 operation on channel 6.
.It Cm htcompat
Enable use of compatibility support for pre-802.11n devices (default).
The 802.11n protocol specification went through several incompatible iterations.
Some vendors implemented 11n support to older specifications that
will not interoperate with a purely 11n-compliant station.
In particular the information elements included in management frames
for old devices are different.
When compatibility support is enabled both standard and compatible data
will be provided.
Stations that associate using the compatiblity mechanisms are flagged
in ``list sta''.
To disable compatiblity support use
.Fl htcompat .
.It Cm htprotmode Ar technique
For interfaces operating in 802.11n, use the specified
.Ar technique
for protecting HT frames in a mixed legacy/HT network.
The set of valid techniques is
.Cm off ,
and
.Cm rts
(RTS/CTS, default).
Technique names are case insensitive.
.It Cm inact
Enable inactivity processing for stations associated to an
access point (default).
When operating as an access point the 802.11 layer monitors
the activity of each associated station.
When a station is inactive for 5 minutes it will send several
``probe frames'' to see if the station is still present.
If no response is received then the station is deauthenticated.
Applications that prefer to handle this work can disable this
facility by using
.Fl inact .
.It Cm indoor
Set the location to use in calculating regulatory constraints.
The location is also advertised in beacon and probe response frames
when 802.11d is enabled with
.Cm dotd .
See also
.Cm outdoor ,
.Cm anywhere ,
.Cm country ,
and
.Cm regdomain .
.It Cm list active
Display the list of channels available for use taking into account
any restrictions set with the
@ -883,6 +1163,9 @@ is another way of requesting this information.
By default a compacted list of channels is displayed; if the
.Fl v
option is specified then all channels are shown.
.It Cm list countries
Display the set of country codes and regulatory domains that can be
used in regulatory configuration.
.It Cm list mac
Display the current MAC Access Control List state.
Each address is prefixed with a character that indicates the
@ -894,18 +1177,79 @@ indicates the address is denied access,
.Ql *
indicates the address is present but the current policy open
(so the ACL is not consulted).
.It Cm list regdomain
Display the current regulatory settings including the available channels
and transmit power caps.
.It Cm list roam
Display the parameters that govern roaming operation.
.It Cm list txparam
Display the parameters that govern transmit operation.
.It Cm list txpower
Display the transmit power caps for each channel.
.It Cm list scan
Display the access points and/or ad-hoc neighbors
located in the vicinity.
The
.Fl v
flag may be used to display long SSIDs.
.Fl v
also causes received information elements to be displayed symbolicaly.
This information may be updated automatically by the adaptor
and/or with a
This information may be updated automatically by the adapter
with a
.Cm scan
request or through background scanning.
Depending on the capabilities of the stations the following
flags can be included in the output:
.Bl -tag -width 3n
.It Li A
Authorized.
Indicates that the station is permitted to send/receive data frames.
.It Li E
Extended Rate Phy (ERP).
Indicates that the station is operating in an 802.11g network
using extended transmit rates.
.It Li H
High Throughput (HT).
Indicates that the station is using HT transmit rates.
If a `+' follows immediately after then the station associated
using deprecated mechanisms supported only when
.Cm htcompat
is enabled.
.It Li P
Power Save.
Indicates that the station is operating in power save mode.
.It Li Q
Quality of Service (QoS).
Indicates that the station is using QoS encapsulation for
data frame.
QoS encapsulation is enabled only when WME mode is enabled.
.It Li T
Transitional Security Network (TSN).
Indicates that the station associated using TSN; see also
.Cm tsn
below.
.It Li W
Wi-Fi Protected Setup (WPS).
Indicates that the station associated using WPS.
.El
.Pp
By default interesting information elements captured from the neighboring
stations are displayed at the end of each row.
Possible elements include:
.Cm WME
(station supports WME),
.Cm WPA
(station supports WPA),
.Cm RSN
(station supports 802.11i/RSN),
.Cm HTCAP
(station supports 802.11n/HT communication),
.Cm ATH
(station supoprts Atheros protocol extensions),
.Cm VEN
(station supports unknown vendor-specific extensions).
If the
.Fl v
flag is used all the information elements and their
contents will be shown.
Specifying The
.Fl v
flag also enables display of long SSIDs.
.Cm list ap
is another way of requesting this information.
.It Cm list sta
@ -930,7 +1274,11 @@ Indicates that the station is operating in an 802.11g network
using extended transmit rates.
.It Li H
High Throughput (HT).
Indicates that the station is using MCS to send/receive frames.
Indicates that the station is using HT transmit rates.
If a `+' follows immediately after then the station associated
using deprecated mechanisms supported only when
.Cm htcompat
is enabled.
.It Li P
Power Save.
Indicates that the station is operating in power save mode.
@ -939,6 +1287,14 @@ Quality of Service (QoS).
Indicates that the station is using QoS encapsulation for
data frame.
QoS encapsulation is enabled only when WME mode is enabled.
.It Li T
Transitional Security Network (TSN).
Indicates that the station associated using TSN; see also
.Cm tsn
below.
.It Li W
Wi-Fi Protected Setup (WPS).
Indicates that the station associated using WPS.
.El
.Pp
By default information elements received from associated stations
@ -953,12 +1309,30 @@ for examining parameters when WME mode is disabled.
See the description of the
.Cm wme
directive for information on the various parameters.
.It Cm maxretry Ar count
Set the maximum number of tries to use in sending unicast frames.
The default setting is 6 but drivers may override this with a value
they choose.
.It Cm mcastrate Ar rate
Set the rate for transmitting multicast/broadcast frames.
Rates are specified as megabits/second in decimal; e.g.\& 5.5 for 5.5 Mb/s.
This rate should be valid for the current operating conditions;
if an invalid rate is specified drivers are free to chose an
appropriate rate.
.It Cm mgtrate Ar rate
Set the rate for transmitting management and/or control frames.
Rates are specified as megabits/second in decimal; e.g.\& 5.5 for 5.5 Mb/s.
.It Cm outdoor
Set the location to use in calculating regulatory constraints.
The location is also advertised in beacon and probe response frames
when 802.11d is enabled with
.Cm dotd .
See also
.Cm anywhere ,
.Cm country ,
.Cm indoor ,
and
.Cm regdomain .
.It Cm powersave
Enable powersave operation.
When operating as a client, the station will conserve power by
@ -994,6 +1368,60 @@ When operating as an access point in 802.11g mode allow only
permitted to associate).
To allow both 11g and 11b-only stations to associate, use
.Fl pureg .
.It Cm puren
When operating as an access point in 802.11n mode allow only
HT-capable stations to associate (legacy stations are not
permitted to associate).
To allow both HT and legacy stations to associate, use
.Fl puren .
.It Cm regdomain Ar sku
Set the regulatory domain to use in calculating the regulatory constraints
for operation.
In particular the set of available channels, how the wireless device
will operation on the channels, and the maximum transmit power that
can be used on a channel are defined by this setting.
Regdomain codes (SKU's) are taken from /etc/regdomain.xml and can also
be viewed with the ``list countries'' request.
Note that not all devices support changing the regdomain from a default
setting; typically stored in EEPROM.
See also
.Cm country ,
.Cm indoor ,
.Cm outdoor ,
and
.Cm anywhere .
.It Cm roam:rate Ar rate
Set the threshold for controlling roaming when operating in a BSS.
The
.Ar rate
parameter specifies the transmit rate in megabits
at which roaming should be considered.
If the current transmit rate drops below this setting and background scanning
is enabled, then the system will check if a more desirable access point is
available and switch over to it.
The current scan cache contents are used if they are considered
valid according to the
.Cm scanvalid
parameter; otherwise a background scan operation is triggered before
any selection occurs.
Each channel type has a separate rate threshold; the default values are:
12 Mb/s (11a), 2 Mb/s (11b), 2 Mb/s (11g), MCS 1 (11na, 11ng).
.It Cm roam:rssi Ar rssi
Set the threshold for controlling roaming when operating in a BSS.
The
.Ar rssi
parameter specifies the receive signal strength in dBm units
at which roaming should be considered.
If the current rssi drops below this setting and background scanning
is enabled, then the system will check if a more desirable access point is
available and switch over to it.
The current scan cache contents are used if they are considered
valid according to the
.Cm scanvalid
parameter; otherwise a background scan operation is triggered before
any selection occurs.
Rach channel type has a separate rssi threshold; the default values are
all 7 dBm.
.It Cm roaming Ar mode
When operating as a station, control how the system will
behave when communication with the current access point
@ -1013,78 +1441,6 @@ attempt to reestablish communication.
Manual mode is used by applications such as
.Xr wpa_supplicant 8
that want to control the selection of an access point.
.It Cm roam:rssi11a Ar rssi
Set the threshold for controlling roaming when operating in an
802.11a BSS.
The
.Ar rssi
parameter specifies the receive signal strength in dBm units
at which roaming should be considered.
If the current rssi drops below this setting and background scanning
is enabled, then the system will check if a more desirable access point is
available and switch over to it.
The current scan cache contents are used if they are considered
valid according to the
.Cm scanvalid
parameter; otherwise a background scan operation is triggered before
any selection occurs.
By default
.Ar rssi
is set to 7 dBm.
.It Cm roam:rssi11b Ar rssi
Set the threshold for controlling roaming when operating in an
802.11b-only BSS.
See
.Cm roam:rssi11a
for a description of this parameter.
By default
.Ar rssi
is set to 7 dBm.
.It Cm roam:rssi11g Ar rssi
Set the threshold for controlling roaming when operating in a
(mixed) 802.11g BSS.
See
.Cm roam:rssi11a
for a description of this parameter.
By default
.Ar rssi
is set to 7 dBm.
.It Cm roam:rate11a Ar rate
Set the threshold for controlling roaming when operating in an
802.11a BSS.
The
.Ar rate
parameter specifies the transmit rate in megabits
at which roaming should be considered.
If the current transmit rate drops below this setting and background scanning
is enabled, then the system will check if a more desirable access point is
available and switch over to it.
The current scan cache contents are used if they are considered
valid according to the
.Cm scanvalid
parameter; otherwise a background scan operation is triggered before
any selection occurs.
By default
.Ar rate
is set to 12 Mb/s.
.It Cm roam:rate11b Ar rate
Set the threshold for controlling roaming when operating in an
802.11b-only BSS.
See
.Cm roam:rate11a
for a description of this parameter.
By default
.Ar rate
is set to 1 Mb/s.
.It Cm roam:rate11g Ar rate
Set the threshold for controlling roaming when operating in a
(mixed) 802.11g BSS.
See
.Cm roam:rate11a
for a description of this parameter.
By default
.Ar rate
is set to 5 Mb/s.
.It Cm rtsthreshold Ar length
Set the threshold for which
transmitted frames are preceded by transmission of an
@ -1102,93 +1458,20 @@ to
or
.Cm -
disables transmission of RTS frames.
Not all adaptors support setting the RTS threshold.
.It Cm ssid Ar ssid
Set the desired Service Set Identifier (aka network name).
The SSID is a string up to 32 characters
in length and may be specified as either a normal string or in
hexadecimal when preceded by
.Ql 0x .
Additionally, the SSID may be cleared by setting it to
.Ql - .
Not all adapters support setting the RTS threshold.
.It Cm scan
Initiate a scan of neighboring stations, wait for it to complete, and
display all stations found.
Only the super-user can initiate a scan.
Depending on the capabilities of the APs, the following
flags can be included in the output:
.Bl -tag -width 3n
.It Li A
Channel Agility.
Indicates that the station support channel hopping as described by the
IEEE 802.11b specification.
.It Li B
Packet Binary Convolution Code (PBCC).
A modulation alternative to the standard OFDM method.
.It Dv C
Pollreq
.It Dv c
Pollable
.It Dv D
Direct Sequence Spread Spectrum (DSSSOFDM).
Indicates the the station supports DSSS modulation.
.It Li E
Extended Service Set (ESS).
Indicates that the station is part of an infrastructure network
(in contrast to an IBSS/ad-hoc network).
.It Li I
IBSS/ad-hoc network.
Indicates that the station is part of an ad-hoc network
(in contrast to an ESS network).
.It Li P
Privacy.
Data confidentiality is required for all data frames
exchanged within the BSS.
This means that this BSS requires the station to
use cryptographic means such as WEP, TKIP or AES-CCMP to
encrypt/decrypt data frames being exchanged with others.
.It Dv R
Robust Security Network (RSN).
Indicates that the station supports the IEEE 802.11i authentication
and key management protocol.
.It Li S
Short Preamble.
Indicates that the network is using short preambles (defined
in 802.11b High Rate/DSSS PHY, short preamble utilizes a
56 bit sync field in contrast to a 128 bit field used in long
preamble mode).
.It Li s
Short slot time.
Indicates that the network is using a short slot time.
.El
.Pp
Interesting information elements captured from the neighboring
stations are displayed at the end of each row.
Possible elements are:
.Cm WME
(station supports WME),
.Cm WPA
(station supports WPA),
.Cm RSN
(station supports 802.11i/RSN),
.Cm HT
(station supports 802.11n/HT communication),
.Cm ATH
(station supoprts Atheros protocol extensions),
.Cm VEN
(station supports unknown vendor-specific extensions).
If the
.Fl v
flag is used the information element contents will be shown.
.Pp
See
.Cm list scan
for information on the display.
By default a background scan is done; otherwise a foreground
scan is done and the station may roam to a different access point.
The
.Cm list scan
request can be used to show recent scan results without
initiating a new scan.
.Pp
The
.Fl v
flag may be used to prevent the shortening of long SSIDs.
.It Cm scanvalid Ar threshold
Set the maximum time the scan cache contents are considered valid;
i.e. will be used without first triggering a scan operation to
@ -1202,13 +1485,25 @@ is 10 seconds.
One should take care setting this threshold; if it is set too low
then attempts to roam to another access point may trigger unnecessary
background scan operations.
.It Cm stationname Ar name
Set the name of this station.
The station name is not part of the IEEE 802.11
protocol though some interfaces support it.
As such it only
seems to be meaningful to identical or virtually identical equipment.
Setting the station name is identical in syntax to setting the SSID.
.It Cm shortgi
Enable use of Short Guard Interval when operating in 802.11n
on an HT channel.
NB: this currently enables Short GI on both HT40 and HT20 channels.
To disable Short GI use
.Fl shortgi .
.It Cm ssid Ar ssid
Set the desired Service Set Identifier (aka network name).
The SSID is a string up to 32 characters
in length and may be specified as either a normal string or in
hexadecimal when preceded by
.Ql 0x .
Additionally, the SSID may be cleared by setting it to
.Ql - .
.It Cm tsn
When operating as an access point with WPA/802.11i allow legacy
stations to associate using static key WEP and open authentication.
To disallow legacy station use of WEP, use
.Fl tsn .
.It Cm txpower Ar power
Set the power used to transmit frames.
The
@ -1217,10 +1512,16 @@ argument is specified in .5 dBm units.
Out of range values are truncated.
Typically only a few discreet power settings are available and
the driver will use the setting closest to the specified value.
Not all adaptors support changing the transmit power.
Not all adapters support changing the transmit power.
.It Cm ucastrate Ar rate
Set a fixed rate for transmitting unicast frames.
Rates are specified as megabits/second in decimal; e.g.\& 5.5 for 5.5 Mb/s.
This rate should be valid for the current operating conditions;
if an invalid rate is specified drivers are free to chose an
appropriate rate.
.It Cm wepmode Ar mode
Set the desired WEP mode.
Not all adaptors support all modes.
Not all adapters support all modes.
The set of valid modes is
.Cm off , on ,
and
@ -1229,10 +1530,10 @@ The
.Cm mixed
mode explicitly tells the adaptor to allow association with access
points which allow both encrypted and unencrypted traffic.
On these adaptors,
On these adapters,
.Cm on
means that the access point must only allow encrypted connections.
On other adaptors,
On other adapters,
.Cm on
is generally another name for
.Cm mixed .
@ -1261,7 +1562,7 @@ drivers do this mapping differently to
A key may be cleared by setting it to
.Ql - .
If WEP is supported then there are at least four keys.
Some adaptors support more than four keys.
Some adapters support more than four keys.
If that is the case, then the first four keys
(1-4) will be the standard temporary keys and any others will be adaptor
specific keys such as permanent keys stored in NVRAM.
@ -1276,6 +1577,8 @@ WME is a subset of the IEEE 802.11e standard to support the
efficient communication of realtime and multimedia data.
To disable WME support, use
.Fl wme .
Another name for this parameter is
.Cm wmm .
.Pp
The following parameters are meaningful only when WME support is in use.
Parameters are specified per-AC (Access Category) and
@ -1362,10 +1665,15 @@ This parameter is meaningful only when operating in ap mode.
Set the TxOpLimit channel access parameter to send to stations in a BSS.
This parameter is meaningful only when operating in ap mode.
.El
.It Cm wps
Enable Wireless Privacy Subscriber support.
Note that WPS support requires a WPS-capable supplicant.
To disable this function use
.Fl wps .
.El
.Pp
The following parameters support an optional access control list
feature available with some adaptors when operating in ap mode; see
feature available with some adapters when operating in ap mode; see
.Xr wlan_acl 4 .
This facility allows an access point to accept/deny association
requests based on the MAC address of the station.
@ -1392,6 +1700,14 @@ address database.
Set the ACL policy to allow all stations to associate.
.It Cm mac:flush
Delete all entries in the database.
.It Cm mac:radius
Set the ACL policy to permit association only by
stations approved by a RADIUS server.
Note that this feature requires the
.Xr hostapd 8
program be configured to do the right thing
as it handles the RADIUS processing
(and marks stations as authorized).
.El
.Pp
The following parameters are for compatibility with other systems:
@ -1403,11 +1719,16 @@ parameter.
Included for
.Nx
compatibility.
.It Cm station Ar name
Another name for the
.Cm stationname
parameter.
Included for
.It Cm stationname Ar name
Set the name of this station.
The station name is not part of the IEEE 802.11
protocol though some interfaces support it.
As such it only
seems to be meaningful to identical or virtually identical equipment.
Setting the station name is identical in syntax to setting the SSID.
One can also use
.Cm station
for
.Bsx
compatibility.
.It Cm wep

File diff suppressed because it is too large Load Diff

View File

@ -102,6 +102,11 @@ static struct ifmedia_type_to_subtype *get_toptype_ttos(int);
static struct ifmedia_description *get_subtype_desc(int,
struct ifmedia_type_to_subtype *ttos);
#define IFM_OPMODE(x) \
((x) & (IFM_IEEE80211_ADHOC | IFM_IEEE80211_HOSTAP | \
IFM_IEEE80211_IBSS | IFM_IEEE80211_WDS | IFM_IEEE80211_MONITOR))
#define IFM_IEEE80211_STA 0
static void
media_status(int s)
{
@ -162,10 +167,13 @@ media_status(int s)
break;
case IFM_IEEE80211:
/* XXX: Different value for adhoc? */
if (ifmr.ifm_status & IFM_ACTIVE)
printf("associated");
else
if (ifmr.ifm_status & IFM_ACTIVE) {
/* NB: only sta mode associates */
if (IFM_OPMODE(ifmr.ifm_active) == IFM_IEEE80211_STA)
printf("associated");
else
printf("running");
} else
printf("no carrier");
break;
}

636
sbin/ifconfig/regdomain.c Normal file
View File

@ -0,0 +1,636 @@
/*-
* Copyright (c) 2008 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 ``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 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.
*/
#ifndef lint
static const char rcsid[] = "$FreeBSD$";
#endif /* not lint */
#include <sys/types.h>
#include <sys/errno.h>
#include <sys/mman.h>
#include <sys/sbuf.h>
#include <sys/stat.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <fcntl.h>
#include <err.h>
#include <unistd.h>
#include <bsdxml.h>
#include "regdomain.h"
#include <net80211/_ieee80211.h>
#define MAXLEVEL 20
struct mystate {
struct regdata *rdp;
struct regdomain *rd; /* current domain */
struct netband *netband; /* current netband */
struct freqband *freqband; /* current freqband */
struct country *country; /* current country */
netband_head *curband; /* current netband list */
int level;
struct sbuf *sbuf[MAXLEVEL];
int nident;
};
struct ident {
const void *id;
void *p;
enum { DOMAIN, COUNTRY, FREQBAND } type;
};
static void
start_element(void *data, const char *name, const char **attr)
{
#define iseq(a,b) (strcasecmp(a,b) == 0)
struct mystate *mt;
const void *id, *ref, *mode;
int i;
mt = data;
if (++mt->level == MAXLEVEL) {
/* XXX force parser to abort */
return;
}
mt->sbuf[mt->level] = sbuf_new(NULL, NULL, 0, SBUF_AUTOEXTEND);
id = ref = mode = NULL;
for (i = 0; attr[i] != NULL; i += 2) {
if (iseq(attr[i], "id")) {
id = attr[i+1];
} else if (iseq(attr[i], "ref")) {
ref = attr[i+1];
} else if (iseq(attr[i], "mode")) {
mode = attr[i+1];
} else
printf("%*.*s[%s = %s]\n", mt->level + 1,
mt->level + 1, "", attr[i], attr[i+1]);
}
if (iseq(name, "rd") && mt->rd == NULL) {
if (mt->country == NULL) {
mt->rd = calloc(1, sizeof(struct regdomain));
mt->rd->name = strdup(id);
mt->nident++;
LIST_INSERT_HEAD(&mt->rdp->domains, mt->rd, next);
} else
mt->country->rd = (void *)strdup(ref);
return;
}
if (iseq(name, "defcc") && mt->rd != NULL) {
mt->rd->cc = (void *)strdup(ref);
return;
}
if (iseq(name, "netband") && mt->curband == NULL && mt->rd != NULL) {
if (mode == NULL) {
/* XXX complain */
return;
}
if (iseq(mode, "11b"))
mt->curband = &mt->rd->bands_11b;
else if (iseq(mode, "11g"))
mt->curband = &mt->rd->bands_11g;
else if (iseq(mode, "11a"))
mt->curband = &mt->rd->bands_11a;
else if (iseq(mode, "11ng"))
mt->curband = &mt->rd->bands_11ng;
else if (iseq(mode, "11na"))
mt->curband = &mt->rd->bands_11na;
/* XXX else complain */
return;
}
if (iseq(name, "band") && mt->netband == NULL) {
if (mt->curband == NULL) {
/* XXX complain */
return;
}
mt->netband = calloc(1, sizeof(struct netband));
LIST_INSERT_HEAD(mt->curband, mt->netband, next);
return;
}
if (iseq(name, "freqband") && mt->freqband == NULL && mt->netband != NULL) {
/* XXX handle inlines and merge into table? */
if (mt->netband->band != NULL) {
/* XXX complain */
} else
mt->netband->band = (void *)strdup(ref);
return;
}
if (iseq(name, "country") && mt->country == NULL) {
mt->country = calloc(1, sizeof(struct country));
mt->country->isoname = strdup(id);
mt->nident++;
LIST_INSERT_HEAD(&mt->rdp->countries, mt->country, next);
return;
}
if (iseq(name, "freqband") && mt->freqband == NULL) {
mt->freqband = calloc(1, sizeof(struct freqband));
mt->freqband->id = strdup(id);
mt->nident++;
LIST_INSERT_HEAD(&mt->rdp->freqbands, mt->freqband, next);
return;
}
#undef iseq
}
static uint32_t
decode_flag(const char *p, int len)
{
#define iseq(a,b) (strcasecmp(a,b) == 0)
static const struct {
const char *name;
int len;
uint32_t value;
} flags[] = {
#define FLAG(x) { #x, sizeof(#x), x }
FLAG(IEEE80211_CHAN_A),
FLAG(IEEE80211_CHAN_B),
FLAG(IEEE80211_CHAN_G),
FLAG(IEEE80211_CHAN_HT20),
FLAG(IEEE80211_CHAN_HT40),
FLAG(IEEE80211_CHAN_ST),
FLAG(IEEE80211_CHAN_TURBO),
FLAG(IEEE80211_CHAN_PASSIVE),
FLAG(IEEE80211_CHAN_DFS),
FLAG(IEEE80211_CHAN_CCK),
FLAG(IEEE80211_CHAN_OFDM),
FLAG(IEEE80211_CHAN_2GHZ),
FLAG(IEEE80211_CHAN_5GHZ),
FLAG(IEEE80211_CHAN_DYN),
FLAG(IEEE80211_CHAN_GFSK),
FLAG(IEEE80211_CHAN_GSM),
FLAG(IEEE80211_CHAN_STURBO),
FLAG(IEEE80211_CHAN_HALF),
FLAG(IEEE80211_CHAN_QUARTER),
FLAG(IEEE80211_CHAN_HT40U),
FLAG(IEEE80211_CHAN_HT40D),
FLAG(IEEE80211_CHAN_4MSXMIT),
FLAG(IEEE80211_CHAN_NOADHOC),
FLAG(IEEE80211_CHAN_NOHOSTAP),
FLAG(IEEE80211_CHAN_11D),
FLAG(IEEE80211_CHAN_FHSS),
FLAG(IEEE80211_CHAN_PUREG),
FLAG(IEEE80211_CHAN_108A),
FLAG(IEEE80211_CHAN_108G),
#undef FLAG
};
int i;
for (i = 0; i < sizeof(flags)/sizeof(flags[0]); i++)
if (len == flags[i].len && iseq(p, flags[i].name))
return flags[i].value;
return 0;
#undef iseq
}
static void
end_element(void *data, const char *name)
{
#define iseq(a,b) (strcasecmp(a,b) == 0)
struct mystate *mt;
int len;
char *p;
mt = data;
sbuf_finish(mt->sbuf[mt->level]);
p = sbuf_data(mt->sbuf[mt->level]);
len = sbuf_len(mt->sbuf[mt->level]);
/* <freqband>...</freqband> */
if (iseq(name, "freqstart") && mt->freqband != NULL) {
mt->freqband->freqStart = strtoul(p, NULL, 0);
goto done;
}
if (iseq(name, "freqend") && mt->freqband != NULL) {
mt->freqband->freqEnd = strtoul(p, NULL, 0);
goto done;
}
if (iseq(name, "chanwidth") && mt->freqband != NULL) {
mt->freqband->chanWidth = strtoul(p, NULL, 0);
goto done;
}
if (iseq(name, "chansep") && mt->freqband != NULL) {
mt->freqband->chanSep = strtoul(p, NULL, 0);
goto done;
}
if (iseq(name, "flags")) {
if (mt->freqband != NULL)
mt->freqband->flags |= decode_flag(p, len);
else if (mt->netband != NULL)
mt->netband->flags |= decode_flag(p, len);
else {
/* XXX complain */
}
goto done;
}
/* <rd> ... </rd> */
if (iseq(name, "name") && mt->rd != NULL) {
mt->rd->name = strdup(p);
goto done;
}
if (iseq(name, "sku") && mt->rd != NULL) {
mt->rd->sku = strtoul(p, NULL, 0);
goto done;
}
if (iseq(name, "netband") && mt->rd != NULL) {
mt->curband = NULL;
goto done;
}
/* <band> ... </band> */
if (iseq(name, "freqband") && mt->netband != NULL) {
/* XXX handle inline freqbands */
goto done;
}
if (iseq(name, "maxpower") && mt->netband != NULL) {
mt->netband->maxPower = strtoul(p, NULL, 0);
goto done;
}
if (iseq(name, "maxpowerdfs") && mt->netband != NULL) {
mt->netband->maxPowerDFS = strtoul(p, NULL, 0);
goto done;
}
/* <country>...</country> */
if (iseq(name, "isocc") && mt->country != NULL) {
mt->country->code = strtoul(p, NULL, 0);
goto done;
}
if (iseq(name, "name") && mt->country != NULL) {
mt->country->name = strdup(p);
goto done;
}
if (len != 0) {
printf("Unexpected XML: name \"%s\" data \"%s\"\n", name, p);
/* XXX goto done? */
}
/* </freqband> */
if (iseq(name, "freqband") && mt->freqband != NULL) {
/* XXX must have start/end frequencies */
/* XXX must have channel width/sep */
mt->freqband = NULL;
goto done;
}
/* </rd> */
if (iseq(name, "rd") && mt->rd != NULL) {
mt->rd = NULL;
goto done;
}
/* </band> */
if (iseq(name, "band") && mt->netband != NULL) {
if (mt->netband->band == NULL) {
printf("No frequency band information at line %d\n",
#if 0
XML_GetCurrentLineNumber(parser));
#else
0);
#endif
}
if (mt->netband->maxPower == 0) {
/* XXX complain */
}
/* default max power w/ DFS to max power */
if (mt->netband->maxPowerDFS == 0)
mt->netband->maxPowerDFS = mt->netband->maxPower;
mt->netband = NULL;
goto done;
}
/* </netband> */
if (iseq(name, "netband") && mt->netband != NULL) {
mt->curband = NULL;
goto done;
}
/* </country> */
if (iseq(name, "country") && mt->country != NULL) {
if (mt->country->code == 0) {
/* XXX must have iso cc */
}
if (mt->country->name == NULL) {
/* XXX must have name */
}
if (mt->country->rd == NULL) {
/* XXX? rd ref? */
}
mt->country = NULL;
goto done;
}
done:
sbuf_delete(mt->sbuf[mt->level]);
mt->sbuf[mt->level--] = NULL;
#undef iseq
}
static void
char_data(void *data, const XML_Char *s, int len)
{
struct mystate *mt;
const char *b, *e;
mt = data;
b = s;
e = s + len-1;
for (; isspace(*b) && b < e; b++)
;
for (; isspace(*e) && e > b; e++)
;
if (e != b || (*b != '\0' && !isspace(*b)))
sbuf_bcat(mt->sbuf[mt->level], b, e-b+1);
}
static void *
findid(struct regdata *rdp, const void *id, int type)
{
struct ident *ip;
for (ip = rdp->ident; ip->id != NULL; ip++)
if (ip->type == type && strcasecmp(ip->id, id) == 0)
return ip->p;
return NULL;
}
/*
* Parse an regdomain XML configuration and build the internal representation.
*/
int
lib80211_regdomain_readconfig(struct regdata *rdp, const void *p, size_t len)
{
XML_Parser parser;
struct mystate *mt;
struct regdomain *dp;
struct country *cp;
struct freqband *fp;
struct netband *nb;
const void *id;
int i;
memset(rdp, 0, sizeof(struct regdata));
mt = calloc(1, sizeof(struct mystate));
if (mt == NULL)
return ENOMEM;
/* parse the XML input */
mt->rdp = rdp;
parser = XML_ParserCreate(NULL);
XML_SetUserData(parser, mt);
XML_SetElementHandler(parser, start_element, end_element);
XML_SetCharacterDataHandler(parser, char_data);
if (XML_Parse(parser, p, len, 1) != XML_STATUS_OK) {
warnx("%s: %s at line %d", __func__,
XML_ErrorString(XML_GetErrorCode(parser)),
XML_GetCurrentLineNumber(parser));
return -1;
}
XML_ParserFree(parser);
/* setup the identifer table */
rdp->ident = calloc(sizeof(struct ident), mt->nident + 1);
if (rdp->ident == NULL)
return ENOMEM;
free(mt);
i = 0;
LIST_FOREACH(dp, &rdp->domains, next) {
rdp->ident[i].id = dp->name;
rdp->ident[i].p = dp;
rdp->ident[i].type = DOMAIN;
i++;
}
LIST_FOREACH(fp, &rdp->freqbands, next) {
rdp->ident[i].id = fp->id;
rdp->ident[i].p = fp;
rdp->ident[i].type = FREQBAND;
i++;
}
LIST_FOREACH(cp, &rdp->countries, next) {
rdp->ident[i].id = cp->isoname;
rdp->ident[i].p = cp;
rdp->ident[i].type = COUNTRY;
i++;
}
/* patch references */
LIST_FOREACH(dp, &rdp->domains, next) {
if (dp->cc != NULL) {
id = dp->cc;
dp->cc = findid(rdp, id, COUNTRY);
free(__DECONST(char *, id));
}
LIST_FOREACH(nb, &dp->bands_11b, next)
nb->band = findid(rdp, nb->band, FREQBAND);
LIST_FOREACH(nb, &dp->bands_11g, next)
nb->band = findid(rdp, nb->band, FREQBAND);
LIST_FOREACH(nb, &dp->bands_11a, next)
nb->band = findid(rdp, nb->band, FREQBAND);
LIST_FOREACH(nb, &dp->bands_11ng, next)
nb->band = findid(rdp, nb->band, FREQBAND);
LIST_FOREACH(nb, &dp->bands_11na, next)
nb->band = findid(rdp, nb->band, FREQBAND);
}
LIST_FOREACH(cp, &rdp->countries, next) {
id = cp->rd;
cp->rd = findid(rdp, id, DOMAIN);
free(__DECONST(char *, id));
}
return 0;
}
static void
cleanup_bands(netband_head *head)
{
struct netband *nb;
for (;;) {
nb = LIST_FIRST(head);
if (nb == NULL)
break;
free(nb);
}
}
/*
* Cleanup state/resources for a previously parsed regdomain database.
*/
void
lib80211_regdomain_cleanup(struct regdata *rdp)
{
free(rdp->ident);
rdp->ident = NULL;
for (;;) {
struct regdomain *dp = LIST_FIRST(&rdp->domains);
if (dp == NULL)
break;
LIST_REMOVE(dp, next);
cleanup_bands(&dp->bands_11b);
cleanup_bands(&dp->bands_11g);
cleanup_bands(&dp->bands_11a);
cleanup_bands(&dp->bands_11ng);
cleanup_bands(&dp->bands_11na);
if (dp->name != NULL)
free(__DECONST(char *, dp->name));
}
for (;;) {
struct country *cp = LIST_FIRST(&rdp->countries);
if (cp == NULL)
break;
LIST_REMOVE(cp, next);
if (cp->name != NULL)
free(__DECONST(char *, cp->name));
free(cp);
}
for (;;) {
struct freqband *fp = LIST_FIRST(&rdp->freqbands);
if (fp == NULL)
break;
LIST_REMOVE(fp, next);
free(fp);
}
}
struct regdata *
lib80211_alloc_regdata(void)
{
struct regdata *rdp;
struct stat sb;
void *xml;
int fd;
rdp = calloc(1, sizeof(struct regdata));
fd = open(_PATH_REGDOMAIN, O_RDONLY);
if (fd < 0) {
#ifdef DEBUG
warn("%s: open(%s)", __func__, _PATH_REGDOMAIN);
#endif
free(rdp);
return NULL;
}
if (fstat(fd, &sb) < 0) {
#ifdef DEBUG
warn("%s: fstat(%s)", __func__, _PATH_REGDOMAIN);
#endif
close(fd);
free(rdp);
return NULL;
}
xml = mmap(NULL, sb.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
if (xml == MAP_FAILED) {
#ifdef DEBUG
warn("%s: mmap", __func__);
#endif
close(fd);
free(rdp);
return NULL;
}
if (lib80211_regdomain_readconfig(rdp, xml, sb.st_size) != 0) {
#ifdef DEBUG
warn("%s: error reading regulatory database", __func__);
#endif
munmap(xml, sb.st_size);
close(fd);
free(rdp);
return NULL;
}
munmap(xml, sb.st_size);
close(fd);
return rdp;
}
void
lib80211_free_regdata(struct regdata *rdp)
{
lib80211_regdomain_cleanup(rdp);
free(rdp);
}
/*
* Lookup a regdomain by SKU.
*/
const struct regdomain *
lib80211_regdomain_findbysku(const struct regdata *rdp, enum RegdomainCode sku)
{
const struct regdomain *dp;
LIST_FOREACH(dp, &rdp->domains, next) {
if (dp->sku == sku)
return dp;
}
return NULL;
}
/*
* Lookup a regdomain by name.
*/
const struct regdomain *
lib80211_regdomain_findbyname(const struct regdata *rdp, const char *name)
{
const struct regdomain *dp;
LIST_FOREACH(dp, &rdp->domains, next) {
if (strcasecmp(dp->name, name) == 0)
return dp;
}
return NULL;
}
/*
* Lookup a country by ISO country code.
*/
const struct country *
lib80211_country_findbycc(const struct regdata *rdp, enum ISOCountryCode cc)
{
const struct country *cp;
LIST_FOREACH(cp, &rdp->countries, next) {
if (cp->code == cc)
return cp;
}
return NULL;
}
/*
* Lookup a country by ISO/long name.
*/
const struct country *
lib80211_country_findbyname(const struct regdata *rdp, const char *name)
{
const struct country *cp;
int len;
len = strlen(name);
LIST_FOREACH(cp, &rdp->countries, next) {
if (strcasecmp(cp->isoname, name) == 0 ||
strncasecmp(cp->name, name, len) == 0)
return cp;
}
return NULL;
}

112
sbin/ifconfig/regdomain.h Normal file
View File

@ -0,0 +1,112 @@
/*-
* Copyright (c) 2007-2008 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 ``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 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$
*/
#ifndef _LIB80211_H_
#define _LIB80211_H_
#include <sys/cdefs.h>
#include <sys/queue.h>
#include <net80211/ieee80211_regdomain.h>
__BEGIN_DECLS
struct freqband {
uint16_t freqStart; /* starting frequency (MHz) */
uint16_t freqEnd; /* ending frequency (MHz) */
uint8_t chanWidth; /* channel width (MHz) */
uint8_t chanSep; /* channel sepaaration (MHz) */
uint32_t flags; /* common operational constraints */
const void *id;
LIST_ENTRY(freqband) next;
};
struct netband {
const struct freqband *band; /* channel list description */
uint8_t maxPower; /* regulatory cap on tx power (dBm) */
uint8_t maxPowerDFS; /* regulatory cap w/ DFS (dBm) */
uint32_t flags; /* net80211 channel flags */
LIST_ENTRY(netband) next;
};
typedef LIST_HEAD(, netband) netband_head;
struct country;
struct regdomain {
enum RegdomainCode sku; /* regdomain code/SKU */
const char *name; /* printable name */
const struct country *cc; /* country code for 1-1/default map */
netband_head bands_11b; /* 11b operation */
netband_head bands_11g; /* 11g operation */
netband_head bands_11a; /* 11a operation */
netband_head bands_11ng;/* 11ng operation */
netband_head bands_11na;/* 11na operation */
LIST_ENTRY(regdomain) next;
};
struct country {
enum ISOCountryCode code;
const struct regdomain *rd;
const char* isoname;
const char* name;
LIST_ENTRY(country) next;
};
struct ident;
struct regdata {
LIST_HEAD(, country) countries; /* country code table */
LIST_HEAD(, regdomain) domains; /* regulatory domains */
LIST_HEAD(, freqband) freqbands; /* frequency band table */
struct ident *ident; /* identifier table */
};
#define _PATH_REGDOMAIN "/etc/regdomain.xml"
struct regdata *lib80211_alloc_regdata(void);
void lib80211_free_regdata(struct regdata *);
int lib80211_regdomain_readconfig(struct regdata *, const void *, size_t);
void lib80211_regdomain_cleanup(struct regdata *);
const struct regdomain *lib80211_regdomain_findbysku(const struct regdata *,
enum RegdomainCode);
const struct regdomain *lib80211_regdomain_findbyname(const struct regdata *,
const char *);
const struct country *lib80211_country_findbycc(const struct regdata *,
enum ISOCountryCode);
const struct country *lib80211_country_findbyname(const struct regdata *,
const char *);
__END_DECLS
#endif /* _LIB80211_H_ */

View File

@ -1,5 +1,5 @@
.\"-
.\" Copyright (c) 2002-2004 Sam Leffler, Errno Consulting
.\" Copyright (c) 2002-2008 Sam Leffler, Errno Consulting
.\" All rights reserved.
.\""
.\" Redistribution and use in source and binary forms, with or without
@ -12,9 +12,6 @@
.\" similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any
.\" redistribution must be conditioned upon including a substantially
.\" similar Disclaimer requirement for further binary redistribution.
.\" 3. Neither the names of the above-listed copyright holders nor the names
.\" of any contributors may be used to endorse or promote products derived
.\" from this software without specific prior written permission.
.\"
.\" NO WARRANTY
.\" THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
@ -31,7 +28,7 @@
.\"
.\" $FreeBSD$
.\"/
.Dd December 7, 2006
.Dd April 13, 2008
.Dt ATH 4
.Os
.Sh NAME
@ -59,7 +56,7 @@ The
.Nm
driver provides support for wireless network adapters based on
the Atheros AR5210, AR5211, and AR5212 programming APIs.
These APIs are used by a wide variety of chips; all chips with
These APIs are used by a wide variety of chips; most all chips with
a PCI and/or CardBus interface are supported.
Chip-specific support is provided by the Atheros Hardware Access Layer
(HAL), that is packaged separately.
@ -97,26 +94,32 @@ To enable encryption, use
.Xr ifconfig 8
as shown below.
.Pp
By default, the
.Nm
driver configures the card for BSS operation (aka infrastructure
mode).
This mode requires the use of an access point (base station).
.Pp
The
.Nm
driver also supports the standard IBSS point-to-point mode
where stations can communicate amongst themselves without the
aid of an access point.
.Pp
The driver may also be configured to operate in hostap mode.
In this mode a host may function as an access point (base station).
Access points are different than operating in IBSS mode.
They operate in BSS mode.
They allow for easier roaming and bridge all Ethernet traffic such
that machines connected via an access point appear to be on the local
Ethernet segment.
.Pp
The driver supports
.Cm station ,
.Cm adhoc ,
.Cm adhoc-demo ,
.Cm hostap ,
.Cm wds ,
and
.Cm monitor
mode operation.
Multiple
.Cm hostap
virtual interfaces may be configured for simultaneous
use on cards that use a 5212 part.
When multiple interfaces are configured each may have a separate
mac address that is formed by setting the U/L bits in the mac
address assigned to the underlying device.
Any number of
.Cm wds
virtual interfaces may be configured together with
.Cm hostap
interfaces.
Multiple
.Cm station
interfaces may be operated together with
.Cm hostap
interfaces to construct a wireless repeater device.
For more information on configuring this device, see
.Xr ifconfig 8 .
.Pp
@ -127,8 +130,10 @@ Wireless cards in Cardbus slots may be inserted and ejected on the fly.
.Sh HARDWARE
The
.Nm
driver supports all Atheros Cardbus or PCI cards,
driver supports most Atheros Cardbus or PCI cards,
except those that are based on the AR5005VL chipset.
More recent parts may require a hal that is not part of
.Fb .
.Pp
A list of cards that are supported can be found at
.Pa http://customerproducts.atheros.com/customerproducts/default.asp .
@ -144,38 +149,37 @@ Join a specific BSS network with network name
.Pp
Join a specific BSS network with WEP encryption:
.Bd -literal -offset indent
ifconfig ath0 inet 192.168.0.20 netmask 0xffffff00 ssid my_net \e
ifconfig wlan0 create wlandev ath0
ifconfig wlan0 inet 192.168.0.20 netmask 0xffffff00 ssid my_net \e
wepmode on wepkey 0x8736639624
.Ed
.Pp
Join/create an 802.11b IBSS network with network name
.Dq Li my_net :
.Bd -literal -offset indent
ifconfig ath0 inet 192.168.0.22 netmask 0xffffff00 ssid my_net \e
mode 11b mediaopt adhoc
ifconfig wlan0 create wlandev ath0 wlanmode adhoc
ifconfig wlan0 inet 192.168.0.22 netmask 0xffffff00 ssid my_net \e
mode 11b
.Ed
.Pp
Create an 802.11g host-based access point:
.Bd -literal -offset indent
ifconfig ath0 inet 192.168.0.10 netmask 0xffffff00 ssid my_ap \e
mode 11g mediaopt hostap
ifconfig wlan0 create wlandev ath0 wlanmode hostap
ifconfig wlan0 inet 192.168.0.10 netmask 0xffffff00 ssid my_ap \e
mode 11g
.Ed
.Pp
Create an 802.11a host-based access point with WEP enabled:
Create two virtual 802.11a host-based access points, one with
with WEP enabled and one with no security, and bridge them to
the fxp0 (wired) device:
.Bd -literal -offset indent
ifconfig ath0 inet 192.168.0.10 netmask 0xffffff00 ssid my_ap \e
wepmode on wepkey 0x1234567890 mode 11a mediaopt hostap
ifconfig wlan0 create wlandev ath0 wlanmode hostap \e
ssid paying-customers wepmode on wepkey 0x1234567890 \e
mode 11a up
ifconfig wlan1 create wlandev ath0 wlanmode hostap bssid \e
ssid freeloaders up
ifconfig bridge0 create addm wlan0 addm wlan1 addm fxp0 up
.Ed
.Pp
Create a host-based wireless bridge to fxp0:
.Bd -literal -offset indent
ifconfig ath0 inet up ssid my_ap media DS/11Mbps mediaopt hostap
sysctl net.inet.ip.check_interface=0
ifconfig bridge0 create
ifconfig bridge0 addm ath0 addm fxp0 up
.Ed
.Pp
This will give you the same functionality as an access point.
.Sh DIAGNOSTICS
.Bl -diag
.It "ath%d: unable to attach hardware; HAL status %u"
@ -252,15 +256,18 @@ The driver was unable to install the device interrupt handler.
This should not happen.
.El
.Sh SEE ALSO
.Xr altq 4 ,
.Xr an 4 ,
.Xr arp 4 ,
.Xr ath_hal 4 ,
.Xr netintro 4 ,
.Xr intro 4 ,
.Xr cardbus 4 ,
.Xr pcic 4 ,
.Xr wi 4 ,
.Xr wlan 4 ,
.Xr wlan_ccmp 4 ,
.Xr wlan_tkip 4 ,
.Xr wlan_wep 4 ,
.Xr wlan_xauth 4 ,
.Xr hostapd 8 ,
.Xr ifconfig 8 ,
.Xr wpa_supplicant 8 .
.Sh HISTORY
The
.Nm
@ -281,17 +288,7 @@ Intersil PrismGT chip and are not supported by this driver.
.Sh BUGS
There is no software retransmit; only hardware retransmit is used.
.Pp
The driver does not fully enable power-save operation of the chip;
consequently power use is suboptimal.
.Pp
The driver honors the regulatory domain programmed into the EEPROM of a
device and does not support overriding this setting.
This is done to insure compliance with local regulatory agencies when
operating as an access point.
Unfortunately this also means that devices purchased for use in one locale
may not be usable in another.
Changes are planned to remove this restriction when operating in station mode.
The driver does not fully enable power-save operation of the chip
in station mode; consequently power use is suboptimal (e.g. on a laptop).
.Pp
WPA is not supported for 5210 parts.
.Pp
Atheros' SuperG functionality is not supported.

View File

@ -25,7 +25,7 @@
.\"
.\" $FreeBSD$
.\"
.Dd March 6, 2007
.Dd April 13, 2008
.Os
.Dt IPW 4
.Sh NAME
@ -37,27 +37,24 @@ place the following lines in your
kernel configuration file:
.Bd -ragged -offset indent
.Cd "device ipw"
.Cd "device ipwfw"
.Cd "device pci"
.Cd "device wlan"
.Cd "device firmware"
.Ed
.Pp
Alternatively, to load the driver as a
module at boot time, place the following lines in
module at boot time, place the following line in
.Xr loader.conf 5 :
.Bd -literal -offset indent
if_ipw_load="YES"
wlan_load="YES"
firmware_load="YES"
.Ed
.Pp
In both cases, place the following lines in
In both cases, place the following line in
.Xr loader.conf 5
to load the firmware modules:
to acknowledge the firmware license (see below):
.Bd -literal -offset indent
ipw_bss_load="YES"
ipw_ibss_load="YES"
ipw_monitor_load="YES"
legal.intel_ipw.license_ack=1
.Ed
.Sh DESCRIPTION
The
@ -65,19 +62,23 @@ The
driver provides support for the
.Tn Intel
PRO/Wireless 2100 MiniPCI network adapter.
.Pp
By default, the
.Nm
driver configures the adapter for BSS operation (aka infrastructure mode).
This mode requires the use of an access point.
.Pp
supports
.Cm station ,
.Cm adhoc ,
and
.Cm monitor
mode operation.
Only one virtual interface may be configured at any time.
For more information on configuring this device, see
.Xr ifconfig 8 .
.Pp
This driver requires firmware to be loaded before it will work.
For the loaded firmware to work the license at
This driver requires the firmware built with the
.Nm ipwfw
module to work.
For the loaded firmware to be enabled for use the license at
.Pa /usr/share/doc/legal/intel_ipw/LICENSE
must be agreed to and the following line be added to
must be agreed by adding the following line to
.Xr loader.conf 5 :
.Pp
.Dl "legal.intel_ipw.license_ack=1"
@ -90,22 +91,25 @@ firmware license
.Sh EXAMPLES
Join an existing BSS network (i.e., connect to an access point):
.Pp
.Dl "ifconfig ipw0 inet 192.168.0.20 netmask 0xffffff00"
.Bd -literal -offset indent
ifconfig wlan create wlandev ipw0 inet 192.168.0.20 \e
netmask 0xffffff00
.Ed
.Pp
Join a specific BSS network with network name
.Dq Li my_net :
.Pp
.Dl "ifconfig ipw0 inet 192.168.0.20 netmask 0xffffff00 ssid my_net"
.Dl "ifconfig wlan create wlandev ipw0 ssid my_net up"
.Pp
Join a specific BSS network with 40-bit WEP encryption:
Join a specific BSS network with 64-bit WEP encryption:
.Bd -literal -offset indent
ifconfig ipw0 inet 192.168.0.20 netmask 0xffffff00 ssid my_net \e
wepmode on wepkey 0x1234567890 weptxkey 1
ifconfig wlan create wlandev ipw0 ssid my_net \e
wepmode on wepkey 0x1234567890 weptxkey 1 up
.Ed
.Pp
Join a specific BSS network with 104-bit WEP encryption:
Join a specific BSS network with 128-bit WEP encryption:
.Bd -literal -offset indent
ifconfig ipw0 inet 192.168.0.20 netmask 0xffffff00 ssid my_net \e
ifconfig wlan create wlandev ipw0 wlanmode adhoc ssid my_net \e
wepmode on wepkey 0x01020304050607080910111213 weptxkey 1
.Ed
.Sh DIAGNOSTICS
@ -124,8 +128,9 @@ This should not happen.
The driver failed to load the firmware image using the
.Xr firmware 9
subsystem.
Verify that the necessary firmware modules are loaded and the
license agreement
Verify the
.Xr ipwfw 4
firmware module is installed and the license agreement
.Xr loader 8
tunable has been set.
.It "ipw%d: could not load microcode"
@ -136,14 +141,16 @@ An attempt to upload the firmware image to the onboard microcontroller failed.
This should not happen.
.El
.Sh SEE ALSO
.Xr altq 4 ,
.Xr iwi 4 ,
.Xr ipwfw 4 ,
.Xr pci 4 ,
.Xr wlan 4 ,
.Xr wpi 4 ,
.Xr ifconfig 8
.Xr wlan_ccmp 4 ,
.Xr wlan_tkip 4 ,
.Xr wlan_wep 4 ,
.Xr ifconfig 8 ,
.Xr wpa_supplicant 8 .
.Sh AUTHORS
The
The original
.Nm
driver was written by
.An Damien Bergamini Aq damien@FreeBSD.org .
.An Damien Bergamini Aq damien.bergamini@free.fr

View File

@ -25,7 +25,7 @@
.\"
.\" $FreeBSD$
.\"
.Dd March 6, 2007
.Dd Apri 13, 2008
.Os
.Dt IWI 4
.Sh NAME
@ -33,31 +33,28 @@
.Nd "Intel PRO/Wireless 2200BG/2225BG/2915ABG IEEE 802.11 driver"
.Sh SYNOPSIS
To compile this driver into the kernel,
place the following lines in your
include the following lines in your
kernel configuration file:
.Bd -ragged -offset indent
.Cd "device iwi"
.Cd "device iwifw"
.Cd "device pci"
.Cd "device wlan"
.Cd "device firmware"
.Ed
.Pp
Alternatively, to load the driver as a
module at boot time, place the following lines in
module at boot time, place the following line in
.Xr loader.conf 5 :
.Bd -literal -offset indent
if_iwi_load="YES"
wlan_load="YES"
firmware_load="YES"
.Ed
.Pp
In both cases, place the following lines in
In both cases, place the following line in
.Xr loader.conf 5
to load the firmware modules:
to acknowledge the firmware license (see below):
.Bd -literal -offset indent
iwi_bss_load="YES"
iwi_ibss_load="YES"
iwi_monitor_load="YES"
legal.intel_iwi.license_ack=1
.Ed
.Sh DESCRIPTION
The
@ -65,19 +62,23 @@ The
driver provides support for
.Tn Intel
PRO/Wireless 2200BG/2915ABG MiniPCI and 2225BG PCI network adapters.
.Pp
By default, the
.Nm
driver configures the adapter for BSS operation (aka infrastructure mode).
This mode requires the use of an access point.
.Pp
supports
.Cm station ,
.Cm adhoc ,
and
.Cm monitor
mode operation.
Only one virtual interface may be configured at any time.
For more information on configuring this device, see
.Xr ifconfig 8 .
.Pp
This driver requires firmware to be loaded before it will work.
For the loaded firmware to work the license at
This driver requires the firmware built with the
.Nm iwifw
module to work.
For the loaded firmware to be enabled for use the license at
.Pa /usr/share/doc/legal/intel_iwi/LICENSE
must be agreed to and the following line be added to
must be agreed by adding the following line to
.Xr loader.conf 5 :
.Pp
.Dl "legal.intel_iwi.license_ack=1"
@ -90,22 +91,25 @@ firmware license
.Sh EXAMPLES
Join an existing BSS network (i.e., connect to an access point):
.Pp
.Dl "ifconfig iwi0 inet 192.168.0.20 netmask 0xffffff00"
.Bd -literal -offset indent
ifconfig wlan create wlandev iwi0 inet 192.168.0.20 \e
netmask 0xffffff00
.Ed
.Pp
Join a specific BSS network with network name
.Dq Li my_net :
.Pp
.Dl "ifconfig iwi0 inet 192.168.0.20 netmask 0xffffff00 ssid my_net"
.Dl "ifconfig wlan create wlandev iwi0 ssid my_net up"
.Pp
Join a specific BSS network with 64-bit WEP encryption:
.Bd -literal -offset indent
ifconfig iwi0 inet 192.168.0.20 netmask 0xffffff00 ssid my_net \e
wepmode on wepkey 0x1234567890 weptxkey 1
ifconfig wlan create wlandev iwi0 ssid my_net \e
wepmode on wepkey 0x1234567890 weptxkey 1 up
.Ed
.Pp
Join a specific BSS network with 128-bit WEP encryption:
.Bd -literal -offset indent
ifconfig iwi0 inet 192.168.0.20 netmask 0xffffff00 ssid my_net \e
ifconfig wlan create wlandev iwi0 wlanmode adhoc ssid my_net \e
wepmode on wepkey 0x01020304050607080910111213 weptxkey 1
.Ed
.Sh DIAGNOSTICS
@ -114,7 +118,7 @@ ifconfig iwi0 inet 192.168.0.20 netmask 0xffffff00 ssid my_net \e
The driver will reset the hardware.
This should not happen.
.It "iwi%d: firmware error"
The onboard microcontroller crashes for some reason.
The onboard microcontroller crashed for some reason.
The driver will reset the hardware.
This should not happen.
.It "iwi%d: timeout waiting for firmware initialization to complete"
@ -124,8 +128,9 @@ This should not happen.
The driver failed to load the firmware image using the
.Xr firmware 9
subsystem.
Verify that the necessary firmware modules are loaded and the
license agreement
Verify the
.Xr iwifw 4
firmware module is installed and the license agreement
.Xr loader 8
tunable has been set.
.It "iwi%d: could not load boot firmware"
@ -141,14 +146,16 @@ failed.
This should not happen.
.El
.Sh SEE ALSO
.Xr altq 4 ,
.Xr ipw 4 ,
.Xr iwifw 4 ,
.Xr pci 4 ,
.Xr wlan 4 ,
.Xr wpi 4 ,
.Xr ifconfig 8
.Xr wlan_ccmp 4 ,
.Xr wlan_tkip 4 ,
.Xr wlan_wep 4 ,
.Xr ifconfig 8 ,
.Xr wpa_supplicant 8 .
.Sh AUTHORS
The
The original
.Nm
driver was written by
.An Damien Bergamini Aq damien@FreeBSD.org .
.An Damien Bergamini Aq damien.bergamini@free.fr

View File

@ -31,7 +31,7 @@
.\"
.\" $FreeBSD$
.\"/
.Dd March 25, 2008
.Dd April 13, 2008
.Dt MALO 4
.Os
.Sh NAME
@ -53,41 +53,33 @@ module at boot time, place the following lines in
.Xr loader.conf 5 :
.Bd -literal -offset indent
if_malo_load="YES"
wlan_load="YES"
firmware_load="YES"
.Ed
.Pp
In both cases, place the following line in
.Xr loader.conf 5
to load the firmware module:
.Bd -literal -offset indent
malofw_load="YES"
.Ed
.Sh DESCRIPTION
The
.Nm
driver provides support for Marvell Libertas 88W8335 based PCI
network adapters.
.Pp
This driver requires firmware to be loaded before it will work.
These firmware files are from the
.Ox
and Cardbus network adapters.
.Nm
driver.
supports
.Cm station ,
.Cm adhoc ,
and
.Cm monitor
mode operation.
Only one virtual interface may be configured at any time.
For more information on configuring this device, see
.Xr ifconfig 8 .
.Pp
A package for the firmware which can be installed via
This driver requires the
.Nm malofw
be installed before it will work.
The firmware files are not publicly available.
A package of the firmware which can be installed via
.Xr pkg_add 1
can be found at:
with:
.Bd -literal -offset indent
http://weongyo.org/project/malo/malo-firmware-1.4.tar.gz
.Ed
.Pp
This package must be installed before
.Xr ifconfig 8
will work.
.Pp
For more information on configuring this device, see
.Xr ifconfig 8 .
.Sh HARDWARE
The following cards are among those supported by the
.Nm
@ -102,26 +94,38 @@ U-Khan UW-2054i 88W8335 PCI b/g
.Sh EXAMPLES
Join an existing BSS network (i.e., connect to an access point):
.Pp
.Dl "ifconfig malo0 inet 192.168.0.20 netmask 0xffffff00"
.Bd -literal -offset indent
ifconfig wlan create wlandev iwn0 inet 192.168.0.20 \e
netmask 0xffffff00
.Ed
.Pp
Join a specific BSS network with network name
.Dq Li my_net :
.Pp
.Dl "ifconfig malo0 inet 192.168.0.20 netmask 0xffffff00 ssid my_net"
.Dl "ifconfig wlan create wlandev iwn0 ssid my_net up"
.Pp
Join a specific BSS network with WEP encryption:
Join a specific BSS network with 64-bit WEP encryption:
.Bd -literal -offset indent
ifconfig malo0 inet 192.168.0.20 netmask 0xffffff00 ssid my_net \e
wepmode on wepkey 0x8736639624
ifconfig wlan create wlandev iwn0 ssid my_net \e
wepmode on wepkey 0x1234567890 weptxkey 1 up
.Ed
.Pp
Join a specific BSS network with 128-bit WEP encryption:
.Bd -literal -offset indent
ifconfig wlan create wlandev iwn0 wlanmode adhoc ssid my_net \e
wepmode on wepkey 0x01020304050607080910111213 weptxkey 1
.Ed
.Ed
.Sh SEE ALSO
.Xr altq 4 ,
.Xr arp 4 ,
.Xr cardbus 4 ,
.Xr netintro 4 ,
.Xr malofw 4 ,
.Xr pci 4 ,
.Xr cardbus 4 ,
.Xr wlan 4 ,
.Xr ifconfig 8
.Xr wlan_ccmp 4 ,
.Xr wlan_tkip 4 ,
.Xr wlan_wep 4 ,
.Xr ifconfig 8 ,
.Xr wpa_supplicant 8 .
.Sh HISTORY
The
.Nm

View File

@ -15,7 +15,7 @@
.\"
.\" $FreeBSD$
.\"
.Dd September 10, 2007
.Dd April 13, 2008
.Os
.Dt RAL 4
.Sh NAME
@ -27,7 +27,10 @@ place the following lines in your
kernel configuration file:
.Bd -ragged -offset indent
.Cd "device ral"
.Cd "device ralfw"
.Cd "device wlan"
.Cd "device wlan_amrr"
.Cd "device firmware"
.Ed
.Pp
Alternatively, to load the driver as a
@ -63,6 +66,31 @@ MIMO is the basis of the forthcoming IEEE 802.11n standard.
The transmit speed is user-selectable or can be adapted automatically by the
driver depending on the received signal strength and on the number of hardware
transmission retries.
.Pp
.Nm
supports
.Cm station ,
.Cm adhoc ,
.Cm hostap ,
.Cm wds ,
and
.Cm monitor
mode operation.
Only one
.Cm hostap
virtual interface may be configured at a time.
Any number of
.Cm wds
virtual interfaces may be configured together with a
.Cm hostap
interface.
Multiple
.Cm station
interfaces may be operated together with a
.Cm hostap
interface to construct a wireless repeater device.
For more information on configuring this device, see
.Xr ifconfig 8 .
.Sh HARDWARE
The
.Nm
@ -163,22 +191,27 @@ An up to date list can be found at
.Sh EXAMPLES
Join an existing BSS network (i.e., connect to an access point):
.Pp
.Dl "ifconfig ral0 inet 192.168.0.20 netmask 0xffffff00"
.Dl "ifconfig wlan create wlandev ral0 inet 192.168.0.20 netmask 0xffffff00"
.Pp
Join a specific BSS network with network name
.Dq Li my_net :
.Pp
.Dl "ifconfig ral0 inet 192.168.0.20 netmask 0xffffff00 ssid my_net"
.Bd -literal -offset indent
ifconfig wlan create wlandev ral0 inet 192.168.0.20 \e
netmask 0xffffff00 ssid my_net
.Ed
.Pp
Join a specific BSS network with 40-bit WEP encryption:
.Bd -literal -offset indent
ifconfig ral0 inet 192.168.0.20 netmask 0xffffff00 ssid my_net \e
ifconfig wlan create wlandev ral0 inet 192.168.0.20 \e
netmask 0xffffff00 ssid my_net \e
wepmode on wepkey 0x1234567890 weptxkey 1
.Ed
.Pp
Join a specific BSS network with 104-bit WEP encryption:
.Bd -literal -offset indent
ifconfig ral0 inet 192.168.0.20 netmask 0xffffff00 ssid my_net \e
ifconfig wlan create wlandev ral0 inet 192.168.0.20 \e
netmask 0xffffff00 ssid my_net \e
wepmode on wepkey 0x01020304050607080910111213 weptxkey 1
.Ed
.Sh DIAGNOSTICS
@ -194,13 +227,16 @@ The driver will reset the hardware.
This should not happen.
.El
.Sh SEE ALSO
.Xr altq 4 ,
.Xr arp 4 ,
.Xr intro 4 ,
.Xr cardbus 4 ,
.Xr netintro 4 ,
.Xr pci 4 ,
.Xr wlan 4 ,
.Xr ifconfig 8
.Xr wlan_ccmp 4 ,
.Xr wlan_tkip 4 ,
.Xr wlan_wep 4 ,
.Xr wlan_xauth 4 ,
.Xr hostapd 8 ,
.Xr ifconfig 8 ,
.Xr wpa_supplicant 8 .
.Rs
.%T "Ralink Technology"
.%O http://www.ralinktech.com/
@ -210,17 +246,8 @@ The
.Nm
driver first appeared in
.Ox 3.7 .
.Sh CAVEATS
PCI
.Nm
adapters seem to require a PCI 2.2 compliant motherboard and will likely not
work with PCI 2.1 only motherboard.
.Pp
The
.Nm
driver does not implement frame aggregation.
.Sh AUTHORS
The
The original
.Nm
driver was written by
.An Damien Bergamini Aq damien@FreeBSD.org .

View File

@ -16,7 +16,7 @@
.\"
.\" $FreeBSD$
.\"
.Dd September 7, 2007
.Dd April 13, 2008
.Os
.Dt RUM 4
.Sh NAME
@ -45,11 +45,11 @@ if_rum_load="YES"
.Sh DESCRIPTION
The
.Nm
driver supports USB 2.0 and PCI Express Mini Card wireless adapters based on the
Ralink RT2501USB and RT2601USB chipsets.
driver supports USB 2.0 and PCI Express Mini Card wireless adapters
based on the Ralink RT2501USB and RT2601USB chipsets.
.Pp
Ralink PCI Express Mini Card adapters show up as normal USB 2.0 devices and are
thus handled by the
Ralink PCI Express Mini Card adapters show up as normal USB 2.0
devices and are thus handled by the
.Nm
driver.
.Pp
@ -58,15 +58,27 @@ Ralink.
It consists of two integrated chips, an RT2571W MAC/BBP and an RT2528 or
RT5226 radio transceiver.
.Pp
The RT2601USB chipset consists of two integrated chips, an RT2671 MAC/BBP and
an RT2527 or RT5225 radio transceiver.
This chipset uses the MIMO (multiple-input multiple-output) technology with
multiple antennas to extend the operating range of the adapter and to achieve
higher throughput.
The RT2601USB chipset consists of two integrated chips, an RT2671
MAC/BBP and an RT2527 or RT5225 radio transceiver.
This chipset uses the MIMO (multiple-input multiple-output) technology
with multiple antennas to extend the operating range of the adapter
and to achieve higher throughput.
.Pp
.Nm
supports
.Cm station ,
.Cm adhoc ,
.Cm hostap ,
and
.Cm monitor
mode operation.
Only one virtual interface may be configured at any time.
For more information on configuring this device, see
.Xr ifconfig 8 .
.Sh HARDWARE
The
.Nm
driver supports USB 2.0 and PCI Express Mini Card wireless
driver supports USB 2.0 wireless
adapters based on the Ralink RT2501USB and RT2601USB chipsets,
including:
.Pp
@ -108,22 +120,25 @@ including:
.Sh EXAMPLES
Join an existing BSS network (i.e., connect to an access point):
.Pp
.Dl "ifconfig rum0 inet 192.168.0.20 netmask 0xffffff00"
.Bd -literal -offset indent
ifconfig wlan create wlandev rum0 inet 192.168.0.20 \e
netmask 0xffffff00
.Ed
.Pp
Join a specific BSS network with network name
.Dq Li my_net :
.Pp
.Dl "ifconfig rum0 inet 192.168.0.20 netmask 0xffffff00 ssid my_net"
.Dl "ifconfig wlan create wlandev rum0 ssid my_net up"
.Pp
Join a specific BSS network with 40-bit WEP encryption:
Join a specific BSS network with 64-bit WEP encryption:
.Bd -literal -offset indent
ifconfig rum0 inet 192.168.0.20 netmask 0xffffff00 ssid my_net \e
wepmode on wepkey 0x1234567890 weptxkey 1
ifconfig wlan create wlandev rum0 ssid my_net \e
wepmode on wepkey 0x1234567890 weptxkey 1 up
.Ed
.Pp
Join a specific BSS network with 104-bit WEP encryption:
Join a specific BSS network with 128-bit WEP encryption:
.Bd -literal -offset indent
ifconfig rum0 inet 192.168.0.20 netmask 0xffffff00 ssid my_net \e
ifconfig wlan create wlandev rum0 wlanmode adhoc ssid my_net \e
wepmode on wepkey 0x01020304050607080910111213 weptxkey 1
.Ed
.Sh DIAGNOSTICS
@ -135,13 +150,18 @@ The driver will reset the hardware.
This should not happen.
.El
.Sh SEE ALSO
.Xr altq 4 ,
.Xr arp 4 ,
.Xr intro 4 ,
.Xr netintro 4 ,
.Xr usb 4 ,
.Xr wlan 4 ,
.Xr wlan_amrr 4 ,
.Xr ifconfig 8
.Xr wlan_ccmp 4 ,
.Xr wlan_tkip 4 ,
.Xr wlan_wep 4 ,
.Xr wlan_xauth 4 ,
.Xr ifconfig 8 ,
.Xr hostapd 8 ,
.Xr wpa_supplicant 8 .
.Rs
.%T "Ralink Technology"
.%O http://www.ralinktech.com/
@ -151,16 +171,8 @@ The
.Nm
driver first appeared in
.Ox 4.0 .
.Sh CAVEATS
.Pp
The
.Nm
driver supports automatic control of the transmit speed in BSS mode only.
Therefore the use of a
.Nm
adapter in Host AP mode is discouraged.
.Sh AUTHORS
The
The original
.Nm
driver was written by
.An Niall O'Higgins Aq niallo@openbsd.org

View File

@ -15,7 +15,7 @@
.\"
.\" $FreeBSD$
.\"
.Dd September 10, 2007
.Dd April 13, 2008
.Os
.Dt URAL 4
.Sh NAME
@ -52,6 +52,18 @@ and a radio transceiver (the model of which depends on the card revision).
The RT2522, RT2523, RT2524, RT2525, RT2525e and RT2526 radio transceivers
operate in the 2.4GHz band (802.11b/g) whereas the RT5222 is a dual-band radio
transceiver that can operate in the 2.4GHz and 5.2GHz bands (802.11a).
.Pp
.Nm
supports
.Cm station ,
.Cm adhoc ,
.Cm hostap ,
and
.Cm monitor
mode operation.
Only one virtual interface may be configured at any time.
For more information on configuring this device, see
.Xr ifconfig 8 .
.Sh HARDWARE
The
.Nm
@ -94,22 +106,25 @@ An up to date list can be found at
.Sh EXAMPLES
Join an existing BSS network (i.e., connect to an access point):
.Pp
.Dl "ifconfig ural0 inet 192.168.0.20 netmask 0xffffff00"
.Bd -literal -offset indent
ifconfig wlan create wlandev ural0 inet 192.168.0.20 \e
netmask 0xffffff00
.Ed
.Pp
Join a specific BSS network with network name
.Dq Li my_net :
.Pp
.Dl "ifconfig ural0 inet 192.168.0.20 netmask 0xffffff00 ssid my_net"
.Dl "ifconfig wlan create wlandev ural0 ssid my_net up"
.Pp
Join a specific BSS network with 40-bit WEP encryption:
Join a specific BSS network with 64-bit WEP encryption:
.Bd -literal -offset indent
ifconfig ural0 inet 192.168.0.20 netmask 0xffffff00 ssid my_net \e
wepmode on wepkey 0x1234567890 weptxkey 1
ifconfig wlan create wlandev ural0 ssid my_net \e
wepmode on wepkey 0x1234567890 weptxkey 1 up
.Ed
.Pp
Join a specific BSS network with 104-bit WEP encryption:
Join a specific BSS network with 128-bit WEP encryption:
.Bd -literal -offset indent
ifconfig ural0 inet 192.168.0.20 netmask 0xffffff00 ssid my_net \e
ifconfig wlan create wlandev ural0 wlanmode adhoc ssid my_net \e
wepmode on wepkey 0x01020304050607080910111213 weptxkey 1
.Ed
.Sh DIAGNOSTICS
@ -119,13 +134,18 @@ The driver will reset the hardware.
This should not happen.
.El
.Sh SEE ALSO
.Xr altq 4 ,
.Xr arp 4 ,
.Xr intro 4 ,
.Xr netintro 4 ,
.Xr usb 4 ,
.Xr wlan 4 ,
.Xr wlan_amrr 4 ,
.Xr ifconfig 8
.Xr wlan_ccmp 4 ,
.Xr wlan_tkip 4 ,
.Xr wlan_wep 4 ,
.Xr wlan_xauth 4 ,
.Xr ifconfig 8 ,
.Xr hostapd 8 ,
.Xr wpa_supplicant 8 .
.Rs
.%T "Ralink Technology"
.%O http://www.ralinktech.com/
@ -135,14 +155,8 @@ The
.Nm
driver first appeared in
.Ox 3.7 .
.Sh CAVEATS
.Pp
The
.Nm
driver does not support automatic adaptation of the transmit speed in IBSS
and HostAP operating modes.
.Sh AUTHORS
The
The original
.Nm
driver was written by
.An Damien Bergamini Aq damien@FreeBSD.org .
.An Damien Bergamini Aq damien.bergamini@free.fr

View File

@ -31,12 +31,12 @@
.\" $FreeBSD$
.\" $OpenBSD: wi.4tbl,v 1.14 2002/04/29 19:53:50 jsyn Exp $
.\"
.Dd July 16, 2005
.Dd April 13, 2008
.Dt WI 4
.Os
.Sh NAME
.Nm wi
.Nd "Lucent Hermes, Intersil PRISM and Spectrum24 IEEE 802.11 driver"
.Nd "Lucent Hermes, and Intersil PRISM IEEE 802.11 driver"
.Sh SYNOPSIS
To compile this driver into the kernel,
place the following lines in your
@ -55,74 +55,30 @@ if_wi_load="YES"
.Sh DESCRIPTION
The
.Nm
driver provides support for wireless network adapters based around
the Lucent Hermes, Intersil PRISM-II, Intersil PRISM-2.5, Intersil
Prism-3, and Symbol Spectrum24 chipsets.
All five chipsets provide a similar interface to the driver.
.Pp
Supported features include 802.11 and 802.3 frames, power management, BSS,
IBSS, WDS and old-style Lucent ad-hoc operation modes.
Cards based on the Intersil PRISM chips also support a host-based
access point mode which allows a card to act as a normal access point
(with some assistance from the
.Nm
driver).
The Lucent Hermes and Symbol Spectrum24 chipsets do not contain this
functionality.
The PRISM family of chips do not support the WDS functionality.
driver provides support for 802.11b wireless network adapters based around
the Lucent Hermes, Intersil PRISM-II, Intersil PRISM-2.5, and Intersil
Prism-3 chipsets.
All chipsets provide a similar interface to the driver.
Only the Intersil chipsets support access point operation.
Functionality, such as WPA support, depends on the specific version
of the firmware used.
All host/device interaction is via programmed I/O, even on those cards
that support a DMA interface.
.Pp
The
.Nm
driver encapsulates all IP and ARP traffic as 802.11 frames, however
it can receive either 802.11 or 802.3 frames.
Transmit speed is selectable between 1Mbps, 2Mbps, 5.5 Mbps and 11Mbps
depending on your hardware.
Most hardware supports 11Mbps where the signal quality allows, but
falls back to slower speeds when it does not.
Except for the Lucent WaveLAN Bronze cards, all cards supported by the
.Nm
driver support WEP for encryption.
To enable encryption, use
.Xr ifconfig 8
as shown below.
For more information on configuring this device, see
.Xr ifconfig 8 .
.Pp
By default, the
.Nm
driver configures the card for BSS operation (aka infrastructure
mode).
This mode requires the use of an access point (base station).
.Pp
The
.Nm
driver also supports a point-to-point mode
where stations can communicate amongst themselves without the
aid of an access point.
Note that there are two possible point-to-point modes.
One mode, referred to as
.Dq "ad-hoc demo mode" ,
or
.Dq "legacy Lucent ad-hoc mode" ,
predates the IEEE 802.11 specification and so may not interoperate
with cards from different vendors.
The standardized point-to-point mode is called IBSS (or confusingly
just ad-hoc mode), but is not supported by cards with very old
firmware revisions.
If your cards supports IBSS mode, it is recommended that you use it in
preference to the
.Dq "ad-hoc demo mode"
in new installations.
.Pp
Cards supported by the driver based on the Intersil PRISM family of chips also
have a host-based access point mode which allows the card to
act as an access point (base station).
Access points are different than operating in IBSS mode.
They operate in BSS mode.
They allow for easier roaming and bridge all Ethernet traffic such
that machines connected via an access point appear to be on the local
Ethernet segment.
.Pp
supports
.Cm station ,
.Cm adhoc ,
.Cm adhoc-demo ,
.Cm hostap ,
and
.Cm monitor
mode operation.
Only one
virtual interface may be configured at a time.
For more information on configuring this device, see
.Xr ifconfig 8 .
.Pp
@ -151,7 +107,6 @@ driver:
.Pp
.Bl -column -compact "Linksys Instant Wireless WPC11 2.5" "Spectrum24" "PCI or PCMCIA"
.Em "Card Chip Bus"
3Com AirConnect 3CRWE737A Spectrum24 PCMCIA
3Com AirConnect 3CRWE777A Prism-II PCI
Accton airDirect WN3301 PCMCIA
ACTIONTEC HWC01170 Prism-2.5 PCMCIA
@ -191,7 +146,6 @@ ELSA MC-11 PCMCIA
ELSA XI300 Prism-II PCMCIA
ELSA XI800 Prism-II CF
EMTAC A2424i Prism-II PCMCIA
Ericsson Wireless LAN CARD C11 Spectrum24 PCMCIA
Farallon Skyline Prism-II PCMCIA
Gemtek WL-311 Prism-2.5 PCMCIA
Hawking Technology WE110P Prism-2.5 PCMCIA
@ -199,7 +153,6 @@ Home Wireless Networks Prism-II PCMCIA
IBM High Rate Wireless Hermes PCMCIA
ICOM SL-1100 Prism-II PCMCIA
I-O DATA WN-B11/PCM Prism-II PCMCIA
Intel PRO/Wireless 2011 Spectrum24 PCMCIA
Intersil Prism II Prism-II PCMCIA
Intersil Mini-PCI Prism-2.5 PCI
Intersil ISL37100P Prism-3 PCMCIA
@ -240,8 +193,6 @@ SMC 2632 EZ Connect Prism-II PCMCIA
Socket Low Power WLAN-CF Prism-II CF
Sony PCWA-C100 Lucent PCMCIA
Sony PEGA-WL110 Prism-2.5 PCMCIA
Symbol Spectrum24 Spectrum24 PCMCIA
Symbol LA-4100 Spectrum24 CF
TDK LAK-CD011WL Prism-II PCMCIA
Toshiba Wireless LAN Card Prism-II PCMCIA
U.S.\& Robotics Wireless Card 2410 Prism-II PCMCIA
@ -284,52 +235,53 @@ DLink DWL520
.Sh EXAMPLES
Join an existing BSS network (ie: connect to an access point):
.Pp
.Dl "ifconfig wi0 inet 192.168.0.20 netmask 0xffffff00"
.Bd -literal -offset indent
ifconfig wlan create wlandev wi0 inet 192.168.0.20 \e
netmask 0xffffff00
.Ed
.Pp
Join a specific BSS network with network name
.Dq Li my_net :
.Pp
.Dl "ifconfig wi0 inet 192.168.0.20 netmask 0xffffff00 ssid my_net"
.Bd -literal -offset indent
ifconfig wlan create wlandev wi0 inet 192.168.0.20 \e
netmask 0xffffff00 ssid my_net
.Pp
Join a specific BSS network with WEP encryption:
.Bd -literal -offset indent
ifconfig wi0 inet 192.168.0.20 netmask 0xffffff00 ssid my_net \e
wepmode on wepkey 0x8736639624
ifconfig wlan create wlandev wi0 inet 192.168.0.20 \e
netmask 0xffffff00 ssid my_net \e
wepmode on wepkey 0x8736639624 weptxkey 1
.Ed
.Pp
Join a Lucent legacy demo ad-hoc network with network name
.Dq Li my_net :
.Bd -literal -offset indent
ifconfig wi0 inet 192.168.0.20 netmask 0xffffff00 ssid my_net \e
media DS/11Mbps mediaopt adhoc,link0
ifconfig wlan create wlandev wi0 wlanmode ahdemo \e
inet 192.168.0.20 netmask 0xffffff00 ssid my_net
.Ed
.Pp
Join/create an IBSS network with network name
.Dq Li my_net :
.Bd -literal -offset indent
ifconfig wi0 inet 192.168.0.22 netmask 0xffffff00 ssid my_net \e
media DS/11Mbps mediaopt adhoc
ifconfig wlan create wlandev wi0 wlanmode adhoc wi0 \e
inet 192.168.0.22 netmask 0xffffff00 ssid my_net
.Ed
.Pp
Create a host-based access point (Prism only):
.Bd -literal -offset indent
ifconfig wi0 inet 192.168.0.10 netmask 0xffffff00 ssid my_ap \e
media DS/11Mbps mediaopt hostap
ifconfig wlan create wlandev wi0 wlanmode hostap \e
inet 192.168.0.10 netmask 0xffffff00 ssid my_ap
.Ed
.Pp
Create a host-based access point with WEP enabled (Prism only):
Create a host-based access point with WEP enabled (Prism only)
and plumb it into bridge to fxp0:
.Bd -literal -offset indent
ifconfig wi0 inet 192.168.0.10 netmask 0xffffff00 ssid my_ap \e
wepmode on wepkey 0x1234567890 media DS/11Mbps \e
mediaopt hostap
.Ed
.Pp
Create a host-based wireless bridge to fxp0 (Prism only):
.Bd -literal -offset indent
ifconfig wi0 inet up ssid my_ap media DS/11Mbps mediaopt hostap
sysctl net.inet.ip.check_interface=0
ifconfig wlan0 create wlandev wi0 wlanmode hostap \e
inet 192.168.0.10 netmask 0xffffff00 ssid my_ap \e
wepmode on wepkey 0x1234567890 weptxkey 1
ifconfig bridge0 create
ifconfig bridge0 addm wi0 addm fxp0 up
ifconfig bridge0 addm wlan0 addm fxp0 up
.Ed
.Pp
This will give you the same functionality as an access point.
@ -347,16 +299,18 @@ The WaveLAN card failed to generate an interrupt to acknowledge a transmit
command.
.El
.Sh SEE ALSO
.Xr altq 4 ,
.Xr an 4 ,
.Xr arp 4 ,
.Xr ath 4 ,
.Xr netintro 4 ,
.Xr intro 4 ,
.Xr pccard 4 ,
.Xr pccbb 4 ,
.Xr pcic 4 ,
.Xr wlan 4 ,
.Xr wlan_ccmp 4 ,
.Xr wlan_tkip 4 ,
.Xr wlan_wep 4 ,
.Xr wlan_xauth 4 ,
.Xr hostapd 8 ,
.Xr ifconfig 8 ,
.Xr wpa_supplicant 8 .
.Rs
.%T HCF Light programming specification
.%O http://www.wavelan.com
@ -367,24 +321,21 @@ The
device driver first appeared in
.Fx 3.0 .
.Sh AUTHORS
The
The original
.Nm
driver was written by
.An Bill Paul Aq wpaul@ctr.columbia.edu .
This man page comes from
.Ox .
.Sh CAVEATS
Different regulatory domains have different default channels for adhoc
mode.
See
.Xr ifconfig 8
for information on how to change the channel.
The Intersil Prism family of chips' host-based access point mode has
bugs for station firmware versions prior to 0.8.3.
The driver currently precludes hostap functionality with older station
firmware.
The best version of the station firmware for the Prism family of chips
seems to be 1.4.9.
The driver will reject devices with old firmware to
avoid dealing with numerous defects.
Unfortunately the driver does not support downloading new firmware
to the card so if new firmware is needed users will have to boot
a different system to accomplish this.
.Pp
Intersil Prism cards must have firmware versions 0.8.0 or later and
version 1.7.0 or later are required to support functionality such as WPA.
Some users of Prism-II and 2.5 based cards report that station firmware
version 1.3.4 works better for them in hostap than 1.4.9.
Older versions of the Prism station firmware have a number of issues
@ -394,15 +345,8 @@ later.
The IBSS/adhoc mode appears to have problems for some people with
older versions of station firmware.
.Pp
Lucent cards prior to firmware version 6.0.6 do not support IBSS
mode.
These cards support only the pre-802.11 mode known as
.Dq "demo ad-hoc mode"
which does not interoperate with stations in IBSS mode.
.Pp
Prism cards prior to version 0.8.0 do not support IBSS mode.
.Pp
Symbol cards prior to version 2.50.00 do not support IBSS mode.
Lucent cards prior to firmware version 6.0.6 do not implement IBSS
mode and are not supported.
.Sh BUGS
Not all the new messages are documented here, and many of them are
indications of transient errors that are not indications of serious

View File

@ -25,7 +25,7 @@
.\"
.\" $FreeBSD$
.\"
.Dd September 6, 2007
.Dd April 12, 2008
.Dt WLAN 4
.Os
.Sh NAME
@ -41,50 +41,96 @@ Where a device does not directly support 802.11 functionality
this layer fills in.
The
.Nm
is required for the
.Xr an 4 ,
.Xr ath 4 ,
.Xr ipw 4 ,
.Xr iwi 4 ,
.Xr ral 4 ,
.Xr rum 4 ,
.Xr ural 4 ,
.Xr wi 4 ,
.Xr wpi 4 ,
and
.Xr zyd 4
drivers, with other drivers to follow.
module is required by all native 802.11 drivers as well as the
.Xr ndis 4
support.
.Pp
The
.Nm
module supports multi-mode devices capable of
supports multi-mode devices capable of
operating in both 2.4GHz and 5GHz bands and supports numerous
802.11 protocols: 802.11a, 802.11b, and 802.11g.
802.11 standards: 802.11a, 802.11b, 802.11g, and 802.11n.
The WPA, 802.11i, and 802.1x security protocols are supported
through a combination of in-kernel code and user-mode applications.
The WME and WMM multi-media protocols are supported entirely within
The WME/WMM multi-media protocols are supported entirely within
the
.Nm
module but require a suitably capable hardware device.
Likewise the 802.11h specification is supported only by suitably
capable devices.
.Pp
The
Drivers provide 802.11 functionality through
.Nm
module defines several mechanisms by which plugin modules may
be used to extend functionality.
interfaces that are created at runtime using interface cloning.
This is done with the
.Xr ifconfig 8
.Cm create
command or using the
.Va vaps_IFX
variable in
.Xr rc.conf 5 .
Some drivers support the creation of multiple
.Nm
interfaces that share the same underlying device;
this is the way by which ``multi-bss support'' is provided but it
can also be used to create WDS links and other interesting applications.
.Pp
There are several types of
.Nm
interfaces that may be created:
.Bl -tag -width monitor
.It Cm sta
A client station in an infrastructure bss
(i.e. one that associates to an access point).
.It Cm hostap
An access point in an infrastructure bss.
.It Cm adhoc
A station in an IBSS network.
.It Cm ahdemo
A station operating in ``adhoc demo mode''.
This is essentially an IBSS station that does not use management
frames (e.g. no beacons are transmitted).
An
.Cm ahdemo
interface is especially useful for applications that want to transmit
and receive raw 802.11 packets.
.It Cm monitor
An interface used exclusively for capturing 802.11 frames.
In particular this specified to have read-only properties
which enables it to be operated on frequencies where one
would otherwise not be allowed.
.It Cm wds
A station that passes 4-address 802.11 traffic for the purpose
of tunneling traffic over a wireless link.
Typically this station would share the same MAC address as a
.Cm hostap
interface.
It may be possible to create
.Cm wds
interfaces without a companion
.Cm hostap
interface but that is not guaranteed; one may need to create a
.Cm hostap
interface that does not send beacon frames before
.Cm wds
interfaces may be created.
.El
.Pp
More types are planned to support
802.11s mesh nodes (station and ap).
Note that an interface's type cannot be changed once it is created.
.Pp
.Nm
defines several mechanisms by which plugin modules may
be used to extend its' functionality.
Cryptographic support such as WEP, TKIP, and AES-CCMP are implemented
as modules that are loaded on demand (if not statically configured
into a system).
as standalone modules (if not statically configured into a system)
that register with
.Nm .
Similarly there is an authenticator framework for defining 802.11
authentication services and a framework for integrating access
control mechanisms specific to the 802.11 protocol.
.Sh DEBUGGING
If the associated interface is marked for debugging with, for example,
.Pp
.Dl "ifconfig wi0 debug"
.Pp
then messages describing the operation of the 802.11 protocol will
be sent to the console.
Complete debugging controls are available using:
Debugging controls are available using:
.Pp
.Dl "sysctl net.wlan.X.debug=mask"
.Pp
@ -101,19 +147,15 @@ For example,
enables debugging messages related to scanning for an access point,
adhoc neighbor, or an unoccupied channel when operation as an access point.
The
.Xr 80211debug
.Xr wlandebug 8
tool provides a more user-friendly mechanism for doing the same thing.
Note that
.Pp
Many drivers will also display the contents of each 802.11 frame
sent and received when the interface is marked with
both debugging and
.Cm link2 ;
e.g.,
.Dl "sysctl net.wlan.debug=mask"
.Pp
.Dl "ifconfig wi0 debug link2"
.Pp
Beware however that some management frames may be processed entirely within
the device and not be received by the host.
defines the initial value of the debugging flags for each cloned
.Nm
interface; this is useful to enable debug messages during interface creation.
.Sh COMPATIBILITY
The module name of
.Nm
@ -122,8 +164,11 @@ was used to be compatible with
.Sh SEE ALSO
.Xr an 4 ,
.Xr ath 4 ,
.Xr bwi 4 ,
.Xr ipw 4 ,
.Xr iwi 4 ,
.Xr iwn 4 ,
.Xr mwl 4 ,
.Xr netintro 4 ,
.Xr ral 4 ,
.Xr rum 4 ,
@ -137,7 +182,7 @@ was used to be compatible with
.Xr wpi 4 ,
.Xr zyd 4
.Sh STANDARDS
More information can be found in the IEEE 802.11 Standard.
More information can be found in the IEEE 802.11 Standards.
.Sh HISTORY
The
.Nm
@ -152,7 +197,8 @@ software from which this work began.
brought the code into
.Fx
and then rewrote it to support multi-mode devices,
802.11g, WPA/802.11i, WME, and add the extensible frameworks
802.11g, 802.11n, WPA/802.11i, WME, multi-bss, and
add the extensible frameworks
for cryptographic, authentication, and access control plugins.
This manual page was written by
.An Tom Rhodes Aq trhodes@FreeBSD.org .

View File

@ -40,12 +40,11 @@ module implements a MAC-based access control plugin for use
with 802.11 devices operating as an access point.
The
.Nm
module is an 802.11 access control plugin module for use with the
.Xr wlan 4
module.
This module is automatically loaded if an application configures
an access control policy for an 802.11 device operating as an access
point.
must be loaded for
.Xr ifconfig 8
to handle the
.Cm mac:*
requests.
.Sh SEE ALSO
.Xr wlan 4 ,
.Xr ifconfig 8

View File

@ -25,7 +25,7 @@
.\"
.\" $FreeBSD$
.\"
.Dd September 10, 2007
.Dd April 13, 2008
.Dt WLAN_AMRR 4
.Os
.Sh NAME
@ -37,15 +37,15 @@
The
.Nm
module implements the Adaptive Multi-Rate Retry tx rate control
algorithm for use with 802.11 devices.
The
.Nm
module is an 802.11 tx rate control module for use by the
device-independent implementation.
algorithm for use by 802.11 device drivers.
.Sh SEE ALSO
.Xr bwi 4 ,
.Xr iwn 4 ,
.Xr ral 4 ,
.Xr rum 4 ,
.Xr ural 4 ,
.Xr wlan 4 ,
.Xr wpi 4 ,
.Xr zyd 4
.Sh STANDARDS
More information can be found in the paper describing the

View File

@ -36,7 +36,9 @@
.Sh DESCRIPTION
The
.Nm
module implements an authenticator plugin that is intended
module is a
.Xr wlan 4
authenticator plugin
for use with user-mode authentication implementations such
as
.Nm hostapd .
@ -44,13 +46,10 @@ It hooks into the 802.11 layer and does nothing.
As a result, 802.11 stations that associate are not authorized to
send or receive frames until they are authorized by an external agent;
typically using a protocol such as WPA, 802.1x, or 802.11i.
The
.Nm
module is an 802.11 authenticator plugin module for use by the
.Xr wlan 4
module.
This module is automatically loaded if an application configures
an 802.11 device for operation as an AP with WPA or 802.1x authentication.
.Pp
This module is automatically loaded by the rc script that normally
starts
.Xr hostapd 8 .
.Sh SEE ALSO
.Xr wlan 4
.Sh STANDARDS

View File

@ -26,7 +26,7 @@
.\"
.\" $FreeBSD$
.\"
.Dd March 6, 2007
.Dd Apri 13, 2008
.Os
.Dt WPI 4
.Sh NAME
@ -38,6 +38,7 @@ place the following lines in your
kernel configuration file:
.Bd -ragged -offset indent
.Cd "device wpi"
.Cd "device wpifw"
.Cd "device pci"
.Cd "device wlan"
.Cd "device wlan_amrr"
@ -45,40 +46,41 @@ kernel configuration file:
.Ed
.Pp
Alternatively, to load the driver as a
module at boot time, place the following lines in
module at boot time, place the following line in
.Xr loader.conf 5 :
.Bd -literal -offset indent
if_wpi_load="YES"
wlan_load="YES"
wlan_amrr_load="YES"
firmware_load="YES"
.Ed
.Pp
In both cases, place the following line in
.Xr loader.conf 5
to load the firmware modules:
to acknowledge the firmware license (see below):
.Bd -literal -offset indent
wpifw_load="YES"
legal.intel_wpi.license_ack=1
.Ed
.Sh DESCRIPTION
The
.Nm
driver is an experimental driver providing support for the
driver provides support for the
.Tn Intel
3945ABG Wireless network adapter
.Pp
By default, the
.Nm
driver configures the adapter for BSS operation (aka infrastructure mode).
This mode requires the use of an access point.
.Pp
supports
.Cm station ,
.Cm adhoc ,
and
.Cm monitor
mode operation.
Only one virtual interface may be configured at any time.
For more information on configuring this device, see
.Xr ifconfig 8 .
.Pp
This driver requires firmware to be loaded before it will work.
For the loaded firmware to work the license at
.Pa /usr/share/doc/legal/intel_wpi/LICENSE
must be agreed to and the following line be added to
This driver requires the firmware built with the
.Nm wpifw
module to work.
For the loaded firmware to be enabled for use the license at
.Pa /usr/share/doc/legal/intel_iwi/LICENSE
must be agreed by adding the following line to
.Xr loader.conf 5 :
.Pp
.Dl "legal.intel_wpi.license_ack=1"
@ -91,35 +93,38 @@ firmware license
.Sh EXAMPLES
Join an existing BSS network (i.e., connect to an access point):
.Pp
.Dl "ifconfig wpi0 inet 192.168.0.20 netmask 0xffffff00"
.Bd -literal -offset indent
ifconfig wlan create wlandev wpi0 inet 192.168.0.20 \e
netmask 0xffffff00
.Ed
.Pp
Join a specific BSS network with network name
.Dq Li my_net :
.Pp
.Dl "ifconfig wpi0 inet 192.168.0.20 netmask 0xffffff00 ssid my_net"
.Dl "ifconfig wlan create wlandev wpi0 ssid my_net up"
.Pp
Join a specific BSS network with 40-bit WEP encryption:
Join a specific BSS network with 64-bit WEP encryption:
.Bd -literal -offset indent
ifconfig wpi0 inet 192.168.0.20 netmask 0xffffff00 ssid my_net \e
wepmode on wepkey 0x1234567890 weptxkey 1
ifconfig wlan create wlandev wpi0 ssid my_net \e
wepmode on wepkey 0x1234567890 weptxkey 1 up
.Ed
.Pp
Join a specific BSS network with 104-bit WEP encryption:
Join a specific BSS network with 128-bit WEP encryption:
.Bd -literal -offset indent
ifconfig wpi0 inet 192.168.0.20 netmask 0xffffff00 ssid my_net \e
ifconfig wlan create wlandev wpi0 wlanmode adhoc ssid my_net \e
wepmode on wepkey 0x01020304050607080910111213 weptxkey 1
.Ed
.Sh DIAGNOSTICS
.Bl -diag
.It "wpi%d: could not load firmware image '%s'"
The driver failed to load the firmware image using the
.Xr firmware 9
subsystem.
Verify that the necessary firmware modules are loaded and the
license agreement
Verify the
.Xr wpifw
firmware module is installed and the license agreement
.Xr loader 8
tunable has been set.
.It "wpi%d: could not load firmware"
An attempt to upload the firmware image to the onboard microcontroller failed.
This should not happen.
.It "wpi%d: fatal firmware error"
An unknown error has occurred in the uploaded firmware, you may have to
unload/reload the driver to continue.
@ -129,23 +134,27 @@ Data transmission is not possible in this state.
.Sh BUGS
Not all the error messages are documented here.
.Pp
Automatic recovery of firmware failures is not currently supported, nor is
detection of toggling the radio switch on.
.Pp
Background scanning is not currently supported.
.El
.Sh SEE ALSO
.Xr altq 4 ,
.Xr ipw 4 ,
.Xr iwi 4 ,
.Xr wpifw 4 ,
.Xr pci 4 ,
.Xr wlan 4 ,
.Xr ifconfig 8
.Xr wlan_ccmp 4 ,
.Xr wlan_tkip 4 ,
.Xr wlan_wep 4 ,
.Xr ifconfig 8 ,
.Xr wpa_supplicant 8 .
.Sh AUTHORS
.An -nosplit
The
The original
.Nm
driver was written by
.An Damien Bergamini Aq damien.bergamini@free.fr
and
.An Benjamin Close Aq benjsc@FreeBSD.org .
driver was written for
.Ox
by
.An Damien Bergamini Aq damien.bergamini@free.fr .
.An Benjamin Close Aq benjsc@FreeBSD.org
ported
.Nm
to
.Fx .

View File

@ -32,7 +32,7 @@
.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
.\" THE POSSIBILITY OF SUCH DAMAGE.
.\"
.Dd September 6, 2007
.Dd Apri 13, 2008
.Dt ZYD 4
.Os
.Sh NAME
@ -64,34 +64,16 @@ The
driver provides support for wireless network adapters based around
the ZyDAS ZD1211 and ZD1211B USB chips.
.Pp
These are the modes the
.Nm
driver can operate in:
.Bl -tag -width "IBSS-masterXX"
.It BSS mode
Also known as
.Em infrastructure
mode, this is used when associating with an access point, through
which all traffic passes.
This mode is the default.
.It monitor mode
In this mode the driver is able to receive packets without
associating with an access point.
This disables the internal receive filter and enables the card to
capture packets from networks which it wouldn't normally have access to,
or to scan for access points.
.El
.Pp
.Nm
supports software WEP.
Wired Equivalent Privacy (WEP) is the de facto encryption standard
for wireless networks.
It can be typically configured in one of three modes:
no encryption; 40-bit encryption; or 104-bit encryption.
Unfortunately, due to serious weaknesses in WEP protocol
it is strongly recommended that it not be used as the
sole mechanism to secure wireless communication.
WEP is not enabled by default.
supports
.Cm station ,
.Cm adhoc ,
and
.Cm monitor
mode operation.
Only one virtual interface may be configured at any time.
For more information on configuring this device, see
.Xr ifconfig 8 .
.Sh HARDWARE
The following devices are known to be supported by the
.Nm
@ -143,24 +125,20 @@ driver:
.El
.Sh EXAMPLES
The following
examples configures zyd0 to join whatever network is available on boot,
using WEP key
examples configures zyd0 to join any BSS network using WEP key
.Dq 0x1deadbeef1 ,
channel 11:
.Bd -literal -offset indent
inet 192.168.1.1 netmask 255.255.255.0 wepkey 0x1deadbeef1 channel 11
.Ed
.Pp
Configure zyd0 for WEP, using hex key
.Dq 0x1deadbeef1 :
.Bd -literal -offset indent
# ifconfig zyd0 wepkey 0x1deadbeef1
ifconfig wlan create wlandev zyd0 channel 11 \e
wepmode on wepkey 0x1deadbeef1 weptxkey 1 \e
inet 192.168.1.1 netmask 255.255.255.0
.Ed
.Pp
Join an existing BSS network,
.Dq my_net :
.Bd -literal -offset indent
# ifconfig zyd0 192.168.0.2 netmask 0xffffff00 ssid my_net
ifconfig wlan create wlandev zyd0 192.168.0.2 \e
netmask 0xffffff00 ssid my_net
.Ed
.Sh DIAGNOSTICS
.Bl -diag
@ -181,16 +159,19 @@ The driver will reset the hardware.
This should not happen.
.El
.Sh SEE ALSO
.Xr arp 4 ,
.Xr intro 4 ,
.Xr netintro 4 ,
.Xr usb 4 ,
.Xr wlan 4 ,
.Xr wlan_amrr 4 ,
.Xr ifconfig 8
.Xr wlan_ccmp 4 ,
.Xr wlan_tkip 4 ,
.Xr wlan_wep 4 ,
.Xr ifconfig 8 ,
.Xr wpa_supplicant 8 .
.Sh AUTHORS
.An -nosplit
The
The original
.Nm
driver was written by
.An Florian Stoehr Aq ich@florian-stoehr.de ,

View File

@ -55,6 +55,7 @@ MAN= acct.5 \
protocols.5 \
quota.user.5 \
rc.conf.5 \
regdomain.5 \
reiserfs.5 \
remote.5 \
resolver.5 \

View File

@ -0,0 +1,48 @@
.\" Copyright (c) 2008 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 Apri 13, 2008
.Dt REGDOMAIN 5
.Os
.Sh NAME
.Nm regdomain.xml
.Nd "802.11 wireless regulatory definitions"
.Sh DESCRIPTION
The
.Nm
file describes regulations for the operation of IEEE 802.11 wireless radios.
.Pp
This information is used by the
.Xr ifconfig 8
program to construct regulatory state for download to the system.
This file should be changed only to reflect changes in regulations.
.Sh FILES
.Bl -tag -width /etc/regdomain.xml -compact
.It Pa /etc/regdomain.xml
XML database of 802.11 regulatory constraints
.El
.Sh SEE ALSO
.Xr wlan 4
.Xr ifconfig 8 ,

View File

@ -239,8 +239,6 @@ device wlan_wep # 802.11 WEP support
device wlan_ccmp # 802.11 CCMP support
device wlan_tkip # 802.11 TKIP support
device wlan_amrr # AMRR transmit rate control algorithm
device wlan_scan_ap # 802.11 AP mode scanning
device wlan_scan_sta # 802.11 STA mode scanning
device an # Aironet 4500/4800 802.11 wireless NICs.
device ath # Atheros pci/cardbus NIC's
device ath_hal # Atheros HAL (Hardware Access Layer)

View File

@ -130,8 +130,6 @@ device wlan # 802.11 support
device wlan_wep # 802.11 WEP support
device wlan_ccmp # 802.11 CCMP support
device wlan_tkip # 802.11 TKIP support
device wlan_scan_sta
device wlan_scan_ap
device wlan_xauth
device ath # Atheros pci/cardbus NIC's
device ath_hal # Atheros HAL (Hardware Access Layer)

View File

@ -147,5 +147,3 @@ device wlan_wep # 802.11 WEP support
device wlan_ccmp # 802.11 CCMP support
device wlan_tkip # 802.11 TKIP support
device wlan_amrr # AMRR transmit rate control algorithm
device wlan_scan_ap # 802.11 AP mode scanning
device wlan_scan_sta # 802.11 STA mode scanning

View File

@ -135,5 +135,3 @@ device wlan_wep # 802.11 WEP support
device wlan_ccmp # 802.11 CCMP support
device wlan_tkip # 802.11 TKIP support
device wlan_amrr # AMRR transmit rate control algorithm
device wlan_scan_ap # 802.11 AP mode scanning
device wlan_scan_sta # 802.11 STA mode scanning

View File

@ -768,8 +768,6 @@ device wlan_tkip #802.11 TKIP support
device wlan_xauth #802.11 external authenticator support
device wlan_acl #802.11 MAC ACL support
device wlan_amrr #AMRR transmit rate control algorithm
device wlan_scan_ap #802.11 AP mode scanning
device wlan_scan_sta #802.11 STA mode scanning
device token #Generic TokenRing
device fddi #Generic FDDI
device arcnet #Generic Arcnet

View File

@ -770,6 +770,9 @@ dev/le/lance.c optional le
dev/led/led.c standard
dev/lge/if_lge.c optional lge
dev/lmc/if_lmc.c optional lmc
dev/malo/if_malo.c optional malo
dev/malo/if_malohal.c optional malo
dev/malo/if_malo_pci.c optional malo pci
dev/mc146818/mc146818.c optional mc146818
dev/mca/mca_bus.c optional mca
dev/mcd/mcd.c optional mcd isa nowerror
@ -918,7 +921,6 @@ dev/puc/pucdata.c optional puc pci
dev/quicc/quicc_core.c optional quicc
dev/ral/rt2560.c optional ral
dev/ral/rt2661.c optional ral
dev/ral/if_ralrate.c optional ral
dev/ral/if_ral_pci.c optional ral pci
dev/random/harvest.c standard
dev/random/hash.c optional random
@ -1677,24 +1679,32 @@ net/zlib.c optional crypto | geom_uzip | ipsec | \
mxge | ppp_deflate | netgraph_deflate
net80211/ieee80211.c optional wlan
net80211/ieee80211_acl.c optional wlan_acl
net80211/ieee80211_adhoc.c optional wlan
net80211/ieee80211_amrr.c optional wlan_amrr
net80211/ieee80211_crypto.c optional wlan
net80211/ieee80211_crypto_ccmp.c optional wlan_ccmp
net80211/ieee80211_crypto_none.c optional wlan
net80211/ieee80211_crypto_tkip.c optional wlan_tkip
net80211/ieee80211_crypto_wep.c optional wlan_wep
net80211/ieee80211_ddb.c optional wlan ddb
net80211/ieee80211_dfs.c optional wlan
net80211/ieee80211_freebsd.c optional wlan
net80211/ieee80211_hostap.c optional wlan
net80211/ieee80211_ht.c optional wlan
net80211/ieee80211_input.c optional wlan
net80211/ieee80211_ioctl.c optional wlan
net80211/ieee80211_monitor.c optional wlan
net80211/ieee80211_node.c optional wlan
net80211/ieee80211_output.c optional wlan
net80211/ieee80211_phy.c optional wlan
net80211/ieee80211_power.c optional wlan
net80211/ieee80211_proto.c optional wlan
net80211/ieee80211_regdomain.c optional wlan
net80211/ieee80211_rssadapt.c optional wlan_rssadapt
net80211/ieee80211_scan.c optional wlan
net80211/ieee80211_scan_ap.c optional wlan_scan_ap
net80211/ieee80211_scan_sta.c optional wlan_scan_sta
net80211/ieee80211_scan_sta.c optional wlan
net80211/ieee80211_sta.c optional wlan
net80211/ieee80211_wds.c optional wlan
net80211/ieee80211_xauth.c optional wlan_xauth
netatalk/aarp.c optional netatalk
netatalk/at_control.c optional netatalk

View File

@ -734,6 +734,11 @@ ATH_RXBUF opt_ath.h
ATH_DIAGAPI opt_ath.h
ATH_TX99_DIAG opt_ath.h
# options for the Marvell 8335 wireless driver
MALO_DEBUG opt_malo.h
MALO_TXBUF opt_malo.h
MALO_RXBUF opt_malo.h
# dcons options
DCONS_BUF_SIZE opt_dcons.h
DCONS_POLL_HZ opt_dcons.h
@ -763,5 +768,10 @@ XFS
# Interrupt filtering
INTR_FILTER
# 802.11 support layer
IEEE80211_DEBUG opt_wlan.h
IEEE80211_DEBUG_REFCNT opt_wlan.h
IEEE80211_AMPDU_AGE opt_wlan.h
#Disable code to dispatch tcp offloading
TCP_OFFLOAD_DISABLE opt_inet.h

View File

@ -0,0 +1,16 @@
$FreeBSD$
Copyright (c) 2005-2008, Ralink Technology Corp.
Paul Lin <paul_lin@ralinktech.com.tw>
Permission to use, copy, modify, and distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

View File

@ -0,0 +1,36 @@
# $FreeBSD$
FILES= rt2561s.fw.uu rt2561.fw.uu rt2661.fw.uu rt2860.fw.uu
rt2561s.fw.uu: rt2661_ucode.h LICENSE
(cat rt2661_ucode.h; \
echo 'int main(void) { \
write(1, rt2561s_ucode, sizeof(rt2561s_ucode)); return 0; \
}') | ${CC} -o build -x c -
(sed 's/^/# /' LICENSE; ./build | uuencode rt2561s.fw) > ${.TARGET}
rt2561.fw.uu: rt2661_ucode.h LICENSE
(cat rt2661_ucode.h; \
echo 'int main(void) { \
write(1, rt2561_ucode, sizeof(rt2561_ucode)); return 0; \
}') | ${CC} -o build -x c -
(sed 's/^/# /' LICENSE; ./build | uuencode rt2561.fw) > ${.TARGET}
rt2661.fw.uu: rt2661_ucode.h LICENSE
(cat rt2661_ucode.h; \
echo 'int main(void) { \
write(1, rt2661_ucode, sizeof(rt2661_ucode)); return 0; \
}') | ${CC} -o build -x c -
(sed 's/^/# /' LICENSE; ./build | uuencode rt2661.fw) > ${.TARGET}
rt2860.fw.uu: rt2661_ucode.h LICENSE
(cat rt2661_ucode.h; \
echo 'int main(void) { \
write(1, rt2860_ucode, sizeof(rt2860_ucode)); return 0; \
}') | ${CC} -o build -x c -
(sed 's/^/# /' LICENSE; ./build | uuencode rt2860.fw) > ${.TARGET}
clean:
rm -f build build.c ${FILES}
.include <bsd.prog.mk>

View File

@ -0,0 +1,202 @@
# $FreeBSD$
#
# Copyright (c) 2005-2008, Ralink Technology Corp.
# Paul Lin <paul_lin@ralinktech.com.tw>
#
# Permission to use, copy, modify, and distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
begin 644 rt2561.fw
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
M(HY+CTS2C"(```````#"#>3U+B(`````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M```````````````````````````````````````````````````````````(
"K#``
`
end

View File

@ -0,0 +1,202 @@
# $FreeBSD$
#
# Copyright (c) 2005-2008, Ralink Technology Corp.
# Paul Lin <paul_lin@ralinktech.com.tw>
#
# Permission to use, copy, modify, and distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
begin 644 rt2561s.fw
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
M3-*,(@```````,(-Y/4N(@``````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M```````````````````````````````````````````````````````````(
"NV``
`
end

View File

@ -0,0 +1,202 @@
# $FreeBSD$
#
# Copyright (c) 2005-2008, Ralink Technology Corp.
# Paul Lin <paul_lin@ralinktech.com.tw>
#
# Permission to use, copy, modify, and distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
begin 644 rt2661.fw
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
M``````#"#>3U+B(`````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M```````````````````````````````````````````````````````````(
"0\\`
`
end

View File

@ -1,8 +1,8 @@
/* $FreeBSD$ */
/* OpenBSD: microcode.h,v 1.1 2006/01/09 20:03:40 damien Exp */
/* $OpenBSD: microcode.h,v 1.5 2008/03/06 09:18:04 deraadt Exp $ */
/*-
* Copyright (c) 2005-2006, Ralink Technology, Corp.
* Copyright (c) 2005-2008, Ralink Technology, Corp.
* Paul Lin <paul_lin@ralinktech.com.tw>
*
* Permission to use, copy, modify, and distribute this software for any
@ -23,7 +23,7 @@
* RT2561S and RT2661 chipsets.
*/
static const uint8_t rt2561_ucode[] = {
static const unsigned char rt2561_ucode[] = {
0x02, 0x1c, 0x12, 0x02, 0x13, 0xcb, 0xc2, 0x8c, 0x22, 0x22, 0x00,
0x02, 0x16, 0x0f, 0xc2, 0xaf, 0xc2, 0x8d, 0x75, 0x8c, 0x94, 0x75,
0x8a, 0x93, 0xd2, 0xaf, 0x22, 0x02, 0x18, 0xda, 0x12, 0x1b, 0xe8,
@ -771,7 +771,7 @@ static const uint8_t rt2561_ucode[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xac, 0x30
};
static const uint8_t rt2561s_ucode[] = {
static const unsigned char rt2561s_ucode[] = {
0x02, 0x1c, 0x2d, 0x02, 0x07, 0xdf, 0xc2, 0x8c, 0x22, 0x22, 0x00,
0x02, 0x19, 0x43, 0xc2, 0xaf, 0xc2, 0x8d, 0x75, 0x8c, 0x94, 0x75,
0x8a, 0x93, 0xd2, 0xaf, 0x22, 0x02, 0x1a, 0x9c, 0x12, 0x08, 0xdf,
@ -1519,7 +1519,7 @@ static const uint8_t rt2561s_ucode[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xbb, 0x60
};
static const uint8_t rt2661_ucode[] = {
static const unsigned char rt2661_ucode[] = {
0x02, 0x12, 0xde, 0x02, 0x14, 0xf0, 0xc2, 0x8c, 0x22, 0x22, 0x00,
0x02, 0x16, 0xe5, 0xc2, 0xaf, 0xc2, 0x8d, 0x75, 0x8c, 0x94, 0x75,
0x8a, 0x93, 0xd2, 0xaf, 0x22, 0x02, 0x19, 0x89, 0xe5, 0x30, 0x12,
@ -2266,3 +2266,751 @@ static const uint8_t rt2661_ucode[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x43, 0xcf
};
static const unsigned char rt2860_ucode[] = {
0x02, 0x00, 0xe2, 0x02, 0x02, 0xec, 0x22, 0x22, 0xff, 0xff, 0xff,
0x02, 0x01, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0x02, 0x00, 0x1e,
0xff, 0xff, 0xff, 0xff, 0xff, 0x02, 0x01, 0x6e, 0xc0, 0xe0, 0xc0,
0xf0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0xd0, 0x75, 0xd0, 0x18, 0xc2,
0xaf, 0x30, 0x45, 0x03, 0x12, 0x10, 0x09, 0x90, 0x04, 0x16, 0xe0,
0x30, 0xe3, 0x0d, 0x74, 0x08, 0xf0, 0xe5, 0x55, 0x60, 0x06, 0x64,
0x03, 0x60, 0x02, 0xd2, 0x03, 0x90, 0x04, 0x14, 0xe0, 0x20, 0xe7,
0x03, 0x02, 0x00, 0xd5, 0x74, 0x80, 0xf0, 0x90, 0x70, 0x12, 0xe0,
0xf5, 0x36, 0x90, 0x04, 0x04, 0xe0, 0x24, 0xcf, 0x60, 0x30, 0x14,
0x60, 0x42, 0x24, 0xe2, 0x60, 0x47, 0x14, 0x60, 0x55, 0x24, 0x21,
0x70, 0x60, 0xe5, 0x55, 0x24, 0xfe, 0x60, 0x07, 0x14, 0x60, 0x08,
0x24, 0x02, 0x70, 0x08, 0x7d, 0x01, 0x80, 0x28, 0x7d, 0x02, 0x80,
0x24, 0x90, 0x70, 0x10, 0xe0, 0xf5, 0x50, 0x85, 0x36, 0x40, 0xd2,
0x01, 0x80, 0x3e, 0xe5, 0x55, 0x64, 0x03, 0x60, 0x04, 0xe5, 0x55,
0x70, 0x04, 0x7d, 0x02, 0x80, 0x09, 0x85, 0x36, 0x41, 0xd2, 0x02,
0x80, 0x29, 0xad, 0x55, 0xaf, 0x36, 0x12, 0x02, 0xc8, 0x80, 0x20,
0x90, 0x70, 0x10, 0xe0, 0xf5, 0x47, 0x90, 0x70, 0x11, 0xe0, 0xf5,
0x44, 0x12, 0x10, 0x25, 0x80, 0x06, 0x90, 0x70, 0x10, 0xe0, 0xf5,
0x45, 0xe4, 0xfd, 0xaf, 0x36, 0x12, 0x02, 0xc8, 0xd2, 0x04, 0x90,
0x70, 0x13, 0xe4, 0xf0, 0xd2, 0xaf, 0xd0, 0xd0, 0xd0, 0x82, 0xd0,
0x83, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0x78, 0x7f, 0xe4, 0xf6, 0xd8,
0xfd, 0x75, 0x81, 0x7d, 0x02, 0x01, 0x29, 0x02, 0x02, 0x0b, 0xe4,
0x93, 0xa3, 0xf8, 0xe4, 0x93, 0xa3, 0x40, 0x03, 0xf6, 0x80, 0x01,
0xf2, 0x08, 0xdf, 0xf4, 0x80, 0x29, 0xe4, 0x93, 0xa3, 0xf8, 0x54,
0x07, 0x24, 0x0c, 0xc8, 0xc3, 0x33, 0xc4, 0x54, 0x0f, 0x44, 0x20,
0xc8, 0x83, 0x40, 0x04, 0xf4, 0x56, 0x80, 0x01, 0x46, 0xf6, 0xdf,
0xe4, 0x80, 0x0b, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,
0x90, 0x03, 0x9a, 0xe4, 0x7e, 0x01, 0x93, 0x60, 0xbc, 0xa3, 0xff,
0x54, 0x3f, 0x30, 0xe5, 0x09, 0x54, 0x1f, 0xfe, 0xe4, 0x93, 0xa3,
0x60, 0x01, 0x0e, 0xcf, 0x54, 0xc0, 0x25, 0xe0, 0x60, 0xa8, 0x40,
0xb8, 0xe4, 0x93, 0xa3, 0xfa, 0xe4, 0x93, 0xa3, 0xf8, 0xe4, 0x93,
0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xca, 0xc5, 0x83, 0xca, 0xf0, 0xa3,
0xc8, 0xc5, 0x82, 0xc8, 0xca, 0xc5, 0x83, 0xca, 0xdf, 0xe9, 0xde,
0xe7, 0x80, 0xbe, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x83, 0xc0, 0x82,
0xc0, 0xd0, 0xe8, 0xc0, 0xe0, 0xe9, 0xc0, 0xe0, 0xea, 0xc0, 0xe0,
0xeb, 0xc0, 0xe0, 0xec, 0xc0, 0xe0, 0xed, 0xc0, 0xe0, 0xee, 0xc0,
0xe0, 0xef, 0xc0, 0xe0, 0xc2, 0xaf, 0x30, 0x45, 0x03, 0x12, 0x10,
0x12, 0xd2, 0xaf, 0xd0, 0xe0, 0xff, 0xd0, 0xe0, 0xfe, 0xd0, 0xe0,
0xfd, 0xd0, 0xe0, 0xfc, 0xd0, 0xe0, 0xfb, 0xd0, 0xe0, 0xfa, 0xd0,
0xe0, 0xf9, 0xd0, 0xe0, 0xf8, 0xd0, 0xd0, 0xd0, 0x82, 0xd0, 0x83,
0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x83,
0xc0, 0x82, 0xc0, 0xd0, 0x75, 0xd0, 0x10, 0xc2, 0xaf, 0x30, 0x45,
0x03, 0x12, 0x10, 0x0c, 0x30, 0x58, 0x0a, 0xe5, 0x54, 0x60, 0x04,
0x15, 0x54, 0x80, 0x02, 0xc2, 0x58, 0x30, 0x59, 0x0a, 0xe5, 0x50,
0x60, 0x04, 0x15, 0x50, 0x80, 0x02, 0xc2, 0x59, 0xd5, 0x53, 0x07,
0x30, 0x60, 0x04, 0x15, 0x46, 0xd2, 0x04, 0x30, 0x45, 0x03, 0x12,
0x10, 0x0f, 0xc2, 0x8d, 0xd2, 0xaf, 0xd0, 0xd0, 0xd0, 0x82, 0xd0,
0x83, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0x12, 0x03, 0x0e, 0x30, 0x45,
0x03, 0x12, 0x10, 0x03, 0x30, 0x01, 0x06, 0x20, 0x09, 0x03, 0x12,
0x10, 0x1c, 0x30, 0x02, 0x06, 0x20, 0x0a, 0x03, 0x12, 0x10, 0x1f,
0x30, 0x03, 0x06, 0x20, 0x0b, 0x03, 0x12, 0x10, 0x1f, 0x30, 0x04,
0x06, 0x20, 0x0c, 0x03, 0x12, 0x10, 0x22, 0x20, 0x13, 0x09, 0x20,
0x11, 0x06, 0xe5, 0x2b, 0x45, 0x2c, 0x60, 0x03, 0xd3, 0x80, 0x01,
0xc3, 0x92, 0xa9, 0x12, 0x03, 0x3e, 0x80, 0xbf, 0xd0, 0x83, 0xd0,
0x82, 0xf8, 0xe4, 0x93, 0x70, 0x12, 0x74, 0x01, 0x93, 0x70, 0x0d,
0xa3, 0xa3, 0x93, 0xf8, 0x74, 0x01, 0x93, 0xf5, 0x82, 0x88, 0x83,
0xe4, 0x73, 0x74, 0x02, 0x93, 0x68, 0x60, 0xef, 0xa3, 0xa3, 0xa3,
0x80, 0xdf, 0x8a, 0x83, 0x89, 0x82, 0xe4, 0x73, 0xc8, 0xef, 0xc8,
0xe6, 0xfa, 0x08, 0xe6, 0x4a, 0x60, 0x0c, 0xc8, 0xef, 0xc8, 0x08,
0xe6, 0x16, 0x18, 0x70, 0x01, 0x16, 0xc3, 0x22, 0xed, 0x24, 0xff,
0xfd, 0xec, 0x34, 0xff, 0xc8, 0xef, 0xc8, 0xf6, 0x08, 0xc6, 0xed,
0xc6, 0xd3, 0x22, 0xc2, 0x43, 0xd2, 0x45, 0xe4, 0xf5, 0x20, 0xf5,
0x21, 0xf5, 0x53, 0xf5, 0x46, 0xf5, 0x2b, 0xf5, 0x2c, 0xc2, 0x42,
0xf5, 0x51, 0xf5, 0x52, 0xf5, 0x55, 0x90, 0x04, 0x18, 0x74, 0x80,
0xf0, 0x90, 0x04, 0x1a, 0x74, 0x08, 0xf0, 0x22, 0xef, 0xf4, 0x60,
0x1f, 0xe4, 0xfe, 0x12, 0x03, 0x7d, 0xe0, 0xb4, 0xff, 0x12, 0x12,
0x03, 0x7d, 0xef, 0xf0, 0x74, 0x1c, 0x2e, 0xf5, 0x82, 0xe4, 0x34,
0x70, 0xf5, 0x83, 0xed, 0xf0, 0x22, 0x0e, 0xbe, 0x04, 0xe3, 0x22,
0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0xd0, 0x75,
0xd0, 0x08, 0xc2, 0xaf, 0x30, 0x45, 0x03, 0x12, 0x10, 0x06, 0xd2,
0xaf, 0xd0, 0xd0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xf0, 0xd0, 0xe0,
0x32, 0xc2, 0xaf, 0x12, 0x00, 0x06, 0x12, 0x02, 0xa2, 0x12, 0x03,
0x27, 0xe4, 0xf5, 0x22, 0xf5, 0x47, 0x90, 0x04, 0x00, 0x74, 0x80,
0xf0, 0xd2, 0xaf, 0x22, 0x75, 0x89, 0x02, 0xe4, 0xf5, 0x8c, 0xf5,
0x8a, 0xf5, 0x88, 0xf5, 0xb8, 0xf5, 0xe8, 0x75, 0x90, 0x18, 0xd2,
0x8c, 0x75, 0xa8, 0x05, 0x22, 0x30, 0x45, 0x03, 0x12, 0x10, 0x15,
0xe5, 0x20, 0x70, 0x03, 0x20, 0x10, 0x03, 0x30, 0x11, 0x03, 0x43,
0x87, 0x01, 0x22, 0xce, 0xef, 0xce, 0xee, 0x60, 0x08, 0x7f, 0xff,
0x12, 0x03, 0x93, 0x1e, 0x80, 0xf5, 0x22, 0xc8, 0xef, 0xc8, 0xe6,
0x60, 0x03, 0x16, 0xc3, 0x22, 0xed, 0x14, 0xf6, 0xd3, 0x22, 0xc8,
0xef, 0xc8, 0xe6, 0x60, 0x06, 0x16, 0xe6, 0x24, 0xff, 0xb3, 0x22,
0xc3, 0x22, 0x74, 0x14, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x70, 0xf5,
0x83, 0x22, 0xef, 0x90, 0x03, 0x91, 0x93, 0x90, 0x04, 0x00, 0x73,
0x0a, 0x18, 0xef, 0x60, 0x03, 0x1f, 0x80, 0xfa, 0x22, 0x01, 0x3b,
0x00, 0xc1, 0xae, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xc0, 0x26, 0x74, 0x04, 0xc0, 0xe0, 0xc0, 0x82, 0xc0, 0x83,
0x75, 0x26, 0x0a, 0x22, 0xc0, 0x26, 0x74, 0x04, 0xc0, 0xe0, 0xc0,
0x82, 0xc0, 0x83, 0x75, 0x26, 0x18, 0x22, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x02, 0x10, 0x28, 0x02,
0x10, 0x44, 0x02, 0x10, 0x45, 0x02, 0x12, 0xa9, 0x02, 0x12, 0xaa,
0x02, 0x13, 0x45, 0x02, 0x13, 0x46, 0xc3, 0x22, 0xff, 0xff, 0x02,
0x15, 0x48, 0x02, 0x16, 0x1e, 0x02, 0x13, 0xfd, 0x02, 0x13, 0x47,
0x30, 0x05, 0x06, 0x20, 0x0d, 0x03, 0x12, 0x16, 0x9b, 0x30, 0x06,
0x06, 0x20, 0x0e, 0x03, 0x12, 0x18, 0xbd, 0x30, 0x07, 0x06, 0x20,
0x0f, 0x03, 0x12, 0x18, 0xfe, 0x22, 0x22, 0x90, 0x04, 0x14, 0xe0,
0x20, 0xe7, 0x03, 0x02, 0x12, 0x9c, 0x90, 0x70, 0x12, 0xe0, 0xf5,
0x56, 0x90, 0x04, 0x04, 0xe0, 0x12, 0x02, 0x4f, 0x10, 0x87, 0x31,
0x10, 0xb2, 0x51, 0x10, 0xbd, 0x52, 0x10, 0xbd, 0x53, 0x10, 0xbd,
0x54, 0x11, 0x71, 0x60, 0x10, 0xfe, 0x61, 0x11, 0xbf, 0x62, 0x10,
0xfe, 0x63, 0x11, 0xe8, 0x70, 0x12, 0x12, 0x71, 0x12, 0x3c, 0x72,
0x12, 0x6e, 0x80, 0x00, 0x00, 0x12, 0x9c, 0x20, 0x02, 0x03, 0x30,
0x03, 0x1d, 0x7d, 0x02, 0xaf, 0x56, 0x12, 0x02, 0xc8, 0x90, 0x04,
0x14, 0x74, 0x80, 0xf0, 0xe4, 0x90, 0x70, 0x13, 0xf0, 0xe5, 0x56,
0xf4, 0x70, 0x03, 0x02, 0x12, 0x9c, 0x02, 0x12, 0x8f, 0x85, 0x56,
0x41, 0xd2, 0x02, 0x02, 0x12, 0x9c, 0x90, 0x70, 0x11, 0xe0, 0x24,
0xff, 0x92, 0x47, 0x02, 0x12, 0x9c, 0x90, 0x04, 0x04, 0xe0, 0x25,
0xe0, 0x24, 0x5d, 0xf5, 0x57, 0x90, 0x70, 0x10, 0xe0, 0xff, 0x74,
0x47, 0x25, 0x57, 0xf8, 0xc6, 0xef, 0xc6, 0x90, 0x70, 0x11, 0xe0,
0xff, 0x74, 0x48, 0x25, 0x57, 0xf8, 0xc6, 0xef, 0xc6, 0xe4, 0xfd,
0xaf, 0x56, 0x12, 0x02, 0xc8, 0x90, 0x04, 0x14, 0x74, 0x80, 0xf0,
0xe4, 0x90, 0x70, 0x13, 0xf0, 0xe5, 0x56, 0xf4, 0x70, 0x03, 0x02,
0x12, 0x9c, 0x02, 0x12, 0x8f, 0x90, 0x70, 0x11, 0xe0, 0x54, 0x1f,
0xf5, 0x62, 0xe0, 0x54, 0x80, 0xf5, 0x64, 0x90, 0x70, 0x10, 0xe0,
0xff, 0x7e, 0x00, 0x90, 0x04, 0x04, 0xe0, 0xb4, 0x61, 0x04, 0x7d,
0x00, 0x80, 0x02, 0x7d, 0x07, 0xef, 0xc8, 0xed, 0xc8, 0x08, 0x80,
0x05, 0xc3, 0x33, 0xce, 0x33, 0xce, 0xd8, 0xf9, 0xf5, 0x61, 0x8e,
0x60, 0x90, 0x70, 0x11, 0xe0, 0x54, 0x60, 0x24, 0xff, 0x92, 0x2d,
0xe0, 0x54, 0x60, 0xc4, 0x13, 0x54, 0x07, 0x14, 0xf5, 0x63, 0x75,
0x65, 0x80, 0x75, 0x66, 0x23, 0x75, 0x67, 0x06, 0x75, 0x68, 0x18,
0x75, 0x69, 0x15, 0xad, 0x57, 0xaf, 0x56, 0x12, 0x02, 0xc8, 0x90,
0x04, 0x14, 0x74, 0x80, 0xf0, 0xe4, 0x90, 0x70, 0x13, 0xf0, 0xe5,
0x56, 0xf4, 0x70, 0x03, 0x02, 0x12, 0x9c, 0x02, 0x12, 0x8f, 0x90,
0x70, 0x11, 0xe0, 0x54, 0x1f, 0xf5, 0x6e, 0x90, 0x70, 0x10, 0xe0,
0xf5, 0x6b, 0x90, 0x70, 0x11, 0xe0, 0x54, 0x60, 0x24, 0xff, 0x92,
0x2c, 0xe0, 0x54, 0x60, 0xc4, 0x13, 0x54, 0x07, 0x14, 0xf5, 0x6f,
0x75, 0x71, 0x40, 0x75, 0x72, 0x24, 0x75, 0x73, 0x05, 0x75, 0x74,
0x17, 0x75, 0x75, 0xe7, 0xad, 0x57, 0xaf, 0x56, 0x12, 0x02, 0xc8,
0x90, 0x04, 0x14, 0x74, 0x80, 0xf0, 0xe4, 0x90, 0x70, 0x13, 0xf0,
0xe5, 0x56, 0xf4, 0x70, 0x03, 0x02, 0x12, 0x9c, 0x02, 0x12, 0x8f,
0x90, 0x70, 0x10, 0xe0, 0x60, 0x04, 0xd2, 0x1a, 0x80, 0x02, 0xd2,
0x22, 0xad, 0x57, 0xaf, 0x56, 0x12, 0x02, 0xc8, 0x90, 0x04, 0x14,
0x74, 0x80, 0xf0, 0xe4, 0x90, 0x70, 0x13, 0xf0, 0xe5, 0x56, 0xf4,
0x70, 0x03, 0x02, 0x12, 0x9c, 0x02, 0x12, 0x8f, 0x90, 0x70, 0x10,
0xe0, 0xfe, 0x90, 0x70, 0x11, 0xe0, 0xfd, 0xed, 0xf8, 0xe6, 0xf5,
0x57, 0xfd, 0xaf, 0x56, 0x12, 0x02, 0xc8, 0x90, 0x04, 0x14, 0x74,
0x80, 0xf0, 0xe4, 0x90, 0x70, 0x13, 0xf0, 0xe5, 0x56, 0xf4, 0x70,
0x03, 0x02, 0x12, 0x9c, 0x80, 0x7d, 0x90, 0x70, 0x10, 0xe0, 0xfe,
0x90, 0x70, 0x11, 0xe0, 0xfd, 0xed, 0xf5, 0x82, 0x8e, 0x83, 0xe0,
0xf5, 0x57, 0xfd, 0xaf, 0x56, 0x12, 0x02, 0xc8, 0x90, 0x04, 0x14,
0x74, 0x80, 0xf0, 0xe4, 0x90, 0x70, 0x13, 0xf0, 0xe5, 0x56, 0xf4,
0x60, 0x62, 0x80, 0x53, 0xe4, 0xf5, 0x7a, 0x75, 0x7b, 0x01, 0xf5,
0x6a, 0xc2, 0x2d, 0xf5, 0x23, 0xf5, 0x3b, 0xd2, 0x2e, 0xf5, 0x77,
0xc2, 0x2c, 0xf5, 0x24, 0x75, 0x76, 0x18, 0xad, 0x57, 0xaf, 0x56,
0x12, 0x02, 0xc8, 0x90, 0x04, 0x14, 0x74, 0x80, 0xf0, 0xe4, 0x90,
0x70, 0x13, 0xf0, 0xe5, 0x56, 0xf4, 0x60, 0x30, 0x80, 0x21, 0x90,
0x70, 0x10, 0xe0, 0x24, 0xff, 0x92, 0x4a, 0xd2, 0x05, 0xad, 0x57,
0xaf, 0x56, 0x12, 0x02, 0xc8, 0x90, 0x04, 0x14, 0x74, 0x80, 0xf0,
0xe4, 0x90, 0x70, 0x13, 0xf0, 0xe5, 0x56, 0xf4, 0x60, 0x0d, 0x90,
0x70, 0x24, 0xe0, 0x44, 0x10, 0xf0, 0x90, 0x02, 0x2c, 0x74, 0xff,
0xf0, 0xe5, 0x23, 0x24, 0xff, 0x92, 0x06, 0xe5, 0x24, 0x24, 0xff,
0x92, 0x07, 0x22, 0x22, 0xe5, 0x76, 0x60, 0x04, 0x15, 0x76, 0x80,
0x03, 0x75, 0x76, 0x18, 0xe5, 0x76, 0x70, 0x43, 0x30, 0x2d, 0x0d,
0x7f, 0x6c, 0xad, 0x61, 0xac, 0x60, 0x12, 0x02, 0x7b, 0x50, 0x02,
0xd2, 0x18, 0x30, 0x2c, 0x0b, 0x7f, 0x7c, 0xad, 0x6b, 0x12, 0x03,
0x61, 0x50, 0x02, 0xd2, 0x20, 0xe5, 0x77, 0x60, 0x09, 0x7f, 0x7a,
0x12, 0x03, 0x6f, 0x50, 0x02, 0xd2, 0x21, 0xe5, 0x6a, 0x60, 0x09,
0x7f, 0x7a, 0x12, 0x03, 0x6f, 0x50, 0x02, 0xd2, 0x19, 0xe5, 0x77,
0x60, 0x07, 0xe5, 0x7b, 0xb4, 0x03, 0x02, 0xd2, 0x23, 0xe5, 0x23,
0x24, 0xff, 0x92, 0x06, 0xe5, 0x24, 0x24, 0xff, 0x92, 0x07, 0x90,
0x70, 0x60, 0xe5, 0x7b, 0xf0, 0xa3, 0xe5, 0x6a, 0xf0, 0xa3, 0xe5,
0x20, 0xf0, 0xa3, 0xe5, 0x23, 0xf0, 0xe5, 0x6c, 0xa3, 0xf0, 0xa3,
0xe5, 0x6d, 0xf0, 0xa2, 0x2d, 0xe4, 0x33, 0xa3, 0xf0, 0xa3, 0xe5,
0x62, 0xf0, 0x90, 0x70, 0x6b, 0xe5, 0x76, 0xf0, 0xe5, 0x53, 0x70,
0x0e, 0xe5, 0x4f, 0x45, 0x4e, 0x60, 0x08, 0xe5, 0x4f, 0x15, 0x4f,
0x70, 0x02, 0x15, 0x4e, 0x22, 0x22, 0x22, 0xc2, 0x4b, 0xc2, 0x4c,
0xe5, 0x44, 0x12, 0x02, 0x4f, 0x13, 0x69, 0x00, 0x13, 0xc4, 0x04,
0x13, 0xc0, 0x08, 0x13, 0xa8, 0x10, 0x13, 0x74, 0x20, 0x13, 0x86,
0x60, 0x13, 0x91, 0xa0, 0x00, 0x00, 0x13, 0xc6, 0x85, 0x48, 0x43,
0x85, 0x4a, 0x42, 0x85, 0x4c, 0x5e, 0x80, 0x52, 0xe5, 0x48, 0xc4,
0x54, 0x0f, 0xf5, 0x43, 0xe5, 0x4a, 0xc4, 0x54, 0x0f, 0xf5, 0x42,
0xe5, 0x4c, 0x80, 0x1b, 0x85, 0x49, 0x43, 0x85, 0x4b, 0x42, 0x85,
0x4d, 0x5e, 0x80, 0x35, 0xe5, 0x49, 0xc4, 0x54, 0x0f, 0xf5, 0x43,
0xe5, 0x4b, 0xc4, 0x54, 0x0f, 0xf5, 0x42, 0xe5, 0x4d, 0xc4, 0x54,
0x0f, 0xf5, 0x5e, 0x80, 0x1e, 0xe5, 0x47, 0xb4, 0x04, 0x06, 0x53,
0x5e, 0xfb, 0x75, 0x42, 0x09, 0xe5, 0x47, 0xb4, 0x05, 0x0e, 0x43,
0x5e, 0x04, 0x75, 0x42, 0x09, 0x80, 0x06, 0xd2, 0x4b, 0x80, 0x02,
0xd2, 0x4c, 0xe4, 0xf5, 0x4e, 0xf5, 0x4f, 0xf5, 0x27, 0xe5, 0x42,
0xc4, 0x54, 0xf0, 0xff, 0xe5, 0x43, 0x54, 0x0f, 0x4f, 0xf5, 0x5f,
0x90, 0x70, 0x44, 0xf0, 0xa3, 0xe5, 0x5e, 0xf0, 0xa3, 0xe5, 0x4a,
0xf0, 0xa3, 0xe5, 0x48, 0xf0, 0xa3, 0xe5, 0x4c, 0xf0, 0xa3, 0xe5,
0x44, 0xf0, 0xa3, 0xe5, 0x42, 0xf0, 0xa3, 0xe5, 0x43, 0xf0, 0xd2,
0x60, 0x22, 0x90, 0x70, 0x40, 0xe0, 0x04, 0xf0, 0x90, 0x70, 0x42,
0xe5, 0x47, 0xf0, 0xe5, 0x47, 0x60, 0x10, 0x24, 0xc0, 0x70, 0x03,
0x12, 0x15, 0x28, 0x12, 0x14, 0x1e, 0xc2, 0xaf, 0xc2, 0x04, 0xd2,
0xaf, 0x22, 0xc2, 0xaf, 0x90, 0x04, 0x14, 0xe0, 0x54, 0x0e, 0x60,
0x14, 0xe5, 0x47, 0xb4, 0x02, 0x0b, 0xe5, 0x44, 0xb4, 0x20, 0x06,
0x75, 0x4e, 0x08, 0x75, 0x4f, 0x00, 0xd2, 0x28, 0x80, 0x08, 0xe5,
0x4e, 0x45, 0x4f, 0x24, 0xff, 0x92, 0x28, 0xd2, 0xaf, 0x90, 0x04,
0x14, 0xe0, 0xa2, 0xe4, 0x92, 0x29, 0x74, 0x1e, 0xf0, 0xe5, 0x5f,
0x54, 0x0f, 0xf5, 0x2d, 0xe5, 0x27, 0x70, 0x13, 0x30, 0x28, 0x05,
0xe5, 0x5f, 0x20, 0xe5, 0x0b, 0x30, 0x29, 0x19, 0xe5, 0x5f, 0x54,
0x30, 0xff, 0xbf, 0x30, 0x11, 0xe5, 0x27, 0x70, 0x05, 0x75, 0x27,
0x0c, 0x80, 0x02, 0x15, 0x27, 0xd2, 0x6c, 0xd2, 0x6d, 0x80, 0x0f,
0xe5, 0x5f, 0x30, 0xe6, 0x06, 0xc2, 0x6c, 0xd2, 0x6d, 0x80, 0x04,
0xd2, 0x6c, 0xc2, 0x6d, 0xe5, 0x47, 0x64, 0x03, 0x70, 0x21, 0x30,
0x4b, 0x06, 0xc2, 0x6c, 0xd2, 0x6d, 0x80, 0x18, 0xe5, 0x27, 0x70,
0x03, 0x30, 0x4c, 0x11, 0xc2, 0x4c, 0xe5, 0x27, 0x70, 0x05, 0x75,
0x27, 0x07, 0x80, 0x02, 0x15, 0x27, 0xd2, 0x6c, 0xd2, 0x6d, 0x90,
0x70, 0x46, 0xe5, 0x2d, 0xf0, 0x20, 0x69, 0x07, 0xe5, 0x5e, 0x20,
0xe0, 0x02, 0xb2, 0x68, 0x20, 0x6b, 0x07, 0xe5, 0x5e, 0x20, 0xe1,
0x02, 0xb2, 0x6a, 0x20, 0x6d, 0x07, 0xe5, 0x5e, 0x20, 0xe2, 0x02,
0xb2, 0x6c, 0x90, 0x70, 0x47, 0xe5, 0x2d, 0xf0, 0x75, 0x2e, 0x40,
0x20, 0x69, 0x04, 0xa2, 0x68, 0x80, 0x0a, 0xe5, 0x46, 0x30, 0x68,
0x04, 0xa2, 0xe3, 0x80, 0x01, 0x33, 0x92, 0x73, 0x92, 0x72, 0x20,
0x6b, 0x04, 0xa2, 0x6a, 0x80, 0x0a, 0xe5, 0x46, 0x30, 0x6a, 0x04,
0xa2, 0xe3, 0x80, 0x01, 0x33, 0x92, 0x75, 0x92, 0x74, 0x20, 0x6d,
0x04, 0xa2, 0x6c, 0x80, 0x0a, 0xe5, 0x46, 0x30, 0x6c, 0x04, 0xa2,
0xe3, 0x80, 0x01, 0x33, 0x92, 0x71, 0x92, 0x70, 0x90, 0x10, 0x2f,
0xe5, 0x2e, 0xf0, 0x22, 0xe4, 0x90, 0x02, 0x29, 0xf0, 0x30, 0x47,
0x04, 0xaf, 0x45, 0x80, 0x04, 0xe5, 0x45, 0xf4, 0xff, 0x90, 0x02,
0x28, 0xef, 0xf0, 0x22, 0x8f, 0x50, 0xd2, 0x59, 0x22, 0x8f, 0x54,
0xd2, 0x58, 0x22, 0xe4, 0xf5, 0x38, 0xc2, 0xaf, 0xe5, 0x51, 0x14,
0x60, 0x45, 0x14, 0x60, 0x61, 0x24, 0x02, 0x60, 0x03, 0x02, 0x16,
0x02, 0xd2, 0x59, 0x75, 0x55, 0x01, 0x90, 0x02, 0x08, 0xe0, 0x54,
0xfe, 0xf0, 0xe0, 0x20, 0xe1, 0x22, 0x90, 0x04, 0x34, 0xe0, 0xb4,
0x02, 0x1b, 0xa3, 0xe0, 0xb4, 0x02, 0x16, 0xa3, 0xe0, 0xb4, 0x02,
0x11, 0x7f, 0x20, 0x12, 0x15, 0x3e, 0x90, 0x10, 0x04, 0xe0, 0x54,
0xf3, 0xf0, 0x75, 0x51, 0x01, 0x80, 0x74, 0xe5, 0x50, 0x70, 0x05,
0x75, 0x38, 0x03, 0x80, 0x6b, 0x90, 0x12, 0x00, 0xe0, 0x54, 0x03,
0x70, 0x11, 0x7f, 0x20, 0x12, 0x15, 0x3e, 0x90, 0x02, 0x08, 0xe0,
0x54, 0xfb, 0xf0, 0x75, 0x51, 0x02, 0x80, 0x52, 0xe5, 0x50, 0x70,
0x02, 0x80, 0x47, 0x90, 0x02, 0x08, 0xe0, 0x20, 0xe3, 0x3c, 0x90,
0x04, 0x37, 0xe0, 0x64, 0x22, 0x70, 0x34, 0x90, 0x12, 0x04, 0x74,
0x0a, 0xf0, 0x90, 0x13, 0x28, 0xe0, 0x54, 0xf0, 0xf0, 0xa3, 0xe0,
0x54, 0xf0, 0xf0, 0xa3, 0xe0, 0x54, 0xfa, 0xf0, 0x90, 0x04, 0x01,
0xe0, 0x44, 0x10, 0xf0, 0xe0, 0x54, 0xf9, 0xf0, 0x90, 0x12, 0x04,
0xe0, 0x44, 0x04, 0xf0, 0x75, 0x38, 0x01, 0x75, 0x55, 0x02, 0xe4,
0xf5, 0x51, 0x80, 0x09, 0xe5, 0x50, 0x70, 0x05, 0x75, 0x38, 0x03,
0xf5, 0x51, 0xe5, 0x38, 0x60, 0x15, 0xc2, 0x01, 0xe4, 0xf5, 0x51,
0xc2, 0x59, 0xad, 0x38, 0xaf, 0x40, 0x12, 0x02, 0xc8, 0xe5, 0x38,
0xb4, 0x03, 0x02, 0xd2, 0x03, 0xd2, 0xaf, 0x22, 0xc2, 0xaf, 0x30,
0x01, 0x0e, 0xe4, 0xf5, 0x51, 0xc2, 0x59, 0xc2, 0x01, 0x7d, 0x02,
0xaf, 0x40, 0x12, 0x02, 0xc8, 0xe5, 0x52, 0x14, 0x60, 0x17, 0x04,
0x70, 0x5d, 0x90, 0x12, 0x04, 0xe0, 0x54, 0xfb, 0xf0, 0x7f, 0x20,
0x12, 0x15, 0x43, 0x75, 0x52, 0x01, 0x75, 0x55, 0x03, 0x80, 0x49,
0xe5, 0x54, 0x70, 0x45, 0x90, 0x04, 0x01, 0xe0, 0x44, 0x0e, 0xf0,
0xe0, 0x54, 0xef, 0xf0, 0x90, 0x13, 0x28, 0xe0, 0x44, 0x0f, 0xf0,
0xa3, 0xe0, 0x44, 0x0f, 0xf0, 0xa3, 0xe0, 0x44, 0x05, 0xf0, 0x90,
0x12, 0x04, 0x74, 0x03, 0xf0, 0x90, 0x02, 0x08, 0xe0, 0x44, 0x05,
0xf0, 0x90, 0x10, 0x04, 0xe0, 0x44, 0x0c, 0xf0, 0xe4, 0xf5, 0x52,
0xf5, 0x55, 0x30, 0x02, 0x0b, 0xc2, 0x02, 0x7d, 0x01, 0xaf, 0x41,
0x12, 0x02, 0xc8, 0x80, 0x02, 0xc2, 0x03, 0xd2, 0xaf, 0x22, 0x22,
0x22, 0xc2, 0xaf, 0xe5, 0x6a, 0x70, 0x04, 0xe5, 0x77, 0x60, 0x03,
0xd3, 0x80, 0x01, 0xc3, 0x92, 0x28, 0x90, 0x70, 0x2a, 0xe0, 0x30,
0xe1, 0x2c, 0xe0, 0x13, 0x92, 0x29, 0x90, 0x70, 0x29, 0xe0, 0xff,
0x90, 0x70, 0x28, 0xe0, 0xfd, 0xa2, 0x28, 0x92, 0x2a, 0xa2, 0x29,
0x92, 0x2b, 0x12, 0x16, 0xe1, 0x50, 0x03, 0x20, 0x28, 0x05, 0x12,
0x17, 0x61, 0x80, 0x07, 0x90, 0x70, 0x2a, 0xe0, 0x54, 0xfd, 0xf0,
0xc2, 0x05, 0xd2, 0xaf, 0x22, 0x30, 0x2b, 0x49, 0x30, 0x2a, 0x46,
0xbf, 0x41, 0x08, 0x90, 0x70, 0x28, 0xe5, 0x32, 0xf0, 0x80, 0x39,
0xbf, 0x42, 0x08, 0x90, 0x70, 0x28, 0xe5, 0x33, 0xf0, 0x80, 0x2e,
0xbf, 0x45, 0x08, 0x90, 0x70, 0x28, 0xe5, 0x35, 0xf0, 0x80, 0x23,
0xbf, 0x46, 0x08, 0x90, 0x70, 0x28, 0xe5, 0x30, 0xf0, 0x80, 0x18,
0xbf, 0x49, 0x08, 0x90, 0x70, 0x28, 0xe5, 0x31, 0xf0, 0x80, 0x0d,
0xbf, 0x71, 0x08, 0x90, 0x70, 0x28, 0xe5, 0x2f, 0xf0, 0x80, 0x02,
0xc3, 0x22, 0xd3, 0x22, 0x20, 0x2b, 0x2f, 0xbf, 0x41, 0x04, 0x8d,
0x32, 0x80, 0x25, 0xbf, 0x42, 0x04, 0x8d, 0x33, 0x80, 0x1e, 0xbf,
0x45, 0x04, 0x8d, 0x35, 0x80, 0x17, 0xbf, 0x46, 0x04, 0x8d, 0x30,
0x80, 0x10, 0xbf, 0x49, 0x04, 0x8d, 0x31, 0x80, 0x09, 0xbf, 0x71,
0x04, 0x8d, 0x2f, 0x80, 0x02, 0xc3, 0x22, 0xa2, 0x2a, 0x22, 0xc3,
0x22, 0x90, 0x70, 0x28, 0xe0, 0x90, 0x10, 0x1c, 0xf0, 0x90, 0x70,
0x29, 0xe0, 0x90, 0x10, 0x1d, 0xf0, 0x90, 0x70, 0x2a, 0xe0, 0x90,
0x10, 0x1e, 0xf0, 0x90, 0x10, 0x1c, 0xe0, 0xf5, 0x38, 0x90, 0x10,
0x1e, 0xe0, 0x20, 0xe1, 0xf3, 0x90, 0x10, 0x1c, 0xe0, 0x90, 0x70,
0x28, 0xf0, 0x90, 0x10, 0x1d, 0xe0, 0x90, 0x70, 0x29, 0xf0, 0x90,
0x10, 0x1e, 0xe0, 0x90, 0x70, 0x2a, 0xf0, 0x30, 0x4a, 0x0d, 0x90,
0x70, 0x24, 0xe0, 0x44, 0x01, 0xf0, 0x90, 0x02, 0x2c, 0x74, 0xff,
0xf0, 0x22, 0xc2, 0xaf, 0x90, 0x10, 0x1c, 0xed, 0xf0, 0xa3, 0xef,
0xf0, 0xa3, 0x74, 0x0a, 0xf0, 0x90, 0x10, 0x1c, 0xe0, 0xf5, 0x3a,
0x90, 0x10, 0x1e, 0xe0, 0x20, 0xe1, 0xf3, 0xd2, 0xaf, 0x22, 0xc2,
0xaf, 0x90, 0x10, 0x1d, 0xef, 0xf0, 0xa3, 0x74, 0x0b, 0xf0, 0x90,
0x10, 0x1c, 0xe0, 0xff, 0x90, 0x10, 0x1e, 0xe0, 0x20, 0xe1, 0xf4,
0xd2, 0xaf, 0x22, 0x90, 0x13, 0x44, 0xe0, 0xf5, 0x34, 0xe4, 0xf0,
0x90, 0x02, 0x29, 0xf0, 0x90, 0x02, 0x28, 0xe0, 0x44, 0x02, 0xf0,
0x7d, 0x1d, 0x7f, 0x41, 0x12, 0x17, 0xaf, 0x7d, 0x60, 0x0f, 0x12,
0x17, 0xaf, 0x7f, 0x71, 0x12, 0x17, 0xcd, 0xef, 0x44, 0x20, 0xfd,
0x7f, 0x71, 0x02, 0x17, 0xaf, 0xe4, 0x90, 0x02, 0x29, 0xf0, 0x90,
0x02, 0x28, 0xe0, 0x44, 0x02, 0xf0, 0x90, 0x13, 0x44, 0xe0, 0xf5,
0x34, 0xe4, 0xf0, 0x7f, 0x04, 0x12, 0x17, 0xcd, 0xef, 0x54, 0x18,
0x60, 0x1d, 0xe5, 0x78, 0x24, 0x02, 0xf8, 0xe6, 0x60, 0x07, 0x90,
0x70, 0x2c, 0xe0, 0xfd, 0x80, 0x05, 0x90, 0x70, 0x2d, 0xe0, 0xfd,
0x7f, 0x42, 0x12, 0x17, 0xaf, 0x7d, 0x30, 0x80, 0x1b, 0xe5, 0x78,
0x24, 0x02, 0xf8, 0xe6, 0x60, 0x07, 0x90, 0x70, 0x2e, 0xe0, 0xfd,
0x80, 0x05, 0x90, 0x70, 0x2f, 0xe0, 0xfd, 0x7f, 0x42, 0x12, 0x17,
0xaf, 0x7d, 0x28, 0x7f, 0x45, 0x12, 0x17, 0xaf, 0x0f, 0x12, 0x17,
0xaf, 0x7d, 0x08, 0x7f, 0x49, 0x12, 0x17, 0xaf, 0x22, 0xe4, 0x90,
0x02, 0x29, 0xf0, 0x90, 0x02, 0x28, 0xe0, 0x54, 0xfd, 0xf0, 0x90,
0x13, 0x44, 0xe5, 0x34, 0xf0, 0x7f, 0x71, 0x12, 0x17, 0xcd, 0xef,
0x54, 0xdf, 0xfd, 0x7f, 0x71, 0x12, 0x17, 0xaf, 0xad, 0x32, 0x7f,
0x41, 0x12, 0x17, 0xaf, 0xad, 0x33, 0x0f, 0x12, 0x17, 0xaf, 0xad,
0x35, 0x7f, 0x45, 0x12, 0x17, 0xaf, 0xad, 0x30, 0x0f, 0x12, 0x17,
0xaf, 0xad, 0x31, 0x7f, 0x49, 0x02, 0x17, 0xaf, 0xe5, 0x6a, 0x14,
0x60, 0x16, 0x04, 0x70, 0x31, 0x90, 0x70, 0x6c, 0xe0, 0x04, 0xf0,
0x7f, 0x06, 0x12, 0x1b, 0x95, 0x50, 0x24, 0x75, 0x6a, 0x01, 0x75,
0x78, 0x62, 0x90, 0x70, 0x6d, 0xe0, 0x04, 0xf0, 0x12, 0x19, 0x60,
0x40, 0x13, 0x90, 0x70, 0x24, 0xe0, 0x44, 0x04, 0xf0, 0x90, 0x02,
0x2c, 0x74, 0xff, 0xf0, 0xe4, 0xf5, 0x6a, 0x12, 0x1b, 0xae, 0xc2,
0xaf, 0x53, 0x20, 0xbf, 0xd2, 0xaf, 0x22, 0xe5, 0x77, 0x14, 0x60,
0x10, 0x04, 0x70, 0x52, 0x7f, 0x07, 0x12, 0x1b, 0x95, 0x50, 0x4b,
0x75, 0x77, 0x01, 0x75, 0x78, 0x6e, 0x12, 0x19, 0x60, 0x40, 0x40,
0xe5, 0x79, 0x24, 0x05, 0xff, 0x13, 0x13, 0x13, 0x54, 0x1f, 0xfe,
0x24, 0x24, 0xf5, 0x82, 0xe4, 0x34, 0x70, 0xf5, 0x83, 0xe0, 0xfd,
0xef, 0x54, 0x07, 0xff, 0x74, 0x01, 0xc8, 0xef, 0xc8, 0x08, 0x80,
0x02, 0xc3, 0x33, 0xd8, 0xfc, 0x4d, 0xff, 0x74, 0x24, 0x2e, 0xf5,
0x82, 0xe4, 0x34, 0x70, 0xf5, 0x83, 0xef, 0xf0, 0x90, 0x02, 0x2c,
0x74, 0xff, 0xf0, 0xe4, 0xf5, 0x77, 0x12, 0x1b, 0xae, 0xc2, 0xaf,
0x53, 0x20, 0x7f, 0xd2, 0xaf, 0x22, 0xe5, 0x78, 0x24, 0x04, 0xf8,
0xe6, 0xf5, 0x38, 0x90, 0x70, 0x68, 0xf0, 0xf8, 0xe6, 0xff, 0xa3,
0xf0, 0x90, 0x70, 0x6f, 0xe0, 0x04, 0xf0, 0xe5, 0x7b, 0x24, 0xfe,
0x70, 0x03, 0x02, 0x1a, 0x26, 0x14, 0x70, 0x03, 0x02, 0x1a, 0x78,
0x24, 0x02, 0x60, 0x03, 0x02, 0x1b, 0x94, 0xe4, 0xf5, 0x79, 0xef,
0x20, 0xe0, 0x03, 0x02, 0x1a, 0x24, 0xa8, 0x38, 0xe6, 0x54, 0xfe,
0xf6, 0xe5, 0x78, 0x04, 0xf8, 0xe6, 0x60, 0x4d, 0xc2, 0xaf, 0x75,
0x7a, 0x05, 0xa8, 0x38, 0xe6, 0x54, 0xfb, 0xf6, 0xd2, 0xaf, 0xe5,
0x78, 0x04, 0xf8, 0xe6, 0x64, 0x02, 0x70, 0x1c, 0x90, 0x77, 0x85,
0xf0, 0xe5, 0x78, 0x24, 0x03, 0xf8, 0xe6, 0x90, 0x04, 0x10, 0xf0,
0xe5, 0x78, 0x24, 0x03, 0xf8, 0xe6, 0xff, 0x90, 0x04, 0x10, 0xe0,
0x5f, 0x70, 0xf2, 0x90, 0x77, 0x85, 0x74, 0xfe, 0xf0, 0xa8, 0x38,
0xe6, 0x54, 0xfb, 0xf6, 0xe5, 0x78, 0x24, 0x03, 0xf8, 0xe6, 0x90,
0x04, 0x10, 0xf0, 0x75, 0x7b, 0x02, 0x80, 0x33, 0xc2, 0xaf, 0xa8,
0x78, 0xe6, 0xf5, 0x7a, 0xa8, 0x38, 0xe6, 0x54, 0xfb, 0xf6, 0xd2,
0xaf, 0x90, 0x10, 0x04, 0xe0, 0x54, 0xfb, 0xf0, 0xe5, 0x6a, 0x60,
0x06, 0x90, 0x17, 0x04, 0xe0, 0xf5, 0x39, 0xe5, 0x78, 0x24, 0x06,
0xf8, 0xe6, 0xfe, 0x08, 0xe6, 0xca, 0xee, 0xca, 0xf9, 0x12, 0x02,
0x75, 0x75, 0x7b, 0x03, 0xd3, 0x22, 0xa8, 0x38, 0xe6, 0x30, 0xe2,
0x3b, 0x54, 0xfb, 0xf6, 0xc2, 0xaf, 0xa8, 0x78, 0xe6, 0xf5, 0x7a,
0xa8, 0x38, 0xe6, 0x54, 0xfb, 0xf6, 0xd2, 0xaf, 0x90, 0x10, 0x04,
0xe0, 0x54, 0xfb, 0xf0, 0xe5, 0x6a, 0x60, 0x06, 0x90, 0x17, 0x04,
0xe0, 0xf5, 0x39, 0xe5, 0x78, 0x24, 0x06, 0xf8, 0xe6, 0xfe, 0x08,
0xe6, 0xca, 0xee, 0xca, 0xf9, 0x12, 0x02, 0x75, 0xe4, 0xf5, 0x7d,
0x75, 0x7b, 0x03, 0xd3, 0x22, 0xa8, 0x38, 0xe6, 0x30, 0xe1, 0x09,
0x54, 0xfd, 0xf6, 0xe4, 0xf5, 0x79, 0x02, 0x1b, 0x8e, 0xd3, 0x22,
0xe5, 0x77, 0x70, 0x03, 0x02, 0x1b, 0x6e, 0xa8, 0x38, 0xe6, 0x20,
0xe3, 0x03, 0x02, 0x1b, 0x6e, 0x54, 0xf7, 0xf6, 0x7f, 0x73, 0x12,
0x17, 0xcd, 0xef, 0x64, 0x02, 0x60, 0x03, 0x02, 0x1b, 0x28, 0x90,
0x02, 0x29, 0xf0, 0x90, 0x02, 0x28, 0xe0, 0x44, 0x08, 0xf0, 0x7f,
0x76, 0x12, 0x17, 0xcd, 0xe5, 0x7d, 0x25, 0xe0, 0x25, 0xe0, 0x24,
0x00, 0xf5, 0x82, 0xe4, 0x34, 0x71, 0xf5, 0x83, 0xef, 0xf0, 0x7f,
0x75, 0x12, 0x17, 0xcd, 0xe5, 0x7d, 0x25, 0xe0, 0x25, 0xe0, 0x24,
0x01, 0xf5, 0x82, 0xe4, 0x34, 0x71, 0xf5, 0x83, 0xef, 0xf0, 0x7f,
0x74, 0x12, 0x17, 0xcd, 0xe5, 0x7d, 0x25, 0xe0, 0x25, 0xe0, 0x24,
0x02, 0xf5, 0x82, 0xe4, 0x34, 0x71, 0xf5, 0x83, 0xef, 0xf0, 0x7f,
0x73, 0x12, 0x17, 0xcd, 0xe5, 0x7d, 0x25, 0xe0, 0x25, 0xe0, 0x24,
0x03, 0xf5, 0x82, 0xe4, 0x34, 0x71, 0xf5, 0x83, 0xef, 0xf0, 0x7f,
0x71, 0x12, 0x17, 0xcd, 0xef, 0x54, 0xdf, 0xfd, 0x7f, 0x71, 0x12,
0x17, 0xaf, 0x7f, 0x71, 0x12, 0x17, 0xcd, 0xef, 0x44, 0x20, 0xfd,
0x7f, 0x71, 0x12, 0x17, 0xaf, 0x75, 0x79, 0xff, 0xe4, 0x90, 0x02,
0x29, 0xf0, 0x90, 0x02, 0x28, 0xe0, 0x54, 0xf7, 0xf0, 0x80, 0x44,
0xe5, 0x7d, 0x25, 0xe0, 0x25, 0xe0, 0x24, 0x00, 0xf5, 0x82, 0xe4,
0x34, 0x71, 0xf5, 0x83, 0xe4, 0xf0, 0xe5, 0x7d, 0x25, 0xe0, 0x25,
0xe0, 0x24, 0x01, 0xf5, 0x82, 0xe4, 0x34, 0x71, 0xf5, 0x83, 0xe4,
0xf0, 0xe5, 0x7d, 0x25, 0xe0, 0x25, 0xe0, 0x24, 0x02, 0xf5, 0x82,
0xe4, 0x34, 0x71, 0xf5, 0x83, 0xe4, 0xf0, 0xe5, 0x7d, 0x25, 0xe0,
0x25, 0xe0, 0x24, 0x03, 0xf5, 0x82, 0xe4, 0x34, 0x71, 0xf5, 0x83,
0xe4, 0xf0, 0x05, 0x7d, 0xa8, 0x38, 0xe6, 0xff, 0x30, 0xe1, 0x1e,
0x54, 0xfd, 0xf6, 0xe5, 0x79, 0xf4, 0x60, 0x07, 0x7f, 0x73, 0x12,
0x17, 0xcd, 0x8f, 0x79, 0x12, 0x18, 0x7c, 0x90, 0x10, 0x04, 0xe0,
0x44, 0x04, 0xf0, 0x75, 0x7b, 0x01, 0xc3, 0x22, 0xd3, 0x22, 0xa2,
0x2e, 0xe4, 0x33, 0x90, 0x70, 0x6a, 0xf0, 0xc2, 0xaf, 0x30, 0x2e,
0x06, 0xc2, 0x2e, 0xd2, 0xaf, 0xd3, 0x22, 0x8f, 0x3b, 0xd2, 0xaf,
0xc3, 0x22, 0xc2, 0xaf, 0xe5, 0x3b, 0x60, 0x12, 0xff, 0x74, 0x01,
0xc8, 0xef, 0xc8, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0x42,
0x20, 0xe4, 0xf5, 0x3b, 0xd2, 0x2e, 0xd2, 0xaf, 0x22, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x65, 0x30
};

View File

@ -0,0 +1,202 @@
# $FreeBSD$
#
# Copyright (c) 2005-2008, Ralink Technology Corp.
# Paul Lin <paul_lin@ralinktech.com.tw>
#
# Permission to use, copy, modify, and distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
begin 644 rt2860.fw
M`@#B`@+L(B+___\"`;W______P(`'O______`@%NP.#`\,"#P(+`T'70&,*O
M,$4#$A`)D`06X##C#70(\.558`9D`V`"T@.0!!3@(.<#`@#5=(#PD'`2X/4V
MD`0$X"3/8#`48$(DXF!'%&!5)"%P8.55)/Y@!Q1@""0"<`A]`8`H?0*`))!P
M$.#U4(4V0-(!@#[E560#8`3E57`$?0*`"84V0=("@"FM5:\V$@+(@""0<!#@
M]4>0<!'@]402$"6`!I!P$.#U1>3]KS82`LC2!)!P$^3PTJ_0T-""T(/0\-#@
M,GA_Y/;8_76!?0(!*0(""^23H_CDDZ-``_:``?((W_2`*>23H_A4!R0,R,,S
MQ%0/1"#(@T`$]%:``4;VW^2`"P$"!`@0($"`D`.:Y'X!DV"\H_]4/S#E"50?
M_N23HV`!#L]4P"7@8*A`N.23H_KDDZ/XY).CR,6"R,K%@\KPH\C%@LC*Q8/*
MW^G>YX"^P.#`\,"#P(+`T.C`X.G`X.K`X.O`X.S`X.W`X.[`X._`X,*O,$4#
M$A`2TJ_0X/_0X/[0X/W0X/S0X/O0X/K0X/G0X/C0T-""T(/0\-#@,L#@P/#`
M@\""P-!UT!#"KS!%`Q(0##!8"N548`055(`"PE@P60KE4&`$%5"``L)9U5,'
M,&`$%4;2!#!%`Q(0#\*-TJ_0T-""T(/0\-#@,A(##C!%`Q(0`S`!!B`)`Q(0
M'#`"!B`*`Q(0'S`#!B`+`Q(0'S`$!B`,`Q(0(B`3"2`1!N4K12Q@`].``<.2
MJ1(#/H"_T(/0@OCDDW`2=`&3<`VCHY/X=`&3]8*(@^1S=`*3:&#OHZ.C@-^*
M@XF"Y'/([\CF^@CF2F`,R._(".86&'`!%L,B[23__>PT_\COR/8(QNW&TR+"
M0])%Y/4@]2'U4_5&]2OU+,)"]5'U4O55D`08=(#PD`0:=`CP(N_T8!_D_A(#
M?>"T_Q(2`WWO\'0<+O6"Y#1P]8/M\"(.O@3C(L#@P/#`@\""P-!UT`C"KS!%
M`Q(0!M*OT-#0@M"#T/#0X#+"KQ(`!A("HA(#)^3U(O5'D`0`=(#PTJ\B=8D"
MY/6,]8KUB/6X]>AUD!C2C'6H!2(P10,2$!7E('`#(!`#,!$#0X<!(L[OSNY@
M"'__$@.3'H#U(LCOR.9@`Q;#(NT4]M,BR._(YF`&%N8D_[,BPR)T%"[U@N0T
M</6#(N^0`Y&3D`0`<PH8[V`#'X#Z(@$[`,&N`/______________________
M____________________________________________________________
M_____________________________________________\`F=`3`X,""P(-U
M)@HBP"9T!,#@P(+`@W4F&"+_____________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M____________________________________________________________
M_____P(0*`(01`(010(2J0(2J@(310(31L,B__\"%4@"%AX"$_T"$T<P!08@
M#0,2%ILP!@8@#@,2&+TP!P8@#P,2&/XB(I`$%.`@YP,"$IR0<!+@]5:0!`3@
M$@)/$(<Q$+)1$+U2$+U3$+U4$7%@$/YA$;]B$/YC$>AP$A)Q$CQR$FZ````2
MG"`"`S`#'7T"KU82`LB0!!1T@/#DD'`3\.56]'`#`A*<`A*/A59!T@("$IR0
M<!'@)/^21P(2G)`$!.`EX"1=]5>0<!#@_W1')5?XQN_&D'`1X/]T2"57^,;O
MQN3]KU82`LB0!!1T@/#DD'`3\.56]'`#`A*<`A*/D'`1X%0?]6+@5(#U9)!P
M$.#_?@"0!`3@M&$$?0"``GT'[\CMR`B`!<,SSC/.V/GU88Y@D'`1X%1@)/^2
M+>!48,035`<4]6-U98!U9B-U9P9U:!AU:16M5Z]6$@+(D`04=(#PY)!P$_#E
M5O1P`P(2G`(2CY!P$>!4'_5ND'`0X/5KD'`1X%1@)/^2+.!48,035`<4]6]U
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
MTB[2KR(`````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M``````````````````````````````````````````````````````````#]
"93``
`
end

View File

@ -1,5 +1,5 @@
/*-
* Copyright (c) 2002-2007 Sam Leffler, Errno Consulting
* Copyright (c) 2002-2008 Sam Leffler, Errno Consulting
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without

View File

@ -1,5 +1,5 @@
/*-
* Copyright (c) 2002-2007 Sam Leffler, Errno Consulting
* Copyright (c) 2002-2008 Sam Leffler, Errno Consulting
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without

View File

@ -46,6 +46,7 @@ __FBSDID("$FreeBSD$");
* Mathieu Lacage, Hossein Manshaei, Thierry Turletti
*/
#include "opt_inet.h"
#include "opt_wlan.h"
#include <sys/param.h>
#include <sys/systm.h>
@ -65,7 +66,6 @@ __FBSDID("$FreeBSD$");
#include <net/if.h>
#include <net/if_media.h>
#include <net/if_arp.h>
#include <net/ethernet.h> /* XXX for ether_sprintf */
#include <net80211/ieee80211_var.h>
@ -80,21 +80,10 @@ __FBSDID("$FreeBSD$");
#include <dev/ath/ath_rate/amrr/amrr.h>
#include <contrib/dev/ath/ah_desc.h>
#define AMRR_DEBUG
#ifdef AMRR_DEBUG
#define DPRINTF(sc, _fmt, ...) do { \
if (sc->sc_debug & 0x10) \
printf(_fmt, __VA_ARGS__); \
} while (0)
#else
#define DPRINTF(sc, _fmt, ...)
#endif
static int ath_rateinterval = 1000; /* rate ctl interval (ms) */
static int ath_rate_max_success_threshold = 10;
static int ath_rate_min_success_threshold = 1;
static void ath_ratectl(void *);
static void ath_rate_update(struct ath_softc *, struct ieee80211_node *,
int rate);
static void ath_rate_ctl_start(struct ath_softc *, struct ieee80211_node *);
@ -104,7 +93,6 @@ void
ath_rate_node_init(struct ath_softc *sc, struct ath_node *an)
{
/* NB: assumed to be zero'd by caller */
ath_rate_update(sc, &an->an_node, 0);
}
void
@ -166,6 +154,11 @@ ath_rate_tx_complete(struct ath_softc *sc, struct ath_node *an,
amn->amn_tx_try3_cnt++;
amn->amn_tx_failure_cnt++;
}
if (amn->amn_interval != 0 &&
ticks - amn->amn_ticks > amn->amn_interval) {
ath_rate_ctl(sc, &an->an_node);
amn->amn_ticks = ticks;
}
}
void
@ -176,7 +169,7 @@ ath_rate_newassoc(struct ath_softc *sc, struct ath_node *an, int isnew)
}
static void
node_reset (struct amrr_node *amn)
node_reset(struct amrr_node *amn)
{
amn->amn_tx_try0_cnt = 0;
amn->amn_tx_try1_cnt = 0;
@ -200,17 +193,18 @@ ath_rate_update(struct ath_softc *sc, struct ieee80211_node *ni, int rate)
{
struct ath_node *an = ATH_NODE(ni);
struct amrr_node *amn = ATH_NODE_AMRR(an);
struct ieee80211vap *vap = ni->ni_vap;
const HAL_RATE_TABLE *rt = sc->sc_currates;
u_int8_t rix;
KASSERT(rt != NULL, ("no rate table, mode %u", sc->sc_curmode));
DPRINTF(sc, "%s: set xmit rate for %s to %dM\n",
__func__, ether_sprintf(ni->ni_macaddr),
IEEE80211_NOTE(vap, IEEE80211_MSG_RATECTL, ni,
"%s: set xmit rate to %dM", __func__,
ni->ni_rates.rs_nrates > 0 ?
(ni->ni_rates.rs_rates[rate] & IEEE80211_RATE_VAL) / 2 : 0);
ni->ni_txrate = rate;
amn->amn_rix = rate;
/*
* Before associating a node has no rate set setup
* so we can't calculate any transmit codes to use.
@ -219,8 +213,8 @@ ath_rate_update(struct ath_softc *sc, struct ieee80211_node *ni, int rate)
* lowest hardware rate.
*/
if (ni->ni_rates.rs_nrates > 0) {
amn->amn_tx_rix0 = sc->sc_rixmap[
ni->ni_rates.rs_rates[rate] & IEEE80211_RATE_VAL];
ni->ni_txrate = ni->ni_rates.rs_rates[rate] & IEEE80211_RATE_VAL;
amn->amn_tx_rix0 = sc->sc_rixmap[ni->ni_txrate];
amn->amn_tx_rate0 = rt->info[amn->amn_tx_rix0].rateCode;
amn->amn_tx_rate0sp = amn->amn_tx_rate0 |
rt->info[amn->amn_tx_rix0].shortPreamble;
@ -268,7 +262,12 @@ ath_rate_update(struct ath_softc *sc, struct ieee80211_node *ni, int rate)
amn->amn_tx_rate3 = amn->amn_tx_rate3sp = 0;
}
}
node_reset (amn);
node_reset(amn);
amn->amn_interval = ath_rateinterval;
if (vap->iv_opmode == IEEE80211_M_STA)
amn->amn_interval /= 2;
amn->amn_interval = (amn->amn_interval * hz) / 1000;
}
/*
@ -278,11 +277,12 @@ static void
ath_rate_ctl_start(struct ath_softc *sc, struct ieee80211_node *ni)
{
#define RATE(_ix) (ni->ni_rates.rs_rates[(_ix)] & IEEE80211_RATE_VAL)
struct ieee80211com *ic = &sc->sc_ic;
struct ath_node *an = ATH_NODE(ni);
const struct ieee80211_txparam *tp = an->an_tp;
int srate;
KASSERT(ni->ni_rates.rs_nrates > 0, ("no rates"));
if (ic->ic_fixed_rate == IEEE80211_FIXED_RATE_NONE) {
if (tp == NULL || tp->ucastrate == IEEE80211_FIXED_RATE_NONE) {
/*
* No fixed rate is requested. For 11b start with
* the highest negotiated rate; otherwise, for 11g
@ -308,7 +308,7 @@ ath_rate_ctl_start(struct ath_softc *sc, struct ieee80211_node *ni)
*/
/* NB: the rate set is assumed sorted */
srate = ni->ni_rates.rs_nrates - 1;
for (; srate >= 0 && RATE(srate) != ic->ic_fixed_rate; srate--)
for (; srate >= 0 && RATE(srate) != tp->ucastrate; srate--)
;
}
/*
@ -333,22 +333,20 @@ ath_rate_cb(void *arg, struct ieee80211_node *ni)
* Reset the rate control state for each 802.11 state transition.
*/
void
ath_rate_newstate(struct ath_softc *sc, enum ieee80211_state state)
ath_rate_newstate(struct ieee80211vap *vap, enum ieee80211_state state)
{
struct amrr_softc *asc = (struct amrr_softc *) sc->sc_rc;
struct ieee80211com *ic = &sc->sc_ic;
struct ieee80211com *ic = vap->iv_ic;
struct ath_softc *sc = ic->ic_ifp->if_softc;
struct ieee80211_node *ni;
if (state == IEEE80211_S_INIT) {
callout_stop(&asc->timer);
if (state == IEEE80211_S_INIT)
return;
}
if (ic->ic_opmode == IEEE80211_M_STA) {
if (vap->iv_opmode == IEEE80211_M_STA) {
/*
* Reset local xmit state; this is really only
* meaningful when operating in station mode.
*/
ni = ic->ic_bss;
ni = vap->iv_bss;
if (state == IEEE80211_S_RUN) {
ath_rate_ctl_start(sc, ni);
} else {
@ -362,20 +360,7 @@ ath_rate_newstate(struct ath_softc *sc, enum ieee80211_state state)
* tx rate state of each node.
*/
ieee80211_iterate_nodes(&ic->ic_sta, ath_rate_cb, sc);
ath_rate_update(sc, ic->ic_bss, 0);
}
if (ic->ic_fixed_rate == IEEE80211_FIXED_RATE_NONE &&
state == IEEE80211_S_RUN) {
int interval;
/*
* Start the background rate control thread if we
* are not configured to use a fixed xmit rate.
*/
interval = ath_rateinterval;
if (ic->ic_opmode == IEEE80211_M_STA)
interval /= 2;
callout_reset(&asc->timer, (interval * hz) / 1000,
ath_ratectl, sc->sc_ifp);
ath_rate_update(sc, vap->iv_bss, 0);
}
}
@ -387,7 +372,7 @@ ath_rate_ctl(void *arg, struct ieee80211_node *ni)
{
struct ath_softc *sc = arg;
struct amrr_node *amn = ATH_NODE_AMRR(ATH_NODE (ni));
int old_rate;
int rix;
#define is_success(amn) \
(amn->amn_tx_try1_cnt < (amn->amn_tx_try0_cnt/10))
@ -395,52 +380,53 @@ ath_rate_ctl(void *arg, struct ieee80211_node *ni)
(amn->amn_tx_try0_cnt > 10)
#define is_failure(amn) \
(amn->amn_tx_try1_cnt > (amn->amn_tx_try0_cnt/3))
#define is_max_rate(ni) \
((ni->ni_txrate + 1) >= ni->ni_rates.rs_nrates)
#define is_min_rate(ni) \
(ni->ni_txrate == 0)
old_rate = ni->ni_txrate;
rix = amn->amn_rix;
DPRINTF (sc, "cnt0: %d cnt1: %d cnt2: %d cnt3: %d -- threshold: %d\n",
amn->amn_tx_try0_cnt,
amn->amn_tx_try1_cnt,
amn->amn_tx_try2_cnt,
amn->amn_tx_try3_cnt,
amn->amn_success_threshold);
IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_RATECTL, ni,
"cnt0: %d cnt1: %d cnt2: %d cnt3: %d -- threshold: %d",
amn->amn_tx_try0_cnt, amn->amn_tx_try1_cnt, amn->amn_tx_try2_cnt,
amn->amn_tx_try3_cnt, amn->amn_success_threshold);
if (is_success (amn) && is_enough (amn)) {
amn->amn_success++;
if (amn->amn_success == amn->amn_success_threshold &&
!is_max_rate (ni)) {
rix + 1 < ni->ni_rates.rs_nrates) {
amn->amn_recovery = 1;
amn->amn_success = 0;
ni->ni_txrate++;
DPRINTF (sc, "increase rate to %d\n", ni->ni_txrate);
rix++;
IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_RATECTL, ni,
"increase rate to %d", rix);
} else {
amn->amn_recovery = 0;
}
} else if (is_failure (amn)) {
amn->amn_success = 0;
if (!is_min_rate (ni)) {
if (rix > 0) {
if (amn->amn_recovery) {
/* recovery failure. */
amn->amn_success_threshold *= 2;
amn->amn_success_threshold = min (amn->amn_success_threshold,
(u_int)ath_rate_max_success_threshold);
DPRINTF (sc, "decrease rate recovery thr: %d\n", amn->amn_success_threshold);
IEEE80211_NOTE(ni->ni_vap,
IEEE80211_MSG_RATECTL, ni,
"decrease rate recovery thr: %d",
amn->amn_success_threshold);
} else {
/* simple failure. */
amn->amn_success_threshold = ath_rate_min_success_threshold;
DPRINTF (sc, "decrease rate normal thr: %d\n", amn->amn_success_threshold);
IEEE80211_NOTE(ni->ni_vap,
IEEE80211_MSG_RATECTL, ni,
"decrease rate normal thr: %d",
amn->amn_success_threshold);
}
amn->amn_recovery = 0;
ni->ni_txrate--;
rix--;
} else {
amn->amn_recovery = 0;
}
}
if (is_enough (amn) || old_rate != ni->ni_txrate) {
if (is_enough (amn) || rix != amn->amn_rix) {
/* reset counters. */
amn->amn_tx_try0_cnt = 0;
amn->amn_tx_try1_cnt = 0;
@ -448,35 +434,11 @@ ath_rate_ctl(void *arg, struct ieee80211_node *ni)
amn->amn_tx_try3_cnt = 0;
amn->amn_tx_failure_cnt = 0;
}
if (old_rate != ni->ni_txrate) {
ath_rate_update(sc, ni, ni->ni_txrate);
if (rix != amn->amn_rix) {
ath_rate_update(sc, ni, rix);
}
}
static void
ath_ratectl(void *arg)
{
struct ifnet *ifp = arg;
struct ath_softc *sc = ifp->if_softc;
struct amrr_softc *asc = (struct amrr_softc *) sc->sc_rc;
struct ieee80211com *ic = &sc->sc_ic;
int interval;
if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
sc->sc_stats.ast_rate_calls++;
if (ic->ic_opmode == IEEE80211_M_STA)
ath_rate_ctl(sc, ic->ic_bss); /* NB: no reference */
else
ieee80211_iterate_nodes(&ic->ic_sta, ath_rate_ctl, sc);
}
interval = ath_rateinterval;
if (ic->ic_opmode == IEEE80211_M_STA)
interval /= 2;
callout_reset(&asc->timer, (interval * hz) / 1000,
ath_ratectl, sc->sc_ifp);
}
static void
ath_rate_sysctlattach(struct ath_softc *sc)
{
@ -504,7 +466,6 @@ ath_rate_attach(struct ath_softc *sc)
if (asc == NULL)
return NULL;
asc->arc.arc_space = sizeof(struct amrr_node);
callout_init(&asc->timer, CALLOUT_MPSAFE);
ath_rate_sysctlattach(sc);
return &asc->arc;
@ -515,7 +476,6 @@ ath_rate_detach(struct ath_ratectrl *arc)
{
struct amrr_softc *asc = (struct amrr_softc *) arc;
callout_drain(&asc->timer);
free(asc, M_DEVBUF);
}

View File

@ -43,11 +43,13 @@
/* per-device state */
struct amrr_softc {
struct ath_ratectrl arc; /* base state */
struct callout timer; /* periodic timer */
};
/* per-node state */
struct amrr_node {
int amn_rix; /* current rate index */
int amn_ticks; /* time of last update */
int amn_interval; /* update interval (ticks) */
/* AMRR statistics for this node */
u_int amn_tx_try0_cnt;
u_int amn_tx_try1_cnt;

View File

@ -34,6 +34,7 @@ __FBSDID("$FreeBSD$");
* Atsushi Onoe's rate control algorithm.
*/
#include "opt_inet.h"
#include "opt_wlan.h"
#include <sys/param.h>
#include <sys/systm.h>
@ -68,19 +69,6 @@ __FBSDID("$FreeBSD$");
#include <dev/ath/ath_rate/onoe/onoe.h>
#include <contrib/dev/ath/ah_desc.h>
#define ONOE_DEBUG
#ifdef ONOE_DEBUG
enum {
ATH_DEBUG_RATE = 0x00000010, /* rate control */
};
#define DPRINTF(sc, _fmt, ...) do { \
if (sc->sc_debug & ATH_DEBUG_RATE) \
printf(_fmt, __VA_ARGS__); \
} while (0)
#else
#define DPRINTF(sc, _fmt, ...)
#endif
/*
* Default parameters for the rate control algorithm. These are
* all tunable with sysctls. The rate controller runs periodically
@ -104,7 +92,6 @@ static int ath_rateinterval = 1000; /* rate ctl interval (ms) */
static int ath_rate_raise = 10; /* add credit threshold */
static int ath_rate_raise_threshold = 10; /* rate ctl raise threshold */
static void ath_ratectl(void *);
static void ath_rate_update(struct ath_softc *, struct ieee80211_node *,
int rate);
static void ath_rate_ctl_start(struct ath_softc *, struct ieee80211_node *);
@ -114,7 +101,6 @@ void
ath_rate_node_init(struct ath_softc *sc, struct ath_node *an)
{
/* NB: assumed to be zero'd by caller */
ath_rate_update(sc, &an->an_node, 0);
}
void
@ -163,6 +149,10 @@ ath_rate_tx_complete(struct ath_softc *sc, struct ath_node *an,
on->on_tx_err++;
on->on_tx_retr += ts->ts_shortretry
+ ts->ts_longretry;
if (on->on_interval != 0 && ticks - on->on_ticks > on->on_interval) {
ath_rate_ctl(sc, &an->an_node);
on->on_ticks = ticks;
}
}
void
@ -177,17 +167,17 @@ ath_rate_update(struct ath_softc *sc, struct ieee80211_node *ni, int rate)
{
struct ath_node *an = ATH_NODE(ni);
struct onoe_node *on = ATH_NODE_ONOE(an);
struct ieee80211vap *vap = ni->ni_vap;
const HAL_RATE_TABLE *rt = sc->sc_currates;
u_int8_t rix;
KASSERT(rt != NULL, ("no rate table, mode %u", sc->sc_curmode));
DPRINTF(sc, "%s: set xmit rate for %s to %dM\n",
__func__, ether_sprintf(ni->ni_macaddr),
ni->ni_rates.rs_nrates > 0 ?
IEEE80211_NOTE(vap, IEEE80211_MSG_RATECTL, ni,
"%s: set xmit rate to %dM", __func__,
ni->ni_rates.rs_nrates > 0 ?
(ni->ni_rates.rs_rates[rate] & IEEE80211_RATE_VAL) / 2 : 0);
ni->ni_txrate = rate;
/*
* Before associating a node has no rate set setup
* so we can't calculate any transmit codes to use.
@ -197,8 +187,9 @@ ath_rate_update(struct ath_softc *sc, struct ieee80211_node *ni, int rate)
*/
if (ni->ni_rates.rs_nrates == 0)
goto done;
on->on_tx_rix0 = sc->sc_rixmap[
ni->ni_rates.rs_rates[rate] & IEEE80211_RATE_VAL];
on->on_rix = rate;
ni->ni_txrate = ni->ni_rates.rs_rates[rate] & IEEE80211_RATE_VAL;
on->on_tx_rix0 = sc->sc_rixmap[ni->ni_txrate];
on->on_tx_rate0 = rt->info[on->on_tx_rix0].rateCode;
on->on_tx_rate0sp = on->on_tx_rate0 |
@ -246,6 +237,11 @@ ath_rate_update(struct ath_softc *sc, struct ieee80211_node *ni, int rate)
}
done:
on->on_tx_ok = on->on_tx_err = on->on_tx_retr = on->on_tx_upper = 0;
on->on_interval = ath_rateinterval;
if (vap->iv_opmode == IEEE80211_M_STA)
on->on_interval /= 2;
on->on_interval = (on->on_interval * hz) / 1000;
}
/*
@ -255,11 +251,12 @@ static void
ath_rate_ctl_start(struct ath_softc *sc, struct ieee80211_node *ni)
{
#define RATE(_ix) (ni->ni_rates.rs_rates[(_ix)] & IEEE80211_RATE_VAL)
struct ieee80211com *ic = &sc->sc_ic;
struct ath_node *an = ATH_NODE(ni);
const struct ieee80211_txparam *tp = an->an_tp;
int srate;
KASSERT(ni->ni_rates.rs_nrates > 0, ("no rates"));
if (ic->ic_fixed_rate == IEEE80211_FIXED_RATE_NONE) {
if (tp == NULL || tp->ucastrate == IEEE80211_FIXED_RATE_NONE) {
/*
* No fixed rate is requested. For 11b start with
* the highest negotiated rate; otherwise, for 11g
@ -285,7 +282,7 @@ ath_rate_ctl_start(struct ath_softc *sc, struct ieee80211_node *ni)
*/
/* NB: the rate set is assumed sorted */
srate = ni->ni_rates.rs_nrates - 1;
for (; srate >= 0 && RATE(srate) != ic->ic_fixed_rate; srate--)
for (; srate >= 0 && RATE(srate) != tp->ucastrate; srate--)
;
}
/*
@ -310,22 +307,20 @@ ath_rate_cb(void *arg, struct ieee80211_node *ni)
* Reset the rate control state for each 802.11 state transition.
*/
void
ath_rate_newstate(struct ath_softc *sc, enum ieee80211_state state)
ath_rate_newstate(struct ieee80211vap *vap, enum ieee80211_state state)
{
struct onoe_softc *osc = (struct onoe_softc *) sc->sc_rc;
struct ieee80211com *ic = &sc->sc_ic;
struct ieee80211com *ic = vap->iv_ic;
struct ath_softc *sc = ic->ic_ifp->if_softc;
struct ieee80211_node *ni;
if (state == IEEE80211_S_INIT) {
callout_stop(&osc->timer);
if (state == IEEE80211_S_INIT)
return;
}
if (ic->ic_opmode == IEEE80211_M_STA) {
if (vap->iv_opmode == IEEE80211_M_STA) {
/*
* Reset local xmit state; this is really only
* meaningful when operating in station mode.
*/
ni = ic->ic_bss;
ni = vap->iv_bss;
if (state == IEEE80211_S_RUN) {
ath_rate_ctl_start(sc, ni);
} else {
@ -339,20 +334,7 @@ ath_rate_newstate(struct ath_softc *sc, enum ieee80211_state state)
* tx rate state of each node.
*/
ieee80211_iterate_nodes(&ic->ic_sta, ath_rate_cb, sc);
ath_rate_update(sc, ic->ic_bss, 0);
}
if (ic->ic_fixed_rate == IEEE80211_FIXED_RATE_NONE &&
state == IEEE80211_S_RUN) {
int interval;
/*
* Start the background rate control thread if we
* are not configured to use a fixed xmit rate.
*/
interval = ath_rateinterval;
if (ic->ic_opmode == IEEE80211_M_STA)
interval /= 2;
callout_reset(&osc->timer, (interval * hz) / 1000,
ath_ratectl, sc->sc_ifp);
ath_rate_update(sc, vap->iv_bss, 0);
}
}
@ -386,12 +368,11 @@ ath_rate_ctl(void *arg, struct ieee80211_node *ni)
on->on_tx_retr < (on->on_tx_ok * ath_rate_raise) / 100)
dir = 1;
DPRINTF(sc, "%s: ok %d err %d retr %d upper %d dir %d\n",
ether_sprintf(ni->ni_macaddr),
on->on_tx_ok, on->on_tx_err, on->on_tx_retr,
on->on_tx_upper, dir);
IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_RATECTL, ni,
"ok %d err %d retr %d upper %d dir %d",
on->on_tx_ok, on->on_tx_err, on->on_tx_retr, on->on_tx_upper, dir);
nrate = ni->ni_txrate;
nrate = on->on_rix;
switch (dir) {
case 0:
if (enough && on->on_tx_upper > 0)
@ -416,10 +397,10 @@ ath_rate_ctl(void *arg, struct ieee80211_node *ni)
break;
}
if (nrate != ni->ni_txrate) {
DPRINTF(sc, "%s: %dM -> %dM (%d ok, %d err, %d retr)\n",
__func__,
(rs->rs_rates[ni->ni_txrate] & IEEE80211_RATE_VAL) / 2,
if (nrate != on->on_rix) {
IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_RATECTL, ni,
"%s: %dM -> %dM (%d ok, %d err, %d retr)", __func__,
ni->ni_txrate / 2,
(rs->rs_rates[nrate] & IEEE80211_RATE_VAL) / 2,
on->on_tx_ok, on->on_tx_err, on->on_tx_retr);
ath_rate_update(sc, ni, nrate);
@ -427,30 +408,6 @@ ath_rate_ctl(void *arg, struct ieee80211_node *ni)
on->on_tx_ok = on->on_tx_err = on->on_tx_retr = 0;
}
static void
ath_ratectl(void *arg)
{
struct ifnet *ifp = arg;
struct ath_softc *sc = ifp->if_softc;
struct onoe_softc *osc = (struct onoe_softc *) sc->sc_rc;
struct ieee80211com *ic = &sc->sc_ic;
int interval;
if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
sc->sc_stats.ast_rate_calls++;
if (ic->ic_opmode == IEEE80211_M_STA)
ath_rate_ctl(sc, ic->ic_bss); /* NB: no reference */
else
ieee80211_iterate_nodes(&ic->ic_sta, ath_rate_ctl, sc);
}
interval = ath_rateinterval;
if (ic->ic_opmode == IEEE80211_M_STA)
interval /= 2;
callout_reset(&osc->timer, (interval * hz) / 1000,
ath_ratectl, sc->sc_ifp);
}
static void
ath_rate_sysctlattach(struct ath_softc *sc)
{
@ -478,7 +435,6 @@ ath_rate_attach(struct ath_softc *sc)
if (osc == NULL)
return NULL;
osc->arc.arc_space = sizeof(struct onoe_node);
callout_init(&osc->timer, CALLOUT_MPSAFE);
ath_rate_sysctlattach(sc);
return &osc->arc;
@ -489,7 +445,6 @@ ath_rate_detach(struct ath_ratectrl *arc)
{
struct onoe_softc *osc = (struct onoe_softc *) arc;
callout_drain(&osc->timer);
free(osc, M_DEVBUF);
}

View File

@ -38,11 +38,14 @@
/* per-device state */
struct onoe_softc {
struct ath_ratectrl arc; /* base state */
struct callout timer; /* periodic timer */
};
/* per-node state */
struct onoe_node {
int on_rix; /* current rate index */
int on_ticks; /* time of last update */
int on_interval; /* update interval (ticks) */
u_int on_tx_ok; /* tx ok pkt */
u_int on_tx_err; /* tx !ok pkt */
u_int on_tx_retr; /* tx retry count */

View File

@ -42,6 +42,7 @@ __FBSDID("$FreeBSD$");
* John Bicket's SampleRate control algorithm.
*/
#include "opt_inet.h"
#include "opt_wlan.h"
#include <sys/param.h>
#include <sys/systm.h>
@ -61,7 +62,6 @@ __FBSDID("$FreeBSD$");
#include <net/if.h>
#include <net/if_media.h>
#include <net/if_arp.h>
#include <net/ethernet.h> /* XXX for ether_sprintf */
#include <net80211/ieee80211_var.h>
@ -76,23 +76,6 @@ __FBSDID("$FreeBSD$");
#include <dev/ath/ath_rate/sample/sample.h>
#include <contrib/dev/ath/ah_desc.h>
#define SAMPLE_DEBUG
#ifdef SAMPLE_DEBUG
enum {
ATH_DEBUG_NODE = 0x00080000, /* node management */
ATH_DEBUG_RATE = 0x00000010, /* rate control */
ATH_DEBUG_ANY = 0xffffffff
};
#define DPRINTF(sc, m, fmt, ...) do { \
if (sc->sc_debug & (m)) \
printf(fmt, __VA_ARGS__); \
} while (0)
#else
#define DPRINTF(sc, m, fmt, ...) do { \
(void) sc; \
} while (0)
#endif
/*
* This file is an implementation of the SampleRate algorithm
* in "Bit-rate Selection in Wireless Networks"
@ -152,14 +135,12 @@ rate_to_ndx(struct sample_node *sn, int rate) {
void
ath_rate_node_init(struct ath_softc *sc, struct ath_node *an)
{
DPRINTF(sc, ATH_DEBUG_NODE, "%s:\n", __func__);
/* NB: assumed to be zero'd by caller */
}
void
ath_rate_node_cleanup(struct ath_softc *sc, struct ath_node *an)
{
DPRINTF(sc, ATH_DEBUG_NODE, "%s:\n", __func__);
}
@ -258,7 +239,8 @@ ath_rate_findrate(struct ath_softc *sc, struct ath_node *an,
{
struct sample_node *sn = ATH_NODE_SAMPLE(an);
struct sample_softc *ssc = ATH_SOFTC_SAMPLE(sc);
struct ieee80211com *ic = &sc->sc_ic;
struct ifnet *ifp = sc->sc_ifp;
struct ieee80211com *ic = ifp->if_l2com;
int ndx, size_bin, mrr, best_ndx, change_rates;
unsigned average_tx_time;
@ -323,10 +305,11 @@ ath_rate_findrate(struct ath_softc *sc, struct ath_node *an,
if (change_rates) {
if (best_ndx != sn->current_rate[size_bin]) {
DPRINTF(sc, ATH_DEBUG_RATE,
"%s: %s size %d switch rate %d (%d/%d) -> %d (%d/%d) after %d packets mrr %d\n",
IEEE80211_NOTE(an->an_node.ni_vap,
IEEE80211_MSG_RATECTL,
&an->an_node,
"%s: size %d switch rate %d (%d/%d) -> %d (%d/%d) after %d packets mrr %d",
__func__,
ether_sprintf(an->an_node.ni_macaddr),
packet_size_bins[size_bin],
sn->rates[sn->current_rate[size_bin]].rate,
sn->stats[size_bin][sn->current_rate[size_bin]].average_tx_time,
@ -340,16 +323,13 @@ ath_rate_findrate(struct ath_softc *sc, struct ath_node *an,
sn->packets_since_switch[size_bin] = 0;
sn->current_rate[size_bin] = best_ndx;
sn->ticks_since_switch[size_bin] = ticks;
/*
* Set the visible txrate for this node.
*/
an->an_node.ni_txrate = sn->rates[best_ndx].rate;
}
ndx = sn->current_rate[size_bin];
sn->packets_since_switch[size_bin]++;
if (size_bin == 0) {
/*
* set the visible txrate for this node
* to the rate of small packets
*/
an->an_node.ni_txrate = ndx;
}
}
}
@ -494,9 +474,10 @@ update_stats(struct ath_softc *sc, struct ath_node *an,
if (ndx0 == sn->current_sample_ndx[size_bin]) {
DPRINTF(sc, ATH_DEBUG_RATE,
"%s: %s size %d %s sample rate %d tries (%d/%d) tt %d avg_tt (%d/%d)\n",
__func__, ether_sprintf(an->an_node.ni_macaddr),
IEEE80211_NOTE(an->an_node.ni_vap, IEEE80211_MSG_RATECTL,
&an->an_node,
"%s: size %d %s sample rate %d tries (%d/%d) tt %d avg_tt (%d/%d)",
__func__,
size,
status ? "FAIL" : "OK",
rate, short_tries, tries, tt,
@ -511,7 +492,8 @@ void
ath_rate_tx_complete(struct ath_softc *sc, struct ath_node *an,
const struct ath_buf *bf)
{
struct ieee80211com *ic = &sc->sc_ic;
struct ifnet *ifp = sc->sc_ifp;
struct ieee80211com *ic = ifp->if_l2com;
struct sample_node *sn = ATH_NODE_SAMPLE(an);
const struct ath_tx_status *ts = &bf->bf_status.ds_txstat;
const struct ath_desc *ds0 = &bf->bf_desc[0];
@ -526,9 +508,10 @@ ath_rate_tx_complete(struct ath_softc *sc, struct ath_node *an,
frame_size = 1500;
if (sn->num_rates <= 0) {
DPRINTF(sc, ATH_DEBUG_RATE,
"%s: %s size %d %s rate/try %d/%d no rates yet\n",
__func__, ether_sprintf(an->an_node.ni_macaddr),
IEEE80211_NOTE(an->an_node.ni_vap, IEEE80211_MSG_RATECTL,
&an->an_node,
"%s: size %d %s rate/try %d/%d no rates yet",
__func__,
bin_to_size(size_to_bin(frame_size)),
ts->ts_status ? "FAIL" : "OK",
short_tries, long_tries);
@ -541,9 +524,9 @@ ath_rate_tx_complete(struct ath_softc *sc, struct ath_node *an,
/*
* Only one rate was used; optimize work.
*/
DPRINTF(sc, ATH_DEBUG_RATE,
"%s: %s size %d %s rate/try %d/%d/%d\n",
__func__, ether_sprintf(an->an_node.ni_macaddr),
IEEE80211_NOTE(an->an_node.ni_vap, IEEE80211_MSG_RATECTL,
&an->an_node, "%s: size %d %s rate/try %d/%d/%d",
__func__,
bin_to_size(size_to_bin(frame_size)),
ts->ts_status ? "FAIL" : "OK",
final_rate, short_tries, long_tries);
@ -591,9 +574,10 @@ ath_rate_tx_complete(struct ath_softc *sc, struct ath_node *an,
tries3 = MS(ds0->ds_ctl2, AR_XmitDataTries3);
ndx3 = rate_to_ndx(sn, rate3);
DPRINTF(sc, ATH_DEBUG_RATE,
"%s: %s size %d finaltsidx %d tries %d %s rate/try [%d/%d %d/%d %d/%d %d/%d]\n",
__func__, ether_sprintf(an->an_node.ni_macaddr),
IEEE80211_NOTE(an->an_node.ni_vap, IEEE80211_MSG_RATECTL,
&an->an_node,
"%s: size %d finaltsidx %d tries %d %s rate/try [%d/%d %d/%d %d/%d %d/%d]",
__func__,
bin_to_size(size_to_bin(frame_size)),
finalTSIdx,
long_tries,
@ -658,8 +642,6 @@ ath_rate_tx_complete(struct ath_softc *sc, struct ath_node *an,
void
ath_rate_newassoc(struct ath_softc *sc, struct ath_node *an, int isnew)
{
DPRINTF(sc, ATH_DEBUG_NODE, "%s: %s isnew %d\n", __func__,
ether_sprintf(an->an_node.ni_macaddr), isnew);
if (isnew)
ath_rate_ctl_reset(sc, &an->an_node);
}
@ -671,15 +653,15 @@ static void
ath_rate_ctl_reset(struct ath_softc *sc, struct ieee80211_node *ni)
{
#define RATE(_ix) (ni->ni_rates.rs_rates[(_ix)] & IEEE80211_RATE_VAL)
struct ieee80211com *ic = &sc->sc_ic;
struct ath_node *an = ATH_NODE(ni);
const struct ieee80211_txparam *tp = an->an_tp;
struct sample_node *sn = ATH_NODE_SAMPLE(an);
const HAL_RATE_TABLE *rt = sc->sc_currates;
int x, y, srate;
KASSERT(rt != NULL, ("no rate table, mode %u", sc->sc_curmode));
sn->static_rate_ndx = -1;
if (ic->ic_fixed_rate != IEEE80211_FIXED_RATE_NONE) {
if (tp != NULL && tp->ucastrate != IEEE80211_FIXED_RATE_NONE) {
/*
* A fixed rate is to be used; ic_fixed_rate is the
* IEEE code for this rate (sans basic bit). Convert this
@ -688,7 +670,7 @@ ath_rate_ctl_reset(struct ath_softc *sc, struct ieee80211_node *ni)
*/
/* NB: the rate set is assumed sorted */
srate = ni->ni_rates.rs_nrates - 1;
for (; srate >= 0 && RATE(srate) != ic->ic_fixed_rate; srate--)
for (; srate >= 0 && RATE(srate) != tp->ucastrate; srate--)
;
/*
* The fixed rate may not be available due to races
@ -700,32 +682,34 @@ ath_rate_ctl_reset(struct ath_softc *sc, struct ieee80211_node *ni)
sn->static_rate_ndx = srate;
}
DPRINTF(sc, ATH_DEBUG_RATE, "%s: %s size 1600 rate/tt",
__func__, ether_sprintf(ni->ni_macaddr));
sn->num_rates = ni->ni_rates.rs_nrates;
for (x = 0; x < ni->ni_rates.rs_nrates; x++) {
sn->rates[x].rate = ni->ni_rates.rs_rates[x] & IEEE80211_RATE_VAL;
sn->rates[x].rix = sc->sc_rixmap[sn->rates[x].rate];
if (sn->rates[x].rix == 0xff) {
DPRINTF(sc, ATH_DEBUG_RATE,
"%s: ignore bogus rix at %d\n", __func__, x);
IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_RATECTL, ni,
"%s: ignore bogus rix at %d", __func__, x);
continue;
}
sn->rates[x].rateCode = rt->info[sn->rates[x].rix].rateCode;
sn->rates[x].shortPreambleRateCode =
rt->info[sn->rates[x].rix].rateCode |
rt->info[sn->rates[x].rix].shortPreamble;
DPRINTF(sc, ATH_DEBUG_RATE, " %d/%d", sn->rates[x].rate,
calc_usecs_unicast_packet(sc, 1600, sn->rates[x].rix, 0,0));
}
DPRINTF(sc, ATH_DEBUG_RATE, "%s\n", "");
/* set the visible bit-rate to the lowest one available */
ni->ni_txrate = 0;
sn->num_rates = ni->ni_rates.rs_nrates;
#ifdef IEEE80211_DEBUG
if (ieee80211_msg(ni->ni_vap, IEEE80211_MSG_RATECTL)) {
ieee80211_note(ni->ni_vap, "[%6D] %s: size 1600 rate/tt",
__func__, ni->ni_macaddr, ":");
for (x = 0; x < sn->num_rates; x++) {
if (sn->rates[x].rix == 0xff)
continue;
printf(" %d/%d", sn->rates[x].rate,
calc_usecs_unicast_packet(sc, 1600,
sn->rates[x].rix, 0,0));
}
printf("\n");
}
#endif
for (y = 0; y < NUM_PACKET_SIZE_BINS; y++) {
int size = bin_to_size(y);
int ndx = 0;
@ -756,9 +740,8 @@ ath_rate_ctl_reset(struct ath_softc *sc, struct ieee80211_node *ni)
sn->current_rate[y] = ndx;
}
DPRINTF(sc, ATH_DEBUG_RATE,
"%s: %s %d rates %d%sMbps (%dus)- %d%sMbps (%dus)\n",
__func__, ether_sprintf(ni->ni_macaddr),
IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_RATECTL, ni,
"%s: %d rates %d%sMbps (%dus)- %d%sMbps (%dus)", __func__,
sn->num_rates,
sn->rates[0].rate/2, sn->rates[0].rate % 0x1 ? ".5" : "",
sn->stats[1][0].perfect_tx_time,
@ -767,10 +750,11 @@ ath_rate_ctl_reset(struct ath_softc *sc, struct ieee80211_node *ni)
sn->stats[1][sn->num_rates-1].perfect_tx_time
);
if (sn->static_rate_ndx != -1)
ni->ni_txrate = sn->static_rate_ndx;
/* set the visible bit-rate */
if (sn->static_rate_ndx != -1)
ni->ni_txrate = sn->rates[sn->static_rate_ndx].rate;
else
ni->ni_txrate = sn->current_rate[0];
ni->ni_txrate = sn->rates[0].rate;
#undef RATE
}
@ -786,18 +770,19 @@ rate_cb(void *arg, struct ieee80211_node *ni)
* Reset the rate control state for each 802.11 state transition.
*/
void
ath_rate_newstate(struct ath_softc *sc, enum ieee80211_state state)
ath_rate_newstate(struct ieee80211vap *vap, enum ieee80211_state state)
{
struct ieee80211com *ic = &sc->sc_ic;
struct ieee80211com *ic = vap->iv_ic;
struct ath_softc *sc = ic->ic_ifp->if_softc;
if (state == IEEE80211_S_RUN) {
if (ic->ic_opmode != IEEE80211_M_STA) {
if (vap->iv_opmode != IEEE80211_M_STA) {
/*
* Sync rates for associated stations and neighbors.
*/
ieee80211_iterate_nodes(&ic->ic_sta, rate_cb, sc);
}
ath_rate_newassoc(sc, ATH_NODE(ic->ic_bss), 1);
ath_rate_newassoc(sc, ATH_NODE(vap->iv_bss), 1);
}
}
@ -822,7 +807,6 @@ ath_rate_attach(struct ath_softc *sc)
{
struct sample_softc *osc;
DPRINTF(sc, ATH_DEBUG_ANY, "%s:\n", __func__);
osc = malloc(sizeof(struct sample_softc), M_DEVBUF, M_NOWAIT|M_ZERO);
if (osc == NULL)
return NULL;

View File

@ -155,12 +155,13 @@ static unsigned calc_usecs_unicast_packet(struct ath_softc *sc,
int length,
int rix, int short_retries, int long_retries) {
const HAL_RATE_TABLE *rt = sc->sc_currates;
struct ifnet *ifp = sc->sc_ifp;
struct ieee80211com *ic = ifp->if_l2com;
int rts, cts;
unsigned t_slot = 20;
unsigned t_difs = 50;
unsigned t_sifs = 10;
struct ieee80211com *ic = &sc->sc_ic;
int tt = 0;
int x = 0;
int cw = WIFI_CW_MIN;

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,5 @@
/*-
* Copyright (c) 2002-2007 Sam Leffler, Errno Consulting
* Copyright (c) 2002-2008 Sam Leffler, Errno Consulting
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without

View File

@ -1,5 +1,5 @@
/*-
* Copyright (c) 2002-2007 Sam Leffler, Errno Consulting
* Copyright (c) 2002-2008 Sam Leffler, Errno Consulting
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without

View File

@ -1,5 +1,5 @@
/*-
* Copyright (c) 2004-2007 Sam Leffler, Errno Consulting
* Copyright (c) 2004-2008 Sam Leffler, Errno Consulting
* Copyright (c) 2004 Video54 Technologies, Inc.
* All rights reserved.
*
@ -102,7 +102,7 @@ void ath_rate_newassoc(struct ath_softc *, struct ath_node *,
* Important mostly as the analog to ath_rate_newassoc when operating
* in station mode.
*/
void ath_rate_newstate(struct ath_softc *, enum ieee80211_state);
void ath_rate_newstate(struct ieee80211vap *, enum ieee80211_state);
/*
* Transmit handling.

View File

@ -1,5 +1,5 @@
/*-
* Copyright (c) 2002-2007 Sam Leffler, Errno Consulting
* Copyright (c) 2002-2008 Sam Leffler, Errno Consulting
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@ -49,6 +49,8 @@
#ifndef ATH_TXBUF
#define ATH_TXBUF 200 /* number of TX buffers */
#endif
#define ATH_BCBUF 4 /* number of beacon buffers */
#define ATH_TXDESC 10 /* number of descriptors per buffer */
#define ATH_TXMAXTRY 11 /* max number of transmit attempts */
#define ATH_TXMGTTRY 4 /* xmit attempts for mgt/ctl frames */
@ -80,7 +82,9 @@ struct ath_buf;
/* driver-specific node state */
struct ath_node {
struct ieee80211_node an_node; /* base class */
u_int32_t an_avgrssi; /* average rssi over all rx frames */
const struct ieee80211_txparam *an_tp;
u_int8_t an_mgmtrix; /* min h/w rate index */
u_int8_t an_mcastrix; /* mcast h/w rate index */
struct ath_buf *an_ff_buf[WME_NUM_AC]; /* ff staging area */
/* variable-length rate control state follows */
};
@ -141,6 +145,7 @@ struct ath_descdma {
*/
struct ath_txq {
u_int axq_qnum; /* hardware q number */
#define ATH_TXQ_SWQ (HAL_NUM_TX_QUEUES+1) /* qnum for s/w only queue */
u_int axq_depth; /* queue depth (stat only) */
u_int axq_intrcnt; /* interrupt count */
u_int32_t *axq_link; /* link ptr in last TX desc */
@ -175,6 +180,25 @@ struct ath_txq {
STAILQ_REMOVE_HEAD(&(_tq)->axq_q, _field); \
(_tq)->axq_depth--; \
} while (0)
/* NB: this does not do the "head empty check" that STAILQ_LAST does */
#define ATH_TXQ_LAST(_tq) \
((struct ath_buf *)(void *) \
((char *)((_tq)->axq_q.stqh_last) - __offsetof(struct ath_buf, bf_list)))
struct ath_vap {
struct ieee80211vap av_vap; /* base class */
int av_bslot; /* beacon slot index */
struct ath_buf *av_bcbuf; /* beacon buffer */
struct ieee80211_beacon_offsets av_boff;/* dynamic update state */
struct ath_txq av_mcastq; /* buffered mcast s/w queue */
void (*av_recv_mgmt)(struct ieee80211_node *,
struct mbuf *, int, int, int, u_int32_t);
int (*av_newstate)(struct ieee80211vap *,
enum ieee80211_state, int);
void (*av_bmiss)(struct ieee80211vap *);
};
#define ATH_VAP(vap) ((struct ath_vap *)(vap))
struct taskqueue;
struct ath_tx99;
@ -182,16 +206,13 @@ struct ath_tx99;
struct ath_softc {
struct ifnet *sc_ifp; /* interface common */
struct ath_stats sc_stats; /* interface statistics */
struct ieee80211com sc_ic; /* IEEE 802.11 common */
int sc_debug;
u_int32_t sc_countrycode;
u_int32_t sc_regdomain;
void (*sc_recv_mgmt)(struct ieee80211com *,
struct mbuf *,
struct ieee80211_node *,
int, int, int, u_int32_t);
int (*sc_newstate)(struct ieee80211com *,
enum ieee80211_state, int);
int sc_nvaps; /* # vaps */
int sc_nstavaps; /* # station vaps */
u_int8_t sc_hwbssidmask[IEEE80211_ADDR_LEN];
u_int8_t sc_nbssid0; /* # vap's using base mac */
uint32_t sc_bssidmask; /* bssid mask */
void (*sc_node_free)(struct ieee80211_node *);
device_t sc_dev;
HAL_BUS_TAG sc_st; /* bus space tag */
@ -203,22 +224,28 @@ struct ath_softc {
struct ath_ratectrl *sc_rc; /* tx rate control support */
struct ath_tx99 *sc_tx99; /* tx99 adjunct state */
void (*sc_setdefantenna)(struct ath_softc *, u_int);
unsigned int sc_invalid : 1, /* disable hardware accesses */
sc_mrretry : 1, /* multi-rate retry support */
sc_softled : 1, /* enable LED gpio status */
sc_splitmic: 1, /* split TKIP MIC keys */
sc_needmib : 1, /* enable MIB stats intr */
sc_diversity : 1,/* enable rx diversity */
sc_hasveol : 1, /* tx VEOL support */
sc_ledstate: 1, /* LED on/off state */
sc_blinking: 1, /* LED blink operation active */
sc_mcastkey: 1, /* mcast key cache search */
sc_scanning: 1, /* scanning active */
unsigned int sc_invalid : 1,/* disable hardware accesses */
sc_mrretry : 1,/* multi-rate retry support */
sc_softled : 1,/* enable LED gpio status */
sc_splitmic : 1,/* split TKIP MIC keys */
sc_needmib : 1,/* enable MIB stats intr */
sc_diversity: 1,/* enable rx diversity */
sc_hasveol : 1,/* tx VEOL support */
sc_ledstate : 1,/* LED on/off state */
sc_blinking : 1,/* LED blink operation active */
sc_mcastkey : 1,/* mcast key cache search */
sc_scanning : 1,/* scanning active */
sc_syncbeacon:1,/* sync/resync beacon timers */
sc_hasclrkey:1, /* CLR key supported */
sc_hasclrkey: 1,/* CLR key supported */
sc_xchanmode: 1,/* extended channel mode */
sc_outdoor : 1,/* outdoor operation */
sc_dturbo : 1; /* dynamic turbo in use */
sc_dturbo : 1,/* dynamic turbo in use */
sc_hasbmask : 1,/* bssid mask support */
sc_hastsfadd: 1,/* tsf adjust support */
sc_beacons : 1,/* beacons running */
sc_swbmiss : 1,/* sta mode using sw bmiss */
sc_stagbeacons:1,/* use staggered beacons */
sc_wmetkipmic:1;/* can do WME+TKIP MIC */
/* rate tables */
#define IEEE80211_MODE_HALF (IEEE80211_MODE_MAX+0)
#define IEEE80211_MODE_QUARTER (IEEE80211_MODE_MAX+1)
@ -238,8 +265,6 @@ struct ath_softc {
u_int16_t ledon; /* softled on time */
u_int16_t ledoff; /* softled off time */
} sc_hwmap[32]; /* h/w rate ix mappings */
u_int8_t sc_minrateix; /* min h/w rate index */
u_int8_t sc_mcastrix; /* mcast h/w rate index */
u_int8_t sc_protrix; /* protection rate index */
u_int8_t sc_lastdatarix; /* last data frame rate index */
u_int sc_mcastrate; /* ieee rate for mcastrateix */
@ -262,20 +287,13 @@ struct ath_softc {
u_int sc_rfsilentpin; /* GPIO pin for rfkill int */
u_int sc_rfsilentpol; /* pin setting for rfkill on */
struct bpf_if *sc_drvbpf;
union {
struct ath_tx_radiotap_header th;
u_int8_t pad[64];
} u_tx_rt;
struct ath_tx_radiotap_header sc_tx_th;
int sc_tx_th_len;
union {
struct ath_rx_radiotap_header th;
u_int8_t pad[64];
} u_rx_rt;
struct ath_rx_radiotap_header sc_rx_th;
int sc_rx_th_len;
u_int sc_monpass; /* frames to pass in mon.mode */
struct ath_descdma sc_rxdma; /* RX descriptos */
struct ath_descdma sc_rxdma; /* RX descriptors */
ath_bufhead sc_rxbuf; /* receive buffer */
struct mbuf *sc_rxpending; /* pending receive data */
u_int32_t *sc_rxlink; /* link ptr in last RX desc */
@ -301,7 +319,6 @@ struct ath_softc {
u_int sc_bmisscount; /* missed beacon transmits */
u_int32_t sc_ant_tx[8]; /* recent tx frames/antenna */
struct ath_txq *sc_cabq; /* tx q for cab frames */
struct ieee80211_beacon_offsets sc_boff;/* dynamic update state */
struct task sc_bmisstask; /* bmiss int processing */
struct task sc_bstucktask; /* stuck beacon processing */
enum {
@ -309,16 +326,15 @@ struct ath_softc {
UPDATE, /* update pending */
COMMIT /* beacon sent, commit change */
} sc_updateslot; /* slot time update fsm */
struct ath_txq sc_mcastq; /* mcast xmits w/ ps sta's */
int sc_slotupdate; /* slot to advance fsm */
struct ieee80211vap *sc_bslot[ATH_BCBUF];
int sc_nbcnvaps; /* # vaps with beacons */
struct callout sc_cal_ch; /* callout handle for cals */
int sc_calinterval; /* current polling interval */
int sc_caltries; /* cals at current interval */
HAL_NODE_STATS sc_halstats; /* station-mode rssi stats */
struct callout sc_dfs_ch; /* callout handle for dfs */
};
#define sc_tx_th u_tx_rt.th
#define sc_rx_th u_rx_rt.th
#define ATH_LOCK_INIT(_sc) \
mtx_init(&(_sc)->sc_mtx, device_get_nameunit((_sc)->sc_dev), \
@ -361,6 +377,10 @@ void ath_intr(void *);
((*(_ah)->ah_getMacAddress)((_ah), (_mac)))
#define ath_hal_setmac(_ah, _mac) \
((*(_ah)->ah_setMacAddress)((_ah), (_mac)))
#define ath_hal_getbssidmask(_ah, _mask) \
((*(_ah)->ah_getBssIdMask)((_ah), (_mask)))
#define ath_hal_setbssidmask(_ah, _mask) \
((*(_ah)->ah_setBssIdMask)((_ah), (_mask)))
#define ath_hal_intrset(_ah, _mask) \
((*(_ah)->ah_setInterrupts)((_ah), (_mask)))
#define ath_hal_intrget(_ah) \
@ -483,15 +503,21 @@ void ath_intr(void *);
#define ath_hal_getregdomain(_ah, _prd) \
(ath_hal_getcapability(_ah, HAL_CAP_REG_DMN, 0, (_prd)) == HAL_OK)
#define ath_hal_setregdomain(_ah, _rd) \
((*(_ah)->ah_setRegulatoryDomain)((_ah), (_rd), NULL))
(*(uint16_t *)(((uint8_t *)(_ah)) + 520) = (_rd))
#define ath_hal_getcountrycode(_ah, _pcc) \
(*(_pcc) = (_ah)->ah_countryCode)
#define ath_hal_gettkipmic(_ah) \
(ath_hal_getcapability(_ah, HAL_CAP_TKIP_MIC, 1, NULL) == HAL_OK)
#define ath_hal_settkipmic(_ah, _v) \
ath_hal_setcapability(_ah, HAL_CAP_TKIP_MIC, 1, _v, NULL)
#define ath_hal_hastkipsplit(_ah) \
(ath_hal_getcapability(_ah, HAL_CAP_TKIP_SPLIT, 0, NULL) == HAL_OK)
#define ath_hal_gettkipsplit(_ah) \
(ath_hal_getcapability(_ah, HAL_CAP_TKIP_SPLIT, 1, NULL) == HAL_OK)
#define ath_hal_settkipsplit(_ah, _v) \
ath_hal_setcapability(_ah, HAL_CAP_TKIP_SPLIT, 1, _v, NULL)
#define ath_hal_haswmetkipmic(_ah) \
(ath_hal_getcapability(_ah, HAL_CAP_WME_TKIPMIC, 0, NULL) == HAL_OK)
#define ath_hal_hwphycounters(_ah) \
(ath_hal_getcapability(_ah, HAL_CAP_PHYCOUNTERS, 0, NULL) == HAL_OK)
#define ath_hal_hasdiversity(_ah) \
@ -542,6 +568,14 @@ void ath_intr(void *);
#endif
#define ath_hal_hasfastframes(_ah) \
(ath_hal_getcapability(_ah, HAL_CAP_FASTFRAME, 0, NULL) == HAL_OK)
#define ath_hal_hasbssidmask(_ah) \
(ath_hal_getcapability(_ah, HAL_CAP_BSSIDMASK, 0, NULL) == HAL_OK)
#define ath_hal_hastsfadjust(_ah) \
(ath_hal_getcapability(_ah, HAL_CAP_TSF_ADJUST, 0, NULL) == HAL_OK)
#define ath_hal_gettsfadjust(_ah) \
(ath_hal_getcapability(_ah, HAL_CAP_TSF_ADJUST, 1, NULL) == HAL_OK)
#define ath_hal_settsfadjust(_ah, _onoff) \
ath_hal_setcapability(_ah, HAL_CAP_TSF_ADJUST, 1, _onoff, NULL)
#define ath_hal_hasrfsilent(_ah) \
(ath_hal_getcapability(_ah, HAL_CAP_RFSILENT, 0, NULL) == HAL_OK)
#define ath_hal_getrfkill(_ah) \

File diff suppressed because it is too large Load Diff

View File

@ -99,8 +99,15 @@ struct ndis_evt {
char *ne_buf;
};
struct ndis_vap {
struct ieee80211vap vap;
int (*newstate)(struct ieee80211vap *,
enum ieee80211_state, int);
};
#define NDIS_VAP(vap) ((struct ndis_vap *)(vap))
struct ndis_softc {
struct ieee80211com ic; /* interface info */
struct ifnet *ifp;
struct ifmedia ifmedia; /* media info */
u_long ndis_hwassist;

File diff suppressed because it is too large Load Diff

View File

@ -76,30 +76,40 @@ struct ipw_tx_radiotap_header {
((1 << IEEE80211_RADIOTAP_FLAGS) | \
(1 << IEEE80211_RADIOTAP_CHANNEL))
struct ipw_vap {
struct ieee80211vap vap;
struct task assoc_task;
struct task disassoc_task;
struct task assoc_success_task;
struct task assoc_failed_task;
struct task scandone_task;
int (*newstate)(struct ieee80211vap *,
enum ieee80211_state, int);
};
#define IPW_VAP(vap) ((struct ipw_vap *)(vap))
struct ipw_softc {
struct ifnet *sc_ifp;
struct ieee80211com sc_ic;
int (*sc_newstate)(struct ieee80211com *,
enum ieee80211_state, int);
device_t sc_dev;
struct mtx sc_mtx;
struct task sc_init_task;
struct task sc_scan_task;
struct task sc_chan_task;
struct task sc_assoc_task;
struct task sc_disassoc_task;
struct task sc_bmiss_task;
struct callout sc_wdtimer; /* watchdog timer */
uint32_t flags;
#define IPW_FLAG_FW_INITED (1 << 0)
#define IPW_FLAG_INIT_LOCKED (1 << 1)
#define IPW_FLAG_HAS_RADIO_SWITCH (1 << 2)
#define IPW_FLAG_HACK (1 << 3)
#define IPW_FLAG_SCANNING (1 << 4)
#define IPW_FLAG_ENABLED (1 << 5)
#define IPW_FLAG_BUSY (1 << 6)
#define IPW_FLAG_ASSOCIATED (1 << 7)
#define IPW_FLAG_FW_INITED 0x0001
#define IPW_FLAG_INIT_LOCKED 0x0002
#define IPW_FLAG_HAS_RADIO_SWITCH 0x0004
#define IPW_FLAG_HACK 0x0008
#define IPW_FLAG_SCANNING 0x0010
#define IPW_FLAG_ENABLED 0x0020
#define IPW_FLAG_BUSY 0x0040
#define IPW_FLAG_ASSOCIATING 0x0080
#define IPW_FLAG_ASSOCIATED 0x0100
int irq_rid;
int mem_rid;
@ -152,22 +162,10 @@ struct ipw_softc {
uint32_t rxcur;
int txfree;
int dwelltime;
struct bpf_if *sc_drvbpf;
union {
struct ipw_rx_radiotap_header th;
uint8_t pad[64];
} sc_rxtapu;
#define sc_rxtap sc_rxtapu.th
struct ipw_rx_radiotap_header sc_rxtap;
int sc_rxtap_len;
union {
struct ipw_tx_radiotap_header th;
uint8_t pad[64];
} sc_txtapu;
#define sc_txtap sc_txtapu.th
struct ipw_tx_radiotap_header sc_txtap;
int sc_txtap_len;
};

File diff suppressed because it is too large Load Diff

View File

@ -114,11 +114,19 @@ struct iwi_fw {
const char *name; /* associated image name */
};
struct iwi_vap {
struct ieee80211vap iwi_vap;
struct task iwi_authsuccess_task;
struct task iwi_assocsuccess_task;
struct task iwi_assocfailed_task;
int (*iwi_newstate)(struct ieee80211vap *,
enum ieee80211_state, int);
};
#define IWI_VAP(vap) ((struct iwi_vap *)(vap))
struct iwi_softc {
struct ifnet *sc_ifp;
struct ieee80211com sc_ic;
int (*sc_newstate)(struct ieee80211com *,
enum ieee80211_state, int);
void (*sc_node_free)(struct ieee80211_node *);
device_t sc_dev;
@ -129,9 +137,6 @@ struct iwi_softc {
struct unrhdr *sc_unr;
struct taskqueue *sc_tq; /* private task queue */
struct taskqueue *sc_tq2; /* reset task queue */
#if __FreeBSD_version < 700000
struct proc *sc_tqproc;
#endif
uint32_t flags;
#define IWI_FLAG_FW_INITED (1 << 0)
@ -208,39 +213,31 @@ struct iwi_softc {
u_int16_t sc_ledoff; /* off time for current blink */
struct callout sc_ledtimer; /* led off timer */
struct callout sc_wdtimer; /* watchdog timer */
struct callout sc_rftimer; /* rfkill timer */
int sc_tx_timer;
int sc_rfkill_timer;/* poll for rfkill change */
int sc_state_timer; /* firmware state timer */
int sc_busy_timer; /* firmware cmd timer */
#define IWI_SCAN_START (1 << 0)
#define IWI_SET_CHANNEL (1 << 1)
#define IWI_SCAN_END (1 << 2)
#define IWI_ASSOC (1 << 3)
#define IWI_DISASSOC (1 << 4)
#define IWI_SCAN_CURCHAN (1 << 5)
#define IWI_SCAN_ALLCHAN (1 << 6)
#define IWI_SET_WME (1 << 7)
#define IWI_CMD_MAXOPS 10
int sc_cmd[IWI_CMD_MAXOPS];
int sc_cmd_cur; /* current queued scan task */
int sc_cmd_next; /* last queued scan task */
unsigned long sc_maxdwell; /* max dwell time for curchan */
struct bpf_if *sc_drvbpf;
int sc_cmd[IWI_CMD_MAXOPS];
unsigned long sc_arg[IWI_CMD_MAXOPS];
int sc_cmd_cur; /* current queued scan task */
int sc_cmd_next; /* last queued scan task */
#define IWI_CMD_FREE 0 /* for marking slots unused */
#define IWI_SCAN_START 1
#define IWI_SET_CHANNEL 2
#define IWI_AUTH 3
#define IWI_ASSOC 4
#define IWI_DISASSOC 5
#define IWI_SCAN_CURCHAN 6
#define IWI_SCAN_ALLCHAN 7
#define IWI_SET_WME 8
union {
struct iwi_rx_radiotap_header th;
uint8_t pad[64];
} sc_rxtapu;
#define sc_rxtap sc_rxtapu.th
struct iwi_rx_radiotap_header sc_rxtap;
int sc_rxtap_len;
union {
struct iwi_tx_radiotap_header th;
uint8_t pad[64];
} sc_txtapu;
#define sc_txtap sc_txtapu.th
struct iwi_tx_radiotap_header sc_txtap;
int sc_txtap_len;
};
@ -249,15 +246,15 @@ struct iwi_softc {
("iwi firmware not idle")); \
_sc->fw_state = _state; \
_sc->sc_state_timer = 5; \
DPRINTF(("enter FW state %d\n", _state)); \
DPRINTF(("enter %s state\n", iwi_fw_states[_state])); \
} while (0)
#define IWI_STATE_END(_sc, _state) do { \
if (_sc->fw_state == _state) \
DPRINTF(("exit FW state %d\n", _state)); \
DPRINTF(("exit %s state\n", iwi_fw_states[_state])); \
else \
DPRINTF(("expected FW state %d, got %d\n", \
_state, _sc->fw_state)); \
DPRINTF(("expected %s state, got %s\n", \
iwi_fw_states[_state], iwi_fw_states[_sc->fw_state])); \
_sc->fw_state = IWI_FW_IDLE; \
wakeup(_sc); \
_sc->sc_state_timer = 0; \

View File

@ -34,6 +34,8 @@
__FBSDID("$FreeBSD$");
#endif
#include "opt_malo.h"
#include <sys/param.h>
#include <sys/endian.h>
#include <sys/kernel.h>
@ -123,6 +125,11 @@ enum {
MALLOC_DEFINE(M_MALODEV, "malodev", "malo driver dma buffers");
static struct ieee80211vap *malo_vap_create(struct ieee80211com *ic,
const char name[IFNAMSIZ], int unit, int opmode, int flags,
const uint8_t bssid[IEEE80211_ADDR_LEN],
const uint8_t mac[IEEE80211_ADDR_LEN]);
static void malo_vap_delete(struct ieee80211vap *);
static int malo_dma_setup(struct malo_softc *);
static int malo_setup_hwdma(struct malo_softc *);
static void malo_txq_init(struct malo_softc *, struct malo_txq *, int);
@ -131,13 +138,12 @@ static void malo_start(struct ifnet *);
static void malo_watchdog(struct ifnet *);
static int malo_ioctl(struct ifnet *, u_long, caddr_t);
static void malo_updateslot(struct ifnet *);
static int malo_newstate(struct ieee80211com *, enum ieee80211_state, int);
static int malo_newstate(struct ieee80211vap *, enum ieee80211_state, int);
static void malo_scan_start(struct ieee80211com *);
static void malo_scan_end(struct ieee80211com *);
static void malo_set_channel(struct ieee80211com *);
static int malo_raw_xmit(struct ieee80211_node *, struct mbuf *,
const struct ieee80211_bpf_params *);
static int malo_media_change(struct ifnet *);
static void malo_bpfattach(struct malo_softc *);
static void malo_sysctlattach(struct malo_softc *);
static void malo_announce(struct malo_softc *);
@ -163,7 +169,7 @@ malo_bar0_read4(struct malo_softc *sc, bus_size_t off)
static void
malo_bar0_write4(struct malo_softc *sc, bus_size_t off, uint32_t val)
{
DPRINTF(sc, MALO_DEBUG_FW, "%s: off 0x%x val 0x%x\n",
DPRINTF(sc, MALO_DEBUG_FW, "%s: off 0x%zx val 0x%x\n",
__func__, off, val);
bus_space_write_4(sc->malo_io0t, sc->malo_io0h, off, val);
@ -178,17 +184,18 @@ malo_bar1_read1(struct malo_softc *sc, bus_size_t off)
int
malo_attach(uint16_t devid, struct malo_softc *sc)
{
int error, i;
struct ieee80211com *ic = &sc->malo_ic;
int error;
struct ieee80211com *ic;
struct ifnet *ifp;
struct malo_hal *mh;
uint8_t bands;
ifp = sc->malo_ifp = if_alloc(IFT_ETHER);
ifp = sc->malo_ifp = if_alloc(IFT_IEEE80211);
if (ifp == NULL) {
device_printf(sc->malo_dev, "can not if_alloc()\n");
return ENOSPC;
}
ic = ifp->if_l2com;
MALO_LOCK_INIT(sc);
@ -215,6 +222,45 @@ malo_attach(uint16_t devid, struct malo_softc *sc)
}
sc->malo_mh = mh;
/*
* Load firmware so we can get setup. We arbitrarily pick station
* firmware; we'll re-load firmware as needed so setting up
* the wrong mode isn't a big deal.
*/
error = malo_hal_fwload(mh, "malo8335-h", "malo8335-m");
if (error != 0) {
if_printf(ifp, "unable to setup firmware\n");
goto bad1;
}
/* XXX gethwspecs() extracts correct informations? not maybe! */
error = malo_hal_gethwspecs(mh, &sc->malo_hwspecs);
if (error != 0) {
if_printf(ifp, "unable to fetch h/w specs\n");
goto bad1;
}
DPRINTF(sc, MALO_DEBUG_FW,
"malo_hal_gethwspecs: hwversion 0x%x hostif 0x%x"
"maxnum_wcb 0x%x maxnum_mcaddr 0x%x maxnum_tx_wcb 0x%x"
"regioncode 0x%x num_antenna 0x%x fw_releasenum 0x%x"
"wcbbase0 0x%x rxdesc_read 0x%x rxdesc_write 0x%x"
"ul_fw_awakecookie 0x%x w[4] = %x %x %x %x",
sc->malo_hwspecs.hwversion,
sc->malo_hwspecs.hostinterface, sc->malo_hwspecs.maxnum_wcb,
sc->malo_hwspecs.maxnum_mcaddr, sc->malo_hwspecs.maxnum_tx_wcb,
sc->malo_hwspecs.regioncode, sc->malo_hwspecs.num_antenna,
sc->malo_hwspecs.fw_releasenum, sc->malo_hwspecs.wcbbase0,
sc->malo_hwspecs.rxdesc_read, sc->malo_hwspecs.rxdesc_write,
sc->malo_hwspecs.ul_fw_awakecookie,
sc->malo_hwspecs.wcbbase[0], sc->malo_hwspecs.wcbbase[1],
sc->malo_hwspecs.wcbbase[2], sc->malo_hwspecs.wcbbase[3]);
/* NB: firmware looks that it does not export regdomain info API. */
bands = 0;
setbit(&bands, IEEE80211_MODE_11B);
setbit(&bands, IEEE80211_MODE_11G);
ieee80211_init_channels(ic, NULL, &bands);
sc->malo_txantenna = 0x2; /* h/w default */
sc->malo_rxantenna = 0xffff; /* h/w default */
@ -228,6 +274,9 @@ malo_attach(uint16_t devid, struct malo_softc *sc)
if_printf(ifp, "failed to setup descriptors: %d\n", error);
goto bad1;
}
error = malo_setup_hwdma(sc); /* push to firmware */
if (error != 0) /* NB: malo_setupdma prints msg */
goto bad1;
sc->malo_tq = taskqueue_create_fast("malo_taskq", M_NOWAIT,
taskqueue_thread_enqueue, &sc->malo_tq);
@ -247,12 +296,6 @@ malo_attach(uint16_t devid, struct malo_softc *sc)
ifp->if_snd.ifq_drv_maxlen = IFQ_MAXLEN;
IFQ_SET_READY(&ifp->if_snd);
/* NB: firmware looks that it does not export regdomain info API. */
bands = 0;
setbit(&bands, IEEE80211_MODE_11B);
setbit(&bands, IEEE80211_MODE_11G);
ieee80211_init_channels(ic, 0, CTRY_DEFAULT, bands, 0, 1);
ic->ic_ifp = ifp;
/* XXX not right but it's not used anywhere important */
ic->ic_phytype = IEEE80211_T_OFDM;
@ -273,24 +316,23 @@ malo_attach(uint16_t devid, struct malo_softc *sc)
* packets so we can add it efficiently.
*/
ic->ic_headroom = sizeof(struct malo_txrec) -
sizeof(struct ieee80211_frame);
sizeof(struct ieee80211_frame);
/* get mac address from hardware */
IEEE80211_ADDR_COPY(ic->ic_myaddr, sc->malo_hwspecs.macaddr);
/* call MI attach routine. */
ieee80211_ifattach(ic);
/* override default methods */
ic->ic_updateslot = malo_updateslot;
ic->ic_vap_create = malo_vap_create;
ic->ic_vap_delete = malo_vap_delete;
ic->ic_raw_xmit = malo_raw_xmit;
sc->malo_newstate = ic->ic_newstate;
ic->ic_newstate = malo_newstate;
ic->ic_updateslot = malo_updateslot;
ic->ic_scan_start = malo_scan_start;
ic->ic_scan_end = malo_scan_end;
ic->ic_set_channel = malo_set_channel;
/* complete initialization */
ieee80211_media_init(ic, malo_media_change, ieee80211_media_status);
sc->malo_invalid = 0; /* ready to go, enable int handling */
malo_bpfattach(sc);
@ -302,6 +344,7 @@ malo_attach(uint16_t devid, struct malo_softc *sc)
if (bootverbose)
ieee80211_announce(ic);
malo_announce(sc);
return 0;
bad1:
@ -313,6 +356,61 @@ malo_attach(uint16_t devid, struct malo_softc *sc)
return error;
}
static struct ieee80211vap *
malo_vap_create(struct ieee80211com *ic,
const char name[IFNAMSIZ], int unit, int opmode, int flags,
const uint8_t bssid[IEEE80211_ADDR_LEN],
const uint8_t mac[IEEE80211_ADDR_LEN])
{
struct ifnet *ifp = ic->ic_ifp;
struct malo_vap *mvp;
struct ieee80211vap *vap;
if (!TAILQ_EMPTY(&ic->ic_vaps)) {
if_printf(ifp, "multiple vaps not supported\n");
return NULL;
}
switch (opmode) {
case IEEE80211_M_STA:
if (opmode == IEEE80211_M_STA)
flags |= IEEE80211_CLONE_NOBEACONS;
/* fall thru... */
case IEEE80211_M_MONITOR:
break;
default:
if_printf(ifp, "%s mode not supported\n",
ieee80211_opmode_name[opmode]);
return NULL; /* unsupported */
}
mvp = (struct malo_vap *) malloc(sizeof(struct malo_vap),
M_80211_VAP, M_NOWAIT | M_ZERO);
if (mvp == NULL) {
if_printf(ifp, "cannot allocate vap state block\n");
return NULL;
}
vap = &mvp->malo_vap;
ieee80211_vap_setup(ic, vap, name, unit, opmode, flags, bssid, mac);
/* override state transition machine */
mvp->malo_newstate = vap->iv_newstate;
vap->iv_newstate = malo_newstate;
/* complete setup */
ieee80211_vap_attach(vap,
ieee80211_media_change, ieee80211_media_status);
ic->ic_opmode = opmode;
return vap;
}
static void
malo_vap_delete(struct ieee80211vap *vap)
{
struct malo_vap *mvp = MALO_VAP(vap);
ieee80211_vap_detach(vap);
free(mvp, M_80211_VAP);
}
int
malo_intr(void *arg)
{
@ -353,14 +451,12 @@ malo_intr(void *arg)
/* TKIP ICV error */
sc->malo_stats.mst_rx_badtkipicv++;
}
#ifdef MALO_DEBUG
if (((status | sc->malo_imask) ^ sc->malo_imask) != 0)
DPRINTF(sc, MALO_DEBUG_INTR,
"%s: can't handle interrupt status 0x%x\n",
__func__, status);
#endif
return (FILTER_HANDLED);
}
@ -1009,8 +1105,8 @@ malo_tx_start(struct malo_softc *sc, struct ieee80211_node *ni,
int error, ismcast, iswep;
int copyhdrlen, hdrlen, pktlen;
struct ieee80211_frame *wh;
struct ieee80211com *ic = &sc->malo_ic;
struct ifnet *ifp = sc->malo_ifp;
struct ieee80211com *ic = ifp->if_l2com;
struct malo_txdesc *ds;
struct malo_txrec *tr;
struct malo_txq *txq;
@ -1045,7 +1141,7 @@ malo_tx_start(struct malo_softc *sc, struct ieee80211_node *ni,
* ExtIV filled in for CCMP and this also adjusts
* the headers which simplifies our work below.
*/
k = ieee80211_crypto_encap(ic, ni, m0);
k = ieee80211_crypto_encap(ni, m0);
if (k == NULL) {
/*
* This can happen when the key is yanked after the
@ -1068,15 +1164,14 @@ malo_tx_start(struct malo_softc *sc, struct ieee80211_node *ni,
wh = mtod(m0, struct ieee80211_frame *);
}
if (bpf_peers_present(sc->malo_drvbpf)) {
if (bpf_peers_present(ifp->if_bpf)) {
sc->malo_tx_th.wt_flags = 0; /* XXX */
if (iswep)
sc->malo_tx_th.wt_flags |= IEEE80211_RADIOTAP_F_WEP;
sc->malo_tx_th.wt_txpower = ni->ni_txpower;
sc->malo_tx_th.wt_antenna = sc->malo_txantenna;
bpf_mtap2(sc->malo_drvbpf,
&sc->malo_tx_th, sc->malo_tx_th_len, m0);
bpf_mtap2(ifp->if_bpf, &sc->malo_tx_th, sc->malo_tx_th_len, m0);
}
/*
@ -1186,137 +1281,40 @@ malo_tx_start(struct malo_softc *sc, struct ieee80211_node *ni,
static void
malo_start(struct ifnet *ifp)
{
int nqueued = 0;
struct ether_header *eh;
struct malo_softc *sc = ifp->if_softc;
struct ieee80211_frame *wh;
struct ieee80211_node *ni;
struct ieee80211com *ic = &sc->malo_ic;
struct malo_txq *txq = &sc->malo_txq[0];
struct malo_txbuf *bf = NULL;
struct malo_txq *txq = NULL;
struct mbuf *m;
int nqueued = 0;
if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0 || sc->malo_invalid)
return;
for (;;) {
/*
* Poll the management queue for frames; they
* have priority over normal data frames.
*/
IF_DEQUEUE(&ic->ic_mgtq, m);
if (m == NULL) {
/*
* No data frames go out unless we're associated.
*/
if (ic->ic_state != IEEE80211_S_RUN) {
DPRINTF(sc, MALO_DEBUG_XMIT,
"%s: discard data packet, state %s\n",
__func__,
ieee80211_state_name[ic->ic_state]);
sc->malo_stats.mst_tx_discard++;
break;
}
IFQ_DRV_DEQUEUE(&ifp->if_snd, m);
if (m == NULL)
break;
/*
* Cancel any background scan.
*/
if (ic->ic_flags & IEEE80211_F_SCAN)
ieee80211_cancel_scan(ic);
IFQ_DRV_DEQUEUE(&ifp->if_snd, m);
if (m == NULL)
break;
ni = (struct ieee80211_node *) m->m_pkthdr.rcvif;
bf = malo_getbuf(sc, txq);
if (bf == NULL) {
IFQ_DRV_PREPEND(&ifp->if_snd, m);
/*
* Find the node for the destination so we can do
* things like power save and fast frames aggregation.
*/
if (m->m_len < sizeof(struct ether_header) &&
(m = m_pullup(m, sizeof(struct ether_header))) ==
NULL) {
ic->ic_stats.is_tx_nobuf++; /* XXX */
ni = NULL;
goto bad;
}
eh = mtod(m, struct ether_header *);
ni = ieee80211_find_txnode(ic, eh->ether_dhost);
if (ni == NULL) {
/* NB: ieee80211_find_txnode does stat+msg */
m_freem(m);
goto bad;
}
/* calculate priority so we can find the tx queue */
if (ieee80211_classify(ic, m, ni)) {
DPRINTF(sc, MALO_DEBUG_XMIT,
"%s: discard, classification failure\n",
__func__);
m_freem(m);
goto bad;
}
txq = &sc->malo_txq[0];
bf = malo_getbuf(sc, txq);
if (bf == NULL) {
IFQ_DRV_PREPEND(&ifp->if_snd, m);
ieee80211_free_node(ni);
/* XXX blocks other traffic */
ifp->if_drv_flags |= IFF_DRV_OACTIVE;
sc->malo_stats.mst_tx_qstop++;
break;
}
ifp->if_opackets++;
if (bpf_peers_present(ifp->if_bpf))
bpf_mtap(ifp->if_bpf, m);
/*
* Encapsulate the packet in prep for transmission.
*/
m = ieee80211_encap(ic, m, ni);
if (m == NULL) {
DPRINTF(sc, MALO_DEBUG_XMIT,
"%s: encapsulation failure\n", __func__);
sc->malo_stats.mst_tx_encap++;
goto bad;
}
} else {
/*
* Grab a TX buffer and associated resources.
* Note that we depend on the classification
* by the 802.11 layer to get to the right h/w
* queue. Management frames must ALWAYS go on
* queue 1 but we cannot just force that here
* because we may receive non-mgt frames through
* the ic_mgtq (e.g. null data frames).
*/
txq = &sc->malo_txq[0];
bf = malo_getbuf(sc, txq);
if (bf == NULL) {
IF_PREPEND(&ic->ic_mgtq, m);
/* XXX stat */
break;
}
/*
* Hack! The referenced node pointer is in the
* rcvif field of the packet header. This is
* placed there by ieee80211_mgmt_output because
* we need to hold the reference with the frame
* and there's no other way (other than packet
* tags which we consider too expensive to use)
* to pass it along.
*/
ni = (struct ieee80211_node *) m->m_pkthdr.rcvif;
m->m_pkthdr.rcvif = NULL;
wh = mtod(m, struct ieee80211_frame *);
sc->malo_stats.mst_tx_mgmt++;
if (bpf_peers_present(ic->ic_rawbpf))
bpf_mtap(ic->ic_rawbpf, m);
/* XXX blocks other traffic */
ifp->if_drv_flags |= IFF_DRV_OACTIVE;
sc->malo_stats.mst_tx_qstop++;
break;
}
/*
* Encapsulate the packet in prep for transmission.
*/
m = ieee80211_encap(ni, m);
if (m == NULL) {
DPRINTF(sc, MALO_DEBUG_XMIT,
"%s: encapsulation failure\n", __func__);
sc->malo_stats.mst_tx_encap++;
goto bad;
}
/*
* Pass the frame to the h/w for transmission.
*/
@ -1382,7 +1380,8 @@ static int
malo_hal_reset(struct malo_softc *sc)
{
static int first = 0;
struct ieee80211com *ic = &sc->malo_ic;
struct ifnet *ifp = sc->malo_ifp;
struct ieee80211com *ic = ifp->if_l2com;
struct malo_hal *mh = sc->malo_mh;
if (first == 0) {
@ -1511,10 +1510,8 @@ malo_startrecv(struct malo_softc *sc)
}
static void
malo_init(void *arg)
malo_init_locked(struct malo_softc *sc)
{
struct malo_softc *sc = (struct malo_softc *) arg;
struct ieee80211com *ic = &sc->malo_ic;
struct ifnet *ifp = sc->malo_ifp;
struct malo_hal *mh = sc->malo_mh;
int error;
@ -1522,56 +1519,7 @@ malo_init(void *arg)
DPRINTF(sc, MALO_DEBUG_ANY, "%s: if_flags 0x%x\n",
__func__, ifp->if_flags);
if (!sc->malo_fw_loaded) {
/*
* Load firmware so we can get setup.
*/
error = malo_hal_fwload(mh, "malo8335-h", "malo8335-m");
if (error != 0) {
if_printf(ifp, "unable to setup firmware\n");
return;
}
/* XXX gethwspecs() extracts correct informations? not maybe! */
error = malo_hal_gethwspecs(mh, &sc->malo_hwspecs);
if (error != 0) {
if_printf(ifp, "unable to fetch h/w specs\n");
return;
}
DPRINTF(sc, MALO_DEBUG_FW,
"malo_hal_gethwspecs: hwversion 0x%x hostif 0x%x"
"maxnum_wcb 0x%x maxnum_mcaddr 0x%x maxnum_tx_wcb 0x%x"
"regioncode 0x%x num_antenna 0x%x fw_releasenum 0x%x"
"wcbbase0 0x%x rxdesc_read 0x%x rxdesc_write 0x%x"
"ul_fw_awakecookie 0x%x w[4] = %x %x %x %x",
sc->malo_hwspecs.hwversion,
sc->malo_hwspecs.hostinterface, sc->malo_hwspecs.maxnum_wcb,
sc->malo_hwspecs.maxnum_mcaddr,
sc->malo_hwspecs.maxnum_tx_wcb,
sc->malo_hwspecs.regioncode, sc->malo_hwspecs.num_antenna,
sc->malo_hwspecs.fw_releasenum, sc->malo_hwspecs.wcbbase0,
sc->malo_hwspecs.rxdesc_read, sc->malo_hwspecs.rxdesc_write,
sc->malo_hwspecs.ul_fw_awakecookie,
sc->malo_hwspecs.wcbbase[0], sc->malo_hwspecs.wcbbase[1],
sc->malo_hwspecs.wcbbase[2], sc->malo_hwspecs.wcbbase[3]);
error = malo_setup_hwdma(sc); /* push to firmware */
/* NB: malo_setupdma prints msg */
if (error != 0) {
if_printf(ifp, "%s: failed to set up h/w dma\n",
__func__);
return;
}
/* set reddomain. */
ic->ic_regdomain = sc->malo_hwspecs.regioncode;
malo_announce(sc);
sc->malo_fw_loaded = 1;
}
MALO_LOCK(sc);
MALO_LOCK_ASSERT(sc);
/*
* Stop anything previously setup. This is safe whether this is
@ -1584,7 +1532,7 @@ malo_init(void *arg)
*/
if (!malo_hal_reset(sc)) {
if_printf(ifp, "%s: unable to reset hardware\n", __func__);
goto done;
return;
}
/*
@ -1594,7 +1542,7 @@ malo_init(void *arg)
if (error != 0) {
if_printf(ifp, "%s: unable to start recv logic, error %d\n",
__func__, error);
goto done;
return;
}
/*
@ -1610,30 +1558,26 @@ malo_init(void *arg)
| MALO_A2HRIC_BIT_CHAN_SWITCH;
ifp->if_drv_flags |= IFF_DRV_RUNNING;
ic->ic_state = IEEE80211_S_INIT;
IEEE80211_ADDR_COPY(ic->ic_myaddr, IF_LLADDR(ifp));
malo_hal_intrset(mh, sc->malo_imask);
}
/*
* The hardware should be ready to go now so it's safe to kick
* the 802.11 state machine as it's likely to immediately call back
* to us to send mgmt frames.
*/
if (ic->ic_opmode != IEEE80211_M_MONITOR) {
if (ic->ic_roaming != IEEE80211_ROAMING_MANUAL)
ieee80211_new_state(ic, IEEE80211_S_SCAN, -1);
} else
ieee80211_new_state(ic, IEEE80211_S_RUN, -1);
static void
malo_init(void *arg)
{
struct malo_softc *sc = (struct malo_softc *) arg;
struct ifnet *ifp = sc->malo_ifp;
struct ieee80211com *ic = ifp->if_l2com;
DPRINTF(sc, MALO_DEBUG_ANY, "%s: if_flags 0x%x\n",
__func__, ifp->if_flags);
done:
if (error != 0)
if_printf(ifp,
"error(%d) occurred during the initializing.\n", error);
MALO_LOCK(sc);
malo_init_locked(sc);
MALO_UNLOCK(sc);
return;
if (ifp->if_drv_flags & IFF_DRV_RUNNING)
ieee80211_start_all(ic); /* start all vap's */
}
/*
@ -1642,9 +1586,9 @@ malo_init(void *arg)
static void
malo_setmcastfilter(struct malo_softc *sc)
{
struct ieee80211com *ic = &sc->malo_ic;
struct ifmultiaddr *ifma;
struct ifnet *ifp = sc->malo_ifp;
struct ieee80211com *ic = ifp->if_l2com;
struct ifmultiaddr *ifma;
uint8_t macs[IEEE80211_ADDR_LEN * MALO_HAL_MCAST_MAX];
uint8_t *mp;
int nmc;
@ -1686,8 +1630,8 @@ malo_setmcastfilter(struct malo_softc *sc)
static int
malo_mode_init(struct malo_softc *sc)
{
struct ieee80211com *ic = &sc->malo_ic;
struct ifnet *ifp = ic->ic_ifp;
struct ifnet *ifp = sc->malo_ifp;
struct ieee80211com *ic = ifp->if_l2com;
struct malo_hal *mh = sc->malo_mh;
/*
@ -1733,11 +1677,12 @@ malo_tx_draintxq(struct malo_softc *sc, struct malo_txq *txq)
MALO_TXQ_UNLOCK(txq);
#ifdef MALO_DEBUG
if (sc->malo_debug & MALO_DEBUG_RESET) {
struct ifnet *ifp = sc->malo_ifp;
struct ieee80211com *ic = ifp->if_l2com;
const struct malo_txrec *tr =
mtod(bf->bf_m, const struct malo_txrec *);
malo_printtxbuf(bf, txq->qnum, ix);
ieee80211_dump_pkt(&sc->malo_ic,
(const uint8_t *)&tr->wh,
ieee80211_dump_pkt(ic, (const uint8_t *)&tr->wh,
bf->bf_m->m_len - sizeof(tr->fwlen), 0, -1);
}
#endif /* MALO_DEBUG */
@ -1763,10 +1708,9 @@ malo_tx_draintxq(struct malo_softc *sc, struct malo_txq *txq)
static void
malo_stop_locked(struct ifnet *ifp, int disable)
{
int i;
struct malo_softc *sc = ifp->if_softc;
struct ieee80211com *ic = &sc->malo_ic;
struct malo_hal *mh = sc->malo_mh;
int i;
DPRINTF(sc, MALO_DEBUG_ANY, "%s: invalid %u if_flags 0x%x\n",
__func__, sc->malo_invalid, ifp->if_flags);
@ -1778,28 +1722,19 @@ malo_stop_locked(struct ifnet *ifp, int disable)
/*
* Shutdown the hardware and driver:
* reset 802.11 state machine
* turn off timers
* disable interrupts
* turn off the radio
* clear transmit machinery
* clear receive machinery
* drain and release tx queues
* reclaim beacon resources
* power down hardware
*
* Note that some of this work is not possible if the hardware
* is gone (invalid).
*/
ieee80211_new_state(ic, IEEE80211_S_INIT, -1);
ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
ifp->if_timer = 0;
if (sc->malo_fw_loaded == 1) {
/* diable interrupt. */
malo_hal_intrset(mh, 0);
/* turn off the radio. */
malo_hal_setradio(mh, 0, MHP_AUTO_PREAMBLE);
}
/* diable interrupt. */
malo_hal_intrset(mh, 0);
/* turn off the radio. */
malo_hal_setradio(mh, 0, MHP_AUTO_PREAMBLE);
/* drain and release tx queues. */
for (i = 0; i < MALO_NUM_TX_QUEUES; i++)
@ -1812,11 +1747,11 @@ malo_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
#define MALO_IS_RUNNING(ifp) \
((ifp->if_flags & IFF_UP) && (ifp->if_drv_flags & IFF_DRV_RUNNING))
struct malo_softc *sc = ifp->if_softc;
struct ieee80211com *ic = &sc->malo_ic;
int error = 0;
struct ieee80211com *ic = ifp->if_l2com;
struct ifreq *ifr = (struct ifreq *) data;
int error = 0, startall = 0;
MALO_LOCK(sc);
switch (cmd) {
case SIOCSIFFLAGS:
if (MALO_IS_RUNNING(ifp)) {
@ -1836,38 +1771,25 @@ malo_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
* torn down much of our state. There's
* probably a better way to deal with this.
*/
if (!sc->malo_invalid)
malo_init(sc);
if (!sc->malo_invalid) {
malo_init_locked(sc);
startall = 1;
}
} else
malo_stop_locked(ifp, 1);
break;
case SIOCADDMULTI:
case SIOCDELMULTI:
/*
* The upper layer has already installed/removed
* the multicast address(es), just recalculate the
* multicast filter for the card.
*/
if (ifp->if_drv_flags & IFF_DRV_RUNNING)
malo_mode_init(sc);
case SIOCGIFMEDIA:
case SIOCSIFMEDIA:
error = ifmedia_ioctl(ifp, ifr, &ic->ic_media, cmd);
break;
default:
error = ieee80211_ioctl(ic, cmd, data);
if (error == ENETRESET) {
if (MALO_IS_RUNNING(ifp) &&
ic->ic_roaming != IEEE80211_ROAMING_MANUAL)
malo_init(sc);
error = 0;
}
if (error == ERESTART) {
/* XXX we need to reset the device here. */
error = 0;
}
error = ether_ioctl(ifp, cmd, data);
break;
}
MALO_UNLOCK(sc);
if (startall)
ieee80211_start_all(ic);
return error;
#undef MALO_IS_RUNNING
}
@ -1882,7 +1804,7 @@ static void
malo_updateslot(struct ifnet *ifp)
{
struct malo_softc *sc = ifp->if_softc;
struct ieee80211com *ic = &sc->malo_ic;
struct ieee80211com *ic = ifp->if_l2com;
struct malo_hal *mh = sc->malo_mh;
int error;
@ -1906,72 +1828,46 @@ malo_updateslot(struct ifnet *ifp)
}
static int
malo_newstate(struct ieee80211com *ic, enum ieee80211_state nstate, int arg)
malo_newstate(struct ieee80211vap *vap, enum ieee80211_state nstate, int arg)
{
struct ieee80211_node *ni = ic->ic_bss;
struct ifnet *ifp = ic->ic_ifp;
struct malo_softc *sc = ifp->if_softc;
struct ieee80211com *ic = vap->iv_ic;
struct malo_softc *sc = ic->ic_ifp->if_softc;
struct malo_hal *mh = sc->malo_mh;
int error;
DPRINTF(sc, MALO_DEBUG_STATE, "%s: %s -> %s\n", __func__,
ieee80211_state_name[ic->ic_state],
ieee80211_state_name[vap->iv_state],
ieee80211_state_name[nstate]);
/*
* Carry out firmware actions per-state.
* Invoke the net80211 layer first so iv_bss is setup.
*/
switch (nstate) {
case IEEE80211_S_INIT:
case IEEE80211_S_SCAN:
case IEEE80211_S_AUTH:
/* NB: do nothing. */
break;
case IEEE80211_S_ASSOC:
error = MALO_VAP(vap)->malo_newstate(vap, nstate, arg);
if (error != 0)
return error;
if (nstate == IEEE80211_S_RUN && vap->iv_state != IEEE80211_S_RUN) {
struct ieee80211_node *ni = vap->iv_bss;
enum ieee80211_phymode mode = ieee80211_chan2mode(ni->ni_chan);
const struct ieee80211_txparam *tp = &vap->iv_txparms[mode];
DPRINTF(sc, MALO_DEBUG_STATE,
"%s: %s(RUN): iv_flags 0x%08x bintvl %d bssid %s "
"capinfo 0x%04x chan %d associd 0x%x mode %d rate %d\n",
vap->iv_ifp->if_xname, __func__, vap->iv_flags,
ni->ni_intval, ether_sprintf(ni->ni_bssid), ni->ni_capinfo,
ieee80211_chan2ieee(ic, ic->ic_curchan),
ni->ni_associd, mode, tp->ucastrate);
malo_hal_setradio(mh, 1,
(ic->ic_flags & IEEE80211_F_SHPREAMBLE) ?
MHP_SHORT_PREAMBLE : MHP_LONG_PREAMBLE);
break;
case IEEE80211_S_RUN:
DPRINTF(sc, MALO_DEBUG_STATE,
"%s: %s(RUN): ic_flags 0x%08x bintvl %d bssid %s "
"capinfo 0x%04x chan %d\n",
ifp->if_xname, __func__, ic->ic_flags,
ni->ni_intval, ether_sprintf(ni->ni_bssid), ni->ni_capinfo,
ieee80211_chan2ieee(ic, ic->ic_curchan));
switch (ic->ic_opmode) {
case IEEE80211_M_STA:
DPRINTF(sc, MALO_DEBUG_STATE, "%s: %s: aid 0x%x\n",
ic->ic_ifp->if_xname, __func__, ni->ni_associd);
malo_hal_setassocid(sc->malo_mh,
ni->ni_bssid, ni->ni_associd);
if (ic->ic_fixed_rate == IEEE80211_FIXED_RATE_NONE)
/* automatic rate adaption */
malo_hal_set_rate(mh, ic->ic_curmode, 0);
else
/* fixed rate */
malo_hal_set_rate(mh, ic->ic_curmode,
malo_fix2rate(ic->ic_fixed_rate));
break;
default:
break;
}
break;
default:
if_printf(ifp, "%s: can't handle state %s -> %s\n",
__func__, ieee80211_state_name[ic->ic_state],
ieee80211_state_name[nstate]);
MHP_SHORT_PREAMBLE : MHP_LONG_PREAMBLE);
malo_hal_setassocid(sc->malo_mh, ni->ni_bssid, ni->ni_associd);
malo_hal_set_rate(mh, mode,
tp->ucastrate == IEEE80211_FIXED_RATE_NONE ?
0 : malo_fix2rate(tp->ucastrate));
}
/*
* Invoke the parent method to complete the work.
*/
error = sc->malo_newstate(ic, nstate, arg);
return error;
return 0;
}
static int
@ -2038,33 +1934,13 @@ malo_raw_xmit(struct ieee80211_node *ni, struct mbuf *m,
return 0;
}
static int
malo_media_change(struct ifnet *ifp)
{
#define IS_UP(ifp) \
((ifp->if_flags & IFF_UP) && (ifp->if_drv_flags & IFF_DRV_RUNNING))
int error;
error = ieee80211_media_change(ifp);
if (error == ENETRESET) {
struct malo_softc *sc = ifp->if_softc;
if (IS_UP(ifp))
malo_init(sc);
error = 0;
}
return error;
#undef IS_UP
}
static void
malo_bpfattach(struct malo_softc *sc)
{
struct ifnet *ifp = sc->malo_ifp;
bpfattach2(ifp, DLT_IEEE802_11_RADIO,
sizeof(struct ieee80211_frame) + sizeof(sc->malo_tx_th),
&sc->malo_drvbpf);
bpfattach(ifp, DLT_IEEE802_11_RADIO,
sizeof(struct ieee80211_frame) + sizeof(sc->malo_tx_th));
/*
* Initialize constant fields.
@ -2206,9 +2082,9 @@ malo_rx_proc(void *arg, int npending)
((((const struct ieee80211_frame *)wh)->i_fc[1] & \
IEEE80211_FC1_DIR_MASK) == IEEE80211_FC1_DIR_DSTODS)
struct malo_softc *sc = arg;
struct malo_rxbuf *bf;
struct ieee80211com *ic = &sc->malo_ic;
struct ifnet *ifp = sc->malo_ifp;
struct ieee80211com *ic = ifp->if_l2com;
struct malo_rxbuf *bf;
struct malo_rxdesc *ds;
struct mbuf *m, *mnew;
struct ieee80211_qosframe *wh;
@ -2232,8 +2108,7 @@ malo_rx_proc(void *arg, int npending)
return;
bf = sc->malo_rxnext;
for (ntodo = malo_rxquota; ntodo > 0 && (readptr != writeptr);
ntodo--) {
for (ntodo = malo_rxquota; ntodo > 0 && readptr != writeptr; ntodo--) {
if (bf == NULL) {
bf = STAILQ_FIRST(&sc->malo_rxbuf);
break;
@ -2281,12 +2156,12 @@ malo_rx_proc(void *arg, int npending)
* payload prior to constructing the header.
*/
m = bf->bf_m;
data = mtod(m, uint8_t *);
data = mtod(m, uint8_t *);;
hdrlen = ieee80211_anyhdrsize(data + sizeof(uint16_t));
off = sizeof(uint16_t) + sizeof(struct ieee80211_frame_addr4);
/*
* Calculate RSSI. XXX wrong
* Calculate RSSI. XXX wrong
*/
rssi = 2 * ((int) ds->snr - ds->nf); /* NB: .5 dBm */
if (rssi > 100)
@ -2307,7 +2182,6 @@ malo_rx_proc(void *arg, int npending)
ifp->if_ierrors++;
goto rx_next;
}
/*
* Attach the dma buffer to the mbuf; malo_rxbuf_init will
* re-setup the rx descriptor using the replacement dma
@ -2340,8 +2214,8 @@ malo_rx_proc(void *arg, int npending)
sc->malo_rx_th.wr_antsignal = rssi;
sc->malo_rx_th.wr_antnoise = ds->nf;
bpf_mtap2(sc->malo_drvbpf,
&sc->malo_rx_th, sc->malo_rx_th_len, m);
bpf_mtap2(ifp->if_bpf, &sc->malo_rx_th,
sc->malo_rx_th_len, m);
}
#ifdef MALO_DEBUG
if (IFF_DUMPPKTS_RECV(sc, wh)) {
@ -2353,10 +2227,12 @@ malo_rx_proc(void *arg, int npending)
/* dispatch */
ni = ieee80211_find_rxnode(ic,
(const struct ieee80211_frame_min *) wh);
(void) ieee80211_input(ic, m, ni, rssi, ds->nf, 0/*XXX*/);
ieee80211_free_node(ni);
(struct ieee80211_frame_min *)wh);
if (ni != NULL) {
(void) ieee80211_input(ni, m, rssi, ds->nf, 0);
ieee80211_free_node(ni);
} else
(void) ieee80211_input_all(ic, m, rssi, ds->nf, 0);
rx_next:
/* NB: ignore ENOMEM so we process more descriptors */
(void) malo_rxbuf_init(sc, bf);
@ -2378,9 +2254,7 @@ malo_stop(struct ifnet *ifp, int disable)
struct malo_softc *sc = ifp->if_softc;
MALO_LOCK(sc);
malo_stop_locked(ifp, disable);
MALO_UNLOCK(sc);
}
@ -2400,6 +2274,7 @@ int
malo_detach(struct malo_softc *sc)
{
struct ifnet *ifp = sc->malo_ifp;
struct ieee80211com *ic = ifp->if_l2com;
DPRINTF(sc, MALO_DEBUG_ANY, "%s: if_flags %x\n",
__func__, ifp->if_flags);
@ -2427,7 +2302,7 @@ malo_detach(struct malo_softc *sc)
* it last
* Other than that, it's straightforward...
*/
ieee80211_ifdetach(&sc->malo_ic);
ieee80211_ifdetach(ic);
malo_dma_cleanup(sc);
malo_tx_cleanup(sc);
malo_hal_detach(sc->malo_mh);
@ -2441,7 +2316,6 @@ malo_detach(struct malo_softc *sc)
void
malo_shutdown(struct malo_softc *sc)
{
malo_stop(sc->malo_ifp, 1);
}
@ -2464,9 +2338,6 @@ malo_resume(struct malo_softc *sc)
DPRINTF(sc, MALO_DEBUG_ANY, "%s: if_flags %x\n",
__func__, ifp->if_flags);
if (ifp->if_flags & IFF_UP) {
if (ifp->if_flags & IFF_UP)
malo_init(sc);
if (ifp->if_drv_flags & IFF_DRV_RUNNING)
malo_start(ifp);
}
}

View File

@ -512,8 +512,14 @@ struct malo_txrec {
struct ieee80211_frame_addr4 wh;
} __packed;
struct malo_vap {
struct ieee80211vap malo_vap;
int (*malo_newstate)(struct ieee80211vap *,
enum ieee80211_state, int);
};
#define MALO_VAP(vap) ((struct malo_vap *)(vap))
struct malo_softc {
struct ieee80211com malo_ic; /* IEEE 802.11 common */
device_t malo_dev;
struct ifnet *malo_ifp; /* interface common */
struct mtx malo_mtx; /* master lock (recursive) */
@ -527,8 +533,7 @@ struct malo_softc {
unsigned int malo_invalid : 1,/* disable hardware accesses */
malo_recvsetup : 1, /* recv setup */
malo_fixedrate : 1, /* use fixed tx rate */
malo_fw_loaded : 1; /* fw loaded */
malo_fixedrate: 1; /* use fixed tx rate */
struct malo_hal *malo_mh; /* h/w access layer */
struct malo_hal_hwspec malo_hwspecs; /* h/w capabilities */
@ -546,9 +551,6 @@ struct malo_softc {
struct malo_txq malo_txq[MALO_NUM_TX_QUEUES];
struct task malo_txtask; /* tx int processing */
int (*malo_newstate)(struct ieee80211com *,
enum ieee80211_state, int);
struct bpf_if *malo_drvbpf;
struct malo_tx_radiotap_header malo_tx_th;
int malo_tx_th_len;

View File

@ -50,16 +50,18 @@ __FBSDID("$FreeBSD$");
#include <net80211/ieee80211_var.h>
#include <net80211/ieee80211_radiotap.h>
#include <net80211/ieee80211_amrr.h>
#include <dev/pci/pcireg.h>
#include <dev/pci/pcivar.h>
#include <dev/ral/if_ralrate.h>
#include <dev/ral/rt2560var.h>
#include <dev/ral/rt2661var.h>
MODULE_DEPEND(ral, pci, 1, 1, 1);
MODULE_DEPEND(ral, firmware, 1, 1, 1);
MODULE_DEPEND(ral, wlan, 1, 1, 1);
MODULE_DEPEND(ral, wlan_amrr, 1, 1, 1);
struct ral_pci_ident {
uint16_t vendor;

View File

@ -1,192 +0,0 @@
/* $FreeBSD$ */
/* $NetBSD: ieee80211_rssadapt.c,v 1.9 2005/02/26 22:45:09 perry Exp $ */
/*-
* Copyright (c) 2003, 2004 David Young. 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.
* 3. The name of David Young may not be used to endorse or promote
* products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY David Young ``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 David
* Young 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.
*/
#include <sys/param.h>
#include <sys/sockio.h>
#include <sys/mbuf.h>
#include <sys/kernel.h>
#include <sys/socket.h>
#include <net/if.h>
#include <net/if_arp.h>
#include <net/ethernet.h>
#include <net/if_dl.h>
#include <net/if_media.h>
#include <net/if_types.h>
#include <net80211/ieee80211_var.h>
#include <dev/ral/if_ralrate.h>
#ifdef interpolate
#undef interpolate
#endif
#define interpolate(parm, old, new) ((parm##_old * (old) + \
(parm##_denom - parm##_old) * (new)) / \
parm##_denom)
static struct ral_rssadapt_expavgctl master_expavgctl = {
rc_decay_denom : 16,
rc_decay_old : 15,
rc_thresh_denom : 8,
rc_thresh_old : 4,
rc_avgrssi_denom : 8,
rc_avgrssi_old : 4
};
int
ral_rssadapt_choose(struct ral_rssadapt *ra, struct ieee80211_rateset *rs,
struct ieee80211_frame *wh, u_int len, const char *dvname, int do_not_adapt)
{
u_int16_t (*thrs)[IEEE80211_RATE_SIZE];
int flags = 0, i, rateidx = 0, thridx, top;
if ((wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) == IEEE80211_FC0_TYPE_CTL)
flags |= IEEE80211_RATE_BASIC;
for (i = 0, top = RAL_RSSADAPT_BKT0;
i < RAL_RSSADAPT_BKTS;
i++, top <<= RAL_RSSADAPT_BKTPOWER) {
thridx = i;
if (len <= top)
break;
}
thrs = &ra->ra_rate_thresh[thridx];
i = rs->rs_nrates;
while (--i >= 0) {
rateidx = i;
if ((rs->rs_rates[i] & flags) != flags)
continue;
if (do_not_adapt)
break;
if ((*thrs)[i] < ra->ra_avg_rssi)
break;
}
return rateidx;
}
void
ral_rssadapt_updatestats(struct ral_rssadapt *ra)
{
long interval;
ra->ra_pktrate =
(ra->ra_pktrate + 10 * (ra->ra_nfail + ra->ra_nok)) / 2;
ra->ra_nfail = ra->ra_nok = 0;
/* a node is eligible for its rate to be raised every 1/10 to 10
* seconds, more eligible in proportion to recent packet rates.
*/
interval = MAX(100000, 10000000 / MAX(1, 10 * ra->ra_pktrate));
ra->ra_raise_interval.tv_sec = interval / (1000 * 1000);
ra->ra_raise_interval.tv_usec = interval % (1000 * 1000);
}
void
ral_rssadapt_input(struct ieee80211com *ic, struct ieee80211_node *ni,
struct ral_rssadapt *ra, int rssi)
{
ra->ra_avg_rssi = interpolate(master_expavgctl.rc_avgrssi,
ra->ra_avg_rssi, (rssi << 8));
}
/*
* Adapt the data rate to suit the conditions. When a transmitted
* packet is dropped after RAL_RSSADAPT_RETRY_LIMIT retransmissions,
* raise the RSS threshold for transmitting packets of similar length at
* the same data rate.
*/
void
ral_rssadapt_lower_rate(struct ieee80211com *ic, struct ieee80211_node *ni,
struct ral_rssadapt *ra, struct ral_rssdesc *id)
{
struct ieee80211_rateset *rs = &ni->ni_rates;
u_int16_t last_thr;
u_int i, thridx, top;
ra->ra_nfail++;
if (id->id_rateidx >= rs->rs_nrates)
return;
for (i = 0, top = RAL_RSSADAPT_BKT0;
i < RAL_RSSADAPT_BKTS;
i++, top <<= RAL_RSSADAPT_BKTPOWER) {
thridx = i;
if (id->id_len <= top)
break;
}
last_thr = ra->ra_rate_thresh[thridx][id->id_rateidx];
ra->ra_rate_thresh[thridx][id->id_rateidx] =
interpolate(master_expavgctl.rc_thresh, last_thr,
(id->id_rssi << 8));
}
void
ral_rssadapt_raise_rate(struct ieee80211com *ic, struct ral_rssadapt *ra,
struct ral_rssdesc *id)
{
u_int16_t (*thrs)[IEEE80211_RATE_SIZE], newthr, oldthr;
struct ieee80211_node *ni = id->id_node;
struct ieee80211_rateset *rs = &ni->ni_rates;
int i, rate, top;
ra->ra_nok++;
if (!ratecheck(&ra->ra_last_raise, &ra->ra_raise_interval))
return;
for (i = 0, top = RAL_RSSADAPT_BKT0;
i < RAL_RSSADAPT_BKTS;
i++, top <<= RAL_RSSADAPT_BKTPOWER) {
thrs = &ra->ra_rate_thresh[i];
if (id->id_len <= top)
break;
}
if (id->id_rateidx + 1 < rs->rs_nrates &&
(*thrs)[id->id_rateidx + 1] > (*thrs)[id->id_rateidx]) {
rate = (rs->rs_rates[id->id_rateidx + 1] & IEEE80211_RATE_VAL);
oldthr = (*thrs)[id->id_rateidx + 1];
if ((*thrs)[id->id_rateidx] == 0)
newthr = ra->ra_avg_rssi;
else
newthr = (*thrs)[id->id_rateidx];
(*thrs)[id->id_rateidx + 1] =
interpolate(master_expavgctl.rc_decay, oldthr, newthr);
}
}

File diff suppressed because it is too large Load Diff

View File

@ -208,6 +208,8 @@ struct rt2560_tx_desc {
#define RT2560_TX_CIPHER_TKIP (3 << 29)
#define RT2560_TX_CIPHER_AES (4 << 29)
#define RT2560_TX_RETRYCNT(v) (((v) >> 5) & 0x7)
uint32_t physaddr;
uint16_t wme;
#define RT2560_LOGCWMAX(x) (((x) & 0xf) << 12)

View File

@ -55,7 +55,8 @@ struct rt2560_tx_data {
bus_dmamap_t map;
struct mbuf *m;
struct ieee80211_node *ni;
struct ral_rssdesc id;
uint8_t rix;
int8_t rssi;
};
struct rt2560_tx_ring {
@ -94,14 +95,22 @@ struct rt2560_rx_ring {
struct rt2560_node {
struct ieee80211_node ni;
struct ral_rssadapt rssadapt;
struct ieee80211_amrr_node amrr;
};
#define RT2560_NODE(ni) ((struct rt2560_node *)(ni))
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);
};
#define RT2560_VAP(vap) ((struct rt2560_vap *)(vap))
struct rt2560_softc {
struct ifnet *sc_ifp;
struct ieee80211com sc_ic;
int (*sc_newstate)(struct ieee80211com *,
enum ieee80211_state, int);
device_t sc_dev;
bus_space_tag_t sc_st;
bus_space_handle_t sc_sh;
@ -109,10 +118,12 @@ struct rt2560_softc {
struct mtx sc_mtx;
struct callout watchdog_ch;
struct callout rssadapt_ch;
int sc_tx_timer;
int sc_invalid;
int sc_debug;
const struct ieee80211_rate_table *sc_rates;
/*
* The same in both up to here
* ------------------------------------------------
@ -128,8 +139,6 @@ struct rt2560_softc {
struct rt2560_tx_ring bcnq;
struct rt2560_rx_ring rxq;
struct ieee80211_beacon_offsets sc_bo;
uint32_t rf_regs[4];
uint8_t txpow[14];
@ -144,22 +153,10 @@ struct rt2560_softc {
int tx_ant;
int nb_ant;
int dwelltime;
struct bpf_if *sc_drvbpf;
union {
struct rt2560_rx_radiotap_header th;
uint8_t pad[64];
} sc_rxtapu;
#define sc_rxtap sc_rxtapu.th
struct rt2560_rx_radiotap_header sc_rxtap;
int sc_rxtap_len;
union {
struct rt2560_tx_radiotap_header th;
uint8_t pad[64];
} sc_txtapu;
#define sc_txtap sc_txtapu.th
struct rt2560_tx_radiotap_header sc_txtap;
int sc_txtap_len;
#define RT2560_F_INPUT_RUNNING 0x1
#define RT2560_F_PRIO_OACTIVE 0x2
@ -173,5 +170,6 @@ void rt2560_stop(void *);
void rt2560_resume(void *);
void rt2560_intr(void *);
#define RAL_LOCK(sc) mtx_lock(&(sc)->sc_mtx)
#define RAL_UNLOCK(sc) mtx_unlock(&(sc)->sc_mtx)
#define RAL_LOCK(sc) mtx_lock(&(sc)->sc_mtx)
#define RAL_LOCK_ASSERT(sc) mtx_assert(&(sc)->sc_mtx, MA_OWNED)
#define RAL_UNLOCK(sc) mtx_unlock(&(sc)->sc_mtx)

File diff suppressed because it is too large Load Diff

View File

@ -51,7 +51,8 @@ struct rt2661_tx_data {
bus_dmamap_t map;
struct mbuf *m;
struct ieee80211_node *ni;
struct ral_rssdesc id;
uint8_t rix;
int8_t rssi;
};
struct rt2661_tx_ring {
@ -87,14 +88,21 @@ struct rt2661_rx_ring {
struct rt2661_node {
struct ieee80211_node ni;
struct ral_rssadapt rssadapt;
struct ieee80211_amrr_node amrr;
};
#define RT2661_NODE(ni) ((struct rt2661_node *)(ni))
struct rt2661_vap {
struct ieee80211vap ral_vap;
struct ieee80211_amrr amrr;
int (*ral_newstate)(struct ieee80211vap *,
enum ieee80211_state, int);
};
#define RT2661_VAP(vap) ((struct rt2661_vap *)(vap))
struct rt2661_softc {
struct ifnet *sc_ifp;
struct ieee80211com sc_ic;
int (*sc_newstate)(struct ieee80211com *,
enum ieee80211_state, int);
device_t sc_dev;
bus_space_tag_t sc_st;
bus_space_handle_t sc_sh;
@ -102,15 +110,21 @@ struct rt2661_softc {
struct mtx sc_mtx;
struct callout watchdog_ch;
struct callout rssadapt_ch;
int sc_tx_timer;
int sc_invalid;
int sc_debug;
const struct ieee80211_rate_table *sc_rates;
/*
* The same in both up to here
* ------------------------------------------------
*/
int sc_flags;
#define RAL_FW_LOADED 0x1
#define RAL_INPUT_RUNNING 0x2
int sc_id;
struct ieee80211_channel *sc_curchan;
uint8_t rf_rev;
@ -148,23 +162,10 @@ struct rt2661_softc {
int dwelltime;
struct bpf_if *sc_drvbpf;
union {
struct rt2661_rx_radiotap_header th;
uint8_t pad[64];
} sc_rxtapu;
#define sc_rxtap sc_rxtapu.th
struct rt2661_rx_radiotap_header sc_rxtap;
int sc_rxtap_len;
union {
struct rt2661_tx_radiotap_header th;
uint8_t pad[64];
} sc_txtapu;
#define sc_txtap sc_txtapu.th
struct rt2661_tx_radiotap_header sc_txtap;
int sc_txtap_len;
#define RAL_INPUT_RUNNING 1
int sc_flags;
};
int rt2661_attach(device_t, int);
@ -174,5 +175,6 @@ void rt2661_suspend(void *);
void rt2661_resume(void *);
void rt2661_intr(void *);
#define RAL_LOCK(sc) mtx_lock(&(sc)->sc_mtx)
#define RAL_UNLOCK(sc) mtx_unlock(&(sc)->sc_mtx)
#define RAL_LOCK(sc) mtx_lock(&(sc)->sc_mtx)
#define RAL_LOCK_ASSERT(sc) mtx_assert(&(sc)->sc_mtx, MA_OWNED)
#define RAL_UNLOCK(sc) mtx_unlock(&(sc)->sc_mtx)

File diff suppressed because it is too large Load Diff

View File

@ -18,7 +18,7 @@
*/
#define RUM_RX_LIST_COUNT 1
#define RUM_TX_LIST_COUNT 1
#define RUM_TX_LIST_COUNT 8
struct rum_rx_radiotap_header {
struct ieee80211_radiotap_header wr_ihdr;
@ -69,11 +69,26 @@ struct rum_rx_data {
struct mbuf *m;
};
struct rum_node {
struct ieee80211_node ni;
struct ieee80211_amrr_node amn;
};
#define RUM_NODE(ni) ((struct rum_node *)(ni))
struct rum_vap {
struct ieee80211vap vap;
struct ieee80211_beacon_offsets bo;
struct ieee80211_amrr amrr;
struct callout amrr_ch;
int (*newstate)(struct ieee80211vap *,
enum ieee80211_state, int);
};
#define RUM_VAP(vap) ((struct rum_vap *)(vap))
struct rum_softc {
struct ifnet *sc_ifp;
struct ieee80211com sc_ic;
int (*sc_newstate)(struct ieee80211com *,
enum ieee80211_state, int);
const struct ieee80211_rate_table *sc_rates;
device_t sc_dev;
usbd_device_handle sc_udev;
@ -94,9 +109,6 @@ struct rum_softc {
int sc_arg;
struct usb_task sc_task;
struct ieee80211_amrr amrr;
struct ieee80211_amrr_node amn;
struct usb_task sc_scantask;
int sc_scan_action;
#define RUM_SCAN_START 0
@ -106,13 +118,11 @@ struct rum_softc {
struct rum_rx_data rx_data[RUM_RX_LIST_COUNT];
struct rum_tx_data tx_data[RUM_TX_LIST_COUNT];
int tx_queued;
struct ieee80211_beacon_offsets sc_bo;
int tx_cur;
struct mtx sc_mtx;
struct callout watchdog_ch;
struct callout amrr_ch;
int sc_tx_timer;
@ -133,23 +143,12 @@ struct rum_softc {
int ext_5ghz_lna;
int rssi_2ghz_corr;
int rssi_5ghz_corr;
int sifs;
uint8_t bbp17;
struct bpf_if *sc_drvbpf;
union {
struct rum_rx_radiotap_header th;
uint8_t pad[64];
} sc_rxtapu;
#define sc_rxtap sc_rxtapu.th
struct rum_rx_radiotap_header sc_rxtap;
int sc_rxtap_len;
union {
struct rum_tx_radiotap_header th;
uint8_t pad[64];
} sc_txtapu;
#define sc_txtap sc_txtapu.th
struct rum_tx_radiotap_header sc_txtap;
int sc_txtap_len;
};

File diff suppressed because it is too large Load Diff

View File

@ -18,7 +18,7 @@
*/
#define RAL_RX_LIST_COUNT 1
#define RAL_TX_LIST_COUNT 1
#define RAL_TX_LIST_COUNT 8
#define URAL_SCAN_START 1
#define URAL_SCAN_END 2
@ -74,15 +74,31 @@ struct ural_rx_data {
struct mbuf *m;
};
struct ural_node {
struct ieee80211_node ni;
struct ieee80211_amrr_node amn;
};
#define URAL_NODE(ni) ((struct ural_node *)(ni))
struct ural_vap {
struct ieee80211vap vap;
struct ieee80211_beacon_offsets bo;
struct ieee80211_amrr amrr;
struct callout amrr_ch;
int (*newstate)(struct ieee80211vap *,
enum ieee80211_state, int);
};
#define URAL_VAP(vap) ((struct ural_vap *)(vap))
struct ural_softc {
struct ifnet *sc_ifp;
struct ieee80211com sc_ic;
int (*sc_newstate)(struct ieee80211com *,
enum ieee80211_state, int);
device_t sc_dev;
usbd_device_handle sc_udev;
usbd_interface_handle sc_iface;
const struct ieee80211_rate_table *sc_rates;
int sc_rx_no;
int sc_tx_no;
@ -100,19 +116,14 @@ struct ural_softc {
struct usb_task sc_task;
struct usb_task sc_scantask;
struct ieee80211_amrr amrr;
struct ieee80211_amrr_node amn;
struct ural_rx_data rx_data[RAL_RX_LIST_COUNT];
struct ural_tx_data tx_data[RAL_TX_LIST_COUNT];
int tx_queued;
struct ieee80211_beacon_offsets sc_bo;
int tx_cur;
struct mtx sc_mtx;
struct callout watchdog_ch;
struct callout amrr_ch;
int sc_tx_timer;
uint16_t sta[11];
@ -130,20 +141,10 @@ struct ural_softc {
int tx_ant;
int nb_ant;
struct bpf_if *sc_drvbpf;
union {
struct ural_rx_radiotap_header th;
uint8_t pad[64];
} sc_rxtapu;
#define sc_rxtap sc_rxtapu.th
struct ural_rx_radiotap_header sc_rxtap;
int sc_rxtap_len;
union {
struct ural_tx_radiotap_header th;
uint8_t pad[64];
} sc_txtapu;
#define sc_txtap sc_txtapu.th
struct ural_tx_radiotap_header sc_txtap;
int sc_txtap_len;
};

View File

@ -47,9 +47,8 @@
#include <net80211/ieee80211_var.h>
#include <net80211/ieee80211_amrr.h>
#include <net80211/ieee80211_phy.h>
#include <net80211/ieee80211_radiotap.h>
#include <net80211/ieee80211_proto.h>
#include <net80211/ieee80211_node.h>
#include <net80211/ieee80211_regdomain.h>
#include <net/bpf.h>
@ -67,10 +66,7 @@
#include <dev/usb/if_zydreg.h>
#include <dev/usb/if_zydfw.h>
#ifdef USB_DEBUG
#define ZYD_DEBUG
#endif
#ifdef ZYD_DEBUG
#define DPRINTF(x) do { if (zyddebug > 0) printf x; } while (0)
#define DPRINTFN(n, x) do { if (zyddebug > (n)) printf x; } while (0)
@ -154,6 +150,11 @@ static device_probe_t zyd_match;
static device_attach_t zyd_attach;
static device_detach_t zyd_detach;
static struct ieee80211vap *zyd_vap_create(struct ieee80211com *,
const char name[IFNAMSIZ], int unit, int opmode,
int flags, const uint8_t bssid[IEEE80211_ADDR_LEN],
const uint8_t mac[IEEE80211_ADDR_LEN]);
static void zyd_vap_delete(struct ieee80211vap *);
static int zyd_attachhook(struct zyd_softc *);
static int zyd_complete_attach(struct zyd_softc *);
static int zyd_open_pipes(struct zyd_softc *);
@ -163,9 +164,8 @@ static void zyd_free_tx_list(struct zyd_softc *);
static int zyd_alloc_rx_list(struct zyd_softc *);
static void zyd_free_rx_list(struct zyd_softc *);
static struct ieee80211_node *zyd_node_alloc(struct ieee80211_node_table *);
static int zyd_media_change(struct ifnet *);
static void zyd_task(void *);
static int zyd_newstate(struct ieee80211com *, enum ieee80211_state, int);
static int zyd_newstate(struct ieee80211vap *, enum ieee80211_state, int);
static int zyd_cmd(struct zyd_softc *, uint16_t, const void *, int,
void *, int, u_int);
static int zyd_read16(struct zyd_softc *, uint16_t, uint16_t *);
@ -205,11 +205,11 @@ static int zyd_set_macaddr(struct zyd_softc *, const uint8_t *);
static int zyd_set_bssid(struct zyd_softc *, const uint8_t *);
static int zyd_switch_radio(struct zyd_softc *, int);
static void zyd_set_led(struct zyd_softc *, int, int);
static void zyd_set_multi(struct zyd_softc *);
static void zyd_set_multi(void *);
static void zyd_update_mcast(struct ifnet *);
static int zyd_set_rxfilter(struct zyd_softc *);
static void zyd_set_chan(struct zyd_softc *, struct ieee80211_channel *);
static int zyd_set_beacon_interval(struct zyd_softc *, int);
static uint8_t zyd_plcp_signal(int);
static void zyd_intr(usbd_xfer_handle, usbd_private_handle, usbd_status);
static void zyd_rx_data(struct zyd_softc *, const uint8_t *, uint16_t);
static void zyd_rxeof(usbd_xfer_handle, usbd_private_handle, usbd_status);
@ -219,13 +219,14 @@ static int zyd_tx_mgt(struct zyd_softc *, struct mbuf *,
static int zyd_tx_data(struct zyd_softc *, struct mbuf *,
struct ieee80211_node *);
static void zyd_start(struct ifnet *);
static int zyd_raw_xmit(struct ieee80211_node *, struct mbuf *,
const struct ieee80211_bpf_params *);
static void zyd_watchdog(void *);
static int zyd_ioctl(struct ifnet *, u_long, caddr_t);
static void zyd_init_locked(struct zyd_softc *);
static void zyd_init(void *);
static void zyd_stop(struct zyd_softc *, int);
static int zyd_loadfirmware(struct zyd_softc *, u_char *, size_t);
static void zyd_iter_func(void *, struct ieee80211_node *);
static void zyd_amrr_timeout(void *);
static void zyd_newassoc(struct ieee80211_node *, int);
static void zyd_scantask(void *);
static void zyd_scan_start(struct ieee80211com *);
@ -282,7 +283,7 @@ zyd_attach(device_t dev)
sc->sc_dev = dev;
ifp = sc->sc_ifp = if_alloc(IFT_ETHER);
ifp = sc->sc_ifp = if_alloc(IFT_IEEE80211);
if (ifp == NULL) {
device_printf(dev, "can not if_alloc()\n");
return ENXIO;
@ -325,18 +326,18 @@ zyd_attach(device_t dev)
static int
zyd_complete_attach(struct zyd_softc *sc)
{
struct ieee80211com *ic = &sc->sc_ic;
struct ifnet *ifp = sc->sc_ifp;
struct ieee80211com *ic = ifp->if_l2com;
usbd_status error;
int bands;
uint8_t bands;
mtx_init(&sc->sc_mtx, device_get_nameunit(sc->sc_dev), MTX_NETWORK_LOCK,
MTX_DEF | MTX_RECURSE);
usb_init_task(&sc->sc_scantask, zyd_scantask, sc);
usb_init_task(&sc->sc_task, zyd_task, sc);
usb_init_task(&sc->sc_mcasttask, zyd_set_multi, sc);
callout_init(&sc->sc_amrr_ch, 0);
callout_init(&sc->sc_watchdog_ch, 0);
error = usbd_set_config_no(sc->sc_udev, ZYD_CONFIG_NO, 1);
@ -381,10 +382,11 @@ zyd_complete_attach(struct zyd_softc *sc)
sc->fw_rev >> 8, sc->fw_rev & 0xff, zyd_rf_name(sc->rf_rev),
sc->pa_rev, ether_sprintf(ic->ic_myaddr));
IEEE80211_ADDR_COPY(sc->sc_bssid, ic->ic_myaddr);
ic->ic_ifp = ifp;
ic->ic_phytype = IEEE80211_T_OFDM; /* not only, but not used */
ic->ic_opmode = IEEE80211_M_STA; /* default to BSS mode */
ic->ic_state = IEEE80211_S_INIT;
ic->ic_opmode = IEEE80211_M_STA;
/* set device capabilities */
ic->ic_caps =
@ -398,29 +400,22 @@ zyd_complete_attach(struct zyd_softc *sc)
bands = 0;
setbit(&bands, IEEE80211_MODE_11B);
setbit(&bands, IEEE80211_MODE_11G);
ieee80211_init_channels(ic, 0, CTRY_DEFAULT, bands, 0, 1);
ieee80211_init_channels(ic, NULL, &bands);
ieee80211_ifattach(ic);
ic->ic_node_alloc = zyd_node_alloc;
ic->ic_newassoc = zyd_newassoc;
/* enable s/w bmiss handling in sta mode */
ic->ic_flags_ext |= IEEE80211_FEXT_SWBMISS;
ic->ic_raw_xmit = zyd_raw_xmit;
ic->ic_node_alloc = zyd_node_alloc;
ic->ic_scan_start = zyd_scan_start;
ic->ic_scan_end = zyd_scan_end;
ic->ic_set_channel = zyd_set_channel;
/* override state transition machine */
sc->sc_newstate = ic->ic_newstate;
ic->ic_newstate = zyd_newstate;
ieee80211_media_init(ic, zyd_media_change, ieee80211_media_status);
ieee80211_amrr_init(&sc->amrr, ic,
IEEE80211_AMRR_MIN_SUCCESS_THRESHOLD,
IEEE80211_AMRR_MAX_SUCCESS_THRESHOLD);
ic->ic_vap_create = zyd_vap_create;
ic->ic_vap_delete = zyd_vap_delete;
ic->ic_update_mcast = zyd_update_mcast;
bpfattach2(ifp, DLT_IEEE802_11_RADIO,
sizeof(struct ieee80211_frame) + sizeof(sc->sc_txtap),
&sc->sc_drvbpf);
bpfattach(ifp, DLT_IEEE802_11_RADIO,
sizeof(struct ieee80211_frame) + sizeof(sc->sc_txtap));
sc->sc_rxtap_len = sizeof(sc->sc_rxtap);
sc->sc_rxtap.wr_ihdr.it_len = htole16(sc->sc_rxtap_len);
@ -447,8 +442,8 @@ static int
zyd_detach(device_t dev)
{
struct zyd_softc *sc = device_get_softc(dev);
struct ieee80211com *ic = &sc->sc_ic;
struct ifnet *ifp = sc->sc_ifp;
struct ieee80211com *ic = ifp->if_l2com;
if (!device_is_attached(dev))
return 0;
@ -457,17 +452,16 @@ zyd_detach(device_t dev)
ifp->if_flags &= ~IFF_UP;
zyd_stop(sc, 1);
bpfdetach(ifp);
ieee80211_ifdetach(ic);
usb_rem_task(sc->sc_udev, &sc->sc_scantask);
usb_rem_task(sc->sc_udev, &sc->sc_task);
callout_stop(&sc->sc_amrr_ch);
callout_stop(&sc->sc_watchdog_ch);
zyd_close_pipes(sc);
bpfdetach(ifp);
ieee80211_ifdetach(ic);
if_free(ifp);
mtx_destroy(&sc->sc_mtx);
usbd_add_drv_event(USB_EVENT_DRIVER_DETACH, sc->sc_udev, sc->sc_dev);
@ -475,6 +469,51 @@ zyd_detach(device_t dev)
return 0;
}
static struct ieee80211vap *
zyd_vap_create(struct ieee80211com *ic,
const char name[IFNAMSIZ], int unit, int opmode, int flags,
const uint8_t bssid[IEEE80211_ADDR_LEN],
const uint8_t mac[IEEE80211_ADDR_LEN])
{
struct zyd_vap *zvp;
struct ieee80211vap *vap;
if (!TAILQ_EMPTY(&ic->ic_vaps)) /* only one at a time */
return NULL;
zvp = (struct zyd_vap *) malloc(sizeof(struct zyd_vap),
M_80211_VAP, M_NOWAIT | M_ZERO);
if (zvp == NULL)
return NULL;
vap = &zvp->vap;
/* enable s/w bmiss handling for sta mode */
ieee80211_vap_setup(ic, vap, name, unit, opmode,
flags | IEEE80211_CLONE_NOBEACONS, bssid, mac);
/* override state transition machine */
zvp->newstate = vap->iv_newstate;
vap->iv_newstate = zyd_newstate;
ieee80211_amrr_init(&zvp->amrr, vap,
IEEE80211_AMRR_MIN_SUCCESS_THRESHOLD,
IEEE80211_AMRR_MAX_SUCCESS_THRESHOLD,
1000 /* 1 sec */);
/* complete setup */
ieee80211_vap_attach(vap, ieee80211_media_change, ieee80211_media_status);
ic->ic_opmode = opmode;
return vap;
}
static void
zyd_vap_delete(struct ieee80211vap *vap)
{
struct zyd_vap *zvp = ZYD_VAP(vap);
ieee80211_amrr_cleanup(&zvp->amrr);
ieee80211_vap_detach(vap);
free(zvp, M_80211_VAP);
}
static int
zyd_open_pipes(struct zyd_softc *sc)
{
@ -666,86 +705,70 @@ zyd_node_alloc(struct ieee80211_node_table *nt __unused)
return zn != NULL ? &zn->ni : NULL;
}
static int
zyd_media_change(struct ifnet *ifp)
{
struct zyd_softc *sc = ifp->if_softc;
int error;
error = ieee80211_media_change(ifp);
if (error != ENETRESET)
return error;
if ((ifp->if_flags & IFF_UP) == IFF_UP &&
(ifp->if_drv_flags & IFF_DRV_RUNNING) == IFF_DRV_RUNNING)
zyd_init(sc);
return 0;
}
static void
zyd_task(void *arg)
{
struct zyd_softc *sc = arg;
struct ieee80211com *ic = &sc->sc_ic;
enum ieee80211_state ostate;
ostate = ic->ic_state;
struct ifnet *ifp = sc->sc_ifp;
struct ieee80211com *ic = ifp->if_l2com;
struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
struct zyd_vap *zvp = ZYD_VAP(vap);
switch (sc->sc_state) {
case IEEE80211_S_RUN:
{
struct ieee80211_node *ni = ic->ic_bss;
struct ieee80211_node *ni = vap->iv_bss;
zyd_set_chan(sc, ic->ic_curchan);
if (ic->ic_opmode != IEEE80211_M_MONITOR) {
if (vap->iv_opmode != IEEE80211_M_MONITOR) {
/* turn link LED on */
zyd_set_led(sc, ZYD_LED1, 1);
/* make data LED blink upon Tx */
zyd_write32(sc, sc->fwbase + ZYD_FW_LINK_STATUS, 1);
zyd_set_bssid(sc, ni->ni_bssid);
IEEE80211_ADDR_COPY(sc->sc_bssid, ni->ni_bssid);
zyd_set_bssid(sc, sc->sc_bssid);
}
if (ic->ic_opmode == IEEE80211_M_STA) {
if (vap->iv_opmode == IEEE80211_M_STA) {
/* fake a join to init the tx rate */
zyd_newassoc(ni, 1);
}
/* start automatic rate control timer */
if (ic->ic_fixed_rate == IEEE80211_FIXED_RATE_NONE)
callout_reset(&sc->sc_amrr_ch, hz,
zyd_amrr_timeout, sc);
break;
}
default:
break;
}
sc->sc_newstate(ic, sc->sc_state, sc->sc_arg);
IEEE80211_LOCK(ic);
zvp->newstate(vap, sc->sc_state, sc->sc_arg);
if (vap->iv_newstate_cb != NULL)
vap->iv_newstate_cb(vap, sc->sc_state, sc->sc_arg);
IEEE80211_UNLOCK(ic);
}
static int
zyd_newstate(struct ieee80211com *ic, enum ieee80211_state nstate, int arg)
zyd_newstate(struct ieee80211vap *vap, enum ieee80211_state nstate, int arg)
{
struct zyd_vap *zvp = ZYD_VAP(vap);
struct ieee80211com *ic = vap->iv_ic;
struct zyd_softc *sc = ic->ic_ifp->if_softc;
usb_rem_task(sc->sc_udev, &sc->sc_task);
callout_stop(&sc->sc_amrr_ch);
/* do it in a process context */
sc->sc_state = nstate;
sc->sc_arg = arg;
if (nstate == IEEE80211_S_INIT)
sc->sc_newstate(ic, nstate, arg);
else
if (nstate == IEEE80211_S_INIT) {
zvp->newstate(vap, nstate, arg);
return 0;
} else {
usb_add_task(sc->sc_udev, &sc->sc_task, USB_TASKQ_DRIVER);
return 0;
return EINPROGRESS;
}
}
static int
@ -1582,7 +1605,8 @@ fail: return error;
static int
zyd_read_eeprom(struct zyd_softc *sc)
{
struct ieee80211com *ic = &sc->sc_ic;
struct ifnet *ifp = sc->sc_ifp;
struct ieee80211com *ic = ifp->if_l2com;
uint32_t tmp;
uint16_t val;
int i;
@ -1607,6 +1631,7 @@ zyd_read_eeprom(struct zyd_softc *sc)
(void)zyd_read32(sc, ZYD_EEPROM_SUBID, &tmp);
sc->regdomain = tmp >> 16;
DPRINTF(("regulatory domain %x\n", sc->regdomain));
/* XXX propagate to net80211 after mapping to SKU */
/* read Tx power calibration tables */
for (i = 0; i < 7; i++) {
@ -1687,10 +1712,11 @@ zyd_set_led(struct zyd_softc *sc, int which, int on)
}
static void
zyd_set_multi(struct zyd_softc *sc)
zyd_set_multi(void *arg)
{
struct ieee80211com *ic = &sc->sc_ic;
struct ifnet *ifp = ic->ic_ifp;
struct zyd_softc *sc = arg;
struct ifnet *ifp = sc->sc_ifp;
struct ieee80211com *ic = ifp->if_l2com;
struct ifmultiaddr *ifma;
uint32_t low, high;
uint8_t v;
@ -1725,12 +1751,22 @@ zyd_set_multi(struct zyd_softc *sc)
zyd_write32(sc, ZYD_MAC_GHTBH, high);
}
static void
zyd_update_mcast(struct ifnet *ifp)
{
struct zyd_softc *sc = ifp->if_softc;
usb_add_task(sc->sc_udev, &sc->sc_mcasttask, USB_TASKQ_DRIVER);
}
static int
zyd_set_rxfilter(struct zyd_softc *sc)
{
struct ifnet *ifp = sc->sc_ifp;
struct ieee80211com *ic = ifp->if_l2com;
uint32_t rxfilter;
switch (sc->sc_ic.ic_opmode) {
switch (ic->ic_opmode) {
case IEEE80211_M_STA:
rxfilter = ZYD_FILTER_BSS;
break;
@ -1751,7 +1787,8 @@ zyd_set_rxfilter(struct zyd_softc *sc)
static void
zyd_set_chan(struct zyd_softc *sc, struct ieee80211_channel *c)
{
struct ieee80211com *ic = &sc->sc_ic;
struct ifnet *ifp = sc->sc_ifp;
struct ieee80211com *ic = ifp->if_l2com;
struct zyd_rf *rf = &sc->sc_rf;
uint32_t tmp;
u_int chan;
@ -1809,31 +1846,6 @@ zyd_set_beacon_interval(struct zyd_softc *sc, int bintval)
return 0;
}
static uint8_t
zyd_plcp_signal(int rate)
{
switch (rate) {
/* CCK rates (returned values are device-dependent) */
case 2: return 0x0;
case 4: return 0x1;
case 11: return 0x2;
case 22: return 0x3;
/* OFDM rates (cf IEEE Std 802.11a-1999, pp. 14 Table 80) */
case 12: return 0xb;
case 18: return 0xf;
case 24: return 0xa;
case 36: return 0xe;
case 48: return 0x9;
case 72: return 0xd;
case 96: return 0x8;
case 108: return 0xc;
/* unsupported rates (should not get there) */
default: return 0xff;
}
}
static void
zyd_intr(usbd_xfer_handle xfer, usbd_private_handle priv, usbd_status status)
{
@ -1857,8 +1869,9 @@ zyd_intr(usbd_xfer_handle xfer, usbd_private_handle priv, usbd_status status)
if (le16toh(cmd->code) == ZYD_NOTIF_RETRYSTATUS) {
struct zyd_notif_retry *retry =
(struct zyd_notif_retry *)cmd->data;
struct ieee80211com *ic = &sc->sc_ic;
struct ifnet *ifp = sc->sc_ifp;
struct ieee80211com *ic = ifp->if_l2com;
struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
struct ieee80211_node *ni;
DPRINTF(("retry intr: rate=0x%x addr=%s count=%d (0x%x)\n",
@ -1870,15 +1883,12 @@ zyd_intr(usbd_xfer_handle xfer, usbd_private_handle priv, usbd_status status)
* retry statistics. In BSS mode, this node is the AP we're
* associated to so no lookup is actually needed.
*/
if (ic->ic_opmode != IEEE80211_M_STA) {
ni = ieee80211_find_node(&ic->ic_sta, retry->macaddr);
if (ni == NULL)
return; /* just ignore */
} else
ni = ic->ic_bss;
((struct zyd_node *)ni)->amn.amn_retrycnt++;
ni = ieee80211_find_txnode(vap, retry->macaddr);
if (ni != NULL) {
ieee80211_amrr_tx_complete(&ZYD_NODE(ni)->amn,
IEEE80211_AMRR_FAILURE, 1);
ieee80211_free_node(ni);
}
if (le16toh(retry->count) & 0x100)
ifp->if_oerrors++; /* too many retries */
} else if (le16toh(cmd->code) == ZYD_NOTIF_IORD) {
@ -1918,30 +1928,16 @@ zyd_intr(usbd_xfer_handle xfer, usbd_private_handle priv, usbd_status status)
}
}
static __inline uint8_t
zyd_plcp2ieee(int signal, int isofdm)
{
if (isofdm) {
static const uint8_t ofdmrates[16] =
{ 0, 0, 0, 0, 0, 0, 0, 96, 48, 24, 12, 108, 72, 36, 18 };
return ofdmrates[signal & 0xf];
} else {
static const uint8_t cckrates[16] =
{ 0, 0, 0, 0, 4, 0, 0, 11, 0, 0, 2, 0, 0, 0, 22, 0 };
return cckrates[signal & 0xf];
}
}
static void
zyd_rx_data(struct zyd_softc *sc, const uint8_t *buf, uint16_t len)
{
struct ieee80211com *ic = &sc->sc_ic;
struct ifnet *ifp = sc->sc_ifp;
struct ieee80211com *ic = ifp->if_l2com;
struct ieee80211_node *ni;
const struct zyd_plcphdr *plcp;
const struct zyd_rx_stat *stat;
struct mbuf *m;
int rlen;
int rlen, rssi, nf;
if (len < ZYD_MIN_FRAGSZ) {
DPRINTF(("%s: frame too short (length=%d)\n",
@ -1980,7 +1976,7 @@ zyd_rx_data(struct zyd_softc *sc, const uint8_t *buf, uint16_t len)
m->m_pkthdr.len = m->m_len = rlen;
bcopy((const uint8_t *)(plcp + 1), mtod(m, uint8_t *), rlen);
if (bpf_peers_present(sc->sc_drvbpf)) {
if (bpf_peers_present(ifp->if_bpf)) {
struct zyd_rx_radiotap_header *tap = &sc->sc_rxtap;
tap->wr_flags = 0;
@ -1989,20 +1985,23 @@ zyd_rx_data(struct zyd_softc *sc, const uint8_t *buf, uint16_t len)
/* XXX toss, no way to express errors */
if (stat->flags & ZYD_RX_DECRYPTERR)
tap->wr_flags |= IEEE80211_RADIOTAP_F_BADFCS;
tap->wr_rate =
zyd_plcp2ieee(plcp->signal, stat->flags & ZYD_RX_OFDM);
tap->wr_rate = ieee80211_plcp2rate(plcp->signal,
stat->flags & ZYD_RX_OFDM);
tap->wr_antsignal = stat->rssi + -95;
tap->wr_antnoise = -95; /* XXX */
bpf_mtap2(sc->sc_drvbpf, tap, sc->sc_rxtap_len, m);
bpf_mtap2(ifp->if_bpf, tap, sc->sc_rxtap_len, m);
}
ni = ieee80211_find_rxnode(ic, mtod(m, struct ieee80211_frame_min *));
ieee80211_input(ic, m, ni,
stat->rssi > 63 ? 127 : 2 * stat->rssi, -95/*XXX*/, 0);
rssi = stat->rssi > 63 ? 127 : 2 * stat->rssi;
nf = -95; /* XXX */
/* node is no longer needed */
ieee80211_free_node(ni);
ni = ieee80211_find_rxnode(ic, mtod(m, struct ieee80211_frame_min *));
if (ni != NULL) {
(void) ieee80211_input(ni, m, rssi, nf, 0);
ieee80211_free_node(ni);
} else
(void) ieee80211_input_all(ic, m, rssi, nf, 0);
}
static void
@ -2067,7 +2066,8 @@ zyd_rxeof(usbd_xfer_handle xfer, usbd_private_handle priv, usbd_status status)
static int
zyd_tx_mgt(struct zyd_softc *sc, struct mbuf *m0, struct ieee80211_node *ni)
{
struct ieee80211com *ic = &sc->sc_ic;
struct ieee80211vap *vap = ni->ni_vap;
struct ieee80211com *ic = ni->ni_ic;
struct ifnet *ifp = sc->sc_ifp;
struct zyd_tx_desc *desc;
struct zyd_tx_data *data;
@ -2085,7 +2085,7 @@ zyd_tx_mgt(struct zyd_softc *sc, struct mbuf *m0, struct ieee80211_node *ni)
wh = mtod(m0, struct ieee80211_frame *);
if (wh->i_fc[1] & IEEE80211_FC1_WEP) {
k = ieee80211_crypto_encap(ic, ni, m0);
k = ieee80211_crypto_encap(ni, m0);
if (k == NULL) {
m_freem(m0);
return ENOBUFS;
@ -2106,7 +2106,7 @@ zyd_tx_mgt(struct zyd_softc *sc, struct mbuf *m0, struct ieee80211_node *ni)
desc->flags = ZYD_TX_FLAG_BACKOFF;
if (!IEEE80211_IS_MULTICAST(wh->i_addr1)) {
/* multicast frames are not sent at OFDM rates in 802.11b/g */
if (totlen > ic->ic_rtsthreshold) {
if (totlen > vap->iv_rtsthreshold) {
desc->flags |= ZYD_TX_FLAG_RTS;
} else if (ZYD_RATE_IS_OFDM(rate) &&
(ic->ic_flags & IEEE80211_F_USEPROT)) {
@ -2123,7 +2123,7 @@ zyd_tx_mgt(struct zyd_softc *sc, struct mbuf *m0, struct ieee80211_node *ni)
(IEEE80211_FC0_TYPE_CTL | IEEE80211_FC0_SUBTYPE_PS_POLL))
desc->flags |= ZYD_TX_FLAG_TYPE(ZYD_TX_TYPE_PS_POLL);
desc->phy = zyd_plcp_signal(rate);
desc->phy = ieee80211_rate2plcp(rate);
if (ZYD_RATE_IS_OFDM(rate)) {
desc->phy |= ZYD_TX_PHY_OFDM;
if (IEEE80211_IS_CHAN_5GHZ(ic->ic_curchan))
@ -2145,13 +2145,13 @@ zyd_tx_mgt(struct zyd_softc *sc, struct mbuf *m0, struct ieee80211_node *ni)
desc->plcp_service |= ZYD_PLCP_LENGEXT;
}
if (bpf_peers_present(sc->sc_drvbpf)) {
if (bpf_peers_present(ifp->if_bpf)) {
struct zyd_tx_radiotap_header *tap = &sc->sc_txtap;
tap->wt_flags = 0;
tap->wt_rate = rate;
bpf_mtap2(sc->sc_drvbpf, tap, sc->sc_txtap_len, m0);
bpf_mtap2(ifp->if_bpf, tap, sc->sc_txtap_len, m0);
}
m_copydata(m0, 0, m0->m_pkthdr.len,
@ -2200,7 +2200,8 @@ zyd_txeof(usbd_xfer_handle xfer, usbd_private_handle priv, usbd_status status)
ni = data->ni;
/* update rate control statistics */
((struct zyd_node *)ni)->amn.amn_txcnt++;
ieee80211_amrr_tx_complete(&ZYD_NODE(ni)->amn,
IEEE80211_AMRR_SUCCESS, 0);
/*
* Do any tx complete callback. Note this must
@ -2227,11 +2228,13 @@ zyd_txeof(usbd_xfer_handle xfer, usbd_private_handle priv, usbd_status status)
static int
zyd_tx_data(struct zyd_softc *sc, struct mbuf *m0, struct ieee80211_node *ni)
{
struct ieee80211com *ic = &sc->sc_ic;
struct ieee80211vap *vap = ni->ni_vap;
struct ieee80211com *ic = ni->ni_ic;
struct ifnet *ifp = sc->sc_ifp;
struct zyd_tx_desc *desc;
struct zyd_tx_data *data;
struct ieee80211_frame *wh;
const struct ieee80211_txparam *tp;
struct ieee80211_key *k;
int xferlen, totlen, rate;
uint16_t pktlen;
@ -2242,17 +2245,19 @@ zyd_tx_data(struct zyd_softc *sc, struct mbuf *m0, struct ieee80211_node *ni)
desc = (struct zyd_tx_desc *)data->buf;
desc->flags = ZYD_TX_FLAG_BACKOFF;
tp = &vap->iv_txparms[ieee80211_chan2mode(ni->ni_chan)];
if (IEEE80211_IS_MULTICAST(wh->i_addr1)) {
rate = ic->ic_mcast_rate;
rate = tp->mcastrate;
desc->flags |= ZYD_TX_FLAG_MULTICAST;
} else if (ic->ic_fixed_rate != IEEE80211_FIXED_RATE_NONE)
rate = ic->ic_fixed_rate;
else
rate = ni->ni_rates.rs_rates[ni->ni_txrate];
rate &= IEEE80211_RATE_VAL;
} else if (tp->ucastrate != IEEE80211_FIXED_RATE_NONE) {
rate = tp->ucastrate;
} else {
(void) ieee80211_amrr_choose(ni, &ZYD_NODE(ni)->amn);
rate = ni->ni_txrate;
}
if (wh->i_fc[1] & IEEE80211_FC1_WEP) {
k = ieee80211_crypto_encap(ic, ni, m0);
k = ieee80211_crypto_encap(ni, m0);
if (k == NULL) {
m_freem(m0);
return ENOBUFS;
@ -2273,7 +2278,7 @@ zyd_tx_data(struct zyd_softc *sc, struct mbuf *m0, struct ieee80211_node *ni)
if (!IEEE80211_IS_MULTICAST(wh->i_addr1)) {
/* multicast frames are not sent at OFDM rates in 802.11b/g */
if (totlen > ic->ic_rtsthreshold) {
if (totlen > vap->iv_rtsthreshold) {
desc->flags |= ZYD_TX_FLAG_RTS;
} else if (ZYD_RATE_IS_OFDM(rate) &&
(ic->ic_flags & IEEE80211_F_USEPROT)) {
@ -2289,7 +2294,7 @@ zyd_tx_data(struct zyd_softc *sc, struct mbuf *m0, struct ieee80211_node *ni)
(IEEE80211_FC0_TYPE_CTL | IEEE80211_FC0_SUBTYPE_PS_POLL))
desc->flags |= ZYD_TX_FLAG_TYPE(ZYD_TX_TYPE_PS_POLL);
desc->phy = zyd_plcp_signal(rate);
desc->phy = ieee80211_rate2plcp(rate);
if (ZYD_RATE_IS_OFDM(rate)) {
desc->phy |= ZYD_TX_PHY_OFDM;
if (IEEE80211_IS_CHAN_5GHZ(ic->ic_curchan))
@ -2311,7 +2316,7 @@ zyd_tx_data(struct zyd_softc *sc, struct mbuf *m0, struct ieee80211_node *ni)
desc->plcp_service |= ZYD_PLCP_LENGEXT;
}
if (bpf_peers_present(sc->sc_drvbpf)) {
if (bpf_peers_present(ifp->if_bpf)) {
struct zyd_tx_radiotap_header *tap = &sc->sc_txtap;
tap->wt_flags = 0;
@ -2319,7 +2324,7 @@ zyd_tx_data(struct zyd_softc *sc, struct mbuf *m0, struct ieee80211_node *ni)
tap->wt_chan_freq = htole16(ic->ic_curchan->ic_freq);
tap->wt_chan_flags = htole16(ic->ic_curchan->ic_flags);
bpf_mtap2(sc->sc_drvbpf, tap, sc->sc_txtap_len, m0);
bpf_mtap2(ifp->if_bpf, tap, sc->sc_txtap_len, m0);
}
m_copydata(m0, 0, m0->m_pkthdr.len,
@ -2348,81 +2353,81 @@ static void
zyd_start(struct ifnet *ifp)
{
struct zyd_softc *sc = ifp->if_softc;
struct ieee80211com *ic = &sc->sc_ic;
struct ether_header *eh;
struct ieee80211_node *ni;
struct mbuf *m0;
struct mbuf *m;
for (;;) {
IF_POLL(&ic->ic_mgtq, m0);
if (m0 != NULL) {
if (sc->tx_queued >= ZYD_TX_LIST_CNT) {
ifp->if_drv_flags |= IFF_DRV_OACTIVE;
break;
}
IF_DEQUEUE(&ic->ic_mgtq, m0);
ni = (struct ieee80211_node *)m0->m_pkthdr.rcvif;
m0->m_pkthdr.rcvif = NULL;
if (bpf_peers_present(ic->ic_rawbpf))
bpf_mtap(ic->ic_rawbpf, m0);
if (zyd_tx_mgt(sc, m0, ni) != 0)
break;
} else {
if (ic->ic_state != IEEE80211_S_RUN)
break;
IFQ_POLL(&ifp->if_snd, m0);
if (m0 == NULL)
break;
if (sc->tx_queued >= ZYD_TX_LIST_CNT) {
ifp->if_drv_flags |= IFF_DRV_OACTIVE;
break;
}
IFQ_DEQUEUE(&ifp->if_snd, m0);
/*
* Cancel any background scan.
*/
if (ic->ic_flags & IEEE80211_F_SCAN)
ieee80211_cancel_scan(ic);
if (m0->m_len < sizeof(struct ether_header) &&
!(m0 = m_pullup(m0, sizeof(struct ether_header))))
continue;
eh = mtod(m0, struct ether_header *);
ni = ieee80211_find_txnode(ic, eh->ether_dhost);
if (ni == NULL) {
m_freem(m0);
continue;
}
if (bpf_peers_present(ifp->if_bpf))
bpf_mtap(ifp->if_bpf, m0);
if ((m0 = ieee80211_encap(ic, m0, ni)) == NULL) {
ieee80211_free_node(ni);
ifp->if_oerrors++;
continue;
}
if (bpf_peers_present(ic->ic_rawbpf))
bpf_mtap(ic->ic_rawbpf, m0);
if (zyd_tx_data(sc, m0, ni) != 0) {
ieee80211_free_node(ni);
ifp->if_oerrors++;
break;
}
IFQ_DRV_DEQUEUE(&ifp->if_snd, m);
if (m == NULL)
break;
if (sc->tx_queued >= ZYD_TX_LIST_CNT) {
IFQ_DRV_PREPEND(&ifp->if_snd, m);
ifp->if_drv_flags |= IFF_DRV_OACTIVE;
break;
}
ni = (struct ieee80211_node *)m->m_pkthdr.rcvif;
m = ieee80211_encap(ni, m);
if (m == NULL) {
ieee80211_free_node(ni);
ifp->if_oerrors++;
continue;
}
if (zyd_tx_data(sc, m, ni) != 0) {
ieee80211_free_node(ni);
ifp->if_oerrors++;
break;
}
sc->tx_timer = 5;
ic->ic_lastdata = ticks;
callout_reset(&sc->sc_watchdog_ch, hz, zyd_watchdog, sc);
}
}
static int
zyd_raw_xmit(struct ieee80211_node *ni, struct mbuf *m,
const struct ieee80211_bpf_params *params)
{
struct ieee80211com *ic = ni->ni_ic;
struct ifnet *ifp = ic->ic_ifp;
struct zyd_softc *sc = ifp->if_softc;
/* prevent management frames from being sent if we're not ready */
if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) {
m_freem(m);
ieee80211_free_node(ni);
return ENETDOWN;
}
if (sc->tx_queued >= ZYD_TX_LIST_CNT) {
ifp->if_drv_flags |= IFF_DRV_OACTIVE;
m_freem(m);
ieee80211_free_node(ni);
return ENOBUFS; /* XXX */
}
ifp->if_opackets++;
/*
* Legacy path; interpret frame contents to decide
* precisely how to send the frame.
* XXX raw path
*/
if (zyd_tx_mgt(sc, m, ni) != 0)
goto bad;
sc->tx_timer = 5;
callout_reset(&sc->sc_watchdog_ch, hz, zyd_watchdog, sc);
return 0;
bad:
ifp->if_oerrors++;
ieee80211_free_node(ni);
return EIO; /* XXX */
}
static void
zyd_watchdog(void *arg)
{
struct zyd_softc *sc = arg;
struct ieee80211com *ic = &sc->sc_ic;
struct ifnet *ifp = ic->ic_ifp;
struct ifnet *ifp = sc->sc_ifp;
if (sc->tx_timer > 0) {
if (--sc->tx_timer == 0) {
@ -2439,11 +2444,11 @@ static int
zyd_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
{
struct zyd_softc *sc = ifp->if_softc;
struct ieee80211com *ic = &sc->sc_ic;
int error = 0;
struct ieee80211com *ic = ifp->if_l2com;
struct ifreq *ifr = (struct ifreq *) data;
int error = 0, startall = 0;
ZYD_LOCK(sc);
switch (cmd) {
case SIOCSIFFLAGS:
if (ifp->if_flags & IFF_UP) {
@ -2451,43 +2456,36 @@ zyd_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
if ((ifp->if_flags ^ sc->sc_if_flags) &
(IFF_ALLMULTI | IFF_PROMISC))
zyd_set_multi(sc);
} else
zyd_init(sc);
} else {
zyd_init_locked(sc);
startall = 1;
}
} else {
if (ifp->if_drv_flags & IFF_DRV_RUNNING)
zyd_stop(sc, 1);
}
sc->sc_if_flags = ifp->if_flags;
break;
case SIOCADDMULTI:
case SIOCDELMULTI:
if (ifp->if_drv_flags & IFF_DRV_RUNNING)
zyd_set_multi(sc);
case SIOCGIFMEDIA:
case SIOCSIFMEDIA:
error = ifmedia_ioctl(ifp, ifr, &ic->ic_media, cmd);
break;
default:
error = ieee80211_ioctl(ic, cmd, data);
error = ether_ioctl(ifp, cmd, data);
break;
}
if (error == ENETRESET) {
if ((ifp->if_flags & IFF_UP) == IFF_UP &&
(ifp->if_drv_flags & IFF_DRV_RUNNING) == IFF_DRV_RUNNING)
zyd_init(sc);
error = 0;
}
ZYD_UNLOCK(sc);
if (startall)
ieee80211_start_all(ic);
return error;
}
static void
zyd_init(void *priv)
zyd_init_locked(struct zyd_softc *sc)
{
struct zyd_softc *sc = priv;
struct ieee80211com *ic = &sc->sc_ic;
struct ifnet *ifp = ic->ic_ifp;
struct ifnet *ifp = sc->sc_ifp;
struct ieee80211com *ic = ifp->if_l2com;
int i, error;
zyd_stop(sc, 0);
@ -2569,26 +2567,31 @@ zyd_init(void *priv)
ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
ifp->if_drv_flags |= IFF_DRV_RUNNING;
if (ic->ic_opmode != IEEE80211_M_MONITOR) {
if (ic->ic_roaming != IEEE80211_ROAMING_MANUAL)
ieee80211_new_state(ic, IEEE80211_S_SCAN, -1);
} else
ieee80211_new_state(ic, IEEE80211_S_RUN, -1);
return;
fail: zyd_stop(sc, 1);
return;
}
static void
zyd_init(void *priv)
{
struct zyd_softc *sc = priv;
struct ifnet *ifp = sc->sc_ifp;
struct ieee80211com *ic = ifp->if_l2com;
ZYD_LOCK(sc);
zyd_init_locked(sc);
ZYD_UNLOCK(sc);
if (ifp->if_drv_flags & IFF_DRV_RUNNING)
ieee80211_start_all(ic); /* start all vap's */
}
static void
zyd_stop(struct zyd_softc *sc, int disable)
{
struct ifnet *ifp = sc->sc_ifp;
struct ieee80211com *ic = &sc->sc_ic;
ieee80211_new_state(ic, IEEE80211_S_INIT, -1); /* free all nodes */
sc->tx_timer = 0;
ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE);
@ -2660,44 +2663,12 @@ zyd_loadfirmware(struct zyd_softc *sc, u_char *fw, size_t size)
return (stat & 0x80) ? EIO : 0;
}
static void
zyd_iter_func(void *arg, struct ieee80211_node *ni)
{
struct zyd_softc *sc = arg;
struct zyd_node *zn = (struct zyd_node *)ni;
ieee80211_amrr_choose(&sc->amrr, ni, &zn->amn);
}
static void
zyd_amrr_timeout(void *arg)
{
struct zyd_softc *sc = arg;
struct ieee80211com *ic = &sc->sc_ic;
ZYD_LOCK(sc);
if (ic->ic_opmode == IEEE80211_M_STA)
zyd_iter_func(sc, ic->ic_bss);
else
ieee80211_iterate_nodes(&ic->ic_sta, zyd_iter_func, sc);
ZYD_UNLOCK(sc);
callout_reset(&sc->sc_amrr_ch, hz, zyd_amrr_timeout, sc);
}
static void
zyd_newassoc(struct ieee80211_node *ni, int isnew)
{
struct zyd_softc *sc = ni->ni_ic->ic_ifp->if_softc;
int i;
struct ieee80211vap *vap = ni->ni_vap;
ieee80211_amrr_node_init(&sc->amrr, &((struct zyd_node *)ni)->amn);
/* set rate to some reasonable initial value */
for (i = ni->ni_rates.rs_nrates - 1;
i > 0 && (ni->ni_rates.rs_rates[i] & IEEE80211_RATE_VAL) > 72;
i--);
ni->ni_txrate = i;
ieee80211_amrr_node_init(&ZYD_VAP(vap)->amrr, &ZYD_NODE(ni)->amn, ni);
}
static void
@ -2740,18 +2711,20 @@ static void
zyd_scantask(void *arg)
{
struct zyd_softc *sc = arg;
struct ieee80211com *ic = &sc->sc_ic;
struct ifnet *ifp = ic->ic_ifp;
struct ifnet *ifp = sc->sc_ifp;
struct ieee80211com *ic = ifp->if_l2com;
ZYD_LOCK(sc);
switch (sc->sc_scan_action) {
case ZYD_SCAN_START:
/* want broadcast address while scanning */
zyd_set_bssid(sc, ifp->if_broadcastaddr);
break;
case ZYD_SCAN_END:
zyd_set_bssid(sc, ic->ic_bss->ni_bssid);
/* restore previous bssid */
zyd_set_bssid(sc, sc->sc_bssid);
break;
case ZYD_SET_CHANNEL:

View File

@ -1122,6 +1122,7 @@ struct zyd_node {
struct ieee80211_node ni; /* must be the first */
struct ieee80211_amrr_node amn;
};
#define ZYD_NODE(ni) ((struct zyd_node *)(ni))
struct zyd_rx_radiotap_header {
struct ieee80211_radiotap_header wr_ihdr;
@ -1173,12 +1174,18 @@ struct rq {
STAILQ_ENTRY(rq) rq;
};
struct zyd_vap {
struct ieee80211vap vap;
int (*newstate)(struct ieee80211vap *,
enum ieee80211_state, int);
struct callout amrr_ch;
struct ieee80211_amrr amrr;
};
#define ZYD_VAP(vap) ((struct zyd_vap *)(vap))
struct zyd_softc {
device_t sc_dev;
struct ifnet *sc_ifp;
struct ieee80211com sc_ic;
int (*sc_newstate)(struct ieee80211com *,
enum ieee80211_state, int);
struct zyd_rf sc_rf;
struct usb_task sc_task;
@ -1187,22 +1194,20 @@ struct zyd_softc {
#define ZYD_SCAN_START 0
#define ZYD_SCAN_END 1
#define ZYD_SET_CHANNEL 2
struct usb_task sc_mcasttask;
usbd_device_handle sc_udev;
usbd_interface_handle sc_iface;
int sc_flags;
int sc_if_flags;
#define ZD1211_FWLOADED (1 << 0)
uint8_t sc_bssid[IEEE80211_ADDR_LEN];
enum ieee80211_state sc_state;
int sc_arg;
struct mtx sc_mtx;
struct callout sc_amrr_ch;
struct callout sc_watchdog_ch;
struct ieee80211_amrr amrr;
STAILQ_HEAD(rqh, rq) sc_rqh;
uint16_t fwbase;
@ -1233,8 +1238,6 @@ struct zyd_softc {
int tx_timer;
struct bpf_if *sc_drvbpf;
struct zyd_rx_radiotap_header sc_rxtap;
int sc_rxtap_len;

View File

@ -241,10 +241,13 @@ struct wi_counters {
#define WI_RID_CNFAUTHMODE 0xFC2A
#define WI_RID_ROAMING_MODE 0xFC2D
#define WI_RID_OWN_BEACON_INT 0xFC33 /* beacon xmit time for BSS creation */
#define WI_RID_ENH_SECURITY 0xFC43 /* enhanced security (AP mode) */
#define WI_RID_CNF_DBM_ADJUST 0xFC46
#define WI_RID_DBM_ADJUST 0xFC46 /* RSSI - WI_RID_DBM_ADJUST ~ dBm */
#define WI_RID_WPA_DATA 0xFC48 /* WPA IE */
#define WI_RID_BASIC_RATE 0xFCB3
#define WI_RID_SUPPORT_RATE 0xFCB4
#define WI_RID_WPA_HANDLING 0xFCBB /* WPA handling procedures */
/*
* Network parameters, dynamic configuration entities

File diff suppressed because it is too large Load Diff

View File

@ -71,9 +71,6 @@ __FBSDID("$FreeBSD$");
#include <dev/wi/if_wavelan_ieee.h>
#include <dev/wi/if_wireg.h>
#include <dev/wi/if_wivar.h>
#ifdef WI_SYMBOL_FIRMWARE
#include <dev/wi/spectrum24t_cf.h>
#endif
#include "card_if.h"
#include "pccarddevs.h"
@ -152,7 +149,6 @@ static const struct pccard_product wi_pccard_products[] = {
PCMCIA_CARD(SIEMENS, SS1021),
PCMCIA_CARD(SIMPLETECH, SPECTRUM24_ALT),
PCMCIA_CARD(SOCKET, LP_WLAN_CF),
PCMCIA_CARD(SYMBOL, LA4100),
PCMCIA_CARD(TDK, LAK_CD011WL),
{ NULL }
};
@ -167,64 +163,39 @@ wi_pccard_probe(device_t dev)
/* Make sure we're a network driver */
error = pccard_get_function(dev, &fcn);
if (error != 0)
return (error);
return error;
if (fcn != PCCARD_FUNCTION_NETWORK)
return (ENXIO);
return ENXIO;
if ((pp = pccard_product_lookup(dev, wi_pccard_products,
sizeof(wi_pccard_products[0]), NULL)) != NULL) {
pp = pccard_product_lookup(dev, wi_pccard_products,
sizeof(wi_pccard_products[0]), NULL);
if (pp != NULL) {
if (pp->pp_name != NULL)
device_set_desc(dev, pp->pp_name);
return (0);
return 0;
}
return (ENXIO);
return ENXIO;
}
static int
wi_pccard_attach(device_t dev)
{
struct wi_softc *sc;
int error;
uint32_t vendor, product;
int error;
sc = device_get_softc(dev);
sc->wi_gone = 0;
sc->wi_bus_type = WI_BUS_PCCARD;
error = wi_alloc(dev, 0);
if (error)
return (error);
if (error == 0) {
/* Make sure interrupts are disabled. */
CSR_WRITE_2(sc, WI_INT_EN, 0);
CSR_WRITE_2(sc, WI_EVENT_ACK, 0xFFFF);
/* Make sure interrupts are disabled. */
CSR_WRITE_2(sc, WI_INT_EN, 0);
CSR_WRITE_2(sc, WI_EVENT_ACK, 0xFFFF);
/*
* The cute little Symbol LA4100-series CF cards need to have
* code downloaded to them.
*/
pccard_get_vendor(dev, &vendor);
pccard_get_product(dev, &product);
if (vendor == PCMCIA_VENDOR_SYMBOL &&
product == PCMCIA_PRODUCT_SYMBOL_LA4100) {
#ifdef WI_SYMBOL_FIRMWARE
if (wi_symbol_load_firm(device_get_softc(dev),
spectrum24t_primsym, sizeof(spectrum24t_primsym),
spectrum24t_secsym, sizeof(spectrum24t_secsym))) {
device_printf(dev, "couldn't load firmware\n");
return (ENXIO);
}
#else
device_printf(dev,
"Symbol LA4100 needs 'option WI_SYMBOL_FIRMWARE'\n");
wi_free(dev);
return (ENXIO);
#endif
error = wi_attach(dev);
if (error != 0)
wi_free(dev);
}
pccard_get_ether(dev, sc->sc_hintmacaddr);
error = wi_attach(dev);
if (error != 0)
wi_free(dev);
return (error);
return error;
}

View File

@ -246,10 +246,8 @@ static int
wi_pci_suspend(device_t dev)
{
struct wi_softc *sc = device_get_softc(dev);
struct ieee80211com *ic = &sc->sc_ic;
struct ifnet *ifp = ic->ic_ifp;
wi_stop(ifp, 1);
wi_stop(sc, 1);
return (0);
}
@ -258,8 +256,7 @@ static int
wi_pci_resume(device_t dev)
{
struct wi_softc *sc = device_get_softc(dev);
struct ieee80211com *ic = &sc->sc_ic;
struct ifnet *ifp = ic->ic_ifp;
struct ifnet *ifp = sc->sc_ifp;
if (sc->wi_bus_type != WI_BUS_PCI_NATIVE)
return (0);

View File

@ -34,11 +34,6 @@
* $FreeBSD$
*/
#if 0
#define WICACHE /* turn on signal strength cache code */
#define MAXWICACHE 10
#endif
/*
* Encryption controls. We can enable or disable encryption as
* well as specify up to 4 encryption keys. We can also specify
@ -61,17 +56,26 @@
#define WI_MAX_AID 256 /* max stations for ap operation */
struct wi_vap {
struct ieee80211vap wv_vap;
struct ieee80211_beacon_offsets wv_bo;
struct task wv_connected_task;
struct task wv_disconnected_task;
struct task wv_assoc_failed_task;
void (*wv_recv_mgmt)(struct ieee80211_node *,
struct mbuf *, int, int, int, u_int32_t);
int (*wv_newstate)(struct ieee80211vap *,
enum ieee80211_state, int);
};
#define WI_VAP(vap) ((struct wi_vap *)(vap))
struct wi_softc {
struct ifnet *sc_ifp;
struct ieee80211com sc_ic;
int (*sc_newstate)(struct ieee80211com *,
enum ieee80211_state, int);
int (*sc_key_alloc)(struct ieee80211com *,
const struct ieee80211_key *,
ieee80211_keyix *, ieee80211_keyix *);
device_t sc_dev;
struct mtx sc_mtx;
struct callout sc_watchdog;
struct task sc_oor_task;
int sc_unit;
int wi_gone;
int sc_enabled;
@ -104,33 +108,21 @@ struct wi_softc {
int wi_io_addr;
int wi_cmd_count;
struct bpf_if *sc_drvbpf;
int sc_flags;
int sc_if_flags;
int sc_bap_id;
int sc_bap_off;
u_int16_t sc_procframe;
int sc_porttype;
u_int16_t sc_portnum;
u_int16_t sc_encryption;
u_int16_t sc_monitor_port;
/* RSSI interpretation */
u_int16_t sc_min_rssi; /* clamp sc_min_rssi < RSSI */
u_int16_t sc_max_rssi; /* clamp RSSI < sc_max_rssi */
u_int16_t sc_dbm_offset; /* dBm ~ RSSI - sc_dbm_offset */
u_int16_t sc_max_datalen;
u_int16_t sc_system_scale;
u_int16_t sc_cnfauthmode;
u_int16_t sc_roaming_mode;
u_int16_t sc_microwave_oven;
u_int16_t sc_authtype;
u_int16_t sc_encryption;
int sc_nodelen;
char sc_nodename[IEEE80211_NWID_LEN];
char sc_net_name[IEEE80211_NWID_LEN];
uint8_t sc_hintmacaddr[IEEE80211_ADDR_LEN];
int sc_buflen; /* TX buffer size */
int sc_ntxbuf;
#define WI_NTXBUF 3
@ -141,74 +133,29 @@ struct wi_softc {
int sc_txnext; /* index of next TX */
int sc_txcur; /* index of current TX*/
int sc_tx_timer;
int sc_scan_timer;
struct wi_counters sc_stats;
u_int16_t sc_ibss_port;
#define WI_MAXAPINFO 30
struct wi_apinfo sc_aps[WI_MAXAPINFO];
int sc_naps;
struct {
u_int16_t wi_sleep;
u_int16_t wi_delaysupp;
u_int16_t wi_txsupp;
u_int16_t wi_monitor;
u_int16_t wi_ledtest;
u_int16_t wi_ledtest_param0;
u_int16_t wi_ledtest_param1;
u_int16_t wi_conttx;
u_int16_t wi_conttx_param0;
u_int16_t wi_contrx;
u_int16_t wi_sigstate;
u_int16_t wi_sigstate_param0;
u_int16_t wi_confbits;
u_int16_t wi_confbits_param0;
} wi_debug;
struct timeval sc_last_syn;
int sc_false_syns;
u_int16_t sc_txbuf[IEEE80211_MAX_LEN/2];
union {
struct wi_tx_radiotap_header th;
u_int8_t pad[64];
} u_tx_rt;
struct wi_tx_radiotap_header sc_tx_th;
int sc_tx_th_len;
union {
struct wi_rx_radiotap_header th;
u_int8_t pad[64];
} u_rx_rt;
struct wi_rx_radiotap_header sc_rx_th;
int sc_rx_th_len;
};
#define sc_tx_th u_tx_rt.th
#define sc_rx_th u_rx_rt.th
/* maximum consecutive false change-of-BSSID indications */
#define WI_MAX_FALSE_SYNS 10
#define WI_SCAN_INQWAIT 3 /* wait sec before inquire */
#define WI_SCAN_WAIT 5 /* maximum scan wait */
#define WI_FLAGS_ATTACHED 0x0001
#define WI_FLAGS_INITIALIZED 0x0002
#define WI_FLAGS_OUTRANGE 0x0004
#define WI_FLAGS_HAS_MOR 0x0010
#define WI_FLAGS_HAS_ENHSECURITY 0x0001
#define WI_FLAGS_HAS_WPASUPPORT 0x0002
#define WI_FLAGS_HAS_ROAMING 0x0020
#define WI_FLAGS_HAS_DIVERSITY 0x0040
#define WI_FLAGS_HAS_SYSSCALE 0x0080
#define WI_FLAGS_BUG_AUTOINC 0x0100
#define WI_FLAGS_HAS_FRAGTHR 0x0200
#define WI_FLAGS_HAS_DBMADJUST 0x0400
#define WI_FLAGS_SCANNING 0x0800
/* driver-specific node state */
struct wi_node {
struct ieee80211_node ni; /* base class */
};
struct wi_card_ident {
u_int16_t card_id;
@ -240,5 +187,4 @@ extern devclass_t wi_devclass;
void wi_init(void *);
void wi_intr(void *);
int wi_mgmt_xmit(struct wi_softc *, caddr_t, int);
void wi_stop(struct ifnet *, int);
int wi_symbol_load_firm(struct wi_softc *, const void *, int, const void *, int);
void wi_stop(struct wi_softc *, int);

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -110,6 +110,7 @@ struct wpi_node {
struct ieee80211_node ni; /* must be the first */
struct ieee80211_amrr_node amn;
};
#define WPI_NODE(ni) ((struct wpi_node *)(ni))
struct wpi_power_sample {
uint8_t index;
@ -118,26 +119,26 @@ struct wpi_power_sample {
struct wpi_power_group {
#define WPI_SAMPLES_COUNT 5
struct wpi_power_sample samples[WPI_SAMPLES_COUNT];
uint8_t chan;
int8_t maxpwr;
int16_t temp;
struct wpi_power_sample samples[WPI_SAMPLES_COUNT];
uint8_t chan;
int8_t maxpwr;
int16_t temp;
};
struct wpi_vap {
struct ieee80211vap vap;
struct ieee80211_amrr amrr;
int (*newstate)(struct ieee80211vap *,
enum ieee80211_state, int);
};
#define WPI_VAP(vap) ((struct wpi_vap *)(vap))
struct wpi_softc {
device_t sc_dev;
struct ifnet *sc_ifp;
/* net80211 driver specifics */
struct ieee80211com sc_ic;
int (*sc_newstate)(struct ieee80211com *,
enum ieee80211_state, int);
unsigned long maxdwell; /* Max dwell time whilst scanning */
struct mtx sc_mtx;
struct ieee80211_amrr amrr;
/* Flags indicating the current state the driver
* expects the hardware to be in
*/
@ -212,15 +213,15 @@ struct wpi_softc {
int sc_cmd_next; /* last queued scan task */
struct mtx sc_cmdlock;
/* Task queues used to control the driver */
struct taskqueue *sc_tq; /* Main command task queue */
struct taskqueue *sc_tq2;/* firmware reset task queue */
/* Task queues used to control the driver */
struct taskqueue *sc_tq; /* Main command task queue */
struct taskqueue *sc_tq2; /* firmware reset task queue */
/* Tasks used by the driver */
struct task sc_radioontask; /* enable rf transmitter task*/
struct task sc_radioofftask;/* disable rf transmitter task*/
struct task sc_opstask; /* operation handling task */
struct task sc_restarttask; /* reset firmware task */
/* Tasks used by the driver */
struct task sc_radioontask; /* enable rf transmitter task*/
struct task sc_radioofftask;/* disable rf transmitter task*/
struct task sc_opstask; /* operation handling task */
struct task sc_restarttask; /* reset firmware task */
/* Eeprom info */
uint8_t cap;
@ -228,7 +229,7 @@ struct wpi_softc {
uint8_t type;
struct wpi_power_group groups[WPI_POWER_GROUPS_COUNT];
int8_t maxpwr[IEEE80211_CHAN_MAX];
char domain[4]; //reglatory domain //XXX
char domain[4]; /*reglatory domain XXX */
};
#define WPI_LOCK_INIT(_sc) \
mtx_init(&(_sc)->sc_mtx, device_get_nameunit((_sc)->sc_dev), \
@ -236,7 +237,6 @@ struct wpi_softc {
#define WPI_LOCK(_sc) mtx_lock(&(_sc)->sc_mtx)
#define WPI_UNLOCK(_sc) mtx_unlock(&(_sc)->sc_mtx)
#define WPI_LOCK_ASSERT(sc) mtx_assert(&(sc)->sc_mtx, MA_OWNED)
#define WPI_LOCK_OWNED(_sc) mtx_owned(&(_sc)->sc_mtx)
#define WPI_LOCK_DESTROY(_sc) mtx_destroy(&(_sc)->sc_mtx)
#define WPI_CMD_LOCK_INIT(_sc) \

View File

@ -253,8 +253,6 @@ device wlan_wep # 802.11 WEP support
device wlan_ccmp # 802.11 CCMP support
device wlan_tkip # 802.11 TKIP support
device wlan_amrr # AMRR transmit rate control algorithm
device wlan_scan_ap # 802.11 AP mode scanning
device wlan_scan_sta # 802.11 STA mode scanning
device an # Aironet 4500/4800 802.11 wireless NICs.
device ath # Atheros pci/cardbus NIC's
device ath_hal # Atheros HAL (Hardware Access Layer)

View File

@ -46,8 +46,6 @@ device md
device wlan # 802.11 support
device wlan_wep # 802.11 WEP support
device wlan_tkip # 802.11 TKIP support
device wlan_scan_ap #802.11 AP mode scanning
device wlan_scan_sta #802.11 STA mode scanning
device ath # Atheros pci/cardbus NIC's
device ath_hal # Atheros HAL (Hardware Access Layer)
device ath_rate_sample # SampleRate tx rate control for ath

View File

@ -311,8 +311,7 @@ SUBDIR= ${_3dfx} \
wlan_acl \
wlan_amrr \
wlan_ccmp \
wlan_scan_ap \
wlan_scan_sta \
wlan_rssadapt \
wlan_tkip \
wlan_wep \
wlan_xauth \

View File

@ -40,7 +40,7 @@
KMOD= ath_rate
SRCS= amrr.c
SRCS+= device_if.h bus_if.h pci_if.h opt_inet.h opt_ah.h
SRCS+= device_if.h bus_if.h pci_if.h opt_inet.h opt_ah.h opt_wlan.h
HAL= ${.CURDIR}/../../contrib/dev/ath
CFLAGS+= -I. -I${.CURDIR}/../../dev/ath -I${HAL}
@ -56,7 +56,13 @@ ATH_MODULE_ARCH=powerpc-be
ATH_MODULE_ARCH=${MACHINE_ARCH}
.endif
.if !defined(KERNBUILDDIR)
opt_ah.h: ${HAL}/public/${ATH_MODULE_ARCH}-elf.opt_ah.h
cp ${HAL}/public/${ATH_MODULE_ARCH}-elf.opt_ah.h ${.TARGET}
opt_wlan.h:
# echo "#define IEEE80211_DEBUG 1" > opt_wlan.h
echo > opt_wlan.h
.endif
.include <bsd.kmod.mk>

View File

@ -40,7 +40,7 @@
KMOD= ath_rate
SRCS= onoe.c
SRCS+= device_if.h bus_if.h pci_if.h opt_inet.h opt_ah.h
SRCS+= device_if.h bus_if.h pci_if.h opt_inet.h opt_ah.h opt_wlan.h
HAL= ${.CURDIR}/../../contrib/dev/ath
CFLAGS+= -I. -I${.CURDIR}/../../dev/ath -I${HAL}
@ -56,7 +56,13 @@ ATH_MODULE_ARCH=powerpc-be
ATH_MODULE_ARCH=${MACHINE_ARCH}
.endif
.if !defined(KERNBUILDDIR)
opt_ah.h: ${HAL}/public/${ATH_MODULE_ARCH}-elf.opt_ah.h
cp ${HAL}/public/${ATH_MODULE_ARCH}-elf.opt_ah.h ${.TARGET}
opt_wlan.h:
echo "#define IEEE80211_DEBUG 1" > opt_wlan.h
# echo > opt_wlan.h
.endif
.include <bsd.kmod.mk>

View File

@ -40,7 +40,7 @@
KMOD= ath_rate
SRCS= sample.c
SRCS+= device_if.h bus_if.h pci_if.h opt_inet.h opt_ah.h
SRCS+= device_if.h bus_if.h pci_if.h opt_inet.h opt_ah.h opt_wlan.h
HAL= ${.CURDIR}/../../contrib/dev/ath
CFLAGS+= -I. -I${.CURDIR}/../../dev/ath -I${HAL}
@ -56,7 +56,13 @@ ATH_MODULE_ARCH=powerpc-be
ATH_MODULE_ARCH=${MACHINE_ARCH}
.endif
.if !defined(KERNBUILDDIR)
opt_ah.h: ${HAL}/public/${ATH_MODULE_ARCH}-elf.opt_ah.h
cp ${HAL}/public/${ATH_MODULE_ARCH}-elf.opt_ah.h ${.TARGET}
opt_wlan.h:
# echo "#define IEEE80211_DEBUG 1" > opt_wlan.h
echo > opt_wlan.h
.endif
.include <bsd.kmod.mk>

View File

@ -3,6 +3,10 @@
.PATH: ${.CURDIR}/../../dev/malo
KMOD = if_malo
SRCS = if_malo.c if_malohal.c if_malo_pci.c device_if.h bus_if.h pci_if.h
SRCS = if_malo.c if_malohal.c if_malo_pci.c
SRCS+= device_if.h bus_if.h pci_if.h opt_malo.h
opt_malo.h:
echo '#define MALO_DEBUG 1'> $@
.include <bsd.kmod.mk>

View File

@ -2,8 +2,8 @@
.PATH: ${.CURDIR}/../../dev/ral
KMOD = if_ral
SRCS = rt2560.c rt2661.c if_ralrate.c if_ral_pci.c \
device_if.h bus_if.h pci_if.h
KMOD= if_ral
SRCS= rt2560.c rt2661.c if_ral_pci.c
SRCS+= device_if.h bus_if.h pci_if.h
.include <bsd.kmod.mk>

View File

@ -0,0 +1,5 @@
# $FreeBSD$
SUBDIR= rt2561 rt2561s rt2661 rt2860
.include <bsd.subdir.mk>

View File

@ -0,0 +1,15 @@
# $FreeBSD$
#
# Common rules for building firmware. Note this gets auto-included
# by the subdir Makefile's as a consequence of included bsd.kmod.mk.
#
KMOD= ${IMG}fw
_FIRM= ${IMG}.fw
CLEANFILES+= ${_FIRM}
FIRMWS= ${_FIRM}:${KMOD}
${_FIRM}: ${.CURDIR}/../../../contrib/dev/ral/${_FIRM}.uu
uudecode -p $? > ${.TARGET}

View File

@ -0,0 +1,5 @@
# $FreeBSD$
IMG= rt2561
.include <bsd.kmod.mk>

View File

@ -0,0 +1,5 @@
# $FreeBSD$
IMG= rt2561s
.include <bsd.kmod.mk>

View File

@ -0,0 +1,6 @@
# $FreeBSD$
IMG= rt2661
.include <bsd.kmod.mk>

View File

@ -3,16 +3,18 @@
.PATH: ${.CURDIR}/../../net80211
KMOD= wlan
SRCS= ieee80211.c ieee80211_crypto.c ieee80211_crypto_none.c \
SRCS= ieee80211.c ieee80211_crypto.c ieee80211_crypto_none.c ieee80211_dfs.c \
ieee80211_freebsd.c ieee80211_input.c ieee80211_ioctl.c \
ieee80211_node.c ieee80211_output.c ieee80211_power.c \
ieee80211_proto.c ieee80211_scan.c ieee80211_regdomain.c \
ieee80211_ht.c
SRCS+= bus_if.h device_if.h opt_compat.h opt_inet.h opt_ipx.h
ieee80211_node.c ieee80211_output.c ieee80211_phy.c ieee80211_power.c \
ieee80211_proto.c ieee80211_scan.c ieee80211_scan_sta.c \
ieee80211_regdomain.c ieee80211_ht.c \
ieee80211_adhoc.c ieee80211_hostap.c ieee80211_monitor.c \
ieee80211_sta.c ieee80211_wds.c
SRCS+= bus_if.h device_if.h opt_inet.h opt_ipx.h opt_wlan.h
.if !defined(KERNBUILDDIR)
opt_compat.h:
echo "#define COMPAT_FREEBSD6 1" > ${.TARGET}
opt_wlan.h:
echo "#define IEEE80211_DEBUG 1" > opt_wlan.h
opt_inet.h:
echo "#define INET 1" > opt_inet.h

View File

@ -4,5 +4,11 @@
KMOD= wlan_acl
SRCS= ieee80211_acl.c
SRCS+= opt_wlan.h
.if !defined(KERNBUILDDIR)
opt_wlan.h:
echo "#define IEEE80211_DEBUG 1" > opt_wlan.h
.endif
.include <bsd.kmod.mk>

View File

@ -4,5 +4,11 @@
KMOD= wlan_amrr
SRCS= ieee80211_amrr.c
SRCS+= opt_wlan.h
.if !defined(KERNBUILDDIR)
opt_wlan.h:
echo "#define IEEE80211_DEBUG 1" > opt_wlan.h
.endif
.include <bsd.kmod.mk>

View File

@ -6,5 +6,11 @@
KMOD= wlan_ccmp
SRCS= ieee80211_crypto_ccmp.c
SRCS+= rijndael-alg-fst.c rijndael-api.c
SRCS+= opt_wlan.h
.if !defined(KERNBUILDDIR)
opt_wlan.h:
echo "#define IEEE80211_DEBUG 1" > opt_wlan.h
.endif
.include <bsd.kmod.mk>

View File

@ -0,0 +1,14 @@
# $FreeBSD$
.PATH: ${.CURDIR}/../../net80211
KMOD= wlan_rssadapt
SRCS= ieee80211_rssadapt.c
SRCS+= opt_wlan.h
.if !defined(KERNBUILDDIR)
opt_wlan.h:
echo "#define IEEE80211_DEBUG 1" > opt_wlan.h
.endif
.include <bsd.kmod.mk>

View File

@ -1,8 +0,0 @@
# $FreeBSD$
.PATH: ${.CURDIR}/../../net80211
KMOD= wlan_scan_ap
SRCS= ieee80211_scan_ap.c
.include <bsd.kmod.mk>

View File

@ -1,8 +0,0 @@
# $FreeBSD$
.PATH: ${.CURDIR}/../../net80211
KMOD= wlan_scan_sta
SRCS= ieee80211_scan_sta.c
.include <bsd.kmod.mk>

View File

@ -4,5 +4,11 @@
KMOD= wlan_tkip
SRCS= ieee80211_crypto_tkip.c
SRCS+= opt_wlan.h
.if !defined(KERNBUILDDIR)
opt_wlan.h:
echo "#define IEEE80211_DEBUG 1" > opt_wlan.h
.endif
.include <bsd.kmod.mk>

View File

@ -4,5 +4,11 @@
KMOD= wlan_wep
SRCS= ieee80211_crypto_wep.c
SRCS+= opt_wlan.h
.if !defined(KERNBUILDDIR)
opt_wlan.h:
echo "#define IEEE80211_DEBUG 1" > opt_wlan.h
.endif
.include <bsd.kmod.mk>

Some files were not shown because too many files have changed in this diff Show More