Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
cloud-kernel
提交
133189a4
cloud-kernel
项目概览
openanolis
/
cloud-kernel
1 年多 前同步成功
通知
160
Star
36
Fork
7
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
10
列表
看板
标记
里程碑
合并请求
2
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
cloud-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
10
Issue
10
列表
看板
标记
里程碑
合并请求
2
合并请求
2
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
133189a4
编写于
6月 22, 2012
作者:
J
John W. Linville
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'for-john' of
git://git.sipsolutions.net/mac80211-next
上级
f761b694
0f6b3f59
变更
23
隐藏空白更改
内联
并排
Showing
23 changed file
with
688 addition
and
334 deletion
+688
-334
include/linux/ieee80211.h
include/linux/ieee80211.h
+47
-3
include/linux/nl80211.h
include/linux/nl80211.h
+97
-53
include/net/cfg80211.h
include/net/cfg80211.h
+72
-20
net/mac80211/cfg.c
net/mac80211/cfg.c
+60
-15
net/mac80211/debugfs_netdev.c
net/mac80211/debugfs_netdev.c
+26
-17
net/mac80211/ibss.c
net/mac80211/ibss.c
+1
-1
net/mac80211/ieee80211_i.h
net/mac80211/ieee80211_i.h
+14
-5
net/mac80211/iface.c
net/mac80211/iface.c
+1
-1
net/mac80211/main.c
net/mac80211/main.c
+10
-1
net/mac80211/mesh.c
net/mac80211/mesh.c
+9
-3
net/mac80211/mesh.h
net/mac80211/mesh.h
+3
-1
net/mac80211/mesh_hwmp.c
net/mac80211/mesh_hwmp.c
+92
-34
net/mac80211/mlme.c
net/mac80211/mlme.c
+8
-8
net/mac80211/offchannel.c
net/mac80211/offchannel.c
+9
-11
net/mac80211/pm.c
net/mac80211/pm.c
+10
-0
net/mac80211/rx.c
net/mac80211/rx.c
+5
-1
net/mac80211/util.c
net/mac80211/util.c
+3
-0
net/mac80211/wme.c
net/mac80211/wme.c
+6
-5
net/mac80211/wme.h
net/mac80211/wme.h
+1
-1
net/wireless/core.c
net/wireless/core.c
+0
-63
net/wireless/core.h
net/wireless/core.h
+0
-26
net/wireless/mesh.c
net/wireless/mesh.c
+6
-0
net/wireless/nl80211.c
net/wireless/nl80211.c
+208
-65
未找到文件。
include/linux/ieee80211.h
浏览文件 @
133189a4
...
...
@@ -567,6 +567,26 @@ struct ieee80211s_hdr {
#define MESH_FLAGS_AE 0x3
#define MESH_FLAGS_PS_DEEP 0x4
/**
* enum ieee80211_preq_flags - mesh PREQ element flags
*
* @IEEE80211_PREQ_PROACTIVE_PREP_FLAG: proactive PREP subfield
*/
enum
ieee80211_preq_flags
{
IEEE80211_PREQ_PROACTIVE_PREP_FLAG
=
1
<<
2
,
};
/**
* enum ieee80211_preq_target_flags - mesh PREQ element per target flags
*
* @IEEE80211_PREQ_TO_FLAG: target only subfield
* @IEEE80211_PREQ_USN_FLAG: unknown target HWMP sequence number subfield
*/
enum
ieee80211_preq_target_flags
{
IEEE80211_PREQ_TO_FLAG
=
1
<<
0
,
IEEE80211_PREQ_USN_FLAG
=
1
<<
2
,
};
/**
* struct ieee80211_quiet_ie
*
...
...
@@ -1443,7 +1463,7 @@ enum ieee80211_tdls_actioncode {
*
* @IEEE80211_SYNC_METHOD_NEIGHBOR_OFFSET: the default synchronization method
* @IEEE80211_SYNC_METHOD_VENDOR: a vendor specific synchronization method
*
that will be specified in a vendor specific information element
*
that will be specified in a vendor specific information element
*/
enum
{
IEEE80211_SYNC_METHOD_NEIGHBOR_OFFSET
=
1
,
...
...
@@ -1455,7 +1475,7 @@ enum {
*
* @IEEE80211_PATH_PROTOCOL_HWMP: the default path selection protocol
* @IEEE80211_PATH_PROTOCOL_VENDOR: a vendor specific protocol that will
*
be specified in a vendor specific information element
*
be specified in a vendor specific information element
*/
enum
{
IEEE80211_PATH_PROTOCOL_HWMP
=
1
,
...
...
@@ -1467,13 +1487,35 @@ enum {
*
* @IEEE80211_PATH_METRIC_AIRTIME: the default path selection metric
* @IEEE80211_PATH_METRIC_VENDOR: a vendor specific metric that will be
*
specified in a vendor specific information element
*
specified in a vendor specific information element
*/
enum
{
IEEE80211_PATH_METRIC_AIRTIME
=
1
,
IEEE80211_PATH_METRIC_VENDOR
=
255
,
};
/**
* enum ieee80211_root_mode_identifier - root mesh STA mode identifier
*
* These attribute are used by dot11MeshHWMPRootMode to set root mesh STA mode
*
* @IEEE80211_ROOTMODE_NO_ROOT: the mesh STA is not a root mesh STA (default)
* @IEEE80211_ROOTMODE_ROOT: the mesh STA is a root mesh STA if greater than
* this value
* @IEEE80211_PROACTIVE_PREQ_NO_PREP: the mesh STA is a root mesh STA supports
* the proactive PREQ with proactive PREP subfield set to 0
* @IEEE80211_PROACTIVE_PREQ_WITH_PREP: the mesh STA is a root mesh STA
* supports the proactive PREQ with proactive PREP subfield set to 1
* @IEEE80211_PROACTIVE_RANN: the mesh STA is a root mesh STA supports
* the proactive RANN
*/
enum
ieee80211_root_mode_identifier
{
IEEE80211_ROOTMODE_NO_ROOT
=
0
,
IEEE80211_ROOTMODE_ROOT
=
1
,
IEEE80211_PROACTIVE_PREQ_NO_PREP
=
2
,
IEEE80211_PROACTIVE_PREQ_WITH_PREP
=
3
,
IEEE80211_PROACTIVE_RANN
=
4
,
};
/*
* IEEE 802.11-2007 7.3.2.9 Country information element
...
...
@@ -1589,6 +1631,8 @@ enum ieee80211_sa_query_action {
#define WLAN_OUI_WFA 0x506f9a
#define WLAN_OUI_TYPE_WFA_P2P 9
#define WLAN_OUI_MICROSOFT 0x0050f2
#define WLAN_OUI_TYPE_MICROSOFT_WPA 1
/*
* WMM/802.11e Tspec Element
...
...
include/linux/nl80211.h
浏览文件 @
133189a4
...
...
@@ -277,6 +277,12 @@
* @NL80211_CMD_NEW_SURVEY_RESULTS: survey data notification (as a reply to
* NL80211_CMD_GET_SURVEY and on the "scan" multicast group)
*
* @NL80211_CMD_SET_PMKSA: Add a PMKSA cache entry, using %NL80211_ATTR_MAC
* (for the BSSID) and %NL80211_ATTR_PMKID.
* @NL80211_CMD_DEL_PMKSA: Delete a PMKSA cache entry, using %NL80211_ATTR_MAC
* (for the BSSID) and %NL80211_ATTR_PMKID.
* @NL80211_CMD_FLUSH_PMKSA: Flush all PMKSA cache entries.
*
* @NL80211_CMD_REG_CHANGE: indicates to userspace the regulatory domain
* has been changed and provides details of the request information
* that caused the change such as who initiated the regulatory request
...
...
@@ -456,6 +462,10 @@
* the frame.
* @NL80211_CMD_ACTION_TX_STATUS: Alias for @NL80211_CMD_FRAME_TX_STATUS for
* backward compatibility.
*
* @NL80211_CMD_SET_POWER_SAVE: Set powersave, using %NL80211_ATTR_PS_STATE
* @NL80211_CMD_GET_POWER_SAVE: Get powersave status in %NL80211_ATTR_PS_STATE
*
* @NL80211_CMD_SET_CQM: Connection quality monitor configuration. This command
* is used to configure connection quality monitoring notification trigger
* levels.
...
...
@@ -771,6 +781,13 @@ enum nl80211_commands {
* section 7.3.2.25.1, e.g. 0x000FAC04)
* @NL80211_ATTR_KEY_SEQ: transmit key sequence number (IV/PN) for TKIP and
* CCMP keys, each six bytes in little endian
* @NL80211_ATTR_KEY_DEFAULT: Flag attribute indicating the key is default key
* @NL80211_ATTR_KEY_DEFAULT_MGMT: Flag attribute indicating the key is the
* default management key
* @NL80211_ATTR_CIPHER_SUITES_PAIRWISE: For crypto settings for connect or
* other commands, indicates which pairwise cipher suites are used
* @NL80211_ATTR_CIPHER_SUITE_GROUP: For crypto settings for connect or
* other commands, indicates which group cipher suite is used
*
* @NL80211_ATTR_BEACON_INTERVAL: beacon interval in TU
* @NL80211_ATTR_DTIM_PERIOD: DTIM period for beaconing
...
...
@@ -1006,6 +1023,8 @@ enum nl80211_commands {
* @NL80211_ATTR_ACK: Flag attribute indicating that the frame was
* acknowledged by the recipient.
*
* @NL80211_ATTR_PS_STATE: powersave state, using &enum nl80211_ps_state values.
*
* @NL80211_ATTR_CQM: connection quality monitor configuration in a
* nested attribute with %NL80211_ATTR_CQM_* sub-attributes.
*
...
...
@@ -1063,7 +1082,7 @@ enum nl80211_commands {
* flag isn't set, the frame will be rejected. This is also used as an
* nl80211 capability flag.
*
* @NL80211_ATTR_BSS_HTOPMODE: HT operation mode (u16)
* @NL80211_ATTR_BSS_HT
_
OPMODE: HT operation mode (u16)
*
* @NL80211_ATTR_KEY_DEFAULT_TYPES: A nested attribute containing flags
* attributes, specifying what a key should be set as default as.
...
...
@@ -1087,10 +1106,10 @@ enum nl80211_commands {
* indicate which WoW triggers should be enabled. This is also
* used by %NL80211_CMD_GET_WOWLAN to get the currently enabled WoWLAN
* triggers.
*
* @NL80211_ATTR_SCHED_SCAN_INTERVAL: Interval between scheduled scan
* cycles, in msecs.
*
* @NL80211_ATTR_SCHED_SCAN_MATCH: Nested attribute with one or more
* sets of attributes to match during scheduled scans. Only BSSs
* that match any of the sets will be reported. These are
...
...
@@ -1117,7 +1136,7 @@ enum nl80211_commands {
* are managed in software: interfaces of these types aren't subject to
* any restrictions in their number or combinations.
*
* @
%
NL80211_ATTR_REKEY_DATA: nested attribute containing the information
* @NL80211_ATTR_REKEY_DATA: nested attribute containing the information
* necessary for GTK rekeying in the device, see &enum nl80211_rekey_data.
*
* @NL80211_ATTR_SCAN_SUPP_RATES: rates per to be advertised as supported in scan,
...
...
@@ -1184,7 +1203,6 @@ enum nl80211_commands {
* @NL80211_ATTR_FEATURE_FLAGS: This u32 attribute contains flags from
* &enum nl80211_feature_flags and is advertised in wiphy information.
* @NL80211_ATTR_PROBE_RESP_OFFLOAD: Indicates that the HW responds to probe
*
* requests while operating in AP-mode.
* This attribute holds a bitmap of the supported protocols for
* offloading (see &enum nl80211_probe_resp_offload_support_attr).
...
...
@@ -1963,7 +1981,7 @@ enum nl80211_reg_rule_attr {
enum
nl80211_sched_scan_match_attr
{
__NL80211_SCHED_SCAN_MATCH_ATTR_INVALID
,
NL80211_
ATTR_SCHED_SCAN_MATCH
_SSID
,
NL80211_
SCHED_SCAN_MATCH_ATTR
_SSID
,
/* keep last */
__NL80211_SCHED_SCAN_MATCH_ATTR_AFTER_LAST
,
...
...
@@ -1971,6 +1989,9 @@ enum nl80211_sched_scan_match_attr {
__NL80211_SCHED_SCAN_MATCH_ATTR_AFTER_LAST
-
1
};
/* only for backward compatibility */
#define NL80211_ATTR_SCHED_SCAN_MATCH_SSID NL80211_SCHED_SCAN_MATCH_ATTR_SSID
/**
* enum nl80211_reg_rule_flags - regulatory rule flags
*
...
...
@@ -2090,78 +2111,91 @@ enum nl80211_mntr_flags {
* @__NL80211_MESHCONF_INVALID: internal use
*
* @NL80211_MESHCONF_RETRY_TIMEOUT: specifies the initial retry timeout in
*
millisecond units, used by the Peer Link Open message
*
millisecond units, used by the Peer Link Open message
*
* @NL80211_MESHCONF_CONFIRM_TIMEOUT: specifies the initial confirm timeout, in
*
millisecond units, used by the peer link management to close a peer link
*
millisecond units, used by the peer link management to close a peer link
*
* @NL80211_MESHCONF_HOLDING_TIMEOUT: specifies the holding timeout, in
*
millisecond units
*
millisecond units
*
* @NL80211_MESHCONF_MAX_PEER_LINKS: maximum number of peer links allowed
*
on this mesh interface
*
on this mesh interface
*
* @NL80211_MESHCONF_MAX_RETRIES: specifies the maximum number of peer link
*
open retries that can be sent to establish a new peer link instance in a
*
mesh
*
open retries that can be sent to establish a new peer link instance in a
*
mesh
*
* @NL80211_MESHCONF_TTL: specifies the value of TTL field set at a source mesh
*
point.
*
point.
*
* @NL80211_MESHCONF_AUTO_OPEN_PLINKS: whether we should automatically
*
open peer links when we detect compatible mesh peers.
*
open peer links when we detect compatible mesh peers.
*
* @NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES: the number of action frames
*
containing a PREQ that an MP can send to a particular destination (path
*
target)
*
containing a PREQ that an MP can send to a particular destination (path
*
target)
*
* @NL80211_MESHCONF_PATH_REFRESH_TIME: how frequently to refresh mesh paths
*
(in milliseconds)
*
(in milliseconds)
*
* @NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT: minimum length of time to wait
*
until giving up on a path discovery (in milliseconds)
*
until giving up on a path discovery (in milliseconds)
*
* @NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT: The time (in TUs) for which mesh
*
points receiving a PREQ shall consider the forwarding information from the
* root to be valid. (TU = time unit)
*
points receiving a PREQ shall consider the forwarding information from
*
the
root to be valid. (TU = time unit)
*
* @NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL: The minimum interval of time (in
*
TUs) during which an MP can send only one action frame containing a PREQ
*
reference element
*
TUs) during which an MP can send only one action frame containing a PREQ
*
reference element
*
* @NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME: The interval of time (in TUs)
* that it takes for an HWMP information element to propagate across the mesh
* that it takes for an HWMP information element to propagate across the
* mesh
*
* @NL80211_MESHCONF_HWMP_ROOTMODE: whether root mode is enabled or not
*
* @NL80211_MESHCONF_ELEMENT_TTL: specifies the value of TTL field set at a
*
source mesh point for path selection elements.
*
source mesh point for path selection elements.
*
* @NL80211_MESHCONF_HWMP_RANN_INTERVAL: The interval of time (in TUs) between
*
root announcements are transmitted.
*
root announcements are transmitted.
*
* @NL80211_MESHCONF_GATE_ANNOUNCEMENTS: Advertise that this mesh station has
*
access to a broader network beyond the MBSS. This is done via Root
*
Announcement frames.
*
access to a broader network beyond the MBSS. This is done via Root
*
Announcement frames.
*
* @NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL: The minimum interval of time (in
*
TUs) during which a mesh STA can send only one Action frame containing a
*
PERR element.
*
TUs) during which a mesh STA can send only one Action frame containing a
*
PERR element.
*
* @NL80211_MESHCONF_FORWARDING: set Mesh STA as forwarding or non-forwarding
*
or forwarding entity (default is TRUE - forwarding entity)
*
or forwarding entity (default is TRUE - forwarding entity)
*
* @NL80211_MESHCONF_RSSI_THRESHOLD: RSSI threshold in dBm. This specifies the
* threshold for average signal strength of candidate station to establish
* a peer link.
*
* @NL80211_MESHCONF_ATTR_MAX: highest possible mesh configuration attribute
* threshold for average signal strength of candidate station to establish
* a peer link.
*
* @NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR: maximum number of neighbors
* to synchronize to for 11s default synchronization method (see 11C.12.2.2)
* to synchronize to for 11s default synchronization method
* (see 11C.12.2.2)
*
* @NL80211_MESHCONF_HT_OPMODE: set mesh HT protection mode.
*
* @NL80211_MESHCONF_ATTR_MAX: highest possible mesh configuration attribute
*
* @NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT: The time (in TUs) for
* which mesh STAs receiving a proactive PREQ shall consider the forwarding
* information to the root mesh STA to be valid.
*
* @NL80211_MESHCONF_HWMP_ROOT_INTERVAL: The interval of time (in TUs) between
* proactive PREQs are transmitted.
*
* @NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL: The minimum interval of time
* (in TUs) during which a mesh STA can send only one Action frame
* containing a PREQ element for root path confirmation.
*
* @__NL80211_MESHCONF_ATTR_AFTER_LAST: internal use
*/
enum
nl80211_meshconf_params
{
...
...
@@ -2188,6 +2222,9 @@ enum nl80211_meshconf_params {
NL80211_MESHCONF_RSSI_THRESHOLD
,
NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR
,
NL80211_MESHCONF_HT_OPMODE
,
NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT
,
NL80211_MESHCONF_HWMP_ROOT_INTERVAL
,
NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL
,
/* keep last */
__NL80211_MESHCONF_ATTR_AFTER_LAST
,
...
...
@@ -2203,34 +2240,36 @@ enum nl80211_meshconf_params {
* @__NL80211_MESH_SETUP_INVALID: Internal use
*
* @NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL: Enable this option to use a
*
vendor specific path selection algorithm or disable it to use the default
* HWMP.
*
vendor specific path selection algorithm or disable it to use the
*
default
HWMP.
*
* @NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC: Enable this option to use a
*
vendor specific path metric or disable it to use the default Airtime
*
metric.
*
vendor specific path metric or disable it to use the default Airtime
*
metric.
*
* @NL80211_MESH_SETUP_IE: Information elements for this mesh, for instance, a
* robust security network ie, or a vendor specific information element that
* vendors will use to identify the path selection methods and metrics in use.
* robust security network ie, or a vendor specific information element
* that vendors will use to identify the path selection methods and
* metrics in use.
*
* @NL80211_MESH_SETUP_USERSPACE_AUTH: Enable this option if an authentication
*
daemon will be authenticating mesh candidates.
*
daemon will be authenticating mesh candidates.
*
* @NL80211_MESH_SETUP_USERSPACE_AMPE: Enable this option if an authentication
* daemon will be securing peer link frames. AMPE is a secured version of Mesh
* Peering Management (MPM) and is implemented with the assistance of a
* userspace daemon. When this flag is set, the kernel will send peer
* management frames to a userspace daemon that will implement AMPE
* functionality (security capabilities selection, key confirmation, and key
* management). When the flag is unset (default), the kernel can autonomously
* complete (unsecured) mesh peering without the need of a userspace daemon.
*
* @NL80211_MESH_SETUP_ATTR_MAX: highest possible mesh setup attribute number
* daemon will be securing peer link frames. AMPE is a secured version of
* Mesh Peering Management (MPM) and is implemented with the assistance of
* a userspace daemon. When this flag is set, the kernel will send peer
* management frames to a userspace daemon that will implement AMPE
* functionality (security capabilities selection, key confirmation, and
* key management). When the flag is unset (default), the kernel can
* autonomously complete (unsecured) mesh peering without the need of a
* userspace daemon.
*
* @NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC: Enable this option to use a
* vendor specific synchronization method or disable it to use the default
* neighbor offset synchronization
* vendor specific synchronization method or disable it to use the default
* neighbor offset synchronization
*
* @NL80211_MESH_SETUP_ATTR_MAX: highest possible mesh setup attribute number
*
* @__NL80211_MESH_SETUP_ATTR_AFTER_LAST: Internal use
*/
...
...
@@ -2500,6 +2539,11 @@ enum nl80211_band {
NL80211_BAND_5GHZ
,
};
/**
* enum nl80211_ps_state - powersave state
* @NL80211_PS_DISABLED: powersave is disabled
* @NL80211_PS_ENABLED: powersave is enabled
*/
enum
nl80211_ps_state
{
NL80211_PS_DISABLED
,
NL80211_PS_ENABLED
,
...
...
include/net/cfg80211.h
浏览文件 @
133189a4
...
...
@@ -627,10 +627,10 @@ struct sta_bss_parameters {
* @llid: mesh local link id
* @plid: mesh peer link id
* @plink_state: mesh peer link state
* @signal:
the signal strength, type depends on the wiphy's signal_type
NOTE:
For CFG80211_SIGNAL_TYPE_MBM, value is expressed in _dBm_.
* @signal_avg:
avg signal strength, type depends on the wiphy's signal_type
NOTE:
For CFG80211_SIGNAL_TYPE_MBM, value is expressed in _dBm_.
* @signal:
The signal strength, type depends on the wiphy's signal_type.
*
For CFG80211_SIGNAL_TYPE_MBM, value is expressed in _dBm_.
* @signal_avg:
Average signal strength, type depends on the wiphy's signal_type.
*
For CFG80211_SIGNAL_TYPE_MBM, value is expressed in _dBm_.
* @txrate: current unicast bitrate from this station
* @rxrate: current unicast bitrate to this station
* @rx_packets: packets received from this station
...
...
@@ -790,43 +790,95 @@ struct bss_parameters {
int
ht_opmode
;
};
/*
/*
*
* struct mesh_config - 802.11s mesh configuration
*
* These parameters can be changed while the mesh is active.
*
* @dot11MeshRetryTimeout: the initial retry timeout in millisecond units used
* by the Mesh Peering Open message
* @dot11MeshConfirmTimeout: the initial retry timeout in millisecond units
* used by the Mesh Peering Open message
* @dot11MeshHoldingTimeout: the confirm timeout in millisecond units used by
* the mesh peering management to close a mesh peering
* @dot11MeshMaxPeerLinks: the maximum number of peer links allowed on this
* mesh interface
* @dot11MeshMaxRetries: the maximum number of peer link open retries that can
* be sent to establish a new peer link instance in a mesh
* @dot11MeshTTL: the value of TTL field set at a source mesh STA
* @element_ttl: the value of TTL field set at a mesh STA for path selection
* elements
* @auto_open_plinks: whether we should automatically open peer links when we
* detect compatible mesh peers
* @dot11MeshNbrOffsetMaxNeighbor: the maximum number of neighbors to
* synchronize to for 11s default synchronization method
* @dot11MeshHWMPmaxPREQretries: the number of action frames containing a PREQ
* that an originator mesh STA can send to a particular path target
* @path_refresh_time: how frequently to refresh mesh paths in milliseconds
* @min_discovery_timeout: the minimum length of time to wait until giving up on
* a path discovery in milliseconds
* @dot11MeshHWMPactivePathTimeout: the time (in TUs) for which mesh STAs
* receiving a PREQ shall consider the forwarding information from the
* root to be valid. (TU = time unit)
* @dot11MeshHWMPpreqMinInterval: the minimum interval of time (in TUs) during
* which a mesh STA can send only one action frame containing a PREQ
* element
* @dot11MeshHWMPperrMinInterval: the minimum interval of time (in TUs) during
* which a mesh STA can send only one Action frame containing a PERR
* element
* @dot11MeshHWMPnetDiameterTraversalTime: the interval of time (in TUs) that
* it takes for an HWMP information element to propagate across the mesh
* @dot11MeshHWMPRootMode: the configuration of a mesh STA as root mesh STA
* @dot11MeshHWMPRannInterval: the interval of time (in TUs) between root
* announcements are transmitted
* @dot11MeshGateAnnouncementProtocol: whether to advertise that this mesh
* station has access to a broader network beyond the MBSS. (This is
* missnamed in draft 12.0: dot11MeshGateAnnouncementProtocol set to true
* only means that the station will announce others it's a mesh gate, but
* not necessarily using the gate announcement protocol. Still keeping the
* same nomenclature to be in sync with the spec)
* @dot11MeshForwarding: whether the Mesh STA is forwarding or non-forwarding
* entity (default is TRUE - forwarding entity)
* @rssi_threshold: the threshold for average signal strength of candidate
* station to establish a peer link
* @ht_opmode: mesh HT protection mode
*
* @dot11MeshHWMPactivePathToRootTimeout: The time (in TUs) for which mesh STAs
* receiving a proactive PREQ shall consider the forwarding information to
* the root mesh STA to be valid.
*
* @dot11MeshHWMProotInterval: The interval of time (in TUs) between proactive
* PREQs are transmitted.
* @dot11MeshHWMPconfirmationInterval: The minimum interval of time (in TUs)
* during which a mesh STA can send only one Action frame containing
* a PREQ element for root path confirmation.
*/
struct
mesh_config
{
/* Timeouts in ms */
/* Mesh plink management parameters */
u16
dot11MeshRetryTimeout
;
u16
dot11MeshConfirmTimeout
;
u16
dot11MeshHoldingTimeout
;
u16
dot11MeshMaxPeerLinks
;
u8
dot11MeshMaxRetries
;
u8
dot11MeshTTL
;
/* ttl used in path selection information elements */
u8
element_ttl
;
u8
dot11MeshMaxRetries
;
u8
dot11MeshTTL
;
u8
element_ttl
;
bool
auto_open_plinks
;
/* neighbor offset synchronization */
u32
dot11MeshNbrOffsetMaxNeighbor
;
/* HWMP parameters */
u8
dot11MeshHWMPmaxPREQretries
;
u8
dot11MeshHWMPmaxPREQretries
;
u32
path_refresh_time
;
u16
min_discovery_timeout
;
u32
dot11MeshHWMPactivePathTimeout
;
u16
dot11MeshHWMPpreqMinInterval
;
u16
dot11MeshHWMPperrMinInterval
;
u16
dot11MeshHWMPnetDiameterTraversalTime
;
u8
dot11MeshHWMPRootMode
;
u8
dot11MeshHWMPRootMode
;
u16
dot11MeshHWMPRannInterval
;
/* This is missnamed in draft 12.0: dot11MeshGateAnnouncementProtocol
* set to true only means that the station will announce others it's a
* mesh gate, but not necessarily using the gate announcement protocol.
* Still keeping the same nomenclature to be in sync with the spec. */
bool
dot11MeshGateAnnouncementProtocol
;
bool
dot11MeshGateAnnouncementProtocol
;
bool
dot11MeshForwarding
;
s32
rssi_threshold
;
u16
ht_opmode
;
u32
dot11MeshHWMPactivePathToRootTimeout
;
u16
dot11MeshHWMProotInterval
;
u16
dot11MeshHWMPconfirmationInterval
;
};
/**
...
...
net/mac80211/cfg.c
浏览文件 @
133189a4
...
...
@@ -689,7 +689,8 @@ static int ieee80211_set_channel(struct wiphy *wiphy,
case
CHAN_MODE_HOPPING
:
return
-
EBUSY
;
case
CHAN_MODE_FIXED
:
if
(
local
->
oper_channel
!=
chan
)
if
(
local
->
oper_channel
!=
chan
||
(
!
sdata
&&
local
->
_oper_channel_type
!=
channel_type
))
return
-
EBUSY
;
if
(
!
sdata
&&
local
->
_oper_channel_type
==
channel_type
)
return
0
;
...
...
@@ -1529,7 +1530,7 @@ static int ieee80211_update_mesh_config(struct wiphy *wiphy,
if
(
_chg_mesh_attr
(
NL80211_MESHCONF_TTL
,
mask
))
conf
->
dot11MeshTTL
=
nconf
->
dot11MeshTTL
;
if
(
_chg_mesh_attr
(
NL80211_MESHCONF_ELEMENT_TTL
,
mask
))
conf
->
dot11MeshTTL
=
nconf
->
element_ttl
;
conf
->
element_ttl
=
nconf
->
element_ttl
;
if
(
_chg_mesh_attr
(
NL80211_MESHCONF_AUTO_OPEN_PLINKS
,
mask
))
conf
->
auto_open_plinks
=
nconf
->
auto_open_plinks
;
if
(
_chg_mesh_attr
(
NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR
,
mask
))
...
...
@@ -1564,17 +1565,16 @@ static int ieee80211_update_mesh_config(struct wiphy *wiphy,
* announcements, so require this ifmsh to also be a root node
* */
if
(
nconf
->
dot11MeshGateAnnouncementProtocol
&&
!
conf
->
dot11MeshHWMPRootMode
)
{
conf
->
dot11MeshHWMPRootMode
=
1
;
!
(
conf
->
dot11MeshHWMPRootMode
>
IEEE80211_ROOTMODE_ROOT
)
)
{
conf
->
dot11MeshHWMPRootMode
=
IEEE80211_PROACTIVE_RANN
;
ieee80211_mesh_root_setup
(
ifmsh
);
}
conf
->
dot11MeshGateAnnouncementProtocol
=
nconf
->
dot11MeshGateAnnouncementProtocol
;
}
if
(
_chg_mesh_attr
(
NL80211_MESHCONF_HWMP_RANN_INTERVAL
,
mask
))
{
if
(
_chg_mesh_attr
(
NL80211_MESHCONF_HWMP_RANN_INTERVAL
,
mask
))
conf
->
dot11MeshHWMPRannInterval
=
nconf
->
dot11MeshHWMPRannInterval
;
}
if
(
_chg_mesh_attr
(
NL80211_MESHCONF_FORWARDING
,
mask
))
conf
->
dot11MeshForwarding
=
nconf
->
dot11MeshForwarding
;
if
(
_chg_mesh_attr
(
NL80211_MESHCONF_RSSI_THRESHOLD
,
mask
))
{
...
...
@@ -1590,6 +1590,15 @@ static int ieee80211_update_mesh_config(struct wiphy *wiphy,
sdata
->
vif
.
bss_conf
.
ht_operation_mode
=
nconf
->
ht_opmode
;
ieee80211_bss_info_change_notify
(
sdata
,
BSS_CHANGED_HT
);
}
if
(
_chg_mesh_attr
(
NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT
,
mask
))
conf
->
dot11MeshHWMPactivePathToRootTimeout
=
nconf
->
dot11MeshHWMPactivePathToRootTimeout
;
if
(
_chg_mesh_attr
(
NL80211_MESHCONF_HWMP_ROOT_INTERVAL
,
mask
))
conf
->
dot11MeshHWMProotInterval
=
nconf
->
dot11MeshHWMProotInterval
;
if
(
_chg_mesh_attr
(
NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL
,
mask
))
conf
->
dot11MeshHWMPconfirmationInterval
=
nconf
->
dot11MeshHWMPconfirmationInterval
;
return
0
;
}
...
...
@@ -2309,6 +2318,21 @@ static int ieee80211_cancel_roc(struct ieee80211_local *local,
mutex_lock
(
&
local
->
mtx
);
list_for_each_entry_safe
(
roc
,
tmp
,
&
local
->
roc_list
,
list
)
{
struct
ieee80211_roc_work
*
dep
,
*
tmp2
;
list_for_each_entry_safe
(
dep
,
tmp2
,
&
roc
->
dependents
,
list
)
{
if
(
!
mgmt_tx
&&
(
unsigned
long
)
dep
!=
cookie
)
continue
;
else
if
(
mgmt_tx
&&
dep
->
mgmt_tx_cookie
!=
cookie
)
continue
;
/* found dependent item -- just remove it */
list_del
(
&
dep
->
list
);
mutex_unlock
(
&
local
->
mtx
);
ieee80211_roc_notify_destroy
(
dep
);
return
0
;
}
if
(
!
mgmt_tx
&&
(
unsigned
long
)
roc
!=
cookie
)
continue
;
else
if
(
mgmt_tx
&&
roc
->
mgmt_tx_cookie
!=
cookie
)
...
...
@@ -2323,6 +2347,13 @@ static int ieee80211_cancel_roc(struct ieee80211_local *local,
return
-
ENOENT
;
}
/*
* We found the item to cancel, so do that. Note that it
* may have dependents, which we also cancel (and send
* the expired signal for.) Not doing so would be quite
* tricky here, but we may need to fix it later.
*/
if
(
local
->
ops
->
remain_on_channel
)
{
if
(
found
->
started
)
{
ret
=
drv_cancel_remain_on_channel
(
local
);
...
...
@@ -2334,8 +2365,8 @@ static int ieee80211_cancel_roc(struct ieee80211_local *local,
list_del
(
&
found
->
list
);
i
eee80211_run_deferred_scan
(
local
);
ieee80211_start_next_roc
(
local
);
i
f
(
found
->
started
)
ieee80211_start_next_roc
(
local
);
mutex_unlock
(
&
local
->
mtx
);
ieee80211_roc_notify_destroy
(
found
);
...
...
@@ -2489,16 +2520,30 @@ static void ieee80211_mgmt_frame_register(struct wiphy *wiphy,
u16
frame_type
,
bool
reg
)
{
struct
ieee80211_local
*
local
=
wiphy_priv
(
wiphy
);
struct
ieee80211_sub_if_data
*
sdata
=
IEEE80211_DEV_TO_SUB_IF
(
dev
);
if
(
frame_type
!=
(
IEEE80211_FTYPE_MGMT
|
IEEE80211_STYPE_PROBE_REQ
))
return
;
switch
(
frame_type
)
{
case
IEEE80211_FTYPE_MGMT
|
IEEE80211_STYPE_AUTH
:
if
(
sdata
->
vif
.
type
==
NL80211_IFTYPE_ADHOC
)
{
struct
ieee80211_if_ibss
*
ifibss
=
&
sdata
->
u
.
ibss
;
if
(
reg
)
local
->
probe_req_reg
++
;
else
local
->
probe_req_reg
--
;
if
(
reg
)
ifibss
->
auth_frame_registrations
++
;
else
ifibss
->
auth_frame_registrations
--
;
}
break
;
case
IEEE80211_FTYPE_MGMT
|
IEEE80211_STYPE_PROBE_REQ
:
if
(
reg
)
local
->
probe_req_reg
++
;
else
local
->
probe_req_reg
--
;
ieee80211_queue_work
(
&
local
->
hw
,
&
local
->
reconfig_filter
);
ieee80211_queue_work
(
&
local
->
hw
,
&
local
->
reconfig_filter
);
break
;
default:
break
;
}
}
static
int
ieee80211_set_antenna
(
struct
wiphy
*
wiphy
,
u32
tx_ant
,
u32
rx_ant
)
...
...
net/mac80211/debugfs_netdev.c
浏览文件 @
133189a4
...
...
@@ -468,48 +468,54 @@ IEEE80211_IF_FILE(fwded_unicast, u.mesh.mshstats.fwded_unicast, DEC);
IEEE80211_IF_FILE
(
fwded_frames
,
u
.
mesh
.
mshstats
.
fwded_frames
,
DEC
);
IEEE80211_IF_FILE
(
dropped_frames_ttl
,
u
.
mesh
.
mshstats
.
dropped_frames_ttl
,
DEC
);
IEEE80211_IF_FILE
(
dropped_frames_congestion
,
u
.
mesh
.
mshstats
.
dropped_frames_congestion
,
DEC
);
u
.
mesh
.
mshstats
.
dropped_frames_congestion
,
DEC
);
IEEE80211_IF_FILE
(
dropped_frames_no_route
,
u
.
mesh
.
mshstats
.
dropped_frames_no_route
,
DEC
);
u
.
mesh
.
mshstats
.
dropped_frames_no_route
,
DEC
);
IEEE80211_IF_FILE
(
estab_plinks
,
u
.
mesh
.
mshstats
.
estab_plinks
,
ATOMIC
);
/* Mesh parameters */
IEEE80211_IF_FILE
(
dot11MeshMaxRetries
,
u
.
mesh
.
mshcfg
.
dot11MeshMaxRetries
,
DEC
);
u
.
mesh
.
mshcfg
.
dot11MeshMaxRetries
,
DEC
);
IEEE80211_IF_FILE
(
dot11MeshRetryTimeout
,
u
.
mesh
.
mshcfg
.
dot11MeshRetryTimeout
,
DEC
);
u
.
mesh
.
mshcfg
.
dot11MeshRetryTimeout
,
DEC
);
IEEE80211_IF_FILE
(
dot11MeshConfirmTimeout
,
u
.
mesh
.
mshcfg
.
dot11MeshConfirmTimeout
,
DEC
);
u
.
mesh
.
mshcfg
.
dot11MeshConfirmTimeout
,
DEC
);
IEEE80211_IF_FILE
(
dot11MeshHoldingTimeout
,
u
.
mesh
.
mshcfg
.
dot11MeshHoldingTimeout
,
DEC
);
u
.
mesh
.
mshcfg
.
dot11MeshHoldingTimeout
,
DEC
);
IEEE80211_IF_FILE
(
dot11MeshTTL
,
u
.
mesh
.
mshcfg
.
dot11MeshTTL
,
DEC
);
IEEE80211_IF_FILE
(
element_ttl
,
u
.
mesh
.
mshcfg
.
element_ttl
,
DEC
);
IEEE80211_IF_FILE
(
auto_open_plinks
,
u
.
mesh
.
mshcfg
.
auto_open_plinks
,
DEC
);
IEEE80211_IF_FILE
(
dot11MeshMaxPeerLinks
,
u
.
mesh
.
mshcfg
.
dot11MeshMaxPeerLinks
,
DEC
);
u
.
mesh
.
mshcfg
.
dot11MeshMaxPeerLinks
,
DEC
);
IEEE80211_IF_FILE
(
dot11MeshHWMPactivePathTimeout
,
u
.
mesh
.
mshcfg
.
dot11MeshHWMPactivePathTimeout
,
DEC
);
u
.
mesh
.
mshcfg
.
dot11MeshHWMPactivePathTimeout
,
DEC
);
IEEE80211_IF_FILE
(
dot11MeshHWMPpreqMinInterval
,
u
.
mesh
.
mshcfg
.
dot11MeshHWMPpreqMinInterval
,
DEC
);
u
.
mesh
.
mshcfg
.
dot11MeshHWMPpreqMinInterval
,
DEC
);
IEEE80211_IF_FILE
(
dot11MeshHWMPperrMinInterval
,
u
.
mesh
.
mshcfg
.
dot11MeshHWMPperrMinInterval
,
DEC
);
u
.
mesh
.
mshcfg
.
dot11MeshHWMPperrMinInterval
,
DEC
);
IEEE80211_IF_FILE
(
dot11MeshHWMPnetDiameterTraversalTime
,
u
.
mesh
.
mshcfg
.
dot11MeshHWMPnetDiameterTraversalTime
,
DEC
);
u
.
mesh
.
mshcfg
.
dot11MeshHWMPnetDiameterTraversalTime
,
DEC
);
IEEE80211_IF_FILE
(
dot11MeshHWMPmaxPREQretries
,
u
.
mesh
.
mshcfg
.
dot11MeshHWMPmaxPREQretries
,
DEC
);
u
.
mesh
.
mshcfg
.
dot11MeshHWMPmaxPREQretries
,
DEC
);
IEEE80211_IF_FILE
(
path_refresh_time
,
u
.
mesh
.
mshcfg
.
path_refresh_time
,
DEC
);
u
.
mesh
.
mshcfg
.
path_refresh_time
,
DEC
);
IEEE80211_IF_FILE
(
min_discovery_timeout
,
u
.
mesh
.
mshcfg
.
min_discovery_timeout
,
DEC
);
u
.
mesh
.
mshcfg
.
min_discovery_timeout
,
DEC
);
IEEE80211_IF_FILE
(
dot11MeshHWMPRootMode
,
u
.
mesh
.
mshcfg
.
dot11MeshHWMPRootMode
,
DEC
);
u
.
mesh
.
mshcfg
.
dot11MeshHWMPRootMode
,
DEC
);
IEEE80211_IF_FILE
(
dot11MeshGateAnnouncementProtocol
,
u
.
mesh
.
mshcfg
.
dot11MeshGateAnnouncementProtocol
,
DEC
);
u
.
mesh
.
mshcfg
.
dot11MeshGateAnnouncementProtocol
,
DEC
);
IEEE80211_IF_FILE
(
dot11MeshHWMPRannInterval
,
u
.
mesh
.
mshcfg
.
dot11MeshHWMPRannInterval
,
DEC
);
u
.
mesh
.
mshcfg
.
dot11MeshHWMPRannInterval
,
DEC
);
IEEE80211_IF_FILE
(
dot11MeshForwarding
,
u
.
mesh
.
mshcfg
.
dot11MeshForwarding
,
DEC
);
IEEE80211_IF_FILE
(
rssi_threshold
,
u
.
mesh
.
mshcfg
.
rssi_threshold
,
DEC
);
IEEE80211_IF_FILE
(
ht_opmode
,
u
.
mesh
.
mshcfg
.
ht_opmode
,
DEC
);
IEEE80211_IF_FILE
(
dot11MeshHWMPactivePathToRootTimeout
,
u
.
mesh
.
mshcfg
.
dot11MeshHWMPactivePathToRootTimeout
,
DEC
);
IEEE80211_IF_FILE
(
dot11MeshHWMProotInterval
,
u
.
mesh
.
mshcfg
.
dot11MeshHWMProotInterval
,
DEC
);
IEEE80211_IF_FILE
(
dot11MeshHWMPconfirmationInterval
,
u
.
mesh
.
mshcfg
.
dot11MeshHWMPconfirmationInterval
,
DEC
);
#endif
#define DEBUGFS_ADD_MODE(name, mode) \
...
...
@@ -611,6 +617,9 @@ static void add_mesh_config(struct ieee80211_sub_if_data *sdata)
MESHPARAMS_ADD
(
dot11MeshGateAnnouncementProtocol
);
MESHPARAMS_ADD
(
rssi_threshold
);
MESHPARAMS_ADD
(
ht_opmode
);
MESHPARAMS_ADD
(
dot11MeshHWMPactivePathToRootTimeout
);
MESHPARAMS_ADD
(
dot11MeshHWMProotInterval
);
MESHPARAMS_ADD
(
dot11MeshHWMPconfirmationInterval
);
#undef MESHPARAMS_ADD
}
#endif
...
...
net/mac80211/ibss.c
浏览文件 @
133189a4
...
...
@@ -279,7 +279,7 @@ static struct sta_info *ieee80211_ibss_finish_sta(struct sta_info *sta,
/* If it fails, maybe we raced another insertion? */
if
(
sta_info_insert_rcu
(
sta
))
return
sta_info_get
(
sdata
,
addr
);
if
(
auth
)
{
if
(
auth
&&
!
sdata
->
u
.
ibss
.
auth_frame_registrations
)
{
ibss_vdbg
(
"TX Auth SA=%pM DA=%pM BSSID=%pM (auth_transaction=1)
\n
"
,
sdata
->
vif
.
addr
,
sdata
->
u
.
ibss
.
bssid
,
addr
);
ieee80211_send_auth
(
sdata
,
1
,
WLAN_AUTH_OPEN
,
NULL
,
0
,
...
...
net/mac80211/ieee80211_i.h
浏览文件 @
133189a4
...
...
@@ -55,11 +55,14 @@ struct ieee80211_local;
#define TU_TO_JIFFIES(x) (usecs_to_jiffies((x) * 1024))
#define TU_TO_EXP_TIME(x) (jiffies + TU_TO_JIFFIES(x))
/*
* Some APs experience problems when working with U-APSD. Decrease the
* probability of that happening by using legacy mode for all ACs but VO.
* The AP that caused us trouble was a Cisco 4410N. It ignores our
* setting, and always treats non-VO ACs as legacy.
*/
#define IEEE80211_DEFAULT_UAPSD_QUEUES \
(IEEE80211_WMM_IE_STA_QOSINFO_AC_BK | \
IEEE80211_WMM_IE_STA_QOSINFO_AC_BE | \
IEEE80211_WMM_IE_STA_QOSINFO_AC_VI | \
IEEE80211_WMM_IE_STA_QOSINFO_AC_VO)
IEEE80211_WMM_IE_STA_QOSINFO_AC_VO
#define IEEE80211_DEFAULT_MAX_SP_LEN \
IEEE80211_WMM_IE_STA_QOSINFO_SP_ALL
...
...
@@ -508,6 +511,7 @@ struct ieee80211_if_ibss {
bool
privacy
;
bool
control_port
;
unsigned
int
auth_frame_registrations
;
u8
bssid
[
ETH_ALEN
]
__aligned
(
2
);
u8
ssid
[
IEEE80211_MAX_SSID_LEN
];
...
...
@@ -677,6 +681,9 @@ struct ieee80211_sub_if_data {
/* TID bitmap for NoAck policy */
u16
noack_map
;
/* bit field of ACM bits (BIT(802.1D tag)) */
u8
wmm_acm
;
struct
ieee80211_key
__rcu
*
keys
[
NUM_DEFAULT_KEYS
+
NUM_DEFAULT_MGMT_KEYS
];
struct
ieee80211_key
__rcu
*
default_unicast_key
;
struct
ieee80211_key
__rcu
*
default_multicast_key
;
...
...
@@ -881,6 +888,9 @@ struct ieee80211_local {
/* device is started */
bool
started
;
/* device is during a HW reconfig */
bool
in_reconfig
;
/* wowlan is enabled -- don't reconfig on resume */
bool
wowlan
;
...
...
@@ -1019,7 +1029,6 @@ struct ieee80211_local {
int
total_ps_buffered
;
/* total number of all buffered unicast and
* multicast packets for power saving stations
*/
unsigned
int
wmm_acm
;
/* bit field of ACM bits (BIT(802.1D tag)) */
bool
pspolling
;
bool
offchannel_ps_enabled
;
...
...
net/mac80211/iface.c
浏览文件 @
133189a4
...
...
@@ -808,7 +808,7 @@ static u16 ieee80211_monitor_select_queue(struct net_device *dev,
hdr
=
(
void
*
)((
u8
*
)
skb
->
data
+
le16_to_cpu
(
rtap
->
it_len
));
return
ieee80211_select_queue_80211
(
local
,
skb
,
hdr
);
return
ieee80211_select_queue_80211
(
sdata
,
skb
,
hdr
);
}
static
const
struct
net_device_ops
ieee80211_monitorif_ops
=
{
...
...
net/mac80211/main.c
浏览文件 @
133189a4
...
...
@@ -345,6 +345,13 @@ void ieee80211_restart_hw(struct ieee80211_hw *hw)
ieee80211_stop_queues_by_reason
(
hw
,
IEEE80211_QUEUE_STOP_REASON_SUSPEND
);
/*
* Stop all Rx during the reconfig. We don't want state changes
* or driver callbacks while this is in progress.
*/
local
->
in_reconfig
=
true
;
barrier
();
schedule_work
(
&
local
->
restart_work
);
}
EXPORT_SYMBOL
(
ieee80211_restart_hw
);
...
...
@@ -455,7 +462,9 @@ static const struct ieee80211_txrx_stypes
ieee80211_default_mgmt_stypes
[
NUM_NL80211_IFTYPES
]
=
{
[
NL80211_IFTYPE_ADHOC
]
=
{
.
tx
=
0xffff
,
.
rx
=
BIT
(
IEEE80211_STYPE_ACTION
>>
4
),
.
rx
=
BIT
(
IEEE80211_STYPE_ACTION
>>
4
)
|
BIT
(
IEEE80211_STYPE_AUTH
>>
4
)
|
BIT
(
IEEE80211_STYPE_DEAUTH
>>
4
),
},
[
NL80211_IFTYPE_STATION
]
=
{
.
tx
=
0xffff
,
...
...
net/mac80211/mesh.c
浏览文件 @
133189a4
...
...
@@ -443,7 +443,7 @@ static void ieee80211_mesh_path_root_timer(unsigned long data)
void
ieee80211_mesh_root_setup
(
struct
ieee80211_if_mesh
*
ifmsh
)
{
if
(
ifmsh
->
mshcfg
.
dot11MeshHWMPRootMode
)
if
(
ifmsh
->
mshcfg
.
dot11MeshHWMPRootMode
>
IEEE80211_ROOTMODE_ROOT
)
set_bit
(
MESH_WORK_ROOT
,
&
ifmsh
->
wrkq_flags
);
else
{
clear_bit
(
MESH_WORK_ROOT
,
&
ifmsh
->
wrkq_flags
);
...
...
@@ -541,11 +541,17 @@ static void ieee80211_mesh_housekeeping(struct ieee80211_sub_if_data *sdata,
static
void
ieee80211_mesh_rootpath
(
struct
ieee80211_sub_if_data
*
sdata
)
{
struct
ieee80211_if_mesh
*
ifmsh
=
&
sdata
->
u
.
mesh
;
u32
interval
;
mesh_path_tx_root_frame
(
sdata
);
if
(
ifmsh
->
mshcfg
.
dot11MeshHWMPRootMode
==
IEEE80211_PROACTIVE_RANN
)
interval
=
ifmsh
->
mshcfg
.
dot11MeshHWMPRannInterval
;
else
interval
=
ifmsh
->
mshcfg
.
dot11MeshHWMProotInterval
;
mod_timer
(
&
ifmsh
->
mesh_path_root_timer
,
round_jiffies
(
TU_TO_EXP_TIME
(
ifmsh
->
mshcfg
.
dot11MeshHWMPRannInterval
)));
round_jiffies
(
TU_TO_EXP_TIME
(
interval
)));
}
#ifdef CONFIG_PM
...
...
net/mac80211/mesh.h
浏览文件 @
133189a4
...
...
@@ -104,6 +104,7 @@ enum mesh_deferred_task_flags {
* an mpath to a hash bucket on a path table.
* @rann_snd_addr: the RANN sender address
* @rann_metric: the aggregated path metric towards the root node
* @last_preq_to_root: Timestamp of last PREQ sent to root
* @is_root: the destination station of this path is a root node
* @is_gate: the destination station of this path is a mesh gate
*
...
...
@@ -131,6 +132,7 @@ struct mesh_path {
spinlock_t
state_lock
;
u8
rann_snd_addr
[
ETH_ALEN
];
u32
rann_metric
;
unsigned
long
last_preq_to_root
;
bool
is_root
;
bool
is_gate
;
};
...
...
@@ -245,7 +247,7 @@ void mesh_rmc_free(struct ieee80211_sub_if_data *sdata);
int
mesh_rmc_init
(
struct
ieee80211_sub_if_data
*
sdata
);
void
ieee80211s_init
(
void
);
void
ieee80211s_update_metric
(
struct
ieee80211_local
*
local
,
struct
sta_info
*
sta
info
,
struct
sk_buff
*
skb
);
struct
sta_info
*
sta
,
struct
sk_buff
*
skb
);
void
ieee80211s_stop
(
void
);
void
ieee80211_mesh_init_sdata
(
struct
ieee80211_sub_if_data
*
sdata
);
void
ieee80211_start_mesh
(
struct
ieee80211_sub_if_data
*
sdata
);
...
...
net/mac80211/mesh_hwmp.c
浏览文件 @
133189a4
...
...
@@ -98,6 +98,8 @@ static inline u32 u16_field_get(u8 *preq_elem, int offset, bool ae)
#define max_preq_retries(s) (s->u.mesh.mshcfg.dot11MeshHWMPmaxPREQretries)
#define disc_timeout_jiff(s) \
msecs_to_jiffies(sdata->u.mesh.mshcfg.min_discovery_timeout)
#define root_path_confirmation_jiffies(s) \
msecs_to_jiffies(sdata->u.mesh.mshcfg.dot11MeshHWMPconfirmationInterval)
enum
mpath_frame_type
{
MPATH_PREQ
=
0
,
...
...
@@ -303,7 +305,7 @@ int mesh_path_error_tx(u8 ttl, u8 *target, __le32 target_sn,
}
void
ieee80211s_update_metric
(
struct
ieee80211_local
*
local
,
struct
sta_info
*
sta
info
,
struct
sk_buff
*
skb
)
struct
sta_info
*
sta
,
struct
sk_buff
*
skb
)
{
struct
ieee80211_tx_info
*
txinfo
=
IEEE80211_SKB_CB
(
skb
);
struct
ieee80211_hdr
*
hdr
=
(
struct
ieee80211_hdr
*
)
skb
->
data
;
...
...
@@ -315,15 +317,14 @@ void ieee80211s_update_metric(struct ieee80211_local *local,
failed
=
!
(
txinfo
->
flags
&
IEEE80211_TX_STAT_ACK
);
/* moving average, scaled to 100 */
sta
info
->
fail_avg
=
((
80
*
stainfo
->
fail_avg
+
5
)
/
100
+
20
*
failed
);
if
(
sta
info
->
fail_avg
>
95
)
mesh_plink_broken
(
sta
info
);
sta
->
fail_avg
=
((
80
*
sta
->
fail_avg
+
5
)
/
100
+
20
*
failed
);
if
(
sta
->
fail_avg
>
95
)
mesh_plink_broken
(
sta
);
}
static
u32
airtime_link_metric_get
(
struct
ieee80211_local
*
local
,
struct
sta_info
*
sta
)
{
struct
ieee80211_supported_band
*
sband
;
struct
rate_info
rinfo
;
/* This should be adjusted for each device */
int
device_constant
=
1
<<
ARITH_SHIFT
;
...
...
@@ -333,8 +334,6 @@ static u32 airtime_link_metric_get(struct ieee80211_local *local,
u32
tx_time
,
estimated_retx
;
u64
result
;
sband
=
local
->
hw
.
wiphy
->
bands
[
local
->
hw
.
conf
.
channel
->
band
];
if
(
sta
->
fail_avg
>=
100
)
return
MAX_METRIC
;
...
...
@@ -519,10 +518,11 @@ static void hwmp_preq_frame_process(struct ieee80211_sub_if_data *sdata,
struct
mesh_path
*
mpath
=
NULL
;
u8
*
target_addr
,
*
orig_addr
;
const
u8
*
da
;
u8
target_flags
,
ttl
;
u32
orig_sn
,
target_sn
,
lifetime
;
u8
target_flags
,
ttl
,
flags
;
u32
orig_sn
,
target_sn
,
lifetime
,
orig_metric
;
bool
reply
=
false
;
bool
forward
=
true
;
bool
root_is_gate
;
/* Update target SN, if present */
target_addr
=
PREQ_IE_TARGET_ADDR
(
preq_elem
);
...
...
@@ -530,6 +530,10 @@ static void hwmp_preq_frame_process(struct ieee80211_sub_if_data *sdata,
target_sn
=
PREQ_IE_TARGET_SN
(
preq_elem
);
orig_sn
=
PREQ_IE_ORIG_SN
(
preq_elem
);
target_flags
=
PREQ_IE_TARGET_F
(
preq_elem
);
orig_metric
=
metric
;
/* Proactive PREQ gate announcements */
flags
=
PREQ_IE_FLAGS
(
preq_elem
);
root_is_gate
=
!!
(
flags
&
RANN_FLAG_IS_GATE
);
mhwmp_dbg
(
"received PREQ from %pM"
,
orig_addr
);
...
...
@@ -544,6 +548,22 @@ static void hwmp_preq_frame_process(struct ieee80211_sub_if_data *sdata,
target_sn
=
++
ifmsh
->
sn
;
ifmsh
->
last_sn_update
=
jiffies
;
}
}
else
if
(
is_broadcast_ether_addr
(
target_addr
)
&&
(
target_flags
&
IEEE80211_PREQ_TO_FLAG
))
{
rcu_read_lock
();
mpath
=
mesh_path_lookup
(
orig_addr
,
sdata
);
if
(
mpath
)
{
if
(
flags
&
IEEE80211_PREQ_PROACTIVE_PREP_FLAG
)
{
reply
=
true
;
target_addr
=
sdata
->
vif
.
addr
;
target_sn
=
++
ifmsh
->
sn
;
metric
=
0
;
ifmsh
->
last_sn_update
=
jiffies
;
}
if
(
root_is_gate
)
mesh_path_add_gate
(
mpath
);
}
rcu_read_unlock
();
}
else
{
rcu_read_lock
();
mpath
=
mesh_path_lookup
(
target_addr
,
sdata
);
...
...
@@ -576,13 +596,14 @@ static void hwmp_preq_frame_process(struct ieee80211_sub_if_data *sdata,
cpu_to_le32
(
target_sn
),
mgmt
->
sa
,
0
,
ttl
,
cpu_to_le32
(
lifetime
),
cpu_to_le32
(
metric
),
0
,
sdata
);
}
else
}
else
{
ifmsh
->
mshstats
.
dropped_frames_ttl
++
;
}
}
if
(
forward
&&
ifmsh
->
mshcfg
.
dot11MeshForwarding
)
{
u32
preq_id
;
u8
hopcount
,
flags
;
u8
hopcount
;
ttl
=
PREQ_IE_TTL
(
preq_elem
);
lifetime
=
PREQ_IE_LIFETIME
(
preq_elem
);
...
...
@@ -592,11 +613,17 @@ static void hwmp_preq_frame_process(struct ieee80211_sub_if_data *sdata,
}
mhwmp_dbg
(
"forwarding the PREQ from %pM"
,
orig_addr
);
--
ttl
;
flags
=
PREQ_IE_FLAGS
(
preq_elem
);
preq_id
=
PREQ_IE_PREQ_ID
(
preq_elem
);
hopcount
=
PREQ_IE_HOPCOUNT
(
preq_elem
)
+
1
;
da
=
(
mpath
&&
mpath
->
is_root
)
?
mpath
->
rann_snd_addr
:
broadcast_addr
;
if
(
flags
&
IEEE80211_PREQ_PROACTIVE_PREP_FLAG
)
{
target_addr
=
PREQ_IE_TARGET_ADDR
(
preq_elem
);
target_sn
=
PREQ_IE_TARGET_SN
(
preq_elem
);
metric
=
orig_metric
;
}
mesh_path_sel_frame_tx
(
MPATH_PREQ
,
flags
,
orig_addr
,
cpu_to_le32
(
orig_sn
),
target_flags
,
target_addr
,
cpu_to_le32
(
target_sn
),
da
,
...
...
@@ -744,11 +771,6 @@ static void hwmp_rann_frame_process(struct ieee80211_sub_if_data *sdata,
bool
root_is_gate
;
ttl
=
rann
->
rann_ttl
;
if
(
ttl
<=
1
)
{
ifmsh
->
mshstats
.
dropped_frames_ttl
++
;
return
;
}
ttl
--
;
flags
=
rann
->
rann_flags
;
root_is_gate
=
!!
(
flags
&
RANN_FLAG_IS_GATE
);
orig_addr
=
rann
->
rann_addr
;
...
...
@@ -785,34 +807,49 @@ static void hwmp_rann_frame_process(struct ieee80211_sub_if_data *sdata,
}
}
if
(
!
(
SN_LT
(
mpath
->
sn
,
orig_sn
))
&&
!
(
mpath
->
sn
==
orig_sn
&&
metric
<
mpath
->
rann_metric
))
{
rcu_read_unlock
();
return
;
}
if
((
!
(
mpath
->
flags
&
(
MESH_PATH_ACTIVE
|
MESH_PATH_RESOLVING
))
||
time_after
(
jiffies
,
mpath
->
exp_time
-
1
*
HZ
))
&&
!
(
mpath
->
flags
&
MESH_PATH_FIXED
))
{
(
time_after
(
jiffies
,
mpath
->
last_preq_to_root
+
root_path_confirmation_jiffies
(
sdata
))
||
time_before
(
jiffies
,
mpath
->
last_preq_to_root
)))
&&
!
(
mpath
->
flags
&
MESH_PATH_FIXED
)
&&
(
ttl
!=
0
))
{
mhwmp_dbg
(
"%s time to refresh root mpath %pM"
,
sdata
->
name
,
orig_addr
);
mesh_queue_preq
(
mpath
,
PREQ_Q_F_START
|
PREQ_Q_F_REFRESH
);
mpath
->
last_preq_to_root
=
jiffies
;
}
mpath
->
sn
=
orig_sn
;
mpath
->
rann_metric
=
metric
+
metric_txsta
;
mpath
->
is_root
=
true
;
/* Recording RANNs sender address to send individually
* addressed PREQs destined for root mesh STA */
memcpy
(
mpath
->
rann_snd_addr
,
mgmt
->
sa
,
ETH_ALEN
);
if
(
root_is_gate
)
mesh_path_add_gate
(
mpath
);
if
(
ttl
<=
1
)
{
ifmsh
->
mshstats
.
dropped_frames_ttl
++
;
rcu_read_unlock
();
return
;
}
ttl
--
;
if
((
SN_LT
(
mpath
->
sn
,
orig_sn
)
||
(
mpath
->
sn
==
orig_sn
&&
metric
<
mpath
->
rann_metric
))
&&
ifmsh
->
mshcfg
.
dot11MeshForwarding
)
{
if
(
ifmsh
->
mshcfg
.
dot11MeshForwarding
)
{
mesh_path_sel_frame_tx
(
MPATH_RANN
,
flags
,
orig_addr
,
cpu_to_le32
(
orig_sn
),
0
,
NULL
,
0
,
broadcast_addr
,
hopcount
,
ttl
,
cpu_to_le32
(
interval
),
cpu_to_le32
(
metric
+
metric_txsta
),
0
,
sdata
);
mpath
->
sn
=
orig_sn
;
mpath
->
rann_metric
=
metric
+
metric_txsta
;
/* Recording RANNs sender address to send individually
* addressed PREQs destined for root mesh STA */
memcpy
(
mpath
->
rann_snd_addr
,
mgmt
->
sa
,
ETH_ALEN
);
}
mpath
->
is_root
=
true
;
if
(
root_is_gate
)
mesh_path_add_gate
(
mpath
);
rcu_read_unlock
();
}
...
...
@@ -1157,13 +1194,34 @@ mesh_path_tx_root_frame(struct ieee80211_sub_if_data *sdata)
{
struct
ieee80211_if_mesh
*
ifmsh
=
&
sdata
->
u
.
mesh
;
u32
interval
=
ifmsh
->
mshcfg
.
dot11MeshHWMPRannInterval
;
u8
flags
;
u8
flags
,
target_flags
=
0
;
flags
=
(
ifmsh
->
mshcfg
.
dot11MeshGateAnnouncementProtocol
)
?
RANN_FLAG_IS_GATE
:
0
;
mesh_path_sel_frame_tx
(
MPATH_RANN
,
flags
,
sdata
->
vif
.
addr
,
switch
(
ifmsh
->
mshcfg
.
dot11MeshHWMPRootMode
)
{
case
IEEE80211_PROACTIVE_RANN
:
mesh_path_sel_frame_tx
(
MPATH_RANN
,
flags
,
sdata
->
vif
.
addr
,
cpu_to_le32
(
++
ifmsh
->
sn
),
0
,
NULL
,
0
,
broadcast_addr
,
0
,
sdata
->
u
.
mesh
.
mshcfg
.
element_ttl
,
0
,
ifmsh
->
mshcfg
.
element_ttl
,
cpu_to_le32
(
interval
),
0
,
0
,
sdata
);
break
;
case
IEEE80211_PROACTIVE_PREQ_WITH_PREP
:
flags
|=
IEEE80211_PREQ_PROACTIVE_PREP_FLAG
;
case
IEEE80211_PROACTIVE_PREQ_NO_PREP
:
interval
=
ifmsh
->
mshcfg
.
dot11MeshHWMPactivePathToRootTimeout
;
target_flags
|=
IEEE80211_PREQ_TO_FLAG
|
IEEE80211_PREQ_USN_FLAG
;
mesh_path_sel_frame_tx
(
MPATH_PREQ
,
flags
,
sdata
->
vif
.
addr
,
cpu_to_le32
(
++
ifmsh
->
sn
),
target_flags
,
(
u8
*
)
broadcast_addr
,
0
,
broadcast_addr
,
0
,
ifmsh
->
mshcfg
.
element_ttl
,
cpu_to_le32
(
interval
),
0
,
cpu_to_le32
(
ifmsh
->
preq_id
++
),
sdata
);
break
;
default:
mhwmp_dbg
(
"Proactive mechanism not supported"
);
return
;
}
}
net/mac80211/mlme.c
浏览文件 @
133189a4
...
...
@@ -1141,7 +1141,7 @@ static void ieee80211_sta_wmm_params(struct ieee80211_local *local,
memset
(
&
params
,
0
,
sizeof
(
params
));
local
->
wmm_acm
=
0
;
sdata
->
wmm_acm
=
0
;
for
(;
left
>=
4
;
left
-=
4
,
pos
+=
4
)
{
int
aci
=
(
pos
[
0
]
>>
5
)
&
0x03
;
int
acm
=
(
pos
[
0
]
>>
4
)
&
0x01
;
...
...
@@ -1152,21 +1152,21 @@ static void ieee80211_sta_wmm_params(struct ieee80211_local *local,
case
1
:
/* AC_BK */
queue
=
3
;
if
(
acm
)
local
->
wmm_acm
|=
BIT
(
1
)
|
BIT
(
2
);
/* BK/- */
sdata
->
wmm_acm
|=
BIT
(
1
)
|
BIT
(
2
);
/* BK/- */
if
(
uapsd_queues
&
IEEE80211_WMM_IE_STA_QOSINFO_AC_BK
)
uapsd
=
true
;
break
;
case
2
:
/* AC_VI */
queue
=
1
;
if
(
acm
)
local
->
wmm_acm
|=
BIT
(
4
)
|
BIT
(
5
);
/* CL/VI */
sdata
->
wmm_acm
|=
BIT
(
4
)
|
BIT
(
5
);
/* CL/VI */
if
(
uapsd_queues
&
IEEE80211_WMM_IE_STA_QOSINFO_AC_VI
)
uapsd
=
true
;
break
;
case
3
:
/* AC_VO */
queue
=
0
;
if
(
acm
)
local
->
wmm_acm
|=
BIT
(
6
)
|
BIT
(
7
);
/* VO/NC */
sdata
->
wmm_acm
|=
BIT
(
6
)
|
BIT
(
7
);
/* VO/NC */
if
(
uapsd_queues
&
IEEE80211_WMM_IE_STA_QOSINFO_AC_VO
)
uapsd
=
true
;
break
;
...
...
@@ -1174,7 +1174,7 @@ static void ieee80211_sta_wmm_params(struct ieee80211_local *local,
default:
queue
=
2
;
if
(
acm
)
local
->
wmm_acm
|=
BIT
(
0
)
|
BIT
(
3
);
/* BE/EE */
sdata
->
wmm_acm
|=
BIT
(
0
)
|
BIT
(
3
);
/* BE/EE */
if
(
uapsd_queues
&
IEEE80211_WMM_IE_STA_QOSINFO_AC_BE
)
uapsd
=
true
;
break
;
...
...
@@ -1275,7 +1275,7 @@ static void ieee80211_set_associated(struct ieee80211_sub_if_data *sdata,
bss_info_changed
|=
BSS_CHANGED_BEACON_INT
;
bss_info_changed
|=
ieee80211_handle_bss_capability
(
sdata
,
cbss
->
capability
,
bss
->
has_erp_value
,
bss
->
erp_value
);
bss_conf
->
assoc_
capability
,
bss
->
has_erp_value
,
bss
->
erp_value
);
sdata
->
u
.
mgd
.
beacon_timeout
=
usecs_to_jiffies
(
ieee80211_tu_to_usec
(
IEEE80211_BEACON_LOSS_COUNT
*
bss_conf
->
beacon_int
));
...
...
@@ -3012,7 +3012,7 @@ static int ieee80211_prep_connection(struct ieee80211_sub_if_data *sdata,
struct
ieee80211_local
*
local
=
sdata
->
local
;
struct
ieee80211_if_managed
*
ifmgd
=
&
sdata
->
u
.
mgd
;
struct
ieee80211_bss
*
bss
=
(
void
*
)
cbss
->
priv
;
struct
sta_info
*
sta
;
struct
sta_info
*
sta
=
NULL
;
bool
have_sta
=
false
;
int
err
;
int
ht_cfreq
;
...
...
@@ -3102,7 +3102,7 @@ static int ieee80211_prep_connection(struct ieee80211_sub_if_data *sdata,
local
->
oper_channel
=
cbss
->
channel
;
ieee80211_hw_config
(
local
,
IEEE80211_CONF_CHANGE_CHANNEL
);
if
(
!
have_
sta
)
{
if
(
sta
)
{
u32
rates
=
0
,
basic_rates
=
0
;
bool
have_higher_than_11mbit
;
int
min_rate
=
INT_MAX
,
min_rate_index
=
-
1
;
...
...
net/mac80211/offchannel.c
浏览文件 @
133189a4
...
...
@@ -25,8 +25,7 @@
* because we *may* be doing work on-operating channel, and want our
* hardware unconditionally awake, but still let the AP send us normal frames.
*/
static
void
ieee80211_offchannel_ps_enable
(
struct
ieee80211_sub_if_data
*
sdata
,
bool
tell_ap
)
static
void
ieee80211_offchannel_ps_enable
(
struct
ieee80211_sub_if_data
*
sdata
)
{
struct
ieee80211_local
*
local
=
sdata
->
local
;
struct
ieee80211_if_managed
*
ifmgd
=
&
sdata
->
u
.
mgd
;
...
...
@@ -47,8 +46,8 @@ static void ieee80211_offchannel_ps_enable(struct ieee80211_sub_if_data *sdata,
ieee80211_hw_config
(
local
,
IEEE80211_CONF_CHANGE_PS
);
}
if
(
tell_ap
&&
(
!
local
->
offchannel_ps_enabled
||
!
(
local
->
hw
.
flags
&
IEEE80211_HW_PS_NULLFUNC_STACK
)
))
if
(
!
local
->
offchannel_ps_enabled
||
!
(
local
->
hw
.
flags
&
IEEE80211_HW_PS_NULLFUNC_STACK
))
/*
* If power save was enabled, no need to send a nullfunc
* frame because AP knows that we are sleeping. But if the
...
...
@@ -133,7 +132,7 @@ void ieee80211_offchannel_stop_vifs(struct ieee80211_local *local,
if
(
offchannel_ps_enable
&&
(
sdata
->
vif
.
type
==
NL80211_IFTYPE_STATION
)
&&
sdata
->
u
.
mgd
.
associated
)
ieee80211_offchannel_ps_enable
(
sdata
,
true
);
ieee80211_offchannel_ps_enable
(
sdata
);
}
}
mutex_unlock
(
&
local
->
iflist_mtx
);
...
...
@@ -263,6 +262,9 @@ void ieee80211_start_next_roc(struct ieee80211_local *local)
roc
=
list_first_entry
(
&
local
->
roc_list
,
struct
ieee80211_roc_work
,
list
);
if
(
WARN_ON_ONCE
(
roc
->
started
))
return
;
if
(
local
->
ops
->
remain_on_channel
)
{
int
ret
,
duration
=
roc
->
duration
;
...
...
@@ -378,8 +380,8 @@ void ieee80211_sw_roc_work(struct work_struct *work)
ieee80211_recalc_idle
(
local
);
i
eee80211_start_next_roc
(
local
);
ieee80211_run_deferred_scan
(
local
);
i
f
(
roc
->
started
)
ieee80211_start_next_roc
(
local
);
}
out_unlock:
...
...
@@ -410,9 +412,6 @@ static void ieee80211_hw_roc_done(struct work_struct *work)
/* if there's another roc, start it now */
ieee80211_start_next_roc
(
local
);
/* or scan maybe */
ieee80211_run_deferred_scan
(
local
);
out_unlock:
mutex_unlock
(
&
local
->
mtx
);
}
...
...
@@ -455,7 +454,6 @@ void ieee80211_roc_purge(struct ieee80211_sub_if_data *sdata)
}
ieee80211_start_next_roc
(
local
);
ieee80211_run_deferred_scan
(
local
);
mutex_unlock
(
&
local
->
mtx
);
list_for_each_entry_safe
(
roc
,
tmp
,
&
tmp_list
,
list
)
{
...
...
net/mac80211/pm.c
浏览文件 @
133189a4
...
...
@@ -78,6 +78,16 @@ int __ieee80211_suspend(struct ieee80211_hw *hw, struct cfg80211_wowlan *wowlan)
if
(
err
<
0
)
{
local
->
quiescing
=
false
;
local
->
wowlan
=
false
;
if
(
hw
->
flags
&
IEEE80211_HW_AMPDU_AGGREGATION
)
{
mutex_lock
(
&
local
->
sta_mtx
);
list_for_each_entry
(
sta
,
&
local
->
sta_list
,
list
)
{
clear_sta_flag
(
sta
,
WLAN_STA_BLOCK_BA
);
}
mutex_unlock
(
&
local
->
sta_mtx
);
}
ieee80211_wake_queues_by_reason
(
hw
,
IEEE80211_QUEUE_STOP_REASON_SUSPEND
);
return
err
;
}
else
if
(
err
>
0
)
{
WARN_ON
(
err
!=
1
);
...
...
net/mac80211/rx.c
浏览文件 @
133189a4
...
...
@@ -1935,7 +1935,7 @@ ieee80211_rx_h_mesh_fwding(struct ieee80211_rx_data *rx)
ether_addr_equal
(
sdata
->
vif
.
addr
,
hdr
->
addr3
))
return
RX_CONTINUE
;
q
=
ieee80211_select_queue_80211
(
local
,
skb
,
hdr
);
q
=
ieee80211_select_queue_80211
(
sdata
,
skb
,
hdr
);
if
(
ieee80211_queue_stopped
(
&
local
->
hw
,
q
))
{
IEEE80211_IFSTA_MESH_CTR_INC
(
ifmsh
,
dropped_frames_congestion
);
return
RX_DROP_MONITOR
;
...
...
@@ -3027,6 +3027,10 @@ void ieee80211_rx(struct ieee80211_hw *hw, struct sk_buff *skb)
if
(
unlikely
(
local
->
quiescing
||
local
->
suspended
))
goto
drop
;
/* We might be during a HW reconfig, prevent Rx for the same reason */
if
(
unlikely
(
local
->
in_reconfig
))
goto
drop
;
/*
* The same happens when we're not even started,
* but that's worth a warning.
...
...
net/mac80211/util.c
浏览文件 @
133189a4
...
...
@@ -1411,6 +1411,9 @@ int ieee80211_reconfig(struct ieee80211_local *local)
if
(
ieee80211_sdata_running
(
sdata
))
ieee80211_enable_keys
(
sdata
);
local
->
in_reconfig
=
false
;
barrier
();
wake_up:
/*
* Clear the WLAN_STA_BLOCK_BA flag so new aggregation
...
...
net/mac80211/wme.c
浏览文件 @
133189a4
...
...
@@ -52,11 +52,11 @@ static int wme_downgrade_ac(struct sk_buff *skb)
}
}
static
u16
ieee80211_downgrade_queue
(
struct
ieee80211_
local
*
local
,
static
u16
ieee80211_downgrade_queue
(
struct
ieee80211_
sub_if_data
*
sdata
,
struct
sk_buff
*
skb
)
{
/* in case we are a client verify acm is not set for this ac */
while
(
unlikely
(
local
->
wmm_acm
&
BIT
(
skb
->
priority
)))
{
while
(
unlikely
(
sdata
->
wmm_acm
&
BIT
(
skb
->
priority
)))
{
if
(
wme_downgrade_ac
(
skb
))
{
/*
* This should not really happen. The AP has marked all
...
...
@@ -73,10 +73,11 @@ static u16 ieee80211_downgrade_queue(struct ieee80211_local *local,
}
/* Indicate which queue to use for this fully formed 802.11 frame */
u16
ieee80211_select_queue_80211
(
struct
ieee80211_
local
*
local
,
u16
ieee80211_select_queue_80211
(
struct
ieee80211_
sub_if_data
*
sdata
,
struct
sk_buff
*
skb
,
struct
ieee80211_hdr
*
hdr
)
{
struct
ieee80211_local
*
local
=
sdata
->
local
;
u8
*
p
;
if
(
local
->
hw
.
queues
<
IEEE80211_NUM_ACS
)
...
...
@@ -94,7 +95,7 @@ u16 ieee80211_select_queue_80211(struct ieee80211_local *local,
p
=
ieee80211_get_qos_ctl
(
hdr
);
skb
->
priority
=
*
p
&
IEEE80211_QOS_CTL_TAG1D_MASK
;
return
ieee80211_downgrade_queue
(
local
,
skb
);
return
ieee80211_downgrade_queue
(
sdata
,
skb
);
}
/* Indicate which queue to use. */
...
...
@@ -156,7 +157,7 @@ u16 ieee80211_select_queue(struct ieee80211_sub_if_data *sdata,
* data frame has */
skb
->
priority
=
cfg80211_classify8021d
(
skb
);
return
ieee80211_downgrade_queue
(
local
,
skb
);
return
ieee80211_downgrade_queue
(
sdata
,
skb
);
}
void
ieee80211_set_qos_hdr
(
struct
ieee80211_sub_if_data
*
sdata
,
...
...
net/mac80211/wme.h
浏览文件 @
133189a4
...
...
@@ -15,7 +15,7 @@
extern
const
int
ieee802_1d_to_ac
[
8
];
u16
ieee80211_select_queue_80211
(
struct
ieee80211_
local
*
local
,
u16
ieee80211_select_queue_80211
(
struct
ieee80211_
sub_if_data
*
sdata
,
struct
sk_buff
*
skb
,
struct
ieee80211_hdr
*
hdr
);
u16
ieee80211_select_queue
(
struct
ieee80211_sub_if_data
*
sdata
,
...
...
net/wireless/core.c
浏览文件 @
133189a4
...
...
@@ -96,69 +96,6 @@ struct wiphy *wiphy_idx_to_wiphy(int wiphy_idx)
return
&
rdev
->
wiphy
;
}
/* requires cfg80211_mutex to be held! */
struct
cfg80211_registered_device
*
__cfg80211_rdev_from_info
(
struct
genl_info
*
info
)
{
int
ifindex
;
struct
cfg80211_registered_device
*
bywiphyidx
=
NULL
,
*
byifidx
=
NULL
;
struct
net_device
*
dev
;
int
err
=
-
EINVAL
;
assert_cfg80211_lock
();
if
(
info
->
attrs
[
NL80211_ATTR_WIPHY
])
{
bywiphyidx
=
cfg80211_rdev_by_wiphy_idx
(
nla_get_u32
(
info
->
attrs
[
NL80211_ATTR_WIPHY
]));
err
=
-
ENODEV
;
}
if
(
info
->
attrs
[
NL80211_ATTR_IFINDEX
])
{
ifindex
=
nla_get_u32
(
info
->
attrs
[
NL80211_ATTR_IFINDEX
]);
dev
=
dev_get_by_index
(
genl_info_net
(
info
),
ifindex
);
if
(
dev
)
{
if
(
dev
->
ieee80211_ptr
)
byifidx
=
wiphy_to_dev
(
dev
->
ieee80211_ptr
->
wiphy
);
dev_put
(
dev
);
}
err
=
-
ENODEV
;
}
if
(
bywiphyidx
&&
byifidx
)
{
if
(
bywiphyidx
!=
byifidx
)
return
ERR_PTR
(
-
EINVAL
);
else
return
bywiphyidx
;
/* == byifidx */
}
if
(
bywiphyidx
)
return
bywiphyidx
;
if
(
byifidx
)
return
byifidx
;
return
ERR_PTR
(
err
);
}
struct
cfg80211_registered_device
*
cfg80211_get_dev_from_info
(
struct
genl_info
*
info
)
{
struct
cfg80211_registered_device
*
rdev
;
mutex_lock
(
&
cfg80211_mutex
);
rdev
=
__cfg80211_rdev_from_info
(
info
);
/* if it is not an error we grab the lock on
* it to assure it won't be going away while
* we operate on it */
if
(
!
IS_ERR
(
rdev
))
mutex_lock
(
&
rdev
->
mtx
);
mutex_unlock
(
&
cfg80211_mutex
);
return
rdev
;
}
struct
cfg80211_registered_device
*
cfg80211_get_dev_from_ifindex
(
struct
net
*
net
,
int
ifindex
)
{
...
...
net/wireless/core.h
浏览文件 @
133189a4
...
...
@@ -159,32 +159,6 @@ static inline void cfg80211_unhold_bss(struct cfg80211_internal_bss *bss)
struct
cfg80211_registered_device
*
cfg80211_rdev_by_wiphy_idx
(
int
wiphy_idx
);
int
get_wiphy_idx
(
struct
wiphy
*
wiphy
);
struct
cfg80211_registered_device
*
__cfg80211_rdev_from_info
(
struct
genl_info
*
info
);
/*
* This function returns a pointer to the driver
* that the genl_info item that is passed refers to.
* If successful, it returns non-NULL and also locks
* the driver's mutex!
*
* This means that you need to call cfg80211_unlock_rdev()
* before being allowed to acquire &cfg80211_mutex!
*
* This is necessary because we need to lock the global
* mutex to get an item off the list safely, and then
* we lock the rdev mutex so it doesn't go away under us.
*
* We don't want to keep cfg80211_mutex locked
* for all the time in order to allow requests on
* other interfaces to go through at the same time.
*
* The result of this can be a PTR_ERR and hence must
* be checked with IS_ERR() for errors.
*/
extern
struct
cfg80211_registered_device
*
cfg80211_get_dev_from_info
(
struct
genl_info
*
info
);
/* requires cfg80211_rdev_mutex to be held! */
struct
wiphy
*
wiphy_idx_to_wiphy
(
int
wiphy_idx
);
...
...
net/wireless/mesh.c
浏览文件 @
133189a4
...
...
@@ -14,6 +14,9 @@
#define MESH_PATH_TIMEOUT 5000
#define MESH_RANN_INTERVAL 5000
#define MESH_PATH_TO_ROOT_TIMEOUT 6000
#define MESH_ROOT_INTERVAL 5000
#define MESH_ROOT_CONFIRMATION_INTERVAL 2000
/*
* Minimum interval between two consecutive PREQs originated by the same
...
...
@@ -62,6 +65,9 @@ const struct mesh_config default_mesh_config = {
.
dot11MeshForwarding
=
true
,
.
rssi_threshold
=
MESH_RSSI_THRESHOLD
,
.
ht_opmode
=
IEEE80211_HT_OP_MODE_PROTECTION_NONHT_MIXED
,
.
dot11MeshHWMPactivePathToRootTimeout
=
MESH_PATH_TO_ROOT_TIMEOUT
,
.
dot11MeshHWMProotInterval
=
MESH_ROOT_INTERVAL
,
.
dot11MeshHWMPconfirmationInterval
=
MESH_ROOT_CONFIRMATION_INTERVAL
,
};
const
struct
mesh_setup
default_mesh_setup
=
{
...
...
net/wireless/nl80211.c
浏览文件 @
133189a4
...
...
@@ -70,6 +70,94 @@ static int get_rdev_dev_by_ifindex(struct net *netns, struct nlattr **attrs,
return
0
;
}
static
struct
cfg80211_registered_device
*
__cfg80211_rdev_from_attrs
(
struct
net
*
netns
,
struct
nlattr
**
attrs
)
{
struct
cfg80211_registered_device
*
rdev
=
NULL
,
*
tmp
;
struct
net_device
*
netdev
;
assert_cfg80211_lock
();
if
(
!
attrs
[
NL80211_ATTR_WIPHY
]
&&
!
attrs
[
NL80211_ATTR_IFINDEX
])
return
ERR_PTR
(
-
EINVAL
);
if
(
attrs
[
NL80211_ATTR_WIPHY
])
rdev
=
cfg80211_rdev_by_wiphy_idx
(
nla_get_u32
(
attrs
[
NL80211_ATTR_WIPHY
]));
if
(
attrs
[
NL80211_ATTR_IFINDEX
])
{
int
ifindex
=
nla_get_u32
(
attrs
[
NL80211_ATTR_IFINDEX
]);
netdev
=
dev_get_by_index
(
netns
,
ifindex
);
if
(
netdev
)
{
if
(
netdev
->
ieee80211_ptr
)
tmp
=
wiphy_to_dev
(
netdev
->
ieee80211_ptr
->
wiphy
);
else
tmp
=
NULL
;
dev_put
(
netdev
);
/* not wireless device -- return error */
if
(
!
tmp
)
return
ERR_PTR
(
-
EINVAL
);
/* mismatch -- return error */
if
(
rdev
&&
tmp
!=
rdev
)
return
ERR_PTR
(
-
EINVAL
);
rdev
=
tmp
;
}
}
if
(
!
rdev
)
return
ERR_PTR
(
-
ENODEV
);
if
(
netns
!=
wiphy_net
(
&
rdev
->
wiphy
))
return
ERR_PTR
(
-
ENODEV
);
return
rdev
;
}
/*
* This function returns a pointer to the driver
* that the genl_info item that is passed refers to.
* If successful, it returns non-NULL and also locks
* the driver's mutex!
*
* This means that you need to call cfg80211_unlock_rdev()
* before being allowed to acquire &cfg80211_mutex!
*
* This is necessary because we need to lock the global
* mutex to get an item off the list safely, and then
* we lock the rdev mutex so it doesn't go away under us.
*
* We don't want to keep cfg80211_mutex locked
* for all the time in order to allow requests on
* other interfaces to go through at the same time.
*
* The result of this can be a PTR_ERR and hence must
* be checked with IS_ERR() for errors.
*/
static
struct
cfg80211_registered_device
*
cfg80211_get_dev_from_info
(
struct
net
*
netns
,
struct
genl_info
*
info
)
{
struct
cfg80211_registered_device
*
rdev
;
mutex_lock
(
&
cfg80211_mutex
);
rdev
=
__cfg80211_rdev_from_attrs
(
netns
,
info
->
attrs
);
/* if it is not an error we grab the lock on
* it to assure it won't be going away while
* we operate on it */
if
(
!
IS_ERR
(
rdev
))
mutex_lock
(
&
rdev
->
mtx
);
mutex_unlock
(
&
cfg80211_mutex
);
return
rdev
;
}
/* policy for the attributes */
static
const
struct
nla_policy
nl80211_policy
[
NL80211_ATTR_MAX
+
1
]
=
{
[
NL80211_ATTR_WIPHY
]
=
{
.
type
=
NLA_U32
},
...
...
@@ -115,7 +203,7 @@ static const struct nla_policy nl80211_policy[NL80211_ATTR_MAX+1] = {
[
NL80211_ATTR_STA_VLAN
]
=
{
.
type
=
NLA_U32
},
[
NL80211_ATTR_MNTR_FLAGS
]
=
{
/* NLA_NESTED can't be empty */
},
[
NL80211_ATTR_MESH_ID
]
=
{
.
type
=
NLA_BINARY
,
.
len
=
IEEE80211_MAX_MESH_ID_LEN
},
.
len
=
IEEE80211_MAX_MESH_ID_LEN
},
[
NL80211_ATTR_MPATH_NEXT_HOP
]
=
{
.
type
=
NLA_U32
},
[
NL80211_ATTR_REG_ALPHA2
]
=
{
.
type
=
NLA_STRING
,
.
len
=
2
},
...
...
@@ -250,7 +338,7 @@ nl80211_rekey_policy[NUM_NL80211_REKEY_DATA] = {
static
const
struct
nla_policy
nl80211_match_policy
[
NL80211_SCHED_SCAN_MATCH_ATTR_MAX
+
1
]
=
{
[
NL80211_
ATTR_SCHED_SCAN_MATCH
_SSID
]
=
{
.
type
=
NLA_BINARY
,
[
NL80211_
SCHED_SCAN_MATCH_ATTR
_SSID
]
=
{
.
type
=
NLA_BINARY
,
.
len
=
IEEE80211_MAX_SSID_LEN
},
};
...
...
@@ -1334,7 +1422,8 @@ static int nl80211_set_wiphy(struct sk_buff *skb, struct genl_info *info)
}
if
(
!
netdev
)
{
rdev
=
__cfg80211_rdev_from_info
(
info
);
rdev
=
__cfg80211_rdev_from_attrs
(
genl_info_net
(
info
),
info
->
attrs
);
if
(
IS_ERR
(
rdev
))
{
mutex_unlock
(
&
cfg80211_mutex
);
return
PTR_ERR
(
rdev
);
...
...
@@ -2246,6 +2335,33 @@ static int nl80211_parse_beacon(struct genl_info *info,
return
0
;
}
static
bool
nl80211_get_ap_channel
(
struct
cfg80211_registered_device
*
rdev
,
struct
cfg80211_ap_settings
*
params
)
{
struct
wireless_dev
*
wdev
;
bool
ret
=
false
;
mutex_lock
(
&
rdev
->
devlist_mtx
);
list_for_each_entry
(
wdev
,
&
rdev
->
netdev_list
,
list
)
{
if
(
wdev
->
iftype
!=
NL80211_IFTYPE_AP
&&
wdev
->
iftype
!=
NL80211_IFTYPE_P2P_GO
)
continue
;
if
(
!
wdev
->
preset_chan
)
continue
;
params
->
channel
=
wdev
->
preset_chan
;
params
->
channel_type
=
wdev
->
preset_chantype
;
ret
=
true
;
break
;
}
mutex_unlock
(
&
rdev
->
devlist_mtx
);
return
ret
;
}
static
int
nl80211_start_ap
(
struct
sk_buff
*
skb
,
struct
genl_info
*
info
)
{
struct
cfg80211_registered_device
*
rdev
=
info
->
user_ptr
[
0
];
...
...
@@ -2348,7 +2464,7 @@ static int nl80211_start_ap(struct sk_buff *skb, struct genl_info *info)
}
else
if
(
wdev
->
preset_chan
)
{
params
.
channel
=
wdev
->
preset_chan
;
params
.
channel_type
=
wdev
->
preset_chantype
;
}
else
}
else
if
(
!
nl80211_get_ap_channel
(
rdev
,
&
params
))
return
-
EINVAL
;
if
(
!
cfg80211_can_beacon_sec_chan
(
&
rdev
->
wiphy
,
params
.
channel
,
...
...
@@ -2356,8 +2472,11 @@ static int nl80211_start_ap(struct sk_buff *skb, struct genl_info *info)
return
-
EINVAL
;
err
=
rdev
->
ops
->
start_ap
(
&
rdev
->
wiphy
,
dev
,
&
params
);
if
(
!
err
)
if
(
!
err
)
{
wdev
->
preset_chan
=
params
.
channel
;
wdev
->
preset_chantype
=
params
.
channel_type
;
wdev
->
beacon_interval
=
params
.
beacon_interval
;
}
return
err
;
}
...
...
@@ -3469,7 +3588,13 @@ static int nl80211_get_mesh_config(struct sk_buff *skb,
nla_put_u32
(
msg
,
NL80211_MESHCONF_RSSI_THRESHOLD
,
cur_params
.
rssi_threshold
)
||
nla_put_u32
(
msg
,
NL80211_MESHCONF_HT_OPMODE
,
cur_params
.
ht_opmode
))
cur_params
.
ht_opmode
)
||
nla_put_u32
(
msg
,
NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT
,
cur_params
.
dot11MeshHWMPactivePathToRootTimeout
)
||
nla_put_u16
(
msg
,
NL80211_MESHCONF_HWMP_ROOT_INTERVAL
,
cur_params
.
dot11MeshHWMProotInterval
)
||
nla_put_u16
(
msg
,
NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL
,
cur_params
.
dot11MeshHWMPconfirmationInterval
))
goto
nla_put_failure
;
nla_nest_end
(
msg
,
pinfoattr
);
genlmsg_end
(
msg
,
hdr
);
...
...
@@ -3492,7 +3617,6 @@ static const struct nla_policy nl80211_meshconf_params_policy[NL80211_MESHCONF_A
[
NL80211_MESHCONF_ELEMENT_TTL
]
=
{
.
type
=
NLA_U8
},
[
NL80211_MESHCONF_AUTO_OPEN_PLINKS
]
=
{
.
type
=
NLA_U8
},
[
NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR
]
=
{
.
type
=
NLA_U32
},
[
NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES
]
=
{
.
type
=
NLA_U8
},
[
NL80211_MESHCONF_PATH_REFRESH_TIME
]
=
{
.
type
=
NLA_U32
},
[
NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT
]
=
{
.
type
=
NLA_U16
},
...
...
@@ -3504,8 +3628,11 @@ static const struct nla_policy nl80211_meshconf_params_policy[NL80211_MESHCONF_A
[
NL80211_MESHCONF_HWMP_RANN_INTERVAL
]
=
{
.
type
=
NLA_U16
},
[
NL80211_MESHCONF_GATE_ANNOUNCEMENTS
]
=
{
.
type
=
NLA_U8
},
[
NL80211_MESHCONF_FORWARDING
]
=
{
.
type
=
NLA_U8
},
[
NL80211_MESHCONF_RSSI_THRESHOLD
]
=
{
.
type
=
NLA_U32
},
[
NL80211_MESHCONF_HT_OPMODE
]
=
{
.
type
=
NLA_U16
},
[
NL80211_MESHCONF_RSSI_THRESHOLD
]
=
{
.
type
=
NLA_U32
},
[
NL80211_MESHCONF_HT_OPMODE
]
=
{
.
type
=
NLA_U16
},
[
NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT
]
=
{
.
type
=
NLA_U32
},
[
NL80211_MESHCONF_HWMP_ROOT_INTERVAL
]
=
{
.
type
=
NLA_U16
},
[
NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL
]
=
{
.
type
=
NLA_U16
},
};
static
const
struct
nla_policy
...
...
@@ -3515,7 +3642,7 @@ static const struct nla_policy
[
NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC
]
=
{
.
type
=
NLA_U8
},
[
NL80211_MESH_SETUP_USERSPACE_AUTH
]
=
{
.
type
=
NLA_FLAG
},
[
NL80211_MESH_SETUP_IE
]
=
{
.
type
=
NLA_BINARY
,
.
len
=
IEEE80211_MAX_DATA_LEN
},
.
len
=
IEEE80211_MAX_DATA_LEN
},
[
NL80211_MESH_SETUP_USERSPACE_AMPE
]
=
{
.
type
=
NLA_FLAG
},
};
...
...
@@ -3548,63 +3675,82 @@ do {\
/* Fill in the params struct */
FILL_IN_MESH_PARAM_IF_SET
(
tb
,
cfg
,
dot11MeshRetryTimeout
,
mask
,
NL80211_MESHCONF_RETRY_TIMEOUT
,
nla_get_u16
);
mask
,
NL80211_MESHCONF_RETRY_TIMEOUT
,
nla_get_u16
);
FILL_IN_MESH_PARAM_IF_SET
(
tb
,
cfg
,
dot11MeshConfirmTimeout
,
mask
,
NL80211_MESHCONF_CONFIRM_TIMEOUT
,
nla_get_u16
);
mask
,
NL80211_MESHCONF_CONFIRM_TIMEOUT
,
nla_get_u16
);
FILL_IN_MESH_PARAM_IF_SET
(
tb
,
cfg
,
dot11MeshHoldingTimeout
,
mask
,
NL80211_MESHCONF_HOLDING_TIMEOUT
,
nla_get_u16
);
mask
,
NL80211_MESHCONF_HOLDING_TIMEOUT
,
nla_get_u16
);
FILL_IN_MESH_PARAM_IF_SET
(
tb
,
cfg
,
dot11MeshMaxPeerLinks
,
mask
,
NL80211_MESHCONF_MAX_PEER_LINKS
,
nla_get_u16
);
mask
,
NL80211_MESHCONF_MAX_PEER_LINKS
,
nla_get_u16
);
FILL_IN_MESH_PARAM_IF_SET
(
tb
,
cfg
,
dot11MeshMaxRetries
,
mask
,
NL80211_MESHCONF_MAX_RETRIES
,
nla_get_u8
);
mask
,
NL80211_MESHCONF_MAX_RETRIES
,
nla_get_u8
);
FILL_IN_MESH_PARAM_IF_SET
(
tb
,
cfg
,
dot11MeshTTL
,
mask
,
NL80211_MESHCONF_TTL
,
nla_get_u8
);
mask
,
NL80211_MESHCONF_TTL
,
nla_get_u8
);
FILL_IN_MESH_PARAM_IF_SET
(
tb
,
cfg
,
element_ttl
,
mask
,
NL80211_MESHCONF_ELEMENT_TTL
,
nla_get_u8
);
mask
,
NL80211_MESHCONF_ELEMENT_TTL
,
nla_get_u8
);
FILL_IN_MESH_PARAM_IF_SET
(
tb
,
cfg
,
auto_open_plinks
,
mask
,
NL80211_MESHCONF_AUTO_OPEN_PLINKS
,
nla_get_u8
);
FILL_IN_MESH_PARAM_IF_SET
(
tb
,
cfg
,
dot11MeshNbrOffsetMaxNeighbor
,
mask
,
NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR
,
nla_get_u32
);
mask
,
NL80211_MESHCONF_AUTO_OPEN_PLINKS
,
nla_get_u8
);
FILL_IN_MESH_PARAM_IF_SET
(
tb
,
cfg
,
dot11MeshNbrOffsetMaxNeighbor
,
mask
,
NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR
,
nla_get_u32
);
FILL_IN_MESH_PARAM_IF_SET
(
tb
,
cfg
,
dot11MeshHWMPmaxPREQretries
,
mask
,
NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES
,
nla_get_u8
);
mask
,
NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES
,
nla_get_u8
);
FILL_IN_MESH_PARAM_IF_SET
(
tb
,
cfg
,
path_refresh_time
,
mask
,
NL80211_MESHCONF_PATH_REFRESH_TIME
,
nla_get_u32
);
mask
,
NL80211_MESHCONF_PATH_REFRESH_TIME
,
nla_get_u32
);
FILL_IN_MESH_PARAM_IF_SET
(
tb
,
cfg
,
min_discovery_timeout
,
mask
,
NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT
,
nla_get_u16
);
FILL_IN_MESH_PARAM_IF_SET
(
tb
,
cfg
,
dot11MeshHWMPactivePathTimeout
,
mask
,
NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT
,
nla_get_u32
);
mask
,
NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT
,
nla_get_u16
);
FILL_IN_MESH_PARAM_IF_SET
(
tb
,
cfg
,
dot11MeshHWMPactivePathTimeout
,
mask
,
NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT
,
nla_get_u32
);
FILL_IN_MESH_PARAM_IF_SET
(
tb
,
cfg
,
dot11MeshHWMPpreqMinInterval
,
mask
,
NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL
,
nla_get_u16
);
mask
,
NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL
,
nla_get_u16
);
FILL_IN_MESH_PARAM_IF_SET
(
tb
,
cfg
,
dot11MeshHWMPperrMinInterval
,
mask
,
NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL
,
nla_get_u16
);
FILL_IN_MESH_PARAM_IF_SET
(
tb
,
cfg
,
dot11MeshHWMPnetDiameterTraversalTime
,
mask
,
NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME
,
nla_get_u16
);
mask
,
NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL
,
nla_get_u16
);
FILL_IN_MESH_PARAM_IF_SET
(
tb
,
cfg
,
dot11MeshHWMPRootMode
,
mask
,
NL80211_MESHCONF_HWMP_ROOTMODE
,
nla_get_u8
);
dot11MeshHWMPnetDiameterTraversalTime
,
mask
,
NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME
,
nla_get_u16
);
FILL_IN_MESH_PARAM_IF_SET
(
tb
,
cfg
,
dot11MeshHWMPRootMode
,
mask
,
NL80211_MESHCONF_HWMP_ROOTMODE
,
nla_get_u8
);
FILL_IN_MESH_PARAM_IF_SET
(
tb
,
cfg
,
dot11MeshHWMPRannInterval
,
mask
,
NL80211_MESHCONF_HWMP_RANN_INTERVAL
,
nla_get_u16
);
FILL_IN_MESH_PARAM_IF_SET
(
tb
,
cfg
,
dot11MeshHWMPRannInterval
,
mask
,
NL80211_MESHCONF_HWMP_RANN_INTERVAL
,
nla_get_u16
);
FILL_IN_MESH_PARAM_IF_SET
(
tb
,
cfg
,
dot11MeshGateAnnouncementProtocol
,
mask
,
NL80211_MESHCONF_GATE_ANNOUNCEMENTS
,
nla_get_u8
);
dot11MeshGateAnnouncementProtocol
,
mask
,
NL80211_MESHCONF_GATE_ANNOUNCEMENTS
,
nla_get_u8
);
FILL_IN_MESH_PARAM_IF_SET
(
tb
,
cfg
,
dot11MeshForwarding
,
mask
,
NL80211_MESHCONF_FORWARDING
,
nla_get_u8
);
mask
,
NL80211_MESHCONF_FORWARDING
,
nla_get_u8
);
FILL_IN_MESH_PARAM_IF_SET
(
tb
,
cfg
,
rssi_threshold
,
mask
,
NL80211_MESHCONF_RSSI_THRESHOLD
,
nla_get_u32
);
mask
,
NL80211_MESHCONF_RSSI_THRESHOLD
,
nla_get_u32
);
FILL_IN_MESH_PARAM_IF_SET
(
tb
,
cfg
,
ht_opmode
,
mask
,
NL80211_MESHCONF_HT_OPMODE
,
nla_get_u16
);
mask
,
NL80211_MESHCONF_HT_OPMODE
,
nla_get_u16
);
FILL_IN_MESH_PARAM_IF_SET
(
tb
,
cfg
,
dot11MeshHWMPactivePathToRootTimeout
,
mask
,
NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT
,
nla_get_u32
);
FILL_IN_MESH_PARAM_IF_SET
(
tb
,
cfg
,
dot11MeshHWMProotInterval
,
mask
,
NL80211_MESHCONF_HWMP_ROOT_INTERVAL
,
nla_get_u16
);
FILL_IN_MESH_PARAM_IF_SET
(
tb
,
cfg
,
dot11MeshHWMPconfirmationInterval
,
mask
,
NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL
,
nla_get_u16
);
if
(
mask_out
)
*
mask_out
=
mask
;
...
...
@@ -4246,7 +4392,7 @@ static int nl80211_start_sched_scan(struct sk_buff *skb,
nla_parse
(
tb
,
NL80211_SCHED_SCAN_MATCH_ATTR_MAX
,
nla_data
(
attr
),
nla_len
(
attr
),
nl80211_match_policy
);
ssid
=
tb
[
NL80211_
ATTR_SCHED_SCAN_MATCH
_SSID
];
ssid
=
tb
[
NL80211_
SCHED_SCAN_MATCH_ATTR
_SSID
];
if
(
ssid
)
{
if
(
nla_len
(
ssid
)
>
IEEE80211_MAX_SSID_LEN
)
{
err
=
-
EINVAL
;
...
...
@@ -5114,21 +5260,18 @@ static int nl80211_testmode_dump(struct sk_buff *skb,
nl80211_policy
);
if
(
err
)
return
err
;
if
(
nl80211_fam
.
attrbuf
[
NL80211_ATTR_WIPHY
])
{
phy_idx
=
nla_get_u32
(
nl80211_fam
.
attrbuf
[
NL80211_ATTR_WIPHY
]);
}
else
{
struct
net_device
*
netdev
;
err
=
get_rdev_dev_by_ifindex
(
sock_net
(
skb
->
sk
),
nl80211_fam
.
attrbuf
,
&
rdev
,
&
netdev
);
if
(
err
)
return
err
;
dev_put
(
netdev
);
phy_idx
=
rdev
->
wiphy_idx
;
cfg80211_unlock_rdev
(
rdev
);
mutex_lock
(
&
cfg80211_mutex
);
rdev
=
__cfg80211_rdev_from_attrs
(
sock_net
(
skb
->
sk
),
nl80211_fam
.
attrbuf
);
if
(
IS_ERR
(
rdev
))
{
mutex_unlock
(
&
cfg80211_mutex
);
return
PTR_ERR
(
rdev
);
}
phy_idx
=
rdev
->
wiphy_idx
;
rdev
=
NULL
;
mutex_unlock
(
&
cfg80211_mutex
);
if
(
nl80211_fam
.
attrbuf
[
NL80211_ATTR_TESTDATA
])
cb
->
args
[
1
]
=
(
long
)
nl80211_fam
.
attrbuf
[
NL80211_ATTR_TESTDATA
];
...
...
@@ -6511,7 +6654,7 @@ static int nl80211_pre_doit(struct genl_ops *ops, struct sk_buff *skb,
rtnl_lock
();
if
(
ops
->
internal_flags
&
NL80211_FLAG_NEED_WIPHY
)
{
rdev
=
cfg80211_get_dev_from_info
(
info
);
rdev
=
cfg80211_get_dev_from_info
(
genl_info_net
(
info
),
info
);
if
(
IS_ERR
(
rdev
))
{
if
(
rtnl
)
rtnl_unlock
();
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录