mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-16 04:21:09 -04:00
Merge tag 'wireless-next-2026-03-04' of https://git.kernel.org/pub/scm/linux/kernel/git/wireless/wireless-next
Johannes Berg says:
====================
Notable features this time:
- cfg80211/mac80211
- finished assoc frame encryption/EPPKE/802.1X-over-auth
(also hwsim)
- radar detection improvements
- 6 GHz incumbent signal detection APIs
- multi-link support for FILS, probe response
templates and client probling
- ath12k:
- monitor mode support on IPQ5332
- basic hwmon temperature reporting
* tag 'wireless-next-2026-03-04' of https://git.kernel.org/pub/scm/linux/kernel/git/wireless/wireless-next: (38 commits)
wifi: UHR: define DPS/DBE/P-EDCA elements and fix size parsing
wifi: mac80211_hwsim: change hwsim_class to a const struct
wifi: mac80211: give the AP more time for EPPKE as well
wifi: ath12k: Remove the unused argument from the Rx data path
wifi: ath12k: Enable monitor mode support on IPQ5332
wifi: ath12k: Set up MLO after SSR
wifi: ath11k: Silence remoteproc probe deferral prints
wifi: cfg80211: support key installation on non-netdev wdevs
wifi: cfg80211: make cluster id an array
wifi: mac80211: update outdated comment
wifi: mac80211: Advertise IEEE 802.1X authentication support
wifi: mac80211: Add support for IEEE 802.1X authentication protocol in non-AP STA mode
wifi: cfg80211: add support for IEEE 802.1X Authentication Protocol
wifi: mac80211: Advertise EPPKE support based on driver capabilities
wifi: mac80211_hwsim: Advertise support for (Re)Association frame encryption
wifi: mac80211: Fix AAD/Nonce computation for management frames with MLO
wifi: rt2x00: use generic nvmem_cell_get
wifi: mac80211: fetch unsolicited probe response template by link ID
wifi: mac80211: fetch FILS discovery template by link ID
wifi: nl80211: don't allow DFS channels for NAN
...
====================
Link: https://patch.msgid.link/20260304113707.175181-3-johannes@sipsolutions.net
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
@@ -807,10 +807,8 @@ static int ath11k_core_get_rproc(struct ath11k_base *ab)
|
||||
}
|
||||
|
||||
prproc = rproc_get_by_phandle(rproc_phandle);
|
||||
if (!prproc) {
|
||||
ath11k_dbg(ab, ATH11K_DBG_AHB, "failed to get rproc, deferring\n");
|
||||
return -EPROBE_DEFER;
|
||||
}
|
||||
if (!prproc)
|
||||
return dev_err_probe(&ab->pdev->dev, -EPROBE_DEFER, "failed to get rproc\n");
|
||||
ab_ahb->tgt_rproc = prproc;
|
||||
|
||||
return 0;
|
||||
@@ -1190,10 +1188,8 @@ static int ath11k_ahb_probe(struct platform_device *pdev)
|
||||
ath11k_ahb_init_qmi_ce_config(ab);
|
||||
|
||||
ret = ath11k_core_get_rproc(ab);
|
||||
if (ret) {
|
||||
ath11k_err(ab, "failed to get rproc: %d\n", ret);
|
||||
if (ret)
|
||||
goto err_ce_free;
|
||||
}
|
||||
|
||||
ret = ath11k_core_init(ab);
|
||||
if (ret) {
|
||||
|
||||
@@ -1557,12 +1557,15 @@ static int ath11k_mac_setup_bcn_tmpl_ema(struct ath11k_vif *arvif,
|
||||
if (!beacons || !beacons->cnt) {
|
||||
ath11k_warn(arvif->ar->ab,
|
||||
"failed to get ema beacon templates from mac80211\n");
|
||||
return -EPERM;
|
||||
ret = -EPERM;
|
||||
goto free;
|
||||
}
|
||||
|
||||
if (tx_arvif == arvif) {
|
||||
if (ath11k_mac_set_vif_params(tx_arvif, beacons->bcn[0].skb))
|
||||
return -EINVAL;
|
||||
if (ath11k_mac_set_vif_params(tx_arvif, beacons->bcn[0].skb)) {
|
||||
ret = -EINVAL;
|
||||
goto free;
|
||||
}
|
||||
} else {
|
||||
arvif->wpaie_present = tx_arvif->wpaie_present;
|
||||
}
|
||||
@@ -1589,11 +1592,11 @@ static int ath11k_mac_setup_bcn_tmpl_ema(struct ath11k_vif *arvif,
|
||||
}
|
||||
}
|
||||
|
||||
ieee80211_beacon_free_ema_list(beacons);
|
||||
|
||||
if (tx_arvif != arvif && !nontx_vif_params_set)
|
||||
return -EINVAL; /* Profile not found in the beacons */
|
||||
ret = -EINVAL; /* Profile not found in the beacons */
|
||||
|
||||
free:
|
||||
ieee80211_beacon_free_ema_list(beacons);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -1622,19 +1625,22 @@ static int ath11k_mac_setup_bcn_tmpl_mbssid(struct ath11k_vif *arvif,
|
||||
}
|
||||
|
||||
if (tx_arvif == arvif) {
|
||||
if (ath11k_mac_set_vif_params(tx_arvif, bcn))
|
||||
return -EINVAL;
|
||||
if (ath11k_mac_set_vif_params(tx_arvif, bcn)) {
|
||||
ret = -EINVAL;
|
||||
goto free;
|
||||
}
|
||||
} else if (!ath11k_mac_set_nontx_vif_params(tx_arvif, arvif, bcn)) {
|
||||
return -EINVAL;
|
||||
ret = -EINVAL;
|
||||
goto free;
|
||||
}
|
||||
|
||||
ret = ath11k_wmi_bcn_tmpl(ar, arvif->vdev_id, &offs, bcn, 0);
|
||||
kfree_skb(bcn);
|
||||
|
||||
if (ret)
|
||||
ath11k_warn(ab, "failed to submit beacon template command: %d\n",
|
||||
ret);
|
||||
|
||||
free:
|
||||
kfree_skb(bcn);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -3305,7 +3311,7 @@ static int ath11k_mac_fils_discovery(struct ath11k_vif *arvif,
|
||||
if (info->fils_discovery.max_interval) {
|
||||
interval = info->fils_discovery.max_interval;
|
||||
|
||||
tmpl = ieee80211_get_fils_discovery_tmpl(ar->hw, arvif->vif);
|
||||
tmpl = ieee80211_get_fils_discovery_tmpl(ar->hw, arvif->vif, 0);
|
||||
if (tmpl)
|
||||
ret = ath11k_wmi_fils_discovery_tmpl(ar, arvif->vdev_id,
|
||||
tmpl);
|
||||
@@ -3314,7 +3320,7 @@ static int ath11k_mac_fils_discovery(struct ath11k_vif *arvif,
|
||||
interval = info->unsol_bcast_probe_resp_interval;
|
||||
|
||||
tmpl = ieee80211_get_unsol_bcast_probe_resp_tmpl(ar->hw,
|
||||
arvif->vif);
|
||||
arvif->vif, 0);
|
||||
if (tmpl)
|
||||
ret = ath11k_wmi_probe_resp_tmpl(ar, arvif->vdev_id,
|
||||
tmpl);
|
||||
|
||||
@@ -32,6 +32,7 @@ ath12k-$(CONFIG_ATH12K_TRACING) += trace.o
|
||||
ath12k-$(CONFIG_PM) += wow.o
|
||||
ath12k-$(CONFIG_ATH12K_COREDUMP) += coredump.o
|
||||
ath12k-$(CONFIG_NL80211_TESTMODE) += testmode.o
|
||||
ath12k-$(CONFIG_THERMAL) += thermal.o
|
||||
|
||||
# for tracing framework to find trace.h
|
||||
CFLAGS_trace.o := -I$(src)
|
||||
|
||||
@@ -863,11 +863,22 @@ static int ath12k_core_pdev_create(struct ath12k_base *ab)
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = ath12k_thermal_register(ab);
|
||||
if (ret) {
|
||||
ath12k_err(ab, "could not register thermal device: %d\n", ret);
|
||||
goto err_dp_pdev_free;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
err_dp_pdev_free:
|
||||
ath12k_dp_pdev_free(ab);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void ath12k_core_pdev_destroy(struct ath12k_base *ab)
|
||||
{
|
||||
ath12k_thermal_unregister(ab);
|
||||
ath12k_dp_pdev_free(ab);
|
||||
}
|
||||
|
||||
@@ -1006,6 +1017,8 @@ static void ath12k_core_hw_group_stop(struct ath12k_hw_group *ag)
|
||||
|
||||
ath12k_mac_unregister(ag);
|
||||
|
||||
ath12k_mac_mlo_teardown(ag);
|
||||
|
||||
for (i = ag->num_devices - 1; i >= 0; i--) {
|
||||
ab = ag->ab[i];
|
||||
if (!ab)
|
||||
@@ -1123,8 +1136,14 @@ static int ath12k_core_hw_group_start(struct ath12k_hw_group *ag)
|
||||
|
||||
lockdep_assert_held(&ag->mutex);
|
||||
|
||||
if (test_bit(ATH12K_GROUP_FLAG_REGISTERED, &ag->flags))
|
||||
if (test_bit(ATH12K_GROUP_FLAG_REGISTERED, &ag->flags)) {
|
||||
ret = ath12k_core_mlo_setup(ag);
|
||||
if (WARN_ON(ret)) {
|
||||
ath12k_mac_unregister(ag);
|
||||
goto err_mac_destroy;
|
||||
}
|
||||
goto core_pdev_create;
|
||||
}
|
||||
|
||||
ret = ath12k_mac_allocate(ag);
|
||||
if (WARN_ON(ret))
|
||||
@@ -1361,6 +1380,7 @@ static int ath12k_core_reconfigure_on_crash(struct ath12k_base *ab)
|
||||
|
||||
mutex_lock(&ab->core_lock);
|
||||
ath12k_link_sta_rhash_tbl_destroy(ab);
|
||||
ath12k_thermal_unregister(ab);
|
||||
ath12k_dp_pdev_free(ab);
|
||||
ath12k_ce_cleanup_pipes(ab);
|
||||
ath12k_wmi_detach(ab);
|
||||
@@ -1502,6 +1522,7 @@ static void ath12k_core_pre_reconfigure_recovery(struct ath12k_base *ab)
|
||||
complete(&ar->vdev_delete_done);
|
||||
complete(&ar->bss_survey_done);
|
||||
complete_all(&ar->regd_update_completed);
|
||||
complete_all(&ar->thermal.wmi_sync);
|
||||
|
||||
wake_up(&ar->dp.tx_empty_waitq);
|
||||
idr_for_each(&ar->txmgmt_idr,
|
||||
|
||||
@@ -36,6 +36,7 @@
|
||||
#include "coredump.h"
|
||||
#include "cmn_defs.h"
|
||||
#include "dp_cmn.h"
|
||||
#include "thermal.h"
|
||||
|
||||
#define SM(_v, _f) (((_v) << _f##_LSB) & _f##_MASK)
|
||||
|
||||
@@ -757,6 +758,8 @@ struct ath12k {
|
||||
|
||||
s8 max_allowed_tx_power;
|
||||
struct ath12k_pdev_rssi_offsets rssi_info;
|
||||
|
||||
struct ath12k_thermal thermal;
|
||||
};
|
||||
|
||||
struct ath12k_hw {
|
||||
|
||||
@@ -1117,7 +1117,6 @@ static void ath12k_dp_rx_h_undecap_eth(struct ath12k_pdev_dp *dp_pdev,
|
||||
}
|
||||
|
||||
void ath12k_dp_rx_h_undecap(struct ath12k_pdev_dp *dp_pdev, struct sk_buff *msdu,
|
||||
struct hal_rx_desc *rx_desc,
|
||||
enum hal_encrypt_type enctype,
|
||||
bool decrypted,
|
||||
struct hal_rx_desc_data *rx_info)
|
||||
@@ -1393,7 +1392,6 @@ void ath12k_dp_rx_deliver_msdu(struct ath12k_pdev_dp *dp_pdev, struct napi_struc
|
||||
EXPORT_SYMBOL(ath12k_dp_rx_deliver_msdu);
|
||||
|
||||
bool ath12k_dp_rx_check_nwifi_hdr_len_valid(struct ath12k_dp *dp,
|
||||
struct hal_rx_desc *rx_desc,
|
||||
struct sk_buff *msdu,
|
||||
struct hal_rx_desc_data *rx_info)
|
||||
{
|
||||
|
||||
@@ -189,7 +189,6 @@ void ath12k_dp_extract_rx_desc_data(struct ath12k_hal *hal,
|
||||
}
|
||||
|
||||
void ath12k_dp_rx_h_undecap(struct ath12k_pdev_dp *dp_pdev, struct sk_buff *msdu,
|
||||
struct hal_rx_desc *rx_desc,
|
||||
enum hal_encrypt_type enctype,
|
||||
bool decrypted,
|
||||
struct hal_rx_desc_data *rx_info);
|
||||
@@ -197,7 +196,6 @@ void ath12k_dp_rx_deliver_msdu(struct ath12k_pdev_dp *dp_pdev, struct napi_struc
|
||||
struct sk_buff *msdu,
|
||||
struct hal_rx_desc_data *rx_info);
|
||||
bool ath12k_dp_rx_check_nwifi_hdr_len_valid(struct ath12k_dp *dp,
|
||||
struct hal_rx_desc *rx_desc,
|
||||
struct sk_buff *msdu,
|
||||
struct hal_rx_desc_data *rx_info);
|
||||
u64 ath12k_dp_rx_h_get_pn(struct ath12k_dp *dp, struct sk_buff *skb);
|
||||
|
||||
@@ -4311,7 +4311,8 @@ static int ath12k_mac_fils_discovery(struct ath12k_link_vif *arvif,
|
||||
if (info->fils_discovery.max_interval) {
|
||||
interval = info->fils_discovery.max_interval;
|
||||
|
||||
tmpl = ieee80211_get_fils_discovery_tmpl(hw, vif);
|
||||
tmpl = ieee80211_get_fils_discovery_tmpl(hw, vif,
|
||||
info->link_id);
|
||||
if (tmpl)
|
||||
ret = ath12k_wmi_fils_discovery_tmpl(ar, arvif->vdev_id,
|
||||
tmpl);
|
||||
@@ -4319,7 +4320,8 @@ static int ath12k_mac_fils_discovery(struct ath12k_link_vif *arvif,
|
||||
unsol_bcast_probe_resp_enabled = 1;
|
||||
interval = info->unsol_bcast_probe_resp_interval;
|
||||
|
||||
tmpl = ieee80211_get_unsol_bcast_probe_resp_tmpl(hw, vif);
|
||||
tmpl = ieee80211_get_unsol_bcast_probe_resp_tmpl(hw, vif,
|
||||
info->link_id);
|
||||
if (tmpl)
|
||||
ret = ath12k_wmi_probe_resp_tmpl(ar, arvif->vdev_id,
|
||||
tmpl);
|
||||
@@ -14791,6 +14793,10 @@ static void ath12k_mac_setup(struct ath12k *ar)
|
||||
init_completion(&ar->mlo_setup_done);
|
||||
init_completion(&ar->completed_11d_scan);
|
||||
init_completion(&ar->regd_update_completed);
|
||||
init_completion(&ar->thermal.wmi_sync);
|
||||
|
||||
ar->thermal.temperature = 0;
|
||||
ar->thermal.hwmon_dev = NULL;
|
||||
|
||||
INIT_DELAYED_WORK(&ar->scan.timeout, ath12k_scan_timeout_work);
|
||||
wiphy_work_init(&ar->scan.vdev_clean_wk, ath12k_scan_vdev_clean_work);
|
||||
|
||||
@@ -3339,7 +3339,7 @@ static int ath12k_qmi_aux_uc_load(struct ath12k_base *ab)
|
||||
goto out;
|
||||
}
|
||||
|
||||
aux_uc_mem->total_size = aux_uc_len;
|
||||
aux_uc_mem->total_size = aux_uc_len;
|
||||
|
||||
copy:
|
||||
memcpy(aux_uc_mem->vaddr, aux_uc_data, aux_uc_len);
|
||||
|
||||
124
drivers/net/wireless/ath/ath12k/thermal.c
Normal file
124
drivers/net/wireless/ath/ath12k/thermal.c
Normal file
@@ -0,0 +1,124 @@
|
||||
// SPDX-License-Identifier: BSD-3-Clause-Clear
|
||||
/*
|
||||
* Copyright (c) 2020 The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
|
||||
*/
|
||||
|
||||
#include <linux/device.h>
|
||||
#include <linux/hwmon.h>
|
||||
#include <linux/hwmon-sysfs.h>
|
||||
#include <linux/sysfs.h>
|
||||
#include <linux/thermal.h>
|
||||
#include "core.h"
|
||||
#include "debug.h"
|
||||
|
||||
static ssize_t ath12k_thermal_temp_show(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct ath12k *ar = dev_get_drvdata(dev);
|
||||
unsigned long time_left;
|
||||
int ret, temperature;
|
||||
|
||||
guard(wiphy)(ath12k_ar_to_hw(ar)->wiphy);
|
||||
|
||||
if (ar->ah->state != ATH12K_HW_STATE_ON)
|
||||
return -ENETDOWN;
|
||||
|
||||
reinit_completion(&ar->thermal.wmi_sync);
|
||||
ret = ath12k_wmi_send_pdev_temperature_cmd(ar);
|
||||
if (ret) {
|
||||
ath12k_warn(ar->ab, "failed to read temperature %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (test_bit(ATH12K_FLAG_CRASH_FLUSH, &ar->ab->dev_flags))
|
||||
return -ESHUTDOWN;
|
||||
|
||||
time_left = wait_for_completion_timeout(&ar->thermal.wmi_sync,
|
||||
ATH12K_THERMAL_SYNC_TIMEOUT_HZ);
|
||||
if (!time_left) {
|
||||
ath12k_warn(ar->ab, "failed to synchronize thermal read\n");
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
|
||||
spin_lock_bh(&ar->data_lock);
|
||||
temperature = ar->thermal.temperature;
|
||||
spin_unlock_bh(&ar->data_lock);
|
||||
|
||||
/* display in millidegree celsius */
|
||||
return sysfs_emit(buf, "%d\n", temperature * 1000);
|
||||
}
|
||||
|
||||
void ath12k_thermal_event_temperature(struct ath12k *ar, int temperature)
|
||||
{
|
||||
spin_lock_bh(&ar->data_lock);
|
||||
ar->thermal.temperature = temperature;
|
||||
spin_unlock_bh(&ar->data_lock);
|
||||
complete_all(&ar->thermal.wmi_sync);
|
||||
}
|
||||
|
||||
static SENSOR_DEVICE_ATTR_RO(temp1_input, ath12k_thermal_temp, 0);
|
||||
|
||||
static struct attribute *ath12k_hwmon_attrs[] = {
|
||||
&sensor_dev_attr_temp1_input.dev_attr.attr,
|
||||
NULL,
|
||||
};
|
||||
ATTRIBUTE_GROUPS(ath12k_hwmon);
|
||||
|
||||
int ath12k_thermal_register(struct ath12k_base *ab)
|
||||
{
|
||||
struct ath12k *ar;
|
||||
int i, j, ret;
|
||||
|
||||
if (!IS_REACHABLE(CONFIG_HWMON))
|
||||
return 0;
|
||||
|
||||
for (i = 0; i < ab->num_radios; i++) {
|
||||
ar = ab->pdevs[i].ar;
|
||||
if (!ar)
|
||||
continue;
|
||||
|
||||
ar->thermal.hwmon_dev =
|
||||
hwmon_device_register_with_groups(&ar->ah->hw->wiphy->dev,
|
||||
"ath12k_hwmon", ar,
|
||||
ath12k_hwmon_groups);
|
||||
if (IS_ERR(ar->thermal.hwmon_dev)) {
|
||||
ret = PTR_ERR(ar->thermal.hwmon_dev);
|
||||
ar->thermal.hwmon_dev = NULL;
|
||||
ath12k_err(ar->ab, "failed to register hwmon device: %d\n",
|
||||
ret);
|
||||
for (j = i - 1; j >= 0; j--) {
|
||||
ar = ab->pdevs[j].ar;
|
||||
if (!ar)
|
||||
continue;
|
||||
|
||||
hwmon_device_unregister(ar->thermal.hwmon_dev);
|
||||
ar->thermal.hwmon_dev = NULL;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void ath12k_thermal_unregister(struct ath12k_base *ab)
|
||||
{
|
||||
struct ath12k *ar;
|
||||
int i;
|
||||
|
||||
if (!IS_REACHABLE(CONFIG_HWMON))
|
||||
return;
|
||||
|
||||
for (i = 0; i < ab->num_radios; i++) {
|
||||
ar = ab->pdevs[i].ar;
|
||||
if (!ar)
|
||||
continue;
|
||||
|
||||
if (ar->thermal.hwmon_dev) {
|
||||
hwmon_device_unregister(ar->thermal.hwmon_dev);
|
||||
ar->thermal.hwmon_dev = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
40
drivers/net/wireless/ath/ath12k/thermal.h
Normal file
40
drivers/net/wireless/ath/ath12k/thermal.h
Normal file
@@ -0,0 +1,40 @@
|
||||
/* SPDX-License-Identifier: BSD-3-Clause-Clear */
|
||||
/*
|
||||
* Copyright (c) 2020 The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
|
||||
*/
|
||||
|
||||
#ifndef _ATH12K_THERMAL_
|
||||
#define _ATH12K_THERMAL_
|
||||
|
||||
#define ATH12K_THERMAL_SYNC_TIMEOUT_HZ (5 * HZ)
|
||||
|
||||
struct ath12k_thermal {
|
||||
struct completion wmi_sync;
|
||||
|
||||
/* temperature value in Celsius degree protected by data_lock. */
|
||||
int temperature;
|
||||
struct device *hwmon_dev;
|
||||
};
|
||||
|
||||
#if IS_REACHABLE(CONFIG_THERMAL)
|
||||
int ath12k_thermal_register(struct ath12k_base *ab);
|
||||
void ath12k_thermal_unregister(struct ath12k_base *ab);
|
||||
void ath12k_thermal_event_temperature(struct ath12k *ar, int temperature);
|
||||
#else
|
||||
static inline int ath12k_thermal_register(struct ath12k_base *ab)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void ath12k_thermal_unregister(struct ath12k_base *ab)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void ath12k_thermal_event_temperature(struct ath12k *ar,
|
||||
int temperature)
|
||||
{
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif /* _ATH12K_THERMAL_ */
|
||||
@@ -325,7 +325,6 @@ static void ath12k_wifi7_dp_rx_h_csum_offload(struct sk_buff *msdu,
|
||||
|
||||
static void ath12k_wifi7_dp_rx_h_mpdu(struct ath12k_pdev_dp *dp_pdev,
|
||||
struct sk_buff *msdu,
|
||||
struct hal_rx_desc *rx_desc,
|
||||
struct hal_rx_desc_data *rx_info)
|
||||
{
|
||||
struct ath12k_skb_rxcb *rxcb;
|
||||
@@ -388,8 +387,7 @@ static void ath12k_wifi7_dp_rx_h_mpdu(struct ath12k_pdev_dp *dp_pdev,
|
||||
}
|
||||
|
||||
ath12k_wifi7_dp_rx_h_csum_offload(msdu, rx_info);
|
||||
ath12k_dp_rx_h_undecap(dp_pdev, msdu, rx_desc,
|
||||
enctype, is_decrypted, rx_info);
|
||||
ath12k_dp_rx_h_undecap(dp_pdev, msdu, enctype, is_decrypted, rx_info);
|
||||
|
||||
if (!is_decrypted || rx_info->is_mcbc)
|
||||
return;
|
||||
@@ -549,14 +547,14 @@ static int ath12k_wifi7_dp_rx_process_msdu(struct ath12k_pdev_dp *dp_pdev,
|
||||
}
|
||||
}
|
||||
|
||||
if (unlikely(!ath12k_dp_rx_check_nwifi_hdr_len_valid(dp, rx_desc, msdu,
|
||||
if (unlikely(!ath12k_dp_rx_check_nwifi_hdr_len_valid(dp, msdu,
|
||||
rx_info))) {
|
||||
ret = -EINVAL;
|
||||
goto free_out;
|
||||
}
|
||||
|
||||
ath12k_dp_rx_h_ppdu(dp_pdev, rx_info);
|
||||
ath12k_wifi7_dp_rx_h_mpdu(dp_pdev, msdu, rx_desc, rx_info);
|
||||
ath12k_wifi7_dp_rx_h_mpdu(dp_pdev, msdu, rx_info);
|
||||
|
||||
rx_info->rx_status->flag |= RX_FLAG_SKIP_MONITOR | RX_FLAG_DUP_VALIDATED;
|
||||
|
||||
@@ -1030,13 +1028,13 @@ static int ath12k_wifi7_dp_rx_h_verify_tkip_mic(struct ath12k_pdev_dp *dp_pdev,
|
||||
RX_FLAG_IV_STRIPPED | RX_FLAG_DECRYPTED;
|
||||
skb_pull(msdu, hal_rx_desc_sz);
|
||||
|
||||
if (unlikely(!ath12k_dp_rx_check_nwifi_hdr_len_valid(dp, rx_desc, msdu,
|
||||
if (unlikely(!ath12k_dp_rx_check_nwifi_hdr_len_valid(dp, msdu,
|
||||
rx_info)))
|
||||
return -EINVAL;
|
||||
|
||||
ath12k_dp_rx_h_ppdu(dp_pdev, rx_info);
|
||||
ath12k_dp_rx_h_undecap(dp_pdev, msdu, rx_desc,
|
||||
HAL_ENCRYPT_TYPE_TKIP_MIC, true, rx_info);
|
||||
ath12k_dp_rx_h_undecap(dp_pdev, msdu, HAL_ENCRYPT_TYPE_TKIP_MIC, true,
|
||||
rx_info);
|
||||
ieee80211_rx(ath12k_pdev_dp_to_hw(dp_pdev), msdu);
|
||||
return -EINVAL;
|
||||
}
|
||||
@@ -1588,7 +1586,6 @@ static int ath12k_wifi7_dp_rx_h_null_q_desc(struct ath12k_pdev_dp *dp_pdev,
|
||||
struct ath12k_dp *dp = dp_pdev->dp;
|
||||
struct ath12k_base *ab = dp->ab;
|
||||
u16 msdu_len = rx_info->msdu_len;
|
||||
struct hal_rx_desc *desc = (struct hal_rx_desc *)msdu->data;
|
||||
u8 l3pad_bytes = rx_info->l3_pad_bytes;
|
||||
struct ath12k_skb_rxcb *rxcb = ATH12K_SKB_RXCB(msdu);
|
||||
u32 hal_rx_desc_sz = dp->ab->hal.hal_desc_sz;
|
||||
@@ -1632,11 +1629,11 @@ static int ath12k_wifi7_dp_rx_h_null_q_desc(struct ath12k_pdev_dp *dp_pdev,
|
||||
skb_put(msdu, hal_rx_desc_sz + l3pad_bytes + msdu_len);
|
||||
skb_pull(msdu, hal_rx_desc_sz + l3pad_bytes);
|
||||
}
|
||||
if (unlikely(!ath12k_dp_rx_check_nwifi_hdr_len_valid(dp, desc, msdu, rx_info)))
|
||||
if (unlikely(!ath12k_dp_rx_check_nwifi_hdr_len_valid(dp, msdu, rx_info)))
|
||||
return -EINVAL;
|
||||
|
||||
ath12k_dp_rx_h_ppdu(dp_pdev, rx_info);
|
||||
ath12k_wifi7_dp_rx_h_mpdu(dp_pdev, msdu, desc, rx_info);
|
||||
ath12k_wifi7_dp_rx_h_mpdu(dp_pdev, msdu, rx_info);
|
||||
|
||||
rxcb->tid = rx_info->tid;
|
||||
|
||||
@@ -1673,7 +1670,7 @@ static bool ath12k_wifi7_dp_rx_h_tkip_mic_err(struct ath12k_pdev_dp *dp_pdev,
|
||||
skb_put(msdu, hal_rx_desc_sz + l3pad_bytes + msdu_len);
|
||||
skb_pull(msdu, hal_rx_desc_sz + l3pad_bytes);
|
||||
|
||||
if (unlikely(!ath12k_dp_rx_check_nwifi_hdr_len_valid(dp, desc, msdu, rx_info)))
|
||||
if (unlikely(!ath12k_dp_rx_check_nwifi_hdr_len_valid(dp, msdu, rx_info)))
|
||||
return true;
|
||||
|
||||
ath12k_dp_rx_h_ppdu(dp_pdev, rx_info);
|
||||
@@ -1681,8 +1678,8 @@ static bool ath12k_wifi7_dp_rx_h_tkip_mic_err(struct ath12k_pdev_dp *dp_pdev,
|
||||
rx_info->rx_status->flag |= (RX_FLAG_MMIC_STRIPPED | RX_FLAG_MMIC_ERROR |
|
||||
RX_FLAG_DECRYPTED);
|
||||
|
||||
ath12k_dp_rx_h_undecap(dp_pdev, msdu, desc,
|
||||
HAL_ENCRYPT_TYPE_TKIP_MIC, false, rx_info);
|
||||
ath12k_dp_rx_h_undecap(dp_pdev, msdu, HAL_ENCRYPT_TYPE_TKIP_MIC, false,
|
||||
rx_info);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@@ -617,7 +617,7 @@ static const struct ath12k_hw_params ath12k_wifi7_hw_params[] = {
|
||||
ath12k_wifi7_target_service_to_ce_map_wlan_ipq5332,
|
||||
.svc_to_ce_map_len = 18,
|
||||
|
||||
.rxdma1_enable = false,
|
||||
.rxdma1_enable = true,
|
||||
.num_rxdma_per_pdev = 1,
|
||||
.num_rxdma_dst_ring = 0,
|
||||
.rx_mac_buf_ring = false,
|
||||
@@ -626,7 +626,7 @@ static const struct ath12k_hw_params ath12k_wifi7_hw_params[] = {
|
||||
.interface_modes = BIT(NL80211_IFTYPE_STATION) |
|
||||
BIT(NL80211_IFTYPE_AP) |
|
||||
BIT(NL80211_IFTYPE_MESH_POINT),
|
||||
.supports_monitor = false,
|
||||
.supports_monitor = true,
|
||||
|
||||
.idle_ps = false,
|
||||
.download_calib = true,
|
||||
|
||||
@@ -6778,31 +6778,6 @@ static int ath12k_pull_peer_assoc_conf_ev(struct ath12k_base *ab, struct sk_buff
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
ath12k_pull_pdev_temp_ev(struct ath12k_base *ab, struct sk_buff *skb,
|
||||
const struct wmi_pdev_temperature_event *ev)
|
||||
{
|
||||
const void **tb;
|
||||
int ret;
|
||||
|
||||
tb = ath12k_wmi_tlv_parse_alloc(ab, skb, GFP_ATOMIC);
|
||||
if (IS_ERR(tb)) {
|
||||
ret = PTR_ERR(tb);
|
||||
ath12k_warn(ab, "failed to parse tlv: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ev = tb[WMI_TAG_PDEV_TEMPERATURE_EVENT];
|
||||
if (!ev) {
|
||||
ath12k_warn(ab, "failed to fetch pdev temp ev");
|
||||
kfree(tb);
|
||||
return -EPROTO;
|
||||
}
|
||||
|
||||
kfree(tb);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void ath12k_wmi_op_ep_tx_credits(struct ath12k_base *ab)
|
||||
{
|
||||
/* try to send pending beacons first. they take priority */
|
||||
@@ -8811,25 +8786,45 @@ static void
|
||||
ath12k_wmi_pdev_temperature_event(struct ath12k_base *ab,
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
const struct wmi_pdev_temperature_event *ev;
|
||||
struct ath12k *ar;
|
||||
struct wmi_pdev_temperature_event ev = {};
|
||||
const void **tb;
|
||||
int temp;
|
||||
u32 pdev_id;
|
||||
|
||||
if (ath12k_pull_pdev_temp_ev(ab, skb, &ev) != 0) {
|
||||
ath12k_warn(ab, "failed to extract pdev temperature event");
|
||||
tb = ath12k_wmi_tlv_parse_alloc(ab, skb, GFP_ATOMIC);
|
||||
if (IS_ERR(tb)) {
|
||||
ath12k_warn(ab, "failed to parse tlv: %ld\n", PTR_ERR(tb));
|
||||
return;
|
||||
}
|
||||
|
||||
ev = tb[WMI_TAG_PDEV_TEMPERATURE_EVENT];
|
||||
if (!ev) {
|
||||
ath12k_warn(ab, "failed to fetch pdev temp ev\n");
|
||||
kfree(tb);
|
||||
return;
|
||||
}
|
||||
|
||||
temp = a_sle32_to_cpu(ev->temp);
|
||||
pdev_id = le32_to_cpu(ev->pdev_id);
|
||||
|
||||
kfree(tb);
|
||||
|
||||
ath12k_dbg(ab, ATH12K_DBG_WMI,
|
||||
"pdev temperature ev temp %d pdev_id %d\n", ev.temp, ev.pdev_id);
|
||||
"pdev temperature ev temp %d pdev_id %u\n",
|
||||
temp, pdev_id);
|
||||
|
||||
rcu_read_lock();
|
||||
|
||||
ar = ath12k_mac_get_ar_by_pdev_id(ab, le32_to_cpu(ev.pdev_id));
|
||||
ar = ath12k_mac_get_ar_by_pdev_id(ab, pdev_id);
|
||||
if (!ar) {
|
||||
ath12k_warn(ab, "invalid pdev id in pdev temperature ev %d", ev.pdev_id);
|
||||
ath12k_warn(ab, "invalid pdev id %u in pdev temperature ev\n",
|
||||
pdev_id);
|
||||
goto exit;
|
||||
}
|
||||
|
||||
ath12k_thermal_event_temperature(ar, temp);
|
||||
|
||||
exit:
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
@@ -1123,13 +1123,13 @@ void ath6kl_cfg80211_ch_switch_notify(struct ath6kl_vif *vif, int freq,
|
||||
wiphy_unlock(vif->ar->wiphy);
|
||||
}
|
||||
|
||||
static int ath6kl_cfg80211_add_key(struct wiphy *wiphy, struct net_device *ndev,
|
||||
static int ath6kl_cfg80211_add_key(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
int link_id, u8 key_index, bool pairwise,
|
||||
const u8 *mac_addr,
|
||||
struct key_params *params)
|
||||
{
|
||||
struct ath6kl *ar = ath6kl_priv(ndev);
|
||||
struct ath6kl_vif *vif = netdev_priv(ndev);
|
||||
struct ath6kl *ar = ath6kl_priv(wdev->netdev);
|
||||
struct ath6kl_vif *vif = netdev_priv(wdev->netdev);
|
||||
struct ath6kl_key *key = NULL;
|
||||
int seq_len;
|
||||
u8 key_usage;
|
||||
@@ -1248,12 +1248,12 @@ static int ath6kl_cfg80211_add_key(struct wiphy *wiphy, struct net_device *ndev,
|
||||
(u8 *) mac_addr, SYNC_BOTH_WMIFLAG);
|
||||
}
|
||||
|
||||
static int ath6kl_cfg80211_del_key(struct wiphy *wiphy, struct net_device *ndev,
|
||||
static int ath6kl_cfg80211_del_key(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
int link_id, u8 key_index, bool pairwise,
|
||||
const u8 *mac_addr)
|
||||
{
|
||||
struct ath6kl *ar = ath6kl_priv(ndev);
|
||||
struct ath6kl_vif *vif = netdev_priv(ndev);
|
||||
struct ath6kl *ar = ath6kl_priv(wdev->netdev);
|
||||
struct ath6kl_vif *vif = netdev_priv(wdev->netdev);
|
||||
|
||||
ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: index %d\n", __func__, key_index);
|
||||
|
||||
@@ -1278,13 +1278,13 @@ static int ath6kl_cfg80211_del_key(struct wiphy *wiphy, struct net_device *ndev,
|
||||
return ath6kl_wmi_deletekey_cmd(ar->wmi, vif->fw_vif_idx, key_index);
|
||||
}
|
||||
|
||||
static int ath6kl_cfg80211_get_key(struct wiphy *wiphy, struct net_device *ndev,
|
||||
static int ath6kl_cfg80211_get_key(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
int link_id, u8 key_index, bool pairwise,
|
||||
const u8 *mac_addr, void *cookie,
|
||||
void (*callback) (void *cookie,
|
||||
struct key_params *))
|
||||
{
|
||||
struct ath6kl_vif *vif = netdev_priv(ndev);
|
||||
struct ath6kl_vif *vif = netdev_priv(wdev->netdev);
|
||||
struct ath6kl_key *key = NULL;
|
||||
struct key_params params;
|
||||
|
||||
@@ -1775,9 +1775,10 @@ static bool is_rate_ht40(s32 rate, u8 *mcs, bool *sgi)
|
||||
return false;
|
||||
}
|
||||
|
||||
static int ath6kl_get_station(struct wiphy *wiphy, struct net_device *dev,
|
||||
static int ath6kl_get_station(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
const u8 *mac, struct station_info *sinfo)
|
||||
{
|
||||
struct net_device *dev = wdev->netdev;
|
||||
struct ath6kl *ar = ath6kl_priv(dev);
|
||||
struct ath6kl_vif *vif = netdev_priv(dev);
|
||||
long left;
|
||||
@@ -2992,9 +2993,10 @@ static int ath6kl_stop_ap(struct wiphy *wiphy, struct net_device *dev,
|
||||
|
||||
static const u8 bcast_addr[ETH_ALEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
|
||||
|
||||
static int ath6kl_del_station(struct wiphy *wiphy, struct net_device *dev,
|
||||
static int ath6kl_del_station(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
struct station_del_parameters *params)
|
||||
{
|
||||
struct net_device *dev = wdev->netdev;
|
||||
struct ath6kl *ar = ath6kl_priv(dev);
|
||||
struct ath6kl_vif *vif = netdev_priv(dev);
|
||||
const u8 *addr = params->mac ? params->mac : bcast_addr;
|
||||
@@ -3003,10 +3005,11 @@ static int ath6kl_del_station(struct wiphy *wiphy, struct net_device *dev,
|
||||
addr, WLAN_REASON_PREV_AUTH_NOT_VALID);
|
||||
}
|
||||
|
||||
static int ath6kl_change_station(struct wiphy *wiphy, struct net_device *dev,
|
||||
static int ath6kl_change_station(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
const u8 *mac,
|
||||
struct station_parameters *params)
|
||||
{
|
||||
struct net_device *dev = wdev->netdev;
|
||||
struct ath6kl *ar = ath6kl_priv(dev);
|
||||
struct ath6kl_vif *vif = netdev_priv(dev);
|
||||
int err;
|
||||
|
||||
@@ -494,7 +494,7 @@ void ath6kl_connect_ap_mode_sta(struct ath6kl_vif *vif, u16 aid, u8 *mac_addr,
|
||||
sinfo->assoc_req_ies = ies;
|
||||
sinfo->assoc_req_ies_len = ies_len;
|
||||
|
||||
cfg80211_new_sta(vif->ndev, mac_addr, sinfo, GFP_KERNEL);
|
||||
cfg80211_new_sta(&vif->wdev, mac_addr, sinfo, GFP_KERNEL);
|
||||
|
||||
netif_wake_queue(vif->ndev);
|
||||
|
||||
@@ -1011,7 +1011,7 @@ void ath6kl_disconnect_event(struct ath6kl_vif *vif, u8 reason, u8 *bssid,
|
||||
|
||||
if (!is_broadcast_ether_addr(bssid)) {
|
||||
/* send event to application */
|
||||
cfg80211_del_sta(vif->ndev, bssid, GFP_KERNEL);
|
||||
cfg80211_del_sta(&vif->wdev, bssid, GFP_KERNEL);
|
||||
}
|
||||
|
||||
if (memcmp(vif->ndev->dev_addr, bssid, ETH_ALEN) == 0) {
|
||||
|
||||
@@ -443,7 +443,7 @@ ath_node_to_tid(struct ath_node *an, u8 tidno)
|
||||
|
||||
#define case_rtn_string(val) case val: return #val
|
||||
|
||||
#define ath_for_each_chanctx(_sc, _ctx) \
|
||||
#define ath_for_each_chanctx(sc, ctx) \
|
||||
for (ctx = &sc->chanctx[0]; \
|
||||
ctx <= &sc->chanctx[ARRAY_SIZE(sc->chanctx) - 1]; \
|
||||
ctx++)
|
||||
|
||||
@@ -533,11 +533,11 @@ int wil_cid_fill_sinfo(struct wil6210_vif *vif, int cid,
|
||||
}
|
||||
|
||||
static int wil_cfg80211_get_station(struct wiphy *wiphy,
|
||||
struct net_device *ndev,
|
||||
struct wireless_dev *wdev,
|
||||
const u8 *mac, struct station_info *sinfo)
|
||||
{
|
||||
struct wil6210_vif *vif = ndev_to_vif(ndev);
|
||||
struct wil6210_priv *wil = wiphy_to_wil(wiphy);
|
||||
struct wil6210_vif *vif = wdev_to_vif(wil, wdev);
|
||||
int rc;
|
||||
|
||||
int cid = wil_find_cid(wil, vif->mid, mac);
|
||||
@@ -573,11 +573,11 @@ int wil_find_cid_by_idx(struct wil6210_priv *wil, u8 mid, int idx)
|
||||
}
|
||||
|
||||
static int wil_cfg80211_dump_station(struct wiphy *wiphy,
|
||||
struct net_device *dev, int idx,
|
||||
struct wireless_dev *wdev, int idx,
|
||||
u8 *mac, struct station_info *sinfo)
|
||||
{
|
||||
struct wil6210_vif *vif = ndev_to_vif(dev);
|
||||
struct wil6210_priv *wil = wiphy_to_wil(wiphy);
|
||||
struct wil6210_vif *vif = wdev_to_vif(wil, wdev);
|
||||
int rc;
|
||||
int cid = wil_find_cid_by_idx(wil, vif->mid, idx);
|
||||
|
||||
@@ -1619,15 +1619,14 @@ static void wil_del_rx_key(u8 key_index, enum wmi_key_usage key_usage,
|
||||
}
|
||||
|
||||
static int wil_cfg80211_add_key(struct wiphy *wiphy,
|
||||
struct net_device *ndev, int link_id,
|
||||
struct wireless_dev *wdev, int link_id,
|
||||
u8 key_index, bool pairwise,
|
||||
const u8 *mac_addr,
|
||||
struct key_params *params)
|
||||
{
|
||||
int rc;
|
||||
struct wil6210_vif *vif = ndev_to_vif(ndev);
|
||||
struct wil6210_priv *wil = wiphy_to_wil(wiphy);
|
||||
struct wireless_dev *wdev = vif_to_wdev(vif);
|
||||
struct wil6210_vif *vif = wdev_to_vif(wil, wdev);
|
||||
enum wmi_key_usage key_usage = wil_detect_key_usage(wdev, pairwise);
|
||||
struct wil_sta_info *cs = wil_find_sta_by_key_usage(wil, vif->mid,
|
||||
key_usage,
|
||||
@@ -1695,13 +1694,12 @@ static int wil_cfg80211_add_key(struct wiphy *wiphy,
|
||||
}
|
||||
|
||||
static int wil_cfg80211_del_key(struct wiphy *wiphy,
|
||||
struct net_device *ndev, int link_id,
|
||||
struct wireless_dev *wdev, int link_id,
|
||||
u8 key_index, bool pairwise,
|
||||
const u8 *mac_addr)
|
||||
{
|
||||
struct wil6210_vif *vif = ndev_to_vif(ndev);
|
||||
struct wil6210_priv *wil = wiphy_to_wil(wiphy);
|
||||
struct wireless_dev *wdev = vif_to_wdev(vif);
|
||||
struct wil6210_vif *vif = wdev_to_vif(wil, wdev);
|
||||
enum wmi_key_usage key_usage = wil_detect_key_usage(wdev, pairwise);
|
||||
struct wil_sta_info *cs = wil_find_sta_by_key_usage(wil, vif->mid,
|
||||
key_usage,
|
||||
@@ -2071,7 +2069,8 @@ void wil_cfg80211_ap_recovery(struct wil6210_priv *wil)
|
||||
key_params.key = vif->gtk;
|
||||
key_params.key_len = vif->gtk_len;
|
||||
key_params.seq_len = IEEE80211_GCMP_PN_LEN;
|
||||
rc = wil_cfg80211_add_key(wiphy, ndev, -1, vif->gtk_index,
|
||||
rc = wil_cfg80211_add_key(wiphy, vif_to_wdev(vif), -1,
|
||||
vif->gtk_index,
|
||||
false, NULL, &key_params);
|
||||
if (rc)
|
||||
wil_err(wil, "vif %d recovery add key failed (%d)\n",
|
||||
@@ -2225,12 +2224,12 @@ static int wil_cfg80211_stop_ap(struct wiphy *wiphy,
|
||||
}
|
||||
|
||||
static int wil_cfg80211_add_station(struct wiphy *wiphy,
|
||||
struct net_device *dev,
|
||||
struct wireless_dev *wdev,
|
||||
const u8 *mac,
|
||||
struct station_parameters *params)
|
||||
{
|
||||
struct wil6210_vif *vif = ndev_to_vif(dev);
|
||||
struct wil6210_priv *wil = wiphy_to_wil(wiphy);
|
||||
struct wil6210_vif *vif = wdev_to_vif(wil, wdev);
|
||||
|
||||
wil_dbg_misc(wil, "add station %pM aid %d mid %d mask 0x%x set 0x%x\n",
|
||||
mac, params->aid, vif->mid,
|
||||
@@ -2250,11 +2249,11 @@ static int wil_cfg80211_add_station(struct wiphy *wiphy,
|
||||
}
|
||||
|
||||
static int wil_cfg80211_del_station(struct wiphy *wiphy,
|
||||
struct net_device *dev,
|
||||
struct wireless_dev *wdev,
|
||||
struct station_del_parameters *params)
|
||||
{
|
||||
struct wil6210_vif *vif = ndev_to_vif(dev);
|
||||
struct wil6210_priv *wil = wiphy_to_wil(wiphy);
|
||||
struct wil6210_vif *vif = wdev_to_vif(wil, wdev);
|
||||
|
||||
wil_dbg_misc(wil, "del_station: %pM, reason=%d mid=%d\n",
|
||||
params->mac, params->reason_code, vif->mid);
|
||||
@@ -2267,12 +2266,12 @@ static int wil_cfg80211_del_station(struct wiphy *wiphy,
|
||||
}
|
||||
|
||||
static int wil_cfg80211_change_station(struct wiphy *wiphy,
|
||||
struct net_device *dev,
|
||||
struct wireless_dev *wdev,
|
||||
const u8 *mac,
|
||||
struct station_parameters *params)
|
||||
{
|
||||
struct wil6210_vif *vif = ndev_to_vif(dev);
|
||||
struct wil6210_priv *wil = wiphy_to_wil(wiphy);
|
||||
struct wil6210_vif *vif = wdev_to_vif(wil, wdev);
|
||||
int authorize;
|
||||
int cid, i;
|
||||
struct wil_ring_tx_data *txdata = NULL;
|
||||
|
||||
@@ -245,7 +245,6 @@ __acquires(&sta->tid_rx_lock) __releases(&sta->tid_rx_lock)
|
||||
{
|
||||
uint i;
|
||||
struct wil6210_priv *wil = vif_to_wil(vif);
|
||||
struct net_device *ndev = vif_to_ndev(vif);
|
||||
struct wireless_dev *wdev = vif_to_wdev(vif);
|
||||
struct wil_sta_info *sta = &wil->sta[cid];
|
||||
int min_ring_id = wil_get_min_tx_ring_id(wil);
|
||||
@@ -265,7 +264,7 @@ __acquires(&sta->tid_rx_lock) __releases(&sta->tid_rx_lock)
|
||||
case NL80211_IFTYPE_AP:
|
||||
case NL80211_IFTYPE_P2P_GO:
|
||||
/* AP-like interface */
|
||||
cfg80211_del_sta(ndev, sta->addr, GFP_KERNEL);
|
||||
cfg80211_del_sta(wdev, sta->addr, GFP_KERNEL);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
||||
@@ -1076,7 +1076,7 @@ static void wmi_evt_connect(struct wil6210_vif *vif, int id, void *d, int len)
|
||||
if (rc) {
|
||||
if (disable_ap_sme)
|
||||
/* notify new_sta has failed */
|
||||
cfg80211_del_sta(ndev, evt->bssid, GFP_KERNEL);
|
||||
cfg80211_del_sta(wdev, evt->bssid, GFP_KERNEL);
|
||||
goto out;
|
||||
}
|
||||
|
||||
@@ -1093,7 +1093,8 @@ static void wmi_evt_connect(struct wil6210_vif *vif, int id, void *d, int len)
|
||||
sinfo->assoc_req_ies_len = assoc_req_ielen;
|
||||
}
|
||||
|
||||
cfg80211_new_sta(ndev, evt->bssid, sinfo, GFP_KERNEL);
|
||||
cfg80211_new_sta(ndev->ieee80211_ptr, evt->bssid, sinfo,
|
||||
GFP_KERNEL);
|
||||
|
||||
kfree(sinfo);
|
||||
} else {
|
||||
|
||||
@@ -2758,11 +2758,11 @@ brcmf_cfg80211_config_default_key(struct wiphy *wiphy, struct net_device *ndev,
|
||||
}
|
||||
|
||||
static s32
|
||||
brcmf_cfg80211_del_key(struct wiphy *wiphy, struct net_device *ndev,
|
||||
brcmf_cfg80211_del_key(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
int link_id, u8 key_idx, bool pairwise,
|
||||
const u8 *mac_addr)
|
||||
{
|
||||
struct brcmf_if *ifp = netdev_priv(ndev);
|
||||
struct brcmf_if *ifp = netdev_priv(wdev->netdev);
|
||||
struct brcmf_wsec_key *key;
|
||||
s32 err;
|
||||
|
||||
@@ -2796,12 +2796,12 @@ brcmf_cfg80211_del_key(struct wiphy *wiphy, struct net_device *ndev,
|
||||
}
|
||||
|
||||
static s32
|
||||
brcmf_cfg80211_add_key(struct wiphy *wiphy, struct net_device *ndev,
|
||||
brcmf_cfg80211_add_key(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
int link_id, u8 key_idx, bool pairwise,
|
||||
const u8 *mac_addr, struct key_params *params)
|
||||
{
|
||||
struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
|
||||
struct brcmf_if *ifp = netdev_priv(ndev);
|
||||
struct brcmf_if *ifp = netdev_priv(wdev->netdev);
|
||||
struct brcmf_pub *drvr = cfg->pub;
|
||||
struct brcmf_wsec_key *key;
|
||||
s32 val;
|
||||
@@ -2822,7 +2822,7 @@ brcmf_cfg80211_add_key(struct wiphy *wiphy, struct net_device *ndev,
|
||||
}
|
||||
|
||||
if (params->key_len == 0)
|
||||
return brcmf_cfg80211_del_key(wiphy, ndev, -1, key_idx,
|
||||
return brcmf_cfg80211_del_key(wiphy, wdev, -1, key_idx,
|
||||
pairwise, mac_addr);
|
||||
|
||||
if (params->key_len > sizeof(key->data)) {
|
||||
@@ -2918,7 +2918,7 @@ brcmf_cfg80211_add_key(struct wiphy *wiphy, struct net_device *ndev,
|
||||
}
|
||||
|
||||
static s32
|
||||
brcmf_cfg80211_get_key(struct wiphy *wiphy, struct net_device *ndev,
|
||||
brcmf_cfg80211_get_key(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
int link_id, u8 key_idx, bool pairwise,
|
||||
const u8 *mac_addr, void *cookie,
|
||||
void (*callback)(void *cookie,
|
||||
@@ -2926,7 +2926,7 @@ brcmf_cfg80211_get_key(struct wiphy *wiphy, struct net_device *ndev,
|
||||
{
|
||||
struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
|
||||
struct key_params params;
|
||||
struct brcmf_if *ifp = netdev_priv(ndev);
|
||||
struct brcmf_if *ifp = netdev_priv(wdev->netdev);
|
||||
struct brcmf_cfg80211_profile *profile = &ifp->vif->profile;
|
||||
struct brcmf_pub *drvr = cfg->pub;
|
||||
struct brcmf_cfg80211_security *sec;
|
||||
@@ -2976,10 +2976,10 @@ brcmf_cfg80211_get_key(struct wiphy *wiphy, struct net_device *ndev,
|
||||
|
||||
static s32
|
||||
brcmf_cfg80211_config_default_mgmt_key(struct wiphy *wiphy,
|
||||
struct net_device *ndev, int link_id,
|
||||
struct wireless_dev *wdev, int link_id,
|
||||
u8 key_idx)
|
||||
{
|
||||
struct brcmf_if *ifp = netdev_priv(ndev);
|
||||
struct brcmf_if *ifp = netdev_priv(wdev->netdev);
|
||||
|
||||
brcmf_dbg(TRACE, "Enter key_idx %d\n", key_idx);
|
||||
|
||||
@@ -3132,11 +3132,11 @@ brcmf_cfg80211_get_station_ibss(struct brcmf_if *ifp,
|
||||
}
|
||||
|
||||
static s32
|
||||
brcmf_cfg80211_get_station(struct wiphy *wiphy, struct net_device *ndev,
|
||||
brcmf_cfg80211_get_station(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
const u8 *mac, struct station_info *sinfo)
|
||||
{
|
||||
struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
|
||||
struct brcmf_if *ifp = netdev_priv(ndev);
|
||||
struct brcmf_if *ifp = netdev_priv(wdev->netdev);
|
||||
struct brcmf_pub *drvr = cfg->pub;
|
||||
struct brcmf_scb_val_le scb_val;
|
||||
s32 err = 0;
|
||||
@@ -3255,11 +3255,11 @@ brcmf_cfg80211_get_station(struct wiphy *wiphy, struct net_device *ndev,
|
||||
}
|
||||
|
||||
static int
|
||||
brcmf_cfg80211_dump_station(struct wiphy *wiphy, struct net_device *ndev,
|
||||
brcmf_cfg80211_dump_station(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
int idx, u8 *mac, struct station_info *sinfo)
|
||||
{
|
||||
struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
|
||||
struct brcmf_if *ifp = netdev_priv(ndev);
|
||||
struct brcmf_if *ifp = netdev_priv(wdev->netdev);
|
||||
struct brcmf_pub *drvr = cfg->pub;
|
||||
s32 err;
|
||||
|
||||
@@ -3284,7 +3284,8 @@ brcmf_cfg80211_dump_station(struct wiphy *wiphy, struct net_device *ndev,
|
||||
}
|
||||
if (idx < le32_to_cpu(cfg->assoclist.count)) {
|
||||
memcpy(mac, cfg->assoclist.mac[idx], ETH_ALEN);
|
||||
return brcmf_cfg80211_get_station(wiphy, ndev, mac, sinfo);
|
||||
return brcmf_cfg80211_get_station(wiphy, wdev,
|
||||
mac, sinfo);
|
||||
}
|
||||
return -ENOENT;
|
||||
}
|
||||
@@ -5452,12 +5453,13 @@ brcmf_cfg80211_change_beacon(struct wiphy *wiphy, struct net_device *ndev,
|
||||
}
|
||||
|
||||
static int
|
||||
brcmf_cfg80211_del_station(struct wiphy *wiphy, struct net_device *ndev,
|
||||
brcmf_cfg80211_del_station(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
struct station_del_parameters *params)
|
||||
{
|
||||
struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
|
||||
struct brcmf_pub *drvr = cfg->pub;
|
||||
struct brcmf_scb_val_le scbval;
|
||||
struct net_device *ndev = wdev->netdev;
|
||||
struct brcmf_if *ifp = netdev_priv(ndev);
|
||||
s32 err;
|
||||
|
||||
@@ -5484,12 +5486,12 @@ brcmf_cfg80211_del_station(struct wiphy *wiphy, struct net_device *ndev,
|
||||
}
|
||||
|
||||
static int
|
||||
brcmf_cfg80211_change_station(struct wiphy *wiphy, struct net_device *ndev,
|
||||
brcmf_cfg80211_change_station(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
const u8 *mac, struct station_parameters *params)
|
||||
{
|
||||
struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
|
||||
struct brcmf_pub *drvr = cfg->pub;
|
||||
struct brcmf_if *ifp = netdev_priv(ndev);
|
||||
struct brcmf_if *ifp = netdev_priv(wdev->netdev);
|
||||
s32 err;
|
||||
|
||||
brcmf_dbg(TRACE, "Enter, MAC %pM, mask 0x%04x set 0x%04x\n", mac,
|
||||
@@ -6548,13 +6550,14 @@ brcmf_notify_connect_status_ap(struct brcmf_cfg80211_info *cfg,
|
||||
sinfo->assoc_req_ies_len = e->datalen;
|
||||
generation++;
|
||||
sinfo->generation = generation;
|
||||
cfg80211_new_sta(ndev, e->addr, sinfo, GFP_KERNEL);
|
||||
cfg80211_new_sta(ndev->ieee80211_ptr, e->addr, sinfo,
|
||||
GFP_KERNEL);
|
||||
|
||||
kfree(sinfo);
|
||||
} else if ((event == BRCMF_E_DISASSOC_IND) ||
|
||||
(event == BRCMF_E_DEAUTH_IND) ||
|
||||
(event == BRCMF_E_DEAUTH)) {
|
||||
cfg80211_del_sta(ndev, e->addr, GFP_KERNEL);
|
||||
cfg80211_del_sta(ndev->ieee80211_ptr, e->addr, GFP_KERNEL);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -123,13 +123,15 @@ enum il3945_antenna {
|
||||
#define IEEE80211_FRAME_LEN (IEEE80211_DATA_LEN + IEEE80211_HLEN)
|
||||
|
||||
struct il3945_frame {
|
||||
struct list_head list;
|
||||
|
||||
/* Must be last as it ends in a flexible-array member. */
|
||||
union {
|
||||
struct ieee80211_hdr frame;
|
||||
struct il3945_tx_beacon_cmd beacon;
|
||||
u8 raw[IEEE80211_FRAME_LEN];
|
||||
u8 cmd[360];
|
||||
} u;
|
||||
struct list_head list;
|
||||
};
|
||||
|
||||
#define SUP_RATE_11A_MAX_NUM_CHANNELS 8
|
||||
|
||||
@@ -4076,7 +4076,7 @@ il4965_hdl_beacon(struct il_priv *il, struct il_rx_buf *rxb)
|
||||
u8 rate = il4965_hw_get_rate(beacon->beacon_notify_hdr.rate_n_flags);
|
||||
|
||||
D_RX("beacon status %x retries %d iss %d tsf:0x%.8x%.8x rate %d\n",
|
||||
le32_to_cpu(beacon->beacon_notify_hdr.u.status) & TX_STATUS_MSK,
|
||||
le32_to_cpu(beacon->beacon_tx_status) & TX_STATUS_MSK,
|
||||
beacon->beacon_notify_hdr.failure_frame,
|
||||
le32_to_cpu(beacon->ibss_mgr_status),
|
||||
le32_to_cpu(beacon->high_tsf), le32_to_cpu(beacon->low_tsf), rate);
|
||||
|
||||
@@ -1690,7 +1690,7 @@ struct agg_tx_status {
|
||||
__le16 sequence;
|
||||
} __packed;
|
||||
|
||||
struct il4965_tx_resp {
|
||||
struct il4965_tx_resp_hdr {
|
||||
u8 frame_count; /* 1 no aggregation, >1 aggregation */
|
||||
u8 bt_kill_count; /* # blocked by bluetooth (unused for agg) */
|
||||
u8 failure_rts; /* # failures due to unsuccessful RTS */
|
||||
@@ -1707,6 +1707,10 @@ struct il4965_tx_resp {
|
||||
__le16 reserved;
|
||||
__le32 pa_power1; /* RF power amplifier measurement (not used) */
|
||||
__le32 pa_power2;
|
||||
} __packed;
|
||||
|
||||
struct il4965_tx_resp {
|
||||
struct il4965_tx_resp_hdr;
|
||||
|
||||
/*
|
||||
* For non-agg: frame status TX_STATUS_*
|
||||
@@ -2664,7 +2668,8 @@ struct il3945_beacon_notif {
|
||||
} __packed;
|
||||
|
||||
struct il4965_beacon_notif {
|
||||
struct il4965_tx_resp beacon_notify_hdr;
|
||||
struct il4965_tx_resp_hdr beacon_notify_hdr;
|
||||
__le32 beacon_tx_status;
|
||||
__le32 low_tsf;
|
||||
__le32 high_tsf;
|
||||
__le32 ibss_mgr_status;
|
||||
|
||||
@@ -518,13 +518,15 @@ struct il_channel_info {
|
||||
#define IEEE80211_FRAME_LEN (IEEE80211_DATA_LEN + IEEE80211_HLEN)
|
||||
|
||||
struct il_frame {
|
||||
struct list_head list;
|
||||
|
||||
/* Must be last as it ends in a flexible-array member. */
|
||||
union {
|
||||
struct ieee80211_hdr frame;
|
||||
struct il_tx_beacon_cmd beacon;
|
||||
u8 raw[IEEE80211_FRAME_LEN];
|
||||
u8 cmd[360];
|
||||
} u;
|
||||
struct list_head list;
|
||||
};
|
||||
|
||||
enum {
|
||||
|
||||
@@ -54,9 +54,8 @@ static int iwl_mld_nan_config(struct iwl_mld *mld,
|
||||
ether_addr_copy(cmd.nmi_addr, vif->addr);
|
||||
cmd.master_pref = conf->master_pref;
|
||||
|
||||
if (conf->cluster_id)
|
||||
memcpy(cmd.cluster_id, conf->cluster_id + 4,
|
||||
sizeof(cmd.cluster_id));
|
||||
memcpy(cmd.cluster_id, conf->cluster_id + 4,
|
||||
sizeof(cmd.cluster_id));
|
||||
|
||||
cmd.scan_period = conf->scan_period < 255 ? conf->scan_period : 255;
|
||||
cmd.dwell_time =
|
||||
|
||||
@@ -1507,7 +1507,7 @@ static int lbs_cfg_set_default_key(struct wiphy *wiphy,
|
||||
}
|
||||
|
||||
|
||||
static int lbs_cfg_add_key(struct wiphy *wiphy, struct net_device *netdev,
|
||||
static int lbs_cfg_add_key(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
int link_id, u8 idx, bool pairwise,
|
||||
const u8 *mac_addr, struct key_params *params)
|
||||
{
|
||||
@@ -1516,7 +1516,7 @@ static int lbs_cfg_add_key(struct wiphy *wiphy, struct net_device *netdev,
|
||||
u16 key_type;
|
||||
int ret = 0;
|
||||
|
||||
if (netdev == priv->mesh_dev)
|
||||
if (wdev->netdev == priv->mesh_dev)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
lbs_deb_assoc("add_key: cipher 0x%x, mac_addr %pM\n",
|
||||
@@ -1568,7 +1568,7 @@ static int lbs_cfg_add_key(struct wiphy *wiphy, struct net_device *netdev,
|
||||
}
|
||||
|
||||
|
||||
static int lbs_cfg_del_key(struct wiphy *wiphy, struct net_device *netdev,
|
||||
static int lbs_cfg_del_key(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
int link_id, u8 key_index, bool pairwise,
|
||||
const u8 *mac_addr)
|
||||
{
|
||||
@@ -1607,7 +1607,7 @@ static int lbs_cfg_del_key(struct wiphy *wiphy, struct net_device *netdev,
|
||||
* Get station
|
||||
*/
|
||||
|
||||
static int lbs_cfg_get_station(struct wiphy *wiphy, struct net_device *dev,
|
||||
static int lbs_cfg_get_station(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
const u8 *mac, struct station_info *sinfo)
|
||||
{
|
||||
struct lbs_private *priv = wiphy_priv(wiphy);
|
||||
|
||||
@@ -203,6 +203,7 @@ mwifiex_11n_aggregate_pkt(struct mwifiex_private *priv,
|
||||
|
||||
if (!mwifiex_is_ralist_valid(priv, pra_list, ptrindex)) {
|
||||
spin_unlock_bh(&priv->wmm.ra_list_spinlock);
|
||||
mwifiex_write_data_complete(adapter, skb_aggr, 1, -1);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
@@ -141,11 +141,11 @@ static void *mwifiex_cfg80211_get_adapter(struct wiphy *wiphy)
|
||||
* CFG802.11 operation handler to delete a network key.
|
||||
*/
|
||||
static int
|
||||
mwifiex_cfg80211_del_key(struct wiphy *wiphy, struct net_device *netdev,
|
||||
mwifiex_cfg80211_del_key(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
int link_id, u8 key_index, bool pairwise,
|
||||
const u8 *mac_addr)
|
||||
{
|
||||
struct mwifiex_private *priv = mwifiex_netdev_get_priv(netdev);
|
||||
struct mwifiex_private *priv = mwifiex_netdev_get_priv(wdev->netdev);
|
||||
static const u8 bc_mac[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
|
||||
const u8 *peer_mac = pairwise ? mac_addr : bc_mac;
|
||||
|
||||
@@ -480,11 +480,11 @@ mwifiex_cfg80211_set_default_key(struct wiphy *wiphy, struct net_device *netdev,
|
||||
* CFG802.11 operation handler to add a network key.
|
||||
*/
|
||||
static int
|
||||
mwifiex_cfg80211_add_key(struct wiphy *wiphy, struct net_device *netdev,
|
||||
mwifiex_cfg80211_add_key(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
int link_id, u8 key_index, bool pairwise,
|
||||
const u8 *mac_addr, struct key_params *params)
|
||||
{
|
||||
struct mwifiex_private *priv = mwifiex_netdev_get_priv(netdev);
|
||||
struct mwifiex_private *priv = mwifiex_netdev_get_priv(wdev->netdev);
|
||||
struct mwifiex_wep_key *wep_key;
|
||||
static const u8 bc_mac[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
|
||||
const u8 *peer_mac = pairwise ? mac_addr : bc_mac;
|
||||
@@ -518,11 +518,11 @@ mwifiex_cfg80211_add_key(struct wiphy *wiphy, struct net_device *netdev,
|
||||
*/
|
||||
static int
|
||||
mwifiex_cfg80211_set_default_mgmt_key(struct wiphy *wiphy,
|
||||
struct net_device *netdev,
|
||||
struct wireless_dev *wdev,
|
||||
int link_id,
|
||||
u8 key_index)
|
||||
{
|
||||
struct mwifiex_private *priv = mwifiex_netdev_get_priv(netdev);
|
||||
struct mwifiex_private *priv = mwifiex_netdev_get_priv(wdev->netdev);
|
||||
struct mwifiex_ds_encrypt_key encrypt_key;
|
||||
|
||||
wiphy_dbg(wiphy, "set default mgmt key, key index=%d\n", key_index);
|
||||
@@ -1554,10 +1554,10 @@ mwifiex_dump_station_info(struct mwifiex_private *priv,
|
||||
* requested station information, if available.
|
||||
*/
|
||||
static int
|
||||
mwifiex_cfg80211_get_station(struct wiphy *wiphy, struct net_device *dev,
|
||||
mwifiex_cfg80211_get_station(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
const u8 *mac, struct station_info *sinfo)
|
||||
{
|
||||
struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
|
||||
struct mwifiex_private *priv = mwifiex_netdev_get_priv(wdev->netdev);
|
||||
|
||||
if (!priv->media_connected)
|
||||
return -ENOENT;
|
||||
@@ -1571,10 +1571,10 @@ mwifiex_cfg80211_get_station(struct wiphy *wiphy, struct net_device *dev,
|
||||
* CFG802.11 operation handler to dump station information.
|
||||
*/
|
||||
static int
|
||||
mwifiex_cfg80211_dump_station(struct wiphy *wiphy, struct net_device *dev,
|
||||
mwifiex_cfg80211_dump_station(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
int idx, u8 *mac, struct station_info *sinfo)
|
||||
{
|
||||
struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
|
||||
struct mwifiex_private *priv = mwifiex_netdev_get_priv(wdev->netdev);
|
||||
struct mwifiex_sta_node *node;
|
||||
int i;
|
||||
|
||||
@@ -1901,10 +1901,11 @@ static int mwifiex_cfg80211_change_beacon(struct wiphy *wiphy,
|
||||
* associated stations list, no action is taken.
|
||||
*/
|
||||
static int
|
||||
mwifiex_cfg80211_del_station(struct wiphy *wiphy, struct net_device *dev,
|
||||
mwifiex_cfg80211_del_station(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
struct station_del_parameters *params)
|
||||
{
|
||||
struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
|
||||
struct mwifiex_private *priv =
|
||||
mwifiex_netdev_get_priv(wdev->netdev);
|
||||
struct mwifiex_sta_node *sta_node;
|
||||
u8 deauth_mac[ETH_ALEN];
|
||||
|
||||
@@ -3993,7 +3994,8 @@ mwifiex_cfg80211_uap_add_station(struct mwifiex_private *priv, const u8 *mac,
|
||||
if (!sinfo)
|
||||
return -ENOMEM;
|
||||
|
||||
cfg80211_new_sta(priv->netdev, mac, sinfo, GFP_KERNEL);
|
||||
cfg80211_new_sta(priv->netdev->ieee80211_ptr, mac, sinfo,
|
||||
GFP_KERNEL);
|
||||
kfree(sinfo);
|
||||
}
|
||||
|
||||
@@ -4001,10 +4003,10 @@ mwifiex_cfg80211_uap_add_station(struct mwifiex_private *priv, const u8 *mac,
|
||||
}
|
||||
|
||||
static int
|
||||
mwifiex_cfg80211_add_station(struct wiphy *wiphy, struct net_device *dev,
|
||||
mwifiex_cfg80211_add_station(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
const u8 *mac, struct station_parameters *params)
|
||||
{
|
||||
struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
|
||||
struct mwifiex_private *priv = mwifiex_netdev_get_priv(wdev->netdev);
|
||||
|
||||
if (priv->adapter->host_mlme_enabled &&
|
||||
(GET_BSS_ROLE(priv) == MWIFIEX_BSS_ROLE_UAP))
|
||||
@@ -4240,12 +4242,12 @@ mwifiex_cfg80211_start_radar_detection(struct wiphy *wiphy,
|
||||
}
|
||||
|
||||
static int
|
||||
mwifiex_cfg80211_change_station(struct wiphy *wiphy, struct net_device *dev,
|
||||
mwifiex_cfg80211_change_station(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
const u8 *mac,
|
||||
struct station_parameters *params)
|
||||
{
|
||||
int ret;
|
||||
struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
|
||||
struct mwifiex_private *priv = mwifiex_netdev_get_priv(wdev->netdev);
|
||||
|
||||
if (priv->adapter->host_mlme_enabled &&
|
||||
(GET_BSS_ROLE(priv) == MWIFIEX_BSS_ROLE_UAP))
|
||||
|
||||
@@ -391,7 +391,7 @@ static void mwifiex_invalidate_lists(struct mwifiex_adapter *adapter)
|
||||
static void
|
||||
mwifiex_adapter_cleanup(struct mwifiex_adapter *adapter)
|
||||
{
|
||||
timer_delete(&adapter->wakeup_timer);
|
||||
timer_delete_sync(&adapter->wakeup_timer);
|
||||
cancel_delayed_work_sync(&adapter->devdump_work);
|
||||
mwifiex_cancel_all_pending_cmd(adapter);
|
||||
wake_up_interruptible(&adapter->cmd_wait_q.wait);
|
||||
|
||||
@@ -130,8 +130,8 @@ int mwifiex_process_uap_event(struct mwifiex_private *priv)
|
||||
le16_to_cpu(event->len) - (u16)len;
|
||||
}
|
||||
}
|
||||
cfg80211_new_sta(priv->netdev, event->sta_addr, sinfo,
|
||||
GFP_KERNEL);
|
||||
cfg80211_new_sta(priv->netdev->ieee80211_ptr, event->sta_addr,
|
||||
sinfo, GFP_KERNEL);
|
||||
|
||||
node = mwifiex_add_sta_entry(priv, event->sta_addr);
|
||||
if (!node) {
|
||||
@@ -162,7 +162,8 @@ int mwifiex_process_uap_event(struct mwifiex_private *priv)
|
||||
case EVENT_UAP_STA_DEAUTH:
|
||||
deauth_mac = adapter->event_body +
|
||||
MWIFIEX_UAP_EVENT_EXTRA_HEADER;
|
||||
cfg80211_del_sta(priv->netdev, deauth_mac, GFP_KERNEL);
|
||||
cfg80211_del_sta(priv->netdev->ieee80211_ptr, deauth_mac,
|
||||
GFP_KERNEL);
|
||||
|
||||
if (priv->ap_11n_enabled) {
|
||||
mwifiex_11n_del_rx_reorder_tbl_by_ta(priv, deauth_mac);
|
||||
|
||||
@@ -1977,11 +1977,11 @@ mt7915_mcu_add_inband_discov(struct mt7915_dev *dev, struct ieee80211_vif *vif,
|
||||
|
||||
if (changed & BSS_CHANGED_FILS_DISCOVERY) {
|
||||
interval = vif->bss_conf.fils_discovery.max_interval;
|
||||
skb = ieee80211_get_fils_discovery_tmpl(hw, vif);
|
||||
skb = ieee80211_get_fils_discovery_tmpl(hw, vif, 0);
|
||||
} else if (changed & BSS_CHANGED_UNSOL_BCAST_PROBE_RESP &&
|
||||
vif->bss_conf.unsol_bcast_probe_resp_interval) {
|
||||
interval = vif->bss_conf.unsol_bcast_probe_resp_interval;
|
||||
skb = ieee80211_get_unsol_bcast_probe_resp_tmpl(hw, vif);
|
||||
skb = ieee80211_get_unsol_bcast_probe_resp_tmpl(hw, vif, 0);
|
||||
}
|
||||
|
||||
if (!skb) {
|
||||
|
||||
@@ -2863,11 +2863,13 @@ int mt7996_mcu_beacon_inband_discov(struct mt7996_dev *dev,
|
||||
if (changed & BSS_CHANGED_FILS_DISCOVERY &&
|
||||
link_conf->fils_discovery.max_interval) {
|
||||
interval = link_conf->fils_discovery.max_interval;
|
||||
skb = ieee80211_get_fils_discovery_tmpl(hw, vif);
|
||||
skb = ieee80211_get_fils_discovery_tmpl(hw, vif,
|
||||
link_conf->link_id);
|
||||
} else if (changed & BSS_CHANGED_UNSOL_BCAST_PROBE_RESP &&
|
||||
link_conf->unsol_bcast_probe_resp_interval) {
|
||||
interval = link_conf->unsol_bcast_probe_resp_interval;
|
||||
skb = ieee80211_get_unsol_bcast_probe_resp_tmpl(hw, vif);
|
||||
skb = ieee80211_get_unsol_bcast_probe_resp_tmpl(hw, vif,
|
||||
link_conf->link_id);
|
||||
}
|
||||
|
||||
if (!skb) {
|
||||
|
||||
@@ -534,7 +534,7 @@ static int wilc_wfi_cfg_copy_wpa_info(struct wilc_wfi_key *key_info,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int add_key(struct wiphy *wiphy, struct net_device *netdev, int link_id,
|
||||
static int add_key(struct wiphy *wiphy, struct wireless_dev *wdev, int link_id,
|
||||
u8 key_index, bool pairwise, const u8 *mac_addr,
|
||||
struct key_params *params)
|
||||
|
||||
@@ -544,7 +544,7 @@ static int add_key(struct wiphy *wiphy, struct net_device *netdev, int link_id,
|
||||
const u8 *tx_mic = NULL;
|
||||
u8 mode = WILC_FW_SEC_NO;
|
||||
u8 op_mode;
|
||||
struct wilc_vif *vif = netdev_priv(netdev);
|
||||
struct wilc_vif *vif = netdev_priv(wdev->netdev);
|
||||
struct wilc_priv *priv = &vif->priv;
|
||||
struct wilc_wfi_key *key;
|
||||
|
||||
@@ -632,19 +632,19 @@ static int add_key(struct wiphy *wiphy, struct net_device *netdev, int link_id,
|
||||
break;
|
||||
|
||||
default:
|
||||
netdev_err(netdev, "%s: Unsupported cipher\n", __func__);
|
||||
netdev_err(wdev->netdev, "%s: Unsupported cipher\n", __func__);
|
||||
ret = -ENOTSUPP;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int del_key(struct wiphy *wiphy, struct net_device *netdev, int link_id,
|
||||
static int del_key(struct wiphy *wiphy, struct wireless_dev *wdev, int link_id,
|
||||
u8 key_index,
|
||||
bool pairwise,
|
||||
const u8 *mac_addr)
|
||||
{
|
||||
struct wilc_vif *vif = netdev_priv(netdev);
|
||||
struct wilc_vif *vif = netdev_priv(wdev->netdev);
|
||||
struct wilc_priv *priv = &vif->priv;
|
||||
|
||||
if (!pairwise && (key_index == 4 || key_index == 5)) {
|
||||
@@ -680,12 +680,12 @@ static int del_key(struct wiphy *wiphy, struct net_device *netdev, int link_id,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_key(struct wiphy *wiphy, struct net_device *netdev, int link_id,
|
||||
static int get_key(struct wiphy *wiphy, struct wireless_dev *wdev, int link_id,
|
||||
u8 key_index, bool pairwise, const u8 *mac_addr,
|
||||
void *cookie,
|
||||
void (*callback)(void *cookie, struct key_params *))
|
||||
{
|
||||
struct wilc_vif *vif = netdev_priv(netdev);
|
||||
struct wilc_vif *vif = netdev_priv(wdev->netdev);
|
||||
struct wilc_priv *priv = &vif->priv;
|
||||
struct key_params key_params;
|
||||
|
||||
@@ -725,17 +725,18 @@ static int set_default_key(struct wiphy *wiphy, struct net_device *netdev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_default_mgmt_key(struct wiphy *wiphy, struct net_device *netdev,
|
||||
static int set_default_mgmt_key(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
int link_id, u8 key_index)
|
||||
{
|
||||
struct wilc_vif *vif = netdev_priv(netdev);
|
||||
struct wilc_vif *vif = netdev_priv(wdev->netdev);
|
||||
|
||||
return wilc_set_default_mgmt_key_index(vif, key_index);
|
||||
}
|
||||
|
||||
static int get_station(struct wiphy *wiphy, struct net_device *dev,
|
||||
static int get_station(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
const u8 *mac, struct station_info *sinfo)
|
||||
{
|
||||
struct net_device *dev = wdev->netdev;
|
||||
struct wilc_vif *vif = netdev_priv(dev);
|
||||
struct wilc_priv *priv = &vif->priv;
|
||||
struct wilc *wilc = vif->wilc;
|
||||
@@ -1312,10 +1313,10 @@ static int set_cqm_rssi_config(struct wiphy *wiphy, struct net_device *dev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int dump_station(struct wiphy *wiphy, struct net_device *dev,
|
||||
static int dump_station(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
int idx, u8 *mac, struct station_info *sinfo)
|
||||
{
|
||||
struct wilc_vif *vif = netdev_priv(dev);
|
||||
struct wilc_vif *vif = netdev_priv(wdev->netdev);
|
||||
int ret;
|
||||
|
||||
if (idx != 0)
|
||||
@@ -1450,11 +1451,11 @@ static int stop_ap(struct wiphy *wiphy, struct net_device *dev,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int add_station(struct wiphy *wiphy, struct net_device *dev,
|
||||
static int add_station(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
const u8 *mac, struct station_parameters *params)
|
||||
{
|
||||
int ret = 0;
|
||||
struct wilc_vif *vif = netdev_priv(dev);
|
||||
struct wilc_vif *vif = netdev_priv(wdev->netdev);
|
||||
struct wilc_priv *priv = &vif->priv;
|
||||
|
||||
if (vif->iftype == WILC_AP_MODE || vif->iftype == WILC_GO_MODE) {
|
||||
@@ -1463,18 +1464,18 @@ static int add_station(struct wiphy *wiphy, struct net_device *dev,
|
||||
|
||||
ret = wilc_add_station(vif, mac, params);
|
||||
if (ret)
|
||||
netdev_err(dev, "Host add station fail\n");
|
||||
netdev_err(wdev->netdev, "Host add station fail\n");
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int del_station(struct wiphy *wiphy, struct net_device *dev,
|
||||
static int del_station(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
struct station_del_parameters *params)
|
||||
{
|
||||
const u8 *mac = params->mac;
|
||||
int ret = 0;
|
||||
struct wilc_vif *vif = netdev_priv(dev);
|
||||
struct wilc_vif *vif = netdev_priv(wdev->netdev);
|
||||
struct wilc_priv *priv = &vif->priv;
|
||||
struct sta_info *info;
|
||||
|
||||
@@ -1488,20 +1489,19 @@ static int del_station(struct wiphy *wiphy, struct net_device *dev,
|
||||
|
||||
ret = wilc_del_station(vif, mac);
|
||||
if (ret)
|
||||
netdev_err(dev, "Host delete station fail\n");
|
||||
netdev_err(wdev->netdev, "Host delete station fail\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int change_station(struct wiphy *wiphy, struct net_device *dev,
|
||||
static int change_station(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
const u8 *mac, struct station_parameters *params)
|
||||
{
|
||||
int ret = 0;
|
||||
struct wilc_vif *vif = netdev_priv(dev);
|
||||
|
||||
struct wilc_vif *vif = netdev_priv(wdev->netdev);
|
||||
if (vif->iftype == WILC_AP_MODE || vif->iftype == WILC_GO_MODE) {
|
||||
ret = wilc_edit_station(vif, mac, params);
|
||||
if (ret)
|
||||
netdev_err(dev, "Host edit station fail\n");
|
||||
netdev_err(wdev->netdev, "Host edit station fail\n");
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -483,26 +483,26 @@ qtnf_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
}
|
||||
|
||||
static int
|
||||
qtnf_get_station(struct wiphy *wiphy, struct net_device *dev,
|
||||
qtnf_get_station(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
const u8 *mac, struct station_info *sinfo)
|
||||
{
|
||||
struct qtnf_vif *vif = qtnf_netdev_get_priv(dev);
|
||||
struct qtnf_vif *vif = qtnf_netdev_get_priv(wdev->netdev);
|
||||
|
||||
sinfo->generation = vif->generation;
|
||||
return qtnf_cmd_get_sta_info(vif, mac, sinfo);
|
||||
}
|
||||
|
||||
static int
|
||||
qtnf_dump_station(struct wiphy *wiphy, struct net_device *dev,
|
||||
qtnf_dump_station(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
int idx, u8 *mac, struct station_info *sinfo)
|
||||
{
|
||||
struct qtnf_vif *vif = qtnf_netdev_get_priv(dev);
|
||||
struct qtnf_vif *vif = qtnf_netdev_get_priv(wdev->netdev);
|
||||
const struct qtnf_sta_node *sta_node;
|
||||
int ret;
|
||||
|
||||
switch (vif->wdev.iftype) {
|
||||
switch (wdev->iftype) {
|
||||
case NL80211_IFTYPE_STATION:
|
||||
if (idx != 0 || !vif->wdev.connected)
|
||||
if (idx != 0 || !wdev->connected)
|
||||
return -ENOENT;
|
||||
|
||||
ether_addr_copy(mac, vif->bssid);
|
||||
@@ -520,9 +520,9 @@ qtnf_dump_station(struct wiphy *wiphy, struct net_device *dev,
|
||||
|
||||
ret = qtnf_cmd_get_sta_info(vif, mac, sinfo);
|
||||
|
||||
if (vif->wdev.iftype == NL80211_IFTYPE_AP) {
|
||||
if (wdev->iftype == NL80211_IFTYPE_AP) {
|
||||
if (ret == -ENOENT) {
|
||||
cfg80211_del_sta(vif->netdev, mac, GFP_KERNEL);
|
||||
cfg80211_del_sta(&vif->wdev, mac, GFP_KERNEL);
|
||||
sinfo->filled = 0;
|
||||
}
|
||||
}
|
||||
@@ -532,11 +532,11 @@ qtnf_dump_station(struct wiphy *wiphy, struct net_device *dev,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int qtnf_add_key(struct wiphy *wiphy, struct net_device *dev,
|
||||
static int qtnf_add_key(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
int link_id, u8 key_index, bool pairwise,
|
||||
const u8 *mac_addr, struct key_params *params)
|
||||
{
|
||||
struct qtnf_vif *vif = qtnf_netdev_get_priv(dev);
|
||||
struct qtnf_vif *vif = qtnf_netdev_get_priv(wdev->netdev);
|
||||
int ret;
|
||||
|
||||
ret = qtnf_cmd_send_add_key(vif, key_index, pairwise, mac_addr, params);
|
||||
@@ -548,11 +548,11 @@ static int qtnf_add_key(struct wiphy *wiphy, struct net_device *dev,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int qtnf_del_key(struct wiphy *wiphy, struct net_device *dev,
|
||||
static int qtnf_del_key(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
int link_id, u8 key_index, bool pairwise,
|
||||
const u8 *mac_addr)
|
||||
{
|
||||
struct qtnf_vif *vif = qtnf_netdev_get_priv(dev);
|
||||
struct qtnf_vif *vif = qtnf_netdev_get_priv(wdev->netdev);
|
||||
int ret;
|
||||
|
||||
ret = qtnf_cmd_send_del_key(vif, key_index, pairwise, mac_addr);
|
||||
@@ -587,10 +587,10 @@ static int qtnf_set_default_key(struct wiphy *wiphy, struct net_device *dev,
|
||||
}
|
||||
|
||||
static int
|
||||
qtnf_set_default_mgmt_key(struct wiphy *wiphy, struct net_device *dev,
|
||||
qtnf_set_default_mgmt_key(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
int link_id, u8 key_index)
|
||||
{
|
||||
struct qtnf_vif *vif = qtnf_netdev_get_priv(dev);
|
||||
struct qtnf_vif *vif = qtnf_netdev_get_priv(wdev->netdev);
|
||||
int ret;
|
||||
|
||||
ret = qtnf_cmd_send_set_default_mgmt_key(vif, key_index);
|
||||
@@ -602,10 +602,10 @@ qtnf_set_default_mgmt_key(struct wiphy *wiphy, struct net_device *dev,
|
||||
}
|
||||
|
||||
static int
|
||||
qtnf_change_station(struct wiphy *wiphy, struct net_device *dev,
|
||||
qtnf_change_station(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
const u8 *mac, struct station_parameters *params)
|
||||
{
|
||||
struct qtnf_vif *vif = qtnf_netdev_get_priv(dev);
|
||||
struct qtnf_vif *vif = qtnf_netdev_get_priv(wdev->netdev);
|
||||
int ret;
|
||||
|
||||
ret = qtnf_cmd_send_change_sta(vif, mac, params);
|
||||
@@ -617,14 +617,14 @@ qtnf_change_station(struct wiphy *wiphy, struct net_device *dev,
|
||||
}
|
||||
|
||||
static int
|
||||
qtnf_del_station(struct wiphy *wiphy, struct net_device *dev,
|
||||
qtnf_del_station(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
struct station_del_parameters *params)
|
||||
{
|
||||
struct qtnf_vif *vif = qtnf_netdev_get_priv(dev);
|
||||
struct qtnf_vif *vif = qtnf_netdev_get_priv(wdev->netdev);
|
||||
int ret;
|
||||
|
||||
if (params->mac &&
|
||||
(vif->wdev.iftype == NL80211_IFTYPE_AP) &&
|
||||
(wdev->iftype == NL80211_IFTYPE_AP) &&
|
||||
!is_broadcast_ether_addr(params->mac) &&
|
||||
!qtnf_sta_list_lookup(&vif->sta_list, params->mac))
|
||||
return 0;
|
||||
|
||||
@@ -90,8 +90,8 @@ qtnf_event_handle_sta_assoc(struct qtnf_wmac *mac, struct qtnf_vif *vif,
|
||||
goto out;
|
||||
}
|
||||
|
||||
cfg80211_new_sta(vif->netdev, sta_assoc->sta_addr, sinfo,
|
||||
GFP_KERNEL);
|
||||
cfg80211_new_sta(vif->netdev->ieee80211_ptr, sta_assoc->sta_addr,
|
||||
sinfo, GFP_KERNEL);
|
||||
|
||||
out:
|
||||
kfree(sinfo);
|
||||
@@ -126,7 +126,7 @@ qtnf_event_handle_sta_deauth(struct qtnf_wmac *mac, struct qtnf_vif *vif,
|
||||
sta_addr, reason);
|
||||
|
||||
if (qtnf_sta_list_del(vif, sta_addr))
|
||||
cfg80211_del_sta(vif->netdev, sta_deauth->sta_addr,
|
||||
cfg80211_del_sta(&vif->wdev, sta_deauth->sta_addr,
|
||||
GFP_KERNEL);
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -10965,13 +10965,13 @@ EXPORT_SYMBOL_GPL(rt2800_read_eeprom_efuse);
|
||||
|
||||
int rt2800_read_eeprom_nvmem(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
struct device_node *np = rt2x00dev->dev->of_node;
|
||||
struct device *dev = rt2x00dev->dev;
|
||||
unsigned int len = rt2x00dev->ops->eeprom_size;
|
||||
struct nvmem_cell *cell;
|
||||
const void *data;
|
||||
size_t retlen;
|
||||
|
||||
cell = of_nvmem_cell_get(np, "eeprom");
|
||||
cell = nvmem_cell_get(dev, "eeprom");
|
||||
if (IS_ERR(cell))
|
||||
return PTR_ERR(cell);
|
||||
|
||||
|
||||
@@ -337,7 +337,9 @@ static inline void hwsim_net_set_wmediumd(struct net *net, u32 portid)
|
||||
hwsim_net->wmediumd = portid;
|
||||
}
|
||||
|
||||
static struct class *hwsim_class;
|
||||
static const struct class hwsim_class = {
|
||||
.name = "mac80211_hwsim"
|
||||
};
|
||||
|
||||
static struct net_device *hwsim_mon; /* global monitor netdev */
|
||||
|
||||
@@ -715,6 +717,7 @@ struct mac80211_hwsim_data {
|
||||
} ps;
|
||||
bool ps_poll_pending;
|
||||
struct dentry *debugfs;
|
||||
struct cfg80211_chan_def radar_background_chandef;
|
||||
|
||||
atomic_t pending_cookie;
|
||||
struct sk_buff_head pending; /* packets pending */
|
||||
@@ -936,6 +939,7 @@ static const struct nla_policy hwsim_genl_policy[HWSIM_ATTR_MAX + 1] = {
|
||||
[HWSIM_ATTR_PMSR_RESULT] = NLA_POLICY_NESTED(hwsim_pmsr_peers_result_policy),
|
||||
[HWSIM_ATTR_MULTI_RADIO] = { .type = NLA_FLAG },
|
||||
[HWSIM_ATTR_SUPPORT_NAN_DEVICE] = { .type = NLA_FLAG },
|
||||
[HWSIM_ATTR_SUPPORT_BACKGROUND_RADAR] = { .type = NLA_FLAG },
|
||||
};
|
||||
|
||||
#if IS_REACHABLE(CONFIG_VIRTIO)
|
||||
@@ -1164,6 +1168,41 @@ static int hwsim_write_simulate_radar(void *dat, u64 val)
|
||||
DEFINE_DEBUGFS_ATTRIBUTE(hwsim_simulate_radar, NULL,
|
||||
hwsim_write_simulate_radar, "%llu\n");
|
||||
|
||||
static ssize_t hwsim_background_cac_write(struct file *file,
|
||||
const char __user *user_buf,
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
struct mac80211_hwsim_data *data = file->private_data;
|
||||
char buf[8] = {};
|
||||
|
||||
if (count >= sizeof(buf))
|
||||
return -EINVAL;
|
||||
|
||||
if (copy_from_user(buf, user_buf, count))
|
||||
return -EFAULT;
|
||||
|
||||
/* Check if background radar channel is configured */
|
||||
if (!data->radar_background_chandef.chan)
|
||||
return -ENOENT;
|
||||
|
||||
if (sysfs_streq(buf, "radar"))
|
||||
cfg80211_background_radar_event(data->hw->wiphy,
|
||||
&data->radar_background_chandef,
|
||||
GFP_KERNEL);
|
||||
else if (sysfs_streq(buf, "cancel"))
|
||||
cfg80211_background_cac_abort(data->hw->wiphy);
|
||||
else
|
||||
return -EINVAL;
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static const struct file_operations hwsim_background_cac_ops = {
|
||||
.write = hwsim_background_cac_write,
|
||||
.open = simple_open,
|
||||
.llseek = default_llseek,
|
||||
};
|
||||
|
||||
static int hwsim_fops_group_read(void *dat, u64 *val)
|
||||
{
|
||||
struct mac80211_hwsim_data *data = dat;
|
||||
@@ -1955,6 +1994,25 @@ mac80211_hwsim_select_tx_link(struct mac80211_hwsim_data *data,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static int mac80211_hwsim_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta,
|
||||
struct ieee80211_key_conf *key)
|
||||
{
|
||||
switch (key->cipher) {
|
||||
case WLAN_CIPHER_SUITE_CCMP:
|
||||
case WLAN_CIPHER_SUITE_CCMP_256:
|
||||
case WLAN_CIPHER_SUITE_GCMP:
|
||||
case WLAN_CIPHER_SUITE_GCMP_256:
|
||||
break;
|
||||
default:
|
||||
return 1;
|
||||
}
|
||||
|
||||
key->flags |= IEEE80211_KEY_FLAG_RESERVE_TAILROOM;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void mac80211_hwsim_tx(struct ieee80211_hw *hw,
|
||||
struct ieee80211_tx_control *control,
|
||||
struct sk_buff *skb)
|
||||
@@ -1965,7 +2023,7 @@ static void mac80211_hwsim_tx(struct ieee80211_hw *hw,
|
||||
struct ieee80211_chanctx_conf *chanctx_conf;
|
||||
struct ieee80211_channel *channel;
|
||||
struct ieee80211_vif *vif = txi->control.vif;
|
||||
bool ack;
|
||||
bool ack, unicast_data;
|
||||
enum nl80211_chan_width confbw = NL80211_CHAN_WIDTH_20_NOHT;
|
||||
u32 _portid, i;
|
||||
|
||||
@@ -1975,6 +2033,16 @@ static void mac80211_hwsim_tx(struct ieee80211_hw *hw,
|
||||
return;
|
||||
}
|
||||
|
||||
unicast_data = is_unicast_ether_addr(hdr->addr1) &&
|
||||
ieee80211_is_data(hdr->frame_control);
|
||||
|
||||
if (unicast_data && ieee80211_encrypt_tx_skb(skb) < 0) {
|
||||
ieee80211_free_txskb(hw, skb);
|
||||
return;
|
||||
}
|
||||
/* re-assign hdr since skb data may have shifted after encryption */
|
||||
hdr = (void *)skb->data;
|
||||
|
||||
if (vif && vif->type == NL80211_IFTYPE_NAN && !data->tmp_chan) {
|
||||
/* For NAN Device simulation purposes, assume that NAN is always
|
||||
* on channel 6 or channel 149, unless a ROC is in progress (for
|
||||
@@ -2060,6 +2128,13 @@ static void mac80211_hwsim_tx(struct ieee80211_hw *hw,
|
||||
}
|
||||
}
|
||||
|
||||
if (!unicast_data && ieee80211_encrypt_tx_skb(skb) < 0) {
|
||||
ieee80211_free_txskb(hw, skb);
|
||||
return;
|
||||
}
|
||||
/* re-assign hdr since skb data may have shifted after encryption */
|
||||
hdr = (void *)skb->data;
|
||||
|
||||
if (WARN(!channel, "TX w/o channel - queue = %d\n", txi->hw_queue)) {
|
||||
ieee80211_free_txskb(hw, skb);
|
||||
return;
|
||||
@@ -4078,7 +4153,7 @@ static int mac80211_hwsim_start_nan(struct ieee80211_hw *hw,
|
||||
ns_to_ktime(until_dw * NSEC_PER_USEC),
|
||||
HRTIMER_MODE_REL_SOFT);
|
||||
|
||||
if (conf->cluster_id && !is_zero_ether_addr(conf->cluster_id) &&
|
||||
if (!is_zero_ether_addr(conf->cluster_id) &&
|
||||
is_zero_ether_addr(hwsim_nan_cluster_id)) {
|
||||
memcpy(hwsim_nan_cluster_id, conf->cluster_id, ETH_ALEN);
|
||||
} else if (is_zero_ether_addr(hwsim_nan_cluster_id)) {
|
||||
@@ -4154,6 +4229,24 @@ static int mac80211_hwsim_change_nan_config(struct ieee80211_hw *hw,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mac80211_hwsim_set_radar_background(struct ieee80211_hw *hw,
|
||||
struct cfg80211_chan_def *chan)
|
||||
{
|
||||
struct mac80211_hwsim_data *data = hw->priv;
|
||||
|
||||
if (!wiphy_ext_feature_isset(hw->wiphy,
|
||||
NL80211_EXT_FEATURE_RADAR_BACKGROUND))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (chan)
|
||||
data->radar_background_chandef = *chan;
|
||||
else
|
||||
memset(&data->radar_background_chandef, 0,
|
||||
sizeof(data->radar_background_chandef));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_MAC80211_DEBUGFS
|
||||
#define HWSIM_DEBUGFS_OPS \
|
||||
.link_add_debugfs = mac80211_hwsim_link_add_debugfs,
|
||||
@@ -4189,6 +4282,8 @@ static int mac80211_hwsim_change_nan_config(struct ieee80211_hw *hw,
|
||||
.start_nan = mac80211_hwsim_start_nan, \
|
||||
.stop_nan = mac80211_hwsim_stop_nan, \
|
||||
.nan_change_conf = mac80211_hwsim_change_nan_config, \
|
||||
.set_radar_background = mac80211_hwsim_set_radar_background, \
|
||||
.set_key = mac80211_hwsim_set_key, \
|
||||
HWSIM_DEBUGFS_OPS
|
||||
|
||||
#define HWSIM_NON_MLO_OPS \
|
||||
@@ -4255,6 +4350,7 @@ struct hwsim_new_radio_params {
|
||||
bool mlo;
|
||||
const struct cfg80211_pmsr_capabilities *pmsr_capa;
|
||||
bool nan_device;
|
||||
bool background_radar;
|
||||
};
|
||||
|
||||
static void hwsim_mcast_config_msg(struct sk_buff *mcast_skb,
|
||||
@@ -4340,6 +4436,12 @@ static int append_radio_msg(struct sk_buff *skb, int id,
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (param->background_radar) {
|
||||
ret = nla_put_flag(skb, HWSIM_ATTR_SUPPORT_BACKGROUND_RADAR);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -5424,7 +5526,7 @@ static int mac80211_hwsim_new_radio(struct genl_info *info,
|
||||
data = hw->priv;
|
||||
data->hw = hw;
|
||||
|
||||
data->dev = device_create(hwsim_class, NULL, 0, hw, "hwsim%d", idx);
|
||||
data->dev = device_create(&hwsim_class, NULL, 0, hw, "hwsim%d", idx);
|
||||
if (IS_ERR(data->dev)) {
|
||||
printk(KERN_DEBUG
|
||||
"mac80211_hwsim: device_create failed (%ld)\n",
|
||||
@@ -5621,6 +5723,7 @@ static int mac80211_hwsim_new_radio(struct genl_info *info,
|
||||
WIPHY_FLAG_AP_UAPSD |
|
||||
WIPHY_FLAG_SUPPORTS_5_10_MHZ |
|
||||
WIPHY_FLAG_HAS_CHANNEL_SWITCH;
|
||||
hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
|
||||
hw->wiphy->features |= NL80211_FEATURE_ACTIVE_MONITOR |
|
||||
NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE |
|
||||
NL80211_FEATURE_STATIC_SMPS |
|
||||
@@ -5639,6 +5742,14 @@ static int mac80211_hwsim_new_radio(struct genl_info *info,
|
||||
NL80211_EXT_FEATURE_SCAN_MIN_PREQ_CONTENT);
|
||||
wiphy_ext_feature_set(hw->wiphy,
|
||||
NL80211_EXT_FEATURE_BSS_COLOR);
|
||||
wiphy_ext_feature_set(hw->wiphy,
|
||||
NL80211_EXT_FEATURE_SPP_AMSDU_SUPPORT);
|
||||
wiphy_ext_feature_set(hw->wiphy,
|
||||
NL80211_EXT_FEATURE_CAN_REPLACE_PTK0);
|
||||
wiphy_ext_feature_set(hw->wiphy,
|
||||
NL80211_EXT_FEATURE_EXT_KEY_ID);
|
||||
wiphy_ext_feature_set(hw->wiphy,
|
||||
NL80211_EXT_FEATURE_ASSOC_FRAME_ENCRYPTION);
|
||||
|
||||
hw->wiphy->interface_modes = param->iftypes;
|
||||
|
||||
@@ -5794,6 +5905,9 @@ static int mac80211_hwsim_new_radio(struct genl_info *info,
|
||||
|
||||
wiphy_ext_feature_set(hw->wiphy,
|
||||
NL80211_EXT_FEATURE_DFS_CONCURRENT);
|
||||
if (param->background_radar)
|
||||
wiphy_ext_feature_set(hw->wiphy,
|
||||
NL80211_EXT_FEATURE_RADAR_BACKGROUND);
|
||||
|
||||
if (param->no_vif)
|
||||
ieee80211_hw_set(hw, NO_AUTO_VIF);
|
||||
@@ -5832,6 +5946,10 @@ static int mac80211_hwsim_new_radio(struct genl_info *info,
|
||||
debugfs_create_file("dfs_simulate_radar", 0222,
|
||||
data->debugfs,
|
||||
data, &hwsim_simulate_radar);
|
||||
if (param->background_radar)
|
||||
debugfs_create_file("dfs_background_cac", 0200,
|
||||
data->debugfs,
|
||||
data, &hwsim_background_cac_ops);
|
||||
|
||||
if (param->pmsr_capa) {
|
||||
data->pmsr_capa = *param->pmsr_capa;
|
||||
@@ -5950,6 +6068,9 @@ static int mac80211_hwsim_get_radio(struct sk_buff *skb,
|
||||
param.channels = data->channels;
|
||||
param.hwname = wiphy_name(data->hw->wiphy);
|
||||
param.pmsr_capa = &data->pmsr_capa;
|
||||
param.background_radar =
|
||||
wiphy_ext_feature_isset(data->hw->wiphy,
|
||||
NL80211_EXT_FEATURE_RADAR_BACKGROUND);
|
||||
|
||||
res = append_radio_msg(skb, data->idx, ¶m);
|
||||
if (res < 0)
|
||||
@@ -5978,7 +6099,7 @@ static void mac80211_hwsim_free(void)
|
||||
spin_lock_bh(&hwsim_radio_lock);
|
||||
}
|
||||
spin_unlock_bh(&hwsim_radio_lock);
|
||||
class_destroy(hwsim_class);
|
||||
class_unregister(&hwsim_class);
|
||||
}
|
||||
|
||||
static const struct net_device_ops hwsim_netdev_ops = {
|
||||
@@ -6387,6 +6508,9 @@ static int hwsim_new_radio_nl(struct sk_buff *msg, struct genl_info *info)
|
||||
if (info->attrs[HWSIM_ATTR_MULTI_RADIO])
|
||||
param.multi_radio = true;
|
||||
|
||||
if (info->attrs[HWSIM_ATTR_SUPPORT_BACKGROUND_RADAR])
|
||||
param.background_radar = true;
|
||||
|
||||
if (info->attrs[HWSIM_ATTR_REG_HINT_ALPHA2])
|
||||
param.reg_alpha2 =
|
||||
nla_data(info->attrs[HWSIM_ATTR_REG_HINT_ALPHA2]);
|
||||
@@ -7083,11 +7207,9 @@ static int __init init_mac80211_hwsim(void)
|
||||
if (err)
|
||||
goto out_exit_netlink;
|
||||
|
||||
hwsim_class = class_create("mac80211_hwsim");
|
||||
if (IS_ERR(hwsim_class)) {
|
||||
err = PTR_ERR(hwsim_class);
|
||||
err = class_register(&hwsim_class);
|
||||
if (err)
|
||||
goto out_exit_virtio;
|
||||
}
|
||||
|
||||
hwsim_init_s1g_channels(hwsim_channels_s1g);
|
||||
|
||||
@@ -7165,6 +7287,7 @@ static int __init init_mac80211_hwsim(void)
|
||||
param.p2p_device = support_p2p_device;
|
||||
param.mlo = mlo;
|
||||
param.multi_radio = multi_radio;
|
||||
param.background_radar = true;
|
||||
param.use_chanctx = channels > 1 || mlo || multi_radio;
|
||||
param.iftypes = HWSIM_IFTYPE_SUPPORT_MASK;
|
||||
if (param.p2p_device)
|
||||
|
||||
@@ -161,6 +161,7 @@ enum hwsim_commands {
|
||||
* Adds one radio for each band. Number of supported channels will be set for
|
||||
* each radio instead of for the wiphy.
|
||||
* @HWSIM_ATTR_SUPPORT_NAN_DEVICE: support NAN Device virtual interface (flag)
|
||||
* @HWSIM_ATTR_SUPPORT_BACKGROUND_RADAR: background radar/CAC support (flag)
|
||||
* @__HWSIM_ATTR_MAX: enum limit
|
||||
*/
|
||||
enum hwsim_attrs {
|
||||
@@ -195,6 +196,7 @@ enum hwsim_attrs {
|
||||
HWSIM_ATTR_PMSR_RESULT,
|
||||
HWSIM_ATTR_MULTI_RADIO,
|
||||
HWSIM_ATTR_SUPPORT_NAN_DEVICE,
|
||||
HWSIM_ATTR_SUPPORT_BACKGROUND_RADAR,
|
||||
__HWSIM_ATTR_MAX,
|
||||
};
|
||||
#define HWSIM_ATTR_MAX (__HWSIM_ATTR_MAX - 1)
|
||||
|
||||
@@ -320,9 +320,11 @@ static int virt_wifi_disconnect(struct wiphy *wiphy, struct net_device *netdev,
|
||||
}
|
||||
|
||||
/* Called with the rtnl lock held. */
|
||||
static int virt_wifi_get_station(struct wiphy *wiphy, struct net_device *dev,
|
||||
const u8 *mac, struct station_info *sinfo)
|
||||
static int virt_wifi_get_station(struct wiphy *wiphy,
|
||||
struct wireless_dev *wdev, const u8 *mac,
|
||||
struct station_info *sinfo)
|
||||
{
|
||||
struct net_device *dev = wdev->netdev;
|
||||
struct virt_wifi_netdev_priv *priv = netdev_priv(dev);
|
||||
|
||||
wiphy_debug(wiphy, "get_station\n");
|
||||
@@ -345,10 +347,10 @@ static int virt_wifi_get_station(struct wiphy *wiphy, struct net_device *dev,
|
||||
}
|
||||
|
||||
/* Called with the rtnl lock held. */
|
||||
static int virt_wifi_dump_station(struct wiphy *wiphy, struct net_device *dev,
|
||||
static int virt_wifi_dump_station(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
int idx, u8 *mac, struct station_info *sinfo)
|
||||
{
|
||||
struct virt_wifi_netdev_priv *priv = netdev_priv(dev);
|
||||
struct virt_wifi_netdev_priv *priv = netdev_priv(wdev->netdev);
|
||||
|
||||
wiphy_debug(wiphy, "dump_station\n");
|
||||
|
||||
@@ -356,7 +358,7 @@ static int virt_wifi_dump_station(struct wiphy *wiphy, struct net_device *dev,
|
||||
return -ENOENT;
|
||||
|
||||
ether_addr_copy(mac, fake_router_bssid);
|
||||
return virt_wifi_get_station(wiphy, dev, fake_router_bssid, sinfo);
|
||||
return virt_wifi_get_station(wiphy, wdev, fake_router_bssid, sinfo);
|
||||
}
|
||||
|
||||
static const struct cfg80211_ops virt_wifi_cfg80211_ops = {
|
||||
|
||||
@@ -831,7 +831,7 @@ static int rtw_cfg80211_set_encryption(struct net_device *dev, struct ieee_param
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int cfg80211_rtw_add_key(struct wiphy *wiphy, struct net_device *ndev,
|
||||
static int cfg80211_rtw_add_key(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
int link_id, u8 key_index, bool pairwise,
|
||||
const u8 *mac_addr, struct key_params *params)
|
||||
{
|
||||
@@ -839,6 +839,7 @@ static int cfg80211_rtw_add_key(struct wiphy *wiphy, struct net_device *ndev,
|
||||
u32 param_len;
|
||||
struct ieee_param *param = NULL;
|
||||
int ret = 0;
|
||||
struct net_device *ndev = wdev->netdev;
|
||||
struct adapter *padapter = rtw_netdev_priv(ndev);
|
||||
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
|
||||
|
||||
@@ -909,7 +910,7 @@ static int cfg80211_rtw_add_key(struct wiphy *wiphy, struct net_device *ndev,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int cfg80211_rtw_get_key(struct wiphy *wiphy, struct net_device *ndev,
|
||||
static int cfg80211_rtw_get_key(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
int link_id, u8 key_index, bool pairwise,
|
||||
const u8 *mac_addr, void *cookie,
|
||||
void (*callback)(void *cookie,
|
||||
@@ -918,11 +919,11 @@ static int cfg80211_rtw_get_key(struct wiphy *wiphy, struct net_device *ndev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cfg80211_rtw_del_key(struct wiphy *wiphy, struct net_device *ndev,
|
||||
static int cfg80211_rtw_del_key(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
int link_id, u8 key_index, bool pairwise,
|
||||
const u8 *mac_addr)
|
||||
{
|
||||
struct adapter *padapter = rtw_netdev_priv(ndev);
|
||||
struct adapter *padapter = rtw_netdev_priv(wdev->netdev);
|
||||
struct security_priv *psecuritypriv = &padapter->securitypriv;
|
||||
|
||||
if (key_index == psecuritypriv->dot11PrivacyKeyIndex) {
|
||||
@@ -960,11 +961,12 @@ static int cfg80211_rtw_set_default_key(struct wiphy *wiphy,
|
||||
}
|
||||
|
||||
static int cfg80211_rtw_get_station(struct wiphy *wiphy,
|
||||
struct net_device *ndev,
|
||||
struct wireless_dev *wdev,
|
||||
const u8 *mac,
|
||||
struct station_info *sinfo)
|
||||
{
|
||||
int ret = 0;
|
||||
struct net_device *ndev = wdev_to_ndev(wdev);
|
||||
struct adapter *padapter = rtw_netdev_priv(ndev);
|
||||
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
|
||||
struct sta_info *psta = NULL;
|
||||
@@ -1912,7 +1914,7 @@ static int cfg80211_rtw_flush_pmksa(struct wiphy *wiphy,
|
||||
|
||||
void rtw_cfg80211_indicate_sta_assoc(struct adapter *padapter, u8 *pmgmt_frame, uint frame_len)
|
||||
{
|
||||
struct net_device *ndev = padapter->pnetdev;
|
||||
struct wireless_dev *wdev = padapter->rtw_wdev;
|
||||
|
||||
{
|
||||
struct station_info sinfo = {};
|
||||
@@ -1926,15 +1928,15 @@ void rtw_cfg80211_indicate_sta_assoc(struct adapter *padapter, u8 *pmgmt_frame,
|
||||
sinfo.filled = 0;
|
||||
sinfo.assoc_req_ies = pmgmt_frame + WLAN_HDR_A3_LEN + ie_offset;
|
||||
sinfo.assoc_req_ies_len = frame_len - WLAN_HDR_A3_LEN - ie_offset;
|
||||
cfg80211_new_sta(ndev, GetAddr2Ptr(pmgmt_frame), &sinfo, GFP_ATOMIC);
|
||||
cfg80211_new_sta(wdev, GetAddr2Ptr(pmgmt_frame), &sinfo, GFP_ATOMIC);
|
||||
}
|
||||
}
|
||||
|
||||
void rtw_cfg80211_indicate_sta_disassoc(struct adapter *padapter, unsigned char *da, unsigned short reason)
|
||||
{
|
||||
struct net_device *ndev = padapter->pnetdev;
|
||||
struct wireless_dev *wdev = padapter->rtw_wdev;
|
||||
|
||||
cfg80211_del_sta(ndev, da, GFP_ATOMIC);
|
||||
cfg80211_del_sta(wdev, da, GFP_ATOMIC);
|
||||
}
|
||||
|
||||
static u8 rtw_get_chan_type(struct adapter *adapter)
|
||||
@@ -2323,21 +2325,22 @@ static int cfg80211_rtw_stop_ap(struct wiphy *wiphy, struct net_device *ndev,
|
||||
}
|
||||
|
||||
static int cfg80211_rtw_add_station(struct wiphy *wiphy,
|
||||
struct net_device *ndev,
|
||||
struct wireless_dev *wdev,
|
||||
const u8 *mac,
|
||||
struct station_parameters *params)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cfg80211_rtw_del_station(struct wiphy *wiphy, struct net_device *ndev,
|
||||
static int cfg80211_rtw_del_station(struct wiphy *wiphy,
|
||||
struct wireless_dev *wdev,
|
||||
struct station_del_parameters *params)
|
||||
{
|
||||
int ret = 0;
|
||||
struct list_head *phead, *plist, *tmp;
|
||||
u8 updated = false;
|
||||
struct sta_info *psta = NULL;
|
||||
struct adapter *padapter = rtw_netdev_priv(ndev);
|
||||
struct adapter *padapter = rtw_netdev_priv(wdev->netdev);
|
||||
struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
|
||||
struct sta_priv *pstapriv = &padapter->stapriv;
|
||||
const u8 *mac = params->mac;
|
||||
@@ -2388,7 +2391,7 @@ static int cfg80211_rtw_del_station(struct wiphy *wiphy, struct net_device *ndev
|
||||
}
|
||||
|
||||
static int cfg80211_rtw_change_station(struct wiphy *wiphy,
|
||||
struct net_device *ndev,
|
||||
struct wireless_dev *wdev,
|
||||
const u8 *mac,
|
||||
struct station_parameters *params)
|
||||
{
|
||||
@@ -2416,12 +2419,12 @@ static struct sta_info *rtw_sta_info_get_by_idx(const int idx, struct sta_priv *
|
||||
}
|
||||
|
||||
static int cfg80211_rtw_dump_station(struct wiphy *wiphy,
|
||||
struct net_device *ndev,
|
||||
struct wireless_dev *wdev,
|
||||
int idx, u8 *mac,
|
||||
struct station_info *sinfo)
|
||||
{
|
||||
int ret = 0;
|
||||
struct adapter *padapter = rtw_netdev_priv(ndev);
|
||||
struct adapter *padapter = rtw_netdev_priv(wdev_to_ndev(wdev));
|
||||
struct sta_info *psta = NULL;
|
||||
struct sta_priv *pstapriv = &padapter->stapriv;
|
||||
|
||||
|
||||
@@ -29,11 +29,216 @@ struct ieee80211_uhr_operation {
|
||||
#define IEEE80211_UHR_NPCA_PARAMS_MOPLEN 0x00400000
|
||||
#define IEEE80211_UHR_NPCA_PARAMS_DIS_SUBCH_BMAP_PRES 0x00800000
|
||||
|
||||
/**
|
||||
* struct ieee80211_uhr_npca_info - npca operation information
|
||||
*
|
||||
* This structure is the "NPCA Operation Parameters field format" of "UHR
|
||||
* Operation Element" fields as described in P802.11bn_D1.3
|
||||
* subclause 9.4.2.353. See Figure 9-aa4.
|
||||
*
|
||||
* Refer to IEEE80211_UHR_NPCA*
|
||||
* @params:
|
||||
* NPCA Primary Channel - NPCA primary channel
|
||||
* NPCA_Min Duration Threshold - Minimum duration of inter-BSS activity
|
||||
* NPCA Switching Delay -
|
||||
* Time needed by an NPCA AP to switch from the
|
||||
* BSS primary channel to the NPCA primary channel
|
||||
* in the unit of 4 µs.
|
||||
* NPCA Switching Back Delay -
|
||||
* Time to switch from the NPCA primary channel
|
||||
* to the BSS primary channel in the unit of 4 µs.
|
||||
* NPCA Initial QSRC -
|
||||
* Initialize the EDCAF QSRC[AC] variables
|
||||
* when an NPCA STA in the BSS
|
||||
* switches to NPCA operation.
|
||||
* NPCA MOPLEN -
|
||||
* Indicates which conditions can be used to
|
||||
* initiate an NPCA operation,
|
||||
* 1 -> both PHYLEN NPCA operation and MOPLEN
|
||||
* NPCA operation are
|
||||
* permitted in the BSS
|
||||
* 0 -> only PHYLEN NPCA operation is allowed in the BSS.
|
||||
* NPCA Disabled Subchannel Bitmap Present -
|
||||
* Indicates whether the NPCA Disabled Subchannel
|
||||
* Bitmap field is present. A 1 in this field indicates that
|
||||
* the NPCA Disabled Subchannel Bitmap field is present
|
||||
* @dis_subch_bmap:
|
||||
* A bit in the bitmap that lies within the BSS bandwidth is set
|
||||
* to 1 to indicate that the corresponding 20 MHz subchannel is
|
||||
* punctured and is set to 0 to indicate that the corresponding
|
||||
* 20 MHz subchannel is not punctured. A bit in the bitmap that
|
||||
* falls outside of the BSS bandwidth is reserved. This field is
|
||||
* present when the value of the NPCA Disabled Subchannel Bitmap
|
||||
* Field Present field is equal to 1, and not present, otherwise
|
||||
*/
|
||||
struct ieee80211_uhr_npca_info {
|
||||
__le32 params;
|
||||
__le16 dis_subch_bmap[];
|
||||
} __packed;
|
||||
|
||||
#define IEEE80211_UHR_DPS_PADDING_DELAY 0x0000003F
|
||||
#define IEEE80211_UHR_DPS_TRANSITION_DELAY 0x00003F00
|
||||
#define IEEE80211_UHR_DPS_ICF_REQUIRED 0x00010000
|
||||
#define IEEE80211_UHR_DPS_PARAMETERIZED_FLAG 0x00020000
|
||||
#define IEEE80211_UHR_DPS_LC_MODE_BW 0x001C0000
|
||||
#define IEEE80211_UHR_DPS_LC_MODE_NSS 0x01E00000
|
||||
#define IEEE80211_UHR_DPS_LC_MODE_MCS 0x1E000000
|
||||
#define IEEE80211_UHR_DPS_MOBILE_AP_DPS_STATIC_HCM 0x20000000
|
||||
|
||||
/**
|
||||
* struct ieee80211_uhr_dps_info - DPS operation information
|
||||
*
|
||||
* This structure is the "DPS Operation Parameter field" of "UHR
|
||||
* Operation Element" fields as described in P802.11bn_D1.3
|
||||
* subclause 9.4.1.87. See Figure 9-207u.
|
||||
*
|
||||
* Refer to IEEE80211_UHR_DPS*
|
||||
* @params:
|
||||
* DPS Padding Delay -
|
||||
* Indicates the minimum MAC padding
|
||||
* duration that is required by a DPS STA
|
||||
* in an ICF to cause the STA to transition
|
||||
* from the lower capability mode to the
|
||||
* higher capability mode. The DPS Padding
|
||||
* Delay field is in units of 4 µs.
|
||||
* DPS Transition Delay -
|
||||
* Indicates the amount of time required by a
|
||||
* DPS STA to transition from the higher
|
||||
* capability mode to the lower capability
|
||||
* mode. The DPS Transition Delay field is in
|
||||
* units of 4 µs.
|
||||
* ICF Required -
|
||||
* Indicates when the DPS assisting STA needs
|
||||
* to transmit an ICF frame to the peer DPS STA
|
||||
* before performing the frame exchanges with
|
||||
* the peer DPS STA in a TXOP.
|
||||
* 1 -> indicates that the transmission of the
|
||||
* ICF frame to the peer DPS STA prior to
|
||||
* any frame exchange is needed.
|
||||
* 0 -> ICF transmission before the frame
|
||||
* exchanges with the peer DPS STA is only
|
||||
* needed if the frame exchange is performed
|
||||
* in the HC mode.
|
||||
* Parameterized Flag -
|
||||
* 0 -> indicates that only 20 MHz, 1 SS,
|
||||
* non-HT PPDU format with the data
|
||||
* rate of 6, 12, and 24 Mb/s as the
|
||||
* default mode are supported by the
|
||||
* DPS STA in the LC mode
|
||||
* 1 -> indicates that a bandwidth up to the
|
||||
* bandwidth indicated in the LC Mode
|
||||
* Bandwidth field, a number of spatial
|
||||
* streams up to the NSS indicated in
|
||||
* the LC Mode Nss field, and an MCS up
|
||||
* to the MCS indicated in the LC Mode
|
||||
* MCS fields are supported by the DPS
|
||||
* STA in the LC mode as the
|
||||
* parameterized mode.
|
||||
* LC Mode Bandwidth -
|
||||
* Indicates the maximum bandwidth supported
|
||||
* by the STA in the LC mode.
|
||||
* LC Mode NSS -
|
||||
* Indicates the maximum number of the spatial
|
||||
* streams supported by the STA in the LC mode.
|
||||
* LC Mode MCS -
|
||||
* Indicates the highest MCS supported by the STA
|
||||
* in the LC mode.
|
||||
* Mobile AP DPS Static HCM -
|
||||
* 1 -> indicates that it will remain in the DPS high
|
||||
* capability mode until the next TBTT on that
|
||||
* link.
|
||||
* 0 -> otherwise.
|
||||
*/
|
||||
struct ieee80211_uhr_dps_info {
|
||||
__le32 params;
|
||||
} __packed;
|
||||
|
||||
#define IEEE80211_UHR_DBE_OPER_BANDWIDTH 0x07
|
||||
#define IEEE80211_UHR_DBE_OPER_DIS_SUBCHANNEL_BITMAP_PRES 0x08
|
||||
|
||||
/**
|
||||
* enum ieee80211_uhr_dbe_oper_bw - DBE Operational Bandwidth
|
||||
*
|
||||
* Encoding for the DBE Operational Bandwidth field in the UHR Operation
|
||||
* element (DBE Operation Parameters).
|
||||
*
|
||||
* @IEEE80211_UHR_DBE_OPER_BW_40: 40 MHz operational DBE bandwidth
|
||||
* @IEEE80211_UHR_DBE_OPER_BW_80: 80 MHz operational DBE bandwidth
|
||||
* @IEEE80211_UHR_DBE_OPER_BW_160: 160 MHz operational DBE bandwidth
|
||||
* @IEEE80211_UHR_DBE_OPER_BW_320_1: 320-1 MHz operational DBE bandwidth
|
||||
* @IEEE80211_UHR_DBE_OPER_BW_320_2: 320-2 MHz operational DBE bandwidth
|
||||
*/
|
||||
enum ieee80211_uhr_dbe_oper_bw {
|
||||
IEEE80211_UHR_DBE_OPER_BW_40 = 1,
|
||||
IEEE80211_UHR_DBE_OPER_BW_80 = 2,
|
||||
IEEE80211_UHR_DBE_OPER_BW_160 = 3,
|
||||
IEEE80211_UHR_DBE_OPER_BW_320_1 = 4,
|
||||
IEEE80211_UHR_DBE_OPER_BW_320_2 = 5,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct ieee80211_uhr_dbe_info - DBE operation information
|
||||
*
|
||||
* This structure is the "DBE Operation Parameters field" of
|
||||
* "UHR Operation Element" fields as described in P802.11bn_D1.3
|
||||
* subclause 9.4.2.353. See Figure 9-aa6.
|
||||
*
|
||||
* Refer to IEEE80211_UHR_DBE_OPER*
|
||||
* @params:
|
||||
* B0-B2 - DBE Operational Bandwidth field, see
|
||||
* "enum ieee80211_uhr_dbe_oper_bw" for values.
|
||||
* Value 0 is reserved.
|
||||
* Value 1 indicates 40 MHz operational DBE bandwidth.
|
||||
* Value 2 indicates 80 MHz operational DBE bandwidth.
|
||||
* Value 3 indicates 160 MHz operational DBE bandwidth.
|
||||
* Value 4 indicates 320-1 MHz operational DBE bandwidth.
|
||||
* Value 5 indicates 320-2 MHz operational DBE bandwidth.
|
||||
* Values 6 to 7 are reserved.
|
||||
* B3 - DBE Disabled Subchannel Bitmap Present.
|
||||
* @dis_subch_bmap: DBE Disabled Subchannel Bitmap field is set to indicate
|
||||
* disabled 20 MHz subchannels within the DBE Bandwidth.
|
||||
*/
|
||||
struct ieee80211_uhr_dbe_info {
|
||||
u8 params;
|
||||
__le16 dis_subch_bmap[];
|
||||
} __packed;
|
||||
|
||||
#define IEEE80211_UHR_P_EDCA_ECWMIN 0x0F
|
||||
#define IEEE80211_UHR_P_EDCA_ECWMAX 0xF0
|
||||
#define IEEE80211_UHR_P_EDCA_AIFSN 0x000F
|
||||
#define IEEE80211_UHR_P_EDCA_CW_DS 0x0030
|
||||
#define IEEE80211_UHR_P_EDCA_PSRC_THRESHOLD 0x01C0
|
||||
#define IEEE80211_UHR_P_EDCA_QSRC_THRESHOLD 0x0600
|
||||
|
||||
/**
|
||||
* struct ieee80211_uhr_p_edca_info - P-EDCA operation information
|
||||
*
|
||||
* This structure is the "P-EDCA Operation Parameters field" of
|
||||
* "UHR Operation Element" fields as described in P802.11bn_D1.3
|
||||
* subclause 9.4.2.353. See Figure 9-aa5.
|
||||
*
|
||||
* Refer to IEEE80211_UHR_P_EDCA*
|
||||
* @p_edca_ec: P-EDCA ECWmin and ECWmax.
|
||||
* These fields indicate the CWmin and CWmax values used by a
|
||||
* P-EDCA STA during P-EDCA contention.
|
||||
* @params: AIFSN, CW DS, PSRC threshold, and QSRC threshold.
|
||||
* - The AIFSN field indicates the AIFSN value used by a P-EDCA STA
|
||||
* during P-EDCA contention.
|
||||
* - The CW DS field indicates the value used for randomization of the
|
||||
* transmission slot of the DS-CTS frame. The value 3 is reserved.
|
||||
* The value 0 indicates that randomization is not enabled.
|
||||
* - The P-EDCA PSRC threshold field indicates the maximum number of
|
||||
* allowed consecutive DS-CTS transmissions. The value 0 and values
|
||||
* greater than 4 are reserved.
|
||||
* - The P-EDCA QSRC threshold field indicates the value of the
|
||||
* QSRC[AC_VO] counter required to start P-EDCA contention. The
|
||||
* value 0 is reserved.
|
||||
*/
|
||||
struct ieee80211_uhr_p_edca_info {
|
||||
u8 p_edca_ec;
|
||||
__le16 params;
|
||||
} __packed;
|
||||
|
||||
static inline bool ieee80211_uhr_oper_size_ok(const u8 *data, u8 len,
|
||||
bool beacon)
|
||||
{
|
||||
@@ -47,19 +252,52 @@ static inline bool ieee80211_uhr_oper_size_ok(const u8 *data, u8 len,
|
||||
if (beacon)
|
||||
return true;
|
||||
|
||||
/* FIXME: DPS, DBE, P-EDCA (consider order, also relative to NPCA) */
|
||||
/* DPS Operation Parameters (fixed 4 bytes) */
|
||||
if (oper->params & cpu_to_le16(IEEE80211_UHR_OPER_PARAMS_DPS_ENA)) {
|
||||
needed += sizeof(struct ieee80211_uhr_dps_info);
|
||||
if (len < needed)
|
||||
return false;
|
||||
}
|
||||
|
||||
/* NPCA Operation Parameters (fixed 4 bytes + optional 2 bytes) */
|
||||
if (oper->params & cpu_to_le16(IEEE80211_UHR_OPER_PARAMS_NPCA_ENA)) {
|
||||
const struct ieee80211_uhr_npca_info *npca =
|
||||
(const void *)oper->variable;
|
||||
(const void *)(data + needed);
|
||||
|
||||
needed += sizeof(*npca);
|
||||
|
||||
if (len < needed)
|
||||
return false;
|
||||
|
||||
if (npca->params & cpu_to_le32(IEEE80211_UHR_NPCA_PARAMS_DIS_SUBCH_BMAP_PRES))
|
||||
if (npca->params &
|
||||
cpu_to_le32(IEEE80211_UHR_NPCA_PARAMS_DIS_SUBCH_BMAP_PRES)) {
|
||||
needed += sizeof(npca->dis_subch_bmap[0]);
|
||||
if (len < needed)
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/* P-EDCA Operation Parameters (fixed 3 bytes) */
|
||||
if (oper->params & cpu_to_le16(IEEE80211_UHR_OPER_PARAMS_PEDCA_ENA)) {
|
||||
needed += sizeof(struct ieee80211_uhr_p_edca_info);
|
||||
if (len < needed)
|
||||
return false;
|
||||
}
|
||||
|
||||
/* DBE Operation Parameters (fixed 1 byte + optional 2 bytes) */
|
||||
if (oper->params & cpu_to_le16(IEEE80211_UHR_OPER_PARAMS_DBE_ENA)) {
|
||||
const struct ieee80211_uhr_dbe_info *dbe =
|
||||
(const void *)(data + needed);
|
||||
|
||||
needed += sizeof(*dbe);
|
||||
if (len < needed)
|
||||
return false;
|
||||
|
||||
if (dbe->params &
|
||||
IEEE80211_UHR_DBE_OPER_DIS_SUBCHANNEL_BITMAP_PRES) {
|
||||
needed += sizeof(dbe->dis_subch_bmap[0]);
|
||||
if (len < needed)
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return len >= needed;
|
||||
@@ -72,12 +310,15 @@ static inline bool ieee80211_uhr_oper_size_ok(const u8 *data, u8 len,
|
||||
static inline const struct ieee80211_uhr_npca_info *
|
||||
ieee80211_uhr_npca_info(const struct ieee80211_uhr_operation *oper)
|
||||
{
|
||||
const u8 *pos = oper->variable;
|
||||
|
||||
if (!(oper->params & cpu_to_le16(IEEE80211_UHR_OPER_PARAMS_NPCA_ENA)))
|
||||
return NULL;
|
||||
|
||||
/* FIXME: DPS */
|
||||
if (oper->params & cpu_to_le16(IEEE80211_UHR_OPER_PARAMS_DPS_ENA))
|
||||
pos += sizeof(struct ieee80211_uhr_dps_info);
|
||||
|
||||
return (const void *)oper->variable;
|
||||
return (const void *)pos;
|
||||
}
|
||||
|
||||
static inline const __le16 *
|
||||
@@ -131,6 +372,24 @@ ieee80211_uhr_npca_dis_subch_bitmap(const struct ieee80211_uhr_operation *oper)
|
||||
#define IEEE80211_UHR_MAC_CAP_DBE_EHT_MCS_MAP_160_PRES 0x08
|
||||
#define IEEE80211_UHR_MAC_CAP_DBE_EHT_MCS_MAP_320_PRES 0x10
|
||||
|
||||
/**
|
||||
* enum ieee80211_uhr_dbe_max_supported_bw - DBE Maximum Supported Bandwidth
|
||||
*
|
||||
* As per spec P802.11bn_D1.3 "Table 9-bb5—Encoding of the DBE Maximum
|
||||
* Supported Bandwidth field".
|
||||
*
|
||||
* @IEEE80211_UHR_DBE_MAX_BW_40: Indicates 40 MHz DBE max supported bw
|
||||
* @IEEE80211_UHR_DBE_MAX_BW_80: Indicates 80 MHz DBE max supported bw
|
||||
* @IEEE80211_UHR_DBE_MAX_BW_160: Indicates 160 MHz DBE max supported bw
|
||||
* @IEEE80211_UHR_DBE_MAX_BW_320: Indicates 320 MHz DBE max supported bw
|
||||
*/
|
||||
enum ieee80211_uhr_dbe_max_supported_bw {
|
||||
IEEE80211_UHR_DBE_MAX_BW_40 = 1,
|
||||
IEEE80211_UHR_DBE_MAX_BW_80 = 2,
|
||||
IEEE80211_UHR_DBE_MAX_BW_160 = 3,
|
||||
IEEE80211_UHR_DBE_MAX_BW_320 = 4,
|
||||
};
|
||||
|
||||
struct ieee80211_uhr_cap_mac {
|
||||
u8 mac_cap[5];
|
||||
} __packed;
|
||||
|
||||
@@ -1358,6 +1358,7 @@ struct ieee80211_tdls_data {
|
||||
#define WLAN_AUTH_FILS_SK 4
|
||||
#define WLAN_AUTH_FILS_SK_PFS 5
|
||||
#define WLAN_AUTH_FILS_PK 6
|
||||
#define WLAN_AUTH_IEEE8021X 8
|
||||
#define WLAN_AUTH_EPPKE 9
|
||||
#define WLAN_AUTH_LEAP 128
|
||||
|
||||
@@ -1507,6 +1508,7 @@ enum ieee80211_statuscode {
|
||||
WLAN_STATUS_SAE_PK = 127,
|
||||
WLAN_STATUS_DENIED_TID_TO_LINK_MAPPING = 133,
|
||||
WLAN_STATUS_PREF_TID_TO_LINK_MAPPING_SUGGESTED = 134,
|
||||
WLAN_STATUS_8021X_AUTH_SUCCESS = 153,
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -190,6 +190,8 @@ enum ieee80211_channel_flags {
|
||||
* on this channel.
|
||||
* @dfs_state_entered: timestamp (jiffies) when the dfs state was entered.
|
||||
* @dfs_cac_ms: DFS CAC time in milliseconds, this is valid for DFS channels.
|
||||
* @cac_start_time: timestamp (CLOCK_BOOTTIME, nanoseconds) when CAC was
|
||||
* started on this channel. Zero when CAC is not in progress.
|
||||
* @psd: power spectral density (in dBm)
|
||||
*/
|
||||
struct ieee80211_channel {
|
||||
@@ -207,6 +209,7 @@ struct ieee80211_channel {
|
||||
enum nl80211_dfs_state dfs_state;
|
||||
unsigned long dfs_state_entered;
|
||||
unsigned int dfs_cac_ms;
|
||||
u64 cac_start_time;
|
||||
s8 psd;
|
||||
};
|
||||
|
||||
@@ -4020,7 +4023,6 @@ struct cfg80211_nan_band_config {
|
||||
* (i.e. BIT(NL80211_BAND_2GHZ)).
|
||||
* @cluster_id: cluster ID used for NAN synchronization. This is a MAC address
|
||||
* that can take a value from 50-6F-9A-01-00-00 to 50-6F-9A-01-FF-FF.
|
||||
* If NULL, the device will pick a random Cluster ID.
|
||||
* @scan_period: period (in seconds) between NAN scans.
|
||||
* @scan_dwell_time: dwell time (in milliseconds) for NAN scans.
|
||||
* @discovery_beacon_interval: interval (in TUs) for discovery beacons.
|
||||
@@ -4036,7 +4038,7 @@ struct cfg80211_nan_band_config {
|
||||
struct cfg80211_nan_conf {
|
||||
u8 master_pref;
|
||||
u8 bands;
|
||||
const u8 *cluster_id;
|
||||
u8 cluster_id[ETH_ALEN] __aligned(2);
|
||||
u16 scan_period;
|
||||
u16 scan_dwell_time;
|
||||
u8 discovery_beacon_interval;
|
||||
@@ -4922,24 +4924,24 @@ struct cfg80211_ops {
|
||||
struct wireless_dev *wdev,
|
||||
unsigned int link_id);
|
||||
|
||||
int (*add_key)(struct wiphy *wiphy, struct net_device *netdev,
|
||||
int (*add_key)(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
int link_id, u8 key_index, bool pairwise,
|
||||
const u8 *mac_addr, struct key_params *params);
|
||||
int (*get_key)(struct wiphy *wiphy, struct net_device *netdev,
|
||||
int (*get_key)(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
int link_id, u8 key_index, bool pairwise,
|
||||
const u8 *mac_addr, void *cookie,
|
||||
void (*callback)(void *cookie, struct key_params*));
|
||||
int (*del_key)(struct wiphy *wiphy, struct net_device *netdev,
|
||||
int (*del_key)(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
int link_id, u8 key_index, bool pairwise,
|
||||
const u8 *mac_addr);
|
||||
int (*set_default_key)(struct wiphy *wiphy,
|
||||
struct net_device *netdev, int link_id,
|
||||
u8 key_index, bool unicast, bool multicast);
|
||||
int (*set_default_mgmt_key)(struct wiphy *wiphy,
|
||||
struct net_device *netdev, int link_id,
|
||||
struct wireless_dev *wdev, int link_id,
|
||||
u8 key_index);
|
||||
int (*set_default_beacon_key)(struct wiphy *wiphy,
|
||||
struct net_device *netdev,
|
||||
struct wireless_dev *wdev,
|
||||
int link_id,
|
||||
u8 key_index);
|
||||
|
||||
@@ -4951,17 +4953,17 @@ struct cfg80211_ops {
|
||||
unsigned int link_id);
|
||||
|
||||
|
||||
int (*add_station)(struct wiphy *wiphy, struct net_device *dev,
|
||||
int (*add_station)(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
const u8 *mac,
|
||||
struct station_parameters *params);
|
||||
int (*del_station)(struct wiphy *wiphy, struct net_device *dev,
|
||||
int (*del_station)(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
struct station_del_parameters *params);
|
||||
int (*change_station)(struct wiphy *wiphy, struct net_device *dev,
|
||||
int (*change_station)(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
const u8 *mac,
|
||||
struct station_parameters *params);
|
||||
int (*get_station)(struct wiphy *wiphy, struct net_device *dev,
|
||||
int (*get_station)(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
const u8 *mac, struct station_info *sinfo);
|
||||
int (*dump_station)(struct wiphy *wiphy, struct net_device *dev,
|
||||
int (*dump_station)(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
int idx, u8 *mac, struct station_info *sinfo);
|
||||
|
||||
int (*add_mpath)(struct wiphy *wiphy, struct net_device *dev,
|
||||
@@ -8962,35 +8964,35 @@ static inline void cfg80211_sinfo_release_content(struct station_info *sinfo)
|
||||
/**
|
||||
* cfg80211_new_sta - notify userspace about station
|
||||
*
|
||||
* @dev: the netdev
|
||||
* @wdev: the wireless device
|
||||
* @mac_addr: the station's address
|
||||
* @sinfo: the station information
|
||||
* @gfp: allocation flags
|
||||
*/
|
||||
void cfg80211_new_sta(struct net_device *dev, const u8 *mac_addr,
|
||||
void cfg80211_new_sta(struct wireless_dev *wdev, const u8 *mac_addr,
|
||||
struct station_info *sinfo, gfp_t gfp);
|
||||
|
||||
/**
|
||||
* cfg80211_del_sta_sinfo - notify userspace about deletion of a station
|
||||
* @dev: the netdev
|
||||
* @wdev: the wireless device
|
||||
* @mac_addr: the station's address. For MLD station, MLD address is used.
|
||||
* @sinfo: the station information/statistics
|
||||
* @gfp: allocation flags
|
||||
*/
|
||||
void cfg80211_del_sta_sinfo(struct net_device *dev, const u8 *mac_addr,
|
||||
void cfg80211_del_sta_sinfo(struct wireless_dev *wdev, const u8 *mac_addr,
|
||||
struct station_info *sinfo, gfp_t gfp);
|
||||
|
||||
/**
|
||||
* cfg80211_del_sta - notify userspace about deletion of a station
|
||||
*
|
||||
* @dev: the netdev
|
||||
* @wdev: the wireless device
|
||||
* @mac_addr: the station's address. For MLD station, MLD address is used.
|
||||
* @gfp: allocation flags
|
||||
*/
|
||||
static inline void cfg80211_del_sta(struct net_device *dev,
|
||||
static inline void cfg80211_del_sta(struct wireless_dev *wdev,
|
||||
const u8 *mac_addr, gfp_t gfp)
|
||||
{
|
||||
cfg80211_del_sta_sinfo(dev, mac_addr, NULL, gfp);
|
||||
cfg80211_del_sta_sinfo(wdev, mac_addr, NULL, gfp);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -10472,4 +10474,27 @@ cfg80211_s1g_get_primary_sibling(struct wiphy *wiphy,
|
||||
return ieee80211_get_channel_khz(wiphy, sibling_1mhz_khz);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* cfg80211_incumbent_signal_notify - Notify userspace of incumbent signal detection
|
||||
* @wiphy: the wiphy to use
|
||||
* @chandef: channel definition in which the interference was detected
|
||||
* @signal_interference_bitmap: bitmap indicating interference across 20 MHz segments
|
||||
* @gfp: allocation context for message creation and multicast; pass GFP_ATOMIC
|
||||
* if called from atomic context (e.g. firmware event handler), otherwise
|
||||
* GFP_KERNEL
|
||||
*
|
||||
* Use this function to notify userspace when an incumbent signal is detected on
|
||||
* the operating channel in the 6 GHz band. The notification includes the
|
||||
* current channel definition and a bitmap representing interference across
|
||||
* the operating bandwidth. Each bit in the bitmap corresponds to a 20 MHz
|
||||
* segment, with the lowest bit representing the lowest frequency segment.
|
||||
* Punctured sub-channels are included in the bitmap structure but are always
|
||||
* set to zero since interference detection is not performed on them.
|
||||
*/
|
||||
void cfg80211_incumbent_signal_notify(struct wiphy *wiphy,
|
||||
const struct cfg80211_chan_def *chandef,
|
||||
u32 signal_interference_bitmap,
|
||||
gfp_t gfp);
|
||||
|
||||
#endif /* __NET_CFG80211_H */
|
||||
|
||||
@@ -7766,19 +7766,22 @@ u32 ieee80211_calc_tx_airtime(struct ieee80211_hw *hw,
|
||||
* ieee80211_get_fils_discovery_tmpl - Get FILS discovery template.
|
||||
* @hw: pointer obtained from ieee80211_alloc_hw().
|
||||
* @vif: &struct ieee80211_vif pointer from the add_interface callback.
|
||||
* @link_id: valid link_id during MLO or 0 for non-MLO.
|
||||
*
|
||||
* The driver is responsible for freeing the returned skb.
|
||||
*
|
||||
* Return: FILS discovery template. %NULL on error.
|
||||
*/
|
||||
struct sk_buff *ieee80211_get_fils_discovery_tmpl(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif);
|
||||
struct ieee80211_vif *vif,
|
||||
unsigned int link_id);
|
||||
|
||||
/**
|
||||
* ieee80211_get_unsol_bcast_probe_resp_tmpl - Get unsolicited broadcast
|
||||
* probe response template.
|
||||
* @hw: pointer obtained from ieee80211_alloc_hw().
|
||||
* @vif: &struct ieee80211_vif pointer from the add_interface callback.
|
||||
* @link_id: valid link_id during MLO or 0 for non-MLO.
|
||||
*
|
||||
* The driver is responsible for freeing the returned skb.
|
||||
*
|
||||
@@ -7786,7 +7789,8 @@ struct sk_buff *ieee80211_get_fils_discovery_tmpl(struct ieee80211_hw *hw,
|
||||
*/
|
||||
struct sk_buff *
|
||||
ieee80211_get_unsol_bcast_probe_resp_tmpl(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif);
|
||||
struct ieee80211_vif *vif,
|
||||
unsigned int link_id);
|
||||
|
||||
/**
|
||||
* ieee80211_obss_color_collision_notify - notify userland about a BSS color
|
||||
@@ -7962,4 +7966,11 @@ int ieee80211_emulate_switch_vif_chanctx(struct ieee80211_hw *hw,
|
||||
* Return: %true iff the vif is a NAN interface and NAN is started
|
||||
*/
|
||||
bool ieee80211_vif_nan_started(struct ieee80211_vif *vif);
|
||||
|
||||
/**
|
||||
* ieee80211_encrypt_tx_skb - Encrypt the transmit skb
|
||||
* @skb: the skb
|
||||
* Return: 0 if success and non-zero on error
|
||||
*/
|
||||
int ieee80211_encrypt_tx_skb(struct sk_buff *skb);
|
||||
#endif /* MAC80211_H */
|
||||
|
||||
@@ -1361,6 +1361,12 @@
|
||||
* user space that the NAN new cluster has been joined. The cluster ID is
|
||||
* indicated by %NL80211_ATTR_MAC.
|
||||
*
|
||||
* @NL80211_CMD_INCUMBENT_SIGNAL_DETECT: Once any incumbent signal is detected
|
||||
* on the operating channel in 6 GHz band, userspace is notified with the
|
||||
* signal interference bitmap using
|
||||
* %NL80211_ATTR_INCUMBENT_SIGNAL_INTERFERENCE_BITMAP. The current channel
|
||||
* definition is also sent.
|
||||
*
|
||||
* @NL80211_CMD_MAX: highest used command number
|
||||
* @__NL80211_CMD_AFTER_LAST: internal use
|
||||
*/
|
||||
@@ -1624,6 +1630,8 @@ enum nl80211_commands {
|
||||
NL80211_CMD_NAN_NEXT_DW_NOTIFICATION,
|
||||
NL80211_CMD_NAN_CLUSTER_JOINED,
|
||||
|
||||
NL80211_CMD_INCUMBENT_SIGNAL_DETECT,
|
||||
|
||||
/* add new commands above here */
|
||||
|
||||
/* used to define NL80211_CMD_MAX below */
|
||||
@@ -2984,6 +2992,15 @@ enum nl80211_commands {
|
||||
* this feature during association. This is a flag attribute.
|
||||
* Currently only supported in mac80211 drivers.
|
||||
*
|
||||
* @NL80211_ATTR_INCUMBENT_SIGNAL_INTERFERENCE_BITMAP: u32 attribute specifying
|
||||
* the signal interference bitmap detected on the operating bandwidth for
|
||||
* %NL80211_CMD_INCUMBENT_SIGNAL_DETECT. Each bit represents a 20 MHz
|
||||
* segment, lowest bit corresponds to the lowest 20 MHz segment, in the
|
||||
* operating bandwidth where the interference is detected. Punctured
|
||||
* sub-channels are included in the bitmap structure; however, since
|
||||
* interference detection is not performed on these sub-channels, their
|
||||
* corresponding bits are consistently set to zero.
|
||||
*
|
||||
* @NUM_NL80211_ATTR: total number of nl80211_attrs available
|
||||
* @NL80211_ATTR_MAX: highest attribute number currently defined
|
||||
* @__NL80211_ATTR_AFTER_LAST: internal use
|
||||
@@ -3557,6 +3574,8 @@ enum nl80211_attrs {
|
||||
NL80211_ATTR_UHR_CAPABILITY,
|
||||
NL80211_ATTR_DISABLE_UHR,
|
||||
|
||||
NL80211_ATTR_INCUMBENT_SIGNAL_INTERFERENCE_BITMAP,
|
||||
|
||||
/* add attributes here, update the policy in nl80211.c */
|
||||
|
||||
__NL80211_ATTR_AFTER_LAST,
|
||||
@@ -4480,6 +4499,10 @@ enum nl80211_wmm_rule {
|
||||
* as a non-primary subchannel. Only applicable to S1G channels.
|
||||
* @NL80211_FREQUENCY_ATTR_NO_UHR: UHR operation is not allowed on this channel
|
||||
* in current regulatory domain.
|
||||
* @NL80211_FREQUENCY_ATTR_CAC_START_TIME: Channel Availability Check (CAC)
|
||||
* start time (CLOCK_BOOTTIME, nanoseconds). Only present when CAC is
|
||||
* currently in progress on this channel.
|
||||
* @NL80211_FREQUENCY_ATTR_PAD: attribute used for padding for 64-bit alignment
|
||||
* @NL80211_FREQUENCY_ATTR_MAX: highest frequency attribute number
|
||||
* currently defined
|
||||
* @__NL80211_FREQUENCY_ATTR_AFTER_LAST: internal use
|
||||
@@ -4530,6 +4553,8 @@ enum nl80211_frequency_attr {
|
||||
NL80211_FREQUENCY_ATTR_NO_16MHZ,
|
||||
NL80211_FREQUENCY_ATTR_S1G_NO_PRIMARY,
|
||||
NL80211_FREQUENCY_ATTR_NO_UHR,
|
||||
NL80211_FREQUENCY_ATTR_CAC_START_TIME,
|
||||
NL80211_FREQUENCY_ATTR_PAD,
|
||||
|
||||
/* keep last */
|
||||
__NL80211_FREQUENCY_ATTR_AFTER_LAST,
|
||||
@@ -5466,6 +5491,8 @@ enum nl80211_bss_status {
|
||||
* @NL80211_AUTHTYPE_FILS_SK_PFS: Fast Initial Link Setup shared key with PFS
|
||||
* @NL80211_AUTHTYPE_FILS_PK: Fast Initial Link Setup public key
|
||||
* @NL80211_AUTHTYPE_EPPKE: Enhanced Privacy Protection Key Exchange
|
||||
* @NL80211_AUTHTYPE_IEEE8021X: IEEE 802.1X authentication utilizing
|
||||
* Authentication frames
|
||||
* @__NL80211_AUTHTYPE_NUM: internal
|
||||
* @NL80211_AUTHTYPE_MAX: maximum valid auth algorithm
|
||||
* @NL80211_AUTHTYPE_AUTOMATIC: determine automatically (if necessary by
|
||||
@@ -5482,6 +5509,7 @@ enum nl80211_auth_type {
|
||||
NL80211_AUTHTYPE_FILS_SK_PFS,
|
||||
NL80211_AUTHTYPE_FILS_PK,
|
||||
NL80211_AUTHTYPE_EPPKE,
|
||||
NL80211_AUTHTYPE_IEEE8021X,
|
||||
|
||||
/* keep last */
|
||||
__NL80211_AUTHTYPE_NUM,
|
||||
@@ -6795,6 +6823,11 @@ enum nl80211_feature_flags {
|
||||
* frames in both non‑AP STA and AP mode as specified in
|
||||
* "IEEE P802.11bi/D3.0, 12.16.6".
|
||||
*
|
||||
* @NL80211_EXT_FEATURE_IEEE8021X_AUTH: Driver supports IEEE 802.1X
|
||||
* authentication utilizing Authentication frames with user space SME
|
||||
* (NL80211_CMD_AUTHENTICATE) in non-AP STA mode, as specified in
|
||||
* "IEEE P802.11bi/D4.0, 12.16.5".
|
||||
*
|
||||
* @NUM_NL80211_EXT_FEATURES: number of extended features.
|
||||
* @MAX_NL80211_EXT_FEATURES: highest extended feature index.
|
||||
*/
|
||||
@@ -6873,6 +6906,7 @@ enum nl80211_ext_feature_index {
|
||||
NL80211_EXT_FEATURE_BEACON_RATE_EHT,
|
||||
NL80211_EXT_FEATURE_EPPKE,
|
||||
NL80211_EXT_FEATURE_ASSOC_FRAME_ENCRYPTION,
|
||||
NL80211_EXT_FEATURE_IEEE8021X_AUTH,
|
||||
|
||||
/* add new features before the definition below */
|
||||
NUM_NL80211_EXT_FEATURES,
|
||||
|
||||
@@ -330,7 +330,6 @@ static void ieee80211_stop_p2p_device(struct wiphy *wiphy,
|
||||
|
||||
static void ieee80211_nan_conf_free(struct cfg80211_nan_conf *conf)
|
||||
{
|
||||
kfree(conf->cluster_id);
|
||||
kfree(conf->extra_nan_attrs);
|
||||
kfree(conf->vendor_elems);
|
||||
memset(conf, 0, sizeof(*conf));
|
||||
@@ -372,9 +371,6 @@ static int ieee80211_nan_conf_copy(struct cfg80211_nan_conf *dst,
|
||||
memcpy(&dst->band_cfgs, &src->band_cfgs,
|
||||
sizeof(dst->band_cfgs));
|
||||
|
||||
kfree(dst->cluster_id);
|
||||
dst->cluster_id = NULL;
|
||||
|
||||
kfree(dst->extra_nan_attrs);
|
||||
dst->extra_nan_attrs = NULL;
|
||||
dst->extra_nan_attrs_len = 0;
|
||||
@@ -383,12 +379,8 @@ static int ieee80211_nan_conf_copy(struct cfg80211_nan_conf *dst,
|
||||
dst->vendor_elems = NULL;
|
||||
dst->vendor_elems_len = 0;
|
||||
|
||||
if (src->cluster_id) {
|
||||
dst->cluster_id = kmemdup(src->cluster_id, ETH_ALEN,
|
||||
GFP_KERNEL);
|
||||
if (!dst->cluster_id)
|
||||
goto no_mem;
|
||||
}
|
||||
if (is_zero_ether_addr(dst->cluster_id))
|
||||
ether_addr_copy(dst->cluster_id, src->cluster_id);
|
||||
|
||||
if (src->extra_nan_attrs && src->extra_nan_attrs_len) {
|
||||
dst->extra_nan_attrs = kmemdup(src->extra_nan_attrs,
|
||||
@@ -616,11 +608,11 @@ static int ieee80211_set_tx(struct ieee80211_sub_if_data *sdata,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int ieee80211_add_key(struct wiphy *wiphy, struct net_device *dev,
|
||||
static int ieee80211_add_key(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
int link_id, u8 key_idx, bool pairwise,
|
||||
const u8 *mac_addr, struct key_params *params)
|
||||
{
|
||||
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
|
||||
struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
|
||||
struct ieee80211_link_data *link =
|
||||
ieee80211_link_or_deflink(sdata, link_id, false);
|
||||
struct ieee80211_local *local = sdata->local;
|
||||
@@ -798,11 +790,11 @@ ieee80211_lookup_key(struct ieee80211_sub_if_data *sdata, int link_id,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static int ieee80211_del_key(struct wiphy *wiphy, struct net_device *dev,
|
||||
static int ieee80211_del_key(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
int link_id, u8 key_idx, bool pairwise,
|
||||
const u8 *mac_addr)
|
||||
{
|
||||
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
|
||||
struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
|
||||
struct ieee80211_local *local = sdata->local;
|
||||
struct ieee80211_key *key;
|
||||
|
||||
@@ -817,7 +809,7 @@ static int ieee80211_del_key(struct wiphy *wiphy, struct net_device *dev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ieee80211_get_key(struct wiphy *wiphy, struct net_device *dev,
|
||||
static int ieee80211_get_key(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
int link_id, u8 key_idx, bool pairwise,
|
||||
const u8 *mac_addr, void *cookie,
|
||||
void (*callback)(void *cookie,
|
||||
@@ -833,7 +825,7 @@ static int ieee80211_get_key(struct wiphy *wiphy, struct net_device *dev,
|
||||
int err = -ENOENT;
|
||||
struct ieee80211_key_seq kseq = {};
|
||||
|
||||
sdata = IEEE80211_DEV_TO_SUB_IF(dev);
|
||||
sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
|
||||
|
||||
rcu_read_lock();
|
||||
|
||||
@@ -937,10 +929,10 @@ static int ieee80211_config_default_key(struct wiphy *wiphy,
|
||||
}
|
||||
|
||||
static int ieee80211_config_default_mgmt_key(struct wiphy *wiphy,
|
||||
struct net_device *dev,
|
||||
struct wireless_dev *wdev,
|
||||
int link_id, u8 key_idx)
|
||||
{
|
||||
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
|
||||
struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
|
||||
struct ieee80211_link_data *link =
|
||||
ieee80211_link_or_deflink(sdata, link_id, true);
|
||||
|
||||
@@ -953,10 +945,10 @@ static int ieee80211_config_default_mgmt_key(struct wiphy *wiphy,
|
||||
}
|
||||
|
||||
static int ieee80211_config_default_beacon_key(struct wiphy *wiphy,
|
||||
struct net_device *dev,
|
||||
struct wireless_dev *wdev,
|
||||
int link_id, u8 key_idx)
|
||||
{
|
||||
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
|
||||
struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
|
||||
struct ieee80211_link_data *link =
|
||||
ieee80211_link_or_deflink(sdata, link_id, true);
|
||||
|
||||
@@ -1000,10 +992,10 @@ void sta_set_rate_info_tx(struct sta_info *sta,
|
||||
rinfo->flags |= RATE_INFO_FLAGS_SHORT_GI;
|
||||
}
|
||||
|
||||
static int ieee80211_dump_station(struct wiphy *wiphy, struct net_device *dev,
|
||||
static int ieee80211_dump_station(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
int idx, u8 *mac, struct station_info *sinfo)
|
||||
{
|
||||
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
|
||||
struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
|
||||
struct ieee80211_local *local = sdata->local;
|
||||
struct sta_info *sta;
|
||||
int ret = -ENOENT;
|
||||
@@ -1035,10 +1027,11 @@ static int ieee80211_dump_survey(struct wiphy *wiphy, struct net_device *dev,
|
||||
return drv_get_survey(local, idx, survey);
|
||||
}
|
||||
|
||||
static int ieee80211_get_station(struct wiphy *wiphy, struct net_device *dev,
|
||||
static int ieee80211_get_station(struct wiphy *wiphy,
|
||||
struct wireless_dev *wdev,
|
||||
const u8 *mac, struct station_info *sinfo)
|
||||
{
|
||||
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
|
||||
struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
|
||||
struct ieee80211_local *local = sdata->local;
|
||||
struct sta_info *sta;
|
||||
int ret = -ENOENT;
|
||||
@@ -2363,7 +2356,7 @@ static int sta_apply_parameters(struct ieee80211_local *local,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ieee80211_add_station(struct wiphy *wiphy, struct net_device *dev,
|
||||
static int ieee80211_add_station(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
const u8 *mac,
|
||||
struct station_parameters *params)
|
||||
{
|
||||
@@ -2381,7 +2374,7 @@ static int ieee80211_add_station(struct wiphy *wiphy, struct net_device *dev,
|
||||
sdata->vif.type != NL80211_IFTYPE_AP)
|
||||
return -EINVAL;
|
||||
} else
|
||||
sdata = IEEE80211_DEV_TO_SUB_IF(dev);
|
||||
sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
|
||||
|
||||
if (ether_addr_equal(mac, sdata->vif.addr))
|
||||
return -EINVAL;
|
||||
@@ -2435,12 +2428,12 @@ static int ieee80211_add_station(struct wiphy *wiphy, struct net_device *dev,
|
||||
return sta_info_insert(sta);
|
||||
}
|
||||
|
||||
static int ieee80211_del_station(struct wiphy *wiphy, struct net_device *dev,
|
||||
static int ieee80211_del_station(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
struct station_del_parameters *params)
|
||||
{
|
||||
struct ieee80211_sub_if_data *sdata;
|
||||
|
||||
sdata = IEEE80211_DEV_TO_SUB_IF(dev);
|
||||
sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
|
||||
|
||||
if (params->mac)
|
||||
return sta_info_destroy_addr_bss(sdata, params->mac);
|
||||
@@ -2450,10 +2443,10 @@ static int ieee80211_del_station(struct wiphy *wiphy, struct net_device *dev,
|
||||
}
|
||||
|
||||
static int ieee80211_change_station(struct wiphy *wiphy,
|
||||
struct net_device *dev, const u8 *mac,
|
||||
struct wireless_dev *wdev, const u8 *mac,
|
||||
struct station_parameters *params)
|
||||
{
|
||||
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
|
||||
struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
|
||||
struct ieee80211_local *local = wiphy_priv(wiphy);
|
||||
struct sta_info *sta;
|
||||
struct ieee80211_sub_if_data *vlansdata;
|
||||
@@ -4614,7 +4607,9 @@ static int ieee80211_probe_client(struct wiphy *wiphy, struct net_device *dev,
|
||||
struct ieee80211_tx_info *info;
|
||||
struct sta_info *sta;
|
||||
struct ieee80211_chanctx_conf *chanctx_conf;
|
||||
struct ieee80211_bss_conf *conf;
|
||||
enum nl80211_band band;
|
||||
u8 link_id;
|
||||
int ret;
|
||||
|
||||
/* the lock is needed to assign the cookie later */
|
||||
@@ -4629,12 +4624,35 @@ static int ieee80211_probe_client(struct wiphy *wiphy, struct net_device *dev,
|
||||
|
||||
qos = sta->sta.wme;
|
||||
|
||||
chanctx_conf = rcu_dereference(sdata->vif.bss_conf.chanctx_conf);
|
||||
if (WARN_ON(!chanctx_conf)) {
|
||||
ret = -EINVAL;
|
||||
goto unlock;
|
||||
if (ieee80211_vif_is_mld(&sdata->vif)) {
|
||||
if (sta->sta.mlo) {
|
||||
link_id = IEEE80211_LINK_UNSPECIFIED;
|
||||
} else {
|
||||
/*
|
||||
* For non-MLO clients connected to an AP MLD, band
|
||||
* information is not used; instead, sta->deflink is
|
||||
* used to send packets.
|
||||
*/
|
||||
link_id = sta->deflink.link_id;
|
||||
|
||||
conf = rcu_dereference(sdata->vif.link_conf[link_id]);
|
||||
|
||||
if (unlikely(!conf)) {
|
||||
ret = -ENOLINK;
|
||||
goto unlock;
|
||||
}
|
||||
}
|
||||
/* MLD transmissions must not rely on the band */
|
||||
band = 0;
|
||||
} else {
|
||||
chanctx_conf = rcu_dereference(sdata->vif.bss_conf.chanctx_conf);
|
||||
if (WARN_ON(!chanctx_conf)) {
|
||||
ret = -EINVAL;
|
||||
goto unlock;
|
||||
}
|
||||
band = chanctx_conf->def.chan->band;
|
||||
link_id = 0;
|
||||
}
|
||||
band = chanctx_conf->def.chan->band;
|
||||
|
||||
if (qos) {
|
||||
fc = cpu_to_le16(IEEE80211_FTYPE_DATA |
|
||||
@@ -4661,8 +4679,13 @@ static int ieee80211_probe_client(struct wiphy *wiphy, struct net_device *dev,
|
||||
nullfunc->frame_control = fc;
|
||||
nullfunc->duration_id = 0;
|
||||
memcpy(nullfunc->addr1, sta->sta.addr, ETH_ALEN);
|
||||
memcpy(nullfunc->addr2, sdata->vif.addr, ETH_ALEN);
|
||||
memcpy(nullfunc->addr3, sdata->vif.addr, ETH_ALEN);
|
||||
if (ieee80211_vif_is_mld(&sdata->vif) && !sta->sta.mlo) {
|
||||
memcpy(nullfunc->addr2, conf->addr, ETH_ALEN);
|
||||
memcpy(nullfunc->addr3, conf->addr, ETH_ALEN);
|
||||
} else {
|
||||
memcpy(nullfunc->addr2, sdata->vif.addr, ETH_ALEN);
|
||||
memcpy(nullfunc->addr3, sdata->vif.addr, ETH_ALEN);
|
||||
}
|
||||
nullfunc->seq_ctrl = 0;
|
||||
|
||||
info = IEEE80211_SKB_CB(skb);
|
||||
@@ -4671,6 +4694,8 @@ static int ieee80211_probe_client(struct wiphy *wiphy, struct net_device *dev,
|
||||
IEEE80211_TX_INTFL_NL80211_FRAME_TX;
|
||||
info->band = band;
|
||||
|
||||
info->control.flags |= u32_encode_bits(link_id,
|
||||
IEEE80211_TX_CTRL_MLO_LINK);
|
||||
skb_set_queue_mapping(skb, IEEE80211_AC_VO);
|
||||
skb->priority = 7;
|
||||
if (qos)
|
||||
|
||||
@@ -256,6 +256,8 @@ struct ieee80211_rx_data {
|
||||
u8 pn[IEEE80211_CCMP_PN_LEN];
|
||||
} ccm_gcm;
|
||||
};
|
||||
|
||||
u8 link_addrs[3 * ETH_ALEN];
|
||||
};
|
||||
|
||||
struct ieee80211_csa_settings {
|
||||
|
||||
@@ -915,6 +915,7 @@ struct ieee80211_hw *ieee80211_alloc_hw_nm(size_t priv_data_len,
|
||||
|
||||
wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_TXQS);
|
||||
wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_RRM);
|
||||
wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_IEEE8021X_AUTH);
|
||||
|
||||
wiphy->bss_priv_size = sizeof(struct ieee80211_bss);
|
||||
|
||||
@@ -1597,6 +1598,15 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
|
||||
local->sband_allocated |= BIT(band);
|
||||
}
|
||||
|
||||
/*
|
||||
* mac80211 supports EPPKE, if the driver supports (Re)Association
|
||||
* frame encryption
|
||||
*/
|
||||
if (wiphy_ext_feature_isset(local->hw.wiphy,
|
||||
NL80211_EXT_FEATURE_ASSOC_FRAME_ENCRYPTION))
|
||||
wiphy_ext_feature_set(local->hw.wiphy,
|
||||
NL80211_EXT_FEATURE_EPPKE);
|
||||
|
||||
result = wiphy_register(local->hw.wiphy);
|
||||
if (result < 0)
|
||||
goto fail_wiphy_register;
|
||||
|
||||
@@ -4920,7 +4920,7 @@ static void ieee80211_rx_mgmt_auth(struct ieee80211_sub_if_data *sdata,
|
||||
struct ieee80211_mgmt *mgmt, size_t len)
|
||||
{
|
||||
struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
|
||||
u16 auth_alg, auth_transaction, status_code;
|
||||
u16 auth_alg, auth_transaction, status_code, encap_len;
|
||||
struct ieee80211_event event = {
|
||||
.type = MLME_EVENT,
|
||||
.u.mlme.data = AUTH_EVENT,
|
||||
@@ -4929,6 +4929,7 @@ static void ieee80211_rx_mgmt_auth(struct ieee80211_sub_if_data *sdata,
|
||||
.subtype = IEEE80211_STYPE_AUTH,
|
||||
};
|
||||
bool sae_need_confirm = false;
|
||||
bool auth_fail = false;
|
||||
|
||||
lockdep_assert_wiphy(sdata->local->hw.wiphy);
|
||||
|
||||
@@ -4945,6 +4946,15 @@ static void ieee80211_rx_mgmt_auth(struct ieee80211_sub_if_data *sdata,
|
||||
auth_transaction = le16_to_cpu(mgmt->u.auth.auth_transaction);
|
||||
status_code = le16_to_cpu(mgmt->u.auth.status_code);
|
||||
|
||||
/*
|
||||
* IEEE 802.1X Authentication:
|
||||
* Header + Authentication Algorithm Number(2 byte) + Authentication
|
||||
* Transaction Sequence Number(2 byte) + Status Code(2 byte) +
|
||||
* Encapsulation Length(2 byte).
|
||||
*/
|
||||
if (auth_alg == WLAN_AUTH_IEEE8021X && len < 24 + 8)
|
||||
return;
|
||||
|
||||
info.link_id = ifmgd->auth_data->link_id;
|
||||
|
||||
if (auth_alg != ifmgd->auth_data->algorithm ||
|
||||
@@ -4960,7 +4970,24 @@ static void ieee80211_rx_mgmt_auth(struct ieee80211_sub_if_data *sdata,
|
||||
goto notify_driver;
|
||||
}
|
||||
|
||||
if (status_code != WLAN_STATUS_SUCCESS) {
|
||||
switch (auth_alg) {
|
||||
case WLAN_AUTH_IEEE8021X:
|
||||
if (status_code != WLAN_STATUS_SUCCESS &&
|
||||
status_code != WLAN_STATUS_8021X_AUTH_SUCCESS)
|
||||
auth_fail = true;
|
||||
|
||||
if (!auth_fail) {
|
||||
/* Indicates length of encapsulated EAPOL PDU */
|
||||
encap_len = get_unaligned_le16(mgmt->u.auth.variable);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
if (status_code != WLAN_STATUS_SUCCESS)
|
||||
auth_fail = true;
|
||||
break;
|
||||
}
|
||||
|
||||
if (auth_fail) {
|
||||
cfg80211_rx_mlme_mgmt(sdata->dev, (u8 *)mgmt, len);
|
||||
|
||||
if (auth_alg == WLAN_AUTH_SAE &&
|
||||
@@ -4997,6 +5024,7 @@ static void ieee80211_rx_mgmt_auth(struct ieee80211_sub_if_data *sdata,
|
||||
case WLAN_AUTH_FILS_SK_PFS:
|
||||
case WLAN_AUTH_FILS_PK:
|
||||
case WLAN_AUTH_EPPKE:
|
||||
case WLAN_AUTH_IEEE8021X:
|
||||
break;
|
||||
case WLAN_AUTH_SHARED_KEY:
|
||||
if (ifmgd->auth_data->expected_transaction != 4) {
|
||||
@@ -5017,8 +5045,37 @@ static void ieee80211_rx_mgmt_auth(struct ieee80211_sub_if_data *sdata,
|
||||
if (ifmgd->auth_data->algorithm != WLAN_AUTH_SAE ||
|
||||
(auth_transaction == 2 &&
|
||||
ifmgd->auth_data->expected_transaction == 2)) {
|
||||
if (!ieee80211_mark_sta_auth(sdata))
|
||||
return; /* ignore frame -- wait for timeout */
|
||||
switch (ifmgd->auth_data->algorithm) {
|
||||
case WLAN_AUTH_IEEE8021X:
|
||||
/*
|
||||
* IEEE 802.1X authentication:
|
||||
* - When the full EAP handshake completes over the
|
||||
* Authentication process, the responder sets the
|
||||
* Status Code to WLAN_STATUS_8021X_AUTH_SUCCESS as
|
||||
* specified in "IEEE P802.11bi/D4.0, 12.16.5".
|
||||
*
|
||||
* - In the PMKSA caching case, only two Authentication
|
||||
* frames are exchanged if the responder (e.g., AP)
|
||||
* identifies a valid PMKSA, then as specified in
|
||||
* "IEEE P802.11bi/D4.0, 12.16.8.3", the responder
|
||||
* shall set the Status Code to SUCCESS in the final
|
||||
* Authentication frame and must not include an
|
||||
* encapsulated EAPOL PDU.
|
||||
*
|
||||
* Both conditions are treated as successful
|
||||
* authentication, so mark the state to Authenticated.
|
||||
*/
|
||||
if (status_code != WLAN_STATUS_8021X_AUTH_SUCCESS &&
|
||||
!(status_code == WLAN_STATUS_SUCCESS &&
|
||||
encap_len == 0))
|
||||
break;
|
||||
fallthrough;
|
||||
default:
|
||||
if (!ieee80211_mark_sta_auth(sdata))
|
||||
return; /* ignore frame -- wait for timeout */
|
||||
|
||||
break;
|
||||
}
|
||||
} else if (ifmgd->auth_data->algorithm == WLAN_AUTH_SAE &&
|
||||
auth_transaction == 1) {
|
||||
sae_need_confirm = true;
|
||||
@@ -8441,7 +8498,8 @@ static int ieee80211_auth(struct ieee80211_sub_if_data *sdata)
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
|
||||
if (auth_data->algorithm == WLAN_AUTH_SAE)
|
||||
if (auth_data->algorithm == WLAN_AUTH_SAE ||
|
||||
auth_data->algorithm == WLAN_AUTH_EPPKE)
|
||||
info.duration = jiffies_to_msecs(IEEE80211_AUTH_TIMEOUT_SAE);
|
||||
|
||||
info.link_id = auth_data->link_id;
|
||||
@@ -8460,6 +8518,10 @@ static int ieee80211_auth(struct ieee80211_sub_if_data *sdata)
|
||||
} else if (auth_data->algorithm == WLAN_AUTH_EPPKE) {
|
||||
trans = auth_data->trans;
|
||||
status = auth_data->status;
|
||||
} else if (auth_data->algorithm == WLAN_AUTH_IEEE8021X) {
|
||||
trans = auth_data->trans;
|
||||
status = auth_data->status;
|
||||
auth_data->expected_transaction = trans + 1;
|
||||
}
|
||||
|
||||
if (ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS))
|
||||
@@ -9117,7 +9179,8 @@ static int ieee80211_prep_connection(struct ieee80211_sub_if_data *sdata,
|
||||
}
|
||||
|
||||
if (ifmgd->auth_data &&
|
||||
ifmgd->auth_data->algorithm == WLAN_AUTH_EPPKE)
|
||||
(ifmgd->auth_data->algorithm == WLAN_AUTH_EPPKE ||
|
||||
ifmgd->auth_data->algorithm == WLAN_AUTH_IEEE8021X))
|
||||
new_sta->sta.epp_peer = true;
|
||||
|
||||
new_sta->sta.mlo = mlo;
|
||||
@@ -9377,6 +9440,9 @@ int ieee80211_mgd_auth(struct ieee80211_sub_if_data *sdata,
|
||||
case NL80211_AUTHTYPE_EPPKE:
|
||||
auth_alg = WLAN_AUTH_EPPKE;
|
||||
break;
|
||||
case NL80211_AUTHTYPE_IEEE8021X:
|
||||
auth_alg = WLAN_AUTH_IEEE8021X;
|
||||
break;
|
||||
default:
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
@@ -9402,7 +9468,8 @@ int ieee80211_mgd_auth(struct ieee80211_sub_if_data *sdata,
|
||||
|
||||
if (req->auth_data_len >= 4) {
|
||||
if (req->auth_type == NL80211_AUTHTYPE_SAE ||
|
||||
req->auth_type == NL80211_AUTHTYPE_EPPKE) {
|
||||
req->auth_type == NL80211_AUTHTYPE_EPPKE ||
|
||||
req->auth_type == NL80211_AUTHTYPE_IEEE8021X) {
|
||||
__le16 *pos = (__le16 *) req->auth_data;
|
||||
|
||||
auth_data->trans = le16_to_cpu(pos[0]);
|
||||
|
||||
@@ -5127,6 +5127,11 @@ static bool ieee80211_prepare_and_rx_handle(struct ieee80211_rx_data *rx,
|
||||
hdr = (struct ieee80211_hdr *)rx->skb->data;
|
||||
}
|
||||
|
||||
/* Store a copy of the pre-translated link addresses for SW crypto */
|
||||
if (unlikely(is_unicast_ether_addr(hdr->addr1) &&
|
||||
!ieee80211_is_data(hdr->frame_control)))
|
||||
memcpy(rx->link_addrs, &hdr->addrs, 3 * ETH_ALEN);
|
||||
|
||||
if (unlikely(rx->sta && rx->sta->sta.mlo) &&
|
||||
is_unicast_ether_addr(hdr->addr1) &&
|
||||
!ieee80211_is_probe_resp(hdr->frame_control) &&
|
||||
|
||||
@@ -974,7 +974,7 @@ static int sta_info_insert_finish(struct sta_info *sta) __acquires(RCU)
|
||||
}
|
||||
|
||||
sinfo->generation = local->sta_generation;
|
||||
cfg80211_new_sta(sdata->dev, sta->sta.addr, sinfo, GFP_KERNEL);
|
||||
cfg80211_new_sta(&sdata->wdev, sta->sta.addr, sinfo, GFP_KERNEL);
|
||||
kfree(sinfo);
|
||||
|
||||
sta_dbg(sdata, "Inserted STA %pM\n", sta->sta.addr);
|
||||
@@ -1557,7 +1557,7 @@ static void __sta_info_destroy_part2(struct sta_info *sta, bool recalc)
|
||||
|
||||
sta_dbg(sdata, "Removed STA %pM\n", sta->sta.addr);
|
||||
|
||||
cfg80211_del_sta_sinfo(sdata->dev, sta->sta.addr, sinfo, GFP_KERNEL);
|
||||
cfg80211_del_sta_sinfo(&sdata->wdev, sta->sta.addr, sinfo, GFP_KERNEL);
|
||||
kfree(sinfo);
|
||||
|
||||
ieee80211_sta_debugfs_remove(sta);
|
||||
|
||||
@@ -287,10 +287,7 @@ ieee80211_tx_h_check_assoc(struct ieee80211_tx_data *tx)
|
||||
* active scan) are allowed, all other frames should not be
|
||||
* sent and we should not get here, but if we do
|
||||
* nonetheless, drop them to avoid sending them
|
||||
* off-channel. See the link below and
|
||||
* ieee80211_start_scan() for more.
|
||||
*
|
||||
* http://article.gmane.org/gmane.linux.kernel.wireless.general/30089
|
||||
* off-channel. See __ieee80211_start_scan() for more.
|
||||
*/
|
||||
return TX_DROP;
|
||||
|
||||
@@ -5315,6 +5312,38 @@ static int ieee80211_beacon_protect(struct sk_buff *skb,
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ieee80211_encrypt_tx_skb(struct sk_buff *skb)
|
||||
{
|
||||
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
||||
struct ieee80211_sub_if_data *sdata;
|
||||
struct sk_buff *check_skb;
|
||||
struct ieee80211_tx_data tx;
|
||||
ieee80211_tx_result res;
|
||||
|
||||
if (!info->control.hw_key)
|
||||
return 0;
|
||||
|
||||
memset(&tx, 0, sizeof(tx));
|
||||
tx.key = container_of(info->control.hw_key, struct ieee80211_key, conf);
|
||||
/* NULL it out now so we do full SW crypto */
|
||||
info->control.hw_key = NULL;
|
||||
__skb_queue_head_init(&tx.skbs);
|
||||
__skb_queue_tail(&tx.skbs, skb);
|
||||
|
||||
sdata = IEEE80211_DEV_TO_SUB_IF(skb->dev);
|
||||
tx.sdata = sdata;
|
||||
tx.local = sdata->local;
|
||||
res = ieee80211_tx_h_encrypt(&tx);
|
||||
check_skb = __skb_dequeue(&tx.skbs);
|
||||
/* we may crash after this, but it'd be a bug in crypto */
|
||||
WARN_ON(check_skb != skb);
|
||||
if (WARN_ON_ONCE(res != TX_CONTINUE))
|
||||
return -EINVAL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ieee80211_encrypt_tx_skb);
|
||||
|
||||
static void
|
||||
ieee80211_beacon_get_finish(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif,
|
||||
@@ -5837,21 +5866,28 @@ struct sk_buff *ieee80211_proberesp_get(struct ieee80211_hw *hw,
|
||||
EXPORT_SYMBOL(ieee80211_proberesp_get);
|
||||
|
||||
struct sk_buff *ieee80211_get_fils_discovery_tmpl(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif)
|
||||
struct ieee80211_vif *vif,
|
||||
unsigned int link_id)
|
||||
{
|
||||
struct sk_buff *skb = NULL;
|
||||
struct fils_discovery_data *tmpl = NULL;
|
||||
struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
|
||||
struct ieee80211_link_data *link;
|
||||
|
||||
if (sdata->vif.type != NL80211_IFTYPE_AP)
|
||||
return NULL;
|
||||
|
||||
rcu_read_lock();
|
||||
tmpl = rcu_dereference(sdata->deflink.u.ap.fils_discovery);
|
||||
if (!tmpl) {
|
||||
rcu_read_unlock();
|
||||
if (link_id >= IEEE80211_MLD_MAX_NUM_LINKS)
|
||||
return NULL;
|
||||
|
||||
guard(rcu)();
|
||||
link = rcu_dereference(sdata->link[link_id]);
|
||||
if (!link)
|
||||
return NULL;
|
||||
|
||||
tmpl = rcu_dereference(link->u.ap.fils_discovery);
|
||||
if (!tmpl)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
skb = dev_alloc_skb(sdata->local->hw.extra_tx_headroom + tmpl->len);
|
||||
if (skb) {
|
||||
@@ -5859,28 +5895,34 @@ struct sk_buff *ieee80211_get_fils_discovery_tmpl(struct ieee80211_hw *hw,
|
||||
skb_put_data(skb, tmpl->data, tmpl->len);
|
||||
}
|
||||
|
||||
rcu_read_unlock();
|
||||
return skb;
|
||||
}
|
||||
EXPORT_SYMBOL(ieee80211_get_fils_discovery_tmpl);
|
||||
|
||||
struct sk_buff *
|
||||
ieee80211_get_unsol_bcast_probe_resp_tmpl(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif)
|
||||
struct ieee80211_vif *vif,
|
||||
unsigned int link_id)
|
||||
{
|
||||
struct sk_buff *skb = NULL;
|
||||
struct unsol_bcast_probe_resp_data *tmpl = NULL;
|
||||
struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
|
||||
struct ieee80211_link_data *link;
|
||||
|
||||
if (sdata->vif.type != NL80211_IFTYPE_AP)
|
||||
return NULL;
|
||||
|
||||
rcu_read_lock();
|
||||
tmpl = rcu_dereference(sdata->deflink.u.ap.unsol_bcast_probe_resp);
|
||||
if (!tmpl) {
|
||||
rcu_read_unlock();
|
||||
if (link_id >= IEEE80211_MLD_MAX_NUM_LINKS)
|
||||
return NULL;
|
||||
|
||||
guard(rcu)();
|
||||
link = rcu_dereference(sdata->link[link_id]);
|
||||
if (!link)
|
||||
return NULL;
|
||||
|
||||
tmpl = rcu_dereference(link->u.ap.unsol_bcast_probe_resp);
|
||||
if (!tmpl)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
skb = dev_alloc_skb(sdata->local->hw.extra_tx_headroom + tmpl->len);
|
||||
if (skb) {
|
||||
@@ -5888,7 +5930,6 @@ ieee80211_get_unsol_bcast_probe_resp_tmpl(struct ieee80211_hw *hw,
|
||||
skb_put_data(skb, tmpl->data, tmpl->len);
|
||||
}
|
||||
|
||||
rcu_read_unlock();
|
||||
return skb;
|
||||
}
|
||||
EXPORT_SYMBOL(ieee80211_get_unsol_bcast_probe_resp_tmpl);
|
||||
|
||||
@@ -315,7 +315,8 @@ ieee80211_crypto_tkip_decrypt(struct ieee80211_rx_data *rx)
|
||||
* Calculate AAD for CCMP/GCMP, returning qos_tid since we
|
||||
* need that in CCMP also for b_0.
|
||||
*/
|
||||
static u8 ccmp_gcmp_aad(struct sk_buff *skb, u8 *aad, bool spp_amsdu)
|
||||
static u8 ccmp_gcmp_aad(struct sk_buff *skb, u8 *aad, bool spp_amsdu,
|
||||
bool aad_nonce_computed)
|
||||
{
|
||||
struct ieee80211_hdr *hdr = (void *)skb->data;
|
||||
__le16 mask_fc;
|
||||
@@ -358,7 +359,8 @@ static u8 ccmp_gcmp_aad(struct sk_buff *skb, u8 *aad, bool spp_amsdu)
|
||||
* FC | A1 | A2 | A3 | SC | [A4] | [QC] */
|
||||
put_unaligned_be16(len_a, &aad[0]);
|
||||
put_unaligned(mask_fc, (__le16 *)&aad[2]);
|
||||
memcpy(&aad[4], &hdr->addrs, 3 * ETH_ALEN);
|
||||
if (!aad_nonce_computed)
|
||||
memcpy(&aad[4], &hdr->addrs, 3 * ETH_ALEN);
|
||||
|
||||
/* Mask Seq#, leave Frag# */
|
||||
aad[22] = *((u8 *) &hdr->seq_ctrl) & 0x0f;
|
||||
@@ -377,10 +379,10 @@ static u8 ccmp_gcmp_aad(struct sk_buff *skb, u8 *aad, bool spp_amsdu)
|
||||
}
|
||||
|
||||
static void ccmp_special_blocks(struct sk_buff *skb, u8 *pn, u8 *b_0, u8 *aad,
|
||||
bool spp_amsdu)
|
||||
bool spp_amsdu, bool aad_nonce_computed)
|
||||
{
|
||||
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
|
||||
u8 qos_tid = ccmp_gcmp_aad(skb, aad, spp_amsdu);
|
||||
u8 qos_tid = ccmp_gcmp_aad(skb, aad, spp_amsdu, aad_nonce_computed);
|
||||
|
||||
/* In CCM, the initial vectors (IV) used for CTR mode encryption and CBC
|
||||
* mode authentication are not allowed to collide, yet both are derived
|
||||
@@ -395,7 +397,8 @@ static void ccmp_special_blocks(struct sk_buff *skb, u8 *pn, u8 *b_0, u8 *aad,
|
||||
* Nonce Flags: Priority (b0..b3) | Management (b4) | Reserved (b5..b7)
|
||||
*/
|
||||
b_0[1] = qos_tid | (ieee80211_is_mgmt(hdr->frame_control) << 4);
|
||||
memcpy(&b_0[2], hdr->addr2, ETH_ALEN);
|
||||
if (!aad_nonce_computed)
|
||||
memcpy(&b_0[2], hdr->addr2, ETH_ALEN);
|
||||
memcpy(&b_0[8], pn, IEEE80211_CCMP_PN_LEN);
|
||||
}
|
||||
|
||||
@@ -488,7 +491,8 @@ static int ccmp_encrypt_skb(struct ieee80211_tx_data *tx, struct sk_buff *skb,
|
||||
|
||||
pos += IEEE80211_CCMP_HDR_LEN;
|
||||
ccmp_special_blocks(skb, pn, b_0, aad,
|
||||
key->conf.flags & IEEE80211_KEY_FLAG_SPP_AMSDU);
|
||||
key->conf.flags & IEEE80211_KEY_FLAG_SPP_AMSDU,
|
||||
false);
|
||||
return ieee80211_aes_ccm_encrypt(key->u.ccmp.tfm, b_0, aad, pos, len,
|
||||
skb_put(skb, mic_len));
|
||||
}
|
||||
@@ -566,9 +570,22 @@ ieee80211_crypto_ccmp_decrypt(struct ieee80211_rx_data *rx,
|
||||
if (!(status->flag & RX_FLAG_DECRYPTED)) {
|
||||
u8 aad[2 * AES_BLOCK_SIZE];
|
||||
u8 b_0[AES_BLOCK_SIZE];
|
||||
bool aad_nonce_computed = false;
|
||||
|
||||
if (is_unicast_ether_addr(hdr->addr1) &&
|
||||
!ieee80211_is_data(hdr->frame_control)) {
|
||||
/* AAD computation */
|
||||
memcpy(&aad[4], rx->link_addrs, 3 * ETH_ALEN);
|
||||
/* Nonce computation */
|
||||
ether_addr_copy(&b_0[2],
|
||||
&rx->link_addrs[ETH_ALEN]);
|
||||
aad_nonce_computed = true;
|
||||
}
|
||||
|
||||
/* hardware didn't decrypt/verify MIC */
|
||||
ccmp_special_blocks(skb, pn, b_0, aad,
|
||||
key->conf.flags & IEEE80211_KEY_FLAG_SPP_AMSDU);
|
||||
key->conf.flags & IEEE80211_KEY_FLAG_SPP_AMSDU,
|
||||
aad_nonce_computed);
|
||||
|
||||
if (ieee80211_aes_ccm_decrypt(
|
||||
key->u.ccmp.tfm, b_0, aad,
|
||||
@@ -593,14 +610,15 @@ ieee80211_crypto_ccmp_decrypt(struct ieee80211_rx_data *rx,
|
||||
}
|
||||
|
||||
static void gcmp_special_blocks(struct sk_buff *skb, u8 *pn, u8 *j_0, u8 *aad,
|
||||
bool spp_amsdu)
|
||||
bool spp_amsdu, bool aad_nonce_computed)
|
||||
{
|
||||
struct ieee80211_hdr *hdr = (void *)skb->data;
|
||||
|
||||
memcpy(j_0, hdr->addr2, ETH_ALEN);
|
||||
if (!aad_nonce_computed)
|
||||
memcpy(j_0, hdr->addr2, ETH_ALEN);
|
||||
memcpy(&j_0[ETH_ALEN], pn, IEEE80211_GCMP_PN_LEN);
|
||||
|
||||
ccmp_gcmp_aad(skb, aad, spp_amsdu);
|
||||
ccmp_gcmp_aad(skb, aad, spp_amsdu, aad_nonce_computed);
|
||||
}
|
||||
|
||||
static inline void gcmp_pn2hdr(u8 *hdr, const u8 *pn, int key_id)
|
||||
@@ -690,7 +708,8 @@ static int gcmp_encrypt_skb(struct ieee80211_tx_data *tx, struct sk_buff *skb)
|
||||
|
||||
pos += IEEE80211_GCMP_HDR_LEN;
|
||||
gcmp_special_blocks(skb, pn, j_0, aad,
|
||||
key->conf.flags & IEEE80211_KEY_FLAG_SPP_AMSDU);
|
||||
key->conf.flags & IEEE80211_KEY_FLAG_SPP_AMSDU,
|
||||
false);
|
||||
return ieee80211_aes_gcm_encrypt(key->u.gcmp.tfm, j_0, aad, pos, len,
|
||||
skb_put(skb, IEEE80211_GCMP_MIC_LEN));
|
||||
}
|
||||
@@ -763,9 +782,21 @@ ieee80211_crypto_gcmp_decrypt(struct ieee80211_rx_data *rx)
|
||||
if (!(status->flag & RX_FLAG_DECRYPTED)) {
|
||||
u8 aad[2 * AES_BLOCK_SIZE];
|
||||
u8 j_0[AES_BLOCK_SIZE];
|
||||
bool aad_nonce_computed = false;
|
||||
|
||||
if (is_unicast_ether_addr(hdr->addr1) &&
|
||||
!ieee80211_is_data(hdr->frame_control)) {
|
||||
/* AAD computation */
|
||||
memcpy(&aad[4], rx->link_addrs, 3 * ETH_ALEN);
|
||||
/* Nonce computation */
|
||||
ether_addr_copy(&j_0[0],
|
||||
&rx->link_addrs[ETH_ALEN]);
|
||||
aad_nonce_computed = true;
|
||||
}
|
||||
/* hardware didn't decrypt/verify MIC */
|
||||
gcmp_special_blocks(skb, pn, j_0, aad,
|
||||
key->conf.flags & IEEE80211_KEY_FLAG_SPP_AMSDU);
|
||||
key->conf.flags & IEEE80211_KEY_FLAG_SPP_AMSDU,
|
||||
aad_nonce_computed);
|
||||
|
||||
if (ieee80211_aes_gcm_decrypt(
|
||||
key->u.gcmp.tfm, j_0, aad,
|
||||
|
||||
@@ -642,6 +642,33 @@ void cfg80211_set_dfs_state(struct wiphy *wiphy,
|
||||
}
|
||||
}
|
||||
|
||||
void cfg80211_set_cac_state(struct wiphy *wiphy,
|
||||
const struct cfg80211_chan_def *chandef,
|
||||
bool cac_ongoing)
|
||||
{
|
||||
struct ieee80211_channel *c;
|
||||
int width;
|
||||
u64 cac_time;
|
||||
|
||||
if (WARN_ON(!cfg80211_chandef_valid(chandef)))
|
||||
return;
|
||||
|
||||
width = cfg80211_chandef_get_width(chandef);
|
||||
if (width < 0)
|
||||
return;
|
||||
|
||||
/* Get the same timestamp for all subchannels */
|
||||
cac_time = cac_ongoing ? ktime_get_boottime_ns() : 0;
|
||||
|
||||
for_each_subchan(chandef, freq, cf) {
|
||||
c = ieee80211_get_channel_khz(wiphy, freq);
|
||||
if (!c)
|
||||
continue;
|
||||
|
||||
c->cac_start_time = cac_time;
|
||||
}
|
||||
}
|
||||
|
||||
static bool
|
||||
cfg80211_dfs_permissive_check_wdev(struct cfg80211_registered_device *rdev,
|
||||
enum nl80211_iftype iftype,
|
||||
@@ -754,6 +781,7 @@ int cfg80211_chandef_dfs_required(struct wiphy *wiphy,
|
||||
case NL80211_IFTYPE_AP:
|
||||
case NL80211_IFTYPE_P2P_GO:
|
||||
case NL80211_IFTYPE_MESH_POINT:
|
||||
case NL80211_IFTYPE_NAN:
|
||||
width = cfg80211_chandef_get_width(chandef);
|
||||
if (width < 0)
|
||||
return -EINVAL;
|
||||
@@ -768,7 +796,6 @@ int cfg80211_chandef_dfs_required(struct wiphy *wiphy,
|
||||
case NL80211_IFTYPE_MONITOR:
|
||||
case NL80211_IFTYPE_AP_VLAN:
|
||||
case NL80211_IFTYPE_P2P_DEVICE:
|
||||
case NL80211_IFTYPE_NAN:
|
||||
break;
|
||||
case NL80211_IFTYPE_WDS:
|
||||
case NL80211_IFTYPE_UNSPECIFIED:
|
||||
|
||||
@@ -349,7 +349,6 @@ void cfg80211_destroy_ifaces(struct cfg80211_registered_device *rdev)
|
||||
|
||||
guard(wiphy)(&rdev->wiphy);
|
||||
|
||||
cfg80211_leave(rdev, wdev, -1);
|
||||
cfg80211_remove_virtual_intf(rdev, wdev);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -481,6 +481,10 @@ void cfg80211_set_dfs_state(struct wiphy *wiphy,
|
||||
const struct cfg80211_chan_def *chandef,
|
||||
enum nl80211_dfs_state dfs_state);
|
||||
|
||||
void cfg80211_set_cac_state(struct wiphy *wiphy,
|
||||
const struct cfg80211_chan_def *chandef,
|
||||
bool cac_ongoing);
|
||||
|
||||
void cfg80211_dfs_channels_update_work(struct work_struct *work);
|
||||
|
||||
void cfg80211_sched_dfs_chan_update(struct cfg80211_registered_device *rdev);
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* Some IBSS support code for cfg80211.
|
||||
*
|
||||
* Copyright 2009 Johannes Berg <johannes@sipsolutions.net>
|
||||
* Copyright (C) 2020-2024 Intel Corporation
|
||||
* Copyright (C) 2020-2026 Intel Corporation
|
||||
*/
|
||||
|
||||
#include <linux/etherdevice.h>
|
||||
@@ -172,7 +172,7 @@ void cfg80211_clear_ibss(struct net_device *dev, bool nowext)
|
||||
*/
|
||||
if (rdev->ops->del_key)
|
||||
for (i = 0; i < 6; i++)
|
||||
rdev_del_key(rdev, dev, -1, i, false, NULL);
|
||||
rdev_del_key(rdev, wdev, -1, i, false, NULL);
|
||||
|
||||
if (wdev->u.ibss.current_bss) {
|
||||
cfg80211_unhold_bss(wdev->u.ibss.current_bss);
|
||||
|
||||
@@ -1115,8 +1115,10 @@ void __cfg80211_radar_event(struct wiphy *wiphy,
|
||||
*/
|
||||
cfg80211_set_dfs_state(wiphy, chandef, NL80211_DFS_UNAVAILABLE);
|
||||
|
||||
if (offchan)
|
||||
if (offchan) {
|
||||
cancel_delayed_work(&rdev->background_cac_done_wk);
|
||||
queue_work(cfg80211_wq, &rdev->background_cac_abort_wk);
|
||||
}
|
||||
|
||||
cfg80211_sched_dfs_chan_update(rdev);
|
||||
|
||||
@@ -1160,9 +1162,11 @@ void cfg80211_cac_event(struct net_device *netdev,
|
||||
fallthrough;
|
||||
case NL80211_RADAR_CAC_ABORTED:
|
||||
wdev->links[link_id].cac_started = false;
|
||||
cfg80211_set_cac_state(wiphy, chandef, false);
|
||||
break;
|
||||
case NL80211_RADAR_CAC_STARTED:
|
||||
wdev->links[link_id].cac_started = true;
|
||||
cfg80211_set_cac_state(wiphy, chandef, true);
|
||||
break;
|
||||
default:
|
||||
WARN_ON(1);
|
||||
@@ -1187,23 +1191,21 @@ __cfg80211_background_cac_event(struct cfg80211_registered_device *rdev,
|
||||
if (!cfg80211_chandef_valid(chandef))
|
||||
return;
|
||||
|
||||
if (!rdev->background_radar_wdev)
|
||||
return;
|
||||
|
||||
switch (event) {
|
||||
case NL80211_RADAR_CAC_FINISHED:
|
||||
cfg80211_set_dfs_state(wiphy, chandef, NL80211_DFS_AVAILABLE);
|
||||
cfg80211_set_cac_state(wiphy, chandef, false);
|
||||
memcpy(&rdev->cac_done_chandef, chandef, sizeof(*chandef));
|
||||
queue_work(cfg80211_wq, &rdev->propagate_cac_done_wk);
|
||||
cfg80211_sched_dfs_chan_update(rdev);
|
||||
wdev = rdev->background_radar_wdev;
|
||||
break;
|
||||
case NL80211_RADAR_CAC_ABORTED:
|
||||
cfg80211_set_cac_state(wiphy, chandef, false);
|
||||
if (!cancel_delayed_work(&rdev->background_cac_done_wk))
|
||||
return;
|
||||
wdev = rdev->background_radar_wdev;
|
||||
break;
|
||||
case NL80211_RADAR_CAC_STARTED:
|
||||
cfg80211_set_cac_state(wiphy, chandef, true);
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
@@ -1213,17 +1215,6 @@ __cfg80211_background_cac_event(struct cfg80211_registered_device *rdev,
|
||||
nl80211_radar_notify(rdev, chandef, event, netdev, GFP_KERNEL);
|
||||
}
|
||||
|
||||
static void
|
||||
cfg80211_background_cac_event(struct cfg80211_registered_device *rdev,
|
||||
const struct cfg80211_chan_def *chandef,
|
||||
enum nl80211_radar_event event)
|
||||
{
|
||||
guard(wiphy)(&rdev->wiphy);
|
||||
|
||||
__cfg80211_background_cac_event(rdev, rdev->background_radar_wdev,
|
||||
chandef, event);
|
||||
}
|
||||
|
||||
void cfg80211_background_cac_done_wk(struct work_struct *work)
|
||||
{
|
||||
struct delayed_work *delayed_work = to_delayed_work(work);
|
||||
@@ -1231,18 +1222,31 @@ void cfg80211_background_cac_done_wk(struct work_struct *work)
|
||||
|
||||
rdev = container_of(delayed_work, struct cfg80211_registered_device,
|
||||
background_cac_done_wk);
|
||||
cfg80211_background_cac_event(rdev, &rdev->background_radar_chandef,
|
||||
NL80211_RADAR_CAC_FINISHED);
|
||||
|
||||
guard(wiphy)(&rdev->wiphy);
|
||||
|
||||
rdev_set_radar_background(rdev, NULL);
|
||||
|
||||
__cfg80211_background_cac_event(rdev, rdev->background_radar_wdev,
|
||||
&rdev->background_radar_chandef,
|
||||
NL80211_RADAR_CAC_FINISHED);
|
||||
|
||||
rdev->background_radar_wdev = NULL;
|
||||
}
|
||||
|
||||
void cfg80211_background_cac_abort_wk(struct work_struct *work)
|
||||
{
|
||||
struct cfg80211_registered_device *rdev;
|
||||
struct wireless_dev *wdev;
|
||||
|
||||
rdev = container_of(work, struct cfg80211_registered_device,
|
||||
background_cac_abort_wk);
|
||||
cfg80211_background_cac_event(rdev, &rdev->background_radar_chandef,
|
||||
NL80211_RADAR_CAC_ABORTED);
|
||||
|
||||
guard(wiphy)(&rdev->wiphy);
|
||||
|
||||
wdev = rdev->background_radar_wdev;
|
||||
if (wdev)
|
||||
cfg80211_stop_background_radar_detection(wdev);
|
||||
}
|
||||
|
||||
void cfg80211_background_cac_abort(struct wiphy *wiphy)
|
||||
@@ -1309,6 +1313,8 @@ void cfg80211_stop_radar_detection(struct wireless_dev *wdev)
|
||||
|
||||
chandef = *wdev_chandef(wdev, link_id);
|
||||
rdev_end_cac(rdev, wdev->netdev, link_id);
|
||||
wdev->links[link_id].cac_started = false;
|
||||
cfg80211_set_cac_state(wiphy, &chandef, false);
|
||||
nl80211_radar_notify(rdev, &chandef, NL80211_RADAR_CAC_ABORTED,
|
||||
wdev->netdev, GFP_KERNEL);
|
||||
}
|
||||
@@ -1325,11 +1331,12 @@ void cfg80211_stop_background_radar_detection(struct wireless_dev *wdev)
|
||||
return;
|
||||
|
||||
rdev_set_radar_background(rdev, NULL);
|
||||
rdev->background_radar_wdev = NULL; /* Release offchain ownership */
|
||||
|
||||
__cfg80211_background_cac_event(rdev, wdev,
|
||||
&rdev->background_radar_chandef,
|
||||
NL80211_RADAR_CAC_ABORTED);
|
||||
|
||||
rdev->background_radar_wdev = NULL;
|
||||
}
|
||||
|
||||
int cfg80211_assoc_ml_reconf(struct cfg80211_registered_device *rdev,
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
#include <linux/nospec.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/if_vlan.h>
|
||||
#include <linux/random.h>
|
||||
#include <net/net_namespace.h>
|
||||
#include <net/genetlink.h>
|
||||
#include <net/cfg80211.h>
|
||||
@@ -1333,6 +1334,12 @@ static int nl80211_msg_put_channel(struct sk_buff *msg, struct wiphy *wiphy,
|
||||
if ((chan->flags & IEEE80211_CHAN_NO_UHR) &&
|
||||
nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_UHR))
|
||||
goto nla_put_failure;
|
||||
if (chan->cac_start_time &&
|
||||
nla_put_u64_64bit(msg,
|
||||
NL80211_FREQUENCY_ATTR_CAC_START_TIME,
|
||||
chan->cac_start_time,
|
||||
NL80211_FREQUENCY_ATTR_PAD))
|
||||
goto nla_put_failure;
|
||||
}
|
||||
|
||||
if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_MAX_TX_POWER,
|
||||
@@ -3567,11 +3574,10 @@ static bool nl80211_can_set_dev_channel(struct wireless_dev *wdev)
|
||||
}
|
||||
|
||||
static int _nl80211_parse_chandef(struct cfg80211_registered_device *rdev,
|
||||
struct genl_info *info, bool monitor,
|
||||
struct netlink_ext_ack *extack,
|
||||
struct nlattr **attrs, bool monitor,
|
||||
struct cfg80211_chan_def *chandef)
|
||||
{
|
||||
struct netlink_ext_ack *extack = info->extack;
|
||||
struct nlattr **attrs = info->attrs;
|
||||
u32 control_freq;
|
||||
|
||||
if (!attrs[NL80211_ATTR_WIPHY_FREQ]) {
|
||||
@@ -3581,10 +3587,10 @@ static int _nl80211_parse_chandef(struct cfg80211_registered_device *rdev,
|
||||
}
|
||||
|
||||
control_freq = MHZ_TO_KHZ(
|
||||
nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]));
|
||||
if (info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET])
|
||||
nla_get_u32(attrs[NL80211_ATTR_WIPHY_FREQ]));
|
||||
if (attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET])
|
||||
control_freq +=
|
||||
nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]);
|
||||
nla_get_u32(attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]);
|
||||
|
||||
memset(chandef, 0, sizeof(*chandef));
|
||||
chandef->chan = ieee80211_get_channel_khz(&rdev->wiphy, control_freq);
|
||||
@@ -3655,40 +3661,43 @@ static int _nl80211_parse_chandef(struct cfg80211_registered_device *rdev,
|
||||
attrs[NL80211_ATTR_S1G_PRIMARY_2MHZ]);
|
||||
}
|
||||
|
||||
if (info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]) {
|
||||
if (attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]) {
|
||||
chandef->edmg.channels =
|
||||
nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]);
|
||||
nla_get_u8(attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]);
|
||||
|
||||
if (info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG])
|
||||
if (attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG])
|
||||
chandef->edmg.bw_config =
|
||||
nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]);
|
||||
nla_get_u8(attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]);
|
||||
} else {
|
||||
chandef->edmg.bw_config = 0;
|
||||
chandef->edmg.channels = 0;
|
||||
}
|
||||
|
||||
if (info->attrs[NL80211_ATTR_PUNCT_BITMAP]) {
|
||||
if (attrs[NL80211_ATTR_PUNCT_BITMAP]) {
|
||||
chandef->punctured =
|
||||
nla_get_u32(info->attrs[NL80211_ATTR_PUNCT_BITMAP]);
|
||||
nla_get_u32(attrs[NL80211_ATTR_PUNCT_BITMAP]);
|
||||
|
||||
if (chandef->punctured &&
|
||||
!wiphy_ext_feature_isset(&rdev->wiphy,
|
||||
NL80211_EXT_FEATURE_PUNCT)) {
|
||||
NL_SET_ERR_MSG(extack,
|
||||
"driver doesn't support puncturing");
|
||||
NL_SET_ERR_MSG_ATTR(extack,
|
||||
attrs[NL80211_ATTR_WIPHY_FREQ],
|
||||
"driver doesn't support puncturing");
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
if (!cfg80211_chandef_valid(chandef)) {
|
||||
NL_SET_ERR_MSG(extack, "invalid channel definition");
|
||||
NL_SET_ERR_MSG_ATTR(extack, attrs[NL80211_ATTR_WIPHY_FREQ],
|
||||
"invalid channel definition");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (!_cfg80211_chandef_usable(&rdev->wiphy, chandef,
|
||||
IEEE80211_CHAN_DISABLED,
|
||||
monitor ? IEEE80211_CHAN_CAN_MONITOR : 0)) {
|
||||
NL_SET_ERR_MSG(extack, "(extension) channel is disabled");
|
||||
NL_SET_ERR_MSG_ATTR(extack, attrs[NL80211_ATTR_WIPHY_FREQ],
|
||||
"(extension) channel is disabled");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -3703,10 +3712,11 @@ static int _nl80211_parse_chandef(struct cfg80211_registered_device *rdev,
|
||||
}
|
||||
|
||||
int nl80211_parse_chandef(struct cfg80211_registered_device *rdev,
|
||||
struct genl_info *info,
|
||||
struct netlink_ext_ack *extack,
|
||||
struct nlattr **attrs,
|
||||
struct cfg80211_chan_def *chandef)
|
||||
{
|
||||
return _nl80211_parse_chandef(rdev, info, false, chandef);
|
||||
return _nl80211_parse_chandef(rdev, extack, attrs, false, chandef);
|
||||
}
|
||||
|
||||
static int __nl80211_set_channel(struct cfg80211_registered_device *rdev,
|
||||
@@ -3733,7 +3743,7 @@ static int __nl80211_set_channel(struct cfg80211_registered_device *rdev,
|
||||
link_id = 0;
|
||||
}
|
||||
|
||||
result = _nl80211_parse_chandef(rdev, info,
|
||||
result = _nl80211_parse_chandef(rdev, info->extack, info->attrs,
|
||||
iftype == NL80211_IFTYPE_MONITOR,
|
||||
&chandef);
|
||||
if (result)
|
||||
@@ -4950,7 +4960,7 @@ static int nl80211_get_key(struct sk_buff *skb, struct genl_info *info)
|
||||
{
|
||||
struct cfg80211_registered_device *rdev = info->user_ptr[0];
|
||||
int err;
|
||||
struct net_device *dev = info->user_ptr[1];
|
||||
struct wireless_dev *wdev = info->user_ptr[1];
|
||||
u8 key_idx = 0;
|
||||
const u8 *mac_addr = NULL;
|
||||
bool pairwise;
|
||||
@@ -4961,7 +4971,6 @@ static int nl80211_get_key(struct sk_buff *skb, struct genl_info *info)
|
||||
struct sk_buff *msg;
|
||||
bool bigtk_support = false;
|
||||
int link_id = nl80211_link_id_or_invalid(info->attrs);
|
||||
struct wireless_dev *wdev = dev->ieee80211_ptr;
|
||||
|
||||
if (wiphy_ext_feature_isset(&rdev->wiphy,
|
||||
NL80211_EXT_FEATURE_BEACON_PROTECTION))
|
||||
@@ -5013,7 +5022,10 @@ static int nl80211_get_key(struct sk_buff *skb, struct genl_info *info)
|
||||
cookie.msg = msg;
|
||||
cookie.idx = key_idx;
|
||||
|
||||
if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
|
||||
if ((wdev->netdev &&
|
||||
nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex)) ||
|
||||
nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
|
||||
NL80211_ATTR_PAD) ||
|
||||
nla_put_u8(msg, NL80211_ATTR_KEY_IDX, key_idx))
|
||||
goto nla_put_failure;
|
||||
if (mac_addr &&
|
||||
@@ -5024,7 +5036,7 @@ static int nl80211_get_key(struct sk_buff *skb, struct genl_info *info)
|
||||
if (err)
|
||||
goto free_msg;
|
||||
|
||||
err = rdev_get_key(rdev, dev, link_id, key_idx, pairwise, mac_addr,
|
||||
err = rdev_get_key(rdev, wdev, link_id, key_idx, pairwise, mac_addr,
|
||||
&cookie, get_key_callback);
|
||||
|
||||
if (err)
|
||||
@@ -5048,9 +5060,8 @@ static int nl80211_set_key(struct sk_buff *skb, struct genl_info *info)
|
||||
struct cfg80211_registered_device *rdev = info->user_ptr[0];
|
||||
struct key_parse key;
|
||||
int err;
|
||||
struct net_device *dev = info->user_ptr[1];
|
||||
struct wireless_dev *wdev = info->user_ptr[1];
|
||||
int link_id = nl80211_link_id_or_invalid(info->attrs);
|
||||
struct wireless_dev *wdev = dev->ieee80211_ptr;
|
||||
|
||||
err = nl80211_parse_key(info, &key);
|
||||
if (err)
|
||||
@@ -5070,6 +5081,9 @@ static int nl80211_set_key(struct sk_buff *skb, struct genl_info *info)
|
||||
if (!rdev->ops->set_default_key)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (!wdev->netdev)
|
||||
return -EINVAL;
|
||||
|
||||
err = nl80211_key_allowed(wdev);
|
||||
if (err)
|
||||
return err;
|
||||
@@ -5078,7 +5092,7 @@ static int nl80211_set_key(struct sk_buff *skb, struct genl_info *info)
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = rdev_set_default_key(rdev, dev, link_id, key.idx,
|
||||
err = rdev_set_default_key(rdev, wdev->netdev, link_id, key.idx,
|
||||
key.def_uni, key.def_multi);
|
||||
|
||||
if (err)
|
||||
@@ -5103,7 +5117,7 @@ static int nl80211_set_key(struct sk_buff *skb, struct genl_info *info)
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = rdev_set_default_mgmt_key(rdev, dev, link_id, key.idx);
|
||||
err = rdev_set_default_mgmt_key(rdev, wdev, link_id, key.idx);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
@@ -5126,7 +5140,8 @@ static int nl80211_set_key(struct sk_buff *skb, struct genl_info *info)
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
return rdev_set_default_beacon_key(rdev, dev, link_id, key.idx);
|
||||
return rdev_set_default_beacon_key(rdev, wdev, link_id,
|
||||
key.idx);
|
||||
} else if (key.p.mode == NL80211_KEY_SET_TX &&
|
||||
wiphy_ext_feature_isset(&rdev->wiphy,
|
||||
NL80211_EXT_FEATURE_EXT_KEY_ID)) {
|
||||
@@ -5142,7 +5157,7 @@ static int nl80211_set_key(struct sk_buff *skb, struct genl_info *info)
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
return rdev_add_key(rdev, dev, link_id, key.idx,
|
||||
return rdev_add_key(rdev, wdev, link_id, key.idx,
|
||||
NL80211_KEYTYPE_PAIRWISE,
|
||||
mac_addr, &key.p);
|
||||
}
|
||||
@@ -5154,11 +5169,10 @@ static int nl80211_new_key(struct sk_buff *skb, struct genl_info *info)
|
||||
{
|
||||
struct cfg80211_registered_device *rdev = info->user_ptr[0];
|
||||
int err;
|
||||
struct net_device *dev = info->user_ptr[1];
|
||||
struct wireless_dev *wdev = info->user_ptr[1];
|
||||
struct key_parse key;
|
||||
const u8 *mac_addr = NULL;
|
||||
int link_id = nl80211_link_id_or_invalid(info->attrs);
|
||||
struct wireless_dev *wdev = dev->ieee80211_ptr;
|
||||
|
||||
err = nl80211_parse_key(info, &key);
|
||||
if (err)
|
||||
@@ -5209,7 +5223,7 @@ static int nl80211_new_key(struct sk_buff *skb, struct genl_info *info)
|
||||
key.type == NL80211_KEYTYPE_PAIRWISE);
|
||||
|
||||
if (!err) {
|
||||
err = rdev_add_key(rdev, dev, link_id, key.idx,
|
||||
err = rdev_add_key(rdev, wdev, link_id, key.idx,
|
||||
key.type == NL80211_KEYTYPE_PAIRWISE,
|
||||
mac_addr, &key.p);
|
||||
if (err)
|
||||
@@ -5223,11 +5237,10 @@ static int nl80211_del_key(struct sk_buff *skb, struct genl_info *info)
|
||||
{
|
||||
struct cfg80211_registered_device *rdev = info->user_ptr[0];
|
||||
int err;
|
||||
struct net_device *dev = info->user_ptr[1];
|
||||
struct wireless_dev *wdev = info->user_ptr[1];
|
||||
u8 *mac_addr = NULL;
|
||||
struct key_parse key;
|
||||
int link_id = nl80211_link_id_or_invalid(info->attrs);
|
||||
struct wireless_dev *wdev = dev->ieee80211_ptr;
|
||||
|
||||
err = nl80211_parse_key(info, &key);
|
||||
if (err)
|
||||
@@ -5266,7 +5279,7 @@ static int nl80211_del_key(struct sk_buff *skb, struct genl_info *info)
|
||||
key.type == NL80211_KEYTYPE_PAIRWISE);
|
||||
|
||||
if (!err)
|
||||
err = rdev_del_key(rdev, dev, link_id, key.idx,
|
||||
err = rdev_del_key(rdev, wdev, link_id, key.idx,
|
||||
key.type == NL80211_KEYTYPE_PAIRWISE,
|
||||
mac_addr);
|
||||
|
||||
@@ -6541,6 +6554,10 @@ static bool nl80211_valid_auth_type(struct cfg80211_registered_device *rdev,
|
||||
NL80211_EXT_FEATURE_EPPKE) &&
|
||||
auth_type == NL80211_AUTHTYPE_EPPKE)
|
||||
return false;
|
||||
if (!wiphy_ext_feature_isset(&rdev->wiphy,
|
||||
NL80211_EXT_FEATURE_IEEE8021X_AUTH) &&
|
||||
auth_type == NL80211_AUTHTYPE_IEEE8021X)
|
||||
return false;
|
||||
return true;
|
||||
case NL80211_CMD_CONNECT:
|
||||
if (!(rdev->wiphy.features & NL80211_FEATURE_SAE) &&
|
||||
@@ -6562,6 +6579,10 @@ static bool nl80211_valid_auth_type(struct cfg80211_registered_device *rdev,
|
||||
NL80211_EXT_FEATURE_EPPKE) &&
|
||||
auth_type == NL80211_AUTHTYPE_EPPKE)
|
||||
return false;
|
||||
if (!wiphy_ext_feature_isset(&rdev->wiphy,
|
||||
NL80211_EXT_FEATURE_IEEE8021X_AUTH) &&
|
||||
auth_type == NL80211_AUTHTYPE_IEEE8021X)
|
||||
return false;
|
||||
return true;
|
||||
case NL80211_CMD_START_AP:
|
||||
if (!wiphy_ext_feature_isset(&rdev->wiphy,
|
||||
@@ -6811,7 +6832,8 @@ static int nl80211_start_ap(struct sk_buff *skb, struct genl_info *info)
|
||||
}
|
||||
|
||||
if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
|
||||
err = nl80211_parse_chandef(rdev, info, ¶ms->chandef);
|
||||
err = nl80211_parse_chandef(rdev, info->extack, info->attrs,
|
||||
¶ms->chandef);
|
||||
if (err)
|
||||
goto out;
|
||||
} else if (wdev->valid_links) {
|
||||
@@ -7497,7 +7519,7 @@ static int nl80211_fill_link_station(struct sk_buff *msg,
|
||||
static int nl80211_send_station(struct sk_buff *msg, u32 cmd, u32 portid,
|
||||
u32 seq, int flags,
|
||||
struct cfg80211_registered_device *rdev,
|
||||
struct net_device *dev,
|
||||
struct wireless_dev *wdev,
|
||||
const u8 *mac_addr, struct station_info *sinfo,
|
||||
bool link_stats)
|
||||
{
|
||||
@@ -7513,7 +7535,10 @@ static int nl80211_send_station(struct sk_buff *msg, u32 cmd, u32 portid,
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) ||
|
||||
if ((wdev->netdev &&
|
||||
nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex)) ||
|
||||
nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
|
||||
NL80211_ATTR_PAD) ||
|
||||
nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr) ||
|
||||
nla_put_u32(msg, NL80211_ATTR_GENERATION, sinfo->generation))
|
||||
goto nla_put_failure;
|
||||
@@ -7992,7 +8017,7 @@ static int nl80211_dump_station(struct sk_buff *skb,
|
||||
sinfo_alloc = true;
|
||||
}
|
||||
|
||||
err = rdev_dump_station(rdev, wdev->netdev, sta_idx,
|
||||
err = rdev_dump_station(rdev, wdev, sta_idx,
|
||||
mac_addr, &sinfo);
|
||||
if (err == -ENOENT)
|
||||
break;
|
||||
@@ -8010,7 +8035,7 @@ static int nl80211_dump_station(struct sk_buff *skb,
|
||||
if (nl80211_send_station(skb, NL80211_CMD_NEW_STATION,
|
||||
NETLINK_CB(cb->skb).portid,
|
||||
cb->nlh->nlmsg_seq, NLM_F_MULTI,
|
||||
rdev, wdev->netdev, mac_addr,
|
||||
rdev, wdev, mac_addr,
|
||||
&sinfo, false) < 0)
|
||||
goto out;
|
||||
|
||||
@@ -8031,7 +8056,7 @@ static int nl80211_dump_station(struct sk_buff *skb,
|
||||
static int nl80211_get_station(struct sk_buff *skb, struct genl_info *info)
|
||||
{
|
||||
struct cfg80211_registered_device *rdev = info->user_ptr[0];
|
||||
struct net_device *dev = info->user_ptr[1];
|
||||
struct wireless_dev *wdev = info->user_ptr[1];
|
||||
struct station_info sinfo;
|
||||
struct sk_buff *msg;
|
||||
u8 *mac_addr = NULL;
|
||||
@@ -8039,6 +8064,9 @@ static int nl80211_get_station(struct sk_buff *skb, struct genl_info *info)
|
||||
|
||||
memset(&sinfo, 0, sizeof(sinfo));
|
||||
|
||||
if (!wdev->netdev)
|
||||
return -EINVAL;
|
||||
|
||||
if (!info->attrs[NL80211_ATTR_MAC])
|
||||
return -EINVAL;
|
||||
|
||||
@@ -8055,7 +8083,7 @@ static int nl80211_get_station(struct sk_buff *skb, struct genl_info *info)
|
||||
}
|
||||
}
|
||||
|
||||
err = rdev_get_station(rdev, dev, mac_addr, &sinfo);
|
||||
err = rdev_get_station(rdev, wdev, mac_addr, &sinfo);
|
||||
if (err) {
|
||||
cfg80211_sinfo_release_content(&sinfo);
|
||||
return err;
|
||||
@@ -8072,7 +8100,7 @@ static int nl80211_get_station(struct sk_buff *skb, struct genl_info *info)
|
||||
|
||||
if (nl80211_send_station(msg, NL80211_CMD_NEW_STATION,
|
||||
info->snd_portid, info->snd_seq, 0,
|
||||
rdev, dev, mac_addr, &sinfo, false) < 0) {
|
||||
rdev, wdev, mac_addr, &sinfo, false) < 0) {
|
||||
nlmsg_free(msg);
|
||||
return -ENOBUFS;
|
||||
}
|
||||
@@ -8434,13 +8462,17 @@ static int nl80211_parse_sta_txpower_setting(struct genl_info *info,
|
||||
static int nl80211_set_station(struct sk_buff *skb, struct genl_info *info)
|
||||
{
|
||||
struct cfg80211_registered_device *rdev = info->user_ptr[0];
|
||||
struct net_device *dev = info->user_ptr[1];
|
||||
struct wireless_dev *wdev = info->user_ptr[1];
|
||||
struct net_device *dev = wdev->netdev;
|
||||
struct station_parameters params;
|
||||
u8 *mac_addr;
|
||||
int err;
|
||||
|
||||
memset(¶ms, 0, sizeof(params));
|
||||
|
||||
if (!dev)
|
||||
return -EINVAL;
|
||||
|
||||
if (!rdev->ops->change_station)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
@@ -8513,7 +8545,7 @@ static int nl80211_set_station(struct sk_buff *skb, struct genl_info *info)
|
||||
nla_len(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]);
|
||||
}
|
||||
|
||||
if (parse_station_flags(info, dev->ieee80211_ptr->iftype, ¶ms))
|
||||
if (parse_station_flags(info, wdev->iftype, ¶ms))
|
||||
return -EINVAL;
|
||||
|
||||
if (info->attrs[NL80211_ATTR_STA_PLINK_ACTION])
|
||||
@@ -8573,7 +8605,7 @@ static int nl80211_set_station(struct sk_buff *skb, struct genl_info *info)
|
||||
if (IS_ERR(params.vlan))
|
||||
return PTR_ERR(params.vlan);
|
||||
|
||||
switch (dev->ieee80211_ptr->iftype) {
|
||||
switch (wdev->iftype) {
|
||||
case NL80211_IFTYPE_AP:
|
||||
case NL80211_IFTYPE_AP_VLAN:
|
||||
case NL80211_IFTYPE_P2P_GO:
|
||||
@@ -8588,7 +8620,7 @@ static int nl80211_set_station(struct sk_buff *skb, struct genl_info *info)
|
||||
}
|
||||
|
||||
/* driver will call cfg80211_check_station_change() */
|
||||
err = rdev_change_station(rdev, dev, mac_addr, ¶ms);
|
||||
err = rdev_change_station(rdev, wdev, mac_addr, ¶ms);
|
||||
|
||||
out_put_vlan:
|
||||
dev_put(params.vlan);
|
||||
@@ -8600,8 +8632,8 @@ static int nl80211_new_station(struct sk_buff *skb, struct genl_info *info)
|
||||
{
|
||||
struct cfg80211_registered_device *rdev = info->user_ptr[0];
|
||||
int err;
|
||||
struct net_device *dev = info->user_ptr[1];
|
||||
struct wireless_dev *wdev = dev->ieee80211_ptr;
|
||||
struct wireless_dev *wdev = info->user_ptr[1];
|
||||
struct net_device *dev = wdev->netdev;
|
||||
struct station_parameters params;
|
||||
u8 *mac_addr = NULL;
|
||||
u32 auth_assoc = BIT(NL80211_STA_FLAG_AUTHENTICATED) |
|
||||
@@ -8609,6 +8641,9 @@ static int nl80211_new_station(struct sk_buff *skb, struct genl_info *info)
|
||||
|
||||
memset(¶ms, 0, sizeof(params));
|
||||
|
||||
if (!dev)
|
||||
return -EINVAL;
|
||||
|
||||
if (!rdev->ops->add_station)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
@@ -8658,7 +8693,7 @@ static int nl80211_new_station(struct sk_buff *skb, struct genl_info *info)
|
||||
* and is NOT supported for AP interface
|
||||
*/
|
||||
params.support_p2p_ps =
|
||||
dev->ieee80211_ptr->iftype == NL80211_IFTYPE_P2P_GO;
|
||||
wdev->iftype == NL80211_IFTYPE_P2P_GO;
|
||||
}
|
||||
|
||||
if (info->attrs[NL80211_ATTR_PEER_AID])
|
||||
@@ -8764,7 +8799,7 @@ static int nl80211_new_station(struct sk_buff *skb, struct genl_info *info)
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if (parse_station_flags(info, dev->ieee80211_ptr->iftype, ¶ms))
|
||||
if (parse_station_flags(info, wdev->iftype, ¶ms))
|
||||
return -EINVAL;
|
||||
|
||||
/* HT/VHT requires QoS, but if we don't have that just ignore HT/VHT
|
||||
@@ -8792,7 +8827,7 @@ static int nl80211_new_station(struct sk_buff *skb, struct genl_info *info)
|
||||
/* When you run into this, adjust the code below for the new flag */
|
||||
BUILD_BUG_ON(NL80211_STA_FLAG_MAX != 8);
|
||||
|
||||
switch (dev->ieee80211_ptr->iftype) {
|
||||
switch (wdev->iftype) {
|
||||
case NL80211_IFTYPE_AP:
|
||||
case NL80211_IFTYPE_AP_VLAN:
|
||||
case NL80211_IFTYPE_P2P_GO:
|
||||
@@ -8901,7 +8936,7 @@ static int nl80211_new_station(struct sk_buff *skb, struct genl_info *info)
|
||||
params.epp_peer =
|
||||
nla_get_flag(info->attrs[NL80211_ATTR_EPP_PEER]);
|
||||
|
||||
err = rdev_add_station(rdev, dev, mac_addr, ¶ms);
|
||||
err = rdev_add_station(rdev, wdev, mac_addr, ¶ms);
|
||||
out:
|
||||
dev_put(params.vlan);
|
||||
return err;
|
||||
@@ -8910,13 +8945,16 @@ static int nl80211_new_station(struct sk_buff *skb, struct genl_info *info)
|
||||
static int nl80211_del_station(struct sk_buff *skb, struct genl_info *info)
|
||||
{
|
||||
struct cfg80211_registered_device *rdev = info->user_ptr[0];
|
||||
struct net_device *dev = info->user_ptr[1];
|
||||
struct wireless_dev *wdev = dev->ieee80211_ptr;
|
||||
struct wireless_dev *wdev = info->user_ptr[1];
|
||||
struct net_device *dev = wdev->netdev;
|
||||
struct station_del_parameters params;
|
||||
int link_id = nl80211_link_id_or_invalid(info->attrs);
|
||||
|
||||
memset(¶ms, 0, sizeof(params));
|
||||
|
||||
if (!dev)
|
||||
return -EINVAL;
|
||||
|
||||
if (info->attrs[NL80211_ATTR_MAC])
|
||||
params.mac = nla_data(info->attrs[NL80211_ATTR_MAC]);
|
||||
|
||||
@@ -8972,7 +9010,7 @@ static int nl80211_del_station(struct sk_buff *skb, struct genl_info *info)
|
||||
|
||||
params.link_id = link_id;
|
||||
|
||||
return rdev_del_station(rdev, dev, ¶ms);
|
||||
return rdev_del_station(rdev, wdev, ¶ms);
|
||||
}
|
||||
|
||||
static int nl80211_send_mpath(struct sk_buff *msg, u32 portid, u32 seq,
|
||||
@@ -11287,7 +11325,7 @@ static int nl80211_start_radar_detection(struct sk_buff *skb,
|
||||
if (dfs_region == NL80211_DFS_UNSET)
|
||||
return -EINVAL;
|
||||
|
||||
err = nl80211_parse_chandef(rdev, info, &chandef);
|
||||
err = nl80211_parse_chandef(rdev, info->extack, info->attrs, &chandef);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
@@ -11353,6 +11391,7 @@ static int nl80211_start_radar_detection(struct sk_buff *skb,
|
||||
wdev->links[link_id].cac_started = true;
|
||||
wdev->links[link_id].cac_start_time = jiffies;
|
||||
wdev->links[link_id].cac_time_ms = cac_time_ms;
|
||||
cfg80211_set_cac_state(wiphy, &chandef, true);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -11375,7 +11414,7 @@ static int nl80211_notify_radar_detection(struct sk_buff *skb,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
err = nl80211_parse_chandef(rdev, info, &chandef);
|
||||
err = nl80211_parse_chandef(rdev, info->extack, info->attrs, &chandef);
|
||||
if (err) {
|
||||
GENL_SET_ERR_MSG(info, "Unable to extract chandef info");
|
||||
return err;
|
||||
@@ -11560,7 +11599,8 @@ static int nl80211_channel_switch(struct sk_buff *skb, struct genl_info *info)
|
||||
goto free;
|
||||
|
||||
skip_beacons:
|
||||
err = nl80211_parse_chandef(rdev, info, ¶ms.chandef);
|
||||
err = nl80211_parse_chandef(rdev, info->extack, info->attrs,
|
||||
¶ms.chandef);
|
||||
if (err)
|
||||
goto free;
|
||||
|
||||
@@ -12075,7 +12115,8 @@ static int nl80211_authenticate(struct sk_buff *skb, struct genl_info *info)
|
||||
auth_type == NL80211_AUTHTYPE_FILS_SK ||
|
||||
auth_type == NL80211_AUTHTYPE_FILS_SK_PFS ||
|
||||
auth_type == NL80211_AUTHTYPE_FILS_PK ||
|
||||
auth_type == NL80211_AUTHTYPE_EPPKE) &&
|
||||
auth_type == NL80211_AUTHTYPE_EPPKE ||
|
||||
auth_type == NL80211_AUTHTYPE_IEEE8021X) &&
|
||||
!info->attrs[NL80211_ATTR_AUTH_DATA])
|
||||
return -EINVAL;
|
||||
|
||||
@@ -12084,7 +12125,8 @@ static int nl80211_authenticate(struct sk_buff *skb, struct genl_info *info)
|
||||
auth_type != NL80211_AUTHTYPE_FILS_SK &&
|
||||
auth_type != NL80211_AUTHTYPE_FILS_SK_PFS &&
|
||||
auth_type != NL80211_AUTHTYPE_FILS_PK &&
|
||||
auth_type != NL80211_AUTHTYPE_EPPKE)
|
||||
auth_type != NL80211_AUTHTYPE_EPPKE &&
|
||||
auth_type != NL80211_AUTHTYPE_IEEE8021X)
|
||||
return -EINVAL;
|
||||
req.auth_data = nla_data(info->attrs[NL80211_ATTR_AUTH_DATA]);
|
||||
req.auth_data_len = nla_len(info->attrs[NL80211_ATTR_AUTH_DATA]);
|
||||
@@ -12781,7 +12823,8 @@ static int nl80211_join_ibss(struct sk_buff *skb, struct genl_info *info)
|
||||
ibss.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
|
||||
}
|
||||
|
||||
err = nl80211_parse_chandef(rdev, info, &ibss.chandef);
|
||||
err = nl80211_parse_chandef(rdev, info->extack, info->attrs,
|
||||
&ibss.chandef);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
@@ -13779,7 +13822,7 @@ static int nl80211_remain_on_channel(struct sk_buff *skb,
|
||||
duration > rdev->wiphy.max_remain_on_channel_duration)
|
||||
return -EINVAL;
|
||||
|
||||
err = nl80211_parse_chandef(rdev, info, &chandef);
|
||||
err = nl80211_parse_chandef(rdev, info->extack, info->attrs, &chandef);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
@@ -13995,7 +14038,8 @@ static int nl80211_tx_mgmt(struct sk_buff *skb, struct genl_info *info)
|
||||
*/
|
||||
chandef.chan = NULL;
|
||||
if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
|
||||
err = nl80211_parse_chandef(rdev, info, &chandef);
|
||||
err = nl80211_parse_chandef(rdev, info->extack, info->attrs,
|
||||
&chandef);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
@@ -14227,7 +14271,7 @@ static int cfg80211_cqm_rssi_update(struct cfg80211_registered_device *rdev,
|
||||
|
||||
mac_addr = wdev->links[0].client.current_bss->pub.bssid;
|
||||
|
||||
err = rdev_get_station(rdev, dev, mac_addr, &sinfo);
|
||||
err = rdev_get_station(rdev, wdev, mac_addr, &sinfo);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
@@ -14397,7 +14441,8 @@ static int nl80211_join_ocb(struct sk_buff *skb, struct genl_info *info)
|
||||
struct ocb_setup setup = {};
|
||||
int err;
|
||||
|
||||
err = nl80211_parse_chandef(rdev, info, &setup.chandef);
|
||||
err = nl80211_parse_chandef(rdev, info->extack, info->attrs,
|
||||
&setup.chandef);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
@@ -14472,7 +14517,8 @@ static int nl80211_join_mesh(struct sk_buff *skb, struct genl_info *info)
|
||||
cfg.auto_open_plinks = false;
|
||||
|
||||
if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
|
||||
err = nl80211_parse_chandef(rdev, info, &setup.chandef);
|
||||
err = nl80211_parse_chandef(rdev, info->extack, info->attrs,
|
||||
&setup.chandef);
|
||||
if (err)
|
||||
return err;
|
||||
} else {
|
||||
@@ -15725,9 +15771,16 @@ static int nl80211_parse_nan_conf(struct wiphy *wiphy,
|
||||
return err;
|
||||
|
||||
changed |= CFG80211_NAN_CONF_CHANGED_CONFIG;
|
||||
if (attrs[NL80211_NAN_CONF_CLUSTER_ID] && start)
|
||||
conf->cluster_id =
|
||||
nla_data(attrs[NL80211_NAN_CONF_CLUSTER_ID]);
|
||||
if (attrs[NL80211_NAN_CONF_CLUSTER_ID] && start) {
|
||||
ether_addr_copy(conf->cluster_id,
|
||||
nla_data(attrs[NL80211_NAN_CONF_CLUSTER_ID]));
|
||||
} else if (start) {
|
||||
conf->cluster_id[0] = 0x50;
|
||||
conf->cluster_id[1] = 0x6f;
|
||||
conf->cluster_id[2] = 0x9a;
|
||||
conf->cluster_id[3] = 0x01;
|
||||
get_random_bytes(&conf->cluster_id[4], 2);
|
||||
}
|
||||
|
||||
if (attrs[NL80211_NAN_CONF_EXTRA_ATTRS]) {
|
||||
conf->extra_nan_attrs =
|
||||
@@ -16947,7 +17000,7 @@ static int nl80211_tdls_channel_switch(struct sk_buff *skb,
|
||||
!info->attrs[NL80211_ATTR_OPER_CLASS])
|
||||
return -EINVAL;
|
||||
|
||||
err = nl80211_parse_chandef(rdev, info, &chandef);
|
||||
err = nl80211_parse_chandef(rdev, info->extack, info->attrs, &chandef);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
@@ -17326,7 +17379,7 @@ static int nl80211_probe_mesh_link(struct sk_buff *skb, struct genl_info *info)
|
||||
!ether_addr_equal(buf + ETH_ALEN, dev->dev_addr))
|
||||
return -EINVAL;
|
||||
|
||||
err = rdev_get_station(rdev, dev, dest, &sinfo);
|
||||
err = rdev_get_station(rdev, wdev, dest, &sinfo);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
@@ -18021,6 +18074,9 @@ nl80211_epcs_cfg(struct sk_buff *skb, struct genl_info *info)
|
||||
NL80211_FLAG_CLEAR_SKB) \
|
||||
SELECTOR(__sel, WDEV_UP, \
|
||||
NL80211_FLAG_NEED_WDEV_UP) \
|
||||
SELECTOR(__sel, WDEV_UP_CLEAR, \
|
||||
NL80211_FLAG_NEED_WDEV_UP | \
|
||||
NL80211_FLAG_CLEAR_SKB) \
|
||||
SELECTOR(__sel, WDEV_UP_LINK, \
|
||||
NL80211_FLAG_NEED_WDEV_UP | \
|
||||
NL80211_FLAG_MLO_VALID_LINK_ID) \
|
||||
@@ -18353,7 +18409,7 @@ static const struct genl_small_ops nl80211_small_ops[] = {
|
||||
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
||||
.doit = nl80211_get_key,
|
||||
.flags = GENL_UNS_ADMIN_PERM,
|
||||
.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
|
||||
.internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP),
|
||||
},
|
||||
{
|
||||
.cmd = NL80211_CMD_SET_KEY,
|
||||
@@ -18361,7 +18417,7 @@ static const struct genl_small_ops nl80211_small_ops[] = {
|
||||
.doit = nl80211_set_key,
|
||||
.flags = GENL_UNS_ADMIN_PERM,
|
||||
/* cannot use NL80211_FLAG_MLO_VALID_LINK_ID, depends on key */
|
||||
.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP |
|
||||
.internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP |
|
||||
NL80211_FLAG_CLEAR_SKB),
|
||||
},
|
||||
{
|
||||
@@ -18369,7 +18425,7 @@ static const struct genl_small_ops nl80211_small_ops[] = {
|
||||
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
||||
.doit = nl80211_new_key,
|
||||
.flags = GENL_UNS_ADMIN_PERM,
|
||||
.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP |
|
||||
.internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP |
|
||||
NL80211_FLAG_CLEAR_SKB),
|
||||
},
|
||||
{
|
||||
@@ -18377,7 +18433,7 @@ static const struct genl_small_ops nl80211_small_ops[] = {
|
||||
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
||||
.doit = nl80211_del_key,
|
||||
.flags = GENL_UNS_ADMIN_PERM,
|
||||
.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
|
||||
.internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP),
|
||||
},
|
||||
{
|
||||
.cmd = NL80211_CMD_SET_BEACON,
|
||||
@@ -18408,21 +18464,21 @@ static const struct genl_small_ops nl80211_small_ops[] = {
|
||||
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
||||
.doit = nl80211_get_station,
|
||||
.dumpit = nl80211_dump_station,
|
||||
.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV),
|
||||
.internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV),
|
||||
},
|
||||
{
|
||||
.cmd = NL80211_CMD_SET_STATION,
|
||||
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
||||
.doit = nl80211_set_station,
|
||||
.flags = GENL_UNS_ADMIN_PERM,
|
||||
.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
|
||||
.internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP),
|
||||
},
|
||||
{
|
||||
.cmd = NL80211_CMD_NEW_STATION,
|
||||
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
||||
.doit = nl80211_new_station,
|
||||
.flags = GENL_UNS_ADMIN_PERM,
|
||||
.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
|
||||
.internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP),
|
||||
},
|
||||
{
|
||||
.cmd = NL80211_CMD_DEL_STATION,
|
||||
@@ -18433,7 +18489,7 @@ static const struct genl_small_ops nl80211_small_ops[] = {
|
||||
* whether MAC address is passed or not. If MAC address is
|
||||
* passed, then even during MLO, link ID is not required.
|
||||
*/
|
||||
.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
|
||||
.internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP),
|
||||
},
|
||||
{
|
||||
.cmd = NL80211_CMD_GET_MPATH,
|
||||
@@ -20364,21 +20420,21 @@ void cfg80211_tx_mgmt_expired(struct wireless_dev *wdev, u64 cookie,
|
||||
}
|
||||
EXPORT_SYMBOL(cfg80211_tx_mgmt_expired);
|
||||
|
||||
void cfg80211_new_sta(struct net_device *dev, const u8 *mac_addr,
|
||||
void cfg80211_new_sta(struct wireless_dev *wdev, const u8 *mac_addr,
|
||||
struct station_info *sinfo, gfp_t gfp)
|
||||
{
|
||||
struct wiphy *wiphy = dev->ieee80211_ptr->wiphy;
|
||||
struct wiphy *wiphy = wdev->wiphy;
|
||||
struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
|
||||
struct sk_buff *msg;
|
||||
|
||||
trace_cfg80211_new_sta(dev, mac_addr, sinfo);
|
||||
trace_cfg80211_new_sta(wdev, mac_addr, sinfo);
|
||||
|
||||
msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
|
||||
if (!msg)
|
||||
return;
|
||||
|
||||
if (nl80211_send_station(msg, NL80211_CMD_NEW_STATION, 0, 0, 0,
|
||||
rdev, dev, mac_addr, sinfo, false) < 0) {
|
||||
rdev, wdev, mac_addr, sinfo, false) < 0) {
|
||||
nlmsg_free(msg);
|
||||
return;
|
||||
}
|
||||
@@ -20388,10 +20444,10 @@ void cfg80211_new_sta(struct net_device *dev, const u8 *mac_addr,
|
||||
}
|
||||
EXPORT_SYMBOL(cfg80211_new_sta);
|
||||
|
||||
void cfg80211_del_sta_sinfo(struct net_device *dev, const u8 *mac_addr,
|
||||
void cfg80211_del_sta_sinfo(struct wireless_dev *wdev, const u8 *mac_addr,
|
||||
struct station_info *sinfo, gfp_t gfp)
|
||||
{
|
||||
struct wiphy *wiphy = dev->ieee80211_ptr->wiphy;
|
||||
struct wiphy *wiphy = wdev->wiphy;
|
||||
struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
|
||||
struct sk_buff *msg;
|
||||
struct station_info empty_sinfo = {};
|
||||
@@ -20399,7 +20455,7 @@ void cfg80211_del_sta_sinfo(struct net_device *dev, const u8 *mac_addr,
|
||||
if (!sinfo)
|
||||
sinfo = &empty_sinfo;
|
||||
|
||||
trace_cfg80211_del_sta(dev, mac_addr);
|
||||
trace_cfg80211_del_sta(wdev, mac_addr);
|
||||
|
||||
msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
|
||||
if (!msg) {
|
||||
@@ -20408,7 +20464,7 @@ void cfg80211_del_sta_sinfo(struct net_device *dev, const u8 *mac_addr,
|
||||
}
|
||||
|
||||
if (nl80211_send_station(msg, NL80211_CMD_DEL_STATION, 0, 0, 0,
|
||||
rdev, dev, mac_addr, sinfo, false) < 0) {
|
||||
rdev, wdev, mac_addr, sinfo, false) < 0) {
|
||||
nlmsg_free(msg);
|
||||
return;
|
||||
}
|
||||
@@ -21120,6 +21176,46 @@ void cfg80211_ch_switch_notify(struct net_device *dev,
|
||||
}
|
||||
EXPORT_SYMBOL(cfg80211_ch_switch_notify);
|
||||
|
||||
void cfg80211_incumbent_signal_notify(struct wiphy *wiphy,
|
||||
const struct cfg80211_chan_def *chandef,
|
||||
u32 signal_interference_bitmap,
|
||||
gfp_t gfp)
|
||||
{
|
||||
struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
|
||||
struct sk_buff *msg;
|
||||
void *hdr;
|
||||
|
||||
trace_cfg80211_incumbent_signal_notify(wiphy, chandef, signal_interference_bitmap);
|
||||
|
||||
msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
|
||||
if (!msg)
|
||||
return;
|
||||
|
||||
hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_INCUMBENT_SIGNAL_DETECT);
|
||||
if (!hdr)
|
||||
goto nla_put_failure;
|
||||
|
||||
if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx))
|
||||
goto nla_put_failure;
|
||||
|
||||
if (nl80211_send_chandef(msg, chandef))
|
||||
goto nla_put_failure;
|
||||
|
||||
if (nla_put_u32(msg, NL80211_ATTR_INCUMBENT_SIGNAL_INTERFERENCE_BITMAP,
|
||||
signal_interference_bitmap))
|
||||
goto nla_put_failure;
|
||||
|
||||
genlmsg_end(msg, hdr);
|
||||
|
||||
genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
|
||||
NL80211_MCGRP_MLME, gfp);
|
||||
return;
|
||||
|
||||
nla_put_failure:
|
||||
nlmsg_free(msg);
|
||||
}
|
||||
EXPORT_SYMBOL(cfg80211_incumbent_signal_notify);
|
||||
|
||||
void cfg80211_ch_switch_started_notify(struct net_device *dev,
|
||||
struct cfg80211_chan_def *chandef,
|
||||
unsigned int link_id, u8 count,
|
||||
@@ -21222,6 +21318,13 @@ nl80211_radar_notify(struct cfg80211_registered_device *rdev,
|
||||
goto nla_put_failure;
|
||||
}
|
||||
|
||||
if (rdev->background_radar_wdev &&
|
||||
cfg80211_chandef_identical(&rdev->background_radar_chandef,
|
||||
chandef)) {
|
||||
if (nla_put_flag(msg, NL80211_ATTR_RADAR_BACKGROUND))
|
||||
goto nla_put_failure;
|
||||
}
|
||||
|
||||
if (nla_put_u32(msg, NL80211_ATTR_RADAR_EVENT, event))
|
||||
goto nla_put_failure;
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Portions of this file
|
||||
* Copyright (C) 2018, 2020-2024 Intel Corporation
|
||||
* Copyright (C) 2018, 2020-2025 Intel Corporation
|
||||
*/
|
||||
#ifndef __NET_WIRELESS_NL80211_H
|
||||
#define __NET_WIRELESS_NL80211_H
|
||||
@@ -23,7 +23,8 @@ static inline u64 wdev_id(struct wireless_dev *wdev)
|
||||
}
|
||||
|
||||
int nl80211_parse_chandef(struct cfg80211_registered_device *rdev,
|
||||
struct genl_info *info,
|
||||
struct netlink_ext_ack *extack,
|
||||
struct nlattr **attrs,
|
||||
struct cfg80211_chan_def *chandef);
|
||||
int nl80211_parse_random_mac(struct nlattr **attrs,
|
||||
u8 *mac_addr, u8 *mac_addr_mask);
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Copyright (C) 2018 - 2021, 2023 - 2024 Intel Corporation
|
||||
* Copyright (C) 2018 - 2021, 2023 - 2026 Intel Corporation
|
||||
*/
|
||||
#include <net/cfg80211.h>
|
||||
#include "core.h"
|
||||
@@ -237,7 +237,8 @@ static int pmsr_parse_peer(struct cfg80211_registered_device *rdev,
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = nl80211_parse_chandef(rdev, info, &out->chandef);
|
||||
err = nl80211_parse_chandef(rdev, info->extack, info->attrs,
|
||||
&out->chandef);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
/*
|
||||
* Portions of this file
|
||||
* Copyright(c) 2016-2017 Intel Deutschland GmbH
|
||||
* Copyright (C) 2018, 2021-2025 Intel Corporation
|
||||
* Copyright (C) 2018, 2021-2026 Intel Corporation
|
||||
*/
|
||||
#ifndef __CFG80211_RDEV_OPS
|
||||
#define __CFG80211_RDEV_OPS
|
||||
@@ -77,42 +77,42 @@ rdev_change_virtual_intf(struct cfg80211_registered_device *rdev,
|
||||
}
|
||||
|
||||
static inline int rdev_add_key(struct cfg80211_registered_device *rdev,
|
||||
struct net_device *netdev, int link_id,
|
||||
struct wireless_dev *wdev, int link_id,
|
||||
u8 key_index, bool pairwise, const u8 *mac_addr,
|
||||
struct key_params *params)
|
||||
{
|
||||
int ret;
|
||||
trace_rdev_add_key(&rdev->wiphy, netdev, link_id, key_index, pairwise,
|
||||
trace_rdev_add_key(&rdev->wiphy, wdev, link_id, key_index, pairwise,
|
||||
mac_addr, params->mode);
|
||||
ret = rdev->ops->add_key(&rdev->wiphy, netdev, link_id, key_index,
|
||||
ret = rdev->ops->add_key(&rdev->wiphy, wdev, link_id, key_index,
|
||||
pairwise, mac_addr, params);
|
||||
trace_rdev_return_int(&rdev->wiphy, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline int
|
||||
rdev_get_key(struct cfg80211_registered_device *rdev, struct net_device *netdev,
|
||||
rdev_get_key(struct cfg80211_registered_device *rdev, struct wireless_dev *wdev,
|
||||
int link_id, u8 key_index, bool pairwise, const u8 *mac_addr,
|
||||
void *cookie,
|
||||
void (*callback)(void *cookie, struct key_params*))
|
||||
{
|
||||
int ret;
|
||||
trace_rdev_get_key(&rdev->wiphy, netdev, link_id, key_index, pairwise,
|
||||
trace_rdev_get_key(&rdev->wiphy, wdev, link_id, key_index, pairwise,
|
||||
mac_addr);
|
||||
ret = rdev->ops->get_key(&rdev->wiphy, netdev, link_id, key_index,
|
||||
ret = rdev->ops->get_key(&rdev->wiphy, wdev, link_id, key_index,
|
||||
pairwise, mac_addr, cookie, callback);
|
||||
trace_rdev_return_int(&rdev->wiphy, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline int rdev_del_key(struct cfg80211_registered_device *rdev,
|
||||
struct net_device *netdev, int link_id,
|
||||
struct wireless_dev *wdev, int link_id,
|
||||
u8 key_index, bool pairwise, const u8 *mac_addr)
|
||||
{
|
||||
int ret;
|
||||
trace_rdev_del_key(&rdev->wiphy, netdev, link_id, key_index, pairwise,
|
||||
trace_rdev_del_key(&rdev->wiphy, wdev, link_id, key_index, pairwise,
|
||||
mac_addr);
|
||||
ret = rdev->ops->del_key(&rdev->wiphy, netdev, link_id, key_index,
|
||||
ret = rdev->ops->del_key(&rdev->wiphy, wdev, link_id, key_index,
|
||||
pairwise, mac_addr);
|
||||
trace_rdev_return_int(&rdev->wiphy, ret);
|
||||
return ret;
|
||||
@@ -134,12 +134,12 @@ rdev_set_default_key(struct cfg80211_registered_device *rdev,
|
||||
|
||||
static inline int
|
||||
rdev_set_default_mgmt_key(struct cfg80211_registered_device *rdev,
|
||||
struct net_device *netdev, int link_id, u8 key_index)
|
||||
struct wireless_dev *wdev, int link_id, u8 key_index)
|
||||
{
|
||||
int ret;
|
||||
trace_rdev_set_default_mgmt_key(&rdev->wiphy, netdev, link_id,
|
||||
trace_rdev_set_default_mgmt_key(&rdev->wiphy, wdev, link_id,
|
||||
key_index);
|
||||
ret = rdev->ops->set_default_mgmt_key(&rdev->wiphy, netdev, link_id,
|
||||
ret = rdev->ops->set_default_mgmt_key(&rdev->wiphy, wdev, link_id,
|
||||
key_index);
|
||||
trace_rdev_return_int(&rdev->wiphy, ret);
|
||||
return ret;
|
||||
@@ -147,14 +147,14 @@ rdev_set_default_mgmt_key(struct cfg80211_registered_device *rdev,
|
||||
|
||||
static inline int
|
||||
rdev_set_default_beacon_key(struct cfg80211_registered_device *rdev,
|
||||
struct net_device *netdev, int link_id,
|
||||
struct wireless_dev *wdev, int link_id,
|
||||
u8 key_index)
|
||||
{
|
||||
int ret;
|
||||
|
||||
trace_rdev_set_default_beacon_key(&rdev->wiphy, netdev, link_id,
|
||||
trace_rdev_set_default_beacon_key(&rdev->wiphy, wdev, link_id,
|
||||
key_index);
|
||||
ret = rdev->ops->set_default_beacon_key(&rdev->wiphy, netdev, link_id,
|
||||
ret = rdev->ops->set_default_beacon_key(&rdev->wiphy, wdev, link_id,
|
||||
key_index);
|
||||
trace_rdev_return_int(&rdev->wiphy, ret);
|
||||
return ret;
|
||||
@@ -193,56 +193,56 @@ static inline int rdev_stop_ap(struct cfg80211_registered_device *rdev,
|
||||
}
|
||||
|
||||
static inline int rdev_add_station(struct cfg80211_registered_device *rdev,
|
||||
struct net_device *dev, u8 *mac,
|
||||
struct wireless_dev *wdev, u8 *mac,
|
||||
struct station_parameters *params)
|
||||
{
|
||||
int ret;
|
||||
trace_rdev_add_station(&rdev->wiphy, dev, mac, params);
|
||||
ret = rdev->ops->add_station(&rdev->wiphy, dev, mac, params);
|
||||
trace_rdev_add_station(&rdev->wiphy, wdev, mac, params);
|
||||
ret = rdev->ops->add_station(&rdev->wiphy, wdev, mac, params);
|
||||
trace_rdev_return_int(&rdev->wiphy, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline int rdev_del_station(struct cfg80211_registered_device *rdev,
|
||||
struct net_device *dev,
|
||||
struct wireless_dev *wdev,
|
||||
struct station_del_parameters *params)
|
||||
{
|
||||
int ret;
|
||||
trace_rdev_del_station(&rdev->wiphy, dev, params);
|
||||
ret = rdev->ops->del_station(&rdev->wiphy, dev, params);
|
||||
trace_rdev_del_station(&rdev->wiphy, wdev, params);
|
||||
ret = rdev->ops->del_station(&rdev->wiphy, wdev, params);
|
||||
trace_rdev_return_int(&rdev->wiphy, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline int rdev_change_station(struct cfg80211_registered_device *rdev,
|
||||
struct net_device *dev, u8 *mac,
|
||||
struct wireless_dev *wdev, u8 *mac,
|
||||
struct station_parameters *params)
|
||||
{
|
||||
int ret;
|
||||
trace_rdev_change_station(&rdev->wiphy, dev, mac, params);
|
||||
ret = rdev->ops->change_station(&rdev->wiphy, dev, mac, params);
|
||||
trace_rdev_change_station(&rdev->wiphy, wdev, mac, params);
|
||||
ret = rdev->ops->change_station(&rdev->wiphy, wdev, mac, params);
|
||||
trace_rdev_return_int(&rdev->wiphy, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline int rdev_get_station(struct cfg80211_registered_device *rdev,
|
||||
struct net_device *dev, const u8 *mac,
|
||||
struct wireless_dev *wdev, const u8 *mac,
|
||||
struct station_info *sinfo)
|
||||
{
|
||||
int ret;
|
||||
trace_rdev_get_station(&rdev->wiphy, dev, mac);
|
||||
ret = rdev->ops->get_station(&rdev->wiphy, dev, mac, sinfo);
|
||||
trace_rdev_get_station(&rdev->wiphy, wdev, mac);
|
||||
ret = rdev->ops->get_station(&rdev->wiphy, wdev, mac, sinfo);
|
||||
trace_rdev_return_int_station_info(&rdev->wiphy, ret, sinfo);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline int rdev_dump_station(struct cfg80211_registered_device *rdev,
|
||||
struct net_device *dev, int idx, u8 *mac,
|
||||
struct wireless_dev *wdev, int idx, u8 *mac,
|
||||
struct station_info *sinfo)
|
||||
{
|
||||
int ret;
|
||||
trace_rdev_dump_station(&rdev->wiphy, dev, idx, mac);
|
||||
ret = rdev->ops->dump_station(&rdev->wiphy, dev, idx, mac, sinfo);
|
||||
trace_rdev_dump_station(&rdev->wiphy, wdev, idx, mac);
|
||||
ret = rdev->ops->dump_station(&rdev->wiphy, wdev, idx, mac, sinfo);
|
||||
trace_rdev_return_int_station_info(&rdev->wiphy, ret, sinfo);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
* (for nl80211's connect() and wext)
|
||||
*
|
||||
* Copyright 2009 Johannes Berg <johannes@sipsolutions.net>
|
||||
* Copyright (C) 2009, 2020, 2022-2025 Intel Corporation. All rights reserved.
|
||||
* Copyright (C) 2009, 2020, 2022-2026 Intel Corporation. All rights reserved.
|
||||
* Copyright 2017 Intel Deutschland GmbH
|
||||
*/
|
||||
|
||||
@@ -1386,7 +1386,7 @@ void __cfg80211_disconnected(struct net_device *dev, const u8 *ie,
|
||||
NL80211_EXT_FEATURE_BEACON_PROTECTION_CLIENT))
|
||||
max_key_idx = 7;
|
||||
for (i = 0; i <= max_key_idx; i++)
|
||||
rdev_del_key(rdev, dev, -1, i, false, NULL);
|
||||
rdev_del_key(rdev, wdev, -1, i, false, NULL);
|
||||
}
|
||||
|
||||
rdev_set_qos_map(rdev, dev, NULL);
|
||||
|
||||
@@ -99,26 +99,31 @@ static int wiphy_suspend(struct device *dev)
|
||||
rdev->suspend_at = ktime_get_boottime_seconds();
|
||||
|
||||
rtnl_lock();
|
||||
if (!rdev->wiphy.registered)
|
||||
goto out_unlock_rtnl;
|
||||
|
||||
wiphy_lock(&rdev->wiphy);
|
||||
if (rdev->wiphy.registered) {
|
||||
if (!rdev->wiphy.wowlan_config) {
|
||||
cfg80211_leave_all(rdev);
|
||||
cfg80211_process_rdev_events(rdev);
|
||||
}
|
||||
if (rdev->wiphy.wowlan_config) {
|
||||
cfg80211_process_wiphy_works(rdev, NULL);
|
||||
if (rdev->ops->suspend)
|
||||
ret = rdev_suspend(rdev, rdev->wiphy.wowlan_config);
|
||||
if (ret == 1) {
|
||||
/* Driver refuse to configure wowlan */
|
||||
cfg80211_leave_all(rdev);
|
||||
cfg80211_process_rdev_events(rdev);
|
||||
cfg80211_process_wiphy_works(rdev, NULL);
|
||||
ret = rdev_suspend(rdev, NULL);
|
||||
}
|
||||
if (ret == 0)
|
||||
rdev->suspended = true;
|
||||
if (ret <= 0)
|
||||
goto out_unlock_wiphy;
|
||||
}
|
||||
|
||||
/* Driver refused to configure wowlan (ret = 1) or no wowlan */
|
||||
|
||||
cfg80211_leave_all(rdev);
|
||||
cfg80211_process_rdev_events(rdev);
|
||||
cfg80211_process_wiphy_works(rdev, NULL);
|
||||
if (rdev->ops->suspend)
|
||||
ret = rdev_suspend(rdev, NULL);
|
||||
|
||||
out_unlock_wiphy:
|
||||
wiphy_unlock(&rdev->wiphy);
|
||||
out_unlock_rtnl:
|
||||
if (ret == 0)
|
||||
rdev->suspended = true;
|
||||
rtnl_unlock();
|
||||
|
||||
return ret;
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
/*
|
||||
* Portions of this file
|
||||
* Copyright(c) 2016-2017 Intel Deutschland GmbH
|
||||
* Copyright (C) 2018, 2020-2025 Intel Corporation
|
||||
* Copyright (C) 2018, 2020-2026 Intel Corporation
|
||||
*/
|
||||
#undef TRACE_SYSTEM
|
||||
#define TRACE_SYSTEM cfg80211
|
||||
@@ -546,12 +546,12 @@ TRACE_EVENT(rdev_change_virtual_intf,
|
||||
);
|
||||
|
||||
DECLARE_EVENT_CLASS(key_handle,
|
||||
TP_PROTO(struct wiphy *wiphy, struct net_device *netdev, int link_id,
|
||||
TP_PROTO(struct wiphy *wiphy, struct wireless_dev *wdev, int link_id,
|
||||
u8 key_index, bool pairwise, const u8 *mac_addr),
|
||||
TP_ARGS(wiphy, netdev, link_id, key_index, pairwise, mac_addr),
|
||||
TP_ARGS(wiphy, wdev, link_id, key_index, pairwise, mac_addr),
|
||||
TP_STRUCT__entry(
|
||||
WIPHY_ENTRY
|
||||
NETDEV_ENTRY
|
||||
WDEV_ENTRY
|
||||
MAC_ENTRY(mac_addr)
|
||||
__field(int, link_id)
|
||||
__field(u8, key_index)
|
||||
@@ -559,38 +559,38 @@ DECLARE_EVENT_CLASS(key_handle,
|
||||
),
|
||||
TP_fast_assign(
|
||||
WIPHY_ASSIGN;
|
||||
NETDEV_ASSIGN;
|
||||
WDEV_ASSIGN;
|
||||
MAC_ASSIGN(mac_addr, mac_addr);
|
||||
__entry->link_id = link_id;
|
||||
__entry->key_index = key_index;
|
||||
__entry->pairwise = pairwise;
|
||||
),
|
||||
TP_printk(WIPHY_PR_FMT ", " NETDEV_PR_FMT ", link_id: %d, "
|
||||
TP_printk(WIPHY_PR_FMT ", " WDEV_PR_FMT ", link_id: %d, "
|
||||
"key_index: %u, pairwise: %s, mac addr: %pM",
|
||||
WIPHY_PR_ARG, NETDEV_PR_ARG, __entry->link_id,
|
||||
WIPHY_PR_ARG, WDEV_PR_ARG, __entry->link_id,
|
||||
__entry->key_index, BOOL_TO_STR(__entry->pairwise),
|
||||
__entry->mac_addr)
|
||||
);
|
||||
|
||||
DEFINE_EVENT(key_handle, rdev_get_key,
|
||||
TP_PROTO(struct wiphy *wiphy, struct net_device *netdev, int link_id,
|
||||
TP_PROTO(struct wiphy *wiphy, struct wireless_dev *wdev, int link_id,
|
||||
u8 key_index, bool pairwise, const u8 *mac_addr),
|
||||
TP_ARGS(wiphy, netdev, link_id, key_index, pairwise, mac_addr)
|
||||
TP_ARGS(wiphy, wdev, link_id, key_index, pairwise, mac_addr)
|
||||
);
|
||||
|
||||
DEFINE_EVENT(key_handle, rdev_del_key,
|
||||
TP_PROTO(struct wiphy *wiphy, struct net_device *netdev, int link_id,
|
||||
TP_PROTO(struct wiphy *wiphy, struct wireless_dev *wdev, int link_id,
|
||||
u8 key_index, bool pairwise, const u8 *mac_addr),
|
||||
TP_ARGS(wiphy, netdev, link_id, key_index, pairwise, mac_addr)
|
||||
TP_ARGS(wiphy, wdev, link_id, key_index, pairwise, mac_addr)
|
||||
);
|
||||
|
||||
TRACE_EVENT(rdev_add_key,
|
||||
TP_PROTO(struct wiphy *wiphy, struct net_device *netdev, int link_id,
|
||||
TP_PROTO(struct wiphy *wiphy, struct wireless_dev *wdev, int link_id,
|
||||
u8 key_index, bool pairwise, const u8 *mac_addr, u8 mode),
|
||||
TP_ARGS(wiphy, netdev, link_id, key_index, pairwise, mac_addr, mode),
|
||||
TP_ARGS(wiphy, wdev, link_id, key_index, pairwise, mac_addr, mode),
|
||||
TP_STRUCT__entry(
|
||||
WIPHY_ENTRY
|
||||
NETDEV_ENTRY
|
||||
WDEV_ENTRY
|
||||
MAC_ENTRY(mac_addr)
|
||||
__field(int, link_id)
|
||||
__field(u8, key_index)
|
||||
@@ -599,17 +599,17 @@ TRACE_EVENT(rdev_add_key,
|
||||
),
|
||||
TP_fast_assign(
|
||||
WIPHY_ASSIGN;
|
||||
NETDEV_ASSIGN;
|
||||
WDEV_ASSIGN;
|
||||
MAC_ASSIGN(mac_addr, mac_addr);
|
||||
__entry->link_id = link_id;
|
||||
__entry->key_index = key_index;
|
||||
__entry->pairwise = pairwise;
|
||||
__entry->mode = mode;
|
||||
),
|
||||
TP_printk(WIPHY_PR_FMT ", " NETDEV_PR_FMT ", link_id: %d, "
|
||||
TP_printk(WIPHY_PR_FMT ", " WDEV_PR_FMT ", link_id: %d, "
|
||||
"key_index: %u, mode: %u, pairwise: %s, "
|
||||
"mac addr: %pM",
|
||||
WIPHY_PR_ARG, NETDEV_PR_ARG, __entry->link_id,
|
||||
WIPHY_PR_ARG, WDEV_PR_ARG, __entry->link_id,
|
||||
__entry->key_index, __entry->mode,
|
||||
BOOL_TO_STR(__entry->pairwise), __entry->mac_addr)
|
||||
);
|
||||
@@ -642,45 +642,45 @@ TRACE_EVENT(rdev_set_default_key,
|
||||
);
|
||||
|
||||
TRACE_EVENT(rdev_set_default_mgmt_key,
|
||||
TP_PROTO(struct wiphy *wiphy, struct net_device *netdev, int link_id,
|
||||
TP_PROTO(struct wiphy *wiphy, struct wireless_dev *wdev, int link_id,
|
||||
u8 key_index),
|
||||
TP_ARGS(wiphy, netdev, link_id, key_index),
|
||||
TP_ARGS(wiphy, wdev, link_id, key_index),
|
||||
TP_STRUCT__entry(
|
||||
WIPHY_ENTRY
|
||||
NETDEV_ENTRY
|
||||
WDEV_ENTRY
|
||||
__field(int, link_id)
|
||||
__field(u8, key_index)
|
||||
),
|
||||
TP_fast_assign(
|
||||
WIPHY_ASSIGN;
|
||||
NETDEV_ASSIGN;
|
||||
WDEV_ASSIGN;
|
||||
__entry->link_id = link_id;
|
||||
__entry->key_index = key_index;
|
||||
),
|
||||
TP_printk(WIPHY_PR_FMT ", " NETDEV_PR_FMT ", link_id: %d, "
|
||||
"key index: %u", WIPHY_PR_ARG, NETDEV_PR_ARG,
|
||||
__entry->link_id, __entry->key_index)
|
||||
TP_printk(WIPHY_PR_FMT ", " WDEV_PR_FMT ", link_id: %d, key index: %u",
|
||||
WIPHY_PR_ARG, WDEV_PR_ARG, __entry->link_id,
|
||||
__entry->key_index)
|
||||
);
|
||||
|
||||
TRACE_EVENT(rdev_set_default_beacon_key,
|
||||
TP_PROTO(struct wiphy *wiphy, struct net_device *netdev, int link_id,
|
||||
TP_PROTO(struct wiphy *wiphy, struct wireless_dev *wdev, int link_id,
|
||||
u8 key_index),
|
||||
TP_ARGS(wiphy, netdev, link_id, key_index),
|
||||
TP_ARGS(wiphy, wdev, link_id, key_index),
|
||||
TP_STRUCT__entry(
|
||||
WIPHY_ENTRY
|
||||
NETDEV_ENTRY
|
||||
WDEV_ENTRY
|
||||
__field(int, link_id)
|
||||
__field(u8, key_index)
|
||||
),
|
||||
TP_fast_assign(
|
||||
WIPHY_ASSIGN;
|
||||
NETDEV_ASSIGN;
|
||||
WDEV_ASSIGN;
|
||||
__entry->link_id = link_id;
|
||||
__entry->key_index = key_index;
|
||||
),
|
||||
TP_printk(WIPHY_PR_FMT ", " NETDEV_PR_FMT ", link_id: %d, "
|
||||
"key index: %u", WIPHY_PR_ARG, NETDEV_PR_ARG,
|
||||
__entry->link_id, __entry->key_index)
|
||||
TP_printk(WIPHY_PR_FMT ", " WDEV_PR_FMT ", link_id: %d, key index: %u",
|
||||
WIPHY_PR_ARG, WDEV_PR_ARG, __entry->link_id,
|
||||
__entry->key_index)
|
||||
);
|
||||
|
||||
TRACE_EVENT(rdev_start_ap,
|
||||
@@ -856,12 +856,12 @@ TRACE_EVENT(rdev_end_cac,
|
||||
);
|
||||
|
||||
DECLARE_EVENT_CLASS(station_add_change,
|
||||
TP_PROTO(struct wiphy *wiphy, struct net_device *netdev, u8 *mac,
|
||||
TP_PROTO(struct wiphy *wiphy, struct wireless_dev *wdev, u8 *mac,
|
||||
struct station_parameters *params),
|
||||
TP_ARGS(wiphy, netdev, mac, params),
|
||||
TP_ARGS(wiphy, wdev, mac, params),
|
||||
TP_STRUCT__entry(
|
||||
WIPHY_ENTRY
|
||||
NETDEV_ENTRY
|
||||
WDEV_ENTRY
|
||||
MAC_ENTRY(sta_mac)
|
||||
__field(u32, sta_flags_mask)
|
||||
__field(u32, sta_flags_set)
|
||||
@@ -888,7 +888,7 @@ DECLARE_EVENT_CLASS(station_add_change,
|
||||
),
|
||||
TP_fast_assign(
|
||||
WIPHY_ASSIGN;
|
||||
NETDEV_ASSIGN;
|
||||
WDEV_ASSIGN;
|
||||
MAC_ASSIGN(sta_mac, mac);
|
||||
__entry->sta_flags_mask = params->sta_flags_mask;
|
||||
__entry->sta_flags_set = params->sta_flags_set;
|
||||
@@ -936,11 +936,11 @@ DECLARE_EVENT_CLASS(station_add_change,
|
||||
__entry->opmode_notif_used =
|
||||
params->link_sta_params.opmode_notif_used;
|
||||
),
|
||||
TP_printk(WIPHY_PR_FMT ", " NETDEV_PR_FMT ", station mac: %pM"
|
||||
TP_printk(WIPHY_PR_FMT ", " WDEV_PR_FMT ", station mac: %pM"
|
||||
", station flags mask: 0x%x, station flags set: 0x%x, "
|
||||
"station modify mask: 0x%x, listen interval: %d, aid: %u, "
|
||||
"plink action: %u, plink state: %u, uapsd queues: %u, vlan:%s",
|
||||
WIPHY_PR_ARG, NETDEV_PR_ARG, __entry->sta_mac,
|
||||
WIPHY_PR_ARG, WDEV_PR_ARG, __entry->sta_mac,
|
||||
__entry->sta_flags_mask, __entry->sta_flags_set,
|
||||
__entry->sta_modify_mask, __entry->listen_interval,
|
||||
__entry->aid, __entry->plink_action, __entry->plink_state,
|
||||
@@ -948,15 +948,15 @@ DECLARE_EVENT_CLASS(station_add_change,
|
||||
);
|
||||
|
||||
DEFINE_EVENT(station_add_change, rdev_add_station,
|
||||
TP_PROTO(struct wiphy *wiphy, struct net_device *netdev, u8 *mac,
|
||||
TP_PROTO(struct wiphy *wiphy, struct wireless_dev *wdev, u8 *mac,
|
||||
struct station_parameters *params),
|
||||
TP_ARGS(wiphy, netdev, mac, params)
|
||||
TP_ARGS(wiphy, wdev, mac, params)
|
||||
);
|
||||
|
||||
DEFINE_EVENT(station_add_change, rdev_change_station,
|
||||
TP_PROTO(struct wiphy *wiphy, struct net_device *netdev, u8 *mac,
|
||||
TP_PROTO(struct wiphy *wiphy, struct wireless_dev *wdev, u8 *mac,
|
||||
struct station_parameters *params),
|
||||
TP_ARGS(wiphy, netdev, mac, params)
|
||||
TP_ARGS(wiphy, wdev, mac, params)
|
||||
);
|
||||
|
||||
DECLARE_EVENT_CLASS(wiphy_netdev_mac_evt,
|
||||
@@ -977,12 +977,12 @@ DECLARE_EVENT_CLASS(wiphy_netdev_mac_evt,
|
||||
);
|
||||
|
||||
DECLARE_EVENT_CLASS(station_del,
|
||||
TP_PROTO(struct wiphy *wiphy, struct net_device *netdev,
|
||||
TP_PROTO(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
struct station_del_parameters *params),
|
||||
TP_ARGS(wiphy, netdev, params),
|
||||
TP_ARGS(wiphy, wdev, params),
|
||||
TP_STRUCT__entry(
|
||||
WIPHY_ENTRY
|
||||
NETDEV_ENTRY
|
||||
WDEV_ENTRY
|
||||
MAC_ENTRY(sta_mac)
|
||||
__field(u8, subtype)
|
||||
__field(u16, reason_code)
|
||||
@@ -990,28 +990,45 @@ DECLARE_EVENT_CLASS(station_del,
|
||||
),
|
||||
TP_fast_assign(
|
||||
WIPHY_ASSIGN;
|
||||
NETDEV_ASSIGN;
|
||||
WDEV_ASSIGN;
|
||||
MAC_ASSIGN(sta_mac, params->mac);
|
||||
__entry->subtype = params->subtype;
|
||||
__entry->reason_code = params->reason_code;
|
||||
__entry->link_id = params->link_id;
|
||||
),
|
||||
TP_printk(WIPHY_PR_FMT ", " NETDEV_PR_FMT ", station mac: %pM"
|
||||
TP_printk(WIPHY_PR_FMT ", " WDEV_PR_FMT ", station mac: %pM"
|
||||
", subtype: %u, reason_code: %u, link_id: %d",
|
||||
WIPHY_PR_ARG, NETDEV_PR_ARG, __entry->sta_mac,
|
||||
WIPHY_PR_ARG, WDEV_PR_ARG, __entry->sta_mac,
|
||||
__entry->subtype, __entry->reason_code,
|
||||
__entry->link_id)
|
||||
);
|
||||
|
||||
DEFINE_EVENT(station_del, rdev_del_station,
|
||||
TP_PROTO(struct wiphy *wiphy, struct net_device *netdev,
|
||||
TP_PROTO(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
struct station_del_parameters *params),
|
||||
TP_ARGS(wiphy, netdev, params)
|
||||
TP_ARGS(wiphy, wdev, params)
|
||||
);
|
||||
|
||||
DEFINE_EVENT(wiphy_netdev_mac_evt, rdev_get_station,
|
||||
TP_PROTO(struct wiphy *wiphy, struct net_device *netdev, const u8 *mac),
|
||||
TP_ARGS(wiphy, netdev, mac)
|
||||
DECLARE_EVENT_CLASS(wiphy_wdev_mac_evt,
|
||||
TP_PROTO(struct wiphy *wiphy, struct wireless_dev *wdev, const u8 *mac),
|
||||
TP_ARGS(wiphy, wdev, mac),
|
||||
TP_STRUCT__entry(
|
||||
WIPHY_ENTRY
|
||||
WDEV_ENTRY
|
||||
MAC_ENTRY(sta_mac)
|
||||
),
|
||||
TP_fast_assign(
|
||||
WIPHY_ASSIGN;
|
||||
WDEV_ASSIGN;
|
||||
MAC_ASSIGN(sta_mac, mac);
|
||||
),
|
||||
TP_printk(WIPHY_PR_FMT ", " WDEV_PR_FMT ", mac: %pM",
|
||||
WIPHY_PR_ARG, WDEV_PR_ARG, __entry->sta_mac)
|
||||
);
|
||||
|
||||
DEFINE_EVENT(wiphy_wdev_mac_evt, rdev_get_station,
|
||||
TP_PROTO(struct wiphy *wiphy, struct wireless_dev *wdev, const u8 *mac),
|
||||
TP_ARGS(wiphy, wdev, mac)
|
||||
);
|
||||
|
||||
DEFINE_EVENT(wiphy_netdev_mac_evt, rdev_del_mpath,
|
||||
@@ -1020,23 +1037,23 @@ DEFINE_EVENT(wiphy_netdev_mac_evt, rdev_del_mpath,
|
||||
);
|
||||
|
||||
TRACE_EVENT(rdev_dump_station,
|
||||
TP_PROTO(struct wiphy *wiphy, struct net_device *netdev, int _idx,
|
||||
TP_PROTO(struct wiphy *wiphy, struct wireless_dev *wdev, int _idx,
|
||||
u8 *mac),
|
||||
TP_ARGS(wiphy, netdev, _idx, mac),
|
||||
TP_ARGS(wiphy, wdev, _idx, mac),
|
||||
TP_STRUCT__entry(
|
||||
WIPHY_ENTRY
|
||||
NETDEV_ENTRY
|
||||
WDEV_ENTRY
|
||||
MAC_ENTRY(sta_mac)
|
||||
__field(int, idx)
|
||||
),
|
||||
TP_fast_assign(
|
||||
WIPHY_ASSIGN;
|
||||
NETDEV_ASSIGN;
|
||||
WDEV_ASSIGN;
|
||||
MAC_ASSIGN(sta_mac, mac);
|
||||
__entry->idx = _idx;
|
||||
),
|
||||
TP_printk(WIPHY_PR_FMT ", " NETDEV_PR_FMT ", station mac: %pM, idx: %d",
|
||||
WIPHY_PR_ARG, NETDEV_PR_ARG, __entry->sta_mac,
|
||||
TP_printk(WIPHY_PR_FMT ", " WDEV_PR_FMT ", station mac: %pM, idx: %d",
|
||||
WIPHY_PR_ARG, WDEV_PR_ARG, __entry->sta_mac,
|
||||
__entry->idx)
|
||||
);
|
||||
|
||||
@@ -3153,6 +3170,21 @@ DECLARE_EVENT_CLASS(cfg80211_netdev_mac_evt,
|
||||
NETDEV_PR_ARG, __entry->macaddr)
|
||||
);
|
||||
|
||||
DECLARE_EVENT_CLASS(cfg80211_wdev_mac_evt,
|
||||
TP_PROTO(struct wireless_dev *wdev, const u8 *macaddr),
|
||||
TP_ARGS(wdev, macaddr),
|
||||
TP_STRUCT__entry(
|
||||
WDEV_ENTRY
|
||||
MAC_ENTRY(macaddr)
|
||||
),
|
||||
TP_fast_assign(
|
||||
WDEV_ASSIGN;
|
||||
MAC_ASSIGN(macaddr, macaddr);
|
||||
),
|
||||
TP_printk(WDEV_PR_FMT ", mac: %pM",
|
||||
WDEV_PR_ARG, __entry->macaddr)
|
||||
);
|
||||
|
||||
DEFINE_EVENT(cfg80211_netdev_mac_evt, cfg80211_notify_new_peer_candidate,
|
||||
TP_PROTO(struct net_device *netdev, const u8 *macaddr),
|
||||
TP_ARGS(netdev, macaddr)
|
||||
@@ -3342,26 +3374,26 @@ TRACE_EVENT(cfg80211_tx_mgmt_expired,
|
||||
);
|
||||
|
||||
TRACE_EVENT(cfg80211_new_sta,
|
||||
TP_PROTO(struct net_device *netdev, const u8 *mac_addr,
|
||||
TP_PROTO(struct wireless_dev *wdev, const u8 *mac_addr,
|
||||
struct station_info *sinfo),
|
||||
TP_ARGS(netdev, mac_addr, sinfo),
|
||||
TP_ARGS(wdev, mac_addr, sinfo),
|
||||
TP_STRUCT__entry(
|
||||
NETDEV_ENTRY
|
||||
WDEV_ENTRY
|
||||
MAC_ENTRY(mac_addr)
|
||||
SINFO_ENTRY
|
||||
),
|
||||
TP_fast_assign(
|
||||
NETDEV_ASSIGN;
|
||||
WDEV_ASSIGN;
|
||||
MAC_ASSIGN(mac_addr, mac_addr);
|
||||
SINFO_ASSIGN;
|
||||
),
|
||||
TP_printk(NETDEV_PR_FMT ", %pM",
|
||||
NETDEV_PR_ARG, __entry->mac_addr)
|
||||
TP_printk(WDEV_PR_FMT ", %pM",
|
||||
WDEV_PR_ARG, __entry->mac_addr)
|
||||
);
|
||||
|
||||
DEFINE_EVENT(cfg80211_netdev_mac_evt, cfg80211_del_sta,
|
||||
TP_PROTO(struct net_device *netdev, const u8 *macaddr),
|
||||
TP_ARGS(netdev, macaddr)
|
||||
DEFINE_EVENT(cfg80211_wdev_mac_evt, cfg80211_del_sta,
|
||||
TP_PROTO(struct wireless_dev *wdev, const u8 *macaddr),
|
||||
TP_ARGS(wdev, macaddr)
|
||||
);
|
||||
|
||||
TRACE_EVENT(cfg80211_rx_mgmt,
|
||||
@@ -4225,6 +4257,25 @@ TRACE_EVENT(cfg80211_nan_cluster_joined,
|
||||
WDEV_PR_ARG, __entry->cluster_id,
|
||||
__entry->new_cluster ? " [new]" : "")
|
||||
);
|
||||
|
||||
TRACE_EVENT(cfg80211_incumbent_signal_notify,
|
||||
TP_PROTO(struct wiphy *wiphy,
|
||||
const struct cfg80211_chan_def *chandef,
|
||||
u32 signal_interference_bitmap),
|
||||
TP_ARGS(wiphy, chandef, signal_interference_bitmap),
|
||||
TP_STRUCT__entry(
|
||||
WIPHY_ENTRY
|
||||
CHAN_DEF_ENTRY
|
||||
__field(u32, signal_interference_bitmap)
|
||||
),
|
||||
TP_fast_assign(
|
||||
WIPHY_ASSIGN;
|
||||
CHAN_DEF_ASSIGN(chandef);
|
||||
__entry->signal_interference_bitmap = signal_interference_bitmap;
|
||||
),
|
||||
TP_printk(WIPHY_PR_FMT ", " CHAN_DEF_PR_FMT ", signal_interference_bitmap=0x%x",
|
||||
WIPHY_PR_ARG, CHAN_DEF_PR_ARG, __entry->signal_interference_bitmap)
|
||||
);
|
||||
#endif /* !__RDEV_OPS_TRACE || TRACE_HEADER_MULTI_READ */
|
||||
|
||||
#undef TRACE_INCLUDE_PATH
|
||||
|
||||
@@ -1095,7 +1095,7 @@ void cfg80211_upload_connect_keys(struct wireless_dev *wdev)
|
||||
for (i = 0; i < 4; i++) {
|
||||
if (!wdev->connect_keys->params[i].cipher)
|
||||
continue;
|
||||
if (rdev_add_key(rdev, dev, -1, i, false, NULL,
|
||||
if (rdev_add_key(rdev, wdev, -1, i, false, NULL,
|
||||
&wdev->connect_keys->params[i])) {
|
||||
netdev_err(dev, "failed to set key %d\n", i);
|
||||
continue;
|
||||
@@ -2669,7 +2669,7 @@ int cfg80211_get_station(struct net_device *dev, const u8 *mac_addr,
|
||||
|
||||
guard(wiphy)(&rdev->wiphy);
|
||||
|
||||
return rdev_get_station(rdev, dev, mac_addr, sinfo);
|
||||
return rdev_get_station(rdev, wdev, mac_addr, sinfo);
|
||||
}
|
||||
EXPORT_SYMBOL(cfg80211_get_station);
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
* we directly assign the wireless handlers of wireless interfaces.
|
||||
*
|
||||
* Copyright 2008-2009 Johannes Berg <johannes@sipsolutions.net>
|
||||
* Copyright (C) 2019-2023 Intel Corporation
|
||||
* Copyright (C) 2019-2023, 2026 Intel Corporation
|
||||
*/
|
||||
|
||||
#include <linux/export.h>
|
||||
@@ -457,7 +457,7 @@ static int cfg80211_set_encryption(struct cfg80211_registered_device *rdev,
|
||||
!(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN))
|
||||
err = -ENOENT;
|
||||
else
|
||||
err = rdev_del_key(rdev, dev, -1, idx, pairwise,
|
||||
err = rdev_del_key(rdev, wdev, -1, idx, pairwise,
|
||||
addr);
|
||||
}
|
||||
wdev->wext.connect.privacy = false;
|
||||
@@ -496,7 +496,7 @@ static int cfg80211_set_encryption(struct cfg80211_registered_device *rdev,
|
||||
if (wdev->connected ||
|
||||
(wdev->iftype == NL80211_IFTYPE_ADHOC &&
|
||||
wdev->u.ibss.current_bss))
|
||||
err = rdev_add_key(rdev, dev, -1, idx, pairwise, addr, params);
|
||||
err = rdev_add_key(rdev, wdev, -1, idx, pairwise, addr, params);
|
||||
else if (params->cipher != WLAN_CIPHER_SUITE_WEP40 &&
|
||||
params->cipher != WLAN_CIPHER_SUITE_WEP104)
|
||||
return -EINVAL;
|
||||
@@ -549,7 +549,7 @@ static int cfg80211_set_encryption(struct cfg80211_registered_device *rdev,
|
||||
if (wdev->connected ||
|
||||
(wdev->iftype == NL80211_IFTYPE_ADHOC &&
|
||||
wdev->u.ibss.current_bss))
|
||||
err = rdev_set_default_mgmt_key(rdev, dev, -1, idx);
|
||||
err = rdev_set_default_mgmt_key(rdev, wdev, -1, idx);
|
||||
if (!err)
|
||||
wdev->wext.default_mgmt_key = idx;
|
||||
return err;
|
||||
@@ -1261,7 +1261,7 @@ static int cfg80211_wext_giwrate(struct net_device *dev,
|
||||
return err;
|
||||
|
||||
scoped_guard(wiphy, &rdev->wiphy) {
|
||||
err = rdev_get_station(rdev, dev, addr, &sinfo);
|
||||
err = rdev_get_station(rdev, wdev, addr, &sinfo);
|
||||
}
|
||||
if (err)
|
||||
return err;
|
||||
@@ -1305,7 +1305,7 @@ static struct iw_statistics *cfg80211_wireless_stats(struct net_device *dev)
|
||||
|
||||
memset(&sinfo, 0, sizeof(sinfo));
|
||||
|
||||
ret = rdev_get_station(rdev, dev, bssid, &sinfo);
|
||||
ret = rdev_get_station(rdev, wdev, bssid, &sinfo);
|
||||
wiphy_unlock(&rdev->wiphy);
|
||||
|
||||
if (ret)
|
||||
|
||||
Reference in New Issue
Block a user