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:
parent
f446360711
commit
b032f27c36
@ -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
|
||||
|
@ -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
@ -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
636
sbin/ifconfig/regdomain.c
Normal 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
112
sbin/ifconfig/regdomain.h
Normal 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_ */
|
@ -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.
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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 .
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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 .
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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 .
|
||||
|
@ -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 ,
|
||||
|
@ -55,6 +55,7 @@ MAN= acct.5 \
|
||||
protocols.5 \
|
||||
quota.user.5 \
|
||||
rc.conf.5 \
|
||||
regdomain.5 \
|
||||
reiserfs.5 \
|
||||
remote.5 \
|
||||
resolver.5 \
|
||||
|
48
share/man/man5/regdomain.5
Normal file
48
share/man/man5/regdomain.5
Normal 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 ,
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
16
sys/contrib/dev/ral/LICENSE
Normal file
16
sys/contrib/dev/ral/LICENSE
Normal 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.
|
36
sys/contrib/dev/ral/Makefile
Normal file
36
sys/contrib/dev/ral/Makefile
Normal 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>
|
202
sys/contrib/dev/ral/rt2561.fw.uu
Normal file
202
sys/contrib/dev/ral/rt2561.fw.uu
Normal 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
|
202
sys/contrib/dev/ral/rt2561s.fw.uu
Normal file
202
sys/contrib/dev/ral/rt2561s.fw.uu
Normal 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
|
202
sys/contrib/dev/ral/rt2661.fw.uu
Normal file
202
sys/contrib/dev/ral/rt2661.fw.uu
Normal 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
|
@ -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
|
||||
};
|
202
sys/contrib/dev/ral/rt2860.fw.uu
Normal file
202
sys/contrib/dev/ral/rt2860.fw.uu
Normal 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____________________________________________________________
|
||||
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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
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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 */
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
2183
sys/dev/ath/if_ath.c
2183
sys/dev/ath/if_ath.c
File diff suppressed because it is too large
Load Diff
@ -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
|
||||
|
@ -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
|
||||
|
@ -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.
|
||||
|
@ -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
@ -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;
|
||||
|
1193
sys/dev/ipw/if_ipw.c
1193
sys/dev/ipw/if_ipw.c
File diff suppressed because it is too large
Load Diff
@ -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;
|
||||
};
|
||||
|
||||
|
1076
sys/dev/iwi/if_iwi.c
1076
sys/dev/iwi/if_iwi.c
File diff suppressed because it is too large
Load Diff
@ -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; \
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
1233
sys/dev/ral/rt2560.c
1233
sys/dev/ral/rt2560.c
File diff suppressed because it is too large
Load Diff
@ -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)
|
||||
|
@ -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)
|
||||
|
1287
sys/dev/ral/rt2661.c
1287
sys/dev/ral/rt2661.c
File diff suppressed because it is too large
Load Diff
@ -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
@ -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
@ -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;
|
||||
};
|
||||
|
||||
|
@ -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:
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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
|
||||
|
2859
sys/dev/wi/if_wi.c
2859
sys/dev/wi/if_wi.c
File diff suppressed because it is too large
Load Diff
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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
@ -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) \
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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 \
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
5
sys/modules/ralfw/Makefile
Normal file
5
sys/modules/ralfw/Makefile
Normal file
@ -0,0 +1,5 @@
|
||||
# $FreeBSD$
|
||||
|
||||
SUBDIR= rt2561 rt2561s rt2661 rt2860
|
||||
|
||||
.include <bsd.subdir.mk>
|
15
sys/modules/ralfw/Makefile.inc
Normal file
15
sys/modules/ralfw/Makefile.inc
Normal 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}
|
5
sys/modules/ralfw/rt2561/Makefile
Normal file
5
sys/modules/ralfw/rt2561/Makefile
Normal file
@ -0,0 +1,5 @@
|
||||
# $FreeBSD$
|
||||
|
||||
IMG= rt2561
|
||||
|
||||
.include <bsd.kmod.mk>
|
5
sys/modules/ralfw/rt2561s/Makefile
Normal file
5
sys/modules/ralfw/rt2561s/Makefile
Normal file
@ -0,0 +1,5 @@
|
||||
# $FreeBSD$
|
||||
|
||||
IMG= rt2561s
|
||||
|
||||
.include <bsd.kmod.mk>
|
6
sys/modules/ralfw/rt2661/Makefile
Normal file
6
sys/modules/ralfw/rt2661/Makefile
Normal file
@ -0,0 +1,6 @@
|
||||
# $FreeBSD$
|
||||
|
||||
IMG= rt2661
|
||||
|
||||
.include <bsd.kmod.mk>
|
||||
|
@ -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
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
14
sys/modules/wlan_rssadapt/Makefile
Normal file
14
sys/modules/wlan_rssadapt/Makefile
Normal 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>
|
@ -1,8 +0,0 @@
|
||||
# $FreeBSD$
|
||||
|
||||
.PATH: ${.CURDIR}/../../net80211
|
||||
|
||||
KMOD= wlan_scan_ap
|
||||
SRCS= ieee80211_scan_ap.c
|
||||
|
||||
.include <bsd.kmod.mk>
|
@ -1,8 +0,0 @@
|
||||
# $FreeBSD$
|
||||
|
||||
.PATH: ${.CURDIR}/../../net80211
|
||||
|
||||
KMOD= wlan_scan_sta
|
||||
SRCS= ieee80211_scan_sta.c
|
||||
|
||||
.include <bsd.kmod.mk>
|
@ -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>
|
||||
|
@ -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
Loading…
Reference in New Issue
Block a user