summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2021-07-15 02:07:01 +0000
committerAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2021-07-15 02:07:01 +0000
commit32f05fe5377b3e4e673379928b1d7174e129507e (patch)
treee5ebaee256dda01ebc90a6fdd63e72eb01638c03
parentaa2e4417e6d11668dac15be69763e139ee2e53ce (diff)
parente4f57640c3f2031f328449045258a700020bae55 (diff)
downloadwificond-android12-mainline-captiveportallogin-release.tar.gz
Snap for 7550930 from e4f57640c3f2031f328449045258a700020bae55 to mainline-captiveportallogin-releaseandroid-mainline-12.0.0_r6android-mainline-12.0.0_r23android12-mainline-captiveportallogin-release
Change-Id: Idc42722c3c428e9b449c124a2b811f02c9932e0a
-rw-r--r--Android.bp37
-rw-r--r--METADATA3
-rw-r--r--OWNERS2
-rw-r--r--TEST_MAPPING12
-rw-r--r--aidl/android/net/wifi/nl80211/IWificond.aidl21
-rw-r--r--aidl/android/net/wifi/nl80211/IWificondEventCallback.aidl25
-rw-r--r--client_interface_impl.cpp4
-rw-r--r--client_interface_impl.h1
-rw-r--r--net/kernel-header-latest/README.txt2
-rw-r--r--net/kernel-header-latest/nl80211.h1130
-rw-r--r--net/netlink_manager.cpp5
-rw-r--r--net/netlink_manager.h2
-rw-r--r--net/netlink_utils.cpp18
-rw-r--r--net/netlink_utils.h12
-rw-r--r--scanning/scan_utils.cpp5
-rw-r--r--scanning/scan_utils.h2
-rw-r--r--scanning/scanner_impl.cpp28
-rw-r--r--scanning/single_scan_settings.cpp2
-rw-r--r--scanning/single_scan_settings.h1
-rw-r--r--server.cpp397
-rw-r--r--server.h46
-rw-r--r--tests/mock_client_interface_impl.h2
-rw-r--r--tests/mock_netlink_utils.h3
-rw-r--r--tests/mock_scan_utils.h3
-rw-r--r--tests/netlink_utils_unittest.cpp12
-rw-r--r--tests/scan_utils_unittest.cpp18
-rw-r--r--tests/scanner_unittest.cpp37
-rw-r--r--tests/server_unittest.cpp202
28 files changed, 1321 insertions, 711 deletions
diff --git a/Android.bp b/Android.bp
index 0578933..e417aaf 100644
--- a/Android.bp
+++ b/Android.bp
@@ -12,6 +12,36 @@
// See the License for the specific language governing permissions and
// limitations under the License.
+package {
+ default_applicable_licenses: ["system_connectivity_wificond_license"],
+}
+
+// Added automatically by a large-scale-change that took the approach of
+// 'apply every license found to every target'. While this makes sure we respect
+// every license restriction, it may not be entirely correct.
+//
+// e.g. GPL in an MIT project might only apply to the contrib/ directory.
+//
+// Please consider splitting the single license below into multiple licenses,
+// taking care not to lose any license_kind information, and overriding the
+// default license using the 'licenses: [...]' property on targets as needed.
+//
+// For unused files, consider creating a 'filegroup' with "//visibility:private"
+// to attach the license to, and including a comment whether the files may be
+// used in the current project.
+// http://go/android-license-faq
+license {
+ name: "system_connectivity_wificond_license",
+ visibility: [":__subpackages__"],
+ license_kinds: [
+ "SPDX-license-identifier-Apache-2.0",
+ "SPDX-license-identifier-ISC",
+ ],
+ license_text: [
+ "NOTICE",
+ ],
+}
+
cc_defaults {
name: "wificond_defaults",
@@ -37,14 +67,14 @@ cc_binary {
include_dirs: ["system/security/keystore/include"],
shared_libs: [
+ "android.system.keystore2-V1-ndk_platform",
+ "android.security.legacykeystore-ndk_platform",
"libbinder",
+ "libbinder_ndk",
"libbase",
"libcrypto",
"libcutils",
"libhidlbase",
- "libkeystore_aidl",
- "libkeystore_binder",
- "libkeystore_parcelables",
"libminijail",
"libssl",
"libutils",
@@ -164,6 +194,7 @@ filegroup {
"aidl/android/net/wifi/nl80211/IScanEvent.aidl",
"aidl/android/net/wifi/nl80211/ISendMgmtFrameEvent.aidl",
"aidl/android/net/wifi/nl80211/IWificond.aidl",
+ "aidl/android/net/wifi/nl80211/IWificondEventCallback.aidl",
"aidl/android/net/wifi/nl80211/IWifiScannerImpl.aidl",
],
path: "aidl",
diff --git a/METADATA b/METADATA
new file mode 100644
index 0000000..d97975c
--- /dev/null
+++ b/METADATA
@@ -0,0 +1,3 @@
+third_party {
+ license_type: NOTICE
+}
diff --git a/OWNERS b/OWNERS
index 3d11524..351212a 100644
--- a/OWNERS
+++ b/OWNERS
@@ -1,2 +1,2 @@
etancohen@google.com
-rpius@google.com
+arabawy@google.com
diff --git a/TEST_MAPPING b/TEST_MAPPING
new file mode 100644
index 0000000..aea06ad
--- /dev/null
+++ b/TEST_MAPPING
@@ -0,0 +1,12 @@
+{
+ "presubmit-large": [
+ {
+ "name": "CtsWifiTestCases",
+ "options": [
+ {
+ "exclude-annotation": "android.net.wifi.cts.VirtualDeviceNotSupported"
+ }
+ ]
+ }
+ ]
+}
diff --git a/aidl/android/net/wifi/nl80211/IWificond.aidl b/aidl/android/net/wifi/nl80211/IWificond.aidl
index 65560fd..d59ee33 100644
--- a/aidl/android/net/wifi/nl80211/IWificond.aidl
+++ b/aidl/android/net/wifi/nl80211/IWificond.aidl
@@ -19,6 +19,7 @@ package android.net.wifi.nl80211;
import android.net.wifi.nl80211.IApInterface;
import android.net.wifi.nl80211.IClientInterface;
import android.net.wifi.nl80211.IInterfaceEventCallback;
+import android.net.wifi.nl80211.IWificondEventCallback;
import android.net.wifi.nl80211.DeviceWiphyCapabilities;
/**
@@ -67,6 +68,10 @@ interface IWificond {
// Returrns null on failure.
@nullable int[] getAvailable6gChannels();
+ // Returns an array of available frequencies for 60GHz channels.
+ // Returrns null on failure.
+ @nullable int[] getAvailable60gChannels();
+
// Register a callback to receive interface status updates.
//
// Multiple callbacks can be registered simultaneously.
@@ -83,6 +88,22 @@ interface IWificond {
// @param callback object to remove from the set of registered callbacks.
oneway void UnregisterCallback(IInterfaceEventCallback callback);
+ // Register a callback to receive wificond event.
+ //
+ // Multiple callbacks can be registered simultaneously.
+ // Duplicate registrations of the same callback will be ignored.
+ //
+ // @param callback object to add to the set of registered callbacks.
+ oneway void registerWificondEventCallback(IWificondEventCallback callback);
+
+ // Remove a callback from the set of registered wificond event callbacks.
+ //
+ // This must be the same instance as previously registered.
+ // Requests to remove unknown callbacks will be ignored.
+ //
+ // @param callback object to remove from the set of registered callbacks.
+ oneway void unregisterWificondEventCallback(IWificondEventCallback callback);
+
// @return a device wiphy capabilities for an interface
@nullable DeviceWiphyCapabilities getDeviceWiphyCapabilities(@utf8InCpp String iface_name);
}
diff --git a/aidl/android/net/wifi/nl80211/IWificondEventCallback.aidl b/aidl/android/net/wifi/nl80211/IWificondEventCallback.aidl
new file mode 100644
index 0000000..f85b20d
--- /dev/null
+++ b/aidl/android/net/wifi/nl80211/IWificondEventCallback.aidl
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net.wifi.nl80211;
+
+/**
+ * A callback for receiving events related to this chip.
+ * @hide
+ */
+interface IWificondEventCallback {
+ oneway void OnRegDomainChanged(@utf8InCpp String countryCode);
+}
diff --git a/client_interface_impl.cpp b/client_interface_impl.cpp
index 38a59ff..26bcba3 100644
--- a/client_interface_impl.cpp
+++ b/client_interface_impl.cpp
@@ -242,6 +242,10 @@ const std::array<uint8_t, ETH_ALEN>& ClientInterfaceImpl::GetMacAddress() {
return interface_mac_addr_;
}
+const BandInfo& ClientInterfaceImpl::GetBandInfo() const {
+ return band_info_;
+}
+
bool ClientInterfaceImpl::RefreshAssociateFreq() {
// wpa_supplicant fetches associate frequency using the latest scan result.
// We should follow the same method here before we find a better solution.
diff --git a/client_interface_impl.h b/client_interface_impl.h
index 4ecbf1d..c52c2b0 100644
--- a/client_interface_impl.h
+++ b/client_interface_impl.h
@@ -78,6 +78,7 @@ class ClientInterfaceImpl {
bool SignalPoll(std::vector<int32_t>* out_signal_poll_results);
const std::array<uint8_t, ETH_ALEN>& GetMacAddress();
const std::string& GetInterfaceName() const { return interface_name_; }
+ const BandInfo& GetBandInfo() const;
const android::sp<ScannerImpl> GetScanner() { return scanner_; };
virtual bool IsAssociated() const;
void Dump(std::stringstream* ss) const;
diff --git a/net/kernel-header-latest/README.txt b/net/kernel-header-latest/README.txt
index 4dfcb55..4e79209 100644
--- a/net/kernel-header-latest/README.txt
+++ b/net/kernel-header-latest/README.txt
@@ -9,4 +9,4 @@ Copy the nl80211.h header from the following location:
cp <kernel-dir>/private/msm-google/include/uapi/linux/nl80211.h
<android-source-dir>/system/connectivity/wificond/net/kernel-header-latest/nl80211.h
-Last update from kernel branch: `p-dev-msm-bluecross-4.9`
+Last update from kernel branch: `upstream-f2fs-stable-linux-5.10.y`
diff --git a/net/kernel-header-latest/nl80211.h b/net/kernel-header-latest/nl80211.h
index 341e0e8..cd587e1 100644
--- a/net/kernel-header-latest/nl80211.h
+++ b/net/kernel-header-latest/nl80211.h
@@ -11,7 +11,7 @@
* Copyright 2008 Jouni Malinen <jouni.malinen@atheros.com>
* Copyright 2008 Colin McCabe <colin@cozybit.com>
* Copyright 2015-2017 Intel Deutschland GmbH
- * Copyright (C) 2018-2019 Intel Corporation
+ * Copyright (C) 2018-2020 Intel Corporation
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -26,7 +26,6 @@
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
*/
-
/*
* This header file defines the userspace API to the wireless stack. Please
* be careful not to break things - i.e. don't move anything around or so
@@ -39,11 +38,8 @@
* can actually be identified and removed.
* Nonetheless, semantics should also be documented carefully in this file.
*/
-
#include <linux/types.h>
-
#define NL80211_GENL_NAME "nl80211"
-
#define NL80211_MULTICAST_GROUP_CONFIG "config"
#define NL80211_MULTICAST_GROUP_SCAN "scan"
#define NL80211_MULTICAST_GROUP_REG "regulatory"
@@ -51,12 +47,10 @@
#define NL80211_MULTICAST_GROUP_VENDOR "vendor"
#define NL80211_MULTICAST_GROUP_NAN "nan"
#define NL80211_MULTICAST_GROUP_TESTMODE "testmode"
-
#define NL80211_EDMG_BW_CONFIG_MIN 4
#define NL80211_EDMG_BW_CONFIG_MAX 15
#define NL80211_EDMG_CHANNELS_MIN 1
#define NL80211_EDMG_CHANNELS_MAX 0x3c /* 0b00111100 */
-
/**
* DOC: Station handling
*
@@ -82,7 +76,6 @@
*
* TODO: need more info for other interface types
*/
-
/**
* DOC: Frame transmission/registration support
*
@@ -119,7 +112,6 @@
* For more technical details, see the corresponding command descriptions
* below.
*/
-
/**
* DOC: Virtual interface / concurrency capabilities
*
@@ -152,7 +144,6 @@
* All together, these attributes define the concurrency of virtual
* interfaces that a given device supports.
*/
-
/**
* DOC: packet coalesce support
*
@@ -177,30 +168,37 @@
* c) Condition for coalescence. pattern 'match' or 'no match'
* Multiple such rules can be created.
*/
-
/**
* DOC: WPA/WPA2 EAPOL handshake offload
*
* By setting @NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_PSK flag drivers
* can indicate they support offloading EAPOL handshakes for WPA/WPA2
- * preshared key authentication. In %NL80211_CMD_CONNECT the preshared
- * key should be specified using %NL80211_ATTR_PMK. Drivers supporting
- * this offload may reject the %NL80211_CMD_CONNECT when no preshared
- * key material is provided, for example when that driver does not
- * support setting the temporal keys through %CMD_NEW_KEY.
+ * preshared key authentication in station mode. In %NL80211_CMD_CONNECT
+ * the preshared key should be specified using %NL80211_ATTR_PMK. Drivers
+ * supporting this offload may reject the %NL80211_CMD_CONNECT when no
+ * preshared key material is provided, for example when that driver does
+ * not support setting the temporal keys through %NL80211_CMD_NEW_KEY.
*
* Similarly @NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_1X flag can be
* set by drivers indicating offload support of the PTK/GTK EAPOL
- * handshakes during 802.1X authentication. In order to use the offload
- * the %NL80211_CMD_CONNECT should have %NL80211_ATTR_WANT_1X_4WAY_HS
- * attribute flag. Drivers supporting this offload may reject the
- * %NL80211_CMD_CONNECT when the attribute flag is not present.
+ * handshakes during 802.1X authentication in station mode. In order to
+ * use the offload the %NL80211_CMD_CONNECT should have
+ * %NL80211_ATTR_WANT_1X_4WAY_HS attribute flag. Drivers supporting this
+ * offload may reject the %NL80211_CMD_CONNECT when the attribute flag is
+ * not present.
+ *
+ * By setting @NL80211_EXT_FEATURE_4WAY_HANDSHAKE_AP_PSK flag drivers
+ * can indicate they support offloading EAPOL handshakes for WPA/WPA2
+ * preshared key authentication in AP mode. In %NL80211_CMD_START_AP
+ * the preshared key should be specified using %NL80211_ATTR_PMK. Drivers
+ * supporting this offload may reject the %NL80211_CMD_START_AP when no
+ * preshared key material is provided, for example when that driver does
+ * not support setting the temporal keys through %NL80211_CMD_NEW_KEY.
*
* For 802.1X the PMK or PMK-R0 are set by providing %NL80211_ATTR_PMK
* using %NL80211_CMD_SET_PMK. For offloaded FT support also
* %NL80211_ATTR_PMKR0_NAME must be provided.
*/
-
/**
* DOC: FILS shared key authentication offload
*
@@ -238,16 +236,18 @@
* %NL80211_SET_PMKSA to specify the PMK corresponding to a PMKSA for driver to
* use in a FILS shared key connection with PMKSA caching.
*/
-
/**
* DOC: SAE authentication offload
*
* By setting @NL80211_EXT_FEATURE_SAE_OFFLOAD flag drivers can indicate they
- * support offloading SAE authentication for WPA3-Personal networks. In
- * %NL80211_CMD_CONNECT the password for SAE should be specified using
- * %NL80211_ATTR_SAE_PASSWORD.
+ * support offloading SAE authentication for WPA3-Personal networks in station
+ * mode. Similarly @NL80211_EXT_FEATURE_SAE_OFFLOAD_AP flag can be set by
+ * drivers indicating the offload support in AP mode.
+ *
+ * The password for SAE should be specified using %NL80211_ATTR_SAE_PASSWORD in
+ * %NL80211_CMD_CONNECT and %NL80211_CMD_START_AP for station and AP mode
+ * respectively.
*/
-
/**
* DOC: VLAN offload support for setting group keys and binding STAs to VLANs
*
@@ -263,7 +263,28 @@
* %NL80211_CMD_SET_STATION will optionally specify vlan_id using
* %NL80211_ATTR_VLAN_ID.
*/
-
+/**
+ * DOC: TID configuration
+ *
+ * TID config support can be checked in the %NL80211_ATTR_TID_CONFIG
+ * attribute given in wiphy capabilities.
+ *
+ * The necessary configuration parameters are mentioned in
+ * &enum nl80211_tid_config_attr and it will be passed to the
+ * %NL80211_CMD_SET_TID_CONFIG command in %NL80211_ATTR_TID_CONFIG.
+ *
+ * If the configuration needs to be applied for specific peer then the MAC
+ * address of the peer needs to be passed in %NL80211_ATTR_MAC, otherwise the
+ * configuration will be applied for all the connected peers in the vif except
+ * any peers that have peer specific configuration for the TID by default; if
+ * the %NL80211_TID_CONFIG_ATTR_OVERRIDE flag is set, peer specific values
+ * will be overwritten.
+ *
+ * All this configuration is valid only for STA's current connection
+ * i.e. the configuration will be reset to default when the STA connects back
+ * after disconnection/roaming, and this configuration will be cleared when
+ * the interface goes down.
+ */
/**
* enum nl80211_commands - supported nl80211 commands
*
@@ -273,13 +294,14 @@
* to get a list of all present wiphys.
* @NL80211_CMD_SET_WIPHY: set wiphy parameters, needs %NL80211_ATTR_WIPHY or
* %NL80211_ATTR_IFINDEX; can be used to set %NL80211_ATTR_WIPHY_NAME,
- * %NL80211_ATTR_WIPHY_TXQ_PARAMS, %NL80211_ATTR_WIPHY_FREQ (and the
- * attributes determining the channel width; this is used for setting
- * monitor mode channel), %NL80211_ATTR_WIPHY_RETRY_SHORT,
- * %NL80211_ATTR_WIPHY_RETRY_LONG, %NL80211_ATTR_WIPHY_FRAG_THRESHOLD,
- * and/or %NL80211_ATTR_WIPHY_RTS_THRESHOLD.
- * However, for setting the channel, see %NL80211_CMD_SET_CHANNEL
- * instead, the support here is for backward compatibility only.
+ * %NL80211_ATTR_WIPHY_TXQ_PARAMS, %NL80211_ATTR_WIPHY_FREQ,
+ * %NL80211_ATTR_WIPHY_FREQ_OFFSET (and the attributes determining the
+ * channel width; this is used for setting monitor mode channel),
+ * %NL80211_ATTR_WIPHY_RETRY_SHORT, %NL80211_ATTR_WIPHY_RETRY_LONG,
+ * %NL80211_ATTR_WIPHY_FRAG_THRESHOLD, and/or
+ * %NL80211_ATTR_WIPHY_RTS_THRESHOLD. However, for setting the channel,
+ * see %NL80211_CMD_SET_CHANNEL instead, the support here is for backward
+ * compatibility only.
* @NL80211_CMD_NEW_WIPHY: Newly created wiphy, response to get request
* or rename notification. Has attributes %NL80211_ATTR_WIPHY and
* %NL80211_ATTR_WIPHY_NAME.
@@ -328,7 +350,8 @@
* %NL80211_ATTR_AUTH_TYPE, %NL80211_ATTR_INACTIVITY_TIMEOUT,
* %NL80211_ATTR_ACL_POLICY and %NL80211_ATTR_MAC_ADDRS.
* The channel to use can be set on the interface or be given using the
- * %NL80211_ATTR_WIPHY_FREQ and the attributes determining channel width.
+ * %NL80211_ATTR_WIPHY_FREQ and %NL80211_ATTR_WIPHY_FREQ_OFFSET, and the
+ * attributes determining channel width.
* @NL80211_CMD_NEW_BEACON: old alias for %NL80211_CMD_START_AP
* @NL80211_CMD_STOP_AP: Stop AP operation on the given interface
* @NL80211_CMD_DEL_BEACON: old alias for %NL80211_CMD_STOP_AP
@@ -338,7 +361,7 @@
* @NL80211_CMD_SET_STATION: Set station attributes for station identified by
* %NL80211_ATTR_MAC on the interface identified by %NL80211_ATTR_IFINDEX.
* @NL80211_CMD_NEW_STATION: Add a station with given attributes to the
- * the interface identified by %NL80211_ATTR_IFINDEX.
+ * interface identified by %NL80211_ATTR_IFINDEX.
* @NL80211_CMD_DEL_STATION: Remove a station identified by %NL80211_ATTR_MAC
* or, if no MAC address given, all stations, on the interface identified
* by %NL80211_ATTR_IFINDEX. %NL80211_ATTR_MGMT_SUBTYPE and
@@ -358,7 +381,7 @@
* @NL80211_CMD_DEL_MPATH: Delete a mesh path to the destination given by
* %NL80211_ATTR_MAC.
* @NL80211_CMD_NEW_PATH: Add a mesh path with given attributes to the
- * the interface identified by %NL80211_ATTR_IFINDEX.
+ * interface identified by %NL80211_ATTR_IFINDEX.
* @NL80211_CMD_DEL_PATH: Remove a mesh path identified by %NL80211_ATTR_MAC
* or, if no MAC address given, all mesh paths, on the interface identified
* by %NL80211_ATTR_IFINDEX.
@@ -513,11 +536,12 @@
* interface. %NL80211_ATTR_MAC is used to specify PeerSTAAddress (and
* BSSID in case of station mode). %NL80211_ATTR_SSID is used to specify
* the SSID (mainly for association, but is included in authentication
- * request, too, to help BSS selection. %NL80211_ATTR_WIPHY_FREQ is used
- * to specify the frequence of the channel in MHz. %NL80211_ATTR_AUTH_TYPE
- * is used to specify the authentication type. %NL80211_ATTR_IE is used to
- * define IEs (VendorSpecificInfo, but also including RSN IE and FT IEs)
- * to be added to the frame.
+ * request, too, to help BSS selection. %NL80211_ATTR_WIPHY_FREQ +
+ * %NL80211_ATTR_WIPHY_FREQ_OFFSET is used to specify the frequence of the
+ * channel in MHz. %NL80211_ATTR_AUTH_TYPE is used to specify the
+ * authentication type. %NL80211_ATTR_IE is used to define IEs
+ * (VendorSpecificInfo, but also including RSN IE and FT IEs) to be added
+ * to the frame.
* When used as an event, this reports reception of an Authentication
* frame in station and IBSS modes when the local MLME processed the
* frame, i.e., it was for the local STA and was received in correct
@@ -572,8 +596,9 @@
* requests to connect to a specified network but without separating
* auth and assoc steps. For this, you need to specify the SSID in a
* %NL80211_ATTR_SSID attribute, and can optionally specify the association
- * IEs in %NL80211_ATTR_IE, %NL80211_ATTR_AUTH_TYPE, %NL80211_ATTR_USE_MFP,
- * %NL80211_ATTR_MAC, %NL80211_ATTR_WIPHY_FREQ, %NL80211_ATTR_CONTROL_PORT,
+ * IEs in %NL80211_ATTR_IE, %NL80211_ATTR_AUTH_TYPE,
+ * %NL80211_ATTR_USE_MFP, %NL80211_ATTR_MAC, %NL80211_ATTR_WIPHY_FREQ,
+ * %NL80211_ATTR_WIPHY_FREQ_OFFSET, %NL80211_ATTR_CONTROL_PORT,
* %NL80211_ATTR_CONTROL_PORT_ETHERTYPE,
* %NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT,
* %NL80211_ATTR_CONTROL_PORT_OVER_NL80211, %NL80211_ATTR_MAC_HINT, and
@@ -611,13 +636,9 @@
* authentication/association or not receiving a response from the AP.
* Non-zero %NL80211_ATTR_STATUS_CODE value is indicated in that case as
* well to remain backwards compatible.
- * When establishing a security association, drivers that support 4 way
- * handshake offload should send %NL80211_CMD_PORT_AUTHORIZED event when
- * the 4 way handshake is completed successfully.
* @NL80211_CMD_ROAM: Notification indicating the card/driver roamed by itself.
- * When a security association was established with the new AP (e.g. if
- * the FT protocol was used for roaming or the driver completed the 4 way
- * handshake), this event should be followed by an
+ * When a security association was established on an 802.1X network using
+ * fast transition, this event should be followed by an
* %NL80211_CMD_PORT_AUTHORIZED event.
* @NL80211_CMD_DISCONNECT: drop a given connection; also used to notify
* userspace that a connection was dropped by the AP or due to other
@@ -664,6 +685,10 @@
* four bytes for vendor frames including the OUI. The registration
* cannot be dropped, but is removed automatically when the netlink
* socket is closed. Multiple registrations can be made.
+ * The %NL80211_ATTR_RECEIVE_MULTICAST flag attribute can be given if
+ * %NL80211_EXT_FEATURE_MULTICAST_REGISTRATIONS is available, in which
+ * case the registration can also be modified to include/exclude the
+ * flag, rather than requiring unregistration to change it.
* @NL80211_CMD_REGISTER_ACTION: Alias for @NL80211_CMD_REGISTER_FRAME for
* backward compatibility
* @NL80211_CMD_FRAME: Management frame TX request and RX notification. This
@@ -763,7 +788,7 @@
* various triggers. These triggers can be configured through this
* command with the %NL80211_ATTR_WOWLAN_TRIGGERS attribute. For
* more background information, see
- * http://wireless.kernel.org/en/users/Documentation/WoWLAN.
+ * https://wireless.wiki.kernel.org/en/users/Documentation/WoWLAN.
* The @NL80211_CMD_SET_WOWLAN command can also be used as a notification
* from the driver reporting the wakeup reason. In this case, the
* @NL80211_ATTR_WOWLAN_TRIGGERS attribute will contain the reason
@@ -903,7 +928,7 @@
* @NL80211_CMD_SET_COALESCE: Configure coalesce rules or clear existing rules.
*
* @NL80211_CMD_CHANNEL_SWITCH: Perform a channel switch by announcing the
- * the new channel information (Channel Switch Announcement - CSA)
+ * new channel information (Channel Switch Announcement - CSA)
* in the beacon for some time (as defined in the
* %NL80211_ATTR_CH_SWITCH_COUNT parameter) and then change to the
* new channel. Userspace provides the new channel information (using
@@ -1027,13 +1052,11 @@
* @NL80211_CMD_DEL_PMK: For offloaded 4-Way handshake, delete the previously
* configured PMK for the authenticator address identified by
* %NL80211_ATTR_MAC.
- * @NL80211_CMD_PORT_AUTHORIZED: An event that indicates that the 4 way
- * handshake was completed successfully by the driver. The BSSID is
- * specified with %NL80211_ATTR_MAC. Drivers that support 4 way handshake
- * offload should send this event after indicating 802.11 association with
- * %NL80211_CMD_CONNECT or %NL80211_CMD_ROAM. If the 4 way handshake failed
- * %NL80211_CMD_DISCONNECT should be indicated instead.
- *
+ * @NL80211_CMD_PORT_AUTHORIZED: An event that indicates an 802.1X FT roam was
+ * completed successfully. Drivers that support 4 way handshake offload
+ * should send this event after indicating 802.1X FT association with
+ * %NL80211_CMD_ROAM. If the 4 way handshake failed %NL80211_CMD_DISCONNECT
+ * should be indicated instead.
* @NL80211_CMD_CONTROL_PORT_FRAME: Control Port (e.g. PAE) frame TX request
* and RX notification. This command is used both as a request to transmit
* a control port frame and as a notification that a control port frame
@@ -1082,7 +1105,7 @@
* randomization may be enabled and configured by specifying the
* %NL80211_ATTR_MAC and %NL80211_ATTR_MAC_MASK attributes.
* If a timeout is requested, use the %NL80211_ATTR_TIMEOUT attribute.
- * A u64 cookie for further %NL80211_ATTR_COOKIE use is is returned in
+ * A u64 cookie for further %NL80211_ATTR_COOKIE use is returned in
* the netlink extended ack message.
*
* To cancel a measurement, close the socket that requested it.
@@ -1125,237 +1148,175 @@
* peer MAC address and %NL80211_ATTR_FRAME is used to specify the frame
* content. The frame is ethernet data.
*
+ * @NL80211_CMD_SET_TID_CONFIG: Data frame TID specific configuration
+ * is passed using %NL80211_ATTR_TID_CONFIG attribute.
+ *
+ * @NL80211_CMD_UNPROT_BEACON: Unprotected or incorrectly protected Beacon
+ * frame. This event is used to indicate that a received Beacon frame was
+ * dropped because it did not include a valid MME MIC while beacon
+ * protection was enabled (BIGTK configured in station mode).
+ *
+ * @NL80211_CMD_CONTROL_PORT_FRAME_TX_STATUS: Report TX status of a control
+ * port frame transmitted with %NL80211_CMD_CONTROL_PORT_FRAME.
+ * %NL80211_ATTR_COOKIE identifies the TX command and %NL80211_ATTR_FRAME
+ * includes the contents of the frame. %NL80211_ATTR_ACK flag is included
+ * if the recipient acknowledged the frame.
+ *
* @NL80211_CMD_MAX: highest used command number
* @__NL80211_CMD_AFTER_LAST: internal use
*/
enum nl80211_commands {
/* don't change the order or add anything between, this is ABI! */
NL80211_CMD_UNSPEC,
-
NL80211_CMD_GET_WIPHY, /* can dump */
NL80211_CMD_SET_WIPHY,
NL80211_CMD_NEW_WIPHY,
NL80211_CMD_DEL_WIPHY,
-
NL80211_CMD_GET_INTERFACE, /* can dump */
NL80211_CMD_SET_INTERFACE,
NL80211_CMD_NEW_INTERFACE,
NL80211_CMD_DEL_INTERFACE,
-
NL80211_CMD_GET_KEY,
NL80211_CMD_SET_KEY,
NL80211_CMD_NEW_KEY,
NL80211_CMD_DEL_KEY,
-
NL80211_CMD_GET_BEACON,
NL80211_CMD_SET_BEACON,
NL80211_CMD_START_AP,
NL80211_CMD_NEW_BEACON = NL80211_CMD_START_AP,
NL80211_CMD_STOP_AP,
NL80211_CMD_DEL_BEACON = NL80211_CMD_STOP_AP,
-
NL80211_CMD_GET_STATION,
NL80211_CMD_SET_STATION,
NL80211_CMD_NEW_STATION,
NL80211_CMD_DEL_STATION,
-
NL80211_CMD_GET_MPATH,
NL80211_CMD_SET_MPATH,
NL80211_CMD_NEW_MPATH,
NL80211_CMD_DEL_MPATH,
-
NL80211_CMD_SET_BSS,
-
NL80211_CMD_SET_REG,
NL80211_CMD_REQ_SET_REG,
-
NL80211_CMD_GET_MESH_CONFIG,
NL80211_CMD_SET_MESH_CONFIG,
-
NL80211_CMD_SET_MGMT_EXTRA_IE /* reserved; not used */,
-
NL80211_CMD_GET_REG,
-
NL80211_CMD_GET_SCAN,
NL80211_CMD_TRIGGER_SCAN,
NL80211_CMD_NEW_SCAN_RESULTS,
NL80211_CMD_SCAN_ABORTED,
-
NL80211_CMD_REG_CHANGE,
-
NL80211_CMD_AUTHENTICATE,
NL80211_CMD_ASSOCIATE,
NL80211_CMD_DEAUTHENTICATE,
NL80211_CMD_DISASSOCIATE,
-
NL80211_CMD_MICHAEL_MIC_FAILURE,
-
NL80211_CMD_REG_BEACON_HINT,
-
NL80211_CMD_JOIN_IBSS,
NL80211_CMD_LEAVE_IBSS,
-
NL80211_CMD_TESTMODE,
-
NL80211_CMD_CONNECT,
NL80211_CMD_ROAM,
NL80211_CMD_DISCONNECT,
-
NL80211_CMD_SET_WIPHY_NETNS,
-
NL80211_CMD_GET_SURVEY,
NL80211_CMD_NEW_SURVEY_RESULTS,
-
NL80211_CMD_SET_PMKSA,
NL80211_CMD_DEL_PMKSA,
NL80211_CMD_FLUSH_PMKSA,
-
NL80211_CMD_REMAIN_ON_CHANNEL,
NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL,
-
NL80211_CMD_SET_TX_BITRATE_MASK,
-
NL80211_CMD_REGISTER_FRAME,
NL80211_CMD_REGISTER_ACTION = NL80211_CMD_REGISTER_FRAME,
NL80211_CMD_FRAME,
NL80211_CMD_ACTION = NL80211_CMD_FRAME,
NL80211_CMD_FRAME_TX_STATUS,
NL80211_CMD_ACTION_TX_STATUS = NL80211_CMD_FRAME_TX_STATUS,
-
NL80211_CMD_SET_POWER_SAVE,
NL80211_CMD_GET_POWER_SAVE,
-
NL80211_CMD_SET_CQM,
NL80211_CMD_NOTIFY_CQM,
-
NL80211_CMD_SET_CHANNEL,
NL80211_CMD_SET_WDS_PEER,
-
NL80211_CMD_FRAME_WAIT_CANCEL,
-
NL80211_CMD_JOIN_MESH,
NL80211_CMD_LEAVE_MESH,
-
NL80211_CMD_UNPROT_DEAUTHENTICATE,
NL80211_CMD_UNPROT_DISASSOCIATE,
-
NL80211_CMD_NEW_PEER_CANDIDATE,
-
NL80211_CMD_GET_WOWLAN,
NL80211_CMD_SET_WOWLAN,
-
NL80211_CMD_START_SCHED_SCAN,
NL80211_CMD_STOP_SCHED_SCAN,
NL80211_CMD_SCHED_SCAN_RESULTS,
NL80211_CMD_SCHED_SCAN_STOPPED,
-
NL80211_CMD_SET_REKEY_OFFLOAD,
-
NL80211_CMD_PMKSA_CANDIDATE,
-
NL80211_CMD_TDLS_OPER,
NL80211_CMD_TDLS_MGMT,
-
NL80211_CMD_UNEXPECTED_FRAME,
-
NL80211_CMD_PROBE_CLIENT,
-
NL80211_CMD_REGISTER_BEACONS,
-
NL80211_CMD_UNEXPECTED_4ADDR_FRAME,
-
NL80211_CMD_SET_NOACK_MAP,
-
NL80211_CMD_CH_SWITCH_NOTIFY,
-
NL80211_CMD_START_P2P_DEVICE,
NL80211_CMD_STOP_P2P_DEVICE,
-
NL80211_CMD_CONN_FAILED,
-
NL80211_CMD_SET_MCAST_RATE,
-
NL80211_CMD_SET_MAC_ACL,
-
NL80211_CMD_RADAR_DETECT,
-
NL80211_CMD_GET_PROTOCOL_FEATURES,
-
NL80211_CMD_UPDATE_FT_IES,
NL80211_CMD_FT_EVENT,
-
NL80211_CMD_CRIT_PROTOCOL_START,
NL80211_CMD_CRIT_PROTOCOL_STOP,
-
NL80211_CMD_GET_COALESCE,
NL80211_CMD_SET_COALESCE,
-
NL80211_CMD_CHANNEL_SWITCH,
-
NL80211_CMD_VENDOR,
-
NL80211_CMD_SET_QOS_MAP,
-
NL80211_CMD_ADD_TX_TS,
NL80211_CMD_DEL_TX_TS,
-
NL80211_CMD_GET_MPP,
-
NL80211_CMD_JOIN_OCB,
NL80211_CMD_LEAVE_OCB,
-
NL80211_CMD_CH_SWITCH_STARTED_NOTIFY,
-
NL80211_CMD_TDLS_CHANNEL_SWITCH,
NL80211_CMD_TDLS_CANCEL_CHANNEL_SWITCH,
-
NL80211_CMD_WIPHY_REG_CHANGE,
-
NL80211_CMD_ABORT_SCAN,
-
NL80211_CMD_START_NAN,
NL80211_CMD_STOP_NAN,
NL80211_CMD_ADD_NAN_FUNCTION,
NL80211_CMD_DEL_NAN_FUNCTION,
NL80211_CMD_CHANGE_NAN_CONFIG,
NL80211_CMD_NAN_MATCH,
-
NL80211_CMD_SET_MULTICAST_TO_UNICAST,
-
NL80211_CMD_UPDATE_CONNECT_PARAMS,
-
NL80211_CMD_SET_PMK,
NL80211_CMD_DEL_PMK,
-
NL80211_CMD_PORT_AUTHORIZED,
-
NL80211_CMD_RELOAD_REGDB,
-
NL80211_CMD_EXTERNAL_AUTH,
-
NL80211_CMD_STA_OPMODE_CHANGED,
-
NL80211_CMD_CONTROL_PORT_FRAME,
-
NL80211_CMD_GET_FTM_RESPONDER_STATS,
-
NL80211_CMD_PEER_MEASUREMENT_START,
NL80211_CMD_PEER_MEASUREMENT_RESULT,
NL80211_CMD_PEER_MEASUREMENT_COMPLETE,
-
NL80211_CMD_NOTIFY_RADAR,
-
NL80211_CMD_UPDATE_OWE_INFO,
-
NL80211_CMD_PROBE_MESH_LINK,
-
+ NL80211_CMD_SET_TID_CONFIG,
+ NL80211_CMD_UNPROT_BEACON,
+ NL80211_CMD_CONTROL_PORT_FRAME_TX_STATUS,
/* add new commands above here */
-
/* used to define NL80211_CMD_MAX below */
__NL80211_CMD_AFTER_LAST,
NL80211_CMD_MAX = __NL80211_CMD_AFTER_LAST - 1
};
-
/*
* Allow user space programs to use #ifdef on new commands by defining them
* here
@@ -1368,14 +1329,11 @@ enum nl80211_commands {
#define NL80211_CMD_DEAUTHENTICATE NL80211_CMD_DEAUTHENTICATE
#define NL80211_CMD_DISASSOCIATE NL80211_CMD_DISASSOCIATE
#define NL80211_CMD_REG_BEACON_HINT NL80211_CMD_REG_BEACON_HINT
-
#define NL80211_ATTR_FEATURE_FLAGS NL80211_ATTR_FEATURE_FLAGS
-
/* source-level API compatibility */
#define NL80211_CMD_GET_MESH_PARAMS NL80211_CMD_GET_MESH_CONFIG
#define NL80211_CMD_SET_MESH_PARAMS NL80211_CMD_SET_MESH_CONFIG
#define NL80211_MESH_SETUP_VENDOR_PATH_SEL_IE NL80211_MESH_SETUP_IE
-
/**
* enum nl80211_attrs - nl80211 netlink attributes
*
@@ -1394,7 +1352,8 @@ enum nl80211_commands {
* of &enum nl80211_chan_width, describing the channel width. See the
* documentation of the enum for more information.
* @NL80211_ATTR_CENTER_FREQ1: Center frequency of the first part of the
- * channel, used for anything but 20 MHz bandwidth
+ * channel, used for anything but 20 MHz bandwidth. In S1G this is the
+ * operating channel center frequency.
* @NL80211_ATTR_CENTER_FREQ2: Center frequency of the second part of the
* channel, used only for 80+80 MHz bandwidth
* @NL80211_ATTR_WIPHY_CHANNEL_TYPE: included with NL80211_ATTR_WIPHY_FREQ
@@ -1459,7 +1418,7 @@ enum nl80211_commands {
* rates as defined by IEEE 802.11 7.3.2.2 but without the length
* restriction (at most %NL80211_MAX_SUPP_RATES).
* @NL80211_ATTR_STA_VLAN: interface index of VLAN interface to move station
- * to, or the AP interface the station was originally added to to.
+ * to, or the AP interface the station was originally added to.
* @NL80211_ATTR_STA_INFO: information about a station, part of station info
* given for %NL80211_CMD_GET_STATION, nested attribute containing
* info as possible, see &enum nl80211_sta_info.
@@ -1604,7 +1563,8 @@ enum nl80211_commands {
* flag is included, then control port frames are sent over NL80211 instead
* using %CMD_CONTROL_PORT_FRAME. If control port routing over NL80211 is
* to be used then userspace must also use the %NL80211_ATTR_SOCKET_OWNER
- * flag.
+ * flag. When used with %NL80211_ATTR_CONTROL_PORT_NO_PREAUTH, pre-auth
+ * frames are not forwared over the control port.
*
* @NL80211_ATTR_TESTDATA: Testmode data blob, passed through to the driver.
* We recommend using nested, driver-specific attributes within this.
@@ -2020,10 +1980,10 @@ enum nl80211_commands {
* operation).
* @NL80211_ATTR_CSA_IES: Nested set of attributes containing the IE information
* for the time while performing a channel switch.
- * @NL80211_ATTR_CSA_C_OFF_BEACON: An array of offsets (u16) to the channel
- * switch counters in the beacons tail (%NL80211_ATTR_BEACON_TAIL).
- * @NL80211_ATTR_CSA_C_OFF_PRESP: An array of offsets (u16) to the channel
- * switch counters in the probe response (%NL80211_ATTR_PROBE_RESP).
+ * @NL80211_ATTR_CNTDWN_OFFS_BEACON: An array of offsets (u16) to the channel
+ * switch or color change counters in the beacons tail (%NL80211_ATTR_BEACON_TAIL).
+ * @NL80211_ATTR_CNTDWN_OFFS_PRESP: An array of offsets (u16) to the channel
+ * switch or color change counters in the probe response (%NL80211_ATTR_PROBE_RESP).
*
* @NL80211_ATTR_RXMGMT_FLAGS: flags for nl80211_send_mgmt(), u32.
* As specified in the &enum nl80211_rxmgmt_flags.
@@ -2031,7 +1991,7 @@ enum nl80211_commands {
* @NL80211_ATTR_STA_SUPPORTED_CHANNELS: array of supported channels.
*
* @NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES: array of supported
- * supported operating classes.
+ * operating classes.
*
* @NL80211_ATTR_HANDLE_DFS: A flag indicating whether user space
* controls DFS operation in IBSS mode. If the flag is included in
@@ -2163,7 +2123,6 @@ enum nl80211_commands {
* scheduled scan is started. Or the delay before a WoWLAN
* net-detect scan is started, counting from the moment the
* system is suspended. This value is a u32, in seconds.
-
* @NL80211_ATTR_REG_INDOOR: flag attribute, if set indicates that the device
* is operating in an indoor environment.
*
@@ -2309,10 +2268,11 @@ enum nl80211_commands {
*
* @NL80211_ATTR_PMK: attribute for passing PMK key material. Used with
* %NL80211_CMD_SET_PMKSA for the PMKSA identified by %NL80211_ATTR_PMKID.
- * For %NL80211_CMD_CONNECT it is used to provide PSK for offloading 4-way
- * handshake for WPA/WPA2-PSK networks. For 802.1X authentication it is
- * used with %NL80211_CMD_SET_PMK. For offloaded FT support this attribute
- * specifies the PMK-R0 if NL80211_ATTR_PMKR0_NAME is included as well.
+ * For %NL80211_CMD_CONNECT and %NL80211_CMD_START_AP it is used to provide
+ * PSK for offloading 4-way handshake for WPA/WPA2-PSK networks. For 802.1X
+ * authentication it is used with %NL80211_CMD_SET_PMK. For offloaded FT
+ * support this attribute specifies the PMK-R0 if NL80211_ATTR_PMKR0_NAME
+ * is included as well.
*
* @NL80211_ATTR_SCHED_SCAN_MULTI: flag attribute which user-space shall use to
* indicate that it supports multiple active scheduled scan requests.
@@ -2342,7 +2302,7 @@ enum nl80211_commands {
* nl80211_txq_stats)
* @NL80211_ATTR_TXQ_LIMIT: Total packet limit for the TXQ queues for this phy.
* The smaller of this and the memory limit is enforced.
- * @NL80211_ATTR_TXQ_MEMORY_LIMIT: Total memory memory limit (in bytes) for the
+ * @NL80211_ATTR_TXQ_MEMORY_LIMIT: Total memory limit (in bytes) for the
* TXQ queues for this phy. The smaller of this and the packet limit is
* enforced.
* @NL80211_ATTR_TXQ_QUANTUM: TXQ scheduler quantum (bytes). Number of bytes
@@ -2400,6 +2360,72 @@ enum nl80211_commands {
* @NL80211_ATTR_VLAN_ID: VLAN ID (1..4094) for the station and VLAN group key
* (u16).
*
+ * @NL80211_ATTR_HE_BSS_COLOR: nested attribute for BSS Color Settings.
+ *
+ * @NL80211_ATTR_IFTYPE_AKM_SUITES: nested array attribute, with each entry
+ * using attributes from &enum nl80211_iftype_akm_attributes. This
+ * attribute is sent in a response to %NL80211_CMD_GET_WIPHY indicating
+ * supported AKM suites capability per interface. AKMs advertised in
+ * %NL80211_ATTR_AKM_SUITES are default capabilities if AKM suites not
+ * advertised for a specific interface type.
+ *
+ * @NL80211_ATTR_TID_CONFIG: TID specific configuration in a
+ * nested attribute with &enum nl80211_tid_config_attr sub-attributes;
+ * on output (in wiphy attributes) it contains only the feature sub-
+ * attributes.
+ *
+ * @NL80211_ATTR_CONTROL_PORT_NO_PREAUTH: disable preauth frame rx on control
+ * port in order to forward/receive them as ordinary data frames.
+ *
+ * @NL80211_ATTR_PMK_LIFETIME: Maximum lifetime for PMKSA in seconds (u32,
+ * dot11RSNAConfigPMKReauthThreshold; 0 is not a valid value).
+ * An optional parameter configured through %NL80211_CMD_SET_PMKSA.
+ * Drivers that trigger roaming need to know the lifetime of the
+ * configured PMKSA for triggering the full vs. PMKSA caching based
+ * authentication. This timeout helps authentication methods like SAE,
+ * where PMK gets updated only by going through a full (new SAE)
+ * authentication instead of getting updated during an association for EAP
+ * authentication. No new full authentication within the PMK expiry shall
+ * result in a disassociation at the end of the lifetime.
+ *
+ * @NL80211_ATTR_PMK_REAUTH_THRESHOLD: Reauthentication threshold time, in
+ * terms of percentage of %NL80211_ATTR_PMK_LIFETIME
+ * (u8, dot11RSNAConfigPMKReauthThreshold, 1..100). This is an optional
+ * parameter configured through %NL80211_CMD_SET_PMKSA. Requests the
+ * driver to trigger a full authentication roam (without PMKSA caching)
+ * after the reauthentication threshold time, but before the PMK lifetime
+ * has expired.
+ *
+ * Authentication methods like SAE need to be able to generate a new PMKSA
+ * entry without having to force a disconnection after the PMK timeout. If
+ * no roaming occurs between the reauth threshold and PMK expiration,
+ * disassociation is still forced.
+ * @NL80211_ATTR_RECEIVE_MULTICAST: multicast flag for the
+ * %NL80211_CMD_REGISTER_FRAME command, see the description there.
+ * @NL80211_ATTR_WIPHY_FREQ_OFFSET: offset of the associated
+ * %NL80211_ATTR_WIPHY_FREQ in positive KHz. Only valid when supplied with
+ * an %NL80211_ATTR_WIPHY_FREQ_OFFSET.
+ * @NL80211_ATTR_CENTER_FREQ1_OFFSET: Center frequency offset in KHz for the
+ * first channel segment specified in %NL80211_ATTR_CENTER_FREQ1.
+ * @NL80211_ATTR_SCAN_FREQ_KHZ: nested attribute with KHz frequencies
+ *
+ * @NL80211_ATTR_HE_6GHZ_CAPABILITY: HE 6 GHz Band Capability element (from
+ * association request when used with NL80211_CMD_NEW_STATION).
+ *
+ * @NL80211_ATTR_FILS_DISCOVERY: Optional parameter to configure FILS
+ * discovery. It is a nested attribute, see
+ * &enum nl80211_fils_discovery_attributes.
+ *
+ * @NL80211_ATTR_UNSOL_BCAST_PROBE_RESP: Optional parameter to configure
+ * unsolicited broadcast probe response. It is a nested attribute, see
+ * &enum nl80211_unsol_bcast_probe_resp_attributes.
+ *
+ * @NL80211_ATTR_S1G_CAPABILITY: S1G Capability information element (from
+ * association request when used with NL80211_CMD_NEW_STATION)
+ * @NL80211_ATTR_S1G_CAPABILITY_MASK: S1G Capability Information element
+ * override mask. Used with NL80211_ATTR_S1G_CAPABILITY in
+ * NL80211_CMD_ASSOCIATE or NL80211_CMD_CONNECT.
+ *
* @NUM_NL80211_ATTR: total number of nl80211_attrs available
* @NL80211_ATTR_MAX: highest attribute number currently defined
* @__NL80211_ATTR_AFTER_LAST: internal use
@@ -2407,476 +2433,315 @@ enum nl80211_commands {
enum nl80211_attrs {
/* don't change the order or add anything between, this is ABI! */
NL80211_ATTR_UNSPEC,
-
NL80211_ATTR_WIPHY,
NL80211_ATTR_WIPHY_NAME,
-
NL80211_ATTR_IFINDEX,
NL80211_ATTR_IFNAME,
NL80211_ATTR_IFTYPE,
-
NL80211_ATTR_MAC,
-
NL80211_ATTR_KEY_DATA,
NL80211_ATTR_KEY_IDX,
NL80211_ATTR_KEY_CIPHER,
NL80211_ATTR_KEY_SEQ,
NL80211_ATTR_KEY_DEFAULT,
-
NL80211_ATTR_BEACON_INTERVAL,
NL80211_ATTR_DTIM_PERIOD,
NL80211_ATTR_BEACON_HEAD,
NL80211_ATTR_BEACON_TAIL,
-
NL80211_ATTR_STA_AID,
NL80211_ATTR_STA_FLAGS,
NL80211_ATTR_STA_LISTEN_INTERVAL,
NL80211_ATTR_STA_SUPPORTED_RATES,
NL80211_ATTR_STA_VLAN,
NL80211_ATTR_STA_INFO,
-
NL80211_ATTR_WIPHY_BANDS,
-
NL80211_ATTR_MNTR_FLAGS,
-
NL80211_ATTR_MESH_ID,
NL80211_ATTR_STA_PLINK_ACTION,
NL80211_ATTR_MPATH_NEXT_HOP,
NL80211_ATTR_MPATH_INFO,
-
NL80211_ATTR_BSS_CTS_PROT,
NL80211_ATTR_BSS_SHORT_PREAMBLE,
NL80211_ATTR_BSS_SHORT_SLOT_TIME,
-
NL80211_ATTR_HT_CAPABILITY,
-
NL80211_ATTR_SUPPORTED_IFTYPES,
-
NL80211_ATTR_REG_ALPHA2,
NL80211_ATTR_REG_RULES,
-
NL80211_ATTR_MESH_CONFIG,
-
NL80211_ATTR_BSS_BASIC_RATES,
-
NL80211_ATTR_WIPHY_TXQ_PARAMS,
NL80211_ATTR_WIPHY_FREQ,
NL80211_ATTR_WIPHY_CHANNEL_TYPE,
-
NL80211_ATTR_KEY_DEFAULT_MGMT,
-
NL80211_ATTR_MGMT_SUBTYPE,
NL80211_ATTR_IE,
-
NL80211_ATTR_MAX_NUM_SCAN_SSIDS,
-
NL80211_ATTR_SCAN_FREQUENCIES,
NL80211_ATTR_SCAN_SSIDS,
NL80211_ATTR_GENERATION, /* replaces old SCAN_GENERATION */
NL80211_ATTR_BSS,
-
NL80211_ATTR_REG_INITIATOR,
NL80211_ATTR_REG_TYPE,
-
NL80211_ATTR_SUPPORTED_COMMANDS,
-
NL80211_ATTR_FRAME,
NL80211_ATTR_SSID,
NL80211_ATTR_AUTH_TYPE,
NL80211_ATTR_REASON_CODE,
-
NL80211_ATTR_KEY_TYPE,
-
NL80211_ATTR_MAX_SCAN_IE_LEN,
NL80211_ATTR_CIPHER_SUITES,
-
NL80211_ATTR_FREQ_BEFORE,
NL80211_ATTR_FREQ_AFTER,
-
NL80211_ATTR_FREQ_FIXED,
-
-
NL80211_ATTR_WIPHY_RETRY_SHORT,
NL80211_ATTR_WIPHY_RETRY_LONG,
NL80211_ATTR_WIPHY_FRAG_THRESHOLD,
NL80211_ATTR_WIPHY_RTS_THRESHOLD,
-
NL80211_ATTR_TIMED_OUT,
-
NL80211_ATTR_USE_MFP,
-
NL80211_ATTR_STA_FLAGS2,
-
NL80211_ATTR_CONTROL_PORT,
-
NL80211_ATTR_TESTDATA,
-
NL80211_ATTR_PRIVACY,
-
NL80211_ATTR_DISCONNECTED_BY_AP,
NL80211_ATTR_STATUS_CODE,
-
NL80211_ATTR_CIPHER_SUITES_PAIRWISE,
NL80211_ATTR_CIPHER_SUITE_GROUP,
NL80211_ATTR_WPA_VERSIONS,
NL80211_ATTR_AKM_SUITES,
-
NL80211_ATTR_REQ_IE,
NL80211_ATTR_RESP_IE,
-
NL80211_ATTR_PREV_BSSID,
-
NL80211_ATTR_KEY,
NL80211_ATTR_KEYS,
-
NL80211_ATTR_PID,
-
NL80211_ATTR_4ADDR,
-
NL80211_ATTR_SURVEY_INFO,
-
NL80211_ATTR_PMKID,
NL80211_ATTR_MAX_NUM_PMKIDS,
-
NL80211_ATTR_DURATION,
-
NL80211_ATTR_COOKIE,
-
NL80211_ATTR_WIPHY_COVERAGE_CLASS,
-
NL80211_ATTR_TX_RATES,
-
NL80211_ATTR_FRAME_MATCH,
-
NL80211_ATTR_ACK,
-
NL80211_ATTR_PS_STATE,
-
NL80211_ATTR_CQM,
-
NL80211_ATTR_LOCAL_STATE_CHANGE,
-
NL80211_ATTR_AP_ISOLATE,
-
NL80211_ATTR_WIPHY_TX_POWER_SETTING,
NL80211_ATTR_WIPHY_TX_POWER_LEVEL,
-
NL80211_ATTR_TX_FRAME_TYPES,
NL80211_ATTR_RX_FRAME_TYPES,
NL80211_ATTR_FRAME_TYPE,
-
NL80211_ATTR_CONTROL_PORT_ETHERTYPE,
NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT,
-
NL80211_ATTR_SUPPORT_IBSS_RSN,
-
NL80211_ATTR_WIPHY_ANTENNA_TX,
NL80211_ATTR_WIPHY_ANTENNA_RX,
-
NL80211_ATTR_MCAST_RATE,
-
NL80211_ATTR_OFFCHANNEL_TX_OK,
-
NL80211_ATTR_BSS_HT_OPMODE,
-
NL80211_ATTR_KEY_DEFAULT_TYPES,
-
NL80211_ATTR_MAX_REMAIN_ON_CHANNEL_DURATION,
-
NL80211_ATTR_MESH_SETUP,
-
NL80211_ATTR_WIPHY_ANTENNA_AVAIL_TX,
NL80211_ATTR_WIPHY_ANTENNA_AVAIL_RX,
-
NL80211_ATTR_SUPPORT_MESH_AUTH,
NL80211_ATTR_STA_PLINK_STATE,
-
NL80211_ATTR_WOWLAN_TRIGGERS,
NL80211_ATTR_WOWLAN_TRIGGERS_SUPPORTED,
-
NL80211_ATTR_SCHED_SCAN_INTERVAL,
-
NL80211_ATTR_INTERFACE_COMBINATIONS,
NL80211_ATTR_SOFTWARE_IFTYPES,
-
NL80211_ATTR_REKEY_DATA,
-
NL80211_ATTR_MAX_NUM_SCHED_SCAN_SSIDS,
NL80211_ATTR_MAX_SCHED_SCAN_IE_LEN,
-
NL80211_ATTR_SCAN_SUPP_RATES,
-
NL80211_ATTR_HIDDEN_SSID,
-
NL80211_ATTR_IE_PROBE_RESP,
NL80211_ATTR_IE_ASSOC_RESP,
-
NL80211_ATTR_STA_WME,
NL80211_ATTR_SUPPORT_AP_UAPSD,
-
NL80211_ATTR_ROAM_SUPPORT,
-
NL80211_ATTR_SCHED_SCAN_MATCH,
NL80211_ATTR_MAX_MATCH_SETS,
-
NL80211_ATTR_PMKSA_CANDIDATE,
-
NL80211_ATTR_TX_NO_CCK_RATE,
-
NL80211_ATTR_TDLS_ACTION,
NL80211_ATTR_TDLS_DIALOG_TOKEN,
NL80211_ATTR_TDLS_OPERATION,
NL80211_ATTR_TDLS_SUPPORT,
NL80211_ATTR_TDLS_EXTERNAL_SETUP,
-
NL80211_ATTR_DEVICE_AP_SME,
-
NL80211_ATTR_DONT_WAIT_FOR_ACK,
-
NL80211_ATTR_FEATURE_FLAGS,
-
NL80211_ATTR_PROBE_RESP_OFFLOAD,
-
NL80211_ATTR_PROBE_RESP,
-
NL80211_ATTR_DFS_REGION,
-
NL80211_ATTR_DISABLE_HT,
NL80211_ATTR_HT_CAPABILITY_MASK,
-
NL80211_ATTR_NOACK_MAP,
-
NL80211_ATTR_INACTIVITY_TIMEOUT,
-
NL80211_ATTR_RX_SIGNAL_DBM,
-
NL80211_ATTR_BG_SCAN_PERIOD,
-
NL80211_ATTR_WDEV,
-
NL80211_ATTR_USER_REG_HINT_TYPE,
-
NL80211_ATTR_CONN_FAILED_REASON,
-
NL80211_ATTR_AUTH_DATA,
-
NL80211_ATTR_VHT_CAPABILITY,
-
NL80211_ATTR_SCAN_FLAGS,
-
NL80211_ATTR_CHANNEL_WIDTH,
NL80211_ATTR_CENTER_FREQ1,
NL80211_ATTR_CENTER_FREQ2,
-
NL80211_ATTR_P2P_CTWINDOW,
NL80211_ATTR_P2P_OPPPS,
-
NL80211_ATTR_LOCAL_MESH_POWER_MODE,
-
NL80211_ATTR_ACL_POLICY,
-
NL80211_ATTR_MAC_ADDRS,
-
NL80211_ATTR_MAC_ACL_MAX,
-
NL80211_ATTR_RADAR_EVENT,
-
NL80211_ATTR_EXT_CAPA,
NL80211_ATTR_EXT_CAPA_MASK,
-
NL80211_ATTR_STA_CAPABILITY,
NL80211_ATTR_STA_EXT_CAPABILITY,
-
NL80211_ATTR_PROTOCOL_FEATURES,
NL80211_ATTR_SPLIT_WIPHY_DUMP,
-
NL80211_ATTR_DISABLE_VHT,
NL80211_ATTR_VHT_CAPABILITY_MASK,
-
NL80211_ATTR_MDID,
NL80211_ATTR_IE_RIC,
-
NL80211_ATTR_CRIT_PROT_ID,
NL80211_ATTR_MAX_CRIT_PROT_DURATION,
-
NL80211_ATTR_PEER_AID,
-
NL80211_ATTR_COALESCE_RULE,
-
NL80211_ATTR_CH_SWITCH_COUNT,
NL80211_ATTR_CH_SWITCH_BLOCK_TX,
NL80211_ATTR_CSA_IES,
- NL80211_ATTR_CSA_C_OFF_BEACON,
- NL80211_ATTR_CSA_C_OFF_PRESP,
-
+ NL80211_ATTR_CNTDWN_OFFS_BEACON,
+ NL80211_ATTR_CNTDWN_OFFS_PRESP,
NL80211_ATTR_RXMGMT_FLAGS,
-
NL80211_ATTR_STA_SUPPORTED_CHANNELS,
-
NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES,
-
NL80211_ATTR_HANDLE_DFS,
-
NL80211_ATTR_SUPPORT_5_MHZ,
NL80211_ATTR_SUPPORT_10_MHZ,
-
NL80211_ATTR_OPMODE_NOTIF,
-
NL80211_ATTR_VENDOR_ID,
NL80211_ATTR_VENDOR_SUBCMD,
NL80211_ATTR_VENDOR_DATA,
NL80211_ATTR_VENDOR_EVENTS,
-
NL80211_ATTR_QOS_MAP,
-
NL80211_ATTR_MAC_HINT,
NL80211_ATTR_WIPHY_FREQ_HINT,
-
NL80211_ATTR_MAX_AP_ASSOC_STA,
-
NL80211_ATTR_TDLS_PEER_CAPABILITY,
-
NL80211_ATTR_SOCKET_OWNER,
-
NL80211_ATTR_CSA_C_OFFSETS_TX,
NL80211_ATTR_MAX_CSA_COUNTERS,
-
NL80211_ATTR_TDLS_INITIATOR,
-
NL80211_ATTR_USE_RRM,
-
NL80211_ATTR_WIPHY_DYN_ACK,
-
NL80211_ATTR_TSID,
NL80211_ATTR_USER_PRIO,
NL80211_ATTR_ADMITTED_TIME,
-
NL80211_ATTR_SMPS_MODE,
-
NL80211_ATTR_OPER_CLASS,
-
NL80211_ATTR_MAC_MASK,
-
NL80211_ATTR_WIPHY_SELF_MANAGED_REG,
-
NL80211_ATTR_EXT_FEATURES,
-
NL80211_ATTR_SURVEY_RADIO_STATS,
-
NL80211_ATTR_NETNS_FD,
-
NL80211_ATTR_SCHED_SCAN_DELAY,
-
NL80211_ATTR_REG_INDOOR,
-
NL80211_ATTR_MAX_NUM_SCHED_SCAN_PLANS,
NL80211_ATTR_MAX_SCAN_PLAN_INTERVAL,
NL80211_ATTR_MAX_SCAN_PLAN_ITERATIONS,
NL80211_ATTR_SCHED_SCAN_PLANS,
-
NL80211_ATTR_PBSS,
-
NL80211_ATTR_BSS_SELECT,
-
NL80211_ATTR_STA_SUPPORT_P2P_PS,
-
NL80211_ATTR_PAD,
-
NL80211_ATTR_IFTYPE_EXT_CAPA,
-
NL80211_ATTR_MU_MIMO_GROUP_DATA,
NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR,
-
NL80211_ATTR_SCAN_START_TIME_TSF,
NL80211_ATTR_SCAN_START_TIME_TSF_BSSID,
NL80211_ATTR_MEASUREMENT_DURATION,
NL80211_ATTR_MEASUREMENT_DURATION_MANDATORY,
-
NL80211_ATTR_MESH_PEER_AID,
-
NL80211_ATTR_NAN_MASTER_PREF,
NL80211_ATTR_BANDS,
NL80211_ATTR_NAN_FUNC,
NL80211_ATTR_NAN_MATCH,
-
NL80211_ATTR_FILS_KEK,
NL80211_ATTR_FILS_NONCES,
-
NL80211_ATTR_MULTICAST_TO_UNICAST_ENABLED,
-
NL80211_ATTR_BSSID,
-
NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI,
NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST,
-
NL80211_ATTR_TIMEOUT_REASON,
-
NL80211_ATTR_FILS_ERP_USERNAME,
NL80211_ATTR_FILS_ERP_REALM,
NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM,
NL80211_ATTR_FILS_ERP_RRK,
NL80211_ATTR_FILS_CACHE_ID,
-
NL80211_ATTR_PMK,
-
NL80211_ATTR_SCHED_SCAN_MULTI,
NL80211_ATTR_SCHED_SCAN_MAX_REQS,
-
NL80211_ATTR_WANT_1X_4WAY_HS,
NL80211_ATTR_PMKR0_NAME,
NL80211_ATTR_PORT_AUTHORIZED,
-
NL80211_ATTR_EXTERNAL_AUTH_ACTION,
NL80211_ATTR_EXTERNAL_AUTH_SUPPORT,
-
NL80211_ATTR_NSS,
NL80211_ATTR_ACK_SIGNAL,
-
NL80211_ATTR_CONTROL_PORT_OVER_NL80211,
-
NL80211_ATTR_TXQ_STATS,
NL80211_ATTR_TXQ_LIMIT,
NL80211_ATTR_TXQ_MEMORY_LIMIT,
NL80211_ATTR_TXQ_QUANTUM,
-
NL80211_ATTR_HE_CAPABILITY,
-
NL80211_ATTR_FTM_RESPONDER,
-
NL80211_ATTR_FTM_RESPONDER_STATS,
-
NL80211_ATTR_TIMEOUT,
-
NL80211_ATTR_PEER_MEASUREMENTS,
-
NL80211_ATTR_AIRTIME_WEIGHT,
NL80211_ATTR_STA_TX_POWER_SETTING,
NL80211_ATTR_STA_TX_POWER,
-
NL80211_ATTR_SAE_PASSWORD,
-
NL80211_ATTR_TWT_RESPONDER,
-
NL80211_ATTR_HE_OBSS_PD,
-
NL80211_ATTR_WIPHY_EDMG_CHANNELS,
NL80211_ATTR_WIPHY_EDMG_BW_CONFIG,
-
NL80211_ATTR_VLAN_ID,
-
+ NL80211_ATTR_HE_BSS_COLOR,
+ NL80211_ATTR_IFTYPE_AKM_SUITES,
+ NL80211_ATTR_TID_CONFIG,
+ NL80211_ATTR_CONTROL_PORT_NO_PREAUTH,
+ NL80211_ATTR_PMK_LIFETIME,
+ NL80211_ATTR_PMK_REAUTH_THRESHOLD,
+ NL80211_ATTR_RECEIVE_MULTICAST,
+ NL80211_ATTR_WIPHY_FREQ_OFFSET,
+ NL80211_ATTR_CENTER_FREQ1_OFFSET,
+ NL80211_ATTR_SCAN_FREQ_KHZ,
+ NL80211_ATTR_HE_6GHZ_CAPABILITY,
+ NL80211_ATTR_FILS_DISCOVERY,
+ NL80211_ATTR_UNSOL_BCAST_PROBE_RESP,
+ NL80211_ATTR_S1G_CAPABILITY,
+ NL80211_ATTR_S1G_CAPABILITY_MASK,
/* add attributes here, update the policy in nl80211.c */
-
__NL80211_ATTR_AFTER_LAST,
NUM_NL80211_ATTR = __NL80211_ATTR_AFTER_LAST,
NL80211_ATTR_MAX = __NL80211_ATTR_AFTER_LAST - 1
};
-
/* source-level API compatibility */
#define NL80211_ATTR_SCAN_GENERATION NL80211_ATTR_GENERATION
#define NL80211_ATTR_MESH_PARAMS NL80211_ATTR_MESH_CONFIG
#define NL80211_ATTR_IFACE_SOCKET_OWNER NL80211_ATTR_SOCKET_OWNER
#define NL80211_ATTR_SAE_DATA NL80211_ATTR_AUTH_DATA
-
+#define NL80211_ATTR_CSA_C_OFF_BEACON NL80211_ATTR_CNTDWN_OFFS_BEACON
+#define NL80211_ATTR_CSA_C_OFF_PRESP NL80211_ATTR_CNTDWN_OFFS_PRESP
/*
* Allow user space programs to use #ifdef on new attributes by defining them
* here
@@ -2902,9 +2767,7 @@ enum nl80211_attrs {
#define NL80211_ATTR_KEY NL80211_ATTR_KEY
#define NL80211_ATTR_KEYS NL80211_ATTR_KEYS
#define NL80211_ATTR_FEATURE_FLAGS NL80211_ATTR_FEATURE_FLAGS
-
#define NL80211_WIPHY_NAME_MAXLEN 64
-
#define NL80211_MAX_SUPP_RATES 32
#define NL80211_MAX_SUPP_HT_RATES 77
#define NL80211_MAX_SUPP_REG_RULES 128
@@ -2917,14 +2780,10 @@ enum nl80211_attrs {
#define NL80211_HE_MAX_CAPABILITY_LEN 54
#define NL80211_MAX_NR_CIPHER_SUITES 5
#define NL80211_MAX_NR_AKM_SUITES 2
-
#define NL80211_MIN_REMAIN_ON_CHANNEL_TIME 10
-
/* default RSSI threshold for scan results if none specified. */
#define NL80211_SCAN_RSSI_THOLD_OFF -300
-
#define NL80211_CQM_TXE_MAX_INTVL 1800
-
/**
* enum nl80211_iftype - (virtual) interface types
*
@@ -2968,12 +2827,10 @@ enum nl80211_iftype {
NL80211_IFTYPE_P2P_DEVICE,
NL80211_IFTYPE_OCB,
NL80211_IFTYPE_NAN,
-
/* keep last */
NUM_NL80211_IFTYPES,
NL80211_IFTYPE_MAX = NUM_NL80211_IFTYPES - 1
};
-
/**
* enum nl80211_sta_flags - station flags
*
@@ -3007,12 +2864,10 @@ enum nl80211_sta_flags {
NL80211_STA_FLAG_AUTHENTICATED,
NL80211_STA_FLAG_TDLS_PEER,
NL80211_STA_FLAG_ASSOCIATED,
-
/* keep last */
__NL80211_STA_FLAG_AFTER_LAST,
NL80211_STA_FLAG_MAX = __NL80211_STA_FLAG_AFTER_LAST - 1
};
-
/**
* enum nl80211_sta_p2p_ps_status - station support of P2P PS
*
@@ -3023,12 +2878,9 @@ enum nl80211_sta_flags {
enum nl80211_sta_p2p_ps_status {
NL80211_P2P_PS_UNSUPPORTED = 0,
NL80211_P2P_PS_SUPPORTED,
-
NUM_NL80211_P2P_PS_STATUS,
};
-
#define NL80211_STA_FLAG_MAX_OLD_API NL80211_STA_FLAG_TDLS_PEER
-
/**
* struct nl80211_sta_flag_update - station flags mask/set
* @mask: mask of station flags to set
@@ -3040,7 +2892,6 @@ struct nl80211_sta_flag_update {
__u32 mask;
__u32 set;
} __attribute__((packed));
-
/**
* enum nl80211_he_gi - HE guard interval
* @NL80211_RATE_INFO_HE_GI_0_8: 0.8 usec
@@ -3052,7 +2903,17 @@ enum nl80211_he_gi {
NL80211_RATE_INFO_HE_GI_1_6,
NL80211_RATE_INFO_HE_GI_3_2,
};
-
+/**
+ * enum nl80211_he_ltf - HE long training field
+ * @NL80211_RATE_INFO_HE_1xLTF: 3.2 usec
+ * @NL80211_RATE_INFO_HE_2xLTF: 6.4 usec
+ * @NL80211_RATE_INFO_HE_4xLTF: 12.8 usec
+ */
+enum nl80211_he_ltf {
+ NL80211_RATE_INFO_HE_1XLTF,
+ NL80211_RATE_INFO_HE_2XLTF,
+ NL80211_RATE_INFO_HE_4XLTF,
+};
/**
* enum nl80211_he_ru_alloc - HE RU allocation values
* @NL80211_RATE_INFO_HE_RU_ALLOC_26: 26-tone RU allocation
@@ -3072,7 +2933,6 @@ enum nl80211_he_ru_alloc {
NL80211_RATE_INFO_HE_RU_ALLOC_996,
NL80211_RATE_INFO_HE_RU_ALLOC_2x996,
};
-
/**
* enum nl80211_rate_info - bitrate information
*
@@ -3133,12 +2993,10 @@ enum nl80211_rate_info {
NL80211_RATE_INFO_HE_GI,
NL80211_RATE_INFO_HE_DCM,
NL80211_RATE_INFO_HE_RU_ALLOC,
-
/* keep last */
__NL80211_RATE_INFO_AFTER_LAST,
NL80211_RATE_INFO_MAX = __NL80211_RATE_INFO_AFTER_LAST - 1
};
-
/**
* enum nl80211_sta_bss_param - BSS information collected by STA
*
@@ -3163,12 +3021,10 @@ enum nl80211_sta_bss_param {
NL80211_STA_BSS_PARAM_SHORT_SLOT_TIME,
NL80211_STA_BSS_PARAM_DTIM_PERIOD,
NL80211_STA_BSS_PARAM_BEACON_INTERVAL,
-
/* keep last */
__NL80211_STA_BSS_PARAM_AFTER_LAST,
NL80211_STA_BSS_PARAM_MAX = __NL80211_STA_BSS_PARAM_AFTER_LAST - 1
};
-
/**
* enum nl80211_sta_info - station information
*
@@ -3247,6 +3103,8 @@ enum nl80211_sta_bss_param {
* @NL80211_STA_INFO_AIRTIME_LINK_METRIC: airtime link metric for mesh station
* @NL80211_STA_INFO_ASSOC_AT_BOOTTIME: Timestamp (CLOCK_BOOTTIME, nanoseconds)
* of STA's association
+ * @NL80211_STA_INFO_CONNECTED_TO_AS: set to true if STA has a path to a
+ * authentication server (u8, 0 or 1)
* @__NL80211_STA_INFO_AFTER_LAST: internal
* @NL80211_STA_INFO_MAX: highest possible station info attribute
*/
@@ -3294,16 +3152,13 @@ enum nl80211_sta_info {
NL80211_STA_INFO_AIRTIME_WEIGHT,
NL80211_STA_INFO_AIRTIME_LINK_METRIC,
NL80211_STA_INFO_ASSOC_AT_BOOTTIME,
-
+ NL80211_STA_INFO_CONNECTED_TO_AS,
/* keep last */
__NL80211_STA_INFO_AFTER_LAST,
NL80211_STA_INFO_MAX = __NL80211_STA_INFO_AFTER_LAST - 1
};
-
/* we renamed this - stay compatible */
#define NL80211_STA_INFO_DATA_ACK_SIGNAL_AVG NL80211_STA_INFO_ACK_SIGNAL_AVG
-
-
/**
* enum nl80211_tid_stats - per TID statistics attributes
* @__NL80211_TID_STATS_INVALID: attribute number 0 is reserved
@@ -3327,12 +3182,10 @@ enum nl80211_tid_stats {
NL80211_TID_STATS_TX_MSDU_FAILED,
NL80211_TID_STATS_PAD,
NL80211_TID_STATS_TXQ_STATS,
-
/* keep last */
NUM_NL80211_TID_STATS,
NL80211_TID_STATS_MAX = NUM_NL80211_TID_STATS - 1
};
-
/**
* enum nl80211_txq_stats - per TXQ statistics attributes
* @__NL80211_TXQ_STATS_INVALID: attribute number 0 is reserved
@@ -3365,12 +3218,10 @@ enum nl80211_txq_stats {
NL80211_TXQ_STATS_TX_BYTES,
NL80211_TXQ_STATS_TX_PACKETS,
NL80211_TXQ_STATS_MAX_FLOWS,
-
/* keep last */
NUM_NL80211_TXQ_STATS,
NL80211_TXQ_STATS_MAX = NUM_NL80211_TXQ_STATS - 1
};
-
/**
* enum nl80211_mpath_flags - nl80211 mesh path flags
*
@@ -3387,7 +3238,6 @@ enum nl80211_mpath_flags {
NL80211_MPATH_FLAG_FIXED = 1<<3,
NL80211_MPATH_FLAG_RESOLVED = 1<<4,
};
-
/**
* enum nl80211_mpath_info - mesh path information
*
@@ -3420,12 +3270,10 @@ enum nl80211_mpath_info {
NL80211_MPATH_INFO_DISCOVERY_RETRIES,
NL80211_MPATH_INFO_HOP_COUNT,
NL80211_MPATH_INFO_PATH_CHANGE,
-
/* keep last */
__NL80211_MPATH_INFO_AFTER_LAST,
NL80211_MPATH_INFO_MAX = __NL80211_MPATH_INFO_AFTER_LAST - 1
};
-
/**
* enum nl80211_band_iftype_attr - Interface type data attributes
*
@@ -3442,22 +3290,22 @@ enum nl80211_mpath_info {
* defined in HE capabilities IE
* @NL80211_BAND_IFTYPE_ATTR_MAX: highest band HE capability attribute currently
* defined
+ * @NL80211_BAND_IFTYPE_ATTR_HE_6GHZ_CAPA: HE 6GHz band capabilities (__le16),
+ * given for all 6 GHz band channels
* @__NL80211_BAND_IFTYPE_ATTR_AFTER_LAST: internal use
*/
enum nl80211_band_iftype_attr {
__NL80211_BAND_IFTYPE_ATTR_INVALID,
-
NL80211_BAND_IFTYPE_ATTR_IFTYPES,
NL80211_BAND_IFTYPE_ATTR_HE_CAP_MAC,
NL80211_BAND_IFTYPE_ATTR_HE_CAP_PHY,
NL80211_BAND_IFTYPE_ATTR_HE_CAP_MCS_SET,
NL80211_BAND_IFTYPE_ATTR_HE_CAP_PPE,
-
+ NL80211_BAND_IFTYPE_ATTR_HE_6GHZ_CAPA,
/* keep last */
__NL80211_BAND_IFTYPE_ATTR_AFTER_LAST,
NL80211_BAND_IFTYPE_ATTR_MAX = __NL80211_BAND_IFTYPE_ATTR_AFTER_LAST - 1
};
-
/**
* enum nl80211_band_attr - band attributes
* @__NL80211_BAND_ATTR_INVALID: attribute number 0 is reserved
@@ -3488,26 +3336,20 @@ enum nl80211_band_attr {
__NL80211_BAND_ATTR_INVALID,
NL80211_BAND_ATTR_FREQS,
NL80211_BAND_ATTR_RATES,
-
NL80211_BAND_ATTR_HT_MCS_SET,
NL80211_BAND_ATTR_HT_CAPA,
NL80211_BAND_ATTR_HT_AMPDU_FACTOR,
NL80211_BAND_ATTR_HT_AMPDU_DENSITY,
-
NL80211_BAND_ATTR_VHT_MCS_SET,
NL80211_BAND_ATTR_VHT_CAPA,
NL80211_BAND_ATTR_IFTYPE_DATA,
-
NL80211_BAND_ATTR_EDMG_CHANNELS,
NL80211_BAND_ATTR_EDMG_BW_CONFIG,
-
/* keep last */
__NL80211_BAND_ATTR_AFTER_LAST,
NL80211_BAND_ATTR_MAX = __NL80211_BAND_ATTR_AFTER_LAST - 1
};
-
#define NL80211_BAND_ATTR_HT_CAPA NL80211_BAND_ATTR_HT_CAPA
-
/**
* enum nl80211_wmm_rule - regulatory wmm rule
*
@@ -3525,12 +3367,10 @@ enum nl80211_wmm_rule {
NL80211_WMMR_CW_MAX,
NL80211_WMMR_AIFSN,
NL80211_WMMR_TXOP,
-
/* keep last */
__NL80211_WMMR_LAST,
NL80211_WMMR_MAX = __NL80211_WMMR_LAST - 1
};
-
/**
* enum nl80211_frequency_attr - frequency attributes
* @__NL80211_FREQUENCY_ATTR_INVALID: attribute number 0 is reserved
@@ -3583,6 +3423,19 @@ enum nl80211_wmm_rule {
* @NL80211_FREQUENCY_ATTR_WMM: this channel has wmm limitations.
* This is a nested attribute that contains the wmm limitation per AC.
* (see &enum nl80211_wmm_rule)
+ * @NL80211_FREQUENCY_ATTR_NO_HE: HE operation is not allowed on this channel
+ * in current regulatory domain.
+ * @NL80211_FREQUENCY_ATTR_OFFSET: frequency offset in KHz
+ * @NL80211_FREQUENCY_ATTR_1MHZ: 1 MHz operation is allowed
+ * on this channel in current regulatory domain.
+ * @NL80211_FREQUENCY_ATTR_2MHZ: 2 MHz operation is allowed
+ * on this channel in current regulatory domain.
+ * @NL80211_FREQUENCY_ATTR_4MHZ: 4 MHz operation is allowed
+ * on this channel in current regulatory domain.
+ * @NL80211_FREQUENCY_ATTR_8MHZ: 8 MHz operation is allowed
+ * on this channel in current regulatory domain.
+ * @NL80211_FREQUENCY_ATTR_16MHZ: 16 MHz operation is allowed
+ * on this channel in current regulatory domain.
* @NL80211_FREQUENCY_ATTR_MAX: highest frequency attribute number
* currently defined
* @__NL80211_FREQUENCY_ATTR_AFTER_LAST: internal use
@@ -3612,19 +3465,23 @@ enum nl80211_frequency_attr {
NL80211_FREQUENCY_ATTR_NO_20MHZ,
NL80211_FREQUENCY_ATTR_NO_10MHZ,
NL80211_FREQUENCY_ATTR_WMM,
-
+ NL80211_FREQUENCY_ATTR_NO_HE,
+ NL80211_FREQUENCY_ATTR_OFFSET,
+ NL80211_FREQUENCY_ATTR_1MHZ,
+ NL80211_FREQUENCY_ATTR_2MHZ,
+ NL80211_FREQUENCY_ATTR_4MHZ,
+ NL80211_FREQUENCY_ATTR_8MHZ,
+ NL80211_FREQUENCY_ATTR_16MHZ,
/* keep last */
__NL80211_FREQUENCY_ATTR_AFTER_LAST,
NL80211_FREQUENCY_ATTR_MAX = __NL80211_FREQUENCY_ATTR_AFTER_LAST - 1
};
-
#define NL80211_FREQUENCY_ATTR_MAX_TX_POWER NL80211_FREQUENCY_ATTR_MAX_TX_POWER
#define NL80211_FREQUENCY_ATTR_PASSIVE_SCAN NL80211_FREQUENCY_ATTR_NO_IR
#define NL80211_FREQUENCY_ATTR_NO_IBSS NL80211_FREQUENCY_ATTR_NO_IR
#define NL80211_FREQUENCY_ATTR_NO_IR NL80211_FREQUENCY_ATTR_NO_IR
#define NL80211_FREQUENCY_ATTR_GO_CONCURRENT \
NL80211_FREQUENCY_ATTR_IR_CONCURRENT
-
/**
* enum nl80211_bitrate_attr - bitrate attributes
* @__NL80211_BITRATE_ATTR_INVALID: attribute number 0 is reserved
@@ -3639,12 +3496,10 @@ enum nl80211_bitrate_attr {
__NL80211_BITRATE_ATTR_INVALID,
NL80211_BITRATE_ATTR_RATE,
NL80211_BITRATE_ATTR_2GHZ_SHORTPREAMBLE,
-
/* keep last */
__NL80211_BITRATE_ATTR_AFTER_LAST,
NL80211_BITRATE_ATTR_MAX = __NL80211_BITRATE_ATTR_AFTER_LAST - 1
};
-
/**
* enum nl80211_initiator - Indicates the initiator of a reg domain request
* @NL80211_REGDOM_SET_BY_CORE: Core queried CRDA for a dynamic world
@@ -3667,7 +3522,6 @@ enum nl80211_reg_initiator {
NL80211_REGDOM_SET_BY_DRIVER,
NL80211_REGDOM_SET_BY_COUNTRY_IE,
};
-
/**
* enum nl80211_reg_type - specifies the type of regulatory domain
* @NL80211_REGDOM_TYPE_COUNTRY: the regulatory domain set is one that pertains
@@ -3690,7 +3544,6 @@ enum nl80211_reg_type {
NL80211_REGDOM_TYPE_CUSTOM_WORLD,
NL80211_REGDOM_TYPE_INTERSECTION,
};
-
/**
* enum nl80211_reg_rule_attr - regulatory rule attributes
* @__NL80211_REG_RULE_ATTR_INVALID: attribute number 0 is reserved
@@ -3719,21 +3572,16 @@ enum nl80211_reg_type {
enum nl80211_reg_rule_attr {
__NL80211_REG_RULE_ATTR_INVALID,
NL80211_ATTR_REG_RULE_FLAGS,
-
NL80211_ATTR_FREQ_RANGE_START,
NL80211_ATTR_FREQ_RANGE_END,
NL80211_ATTR_FREQ_RANGE_MAX_BW,
-
NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN,
NL80211_ATTR_POWER_RULE_MAX_EIRP,
-
NL80211_ATTR_DFS_CAC_TIME,
-
/* keep last */
__NL80211_REG_RULE_ATTR_AFTER_LAST,
NL80211_REG_RULE_ATTR_MAX = __NL80211_REG_RULE_ATTR_AFTER_LAST - 1
};
-
/**
* enum nl80211_sched_scan_match_attr - scheduled scan match attributes
* @__NL80211_SCHED_SCAN_MATCH_ATTR_INVALID: attribute number 0 is reserved
@@ -3771,23 +3619,19 @@ enum nl80211_reg_rule_attr {
*/
enum nl80211_sched_scan_match_attr {
__NL80211_SCHED_SCAN_MATCH_ATTR_INVALID,
-
NL80211_SCHED_SCAN_MATCH_ATTR_SSID,
NL80211_SCHED_SCAN_MATCH_ATTR_RSSI,
NL80211_SCHED_SCAN_MATCH_ATTR_RELATIVE_RSSI,
NL80211_SCHED_SCAN_MATCH_ATTR_RSSI_ADJUST,
NL80211_SCHED_SCAN_MATCH_ATTR_BSSID,
NL80211_SCHED_SCAN_MATCH_PER_BAND_RSSI,
-
/* keep last */
__NL80211_SCHED_SCAN_MATCH_ATTR_AFTER_LAST,
NL80211_SCHED_SCAN_MATCH_ATTR_MAX =
__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
*
@@ -3809,6 +3653,7 @@ enum nl80211_sched_scan_match_attr {
* @NL80211_RRF_NO_HT40PLUS: channels can't be used in HT40+ operation
* @NL80211_RRF_NO_80MHZ: 80MHz operation not allowed
* @NL80211_RRF_NO_160MHZ: 160MHz operation not allowed
+ * @NL80211_RRF_NO_HE: HE operation not allowed
*/
enum nl80211_reg_rule_flags {
NL80211_RRF_NO_OFDM = 1<<0,
@@ -3826,18 +3671,16 @@ enum nl80211_reg_rule_flags {
NL80211_RRF_NO_HT40PLUS = 1<<14,
NL80211_RRF_NO_80MHZ = 1<<15,
NL80211_RRF_NO_160MHZ = 1<<16,
+ NL80211_RRF_NO_HE = 1<<17,
};
-
#define NL80211_RRF_PASSIVE_SCAN NL80211_RRF_NO_IR
#define NL80211_RRF_NO_IBSS NL80211_RRF_NO_IR
#define NL80211_RRF_NO_IR NL80211_RRF_NO_IR
#define NL80211_RRF_NO_HT40 (NL80211_RRF_NO_HT40MINUS |\
NL80211_RRF_NO_HT40PLUS)
#define NL80211_RRF_GO_CONCURRENT NL80211_RRF_IR_CONCURRENT
-
/* For backport compatibility with older userspace */
#define NL80211_RRF_NO_IR_ALL (NL80211_RRF_NO_IR | __NL80211_RRF_NO_IBSS)
-
/**
* enum nl80211_dfs_regions - regulatory DFS regions
*
@@ -3852,7 +3695,6 @@ enum nl80211_dfs_regions {
NL80211_DFS_ETSI = 2,
NL80211_DFS_JP = 3,
};
-
/**
* enum nl80211_user_reg_hint_type - type of user regulatory hint
*
@@ -3875,7 +3717,6 @@ enum nl80211_user_reg_hint_type {
NL80211_USER_REG_HINT_CELL_BASE = 1,
NL80211_USER_REG_HINT_INDOOR = 2,
};
-
/**
* enum nl80211_survey_info - survey information
*
@@ -3903,6 +3744,7 @@ enum nl80211_user_reg_hint_type {
* receiving frames destined to the local BSS
* @NL80211_SURVEY_INFO_MAX: highest survey info attribute number
* currently defined
+ * @NL80211_SURVEY_INFO_FREQUENCY_OFFSET: center frequency offset in KHz
* @__NL80211_SURVEY_INFO_AFTER_LAST: internal use
*/
enum nl80211_survey_info {
@@ -3918,19 +3760,17 @@ enum nl80211_survey_info {
NL80211_SURVEY_INFO_TIME_SCAN,
NL80211_SURVEY_INFO_PAD,
NL80211_SURVEY_INFO_TIME_BSS_RX,
-
+ NL80211_SURVEY_INFO_FREQUENCY_OFFSET,
/* keep last */
__NL80211_SURVEY_INFO_AFTER_LAST,
NL80211_SURVEY_INFO_MAX = __NL80211_SURVEY_INFO_AFTER_LAST - 1
};
-
/* keep old names for compatibility */
#define NL80211_SURVEY_INFO_CHANNEL_TIME NL80211_SURVEY_INFO_TIME
#define NL80211_SURVEY_INFO_CHANNEL_TIME_BUSY NL80211_SURVEY_INFO_TIME_BUSY
#define NL80211_SURVEY_INFO_CHANNEL_TIME_EXT_BUSY NL80211_SURVEY_INFO_TIME_EXT_BUSY
#define NL80211_SURVEY_INFO_CHANNEL_TIME_RX NL80211_SURVEY_INFO_TIME_RX
#define NL80211_SURVEY_INFO_CHANNEL_TIME_TX NL80211_SURVEY_INFO_TIME_TX
-
/**
* enum nl80211_mntr_flags - monitor configuration flags
*
@@ -3958,12 +3798,10 @@ enum nl80211_mntr_flags {
NL80211_MNTR_FLAG_OTHER_BSS,
NL80211_MNTR_FLAG_COOK_FRAMES,
NL80211_MNTR_FLAG_ACTIVE,
-
/* keep last */
__NL80211_MNTR_FLAG_AFTER_LAST,
NL80211_MNTR_FLAG_MAX = __NL80211_MNTR_FLAG_AFTER_LAST - 1
};
-
/**
* enum nl80211_mesh_power_mode - mesh power save modes
*
@@ -3981,17 +3819,14 @@ enum nl80211_mntr_flags {
* @__NL80211_MESH_POWER_AFTER_LAST - internal use
* @NL80211_MESH_POWER_MAX - highest possible power save level
*/
-
enum nl80211_mesh_power_mode {
NL80211_MESH_POWER_UNKNOWN,
NL80211_MESH_POWER_ACTIVE,
NL80211_MESH_POWER_LIGHT_SLEEP,
NL80211_MESH_POWER_DEEP_SLEEP,
-
__NL80211_MESH_POWER_AFTER_LAST,
NL80211_MESH_POWER_MAX = __NL80211_MESH_POWER_AFTER_LAST - 1
};
-
/**
* enum nl80211_meshconf_params - mesh configuration parameters
*
@@ -4103,6 +3938,16 @@ enum nl80211_mesh_power_mode {
* field. If left unset then the mesh formation field will only
* advertise such if there is an active root mesh path.
*
+ * @NL80211_MESHCONF_NOLEARN: Try to avoid multi-hop path discovery (e.g.
+ * PREQ/PREP for HWMP) if the destination is a direct neighbor. Note that
+ * this might not be the optimal decision as a multi-hop route might be
+ * better. So if using this setting you will likely also want to disable
+ * dot11MeshForwarding and use another mesh routing protocol on top.
+ *
+ * @NL80211_MESHCONF_CONNECTED_TO_AS: If set to true then this mesh STA
+ * will advertise that it is connected to a authentication server
+ * in the mesh formation field.
+ *
* @__NL80211_MESHCONF_ATTR_AFTER_LAST: internal use
*/
enum nl80211_meshconf_params {
@@ -4136,12 +3981,12 @@ enum nl80211_meshconf_params {
NL80211_MESHCONF_AWAKE_WINDOW,
NL80211_MESHCONF_PLINK_TIMEOUT,
NL80211_MESHCONF_CONNECTED_TO_GATE,
-
+ NL80211_MESHCONF_NOLEARN,
+ NL80211_MESHCONF_CONNECTED_TO_AS,
/* keep last */
__NL80211_MESHCONF_ATTR_AFTER_LAST,
NL80211_MESHCONF_ATTR_MAX = __NL80211_MESHCONF_ATTR_AFTER_LAST - 1
};
-
/**
* enum nl80211_mesh_setup_params - mesh setup parameters
*
@@ -4201,12 +4046,10 @@ enum nl80211_mesh_setup_params {
NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC,
NL80211_MESH_SETUP_USERSPACE_MPM,
NL80211_MESH_SETUP_AUTH_PROTOCOL,
-
/* keep last */
__NL80211_MESH_SETUP_ATTR_AFTER_LAST,
NL80211_MESH_SETUP_ATTR_MAX = __NL80211_MESH_SETUP_ATTR_AFTER_LAST - 1
};
-
/**
* enum nl80211_txq_attr - TX queue parameter attributes
* @__NL80211_TXQ_ATTR_INVALID: Attribute number 0 is reserved
@@ -4228,12 +4071,10 @@ enum nl80211_txq_attr {
NL80211_TXQ_ATTR_CWMIN,
NL80211_TXQ_ATTR_CWMAX,
NL80211_TXQ_ATTR_AIFS,
-
/* keep last */
__NL80211_TXQ_ATTR_AFTER_LAST,
NL80211_TXQ_ATTR_MAX = __NL80211_TXQ_ATTR_AFTER_LAST - 1
};
-
enum nl80211_ac {
NL80211_AC_VO,
NL80211_AC_VI,
@@ -4241,14 +4082,12 @@ enum nl80211_ac {
NL80211_AC_BK,
NL80211_NUM_ACS
};
-
/* backward compat */
#define NL80211_TXQ_ATTR_QUEUE NL80211_TXQ_ATTR_AC
#define NL80211_TXQ_Q_VO NL80211_AC_VO
#define NL80211_TXQ_Q_VI NL80211_AC_VI
#define NL80211_TXQ_Q_BE NL80211_AC_BE
#define NL80211_TXQ_Q_BK NL80211_AC_BK
-
/**
* enum nl80211_channel_type - channel type
* @NL80211_CHAN_NO_HT: 20 MHz, non-HT channel
@@ -4264,7 +4103,6 @@ enum nl80211_channel_type {
NL80211_CHAN_HT40MINUS,
NL80211_CHAN_HT40PLUS
};
-
/**
* enum nl80211_key_mode - Key mode
*
@@ -4285,7 +4123,6 @@ enum nl80211_key_mode {
NL80211_KEY_NO_TX,
NL80211_KEY_SET_TX
};
-
/**
* enum nl80211_chan_width - channel width definitions
*
@@ -4304,6 +4141,11 @@ enum nl80211_key_mode {
* attribute must be provided as well
* @NL80211_CHAN_WIDTH_5: 5 MHz OFDM channel
* @NL80211_CHAN_WIDTH_10: 10 MHz OFDM channel
+ * @NL80211_CHAN_WIDTH_1: 1 MHz OFDM channel
+ * @NL80211_CHAN_WIDTH_2: 2 MHz OFDM channel
+ * @NL80211_CHAN_WIDTH_4: 4 MHz OFDM channel
+ * @NL80211_CHAN_WIDTH_8: 8 MHz OFDM channel
+ * @NL80211_CHAN_WIDTH_16: 16 MHz OFDM channel
*/
enum nl80211_chan_width {
NL80211_CHAN_WIDTH_20_NOHT,
@@ -4314,8 +4156,12 @@ enum nl80211_chan_width {
NL80211_CHAN_WIDTH_160,
NL80211_CHAN_WIDTH_5,
NL80211_CHAN_WIDTH_10,
+ NL80211_CHAN_WIDTH_1,
+ NL80211_CHAN_WIDTH_2,
+ NL80211_CHAN_WIDTH_4,
+ NL80211_CHAN_WIDTH_8,
+ NL80211_CHAN_WIDTH_16,
};
-
/**
* enum nl80211_bss_scan_width - control channel width for a BSS
*
@@ -4324,13 +4170,16 @@ enum nl80211_chan_width {
* @NL80211_BSS_CHAN_WIDTH_20: control channel is 20 MHz wide or compatible
* @NL80211_BSS_CHAN_WIDTH_10: control channel is 10 MHz wide
* @NL80211_BSS_CHAN_WIDTH_5: control channel is 5 MHz wide
+ * @NL80211_BSS_CHAN_WIDTH_1: control channel is 1 MHz wide
+ * @NL80211_BSS_CHAN_WIDTH_2: control channel is 2 MHz wide
*/
enum nl80211_bss_scan_width {
NL80211_BSS_CHAN_WIDTH_20,
NL80211_BSS_CHAN_WIDTH_10,
NL80211_BSS_CHAN_WIDTH_5,
+ NL80211_BSS_CHAN_WIDTH_1,
+ NL80211_BSS_CHAN_WIDTH_2,
};
-
/**
* enum nl80211_bss - netlink attributes for a BSS
*
@@ -4380,6 +4229,7 @@ enum nl80211_bss_scan_width {
* @NL80211_BSS_CHAIN_SIGNAL: per-chain signal strength of last BSS update.
* Contains a nested array of signal strength attributes (u8, dBm),
* using the nesting index as the antenna number.
+ * @NL80211_BSS_FREQUENCY_OFFSET: frequency offset in KHz
* @__NL80211_BSS_AFTER_LAST: internal
* @NL80211_BSS_MAX: highest BSS attribute
*/
@@ -4404,12 +4254,11 @@ enum nl80211_bss {
NL80211_BSS_PARENT_TSF,
NL80211_BSS_PARENT_BSSID,
NL80211_BSS_CHAIN_SIGNAL,
-
+ NL80211_BSS_FREQUENCY_OFFSET,
/* keep last */
__NL80211_BSS_AFTER_LAST,
NL80211_BSS_MAX = __NL80211_BSS_AFTER_LAST - 1
};
-
/**
* enum nl80211_bss_status - BSS "status"
* @NL80211_BSS_STATUS_AUTHENTICATED: Authenticated with this BSS.
@@ -4427,7 +4276,6 @@ enum nl80211_bss_status {
NL80211_BSS_STATUS_ASSOCIATED,
NL80211_BSS_STATUS_IBSS_JOINED,
};
-
/**
* enum nl80211_auth_type - AuthenticationType
*
@@ -4454,13 +4302,11 @@ enum nl80211_auth_type {
NL80211_AUTHTYPE_FILS_SK,
NL80211_AUTHTYPE_FILS_SK_PFS,
NL80211_AUTHTYPE_FILS_PK,
-
/* keep last */
__NL80211_AUTHTYPE_NUM,
NL80211_AUTHTYPE_MAX = __NL80211_AUTHTYPE_NUM - 1,
NL80211_AUTHTYPE_AUTOMATIC
};
-
/**
* enum nl80211_key_type - Key Type
* @NL80211_KEYTYPE_GROUP: Group (broadcast/multicast) key
@@ -4472,10 +4318,8 @@ enum nl80211_key_type {
NL80211_KEYTYPE_GROUP,
NL80211_KEYTYPE_PAIRWISE,
NL80211_KEYTYPE_PEERKEY,
-
NUM_NL80211_KEYTYPES
};
-
/**
* enum nl80211_mfp - Management frame protection state
* @NL80211_MFP_NO: Management frame protection not used
@@ -4487,13 +4331,11 @@ enum nl80211_mfp {
NL80211_MFP_REQUIRED,
NL80211_MFP_OPTIONAL,
};
-
enum nl80211_wpa_versions {
NL80211_WPA_VERSION_1 = 1 << 0,
NL80211_WPA_VERSION_2 = 1 << 1,
NL80211_WPA_VERSION_3 = 1 << 2,
};
-
/**
* enum nl80211_key_default_types - key default types
* @__NL80211_KEY_DEFAULT_TYPE_INVALID: invalid
@@ -4507,10 +4349,8 @@ enum nl80211_key_default_types {
__NL80211_KEY_DEFAULT_TYPE_INVALID,
NL80211_KEY_DEFAULT_TYPE_UNICAST,
NL80211_KEY_DEFAULT_TYPE_MULTICAST,
-
NUM_NL80211_KEY_DEFAULT_TYPES
};
-
/**
* enum nl80211_key_attributes - key attributes
* @__NL80211_KEY_INVALID: invalid
@@ -4532,6 +4372,7 @@ enum nl80211_key_default_types {
* See &enum nl80211_key_default_types.
* @NL80211_KEY_MODE: the mode from enum nl80211_key_mode.
* Defaults to @NL80211_KEY_RX_TX.
+ * @NL80211_KEY_DEFAULT_BEACON: flag indicating default Beacon frame key
*
* @__NL80211_KEY_AFTER_LAST: internal
* @NL80211_KEY_MAX: highest key attribute
@@ -4547,12 +4388,11 @@ enum nl80211_key_attributes {
NL80211_KEY_TYPE,
NL80211_KEY_DEFAULT_TYPES,
NL80211_KEY_MODE,
-
+ NL80211_KEY_DEFAULT_BEACON,
/* keep last */
__NL80211_KEY_AFTER_LAST,
NL80211_KEY_MAX = __NL80211_KEY_AFTER_LAST - 1
};
-
/**
* enum nl80211_tx_rate_attributes - TX rate set attributes
* @__NL80211_TXRATE_INVALID: invalid
@@ -4565,6 +4405,10 @@ enum nl80211_key_attributes {
* @NL80211_TXRATE_VHT: VHT rates allowed for TX rate selection,
* see &struct nl80211_txrate_vht
* @NL80211_TXRATE_GI: configure GI, see &enum nl80211_txrate_gi
+ * @NL80211_TXRATE_HE: HE rates allowed for TX rate selection,
+ * see &struct nl80211_txrate_he
+ * @NL80211_TXRATE_HE_GI: configure HE GI, 0.8us, 1.6us and 3.2us.
+ * @NL80211_TXRATE_HE_LTF: configure HE LTF, 1XLTF, 2XLTF and 4XLTF.
* @__NL80211_TXRATE_AFTER_LAST: internal
* @NL80211_TXRATE_MAX: highest TX rate attribute
*/
@@ -4574,15 +4418,15 @@ enum nl80211_tx_rate_attributes {
NL80211_TXRATE_HT,
NL80211_TXRATE_VHT,
NL80211_TXRATE_GI,
-
+ NL80211_TXRATE_HE,
+ NL80211_TXRATE_HE_GI,
+ NL80211_TXRATE_HE_LTF,
/* keep last */
__NL80211_TXRATE_AFTER_LAST,
NL80211_TXRATE_MAX = __NL80211_TXRATE_AFTER_LAST - 1
};
-
#define NL80211_TXRATE_MCS NL80211_TXRATE_HT
#define NL80211_VHT_NSS_MAX 8
-
/**
* struct nl80211_txrate_vht - VHT MCS/NSS txrate bitmap
* @mcs: MCS bitmap table for each NSS (array index 0 for 1 stream, etc.)
@@ -4590,19 +4434,26 @@ enum nl80211_tx_rate_attributes {
struct nl80211_txrate_vht {
__u16 mcs[NL80211_VHT_NSS_MAX];
};
-
+#define NL80211_HE_NSS_MAX 8
+/**
+ * struct nl80211_txrate_he - HE MCS/NSS txrate bitmap
+ * @mcs: MCS bitmap table for each NSS (array index 0 for 1 stream, etc.)
+ */
+struct nl80211_txrate_he {
+ __u16 mcs[NL80211_HE_NSS_MAX];
+};
enum nl80211_txrate_gi {
NL80211_TXRATE_DEFAULT_GI,
NL80211_TXRATE_FORCE_SGI,
NL80211_TXRATE_FORCE_LGI,
};
-
/**
* enum nl80211_band - Frequency band
* @NL80211_BAND_2GHZ: 2.4 GHz ISM band
* @NL80211_BAND_5GHZ: around 5 GHz band (4.9 - 5.7 GHz)
* @NL80211_BAND_60GHZ: around 60 GHz band (58.32 - 69.12 GHz)
* @NL80211_BAND_6GHZ: around 6 GHz band (5.9 - 7.2 GHz)
+ * @NL80211_BAND_S1GHZ: around 900MHz, supported by S1G PHYs
* @NUM_NL80211_BANDS: number of bands, avoid using this in userspace
* since newer kernel versions may support more bands
*/
@@ -4611,10 +4462,9 @@ enum nl80211_band {
NL80211_BAND_5GHZ,
NL80211_BAND_60GHZ,
NL80211_BAND_6GHZ,
-
+ NL80211_BAND_S1GHZ,
NUM_NL80211_BANDS,
};
-
/**
* enum nl80211_ps_state - powersave state
* @NL80211_PS_DISABLED: powersave is disabled
@@ -4624,7 +4474,6 @@ enum nl80211_ps_state {
NL80211_PS_DISABLED,
NL80211_PS_ENABLED,
};
-
/**
* enum nl80211_attr_cqm - connection quality monitor attributes
* @__NL80211_ATTR_CQM_INVALID: invalid
@@ -4669,12 +4518,10 @@ enum nl80211_attr_cqm {
NL80211_ATTR_CQM_TXE_INTVL,
NL80211_ATTR_CQM_BEACON_LOSS_EVENT,
NL80211_ATTR_CQM_RSSI_LEVEL,
-
/* keep last */
__NL80211_ATTR_CQM_AFTER_LAST,
NL80211_ATTR_CQM_MAX = __NL80211_ATTR_CQM_AFTER_LAST - 1
};
-
/**
* enum nl80211_cqm_rssi_threshold_event - RSSI threshold event
* @NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW: The RSSI level is lower than the
@@ -4688,8 +4535,6 @@ enum nl80211_cqm_rssi_threshold_event {
NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH,
NL80211_CQM_RSSI_BEACON_LOSS_EVENT,
};
-
-
/**
* enum nl80211_tx_power_setting - TX power adjustment
* @NL80211_TX_POWER_AUTOMATIC: automatically determine transmit power
@@ -4701,7 +4546,88 @@ enum nl80211_tx_power_setting {
NL80211_TX_POWER_LIMITED,
NL80211_TX_POWER_FIXED,
};
-
+/**
+ * enum nl80211_tid_config - TID config state
+ * @NL80211_TID_CONFIG_ENABLE: Enable config for the TID
+ * @NL80211_TID_CONFIG_DISABLE: Disable config for the TID
+ */
+enum nl80211_tid_config {
+ NL80211_TID_CONFIG_ENABLE,
+ NL80211_TID_CONFIG_DISABLE,
+};
+/* enum nl80211_tx_rate_setting - TX rate configuration type
+ * @NL80211_TX_RATE_AUTOMATIC: automatically determine TX rate
+ * @NL80211_TX_RATE_LIMITED: limit the TX rate by the TX rate parameter
+ * @NL80211_TX_RATE_FIXED: fix TX rate to the TX rate parameter
+ */
+enum nl80211_tx_rate_setting {
+ NL80211_TX_RATE_AUTOMATIC,
+ NL80211_TX_RATE_LIMITED,
+ NL80211_TX_RATE_FIXED,
+};
+/* enum nl80211_tid_config_attr - TID specific configuration.
+ * @NL80211_TID_CONFIG_ATTR_PAD: pad attribute for 64-bit values
+ * @NL80211_TID_CONFIG_ATTR_VIF_SUPP: a bitmap (u64) of attributes supported
+ * for per-vif configuration; doesn't list the ones that are generic
+ * (%NL80211_TID_CONFIG_ATTR_TIDS, %NL80211_TID_CONFIG_ATTR_OVERRIDE).
+ * @NL80211_TID_CONFIG_ATTR_PEER_SUPP: same as the previous per-vif one, but
+ * per peer instead.
+ * @NL80211_TID_CONFIG_ATTR_OVERRIDE: flag attribute, if set indicates
+ * that the new configuration overrides all previous peer
+ * configurations, otherwise previous peer specific configurations
+ * should be left untouched.
+ * @NL80211_TID_CONFIG_ATTR_TIDS: a bitmask value of TIDs (bit 0 to 7)
+ * Its type is u16.
+ * @NL80211_TID_CONFIG_ATTR_NOACK: Configure ack policy for the TID.
+ * specified in %NL80211_TID_CONFIG_ATTR_TID. see %enum nl80211_tid_config.
+ * Its type is u8.
+ * @NL80211_TID_CONFIG_ATTR_RETRY_SHORT: Number of retries used with data frame
+ * transmission, user-space sets this configuration in
+ * &NL80211_CMD_SET_TID_CONFIG. It is u8 type, min value is 1 and
+ * the max value is advertised by the driver in this attribute on
+ * output in wiphy capabilities.
+ * @NL80211_TID_CONFIG_ATTR_RETRY_LONG: Number of retries used with data frame
+ * transmission, user-space sets this configuration in
+ * &NL80211_CMD_SET_TID_CONFIG. Its type is u8, min value is 1 and
+ * the max value is advertised by the driver in this attribute on
+ * output in wiphy capabilities.
+ * @NL80211_TID_CONFIG_ATTR_AMPDU_CTRL: Enable/Disable MPDU aggregation
+ * for the TIDs specified in %NL80211_TID_CONFIG_ATTR_TIDS.
+ * Its type is u8, using the values from &nl80211_tid_config.
+ * @NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL: Enable/Disable RTS_CTS for the TIDs
+ * specified in %NL80211_TID_CONFIG_ATTR_TIDS. It is u8 type, using
+ * the values from &nl80211_tid_config.
+ * @NL80211_TID_CONFIG_ATTR_AMSDU_CTRL: Enable/Disable MSDU aggregation
+ * for the TIDs specified in %NL80211_TID_CONFIG_ATTR_TIDS.
+ * Its type is u8, using the values from &nl80211_tid_config.
+ * @NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE: This attribute will be useful
+ * to notify the driver that what type of txrate should be used
+ * for the TIDs specified in %NL80211_TID_CONFIG_ATTR_TIDS. using
+ * the values form &nl80211_tx_rate_setting.
+ * @NL80211_TID_CONFIG_ATTR_TX_RATE: Data frame TX rate mask should be applied
+ * with the parameters passed through %NL80211_ATTR_TX_RATES.
+ * configuration is applied to the data frame for the tid to that connected
+ * station.
+ */
+enum nl80211_tid_config_attr {
+ __NL80211_TID_CONFIG_ATTR_INVALID,
+ NL80211_TID_CONFIG_ATTR_PAD,
+ NL80211_TID_CONFIG_ATTR_VIF_SUPP,
+ NL80211_TID_CONFIG_ATTR_PEER_SUPP,
+ NL80211_TID_CONFIG_ATTR_OVERRIDE,
+ NL80211_TID_CONFIG_ATTR_TIDS,
+ NL80211_TID_CONFIG_ATTR_NOACK,
+ NL80211_TID_CONFIG_ATTR_RETRY_SHORT,
+ NL80211_TID_CONFIG_ATTR_RETRY_LONG,
+ NL80211_TID_CONFIG_ATTR_AMPDU_CTRL,
+ NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL,
+ NL80211_TID_CONFIG_ATTR_AMSDU_CTRL,
+ NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE,
+ NL80211_TID_CONFIG_ATTR_TX_RATE,
+ /* keep last */
+ __NL80211_TID_CONFIG_ATTR_AFTER_LAST,
+ NL80211_TID_CONFIG_ATTR_MAX = __NL80211_TID_CONFIG_ATTR_AFTER_LAST - 1
+};
/**
* enum nl80211_packet_pattern_attr - packet pattern attribute
* @__NL80211_PKTPAT_INVALID: invalid number for nested attribute
@@ -4728,11 +4654,9 @@ enum nl80211_packet_pattern_attr {
NL80211_PKTPAT_MASK,
NL80211_PKTPAT_PATTERN,
NL80211_PKTPAT_OFFSET,
-
NUM_NL80211_PKTPAT,
MAX_NL80211_PKTPAT = NUM_NL80211_PKTPAT - 1,
};
-
/**
* struct nl80211_pattern_support - packet pattern support information
* @max_patterns: maximum number of patterns supported
@@ -4752,7 +4676,6 @@ struct nl80211_pattern_support {
__u32 max_pattern_len;
__u32 max_pkt_offset;
} __attribute__((packed));
-
/* only for backward compatibility */
#define __NL80211_WOWLAN_PKTPAT_INVALID __NL80211_PKTPAT_INVALID
#define NL80211_WOWLAN_PKTPAT_MASK NL80211_PKTPAT_MASK
@@ -4761,7 +4684,6 @@ struct nl80211_pattern_support {
#define NUM_NL80211_WOWLAN_PKTPAT NUM_NL80211_PKTPAT
#define MAX_NL80211_WOWLAN_PKTPAT MAX_NL80211_PKTPAT
#define nl80211_wowlan_pattern_support nl80211_pattern_support
-
/**
* enum nl80211_wowlan_triggers - WoWLAN trigger definitions
* @__NL80211_WOWLAN_TRIG_INVALID: invalid number for nested attributes
@@ -4872,12 +4794,10 @@ enum nl80211_wowlan_triggers {
NL80211_WOWLAN_TRIG_WAKEUP_TCP_NOMORETOKENS,
NL80211_WOWLAN_TRIG_NET_DETECT,
NL80211_WOWLAN_TRIG_NET_DETECT_RESULTS,
-
/* keep last */
NUM_NL80211_WOWLAN_TRIG,
MAX_NL80211_WOWLAN_TRIG = NUM_NL80211_WOWLAN_TRIG - 1
};
-
/**
* DOC: TCP connection wakeup
*
@@ -4900,7 +4820,6 @@ enum nl80211_wowlan_triggers {
* Developer's note: ARP offload is required for this, otherwise TCP
* response packets might not go through correctly.
*/
-
/**
* struct nl80211_wowlan_tcp_data_seq - WoWLAN TCP data sequence
* @start: starting value
@@ -4914,7 +4833,6 @@ enum nl80211_wowlan_triggers {
struct nl80211_wowlan_tcp_data_seq {
__u32 start, offset, len;
};
-
/**
* struct nl80211_wowlan_tcp_data_token - WoWLAN TCP data token config
* @offset: offset of token in packet
@@ -4926,7 +4844,6 @@ struct nl80211_wowlan_tcp_data_token {
__u32 offset, len;
__u8 token_stream[];
};
-
/**
* struct nl80211_wowlan_tcp_data_token_feature - data token features
* @min_len: minimum token length
@@ -4936,7 +4853,6 @@ struct nl80211_wowlan_tcp_data_token {
struct nl80211_wowlan_tcp_data_token_feature {
__u32 min_len, max_len, bufsize;
};
-
/**
* enum nl80211_wowlan_tcp_attrs - WoWLAN TCP connection parameters
* @__NL80211_WOWLAN_TCP_INVALID: invalid number for nested attributes
@@ -4982,12 +4898,10 @@ enum nl80211_wowlan_tcp_attrs {
NL80211_WOWLAN_TCP_DATA_INTERVAL,
NL80211_WOWLAN_TCP_WAKE_PAYLOAD,
NL80211_WOWLAN_TCP_WAKE_MASK,
-
/* keep last */
NUM_NL80211_WOWLAN_TCP,
MAX_NL80211_WOWLAN_TCP = NUM_NL80211_WOWLAN_TCP - 1
};
-
/**
* struct nl80211_coalesce_rule_support - coalesce rule support information
* @max_rules: maximum number of rules supported
@@ -5002,7 +4916,6 @@ struct nl80211_coalesce_rule_support {
struct nl80211_pattern_support pat;
__u32 max_delay;
} __attribute__((packed));
-
/**
* enum nl80211_attr_coalesce_rule - coalesce rule attribute
* @__NL80211_COALESCE_RULE_INVALID: invalid number for nested attribute
@@ -5019,12 +4932,10 @@ enum nl80211_attr_coalesce_rule {
NL80211_ATTR_COALESCE_RULE_DELAY,
NL80211_ATTR_COALESCE_RULE_CONDITION,
NL80211_ATTR_COALESCE_RULE_PKT_PATTERN,
-
/* keep last */
NUM_NL80211_ATTR_COALESCE_RULE,
NL80211_ATTR_COALESCE_RULE_MAX = NUM_NL80211_ATTR_COALESCE_RULE - 1
};
-
/**
* enum nl80211_coalesce_condition - coalesce rule conditions
* @NL80211_COALESCE_CONDITION_MATCH: coalaesce Rx packets when patterns
@@ -5036,7 +4947,6 @@ enum nl80211_coalesce_condition {
NL80211_COALESCE_CONDITION_MATCH,
NL80211_COALESCE_CONDITION_NO_MATCH
};
-
/**
* enum nl80211_iface_limit_attrs - limit attributes
* @NL80211_IFACE_LIMIT_UNSPEC: (reserved)
@@ -5051,12 +4961,10 @@ enum nl80211_iface_limit_attrs {
NL80211_IFACE_LIMIT_UNSPEC,
NL80211_IFACE_LIMIT_MAX,
NL80211_IFACE_LIMIT_TYPES,
-
/* keep last */
NUM_NL80211_IFACE_LIMIT,
MAX_NL80211_IFACE_LIMIT = NUM_NL80211_IFACE_LIMIT - 1
};
-
/**
* enum nl80211_if_combination_attrs -- interface combination attributes
*
@@ -5115,13 +5023,10 @@ enum nl80211_if_combination_attrs {
NL80211_IFACE_COMB_RADAR_DETECT_WIDTHS,
NL80211_IFACE_COMB_RADAR_DETECT_REGIONS,
NL80211_IFACE_COMB_BI_MIN_GCD,
-
/* keep last */
NUM_NL80211_IFACE_COMB,
MAX_NL80211_IFACE_COMB = NUM_NL80211_IFACE_COMB - 1
};
-
-
/**
* enum nl80211_plink_state - state of a mesh peer link finite state machine
*
@@ -5148,12 +5053,10 @@ enum nl80211_plink_state {
NL80211_PLINK_ESTAB,
NL80211_PLINK_HOLDING,
NL80211_PLINK_BLOCKED,
-
/* keep last */
NUM_NL80211_PLINK_STATES,
MAX_NL80211_PLINK_STATES = NUM_NL80211_PLINK_STATES - 1
};
-
/**
* enum nl80211_plink_action - actions to perform in mesh peers
*
@@ -5166,21 +5069,20 @@ enum plink_actions {
NL80211_PLINK_ACTION_NO_ACTION,
NL80211_PLINK_ACTION_OPEN,
NL80211_PLINK_ACTION_BLOCK,
-
NUM_NL80211_PLINK_ACTIONS,
};
-
-
#define NL80211_KCK_LEN 16
#define NL80211_KEK_LEN 16
+#define NL80211_KCK_EXT_LEN 24
+#define NL80211_KEK_EXT_LEN 32
#define NL80211_REPLAY_CTR_LEN 8
-
/**
* enum nl80211_rekey_data - attributes for GTK rekey offload
* @__NL80211_REKEY_DATA_INVALID: invalid number for nested attributes
* @NL80211_REKEY_DATA_KEK: key encryption key (binary)
* @NL80211_REKEY_DATA_KCK: key confirmation key (binary)
* @NL80211_REKEY_DATA_REPLAY_CTR: replay counter (binary)
+ * @NL80211_REKEY_DATA_AKM: AKM data (OUI, suite type)
* @NUM_NL80211_REKEY_DATA: number of rekey attributes (internal)
* @MAX_NL80211_REKEY_DATA: highest rekey attribute (internal)
*/
@@ -5189,12 +5091,11 @@ enum nl80211_rekey_data {
NL80211_REKEY_DATA_KEK,
NL80211_REKEY_DATA_KCK,
NL80211_REKEY_DATA_REPLAY_CTR,
-
+ NL80211_REKEY_DATA_AKM,
/* keep last */
NUM_NL80211_REKEY_DATA,
MAX_NL80211_REKEY_DATA = NUM_NL80211_REKEY_DATA - 1
};
-
/**
* enum nl80211_hidden_ssid - values for %NL80211_ATTR_HIDDEN_SSID
* @NL80211_HIDDEN_SSID_NOT_IN_USE: do not hide SSID (i.e., broadcast it in
@@ -5209,7 +5110,6 @@ enum nl80211_hidden_ssid {
NL80211_HIDDEN_SSID_ZERO_LEN,
NL80211_HIDDEN_SSID_ZERO_CONTENTS
};
-
/**
* enum nl80211_sta_wme_attr - station WME attributes
* @__NL80211_STA_WME_INVALID: invalid number for nested attribute
@@ -5224,12 +5124,10 @@ enum nl80211_sta_wme_attr {
__NL80211_STA_WME_INVALID,
NL80211_STA_WME_UAPSD_QUEUES,
NL80211_STA_WME_MAX_SP,
-
/* keep last */
__NL80211_STA_WME_AFTER_LAST,
NL80211_STA_WME_MAX = __NL80211_STA_WME_AFTER_LAST - 1
};
-
/**
* enum nl80211_pmksa_candidate_attr - attributes for PMKSA caching candidates
* @__NL80211_PMKSA_CANDIDATE_INVALID: invalid number for nested attributes
@@ -5247,12 +5145,10 @@ enum nl80211_pmksa_candidate_attr {
NL80211_PMKSA_CANDIDATE_INDEX,
NL80211_PMKSA_CANDIDATE_BSSID,
NL80211_PMKSA_CANDIDATE_PREAUTH,
-
/* keep last */
NUM_NL80211_PMKSA_CANDIDATE,
MAX_NL80211_PMKSA_CANDIDATE = NUM_NL80211_PMKSA_CANDIDATE - 1
};
-
/**
* enum nl80211_tdls_operation - values for %NL80211_ATTR_TDLS_OPERATION
* @NL80211_TDLS_DISCOVERY_REQ: Send a TDLS discovery request
@@ -5268,7 +5164,6 @@ enum nl80211_tdls_operation {
NL80211_TDLS_ENABLE_LINK,
NL80211_TDLS_DISABLE_LINK,
};
-
/*
* enum nl80211_ap_sme_features - device-integrated AP features
* Reserved for future use, no bits are defined in
@@ -5276,7 +5171,6 @@ enum nl80211_tdls_operation {
enum nl80211_ap_sme_features {
};
*/
-
/**
* enum nl80211_feature_flags - device/driver features
* @NL80211_FEATURE_SK_TX_STATUS: This driver supports reflecting back
@@ -5404,12 +5298,11 @@ enum nl80211_feature_flags {
NL80211_FEATURE_SCHED_SCAN_RANDOM_MAC_ADDR = 1 << 30,
NL80211_FEATURE_ND_RANDOM_MAC_ADDR = 1U << 31,
};
-
/**
* enum nl80211_ext_feature_index - bit index of extended features.
* @NL80211_EXT_FEATURE_VHT_IBSS: This driver supports IBSS with VHT datarates.
* @NL80211_EXT_FEATURE_RRM: This driver supports RRM. When featured, user can
- * can request to use RRM (see %NL80211_ATTR_USE_RRM) with
+ * request to use RRM (see %NL80211_ATTR_USE_RRM) with
* %NL80211_CMD_ASSOCIATE and %NL80211_CMD_CONNECT requests, which will set
* the ASSOC_REQ_USE_RRM flag in the association request even if
* NL80211_FEATURE_QUIET is not advertized.
@@ -5517,6 +5410,51 @@ enum nl80211_feature_flags {
* with VLAN tagged frames and separate VLAN-specific netdevs added using
* vconfig similarly to the Ethernet case.
*
+ * @NL80211_EXT_FEATURE_AQL: The driver supports the Airtime Queue Limit (AQL)
+ * feature, which prevents bufferbloat by using the expected transmission
+ * time to limit the amount of data buffered in the hardware.
+ *
+ * @NL80211_EXT_FEATURE_BEACON_PROTECTION: The driver supports Beacon protection
+ * and can receive key configuration for BIGTK using key indexes 6 and 7.
+ * @NL80211_EXT_FEATURE_BEACON_PROTECTION_CLIENT: The driver supports Beacon
+ * protection as a client only and cannot transmit protected beacons.
+ *
+ * @NL80211_EXT_FEATURE_CONTROL_PORT_NO_PREAUTH: The driver can disable the
+ * forwarding of preauth frames over the control port. They are then
+ * handled as ordinary data frames.
+ *
+ * @NL80211_EXT_FEATURE_PROTECTED_TWT: Driver supports protected TWT frames
+ *
+ * @NL80211_EXT_FEATURE_DEL_IBSS_STA: The driver supports removing stations
+ * in IBSS mode, essentially by dropping their state.
+ *
+ * @NL80211_EXT_FEATURE_MULTICAST_REGISTRATIONS: management frame registrations
+ * are possible for multicast frames and those will be reported properly.
+ *
+ * @NL80211_EXT_FEATURE_SCAN_FREQ_KHZ: This driver supports receiving and
+ * reporting scan request with %NL80211_ATTR_SCAN_FREQ_KHZ. In order to
+ * report %NL80211_ATTR_SCAN_FREQ_KHZ, %NL80211_SCAN_FLAG_FREQ_KHZ must be
+ * included in the scan request.
+ *
+ * @NL80211_EXT_FEATURE_CONTROL_PORT_OVER_NL80211_TX_STATUS: The driver
+ * can report tx status for control port over nl80211 tx operations.
+ *
+ * @NL80211_EXT_FEATURE_OPERATING_CHANNEL_VALIDATION: Driver supports Operating
+ * Channel Validation (OCV) when using driver's SME for RSNA handshakes.
+ *
+ * @NL80211_EXT_FEATURE_4WAY_HANDSHAKE_AP_PSK: Device wants to do 4-way
+ * handshake with PSK in AP mode (PSK is passed as part of the start AP
+ * command).
+ *
+ * @NL80211_EXT_FEATURE_SAE_OFFLOAD_AP: Device wants to do SAE authentication
+ * in AP mode (SAE password is passed as part of the start AP command).
+ *
+ * @NL80211_EXT_FEATURE_FILS_DISCOVERY: Driver/device supports FILS discovery
+ * frames transmission
+ *
+ * @NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP: Driver/device supports
+ * unsolicited broadcast probe response transmission
+ *
* @NUM_NL80211_EXT_FEATURES: number of extended features.
* @MAX_NL80211_EXT_FEATURES: highest extended feature index.
*/
@@ -5563,12 +5501,24 @@ enum nl80211_ext_feature_index {
NL80211_EXT_FEATURE_STA_TX_PWR,
NL80211_EXT_FEATURE_SAE_OFFLOAD,
NL80211_EXT_FEATURE_VLAN_OFFLOAD,
-
+ NL80211_EXT_FEATURE_AQL,
+ NL80211_EXT_FEATURE_BEACON_PROTECTION,
+ NL80211_EXT_FEATURE_CONTROL_PORT_NO_PREAUTH,
+ NL80211_EXT_FEATURE_PROTECTED_TWT,
+ NL80211_EXT_FEATURE_DEL_IBSS_STA,
+ NL80211_EXT_FEATURE_MULTICAST_REGISTRATIONS,
+ NL80211_EXT_FEATURE_BEACON_PROTECTION_CLIENT,
+ NL80211_EXT_FEATURE_SCAN_FREQ_KHZ,
+ NL80211_EXT_FEATURE_CONTROL_PORT_OVER_NL80211_TX_STATUS,
+ NL80211_EXT_FEATURE_OPERATING_CHANNEL_VALIDATION,
+ NL80211_EXT_FEATURE_4WAY_HANDSHAKE_AP_PSK,
+ NL80211_EXT_FEATURE_SAE_OFFLOAD_AP,
+ NL80211_EXT_FEATURE_FILS_DISCOVERY,
+ NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP,
/* add new features before the definition below */
NUM_NL80211_EXT_FEATURES,
MAX_NL80211_EXT_FEATURES = NUM_NL80211_EXT_FEATURES - 1
};
-
/**
* enum nl80211_probe_resp_offload_support_attr - optional supported
* protocols for probe-response offloading by the driver/FW.
@@ -5589,7 +5539,6 @@ enum nl80211_probe_resp_offload_support_attr {
NL80211_PROBE_RESP_OFFLOAD_SUPPORT_P2P = 1<<2,
NL80211_PROBE_RESP_OFFLOAD_SUPPORT_80211U = 1<<3,
};
-
/**
* enum nl80211_connect_failed_reason - connection request failed reasons
* @NL80211_CONN_FAIL_MAX_CLIENTS: Maximum number of clients that can be
@@ -5600,7 +5549,6 @@ enum nl80211_connect_failed_reason {
NL80211_CONN_FAIL_MAX_CLIENTS,
NL80211_CONN_FAIL_BLOCKED_CLIENT,
};
-
/**
* enum nl80211_timeout_reason - timeout reasons
*
@@ -5615,7 +5563,6 @@ enum nl80211_timeout_reason {
NL80211_TIMEOUT_AUTH,
NL80211_TIMEOUT_ASSOC,
};
-
/**
* enum nl80211_scan_flags - scan request control flags
*
@@ -5674,6 +5621,11 @@ enum nl80211_timeout_reason {
* @NL80211_SCAN_FLAG_MIN_PREQ_CONTENT: minimize probe request content to
* only have supported rates and no additional capabilities (unless
* added by userspace explicitly.)
+ * @NL80211_SCAN_FLAG_FREQ_KHZ: report scan results with
+ * %NL80211_ATTR_SCAN_FREQ_KHZ. This also means
+ * %NL80211_ATTR_SCAN_FREQUENCIES will not be included.
+ * @NL80211_SCAN_FLAG_COLOCATED_6GHZ: scan for colocated APs reported by
+ * 2.4/5 GHz APs
*/
enum nl80211_scan_flags {
NL80211_SCAN_FLAG_LOW_PRIORITY = 1<<0,
@@ -5689,8 +5641,9 @@ enum nl80211_scan_flags {
NL80211_SCAN_FLAG_HIGH_ACCURACY = 1<<10,
NL80211_SCAN_FLAG_RANDOM_SN = 1<<11,
NL80211_SCAN_FLAG_MIN_PREQ_CONTENT = 1<<12,
+ NL80211_SCAN_FLAG_FREQ_KHZ = 1<<13,
+ NL80211_SCAN_FLAG_COLOCATED_6GHZ = 1<<14,
};
-
/**
* enum nl80211_acl_policy - access control policy
*
@@ -5708,7 +5661,6 @@ enum nl80211_acl_policy {
NL80211_ACL_POLICY_ACCEPT_UNLESS_LISTED,
NL80211_ACL_POLICY_DENY_UNLESS_LISTED,
};
-
/**
* enum nl80211_smps_mode - SMPS mode
*
@@ -5723,11 +5675,9 @@ enum nl80211_smps_mode {
NL80211_SMPS_OFF,
NL80211_SMPS_STATIC,
NL80211_SMPS_DYNAMIC,
-
__NL80211_SMPS_AFTER_LAST,
NL80211_SMPS_MAX = __NL80211_SMPS_AFTER_LAST - 1
};
-
/**
* enum nl80211_radar_event - type of radar event for DFS operation
*
@@ -5757,7 +5707,6 @@ enum nl80211_radar_event {
NL80211_RADAR_PRE_CAC_EXPIRED,
NL80211_RADAR_CAC_STARTED,
};
-
/**
* enum nl80211_dfs_state - DFS states for channels
*
@@ -5774,9 +5723,8 @@ enum nl80211_dfs_state {
NL80211_DFS_UNAVAILABLE,
NL80211_DFS_AVAILABLE,
};
-
/**
- * enum enum nl80211_protocol_features - nl80211 protocol features
+ * enum nl80211_protocol_features - nl80211 protocol features
* @NL80211_PROTOCOL_FEATURE_SPLIT_WIPHY_DUMP: nl80211 supports splitting
* wiphy dumps (if requested by the application with the attribute
* %NL80211_ATTR_SPLIT_WIPHY_DUMP. Also supported is filtering the
@@ -5786,7 +5734,6 @@ enum nl80211_dfs_state {
enum nl80211_protocol_features {
NL80211_PROTOCOL_FEATURE_SPLIT_WIPHY_DUMP = 1 << 0,
};
-
/**
* enum nl80211_crit_proto_id - nl80211 critical protocol identifiers
*
@@ -5804,10 +5751,8 @@ enum nl80211_crit_proto_id {
/* add other protocols before this one */
NUM_NL80211_CRIT_PROTO
};
-
/* maximum duration for critical protocol measures */
#define NL80211_CRIT_PROTO_MAX_DURATION 5000 /* msec */
-
/**
* enum nl80211_rxmgmt_flags - flags for received management frame.
*
@@ -5823,14 +5768,12 @@ enum nl80211_rxmgmt_flags {
NL80211_RXMGMT_FLAG_ANSWERED = 1 << 0,
NL80211_RXMGMT_FLAG_EXTERNAL_AUTH = 1 << 1,
};
-
/*
* If this flag is unset, the lower 24 bits are an OUI, if set
* a Linux nl80211 vendor ID is used (no such IDs are allocated
* yet, so that's not valid so far)
*/
#define NL80211_VENDOR_ID_IS_LINUX 0x80000000
-
/**
* struct nl80211_vendor_cmd_info - vendor command data
* @vendor_id: If the %NL80211_VENDOR_ID_IS_LINUX flag is clear, then the
@@ -5843,7 +5786,6 @@ struct nl80211_vendor_cmd_info {
__u32 vendor_id;
__u32 subcmd;
};
-
/**
* enum nl80211_tdls_peer_capability - TDLS peer flags.
*
@@ -5859,7 +5801,6 @@ enum nl80211_tdls_peer_capability {
NL80211_TDLS_PEER_VHT = 1<<1,
NL80211_TDLS_PEER_WMM = 1<<2,
};
-
/**
* enum nl80211_sched_scan_plan - scanning plan for scheduled scan
* @__NL80211_SCHED_SCAN_PLAN_INVALID: attribute number 0 is reserved
@@ -5877,13 +5818,11 @@ enum nl80211_sched_scan_plan {
__NL80211_SCHED_SCAN_PLAN_INVALID,
NL80211_SCHED_SCAN_PLAN_INTERVAL,
NL80211_SCHED_SCAN_PLAN_ITERATIONS,
-
/* keep last */
__NL80211_SCHED_SCAN_PLAN_AFTER_LAST,
NL80211_SCHED_SCAN_PLAN_MAX =
__NL80211_SCHED_SCAN_PLAN_AFTER_LAST - 1
};
-
/**
* struct nl80211_bss_select_rssi_adjust - RSSI adjustment parameters.
*
@@ -5895,7 +5834,6 @@ struct nl80211_bss_select_rssi_adjust {
__u8 band;
__s8 delta;
} __attribute__((packed));
-
/**
* enum nl80211_bss_select_attr - attributes for bss selection.
*
@@ -5923,12 +5861,10 @@ enum nl80211_bss_select_attr {
NL80211_BSS_SELECT_ATTR_RSSI,
NL80211_BSS_SELECT_ATTR_BAND_PREF,
NL80211_BSS_SELECT_ATTR_RSSI_ADJUST,
-
/* keep last */
__NL80211_BSS_SELECT_ATTR_AFTER_LAST,
NL80211_BSS_SELECT_ATTR_MAX = __NL80211_BSS_SELECT_ATTR_AFTER_LAST - 1
};
-
/**
* enum nl80211_nan_function_type - NAN function type
*
@@ -5942,12 +5878,10 @@ enum nl80211_nan_function_type {
NL80211_NAN_FUNC_PUBLISH,
NL80211_NAN_FUNC_SUBSCRIBE,
NL80211_NAN_FUNC_FOLLOW_UP,
-
/* keep last */
__NL80211_NAN_FUNC_TYPE_AFTER_LAST,
NL80211_NAN_FUNC_MAX_TYPE = __NL80211_NAN_FUNC_TYPE_AFTER_LAST - 1,
};
-
/**
* enum nl80211_nan_publish_type - NAN publish tx type
*
@@ -5960,7 +5894,6 @@ enum nl80211_nan_publish_type {
NL80211_NAN_SOLICITED_PUBLISH = 1 << 0,
NL80211_NAN_UNSOLICITED_PUBLISH = 1 << 1,
};
-
/**
* enum nl80211_nan_func_term_reason - NAN functions termination reason
*
@@ -5975,11 +5908,9 @@ enum nl80211_nan_func_term_reason {
NL80211_NAN_FUNC_TERM_REASON_TTL_EXPIRED,
NL80211_NAN_FUNC_TERM_REASON_ERROR,
};
-
#define NL80211_NAN_FUNC_SERVICE_ID_LEN 6
#define NL80211_NAN_FUNC_SERVICE_SPEC_INFO_MAX_LEN 0xff
#define NL80211_NAN_FUNC_SRF_MAX_LEN 0xff
-
/**
* enum nl80211_nan_func_attributes - NAN function attributes
* @__NL80211_NAN_FUNC_INVALID: invalid
@@ -6040,12 +5971,10 @@ enum nl80211_nan_func_attributes {
NL80211_NAN_FUNC_TX_MATCH_FILTER,
NL80211_NAN_FUNC_INSTANCE_ID,
NL80211_NAN_FUNC_TERM_REASON,
-
/* keep last */
NUM_NL80211_NAN_FUNC_ATTR,
NL80211_NAN_FUNC_ATTR_MAX = NUM_NL80211_NAN_FUNC_ATTR - 1
};
-
/**
* enum nl80211_nan_srf_attributes - NAN Service Response filter attributes
* @__NL80211_NAN_SRF_INVALID: invalid
@@ -6067,12 +5996,10 @@ enum nl80211_nan_srf_attributes {
NL80211_NAN_SRF_BF,
NL80211_NAN_SRF_BF_IDX,
NL80211_NAN_SRF_MAC_ADDRS,
-
/* keep last */
NUM_NL80211_NAN_SRF_ATTR,
NL80211_NAN_SRF_ATTR_MAX = NUM_NL80211_NAN_SRF_ATTR - 1,
};
-
/**
* enum nl80211_nan_match_attributes - NAN match attributes
* @__NL80211_NAN_MATCH_INVALID: invalid
@@ -6090,12 +6017,10 @@ enum nl80211_nan_match_attributes {
__NL80211_NAN_MATCH_INVALID,
NL80211_NAN_MATCH_FUNC_LOCAL,
NL80211_NAN_MATCH_FUNC_PEER,
-
/* keep last */
NUM_NL80211_NAN_MATCH_ATTR,
NL80211_NAN_MATCH_ATTR_MAX = NUM_NL80211_NAN_MATCH_ATTR - 1
};
-
/**
* nl80211_external_auth_action - Action to perform with external
* authentication request. Used by NL80211_ATTR_EXTERNAL_AUTH_ACTION.
@@ -6106,7 +6031,6 @@ enum nl80211_external_auth_action {
NL80211_EXTERNAL_AUTH_START,
NL80211_EXTERNAL_AUTH_ABORT,
};
-
/**
* enum nl80211_ftm_responder_attributes - fine timing measurement
* responder attributes
@@ -6123,16 +6047,13 @@ enum nl80211_external_auth_action {
*/
enum nl80211_ftm_responder_attributes {
__NL80211_FTM_RESP_ATTR_INVALID,
-
NL80211_FTM_RESP_ATTR_ENABLED,
NL80211_FTM_RESP_ATTR_LCI,
NL80211_FTM_RESP_ATTR_CIVICLOC,
-
/* keep last */
__NL80211_FTM_RESP_ATTR_LAST,
NL80211_FTM_RESP_ATTR_MAX = __NL80211_FTM_RESP_ATTR_LAST - 1,
};
-
/*
* enum nl80211_ftm_responder_stats - FTM responder statistics
*
@@ -6173,26 +6094,25 @@ enum nl80211_ftm_responder_stats {
NL80211_FTM_STATS_RESCHEDULE_REQUESTS_NUM,
NL80211_FTM_STATS_OUT_OF_WINDOW_TRIGGERS_NUM,
NL80211_FTM_STATS_PAD,
-
/* keep last */
__NL80211_FTM_STATS_AFTER_LAST,
NL80211_FTM_STATS_MAX = __NL80211_FTM_STATS_AFTER_LAST - 1
};
-
/**
* enum nl80211_preamble - frame preamble types
* @NL80211_PREAMBLE_LEGACY: legacy (HR/DSSS, OFDM, ERP PHY) preamble
* @NL80211_PREAMBLE_HT: HT preamble
* @NL80211_PREAMBLE_VHT: VHT preamble
* @NL80211_PREAMBLE_DMG: DMG preamble
+ * @NL80211_PREAMBLE_HE: HE preamble
*/
enum nl80211_preamble {
NL80211_PREAMBLE_LEGACY,
NL80211_PREAMBLE_HT,
NL80211_PREAMBLE_VHT,
NL80211_PREAMBLE_DMG,
+ NL80211_PREAMBLE_HE,
};
-
/**
* enum nl80211_peer_measurement_type - peer measurement types
* @NL80211_PMSR_TYPE_INVALID: invalid/unused, needed as we use
@@ -6205,13 +6125,10 @@ enum nl80211_preamble {
*/
enum nl80211_peer_measurement_type {
NL80211_PMSR_TYPE_INVALID,
-
NL80211_PMSR_TYPE_FTM,
-
NUM_NL80211_PMSR_TYPES,
NL80211_PMSR_TYPE_MAX = NUM_NL80211_PMSR_TYPES - 1
};
-
/**
* enum nl80211_peer_measurement_status - peer measurement status
* @NL80211_PMSR_STATUS_SUCCESS: measurement completed successfully
@@ -6226,7 +6143,6 @@ enum nl80211_peer_measurement_status {
NL80211_PMSR_STATUS_TIMEOUT,
NL80211_PMSR_STATUS_FAILURE,
};
-
/**
* enum nl80211_peer_measurement_req - peer measurement request attributes
* @__NL80211_PMSR_REQ_ATTR_INVALID: invalid
@@ -6242,15 +6158,12 @@ enum nl80211_peer_measurement_status {
*/
enum nl80211_peer_measurement_req {
__NL80211_PMSR_REQ_ATTR_INVALID,
-
NL80211_PMSR_REQ_ATTR_DATA,
NL80211_PMSR_REQ_ATTR_GET_AP_TSF,
-
/* keep last */
NUM_NL80211_PMSR_REQ_ATTRS,
NL80211_PMSR_REQ_ATTR_MAX = NUM_NL80211_PMSR_REQ_ATTRS - 1
};
-
/**
* enum nl80211_peer_measurement_resp - peer measurement response attributes
* @__NL80211_PMSR_RESP_ATTR_INVALID: invalid
@@ -6278,19 +6191,16 @@ enum nl80211_peer_measurement_req {
*/
enum nl80211_peer_measurement_resp {
__NL80211_PMSR_RESP_ATTR_INVALID,
-
NL80211_PMSR_RESP_ATTR_DATA,
NL80211_PMSR_RESP_ATTR_STATUS,
NL80211_PMSR_RESP_ATTR_HOST_TIME,
NL80211_PMSR_RESP_ATTR_AP_TSF,
NL80211_PMSR_RESP_ATTR_FINAL,
NL80211_PMSR_RESP_ATTR_PAD,
-
/* keep last */
NUM_NL80211_PMSR_RESP_ATTRS,
NL80211_PMSR_RESP_ATTR_MAX = NUM_NL80211_PMSR_RESP_ATTRS - 1
};
-
/**
* enum nl80211_peer_measurement_peer_attrs - peer attributes for measurement
* @__NL80211_PMSR_PEER_ATTR_INVALID: invalid
@@ -6310,17 +6220,14 @@ enum nl80211_peer_measurement_resp {
*/
enum nl80211_peer_measurement_peer_attrs {
__NL80211_PMSR_PEER_ATTR_INVALID,
-
NL80211_PMSR_PEER_ATTR_ADDR,
NL80211_PMSR_PEER_ATTR_CHAN,
NL80211_PMSR_PEER_ATTR_REQ,
NL80211_PMSR_PEER_ATTR_RESP,
-
/* keep last */
NUM_NL80211_PMSR_PEER_ATTRS,
NL80211_PMSR_PEER_ATTR_MAX = NUM_NL80211_PMSR_PEER_ATTRS - 1,
};
-
/**
* enum nl80211_peer_measurement_attrs - peer measurement attributes
* @__NL80211_PMSR_ATTR_INVALID: invalid
@@ -6347,18 +6254,15 @@ enum nl80211_peer_measurement_peer_attrs {
*/
enum nl80211_peer_measurement_attrs {
__NL80211_PMSR_ATTR_INVALID,
-
NL80211_PMSR_ATTR_MAX_PEERS,
NL80211_PMSR_ATTR_REPORT_AP_TSF,
NL80211_PMSR_ATTR_RANDOMIZE_MAC_ADDR,
NL80211_PMSR_ATTR_TYPE_CAPA,
NL80211_PMSR_ATTR_PEERS,
-
/* keep last */
NUM_NL80211_PMSR_ATTR,
NL80211_PMSR_ATTR_MAX = NUM_NL80211_PMSR_ATTR - 1
};
-
/**
* enum nl80211_peer_measurement_ftm_capa - FTM capabilities
* @__NL80211_PMSR_FTM_CAPA_ATTR_INVALID: invalid
@@ -6383,13 +6287,16 @@ enum nl80211_peer_measurement_attrs {
* is valid)
* @NL80211_PMSR_FTM_CAPA_ATTR_MAX_FTMS_PER_BURST: u32 attribute indicating
* the maximum FTMs per burst (if not present anything is valid)
+ * @NL80211_PMSR_FTM_CAPA_ATTR_TRIGGER_BASED: flag attribute indicating if
+ * trigger based ranging measurement is supported
+ * @NL80211_PMSR_FTM_CAPA_ATTR_NON_TRIGGER_BASED: flag attribute indicating
+ * if non trigger based ranging measurement is supported
*
* @NUM_NL80211_PMSR_FTM_CAPA_ATTR: internal
* @NL80211_PMSR_FTM_CAPA_ATTR_MAX: highest attribute number
*/
enum nl80211_peer_measurement_ftm_capa {
__NL80211_PMSR_FTM_CAPA_ATTR_INVALID,
-
NL80211_PMSR_FTM_CAPA_ATTR_ASAP,
NL80211_PMSR_FTM_CAPA_ATTR_NON_ASAP,
NL80211_PMSR_FTM_CAPA_ATTR_REQ_LCI,
@@ -6398,12 +6305,12 @@ enum nl80211_peer_measurement_ftm_capa {
NL80211_PMSR_FTM_CAPA_ATTR_BANDWIDTHS,
NL80211_PMSR_FTM_CAPA_ATTR_MAX_BURSTS_EXPONENT,
NL80211_PMSR_FTM_CAPA_ATTR_MAX_FTMS_PER_BURST,
-
+ NL80211_PMSR_FTM_CAPA_ATTR_TRIGGER_BASED,
+ NL80211_PMSR_FTM_CAPA_ATTR_NON_TRIGGER_BASED,
/* keep last */
NUM_NL80211_PMSR_FTM_CAPA_ATTR,
NL80211_PMSR_FTM_CAPA_ATTR_MAX = NUM_NL80211_PMSR_FTM_CAPA_ATTR - 1
};
-
/**
* enum nl80211_peer_measurement_ftm_req - FTM request attributes
* @__NL80211_PMSR_FTM_REQ_ATTR_INVALID: invalid
@@ -6427,13 +6334,26 @@ enum nl80211_peer_measurement_ftm_capa {
* @NL80211_PMSR_FTM_REQ_ATTR_REQUEST_LCI: request LCI data (flag)
* @NL80211_PMSR_FTM_REQ_ATTR_REQUEST_CIVICLOC: request civic location data
* (flag)
+ * @NL80211_PMSR_FTM_REQ_ATTR_TRIGGER_BASED: request trigger based ranging
+ * measurement (flag).
+ * This attribute and %NL80211_PMSR_FTM_REQ_ATTR_NON_TRIGGER_BASED are
+ * mutually exclusive.
+ * if neither %NL80211_PMSR_FTM_REQ_ATTR_TRIGGER_BASED nor
+ * %NL80211_PMSR_FTM_REQ_ATTR_NON_TRIGGER_BASED is set, EDCA based
+ * ranging will be used.
+ * @NL80211_PMSR_FTM_REQ_ATTR_NON_TRIGGER_BASED: request non trigger based
+ * ranging measurement (flag)
+ * This attribute and %NL80211_PMSR_FTM_REQ_ATTR_TRIGGER_BASED are
+ * mutually exclusive.
+ * if neither %NL80211_PMSR_FTM_REQ_ATTR_TRIGGER_BASED nor
+ * %NL80211_PMSR_FTM_REQ_ATTR_NON_TRIGGER_BASED is set, EDCA based
+ * ranging will be used.
*
* @NUM_NL80211_PMSR_FTM_REQ_ATTR: internal
* @NL80211_PMSR_FTM_REQ_ATTR_MAX: highest attribute number
*/
enum nl80211_peer_measurement_ftm_req {
__NL80211_PMSR_FTM_REQ_ATTR_INVALID,
-
NL80211_PMSR_FTM_REQ_ATTR_ASAP,
NL80211_PMSR_FTM_REQ_ATTR_PREAMBLE,
NL80211_PMSR_FTM_REQ_ATTR_NUM_BURSTS_EXP,
@@ -6443,12 +6363,12 @@ enum nl80211_peer_measurement_ftm_req {
NL80211_PMSR_FTM_REQ_ATTR_NUM_FTMR_RETRIES,
NL80211_PMSR_FTM_REQ_ATTR_REQUEST_LCI,
NL80211_PMSR_FTM_REQ_ATTR_REQUEST_CIVICLOC,
-
+ NL80211_PMSR_FTM_REQ_ATTR_TRIGGER_BASED,
+ NL80211_PMSR_FTM_REQ_ATTR_NON_TRIGGER_BASED,
/* keep last */
NUM_NL80211_PMSR_FTM_REQ_ATTR,
NL80211_PMSR_FTM_REQ_ATTR_MAX = NUM_NL80211_PMSR_FTM_REQ_ATTR - 1
};
-
/**
* enum nl80211_peer_measurement_ftm_failure_reasons - FTM failure reasons
* @NL80211_PMSR_FTM_FAILURE_UNSPECIFIED: unspecified failure, not used
@@ -6475,7 +6395,6 @@ enum nl80211_peer_measurement_ftm_failure_reasons {
NL80211_PMSR_FTM_FAILURE_PEER_BUSY,
NL80211_PMSR_FTM_FAILURE_BAD_CHANGED_PARAMS,
};
-
/**
* enum nl80211_peer_measurement_ftm_resp - FTM response attributes
* @__NL80211_PMSR_FTM_RESP_ATTR_INVALID: invalid
@@ -6533,7 +6452,6 @@ enum nl80211_peer_measurement_ftm_failure_reasons {
*/
enum nl80211_peer_measurement_ftm_resp {
__NL80211_PMSR_FTM_RESP_ATTR_INVALID,
-
NL80211_PMSR_FTM_RESP_ATTR_FAIL_REASON,
NL80211_PMSR_FTM_RESP_ATTR_BURST_INDEX,
NL80211_PMSR_FTM_RESP_ATTR_NUM_FTMR_ATTEMPTS,
@@ -6555,32 +6473,132 @@ enum nl80211_peer_measurement_ftm_resp {
NL80211_PMSR_FTM_RESP_ATTR_LCI,
NL80211_PMSR_FTM_RESP_ATTR_CIVICLOC,
NL80211_PMSR_FTM_RESP_ATTR_PAD,
-
/* keep last */
NUM_NL80211_PMSR_FTM_RESP_ATTR,
NL80211_PMSR_FTM_RESP_ATTR_MAX = NUM_NL80211_PMSR_FTM_RESP_ATTR - 1
};
-
/**
* enum nl80211_obss_pd_attributes - OBSS packet detection attributes
* @__NL80211_HE_OBSS_PD_ATTR_INVALID: Invalid
*
* @NL80211_HE_OBSS_PD_ATTR_MIN_OFFSET: the OBSS PD minimum tx power offset.
* @NL80211_HE_OBSS_PD_ATTR_MAX_OFFSET: the OBSS PD maximum tx power offset.
+ * @NL80211_HE_OBSS_PD_ATTR_NON_SRG_MAX_OFFSET: the non-SRG OBSS PD maximum
+ * tx power offset.
+ * @NL80211_HE_OBSS_PD_ATTR_BSS_COLOR_BITMAP: bitmap that indicates the BSS color
+ * values used by members of the SRG.
+ * @NL80211_HE_OBSS_PD_ATTR_PARTIAL_BSSID_BITMAP: bitmap that indicates the partial
+ * BSSID values used by members of the SRG.
+ * @NL80211_HE_OBSS_PD_ATTR_SR_CTRL: The SR Control field of SRP element.
*
* @__NL80211_HE_OBSS_PD_ATTR_LAST: Internal
* @NL80211_HE_OBSS_PD_ATTR_MAX: highest OBSS PD attribute.
*/
enum nl80211_obss_pd_attributes {
__NL80211_HE_OBSS_PD_ATTR_INVALID,
-
NL80211_HE_OBSS_PD_ATTR_MIN_OFFSET,
NL80211_HE_OBSS_PD_ATTR_MAX_OFFSET,
-
+ NL80211_HE_OBSS_PD_ATTR_NON_SRG_MAX_OFFSET,
+ NL80211_HE_OBSS_PD_ATTR_BSS_COLOR_BITMAP,
+ NL80211_HE_OBSS_PD_ATTR_PARTIAL_BSSID_BITMAP,
+ NL80211_HE_OBSS_PD_ATTR_SR_CTRL,
/* keep last */
__NL80211_HE_OBSS_PD_ATTR_LAST,
NL80211_HE_OBSS_PD_ATTR_MAX = __NL80211_HE_OBSS_PD_ATTR_LAST - 1,
};
-
-
-#endif /* __LINUX_NL80211_H */
+/**
+ * enum nl80211_bss_color_attributes - BSS Color attributes
+ * @__NL80211_HE_BSS_COLOR_ATTR_INVALID: Invalid
+ *
+ * @NL80211_HE_BSS_COLOR_ATTR_COLOR: the current BSS Color.
+ * @NL80211_HE_BSS_COLOR_ATTR_DISABLED: is BSS coloring disabled.
+ * @NL80211_HE_BSS_COLOR_ATTR_PARTIAL: the AID equation to be used..
+ *
+ * @__NL80211_HE_BSS_COLOR_ATTR_LAST: Internal
+ * @NL80211_HE_BSS_COLOR_ATTR_MAX: highest BSS Color attribute.
+ */
+enum nl80211_bss_color_attributes {
+ __NL80211_HE_BSS_COLOR_ATTR_INVALID,
+ NL80211_HE_BSS_COLOR_ATTR_COLOR,
+ NL80211_HE_BSS_COLOR_ATTR_DISABLED,
+ NL80211_HE_BSS_COLOR_ATTR_PARTIAL,
+ /* keep last */
+ __NL80211_HE_BSS_COLOR_ATTR_LAST,
+ NL80211_HE_BSS_COLOR_ATTR_MAX = __NL80211_HE_BSS_COLOR_ATTR_LAST - 1,
+};
+/**
+ * enum nl80211_iftype_akm_attributes - interface type AKM attributes
+ * @__NL80211_IFTYPE_AKM_ATTR_INVALID: Invalid
+ *
+ * @NL80211_IFTYPE_AKM_ATTR_IFTYPES: nested attribute containing a flag
+ * attribute for each interface type that supports AKM suites specified in
+ * %NL80211_IFTYPE_AKM_ATTR_SUITES
+ * @NL80211_IFTYPE_AKM_ATTR_SUITES: an array of u32. Used to indicate supported
+ * AKM suites for the specified interface types.
+ *
+ * @__NL80211_IFTYPE_AKM_ATTR_LAST: Internal
+ * @NL80211_IFTYPE_AKM_ATTR_MAX: highest interface type AKM attribute.
+ */
+enum nl80211_iftype_akm_attributes {
+ __NL80211_IFTYPE_AKM_ATTR_INVALID,
+ NL80211_IFTYPE_AKM_ATTR_IFTYPES,
+ NL80211_IFTYPE_AKM_ATTR_SUITES,
+ /* keep last */
+ __NL80211_IFTYPE_AKM_ATTR_LAST,
+ NL80211_IFTYPE_AKM_ATTR_MAX = __NL80211_IFTYPE_AKM_ATTR_LAST - 1,
+};
+/**
+ * enum nl80211_fils_discovery_attributes - FILS discovery configuration
+ * from IEEE Std 802.11ai-2016, Annex C.3 MIB detail.
+ *
+ * @__NL80211_FILS_DISCOVERY_ATTR_INVALID: Invalid
+ *
+ * @NL80211_FILS_DISCOVERY_ATTR_INT_MIN: Minimum packet interval (u32, TU).
+ * Allowed range: 0..10000 (TU = Time Unit)
+ * @NL80211_FILS_DISCOVERY_ATTR_INT_MAX: Maximum packet interval (u32, TU).
+ * Allowed range: 0..10000 (TU = Time Unit)
+ * @NL80211_FILS_DISCOVERY_ATTR_TMPL: Template data for FILS discovery action
+ * frame including the headers.
+ *
+ * @__NL80211_FILS_DISCOVERY_ATTR_LAST: Internal
+ * @NL80211_FILS_DISCOVERY_ATTR_MAX: highest attribute
+ */
+enum nl80211_fils_discovery_attributes {
+ __NL80211_FILS_DISCOVERY_ATTR_INVALID,
+ NL80211_FILS_DISCOVERY_ATTR_INT_MIN,
+ NL80211_FILS_DISCOVERY_ATTR_INT_MAX,
+ NL80211_FILS_DISCOVERY_ATTR_TMPL,
+ /* keep last */
+ __NL80211_FILS_DISCOVERY_ATTR_LAST,
+ NL80211_FILS_DISCOVERY_ATTR_MAX = __NL80211_FILS_DISCOVERY_ATTR_LAST - 1
+};
+/*
+ * FILS discovery template minimum length with action frame headers and
+ * mandatory fields.
+ */
+#define NL80211_FILS_DISCOVERY_TMPL_MIN_LEN 42
+/**
+ * enum nl80211_unsol_bcast_probe_resp_attributes - Unsolicited broadcast probe
+ * response configuration. Applicable only in 6GHz.
+ *
+ * @__NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_INVALID: Invalid
+ *
+ * @NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_INT: Maximum packet interval (u32, TU).
+ * Allowed range: 0..20 (TU = Time Unit). IEEE P802.11ax/D6.0
+ * 26.17.2.3.2 (AP behavior for fast passive scanning).
+ * @NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_TMPL: Unsolicited broadcast probe response
+ * frame template (binary).
+ *
+ * @__NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_LAST: Internal
+ * @NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_MAX: highest attribute
+ */
+enum nl80211_unsol_bcast_probe_resp_attributes {
+ __NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_INVALID,
+ NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_INT,
+ NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_TMPL,
+ /* keep last */
+ __NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_LAST,
+ NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_MAX =
+ __NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_LAST - 1
+};
+#endif /* __LINUX_NL80211_H */ \ No newline at end of file
diff --git a/net/netlink_manager.cpp b/net/netlink_manager.cpp
index 0238f0b..53673c6 100644
--- a/net/netlink_manager.cpp
+++ b/net/netlink_manager.cpp
@@ -521,7 +521,8 @@ void NetlinkManager::BroadcastHandler(unique_ptr<const NL80211Packet> packet) {
OnMlmeEvent(std::move(packet));
return;
}
- if (command == NL80211_CMD_REG_CHANGE) {
+ if (command == NL80211_CMD_REG_CHANGE ||
+ command == NL80211_CMD_WIPHY_REG_CHANGE) {
OnRegChangeEvent(std::move(packet));
return;
}
@@ -589,7 +590,7 @@ void NetlinkManager::OnRegChangeEvent(unique_ptr<const NL80211Packet> packet) {
}
for (const auto& handler : on_reg_domain_changed_handler_) {
- handler.second(country_code);
+ handler.second(handler.first, country_code);
}
}
diff --git a/net/netlink_manager.h b/net/netlink_manager.h
index 98db5ae..51bc2c4 100644
--- a/net/netlink_manager.h
+++ b/net/netlink_manager.h
@@ -85,7 +85,7 @@ typedef std::function<void(
// domain or a intersection regulatory domain.
// See details in defination of |nl80211_reg_type| from nl80211.h.
typedef std::function<void(
- std::string& country_code)> OnRegDomainChangedHandler;
+ uint32_t wiphy_index, std::string& country_code)> OnRegDomainChangedHandler;
// Enum used for identifying channel bandwidth.
// This is used by function |OnChannelSwitchEventHandler|.
diff --git a/net/netlink_utils.cpp b/net/netlink_utils.cpp
index c31249d..57b4239 100644
--- a/net/netlink_utils.cpp
+++ b/net/netlink_utils.cpp
@@ -51,13 +51,14 @@ uint32_t k2GHzFrequencyLowerBound = 2400;
uint32_t k2GHzFrequencyUpperBound = 2500;
uint32_t k5GHzFrequencyLowerBound = 5000;
-// This upper bound will exclude any 5.9Ghz channels which belong to 802.11p
-// for "vehicular communication systems".
-uint32_t k5GHzFrequencyUpperBound = 5865;
+uint32_t k5GHzFrequencyUpperBound = 5885;
uint32_t k6GHzFrequencyLowerBound = 5925;
uint32_t k6GHzFrequencyUpperBound = 7125;
+uint32_t k60GHzFrequencyLowerBound = 58320;
+uint32_t k60GHzFrequencyUpperBound = 70200;
+
constexpr uint8_t kHtMcsSetNumByte = 16;
constexpr uint8_t kVhtMcsSetNumByte = 8;
constexpr uint8_t kHeMcsSetNumByteMin = 4;
@@ -133,6 +134,10 @@ bool NetlinkUtils::GetWiphyIndex(uint32_t* out_wiphy_index,
get_wiphy.AddFlag(NLM_F_DUMP);
if (!iface_name.empty()) {
int ifindex = if_nametoindex(iface_name.c_str());
+ if (ifindex == 0) {
+ PLOG(ERROR) << "Can't get " << iface_name << " index";
+ return false;
+ }
get_wiphy.AddAttribute(NL80211Attr<uint32_t>(NL80211_ATTR_IFINDEX, ifindex));
}
vector<unique_ptr<const NL80211Packet>> response;
@@ -141,7 +146,7 @@ bool NetlinkUtils::GetWiphyIndex(uint32_t* out_wiphy_index,
return false;
}
if (response.empty()) {
- LOG(DEBUG) << "No wiphy is found";
+ LOG(INFO) << "No wiphy is found";
return false;
}
for (auto& packet : response) {
@@ -238,7 +243,7 @@ bool NetlinkUtils::GetInterfaces(uint32_t wiphy_index,
continue;
}
- interface_info->emplace_back(if_index, if_name, if_mac_addr);
+ interface_info->emplace_back(if_index, wiphy_index, if_name, if_mac_addr);
}
return true;
@@ -524,6 +529,9 @@ void NetlinkUtils::handleBandFreqAttributes(const NL80211NestedAttr& freqs_attr,
} else if (frequency_value > k6GHzFrequencyLowerBound &&
frequency_value < k6GHzFrequencyUpperBound) {
out_band_info->band_6g.push_back(frequency_value);
+ } else if (frequency_value >= k60GHzFrequencyLowerBound &&
+ frequency_value < k60GHzFrequencyUpperBound) {
+ out_band_info->band_60g.push_back(frequency_value);
}
}
}
diff --git a/net/netlink_utils.h b/net/netlink_utils.h
index df92e7d..c64a208 100644
--- a/net/netlink_utils.h
+++ b/net/netlink_utils.h
@@ -35,14 +35,18 @@ namespace wificond {
struct InterfaceInfo {
InterfaceInfo() = default;
- InterfaceInfo(uint32_t index,
+ InterfaceInfo(uint32_t if_index,
+ uint32_t wiphy_index,
const std::string& name,
const std::array<uint8_t, ETH_ALEN>& mac_address)
- : index(index),
+ : if_index(if_index),
+ wiphy_index(wiphy_index),
name(name),
mac_address(mac_address) {}
// Index of this interface.
- uint32_t index;
+ uint32_t if_index;
+ // Wiphy Index of this interface.
+ uint32_t wiphy_index;
// Name of this interface.
std::string name;
// MAC address of this interface.
@@ -66,6 +70,8 @@ struct BandInfo {
std::vector<uint32_t> band_dfs;
// Frequencies for 6 GHz band.
std::vector<uint32_t> band_6g;
+ // Frequencies for 60 GHz band.
+ std::vector<uint32_t> band_60g;
// support for 802.11n
bool is_80211n_supported;
// support for 802.11ac
diff --git a/scanning/scan_utils.cpp b/scanning/scan_utils.cpp
index 4b65a56..6c2cb22 100644
--- a/scanning/scan_utils.cpp
+++ b/scanning/scan_utils.cpp
@@ -278,6 +278,7 @@ bool ScanUtils::GetSSIDFromInfoElement(const vector<uint8_t>& ie,
bool ScanUtils::Scan(uint32_t interface_index,
bool request_random_mac,
int scan_type,
+ bool enable_6ghz_rnr,
const vector<vector<uint8_t>>& ssids,
const vector<uint32_t>& freqs,
int* error_code) {
@@ -331,10 +332,14 @@ bool ScanUtils::Scan(uint32_t interface_index,
default:
CHECK(0) << "Invalid scan type received: " << scan_type;
}
+ if (enable_6ghz_rnr) {
+ scan_flags |= NL80211_SCAN_FLAG_COLOCATED_6GHZ;
+ }
if (scan_flags) {
trigger_scan.AddAttribute(
NL80211Attr<uint32_t>(NL80211_ATTR_SCAN_FLAGS,
scan_flags));
+ LOG(DEBUG) << "Triggering scan with scan_flag=" << scan_flags;
}
// We are receiving an ERROR/ACK message instead of the actual
// scan results here, so it is OK to expect a timely response because
diff --git a/scanning/scan_utils.h b/scanning/scan_utils.h
index bc190c6..3ac7f4a 100644
--- a/scanning/scan_utils.h
+++ b/scanning/scan_utils.h
@@ -87,6 +87,7 @@ class ScanUtils {
// |SCAN_TYPE_HIGH_ACCURACY| (prioritize to increase accuracy over other scan
// performance atrributes) OR
// |SCAN_TYPE_DEFAULT| (no prioritization).
+ // - |enable_6ghz_rnr| Whether to scan for collocated 6Ghz APs reported by by 2.4/5Ghz APs.
// - |ssids| is a vector of ssids we request to scan, which mostly is used
// for hidden networks.
// If |ssids| is an empty vector, it will do a passive scan.
@@ -98,6 +99,7 @@ class ScanUtils {
virtual bool Scan(uint32_t interface_index,
bool request_random_mac,
int scan_type,
+ bool enable_6ghz_rnr,
const std::vector<std::vector<uint8_t>>& ssids,
const std::vector<uint32_t>& freqs,
int* error_code);
diff --git a/scanning/scanner_impl.cpp b/scanning/scanner_impl.cpp
index 83eceb2..48ca30f 100644
--- a/scanning/scanner_impl.cpp
+++ b/scanning/scanner_impl.cpp
@@ -58,8 +58,9 @@ bool IsScanTypeSupported(int scan_type, const WiphyFeatures& wiphy_features) {
}
constexpr const int kPercentNetworksWithFreq = 30;
-constexpr const int kPnoScanDefaultFreqs[] = {2412, 2417, 2422, 2427, 2432, 2437, 2447, 2452,
- 2457, 2462, 5180, 5200, 5220, 5240, 5745, 5765, 5785, 5805};
+constexpr const int32_t kPnoScanDefaultFreqs2G[] = {2412, 2417, 2422, 2427, 2432, 2437, 2447, 2452,
+ 2457, 2462};
+constexpr const int32_t kPnoScanDefaultFreqs5G[] = {5180, 5200, 5220, 5240, 5745, 5765, 5785, 5805};
} // namespace
namespace android {
@@ -157,15 +158,21 @@ Status ScannerImpl::scan(const SingleScanSettings& scan_settings,
vector<vector<uint8_t>> ssids = {{}};
vector<vector<uint8_t>> skipped_scan_ssids;
+ vector<vector<uint8_t>> skipped_long_ssids;
for (auto& network : scan_settings.hidden_networks_) {
if (ssids.size() + 1 > scan_capabilities_.max_num_scan_ssids) {
skipped_scan_ssids.emplace_back(network.ssid_);
continue;
}
+ if (network.ssid_.size() > 32) {
+ skipped_long_ssids.emplace_back(network.ssid_);
+ continue;
+ }
ssids.push_back(network.ssid_);
}
LogSsidList(skipped_scan_ssids, "Skip scan ssid for single scan");
+ LogSsidList(skipped_long_ssids, "Skip too long ssid");
vector<uint32_t> freqs;
for (auto& channel : scan_settings.channel_settings_) {
@@ -174,7 +181,7 @@ Status ScannerImpl::scan(const SingleScanSettings& scan_settings,
int error_code = 0;
if (!scan_utils_->Scan(interface_index_, request_random_mac, scan_type,
- ssids, freqs, &error_code)) {
+ scan_settings.enable_6ghz_rnr_, ssids, freqs, &error_code)) {
if (error_code == ENODEV) {
nodev_counter_ ++;
LOG(WARNING) << "Scan failed with error=nodev. counter=" << nodev_counter_;
@@ -240,7 +247,20 @@ void ScannerImpl::ParsePnoSettings(const PnoSettings& pno_settings,
// networks don't have frequency data.
if (unique_frequencies.size() > 0 && num_networks_no_freqs * 100 / match_ssids->size()
> kPercentNetworksWithFreq) {
- unique_frequencies.insert(std::begin(kPnoScanDefaultFreqs), std::end(kPnoScanDefaultFreqs));
+ // Filter out frequencies not supported by chip.
+ const auto band_2g = client_interface_->GetBandInfo().band_2g;
+ for (const auto frequency : kPnoScanDefaultFreqs2G) {
+ if (std::find(band_2g.begin(), band_2g.end(), frequency) != band_2g.end()) {
+ unique_frequencies.insert(frequency);
+ }
+ }
+ // Note: kPnoScanDefaultFreqs5G doesn't contain DFS frequencies.
+ const auto band_5g = client_interface_->GetBandInfo().band_5g;
+ for (const auto frequency : kPnoScanDefaultFreqs5G) {
+ if (std::find(band_5g.begin(), band_5g.end(), frequency) != band_5g.end()) {
+ unique_frequencies.insert(frequency);
+ }
+ }
}
for (const auto& frequency : unique_frequencies) {
freqs->push_back(frequency);
diff --git a/scanning/single_scan_settings.cpp b/scanning/single_scan_settings.cpp
index ec89259..47809fb 100644
--- a/scanning/single_scan_settings.cpp
+++ b/scanning/single_scan_settings.cpp
@@ -40,6 +40,7 @@ status_t SingleScanSettings::writeToParcel(::android::Parcel* parcel) const {
return ::android::BAD_VALUE;
}
RETURN_IF_FAILED(parcel->writeInt32(scan_type_));
+ RETURN_IF_FAILED(parcel->writeBool(enable_6ghz_rnr_));
RETURN_IF_FAILED(parcel->writeInt32(channel_settings_.size()));
for (const auto& channel : channel_settings_) {
// For Java readTypedList():
@@ -63,6 +64,7 @@ status_t SingleScanSettings::readFromParcel(const ::android::Parcel* parcel) {
LOG(ERROR) << "Unexpected scan type: " << scan_type_;
return ::android::BAD_VALUE;
}
+ RETURN_IF_FAILED(parcel->readBool(&enable_6ghz_rnr_));
int32_t num_channels = 0;
RETURN_IF_FAILED(parcel->readInt32(&num_channels));
// Convention used by Java side writeTypedList():
diff --git a/scanning/single_scan_settings.h b/scanning/single_scan_settings.h
index 6c70e71..a7d99dd 100644
--- a/scanning/single_scan_settings.h
+++ b/scanning/single_scan_settings.h
@@ -42,6 +42,7 @@ class SingleScanSettings : public ::android::Parcelable {
::android::status_t readFromParcel(const ::android::Parcel* parcel) override;
int32_t scan_type_;
+ bool enable_6ghz_rnr_;
std::vector<ChannelSettings> channel_settings_;
std::vector<HiddenNetwork> hidden_networks_;
diff --git a/server.cpp b/server.cpp
index 97fbd1e..9668bce 100644
--- a/server.cpp
+++ b/server.cpp
@@ -16,6 +16,7 @@
#include "wificond/server.h"
+#include <algorithm> // for std::find_if
#include <sstream>
#include <android-base/file.h>
@@ -36,10 +37,13 @@ using android::net::wifi::nl80211::IApInterface;
using android::net::wifi::nl80211::IClientInterface;
using android::net::wifi::nl80211::IInterfaceEventCallback;
using android::net::wifi::nl80211::DeviceWiphyCapabilities;
+using android::net::wifi::nl80211::IWificondEventCallback;
using android::wifi_system::InterfaceTool;
using std::endl;
+using std::optional;
using std::placeholders::_1;
+using std::placeholders::_2;
using std::string;
using std::stringstream;
using std::unique_ptr;
@@ -62,6 +66,33 @@ Server::Server(unique_ptr<InterfaceTool> if_tool,
scan_utils_(scan_utils) {
}
+Status Server::registerWificondEventCallback(const sp<IWificondEventCallback>& callback) {
+ for (const auto& it : wificond_event_callbacks_) {
+ if (IInterface::asBinder(callback) == IInterface::asBinder(it)) {
+ LOG(WARNING) << "Ignore duplicate wificond event callback registration";
+ return Status::ok();
+ }
+ }
+ LOG(INFO) << "New wificond event callback registered";
+ wificond_event_callbacks_.push_back(callback);
+ return Status::ok();
+}
+
+Status Server::unregisterWificondEventCallback(const sp<IWificondEventCallback>& callback) {
+ for (auto it = wificond_event_callbacks_.begin();
+ it != wificond_event_callbacks_.end();
+ it++) {
+ if (IInterface::asBinder(callback) == IInterface::asBinder(*it)) {
+ wificond_event_callbacks_.erase(it);
+ LOG(INFO) << "Unregister interface event callback";
+ return Status::ok();
+ }
+ }
+ LOG(WARNING) << "Failed to find registered wificond event callback"
+ << " to unregister";
+ return Status::ok();
+}
+
Status Server::RegisterCallback(const sp<IInterfaceEventCallback>& callback) {
for (auto& it : interface_event_callbacks_) {
if (IInterface::asBinder(callback) == IInterface::asBinder(it)) {
@@ -92,19 +123,28 @@ Status Server::UnregisterCallback(const sp<IInterfaceEventCallback>& callback) {
Status Server::createApInterface(const std::string& iface_name,
sp<IApInterface>* created_interface) {
InterfaceInfo interface;
- if (!SetupInterface(iface_name, &interface)) {
+ uint32_t wiphy_index;
+
+ if (!SetupInterface(iface_name, &interface, &wiphy_index)) {
return Status::ok(); // Logging was done internally
}
+ LOG(INFO) << "createApInterface: wiphy_index " << wiphy_index << " iface_name " << iface_name;
+
unique_ptr<ApInterfaceImpl> ap_interface(new ApInterfaceImpl(
interface.name,
- interface.index,
+ interface.if_index,
netlink_utils_,
if_tool_.get()));
*created_interface = ap_interface->GetBinder();
BroadcastApInterfaceReady(ap_interface->GetBinder());
ap_interfaces_[iface_name] = std::move(ap_interface);
-
+ if (hasNoIfaceForWiphyIndex(wiphy_index)) {
+ UpdateBandWiphyIndexMap(wiphy_index);
+ } else {
+ LOG(INFO) << "Band info for wiphy_index " << wiphy_index << " already available";
+ }
+ iface_to_wiphy_index_map_[iface_name] = wiphy_index;
return Status::ok();
}
@@ -117,20 +157,45 @@ Status Server::tearDownApInterface(const std::string& iface_name,
ap_interfaces_.erase(iter);
*out_success = true;
}
+
+ const auto iter_wi = iface_to_wiphy_index_map_.find(iface_name);
+ if (iter_wi != iface_to_wiphy_index_map_.end()) {
+ int wiphy_index = iter_wi->second;
+ LOG(INFO) << "tearDownApInterface: erasing wiphy_index for iface_name " << iface_name;
+ iface_to_wiphy_index_map_.erase(iter_wi);
+ if (hasNoIfaceForWiphyIndex(wiphy_index)) {
+ EraseBandWiphyIndexMap(wiphy_index);
+ } else {
+ LOG(INFO) << "Band info for wiphy_index " << wiphy_index << " retained";
+ }
+ }
+
return Status::ok();
}
+bool Server::hasNoIfaceForWiphyIndex(int wiphy_index) {
+ return std::find_if(
+ iface_to_wiphy_index_map_.begin(),
+ iface_to_wiphy_index_map_.end(),
+ [wiphy_index](const auto& kv) { return kv.second == wiphy_index; })
+ == iface_to_wiphy_index_map_.end();
+}
+
Status Server::createClientInterface(const std::string& iface_name,
sp<IClientInterface>* created_interface) {
InterfaceInfo interface;
- if (!SetupInterface(iface_name, &interface)) {
+ uint32_t wiphy_index;
+
+ if (!SetupInterface(iface_name, &interface, &wiphy_index)) {
return Status::ok(); // Logging was done internally
}
+ LOG(INFO) << "createClientInterface: wiphy_index " << wiphy_index << " iface_name " << iface_name;
+
unique_ptr<ClientInterfaceImpl> client_interface(new ClientInterfaceImpl(
- wiphy_index_,
+ wiphy_index,
interface.name,
- interface.index,
+ interface.if_index,
interface.mac_address,
if_tool_.get(),
netlink_utils_,
@@ -138,6 +203,12 @@ Status Server::createClientInterface(const std::string& iface_name,
*created_interface = client_interface->GetBinder();
BroadcastClientInterfaceReady(client_interface->GetBinder());
client_interfaces_[iface_name] = std::move(client_interface);
+ if (hasNoIfaceForWiphyIndex(wiphy_index)) {
+ UpdateBandWiphyIndexMap(wiphy_index);
+ } else {
+ LOG(INFO) << "Band info for wiphy_index " << wiphy_index << " already available";
+ }
+ iface_to_wiphy_index_map_[iface_name] = wiphy_index;
return Status::ok();
}
@@ -151,6 +222,19 @@ Status Server::tearDownClientInterface(const std::string& iface_name,
client_interfaces_.erase(iter);
*out_success = true;
}
+
+ const auto iter_wi = iface_to_wiphy_index_map_.find(iface_name);
+ if (iter_wi != iface_to_wiphy_index_map_.end()) {
+ int wiphy_index = iter_wi->second;
+ LOG(INFO) << "tearDownClientInterface: erasing wiphy_index for iface_name " << iface_name;
+ iface_to_wiphy_index_map_.erase(iter_wi);
+ if (hasNoIfaceForWiphyIndex(wiphy_index)) {
+ EraseBandWiphyIndexMap(wiphy_index);
+ } else {
+ LOG(INFO) << "Band info for wiphy_index " << wiphy_index << " retained";
+ }
+ }
+
return Status::ok();
}
@@ -167,7 +251,11 @@ Status Server::tearDownInterfaces() {
MarkDownAllInterfaces();
- netlink_utils_->UnsubscribeRegDomainChange(wiphy_index_);
+ for (auto& it : iface_to_wiphy_index_map_) {
+ netlink_utils_->UnsubscribeRegDomainChange(it.second);
+ EraseBandWiphyIndexMap(it.second);
+ }
+ iface_to_wiphy_index_map_.clear();
return Status::ok();
}
@@ -197,11 +285,11 @@ status_t Server::dump(int fd, const Vector<String16>& /*args*/) {
}
stringstream ss;
- ss << "Current wiphy index: " << wiphy_index_ << endl;
ss << "Cached interfaces list from kernel message: " << endl;
- for (const auto& iface : interfaces_) {
- ss << "Interface index: " << iface.index
+ for (const auto& iface : debug_interfaces_) {
+ ss << "Interface index: " << iface.if_index
<< ", name: " << iface.name
+ << ", wiphy index: " << iface.wiphy_index
<< ", mac address: "
<< LoggingUtils::GetMacString(iface.mac_address) << endl;
}
@@ -221,6 +309,11 @@ status_t Server::dump(int fd, const Vector<String16>& /*args*/) {
iface.second->Dump(&ss);
}
+ ss << "Channel Type / Wiphy Index Mapping:" << endl;
+ for (const auto& it : band_to_wiphy_index_map_) {
+ ss << "Channel type " << it.first << ": " << it.second << endl;
+ }
+
if (!WriteStringToFd(ss.str(), fd)) {
PLOG(ERROR) << "Failed to dump state to fd " << fd;
return FAILED_TRANSACTION;
@@ -230,96 +323,106 @@ status_t Server::dump(int fd, const Vector<String16>& /*args*/) {
}
void Server::MarkDownAllInterfaces() {
- uint32_t wiphy_index;
- vector<InterfaceInfo> interfaces;
- if (netlink_utils_->GetWiphyIndex(&wiphy_index) &&
- netlink_utils_->GetInterfaces(wiphy_index, &interfaces)) {
- for (InterfaceInfo& interface : interfaces) {
- if_tool_->SetUpState(interface.name.c_str(), false);
- }
+ std::string iface_name;
+
+ for (auto& it : iface_to_wiphy_index_map_) {
+ iface_name = it.first;
+ if_tool_->SetUpState(iface_name.c_str(), false);
}
}
Status Server::getAvailable2gChannels(
- std::unique_ptr<vector<int32_t>>* out_frequencies) {
+ std::optional<vector<int32_t>>* out_frequencies) {
+
+ int wiphy_index = GetWiphyIndexFromBand(NL80211_BAND_2GHZ);
BandInfo band_info;
- ScanCapabilities scan_capabilities_ignored;
- WiphyFeatures wiphy_features_ignored;
- if (!netlink_utils_->GetWiphyInfo(wiphy_index_, &band_info,
- &scan_capabilities_ignored,
- &wiphy_features_ignored)) {
- LOG(ERROR) << "Failed to get wiphy info from kernel";
- out_frequencies->reset(nullptr);
+ if (!GetBandInfo(wiphy_index, &band_info)) {
+ out_frequencies->reset();
return Status::ok();
}
- out_frequencies->reset(
- new vector<int32_t>(band_info.band_2g.begin(), band_info.band_2g.end()));
+ if (band_info.band_2g.size() == 0)
+ out_frequencies->reset();
+ else
+ out_frequencies->emplace(band_info.band_2g.begin(), band_info.band_2g.end());
return Status::ok();
}
Status Server::getAvailable5gNonDFSChannels(
- std::unique_ptr<vector<int32_t>>* out_frequencies) {
+ std::optional<vector<int32_t>>* out_frequencies) {
+ int wiphy_index = GetWiphyIndexFromBand(NL80211_BAND_5GHZ);
BandInfo band_info;
- ScanCapabilities scan_capabilities_ignored;
- WiphyFeatures wiphy_features_ignored;
-
- if (!netlink_utils_->GetWiphyInfo(wiphy_index_, &band_info,
- &scan_capabilities_ignored,
- &wiphy_features_ignored)) {
- LOG(ERROR) << "Failed to get wiphy info from kernel";
- out_frequencies->reset(nullptr);
+ if (!GetBandInfo(wiphy_index, &band_info)) {
+ out_frequencies->reset();
return Status::ok();
}
- out_frequencies->reset(
- new vector<int32_t>(band_info.band_5g.begin(), band_info.band_5g.end()));
+ if (band_info.band_5g.size() == 0)
+ out_frequencies->reset();
+ else
+ out_frequencies->emplace(band_info.band_5g.begin(), band_info.band_5g.end());
return Status::ok();
}
Status Server::getAvailableDFSChannels(
- std::unique_ptr<vector<int32_t>>* out_frequencies) {
+ std::optional<vector<int32_t>>* out_frequencies) {
+ int wiphy_index = GetWiphyIndexFromBand(NL80211_BAND_5GHZ);
BandInfo band_info;
- ScanCapabilities scan_capabilities_ignored;
- WiphyFeatures wiphy_features_ignored;
-
- if (!netlink_utils_->GetWiphyInfo(wiphy_index_, &band_info,
- &scan_capabilities_ignored,
- &wiphy_features_ignored)) {
- LOG(ERROR) << "Failed to get wiphy info from kernel";
- out_frequencies->reset(nullptr);
+ if (!GetBandInfo(wiphy_index, &band_info)) {
+ out_frequencies->reset();
return Status::ok();
}
- out_frequencies->reset(new vector<int32_t>(band_info.band_dfs.begin(),
- band_info.band_dfs.end()));
+ if (band_info.band_dfs.size() == 0)
+ out_frequencies->reset();
+ else
+ out_frequencies->emplace(band_info.band_dfs.begin(),
+ band_info.band_dfs.end());
return Status::ok();
}
Status Server::getAvailable6gChannels(
- std::unique_ptr<vector<int32_t>>* out_frequencies) {
+ std::optional<vector<int32_t>>* out_frequencies) {
+ int wiphy_index = GetWiphyIndexFromBand(NL80211_BAND_6GHZ);
BandInfo band_info;
- ScanCapabilities scan_capabilities_ignored;
- WiphyFeatures wiphy_features_ignored;
+ if (!GetBandInfo(wiphy_index, &band_info)) {
+ out_frequencies->reset();
+ return Status::ok();
+ }
- if (!netlink_utils_->GetWiphyInfo(wiphy_index_, &band_info,
- &scan_capabilities_ignored,
- &wiphy_features_ignored)) {
- LOG(ERROR) << "Failed to get wiphy info from kernel";
- out_frequencies->reset(nullptr);
+ if (band_info.band_6g.size() == 0)
+ out_frequencies->reset();
+ else
+ out_frequencies->emplace(band_info.band_6g.begin(), band_info.band_6g.end());
+ return Status::ok();
+}
+
+Status Server::getAvailable60gChannels(
+ std::optional<vector<int32_t>>* out_frequencies) {
+ int wiphy_index = GetWiphyIndexFromBand(NL80211_BAND_60GHZ);
+ BandInfo band_info;
+ if (!GetBandInfo(wiphy_index, &band_info)) {
+ out_frequencies->reset();
return Status::ok();
}
- out_frequencies->reset(
- new vector<int32_t>(band_info.band_6g.begin(), band_info.band_6g.end()));
+ if (band_info.band_60g.size() == 0)
+ out_frequencies->reset();
+ else
+ out_frequencies->emplace(
+ band_info.band_60g.begin(), band_info.band_60g.end());
+
return Status::ok();
}
Status Server::getDeviceWiphyCapabilities(
const std::string& iface_name,
- std::unique_ptr<DeviceWiphyCapabilities>* capabilities) {
- if (!RefreshWiphyIndex(iface_name)) {
+ std::optional<DeviceWiphyCapabilities>* capabilities) {
+ int wiphy_index = FindWiphyIndex(iface_name);
+
+ if (wiphy_index == -1) {
+ LOG(ERROR) << "Failed to find iface_name " << iface_name;
capabilities = nullptr;
return Status::ok();
}
@@ -328,7 +431,7 @@ Status Server::getDeviceWiphyCapabilities(
ScanCapabilities scan_capabilities_ignored;
WiphyFeatures wiphy_features_ignored;
- if (!netlink_utils_->GetWiphyInfo(wiphy_index_, &band_info,
+ if (!netlink_utils_->GetWiphyInfo(wiphy_index, &band_info,
&scan_capabilities_ignored,
&wiphy_features_ignored)) {
LOG(ERROR) << "Failed to get wiphy info from kernel";
@@ -336,38 +439,42 @@ Status Server::getDeviceWiphyCapabilities(
return Status::ok();
}
- capabilities->reset(new DeviceWiphyCapabilities());
+ capabilities->emplace();
- capabilities->get()->is80211nSupported_ = band_info.is_80211n_supported;
- capabilities->get()->is80211acSupported_ = band_info.is_80211ac_supported;
- capabilities->get()->is80211axSupported_ = band_info.is_80211ax_supported;
- capabilities->get()->is160MhzSupported_ = band_info.is_160_mhz_supported;
- capabilities->get()->is80p80MhzSupported_ = band_info.is_80p80_mhz_supported;
- capabilities->get()->maxTxStreams_ = band_info.max_tx_streams;
- capabilities->get()->maxRxStreams_ = band_info.max_rx_streams;
+ capabilities->value().is80211nSupported_ = band_info.is_80211n_supported;
+ capabilities->value().is80211acSupported_ = band_info.is_80211ac_supported;
+ capabilities->value().is80211axSupported_ = band_info.is_80211ax_supported;
+ capabilities->value().is160MhzSupported_ = band_info.is_160_mhz_supported;
+ capabilities->value().is80p80MhzSupported_ = band_info.is_80p80_mhz_supported;
+ capabilities->value().maxTxStreams_ = band_info.max_tx_streams;
+ capabilities->value().maxRxStreams_ = band_info.max_rx_streams;
return Status::ok();
}
bool Server::SetupInterface(const std::string& iface_name,
- InterfaceInfo* interface) {
- if (!RefreshWiphyIndex(iface_name)) {
+ InterfaceInfo* interface,
+ uint32_t *wiphy_index) {
+ if (!netlink_utils_->GetWiphyIndex(wiphy_index, iface_name)) {
+ LOG(ERROR) << "Failed to get wiphy index";
return false;
}
-
+ // TODO: It may need to handle multi-chips case to get multi-wiphy index and
+ // register corresponding callback.
netlink_utils_->SubscribeRegDomainChange(
- wiphy_index_,
- std::bind(&Server::OnRegDomainChanged,
- this,
- _1));
-
- interfaces_.clear();
- if (!netlink_utils_->GetInterfaces(wiphy_index_, &interfaces_)) {
- LOG(ERROR) << "Failed to get interfaces info from kernel";
+ *wiphy_index,
+ std::bind(&Server::OnRegDomainChanged,
+ this,
+ _1,
+ _2));
+
+ debug_interfaces_.clear();
+ if (!netlink_utils_->GetInterfaces(*wiphy_index, &debug_interfaces_)) {
+ LOG(ERROR) << "Failed to get interfaces info from kernel for iface_name " << iface_name << " wiphy_index " << *wiphy_index;
return false;
}
- for (const auto& iface : interfaces_) {
+ for (const auto& iface : debug_interfaces_) {
if (iface.name == iface_name) {
*interface = iface;
return true;
@@ -378,28 +485,22 @@ bool Server::SetupInterface(const std::string& iface_name,
return false;
}
-bool Server::RefreshWiphyIndex(const std::string& iface_name) {
- if (!netlink_utils_->GetWiphyIndex(&wiphy_index_, iface_name)) {
- LOG(ERROR) << "Failed to get wiphy index";
- return false;
- }
- return true;
-}
-
-void Server::OnRegDomainChanged(std::string& country_code) {
+void Server::OnRegDomainChanged(uint32_t wiphy_index, std::string& country_code) {
if (country_code.empty()) {
LOG(INFO) << "Regulatory domain changed";
} else {
- LOG(INFO) << "Regulatory domain changed to country: " << country_code;
+ LOG(INFO) << "Regulatory domain changed to country: " << country_code
+ << " on wiphy_index: " << wiphy_index;
+ BroadcastRegDomainChanged(country_code);
}
- LogSupportedBands();
+ LogSupportedBands(wiphy_index);
}
-void Server::LogSupportedBands() {
+void Server::LogSupportedBands(uint32_t wiphy_index) {
BandInfo band_info;
ScanCapabilities scan_capabilities;
WiphyFeatures wiphy_features;
- netlink_utils_->GetWiphyInfo(wiphy_index_,
+ netlink_utils_->GetWiphyInfo(wiphy_index,
&band_info,
&scan_capabilities,
&wiphy_features);
@@ -421,11 +522,18 @@ void Server::LogSupportedBands() {
ss << " " << band_info.band_dfs[i];
}
LOG(INFO) << "5Ghz DFS frequencies:"<< ss.str();
+ ss.str("");
for (unsigned int i = 0; i < band_info.band_6g.size(); i++) {
ss << " " << band_info.band_6g[i];
}
LOG(INFO) << "6Ghz frequencies:"<< ss.str();
+ ss.str("");
+
+ for (unsigned int i = 0; i < band_info.band_60g.size(); i++) {
+ ss << " " << band_info.band_60g[i];
+ }
+ LOG(INFO) << "60Ghz frequencies:"<< ss.str();
}
void Server::BroadcastClientInterfaceReady(
@@ -456,5 +564,104 @@ void Server::BroadcastApInterfaceTornDown(
}
}
+void Server::BroadcastRegDomainChanged(
+ std::string country_code) {
+ for (const auto& it : wificond_event_callbacks_) {
+ it->OnRegDomainChanged(country_code);
+ }
+}
+
+int Server::FindWiphyIndex(
+ const std::string& iface_name) {
+ int wiphy_index = -1;
+
+ for (auto& it : iface_to_wiphy_index_map_) {
+ if (it.first == iface_name) {
+ wiphy_index = it.second;
+ break;
+ }
+ }
+
+ return wiphy_index;
+}
+
+bool Server::GetBandInfo(
+ int wiphy_index,
+ BandInfo* band_info) {
+
+ if (wiphy_index == -1) return false;
+
+ ScanCapabilities scan_capabilities_ignored;
+ WiphyFeatures wiphy_features_ignored;
+
+ if (!netlink_utils_->GetWiphyInfo(wiphy_index, band_info,
+ &scan_capabilities_ignored,
+ &wiphy_features_ignored)) {
+ LOG(ERROR) << "Failed to get wiphy index " << wiphy_index << " info from kernel";
+ return false;
+ }
+
+ return true;
+}
+
+int Server::GetWiphyIndexFromBand(int band) {
+ auto iter = band_to_wiphy_index_map_.find(band);
+ return (iter != band_to_wiphy_index_map_.end()) ? iter->second : -1;
+}
+
+void Server::UpdateBandWiphyIndexMap(int wiphy_index) {
+ LOG(DEBUG) << "UpdateBandWiphyIndexMap for wiphy_index " << wiphy_index;
+ BandInfo band_info;
+ if (!GetBandInfo(wiphy_index, &band_info)) return;
+
+ if (band_info.band_2g.size() != 0
+ && band_to_wiphy_index_map_.find(NL80211_BAND_2GHZ) == band_to_wiphy_index_map_.end()) {
+ band_to_wiphy_index_map_[NL80211_BAND_2GHZ] = wiphy_index;
+ LOG(INFO) << "add channel type " << NL80211_BAND_2GHZ
+ << " support at wiphy index: " << wiphy_index;
+ }
+ if (band_info.band_5g.size() != 0
+ && band_to_wiphy_index_map_.find(NL80211_BAND_5GHZ) == band_to_wiphy_index_map_.end()) {
+ band_to_wiphy_index_map_[NL80211_BAND_5GHZ] = wiphy_index;
+ LOG(INFO) << "add channel type " << NL80211_BAND_5GHZ
+ << " support at wiphy index: " << wiphy_index;
+ }
+ if (band_info.band_dfs.size() != 0
+ && band_to_wiphy_index_map_.find(NL80211_BAND_5GHZ) == band_to_wiphy_index_map_.end()) {
+ band_to_wiphy_index_map_[NL80211_BAND_5GHZ] = wiphy_index;
+ LOG(INFO) << "add channel type " << NL80211_BAND_5GHZ
+ << " support at wiphy index: " << wiphy_index;
+ }
+ if (band_info.band_6g.size() != 0
+ && band_to_wiphy_index_map_.find(NL80211_BAND_6GHZ) == band_to_wiphy_index_map_.end()) {
+ band_to_wiphy_index_map_[NL80211_BAND_6GHZ] = wiphy_index;
+ LOG(INFO) << "add channel type " << NL80211_BAND_6GHZ
+ << " support at wiphy index: " << wiphy_index;
+ }
+ if (band_info.band_60g.size() != 0
+ && band_to_wiphy_index_map_.find(NL80211_BAND_60GHZ) == band_to_wiphy_index_map_.end()) {
+ band_to_wiphy_index_map_[NL80211_BAND_60GHZ] = wiphy_index;
+ LOG(INFO) << "add channel type " << NL80211_BAND_60GHZ
+ << " support at wiphy index: " << wiphy_index;
+ }
+}
+
+void Server::EraseBandWiphyIndexMap(int wiphy_index) {
+ LOG(DEBUG) << "EraseBandWiphyIndexMap for wiphy_index " << wiphy_index;
+ for (auto it = band_to_wiphy_index_map_.begin();
+ // end() is computed every iteration since erase() could invalidate it
+ it != band_to_wiphy_index_map_.end();
+ /* no increment */ ) {
+ if (it->second == wiphy_index) {
+ LOG(INFO) << "remove channel type " << it->first
+ << " support at wiphy index " << it->second;
+ // erase returns iterator to element following erased element, or end() if the last element
+ // was erased
+ it = band_to_wiphy_index_map_.erase(it);
+ } else {
+ ++it;
+ }
+ }
+}
} // namespace wificond
} // namespace android
diff --git a/server.h b/server.h
index 982bf12..1368c83 100644
--- a/server.h
+++ b/server.h
@@ -28,6 +28,7 @@
#include "android/net/wifi/nl80211/IApInterface.h"
#include "android/net/wifi/nl80211/IClientInterface.h"
#include "android/net/wifi/nl80211/IInterfaceEventCallback.h"
+#include "android/net/wifi/nl80211/IWificondEventCallback.h"
#include "wificond/ap_interface_impl.h"
#include "wificond/client_interface_impl.h"
@@ -48,6 +49,13 @@ class Server : public android::net::wifi::nl80211::BnWificond {
ScanUtils* scan_utils);
~Server() override = default;
+ android::binder::Status registerWificondEventCallback(
+ const android::sp<android::net::wifi::nl80211::IWificondEventCallback>&
+ callback) override;
+ android::binder::Status unregisterWificondEventCallback(
+ const android::sp<android::net::wifi::nl80211::IWificondEventCallback>&
+ callback) override;
+
android::binder::Status RegisterCallback(
const android::sp<android::net::wifi::nl80211::IInterfaceEventCallback>&
callback) override;
@@ -56,16 +64,19 @@ class Server : public android::net::wifi::nl80211::BnWificond {
callback) override;
// Returns a vector of available frequencies for 2.4GHz channels.
android::binder::Status getAvailable2gChannels(
- ::std::unique_ptr<::std::vector<int32_t>>* out_frequencies) override;
+ ::std::optional<::std::vector<int32_t>>* out_frequencies) override;
// Returns a vector of available frequencies for 5GHz non-DFS channels.
android::binder::Status getAvailable5gNonDFSChannels(
- ::std::unique_ptr<::std::vector<int32_t>>* out_frequencies) override;
+ ::std::optional<::std::vector<int32_t>>* out_frequencies) override;
// Returns a vector of available frequencies for DFS channels.
android::binder::Status getAvailableDFSChannels(
- ::std::unique_ptr<::std::vector<int32_t>>* out_frequencies) override;
+ ::std::optional<::std::vector<int32_t>>* out_frequencies) override;
// Returns a vector of available frequencies for 6GHz channels.
android::binder::Status getAvailable6gChannels(
- ::std::unique_ptr<::std::vector<int32_t>>* out_frequencies) override;
+ ::std::optional<::std::vector<int32_t>>* out_frequencies) override;
+ // Returns a vector of available frequencies for 60GHz channels.
+ android::binder::Status getAvailable60gChannels(
+ ::std::optional<::std::vector<int32_t>>* out_frequencies) override;
android::binder::Status createApInterface(
const std::string& iface_name,
@@ -96,7 +107,7 @@ class Server : public android::net::wifi::nl80211::BnWificond {
// Returns device wiphy capabilities for an interface
android::binder::Status getDeviceWiphyCapabilities(
const std::string& iface_name,
- ::std::unique_ptr<net::wifi::nl80211::DeviceWiphyCapabilities>* capabilities) override;
+ ::std::optional<net::wifi::nl80211::DeviceWiphyCapabilities>* capabilities) override;
private:
// Request interface information from kernel and setup local interface object.
@@ -104,10 +115,10 @@ class Server : public android::net::wifi::nl80211::BnWificond {
// interface on behalf of createApInterace(), it is Hostapd that configure
// the interface to Ap mode later.
// Returns true on success, false otherwise.
- bool SetupInterface(const std::string& iface_name, InterfaceInfo* interface);
- bool RefreshWiphyIndex(const std::string& iface_num);
- void LogSupportedBands();
- void OnRegDomainChanged(std::string& country_code);
+ bool SetupInterface(const std::string& iface_name, InterfaceInfo* interface,
+ uint32_t *wiphy_index);
+ void LogSupportedBands(uint32_t wiphy_index);
+ void OnRegDomainChanged(uint32_t wiphy_index, std::string& country_code);
void BroadcastClientInterfaceReady(
android::sp<android::net::wifi::nl80211::IClientInterface> network_interface);
void BroadcastApInterfaceReady(
@@ -116,20 +127,31 @@ class Server : public android::net::wifi::nl80211::BnWificond {
android::sp<android::net::wifi::nl80211::IClientInterface> network_interface);
void BroadcastApInterfaceTornDown(
android::sp<android::net::wifi::nl80211::IApInterface> network_interface);
+ void BroadcastRegDomainChanged(std::string country_code);
void MarkDownAllInterfaces();
+ int FindWiphyIndex(const std::string& iface_name);
+ bool GetBandInfo(int wiphy_index, BandInfo* band_info);
+ int GetWiphyIndexFromBand(int band);
+ void UpdateBandWiphyIndexMap(int wiphy_index);
+ void EraseBandWiphyIndexMap(int wiphy_index);
+ bool hasNoIfaceForWiphyIndex(int wiphy_index);
const std::unique_ptr<wifi_system::InterfaceTool> if_tool_;
NetlinkUtils* const netlink_utils_;
ScanUtils* const scan_utils_;
- uint32_t wiphy_index_;
+ // Chips serves mutually exclusive bands.
+ std::map<uint32_t, uint32_t> band_to_wiphy_index_map_;
+ std::map<std::string, uint32_t> iface_to_wiphy_index_map_;
std::map<std::string, std::unique_ptr<ApInterfaceImpl>> ap_interfaces_;
std::map<std::string, std::unique_ptr<ClientInterfaceImpl>> client_interfaces_;
std::vector<android::sp<android::net::wifi::nl80211::IInterfaceEventCallback>>
interface_event_callbacks_;
+ std::vector<android::sp<android::net::wifi::nl80211::IWificondEventCallback>>
+ wificond_event_callbacks_;
- // Cached interface list from kernel.
- std::vector<InterfaceInfo> interfaces_;
+ // Cached interface list from kernel for dumping.
+ std::vector<InterfaceInfo> debug_interfaces_;
DISALLOW_COPY_AND_ASSIGN(Server);
};
diff --git a/tests/mock_client_interface_impl.h b/tests/mock_client_interface_impl.h
index ea1f4cd..ffe5425 100644
--- a/tests/mock_client_interface_impl.h
+++ b/tests/mock_client_interface_impl.h
@@ -35,6 +35,8 @@ class MockClientInterfaceImpl : public ClientInterfaceImpl {
MOCK_CONST_METHOD0(IsAssociated, bool());
+ MOCK_CONST_METHOD0(GetBandInfo, BandInfo());
+
}; // class MockClientInterfaceImpl
} // namespace wificond
diff --git a/tests/mock_netlink_utils.h b/tests/mock_netlink_utils.h
index 708a385..71a15fd 100644
--- a/tests/mock_netlink_utils.h
+++ b/tests/mock_netlink_utils.h
@@ -60,6 +60,9 @@ class MockNetlinkUtils : public NetlinkUtils {
MOCK_METHOD2(GetInterfaces,
bool(uint32_t wiphy_index,
std::vector<InterfaceInfo>* interfaces));
+ MOCK_METHOD2(GetBandInfo,
+ bool(uint32_t wiphy_index,
+ std::vector<InterfaceInfo>* interfaces));
MOCK_METHOD4(GetWiphyInfo,
bool(uint32_t wiphy_index,
BandInfo* band_info,
diff --git a/tests/mock_scan_utils.h b/tests/mock_scan_utils.h
index acb7f45..3f43bb2 100644
--- a/tests/mock_scan_utils.h
+++ b/tests/mock_scan_utils.h
@@ -41,10 +41,11 @@ class MockScanUtils : public ScanUtils {
uint32_t interface_index,
std::vector<android::net::wifi::nl80211::NativeScanResult>* out_scan_results));
- MOCK_METHOD6(Scan, bool(
+ MOCK_METHOD7(Scan, bool(
uint32_t interface_index,
bool request_random_mac,
int scan_type,
+ bool enable_6ghz_rnr,
const std::vector<std::vector<uint8_t>>& ssids,
const std::vector<uint32_t>& freqs,
int* error_code));
diff --git a/tests/netlink_utils_unittest.cpp b/tests/netlink_utils_unittest.cpp
index 986f3b2..1b27cc8 100644
--- a/tests/netlink_utils_unittest.cpp
+++ b/tests/netlink_utils_unittest.cpp
@@ -457,7 +457,8 @@ TEST_F(NetlinkUtilsTest, CanGetInterfaces) {
vector<InterfaceInfo> interfaces;
EXPECT_TRUE(netlink_utils_->GetInterfaces(kFakeWiphyIndex, &interfaces));
EXPECT_TRUE(interfaces.size() == 1);
- EXPECT_EQ(kFakeInterfaceIndex, interfaces[0].index);
+ EXPECT_EQ(kFakeInterfaceIndex, interfaces[0].if_index);
+ EXPECT_EQ(kFakeWiphyIndex, interfaces[0].wiphy_index);
EXPECT_EQ(string(kFakeInterfaceName), interfaces[0].name);
EXPECT_EQ(if_mac_addr, interfaces[0].mac_address);
}
@@ -496,7 +497,8 @@ TEST_F(NetlinkUtilsTest, SkipsPseudoDevicesWhenGetInterfaces) {
vector<InterfaceInfo> interfaces;
EXPECT_TRUE(netlink_utils_->GetInterfaces(kFakeWiphyIndex, &interfaces));
EXPECT_TRUE(interfaces.size() == 1);
- EXPECT_EQ(kFakeInterfaceIndex, interfaces[0].index);
+ EXPECT_EQ(kFakeInterfaceIndex, interfaces[0].if_index);
+ EXPECT_EQ(kFakeWiphyIndex, interfaces[0].wiphy_index);
EXPECT_EQ(string(kFakeInterfaceName), interfaces[0].name);
EXPECT_EQ(if_mac_addr, interfaces[0].mac_address);
}
@@ -546,11 +548,13 @@ TEST_F(NetlinkUtilsTest, HandleP2p0WhenGetInterfaces) {
EXPECT_TRUE(netlink_utils_->GetInterfaces(kFakeWiphyIndex, &interfaces));
EXPECT_TRUE(interfaces.size() == 2);
- EXPECT_EQ(kFakeInterfaceIndex1, interfaces[0].index);
+ EXPECT_EQ(kFakeInterfaceIndex1, interfaces[0].if_index);
+ EXPECT_EQ(kFakeWiphyIndex, interfaces[0].wiphy_index);
EXPECT_EQ(string("p2p0"), interfaces[0].name);
EXPECT_EQ(if_mac_addr_p2p, interfaces[0].mac_address);
- EXPECT_EQ(kFakeInterfaceIndex, interfaces[1].index);
+ EXPECT_EQ(kFakeInterfaceIndex, interfaces[1].if_index);
+ EXPECT_EQ(kFakeWiphyIndex, interfaces[1].wiphy_index);
EXPECT_EQ(string(kFakeInterfaceName), interfaces[1].name);
EXPECT_EQ(if_mac_addr, interfaces[1].mac_address);
}
diff --git a/tests/scan_utils_unittest.cpp b/tests/scan_utils_unittest.cpp
index 051d7c0..d2f3631 100644
--- a/tests/scan_utils_unittest.cpp
+++ b/tests/scan_utils_unittest.cpp
@@ -155,7 +155,7 @@ TEST_F(ScanUtilsTest, CanSendScanRequest) {
AppendMessageAndReturn, response, true, _1, _2)));
int errno_ignored;
EXPECT_TRUE(scan_utils_.Scan(kFakeInterfaceIndex, kFakeUseRandomMAC,
- kFakeScanType, {}, {}, &errno_ignored));
+ kFakeScanType, false, {}, {}, &errno_ignored));
// TODO(b/34231420): Add validation of requested scan ssids, threshold,
// and frequencies.
}
@@ -175,7 +175,7 @@ TEST_F(ScanUtilsTest, CanSendScanRequestWithRandomAddr) {
int errno_ignored;
EXPECT_TRUE(scan_utils_.Scan(kFakeInterfaceIndex, true,
IWifiScannerImpl::SCAN_TYPE_DEFAULT,
- {}, {}, &errno_ignored));
+ false, {}, {}, &errno_ignored));
}
TEST_F(ScanUtilsTest, CanSendScanRequestForLowSpanScan) {
@@ -186,14 +186,16 @@ TEST_F(ScanUtilsTest, CanSendScanRequestForLowSpanScan) {
AllOf(
DoesNL80211PacketMatchCommand(NL80211_CMD_TRIGGER_SCAN),
DoesNL80211PacketHaveAttributeWithUint32Value(
- NL80211_ATTR_SCAN_FLAGS, NL80211_SCAN_FLAG_LOW_SPAN)),
+ NL80211_ATTR_SCAN_FLAGS,
+ static_cast<uint32_t>(NL80211_SCAN_FLAG_LOW_SPAN |
+ NL80211_SCAN_FLAG_COLOCATED_6GHZ))),
_)).
WillOnce(Invoke(bind(AppendMessageAndReturn, response, true, _1, _2)));
int errno_ignored;
EXPECT_TRUE(scan_utils_.Scan(kFakeInterfaceIndex, false,
IWifiScannerImpl::SCAN_TYPE_LOW_SPAN,
- {}, {}, &errno_ignored));
+ true, {}, {}, &errno_ignored));
}
TEST_F(ScanUtilsTest, CanSendScanRequestForLowPowerScan) {
@@ -211,7 +213,7 @@ TEST_F(ScanUtilsTest, CanSendScanRequestForLowPowerScan) {
int errno_ignored;
EXPECT_TRUE(scan_utils_.Scan(kFakeInterfaceIndex, false,
IWifiScannerImpl::SCAN_TYPE_LOW_POWER,
- {}, {}, &errno_ignored));
+ false, {}, {}, &errno_ignored));
}
TEST_F(ScanUtilsTest, CanSendScanRequestForHighAccuracyScan) {
@@ -229,7 +231,7 @@ TEST_F(ScanUtilsTest, CanSendScanRequestForHighAccuracyScan) {
int errno_ignored;
EXPECT_TRUE(scan_utils_.Scan(kFakeInterfaceIndex, false,
IWifiScannerImpl::SCAN_TYPE_HIGH_ACCURACY,
- {}, {}, &errno_ignored));
+ false, {}, {}, &errno_ignored));
}
TEST_F(ScanUtilsTest, CanSendScanRequestForHighAccuracyScanWithRandomAddr) {
@@ -249,7 +251,7 @@ TEST_F(ScanUtilsTest, CanSendScanRequestForHighAccuracyScanWithRandomAddr) {
int errno_ignored;
EXPECT_TRUE(scan_utils_.Scan(kFakeInterfaceIndex, true,
IWifiScannerImpl::SCAN_TYPE_HIGH_ACCURACY,
- {}, {}, &errno_ignored));
+ false, {}, {}, &errno_ignored));
}
TEST_F(ScanUtilsTest, CanHandleScanRequestFailure) {
@@ -262,7 +264,7 @@ TEST_F(ScanUtilsTest, CanHandleScanRequestFailure) {
AppendMessageAndReturn, response, true, _1, _2)));
int error_code;
EXPECT_FALSE(scan_utils_.Scan(kFakeInterfaceIndex, kFakeUseRandomMAC,
- kFakeScanType, {}, {}, &error_code));
+ kFakeScanType, false, {}, {}, &error_code));
EXPECT_EQ(kFakeErrorCode, error_code);
}
diff --git a/tests/scanner_unittest.cpp b/tests/scanner_unittest.cpp
index 990dcb2..dde640e 100644
--- a/tests/scanner_unittest.cpp
+++ b/tests/scanner_unittest.cpp
@@ -62,6 +62,7 @@ bool ReturnErrorCodeForScanRequest(
uint32_t interface_index_ignored,
bool request_random_mac_ignored,
int scan_type,
+ bool enable_6ghz_rnr,
const std::vector<std::vector<uint8_t>>& ssids_ignored,
const std::vector<uint32_t>& freqs_ignored,
int* error_code) {
@@ -118,7 +119,7 @@ class ScannerTest : public ::testing::Test {
TEST_F(ScannerTest, TestSingleScan) {
EXPECT_CALL(scan_utils_,
- Scan(_, _, IWifiScannerImpl::SCAN_TYPE_DEFAULT, _, _, _)).
+ Scan(_, _, IWifiScannerImpl::SCAN_TYPE_DEFAULT, false, _, _, _)).
WillOnce(Return(true));
bool success = false;
scanner_impl_.reset(new ScannerImpl(kFakeInterfaceIndex,
@@ -131,7 +132,7 @@ TEST_F(ScannerTest, TestSingleScan) {
TEST_F(ScannerTest, TestSingleScanForLowSpanScan) {
EXPECT_CALL(scan_utils_,
- Scan(_, _, IWifiScannerImpl::SCAN_TYPE_LOW_SPAN, _, _, _)).
+ Scan(_, _, IWifiScannerImpl::SCAN_TYPE_LOW_SPAN, true, _, _, _)).
WillOnce(Return(true));
wiphy_features_.supports_low_span_oneshot_scan = true;
ScannerImpl scanner_impl(kFakeInterfaceIndex, scan_capabilities_,
@@ -139,6 +140,7 @@ TEST_F(ScannerTest, TestSingleScanForLowSpanScan) {
&scan_utils_);
SingleScanSettings settings;
settings.scan_type_ = IWifiScannerImpl::SCAN_TYPE_LOW_SPAN;
+ settings.enable_6ghz_rnr_ = true;
bool success = false;
EXPECT_TRUE(scanner_impl.scan(settings, &success).isOk());
EXPECT_TRUE(success);
@@ -146,7 +148,7 @@ TEST_F(ScannerTest, TestSingleScanForLowSpanScan) {
TEST_F(ScannerTest, TestSingleScanForLowPowerScan) {
EXPECT_CALL(scan_utils_,
- Scan(_, _, IWifiScannerImpl::SCAN_TYPE_LOW_POWER, _, _, _)).
+ Scan(_, _, IWifiScannerImpl::SCAN_TYPE_LOW_POWER, _, _, _, _)).
WillOnce(Return(true));
wiphy_features_.supports_low_power_oneshot_scan = true;
ScannerImpl scanner_impl(kFakeInterfaceIndex, scan_capabilities_,
@@ -161,7 +163,7 @@ TEST_F(ScannerTest, TestSingleScanForLowPowerScan) {
TEST_F(ScannerTest, TestSingleScanForHighAccuracyScan) {
EXPECT_CALL(scan_utils_,
- Scan(_, _, IWifiScannerImpl::SCAN_TYPE_HIGH_ACCURACY, _, _, _)).
+ Scan(_, _, IWifiScannerImpl::SCAN_TYPE_HIGH_ACCURACY, _, _, _, _)).
WillOnce(Return(true));
wiphy_features_.supports_high_accuracy_oneshot_scan = true;
ScannerImpl scanner_impl(kFakeInterfaceIndex, scan_capabilities_,
@@ -176,7 +178,7 @@ TEST_F(ScannerTest, TestSingleScanForHighAccuracyScan) {
TEST_F(ScannerTest, TestSingleScanForLowSpanScanWithNoWiphySupport) {
EXPECT_CALL(scan_utils_,
- Scan(_, _, IWifiScannerImpl::SCAN_TYPE_DEFAULT, _, _, _)).
+ Scan(_, _, IWifiScannerImpl::SCAN_TYPE_DEFAULT, _, _, _, _)).
WillOnce(Return(true));
ScannerImpl scanner_impl(kFakeInterfaceIndex, scan_capabilities_,
wiphy_features_, &client_interface_impl_,
@@ -190,7 +192,7 @@ TEST_F(ScannerTest, TestSingleScanForLowSpanScanWithNoWiphySupport) {
TEST_F(ScannerTest, TestSingleScanForLowPowerScanWithNoWiphySupport) {
EXPECT_CALL(scan_utils_,
- Scan(_, _, IWifiScannerImpl::SCAN_TYPE_DEFAULT, _, _, _)).
+ Scan(_, _, IWifiScannerImpl::SCAN_TYPE_DEFAULT, _, _, _, _)).
WillOnce(Return(true));
ScannerImpl scanner_impl(kFakeInterfaceIndex, scan_capabilities_,
wiphy_features_, &client_interface_impl_,
@@ -204,7 +206,7 @@ TEST_F(ScannerTest, TestSingleScanForLowPowerScanWithNoWiphySupport) {
TEST_F(ScannerTest, TestSingleScanForHighAccuracyScanWithNoWiphySupport) {
EXPECT_CALL(scan_utils_,
- Scan(_, _, IWifiScannerImpl::SCAN_TYPE_DEFAULT, _, _, _)).
+ Scan(_, _, IWifiScannerImpl::SCAN_TYPE_DEFAULT, _, _, _, _)).
WillOnce(Return(true));
ScannerImpl scanner_impl(kFakeInterfaceIndex, scan_capabilities_,
wiphy_features_, &client_interface_impl_,
@@ -223,10 +225,10 @@ TEST_F(ScannerTest, TestSingleScanFailure) {
&scan_utils_));
EXPECT_CALL(
scan_utils_,
- Scan(_, _, _, _, _, _)).
+ Scan(_, _, _, _, _, _, _)).
WillOnce(Invoke(bind(
ReturnErrorCodeForScanRequest, EBUSY,
- _1, _2, _3, _4, _5, _6)));
+ _1, _2, _3, _4, _5, _6, _7)));
bool success = false;
EXPECT_TRUE(scanner_impl_->scan(SingleScanSettings(), &success).isOk());
@@ -240,10 +242,10 @@ TEST_F(ScannerTest, TestProcessAbortsOnScanReturningNoDeviceErrorSeveralTimes) {
&scan_utils_));
ON_CALL(
scan_utils_,
- Scan(_, _, _, _, _, _)).
+ Scan(_, _, _, _, _, _, _)).
WillByDefault(Invoke(bind(
ReturnErrorCodeForScanRequest, ENODEV,
- _1, _2, _3, _4, _5, _6)));
+ _1, _2, _3, _4, _5, _6, _7)));
bool single_scan_failure;
EXPECT_TRUE(scanner_impl_->scan(SingleScanSettings(), &single_scan_failure).isOk());
@@ -262,8 +264,7 @@ TEST_F(ScannerTest, TestAbortScan) {
scan_capabilities_, wiphy_features_,
&client_interface_impl_,
&scan_utils_));
- EXPECT_CALL(scan_utils_, Scan(_, _, _, _, _, _))
- .WillOnce(Return(true));
+ EXPECT_CALL(scan_utils_, Scan(_, _, _, _, _, _, _)).WillOnce(Return(true));
EXPECT_TRUE(
scanner_impl_->scan(SingleScanSettings(), &single_scan_success).isOk());
EXPECT_TRUE(single_scan_success);
@@ -509,9 +510,17 @@ TEST_F(ScannerTest, TestStartPnoScanWithFrequencyListFallbackMechanism) {
pno_settings.pno_networks_.push_back(network2);
std::set<int32_t> default_frequencies = {2412, 2417, 2422, 2427, 2432, 2437, 2447, 2452, 2457,
- 2462, 5180, 5200, 5220, 5240, 5745, 5765, 5785, 5805};
+ 2462, 5180, 5200, 5220, 5240, 5745, 5765, 5785, 5805};
default_frequencies.insert(5640); // add frequency from saved network
vector<uint32_t> expected_frequencies(default_frequencies.begin(), default_frequencies.end());
+
+ // Mock BandInfo to make sure the default_frequencies don't get filtered out as invalid.
+ BandInfo band_info;
+ int default_2g[] = {2412, 2417, 2422, 2427, 2432, 2437, 2447, 2452, 2457, 2462};
+ int default_5g[] = {5180, 5200, 5220, 5240, 5745, 5765, 5785, 5805};
+ copy(std::begin(default_2g), std::end(default_2g), std::begin(band_info.band_2g));
+ copy(std::begin(default_5g), std::end(default_5g), std::begin(band_info.band_5g));
+ EXPECT_CALL(client_interface_impl_, GetBandInfo()).WillOnce(Return(band_info));
EXPECT_CALL(
scan_utils_,
StartScheduledScan(_, _, _, _, _, _, _, _, Eq(expected_frequencies), _)).
diff --git a/tests/server_unittest.cpp b/tests/server_unittest.cpp
index 68f1429..9239397 100644
--- a/tests/server_unittest.cpp
+++ b/tests/server_unittest.cpp
@@ -54,6 +54,7 @@ const char kFateInterfaceNameInvalid[] = "testif-invalid";
const uint32_t kFakeInterfaceIndex = 34;
const uint32_t kFakeInterfaceIndex1 = 36;
const uint32_t kFakeInterfaceIndexP2p = 36;
+const uint32_t kFakeWiphyIndex = 0;
const std::array<uint8_t, ETH_ALEN> kFakeInterfaceMacAddress = {0x45, 0x54, 0xad, 0x67, 0x98, 0xf6};
const std::array<uint8_t, ETH_ALEN> kFakeInterfaceMacAddress1 = {0x05, 0x04, 0xef, 0x27, 0x12, 0xff};
const std::array<uint8_t, ETH_ALEN> kFakeInterfaceMacAddressP2p = {0x15, 0x24, 0xef, 0x27, 0x12, 0xff};
@@ -84,6 +85,24 @@ class ServerTest : public ::testing::Test {
ON_CALL(*netlink_utils_, GetInterfaces(_, _))
.WillByDefault(Invoke(bind(
MockGetInterfacesResponse, mock_interfaces, true, _1, _2)));
+ ON_CALL(*netlink_utils_, GetWiphyInfo(0, _, _, _))
+ .WillByDefault([](
+ uint32_t wiphy_index,
+ BandInfo* band_info,
+ ScanCapabilities* scan_capabilities,
+ WiphyFeatures* wiphy_features) {
+ band_info->band_2g = {1, 2, 3, 4, 5};
+ return true;
+ });
+ ON_CALL(*netlink_utils_, GetWiphyInfo(1, _, _, _))
+ .WillByDefault([](
+ uint32_t wiphy_index,
+ BandInfo* band_info,
+ ScanCapabilities* scan_capabilities,
+ WiphyFeatures* wiphy_features) {
+ band_info->band_60g = {6, 7, 8, 9, 10};
+ return true;
+ });
}
NiceMock<MockInterfaceTool>* if_tool_ = new NiceMock<MockInterfaceTool>;
@@ -99,16 +118,19 @@ class ServerTest : public ::testing::Test {
// Client interface
InterfaceInfo(
kFakeInterfaceIndex,
+ kFakeWiphyIndex,
std::string(kFakeInterfaceName),
std::array<uint8_t, ETH_ALEN>(kFakeInterfaceMacAddress)),
// AP Interface
InterfaceInfo(
kFakeInterfaceIndex1,
+ kFakeWiphyIndex,
std::string(kFakeInterfaceName1),
std::array<uint8_t, ETH_ALEN>(kFakeInterfaceMacAddress1)),
// p2p interface
InterfaceInfo(
kFakeInterfaceIndexP2p,
+ kFakeWiphyIndex,
std::string(kFakeInterfaceNameP2p),
std::array<uint8_t, ETH_ALEN>(kFakeInterfaceMacAddressP2p))
};
@@ -187,6 +209,185 @@ TEST_F(ServerTest, CanTeardownClientInterface) {
EXPECT_TRUE(success);
}
+TEST_F(ServerTest, CanTeardownMultipleClientInterfacesOnSameWiphy) {
+ sp<IClientInterface> client_if;
+
+ // add iface 0 on wiphy 0
+ ON_CALL(*netlink_utils_, GetWiphyIndex(_, _)).WillByDefault(
+ [](uint32_t* out_wiphy_index, const std::string& iface_name) {
+ *out_wiphy_index = 0;
+ return true;
+ });
+
+ EXPECT_TRUE(server_.createClientInterface(
+ kFakeInterfaceName, &client_if).isOk());
+ EXPECT_NE(nullptr, client_if.get());
+
+ // bands non-empty
+ {
+ std::optional<std::vector<int32_t>> out_frequencies;
+ EXPECT_TRUE(server_.getAvailable2gChannels(&out_frequencies).isOk());
+ EXPECT_TRUE(out_frequencies.has_value());
+ EXPECT_FALSE(out_frequencies->empty());
+ }
+
+ sp<IClientInterface> client_if1;
+
+ // add iface 1 on wiphy 0
+ ON_CALL(*netlink_utils_, GetWiphyIndex(_, _)).WillByDefault(
+ [](uint32_t* out_wiphy_index, const std::string& iface_name) {
+ *out_wiphy_index = 0;
+ return true;
+ });
+
+ EXPECT_TRUE(server_.createClientInterface(
+ kFakeInterfaceName1, &client_if1).isOk());
+ EXPECT_NE(nullptr, client_if1.get());
+
+ // bands still non-empty
+ {
+ std::optional<std::vector<int32_t>> out_frequencies;
+ EXPECT_TRUE(server_.getAvailable2gChannels(&out_frequencies).isOk());
+ EXPECT_TRUE(out_frequencies.has_value());
+ EXPECT_FALSE(out_frequencies->empty());
+ }
+
+ // tear down iface 0
+ {
+ bool success = true;
+ EXPECT_TRUE(server_.tearDownClientInterface(
+ kFakeInterfaceName, &success).isOk());
+ EXPECT_TRUE(success);
+ }
+
+ // bands still non-empty
+ {
+ std::optional<std::vector<int32_t>> out_frequencies;
+ EXPECT_TRUE(server_.getAvailable2gChannels(&out_frequencies).isOk());
+ EXPECT_TRUE(out_frequencies.has_value());
+ EXPECT_FALSE(out_frequencies->empty());
+ }
+
+ // tear down iface 1
+ {
+ bool success = true;
+ EXPECT_TRUE(server_.tearDownClientInterface(
+ kFakeInterfaceName1, &success).isOk());
+ EXPECT_TRUE(success);
+ }
+
+ // bands now empty
+ {
+ std::optional<std::vector<int32_t>> out_frequencies;
+ EXPECT_TRUE(server_.getAvailable2gChannels(&out_frequencies).isOk());
+ EXPECT_FALSE(out_frequencies.has_value());
+ }
+}
+
+TEST_F(ServerTest, CanTeardownMultipleClientInterfacesOnDifferentWiphy) {
+ sp<IClientInterface> client_if;
+
+ // add iface 0 on wiphy 0, supports 2GHz
+ ON_CALL(*netlink_utils_, GetWiphyIndex(_, _)).WillByDefault(
+ [](uint32_t* out_wiphy_index, const std::string& iface_name) {
+ *out_wiphy_index = 0;
+ return true;
+ });
+
+ EXPECT_TRUE(server_.createClientInterface(
+ kFakeInterfaceName, &client_if).isOk());
+ EXPECT_NE(nullptr, client_if.get());
+
+ // 2G bands non-empty
+ {
+ std::optional<std::vector<int32_t>> out_frequencies;
+ EXPECT_TRUE(server_.getAvailable2gChannels(&out_frequencies).isOk());
+ EXPECT_TRUE(out_frequencies.has_value());
+ EXPECT_FALSE(out_frequencies->empty());
+ }
+
+ // 60G bands empty
+ {
+ std::optional<std::vector<int32_t>> out_frequencies;
+ EXPECT_TRUE(server_.getAvailable60gChannels(&out_frequencies).isOk());
+ EXPECT_FALSE(out_frequencies.has_value());
+ }
+
+ sp<IClientInterface> client_if1;
+
+ // add iface 1 on wiphy 1, supports 60GHz
+ ON_CALL(*netlink_utils_, GetWiphyIndex(_, _)).WillByDefault(
+ [](uint32_t* out_wiphy_index, const std::string& iface_name) {
+ *out_wiphy_index = 1;
+ return true;
+ });
+
+ EXPECT_TRUE(server_.createClientInterface(
+ kFakeInterfaceName1, &client_if1).isOk());
+ EXPECT_NE(nullptr, client_if1.get());
+
+ // 2G bands still non-empty
+ {
+ std::optional<std::vector<int32_t>> out_frequencies;
+ EXPECT_TRUE(server_.getAvailable2gChannels(&out_frequencies).isOk());
+ EXPECT_TRUE(out_frequencies.has_value());
+ EXPECT_FALSE(out_frequencies->empty());
+ }
+
+ // 60G bands non-empty
+ {
+ std::optional<std::vector<int32_t>> out_frequencies;
+ EXPECT_TRUE(server_.getAvailable60gChannels(&out_frequencies).isOk());
+ EXPECT_TRUE(out_frequencies.has_value());
+ EXPECT_FALSE(out_frequencies->empty());
+ }
+
+ // tear down iface 0
+ {
+ bool success = true;
+ EXPECT_TRUE(server_.tearDownClientInterface(
+ kFakeInterfaceName, &success).isOk());
+ EXPECT_TRUE(success);
+ }
+
+ // 2G bands now empty
+ {
+ std::optional<std::vector<int32_t>> out_frequencies;
+ EXPECT_TRUE(server_.getAvailable2gChannels(&out_frequencies).isOk());
+ EXPECT_FALSE(out_frequencies.has_value());
+ }
+
+ // 60G bands still non-empty
+ {
+ std::optional<std::vector<int32_t>> out_frequencies;
+ EXPECT_TRUE(server_.getAvailable60gChannels(&out_frequencies).isOk());
+ EXPECT_TRUE(out_frequencies.has_value());
+ EXPECT_FALSE(out_frequencies->empty());
+ }
+
+ // tear down iface 1
+ {
+ bool success = true;
+ EXPECT_TRUE(server_.tearDownClientInterface(
+ kFakeInterfaceName1, &success).isOk());
+ EXPECT_TRUE(success);
+ }
+
+ // 2G bands still empty
+ {
+ std::optional<std::vector<int32_t>> out_frequencies;
+ EXPECT_TRUE(server_.getAvailable2gChannels(&out_frequencies).isOk());
+ EXPECT_FALSE(out_frequencies.has_value());
+ }
+
+ // 60G bands now empty
+ {
+ std::optional<std::vector<int32_t>> out_frequencies;
+ EXPECT_TRUE(server_.getAvailable60gChannels(&out_frequencies).isOk());
+ EXPECT_FALSE(out_frequencies.has_value());
+ }
+}
+
TEST_F(ServerTest, CanCreateTeardownApAndClientInterface) {
sp<IClientInterface> client_if;
sp<IApInterface> ap_if;
@@ -229,7 +430,6 @@ TEST_F(ServerTest, CanDestroyApAndClientInterfaces) {
// When we tear down the interfaces, we expect the iface to be unloaded.
EXPECT_CALL(*if_tool_, SetUpState(StrEq(kFakeInterfaceName), Eq(false))).Times(2);
EXPECT_CALL(*if_tool_, SetUpState(StrEq(kFakeInterfaceName1), Eq(false))).Times(2);
- EXPECT_CALL(*if_tool_, SetUpState(StrEq(kFakeInterfaceNameP2p), Eq(false)));
EXPECT_TRUE(server_.tearDownInterfaces().isOk());
}