mirror of
https://github.com/tbsdtv/linux_media.git
synced 2025-07-23 12:43:29 +02:00
Merge tag 'mac80211-next-for-net-next-2020-12-11' of git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next
Johannes Berg says: ==================== A new set of wireless changes: * validate key indices for key deletion * more preamble support in mac80211 * various 6 GHz scan fixes/improvements * a common SAR power limitations API * various small fixes & code improvements * tag 'mac80211-next-for-net-next-2020-12-11' of git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next: (35 commits) mac80211: add ieee80211_set_sar_specs nl80211: add common API to configure SAR power limitations mac80211: fix a mistake check for rx_stats update mac80211: mlme: save ssid info to ieee80211_bss_conf while assoc mac80211: Update rate control on channel change mac80211: don't filter out beacons once we start CSA mac80211: Fix calculation of minimal channel width mac80211: ignore country element TX power on 6 GHz mac80211: use bitfield helpers for BA session action frames mac80211: support Rx timestamp calculation for all preamble types mac80211: don't set set TDLS STA bandwidth wider than possible mac80211: support driver-based disconnect with reconnect hint cfg80211: support immediate reconnect request hint mac80211: use struct assignment for he_obss_pd cfg80211: remove struct ieee80211_he_bss_color nl80211: validate key indexes for cfg80211_registered_device cfg80211: include block-tx flag in channel switch started event mac80211: disallow band-switch during CSA ieee80211: update reduced neighbor report TBTT info length cfg80211: Save the regulatory domain when setting custom regulatory ... ==================== Link: https://lore.kernel.org/r/20201211142552.209018-1-johannes@sipsolutions.net Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
@@ -433,6 +433,8 @@ void cfg80211_sme_abandon_assoc(struct wireless_dev *wdev);
|
||||
|
||||
/* internal helpers */
|
||||
bool cfg80211_supported_cipher_suite(struct wiphy *wiphy, u32 cipher);
|
||||
bool cfg80211_valid_key_idx(struct cfg80211_registered_device *rdev,
|
||||
int key_idx, bool pairwise);
|
||||
int cfg80211_validate_key_settings(struct cfg80211_registered_device *rdev,
|
||||
struct key_params *params, int key_idx,
|
||||
bool pairwise, const u8 *mac_addr);
|
||||
|
@@ -4,7 +4,7 @@
|
||||
*
|
||||
* Copyright (c) 2009, Jouni Malinen <j@w1.fi>
|
||||
* Copyright (c) 2015 Intel Deutschland GmbH
|
||||
* Copyright (C) 2019 Intel Corporation
|
||||
* Copyright (C) 2019-2020 Intel Corporation
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
@@ -81,7 +81,8 @@ static void cfg80211_process_auth(struct wireless_dev *wdev,
|
||||
}
|
||||
|
||||
static void cfg80211_process_deauth(struct wireless_dev *wdev,
|
||||
const u8 *buf, size_t len)
|
||||
const u8 *buf, size_t len,
|
||||
bool reconnect)
|
||||
{
|
||||
struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
|
||||
struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)buf;
|
||||
@@ -89,7 +90,7 @@ static void cfg80211_process_deauth(struct wireless_dev *wdev,
|
||||
u16 reason_code = le16_to_cpu(mgmt->u.deauth.reason_code);
|
||||
bool from_ap = !ether_addr_equal(mgmt->sa, wdev->netdev->dev_addr);
|
||||
|
||||
nl80211_send_deauth(rdev, wdev->netdev, buf, len, GFP_KERNEL);
|
||||
nl80211_send_deauth(rdev, wdev->netdev, buf, len, reconnect, GFP_KERNEL);
|
||||
|
||||
if (!wdev->current_bss ||
|
||||
!ether_addr_equal(wdev->current_bss->pub.bssid, bssid))
|
||||
@@ -100,7 +101,8 @@ static void cfg80211_process_deauth(struct wireless_dev *wdev,
|
||||
}
|
||||
|
||||
static void cfg80211_process_disassoc(struct wireless_dev *wdev,
|
||||
const u8 *buf, size_t len)
|
||||
const u8 *buf, size_t len,
|
||||
bool reconnect)
|
||||
{
|
||||
struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
|
||||
struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)buf;
|
||||
@@ -108,7 +110,8 @@ static void cfg80211_process_disassoc(struct wireless_dev *wdev,
|
||||
u16 reason_code = le16_to_cpu(mgmt->u.disassoc.reason_code);
|
||||
bool from_ap = !ether_addr_equal(mgmt->sa, wdev->netdev->dev_addr);
|
||||
|
||||
nl80211_send_disassoc(rdev, wdev->netdev, buf, len, GFP_KERNEL);
|
||||
nl80211_send_disassoc(rdev, wdev->netdev, buf, len, reconnect,
|
||||
GFP_KERNEL);
|
||||
|
||||
if (WARN_ON(!wdev->current_bss ||
|
||||
!ether_addr_equal(wdev->current_bss->pub.bssid, bssid)))
|
||||
@@ -133,9 +136,9 @@ void cfg80211_rx_mlme_mgmt(struct net_device *dev, const u8 *buf, size_t len)
|
||||
if (ieee80211_is_auth(mgmt->frame_control))
|
||||
cfg80211_process_auth(wdev, buf, len);
|
||||
else if (ieee80211_is_deauth(mgmt->frame_control))
|
||||
cfg80211_process_deauth(wdev, buf, len);
|
||||
cfg80211_process_deauth(wdev, buf, len, false);
|
||||
else if (ieee80211_is_disassoc(mgmt->frame_control))
|
||||
cfg80211_process_disassoc(wdev, buf, len);
|
||||
cfg80211_process_disassoc(wdev, buf, len, false);
|
||||
}
|
||||
EXPORT_SYMBOL(cfg80211_rx_mlme_mgmt);
|
||||
|
||||
@@ -180,22 +183,23 @@ void cfg80211_abandon_assoc(struct net_device *dev, struct cfg80211_bss *bss)
|
||||
}
|
||||
EXPORT_SYMBOL(cfg80211_abandon_assoc);
|
||||
|
||||
void cfg80211_tx_mlme_mgmt(struct net_device *dev, const u8 *buf, size_t len)
|
||||
void cfg80211_tx_mlme_mgmt(struct net_device *dev, const u8 *buf, size_t len,
|
||||
bool reconnect)
|
||||
{
|
||||
struct wireless_dev *wdev = dev->ieee80211_ptr;
|
||||
struct ieee80211_mgmt *mgmt = (void *)buf;
|
||||
|
||||
ASSERT_WDEV_LOCK(wdev);
|
||||
|
||||
trace_cfg80211_tx_mlme_mgmt(dev, buf, len);
|
||||
trace_cfg80211_tx_mlme_mgmt(dev, buf, len, reconnect);
|
||||
|
||||
if (WARN_ON(len < 2))
|
||||
return;
|
||||
|
||||
if (ieee80211_is_deauth(mgmt->frame_control))
|
||||
cfg80211_process_deauth(wdev, buf, len);
|
||||
cfg80211_process_deauth(wdev, buf, len, reconnect);
|
||||
else
|
||||
cfg80211_process_disassoc(wdev, buf, len);
|
||||
cfg80211_process_disassoc(wdev, buf, len, reconnect);
|
||||
}
|
||||
EXPORT_SYMBOL(cfg80211_tx_mlme_mgmt);
|
||||
|
||||
|
@@ -399,6 +399,18 @@ nl80211_unsol_bcast_probe_resp_policy[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_MAX +
|
||||
.len = IEEE80211_MAX_DATA_LEN }
|
||||
};
|
||||
|
||||
static const struct nla_policy
|
||||
sar_specs_policy[NL80211_SAR_ATTR_SPECS_MAX + 1] = {
|
||||
[NL80211_SAR_ATTR_SPECS_POWER] = { .type = NLA_S32 },
|
||||
[NL80211_SAR_ATTR_SPECS_RANGE_INDEX] = {.type = NLA_U32 },
|
||||
};
|
||||
|
||||
static const struct nla_policy
|
||||
sar_policy[NL80211_SAR_ATTR_MAX + 1] = {
|
||||
[NL80211_SAR_ATTR_TYPE] = NLA_POLICY_MAX(NLA_U32, NUM_NL80211_SAR_TYPE),
|
||||
[NL80211_SAR_ATTR_SPECS] = NLA_POLICY_NESTED_ARRAY(sar_specs_policy),
|
||||
};
|
||||
|
||||
static const struct nla_policy nl80211_policy[NUM_NL80211_ATTR] = {
|
||||
[0] = { .strict_start_type = NL80211_ATTR_HE_OBSS_PD },
|
||||
[NL80211_ATTR_WIPHY] = { .type = NLA_U32 },
|
||||
@@ -718,6 +730,8 @@ static const struct nla_policy nl80211_policy[NUM_NL80211_ATTR] = {
|
||||
[NL80211_ATTR_SAE_PWE] =
|
||||
NLA_POLICY_RANGE(NLA_U8, NL80211_SAE_PWE_HUNT_AND_PECK,
|
||||
NL80211_SAE_PWE_BOTH),
|
||||
[NL80211_ATTR_RECONNECT_REQUESTED] = { .type = NLA_REJECT },
|
||||
[NL80211_ATTR_SAR_SPEC] = NLA_POLICY_NESTED(sar_policy),
|
||||
};
|
||||
|
||||
/* policy for the key attributes */
|
||||
@@ -2094,6 +2108,56 @@ fail:
|
||||
return -ENOBUFS;
|
||||
}
|
||||
|
||||
static int
|
||||
nl80211_put_sar_specs(struct cfg80211_registered_device *rdev,
|
||||
struct sk_buff *msg)
|
||||
{
|
||||
struct nlattr *sar_capa, *specs, *sub_freq_range;
|
||||
u8 num_freq_ranges;
|
||||
int i;
|
||||
|
||||
if (!rdev->wiphy.sar_capa)
|
||||
return 0;
|
||||
|
||||
num_freq_ranges = rdev->wiphy.sar_capa->num_freq_ranges;
|
||||
|
||||
sar_capa = nla_nest_start(msg, NL80211_ATTR_SAR_SPEC);
|
||||
if (!sar_capa)
|
||||
return -ENOSPC;
|
||||
|
||||
if (nla_put_u32(msg, NL80211_SAR_ATTR_TYPE, rdev->wiphy.sar_capa->type))
|
||||
goto fail;
|
||||
|
||||
specs = nla_nest_start(msg, NL80211_SAR_ATTR_SPECS);
|
||||
if (!specs)
|
||||
goto fail;
|
||||
|
||||
/* report supported freq_ranges */
|
||||
for (i = 0; i < num_freq_ranges; i++) {
|
||||
sub_freq_range = nla_nest_start(msg, i + 1);
|
||||
if (!sub_freq_range)
|
||||
goto fail;
|
||||
|
||||
if (nla_put_u32(msg, NL80211_SAR_ATTR_SPECS_START_FREQ,
|
||||
rdev->wiphy.sar_capa->freq_ranges[i].start_freq))
|
||||
goto fail;
|
||||
|
||||
if (nla_put_u32(msg, NL80211_SAR_ATTR_SPECS_END_FREQ,
|
||||
rdev->wiphy.sar_capa->freq_ranges[i].end_freq))
|
||||
goto fail;
|
||||
|
||||
nla_nest_end(msg, sub_freq_range);
|
||||
}
|
||||
|
||||
nla_nest_end(msg, specs);
|
||||
nla_nest_end(msg, sar_capa);
|
||||
|
||||
return 0;
|
||||
fail:
|
||||
nla_nest_cancel(msg, sar_capa);
|
||||
return -ENOBUFS;
|
||||
}
|
||||
|
||||
struct nl80211_dump_wiphy_state {
|
||||
s64 filter_wiphy;
|
||||
long start;
|
||||
@@ -2343,6 +2407,8 @@ static int nl80211_send_wiphy(struct cfg80211_registered_device *rdev,
|
||||
CMD(set_multicast_to_unicast, SET_MULTICAST_TO_UNICAST);
|
||||
CMD(update_connect_params, UPDATE_CONNECT_PARAMS);
|
||||
CMD(update_ft_ies, UPDATE_FT_IES);
|
||||
if (rdev->wiphy.sar_capa)
|
||||
CMD(set_sar_specs, SET_SAR_SPECS);
|
||||
}
|
||||
#undef CMD
|
||||
|
||||
@@ -2668,6 +2734,11 @@ static int nl80211_send_wiphy(struct cfg80211_registered_device *rdev,
|
||||
|
||||
if (nl80211_put_tid_config_support(rdev, msg))
|
||||
goto nla_put_failure;
|
||||
state->split_start++;
|
||||
break;
|
||||
case 16:
|
||||
if (nl80211_put_sar_specs(rdev, msg))
|
||||
goto nla_put_failure;
|
||||
|
||||
/* done */
|
||||
state->split_start = 0;
|
||||
@@ -4239,9 +4310,6 @@ static int nl80211_del_key(struct sk_buff *skb, struct genl_info *info)
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if (key.idx < 0)
|
||||
return -EINVAL;
|
||||
|
||||
if (info->attrs[NL80211_ATTR_MAC])
|
||||
mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
|
||||
|
||||
@@ -4257,6 +4325,10 @@ static int nl80211_del_key(struct sk_buff *skb, struct genl_info *info)
|
||||
key.type != NL80211_KEYTYPE_GROUP)
|
||||
return -EINVAL;
|
||||
|
||||
if (!cfg80211_valid_key_idx(rdev, key.idx,
|
||||
key.type == NL80211_KEYTYPE_PAIRWISE))
|
||||
return -EINVAL;
|
||||
|
||||
if (!rdev->ops->del_key)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
@@ -5017,6 +5089,8 @@ static void nl80211_check_ap_rate_selectors(struct cfg80211_ap_settings *params,
|
||||
params->vht_required = true;
|
||||
if (rates[2 + i] == BSS_MEMBERSHIP_SELECTOR_HE_PHY)
|
||||
params->he_required = true;
|
||||
if (rates[2 + i] == BSS_MEMBERSHIP_SELECTOR_SAE_H2E)
|
||||
params->sae_h2e_required = true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8241,12 +8315,6 @@ static int nl80211_trigger_scan(struct sk_buff *skb, struct genl_info *info)
|
||||
}
|
||||
|
||||
if (info->attrs[NL80211_ATTR_MEASUREMENT_DURATION]) {
|
||||
if (!wiphy_ext_feature_isset(wiphy,
|
||||
NL80211_EXT_FEATURE_SET_SCAN_DWELL)) {
|
||||
err = -EOPNOTSUPP;
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
request->duration =
|
||||
nla_get_u16(info->attrs[NL80211_ATTR_MEASUREMENT_DURATION]);
|
||||
request->duration_mandatory =
|
||||
@@ -11175,6 +11243,7 @@ static int nl80211_tx_mgmt(struct sk_buff *skb, struct genl_info *info)
|
||||
case NL80211_IFTYPE_P2P_DEVICE:
|
||||
if (!info->attrs[NL80211_ATTR_WIPHY_FREQ])
|
||||
return -EINVAL;
|
||||
break;
|
||||
case NL80211_IFTYPE_STATION:
|
||||
case NL80211_IFTYPE_ADHOC:
|
||||
case NL80211_IFTYPE_P2P_CLIENT:
|
||||
@@ -14669,6 +14738,111 @@ static void nl80211_post_doit(const struct genl_ops *ops, struct sk_buff *skb,
|
||||
}
|
||||
}
|
||||
|
||||
static int nl80211_set_sar_sub_specs(struct cfg80211_registered_device *rdev,
|
||||
struct cfg80211_sar_specs *sar_specs,
|
||||
struct nlattr *spec[], int index)
|
||||
{
|
||||
u32 range_index, i;
|
||||
|
||||
if (!sar_specs || !spec)
|
||||
return -EINVAL;
|
||||
|
||||
if (!spec[NL80211_SAR_ATTR_SPECS_POWER] ||
|
||||
!spec[NL80211_SAR_ATTR_SPECS_RANGE_INDEX])
|
||||
return -EINVAL;
|
||||
|
||||
range_index = nla_get_u32(spec[NL80211_SAR_ATTR_SPECS_RANGE_INDEX]);
|
||||
|
||||
/* check if range_index exceeds num_freq_ranges */
|
||||
if (range_index >= rdev->wiphy.sar_capa->num_freq_ranges)
|
||||
return -EINVAL;
|
||||
|
||||
/* check if range_index duplicates */
|
||||
for (i = 0; i < index; i++) {
|
||||
if (sar_specs->sub_specs[i].freq_range_index == range_index)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
sar_specs->sub_specs[index].power =
|
||||
nla_get_s32(spec[NL80211_SAR_ATTR_SPECS_POWER]);
|
||||
|
||||
sar_specs->sub_specs[index].freq_range_index = range_index;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int nl80211_set_sar_specs(struct sk_buff *skb, struct genl_info *info)
|
||||
{
|
||||
struct cfg80211_registered_device *rdev = info->user_ptr[0];
|
||||
struct nlattr *spec[NL80211_SAR_ATTR_SPECS_MAX + 1];
|
||||
struct nlattr *tb[NL80211_SAR_ATTR_MAX + 1];
|
||||
struct cfg80211_sar_specs *sar_spec;
|
||||
enum nl80211_sar_type type;
|
||||
struct nlattr *spec_list;
|
||||
u32 specs;
|
||||
int rem, err;
|
||||
|
||||
if (!rdev->wiphy.sar_capa || !rdev->ops->set_sar_specs)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (!info->attrs[NL80211_ATTR_SAR_SPEC])
|
||||
return -EINVAL;
|
||||
|
||||
nla_parse_nested(tb, NL80211_SAR_ATTR_MAX,
|
||||
info->attrs[NL80211_ATTR_SAR_SPEC],
|
||||
NULL, NULL);
|
||||
|
||||
if (!tb[NL80211_SAR_ATTR_TYPE] || !tb[NL80211_SAR_ATTR_SPECS])
|
||||
return -EINVAL;
|
||||
|
||||
type = nla_get_u32(tb[NL80211_SAR_ATTR_TYPE]);
|
||||
if (type != rdev->wiphy.sar_capa->type)
|
||||
return -EINVAL;
|
||||
|
||||
specs = 0;
|
||||
nla_for_each_nested(spec_list, tb[NL80211_SAR_ATTR_SPECS], rem)
|
||||
specs++;
|
||||
|
||||
if (specs > rdev->wiphy.sar_capa->num_freq_ranges)
|
||||
return -EINVAL;
|
||||
|
||||
sar_spec = kzalloc(sizeof(*sar_spec) +
|
||||
specs * sizeof(struct cfg80211_sar_sub_specs),
|
||||
GFP_KERNEL);
|
||||
if (!sar_spec)
|
||||
return -ENOMEM;
|
||||
|
||||
sar_spec->type = type;
|
||||
specs = 0;
|
||||
nla_for_each_nested(spec_list, tb[NL80211_SAR_ATTR_SPECS], rem) {
|
||||
nla_parse_nested(spec, NL80211_SAR_ATTR_SPECS_MAX,
|
||||
spec_list, NULL, NULL);
|
||||
|
||||
switch (type) {
|
||||
case NL80211_SAR_TYPE_POWER:
|
||||
if (nl80211_set_sar_sub_specs(rdev, sar_spec,
|
||||
spec, specs)) {
|
||||
err = -EINVAL;
|
||||
goto error;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
err = -EINVAL;
|
||||
goto error;
|
||||
}
|
||||
specs++;
|
||||
}
|
||||
|
||||
sar_spec->num_sub_specs = specs;
|
||||
|
||||
rdev->cur_cmd_info = info;
|
||||
err = rdev_set_sar_specs(rdev, sar_spec);
|
||||
rdev->cur_cmd_info = NULL;
|
||||
error:
|
||||
kfree(sar_spec);
|
||||
return err;
|
||||
}
|
||||
|
||||
static const struct genl_ops nl80211_ops[] = {
|
||||
{
|
||||
.cmd = NL80211_CMD_GET_WIPHY,
|
||||
@@ -15522,6 +15696,14 @@ static const struct genl_small_ops nl80211_small_ops[] = {
|
||||
.internal_flags = NL80211_FLAG_NEED_NETDEV |
|
||||
NL80211_FLAG_NEED_RTNL,
|
||||
},
|
||||
{
|
||||
.cmd = NL80211_CMD_SET_SAR_SPECS,
|
||||
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
||||
.doit = nl80211_set_sar_specs,
|
||||
.flags = GENL_UNS_ADMIN_PERM,
|
||||
.internal_flags = NL80211_FLAG_NEED_WIPHY |
|
||||
NL80211_FLAG_NEED_RTNL,
|
||||
},
|
||||
};
|
||||
|
||||
static struct genl_family nl80211_fam __ro_after_init = {
|
||||
@@ -15857,7 +16039,7 @@ static void nl80211_send_mlme_event(struct cfg80211_registered_device *rdev,
|
||||
const u8 *buf, size_t len,
|
||||
enum nl80211_commands cmd, gfp_t gfp,
|
||||
int uapsd_queues, const u8 *req_ies,
|
||||
size_t req_ies_len)
|
||||
size_t req_ies_len, bool reconnect)
|
||||
{
|
||||
struct sk_buff *msg;
|
||||
void *hdr;
|
||||
@@ -15879,6 +16061,9 @@ static void nl80211_send_mlme_event(struct cfg80211_registered_device *rdev,
|
||||
nla_put(msg, NL80211_ATTR_REQ_IE, req_ies_len, req_ies)))
|
||||
goto nla_put_failure;
|
||||
|
||||
if (reconnect && nla_put_flag(msg, NL80211_ATTR_RECONNECT_REQUESTED))
|
||||
goto nla_put_failure;
|
||||
|
||||
if (uapsd_queues >= 0) {
|
||||
struct nlattr *nla_wmm =
|
||||
nla_nest_start_noflag(msg, NL80211_ATTR_STA_WME);
|
||||
@@ -15907,7 +16092,8 @@ void nl80211_send_rx_auth(struct cfg80211_registered_device *rdev,
|
||||
size_t len, gfp_t gfp)
|
||||
{
|
||||
nl80211_send_mlme_event(rdev, netdev, buf, len,
|
||||
NL80211_CMD_AUTHENTICATE, gfp, -1, NULL, 0);
|
||||
NL80211_CMD_AUTHENTICATE, gfp, -1, NULL, 0,
|
||||
false);
|
||||
}
|
||||
|
||||
void nl80211_send_rx_assoc(struct cfg80211_registered_device *rdev,
|
||||
@@ -15917,23 +16103,25 @@ void nl80211_send_rx_assoc(struct cfg80211_registered_device *rdev,
|
||||
{
|
||||
nl80211_send_mlme_event(rdev, netdev, buf, len,
|
||||
NL80211_CMD_ASSOCIATE, gfp, uapsd_queues,
|
||||
req_ies, req_ies_len);
|
||||
req_ies, req_ies_len, false);
|
||||
}
|
||||
|
||||
void nl80211_send_deauth(struct cfg80211_registered_device *rdev,
|
||||
struct net_device *netdev, const u8 *buf,
|
||||
size_t len, gfp_t gfp)
|
||||
size_t len, bool reconnect, gfp_t gfp)
|
||||
{
|
||||
nl80211_send_mlme_event(rdev, netdev, buf, len,
|
||||
NL80211_CMD_DEAUTHENTICATE, gfp, -1, NULL, 0);
|
||||
NL80211_CMD_DEAUTHENTICATE, gfp, -1, NULL, 0,
|
||||
reconnect);
|
||||
}
|
||||
|
||||
void nl80211_send_disassoc(struct cfg80211_registered_device *rdev,
|
||||
struct net_device *netdev, const u8 *buf,
|
||||
size_t len, gfp_t gfp)
|
||||
size_t len, bool reconnect, gfp_t gfp)
|
||||
{
|
||||
nl80211_send_mlme_event(rdev, netdev, buf, len,
|
||||
NL80211_CMD_DISASSOCIATE, gfp, -1, NULL, 0);
|
||||
NL80211_CMD_DISASSOCIATE, gfp, -1, NULL, 0,
|
||||
reconnect);
|
||||
}
|
||||
|
||||
void cfg80211_rx_unprot_mlme_mgmt(struct net_device *dev, const u8 *buf,
|
||||
@@ -15964,7 +16152,7 @@ void cfg80211_rx_unprot_mlme_mgmt(struct net_device *dev, const u8 *buf,
|
||||
|
||||
trace_cfg80211_rx_unprot_mlme_mgmt(dev, buf, len);
|
||||
nl80211_send_mlme_event(rdev, dev, buf, len, cmd, GFP_ATOMIC, -1,
|
||||
NULL, 0);
|
||||
NULL, 0, false);
|
||||
}
|
||||
EXPORT_SYMBOL(cfg80211_rx_unprot_mlme_mgmt);
|
||||
|
||||
@@ -17065,7 +17253,7 @@ static void nl80211_ch_switch_notify(struct cfg80211_registered_device *rdev,
|
||||
struct cfg80211_chan_def *chandef,
|
||||
gfp_t gfp,
|
||||
enum nl80211_commands notif,
|
||||
u8 count)
|
||||
u8 count, bool quiet)
|
||||
{
|
||||
struct sk_buff *msg;
|
||||
void *hdr;
|
||||
@@ -17086,9 +17274,13 @@ static void nl80211_ch_switch_notify(struct cfg80211_registered_device *rdev,
|
||||
if (nl80211_send_chandef(msg, chandef))
|
||||
goto nla_put_failure;
|
||||
|
||||
if ((notif == NL80211_CMD_CH_SWITCH_STARTED_NOTIFY) &&
|
||||
(nla_put_u32(msg, NL80211_ATTR_CH_SWITCH_COUNT, count)))
|
||||
if (notif == NL80211_CMD_CH_SWITCH_STARTED_NOTIFY) {
|
||||
if (nla_put_u32(msg, NL80211_ATTR_CH_SWITCH_COUNT, count))
|
||||
goto nla_put_failure;
|
||||
if (quiet &&
|
||||
nla_put_flag(msg, NL80211_ATTR_CH_SWITCH_BLOCK_TX))
|
||||
goto nla_put_failure;
|
||||
}
|
||||
|
||||
genlmsg_end(msg, hdr);
|
||||
|
||||
@@ -17121,13 +17313,13 @@ void cfg80211_ch_switch_notify(struct net_device *dev,
|
||||
cfg80211_sched_dfs_chan_update(rdev);
|
||||
|
||||
nl80211_ch_switch_notify(rdev, dev, chandef, GFP_KERNEL,
|
||||
NL80211_CMD_CH_SWITCH_NOTIFY, 0);
|
||||
NL80211_CMD_CH_SWITCH_NOTIFY, 0, false);
|
||||
}
|
||||
EXPORT_SYMBOL(cfg80211_ch_switch_notify);
|
||||
|
||||
void cfg80211_ch_switch_started_notify(struct net_device *dev,
|
||||
struct cfg80211_chan_def *chandef,
|
||||
u8 count)
|
||||
u8 count, bool quiet)
|
||||
{
|
||||
struct wireless_dev *wdev = dev->ieee80211_ptr;
|
||||
struct wiphy *wiphy = wdev->wiphy;
|
||||
@@ -17136,7 +17328,8 @@ void cfg80211_ch_switch_started_notify(struct net_device *dev,
|
||||
trace_cfg80211_ch_switch_started_notify(dev, chandef);
|
||||
|
||||
nl80211_ch_switch_notify(rdev, dev, chandef, GFP_KERNEL,
|
||||
NL80211_CMD_CH_SWITCH_STARTED_NOTIFY, count);
|
||||
NL80211_CMD_CH_SWITCH_STARTED_NOTIFY,
|
||||
count, quiet);
|
||||
}
|
||||
EXPORT_SYMBOL(cfg80211_ch_switch_started_notify);
|
||||
|
||||
|
@@ -1,7 +1,7 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Portions of this file
|
||||
* Copyright (C) 2018 Intel Corporation
|
||||
* Copyright (C) 2018, 2020 Intel Corporation
|
||||
*/
|
||||
#ifndef __NET_WIRELESS_NL80211_H
|
||||
#define __NET_WIRELESS_NL80211_H
|
||||
@@ -69,10 +69,12 @@ void nl80211_send_rx_assoc(struct cfg80211_registered_device *rdev,
|
||||
const u8 *req_ies, size_t req_ies_len);
|
||||
void nl80211_send_deauth(struct cfg80211_registered_device *rdev,
|
||||
struct net_device *netdev,
|
||||
const u8 *buf, size_t len, gfp_t gfp);
|
||||
const u8 *buf, size_t len,
|
||||
bool reconnect, gfp_t gfp);
|
||||
void nl80211_send_disassoc(struct cfg80211_registered_device *rdev,
|
||||
struct net_device *netdev,
|
||||
const u8 *buf, size_t len, gfp_t gfp);
|
||||
const u8 *buf, size_t len,
|
||||
bool reconnect, gfp_t gfp);
|
||||
void nl80211_send_auth_timeout(struct cfg80211_registered_device *rdev,
|
||||
struct net_device *netdev,
|
||||
const u8 *addr, gfp_t gfp);
|
||||
|
@@ -1346,4 +1346,16 @@ static inline int rdev_reset_tid_config(struct cfg80211_registered_device *rdev,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline int rdev_set_sar_specs(struct cfg80211_registered_device *rdev,
|
||||
struct cfg80211_sar_specs *sar)
|
||||
{
|
||||
int ret;
|
||||
|
||||
trace_rdev_set_sar_specs(&rdev->wiphy, sar);
|
||||
ret = rdev->ops->set_sar_specs(&rdev->wiphy, sar);
|
||||
trace_rdev_return_int(&rdev->wiphy, ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
#endif /* __CFG80211_RDEV_OPS */
|
||||
|
@@ -1616,7 +1616,7 @@ static const struct ieee80211_reg_rule *
|
||||
__freq_reg_info(struct wiphy *wiphy, u32 center_freq, u32 min_bw)
|
||||
{
|
||||
const struct ieee80211_regdomain *regd = reg_get_regdomain(wiphy);
|
||||
const u32 bws[] = {0, 1, 2, 4, 5, 8, 10, 16, 20};
|
||||
static const u32 bws[] = {0, 1, 2, 4, 5, 8, 10, 16, 20};
|
||||
const struct ieee80211_reg_rule *reg_rule;
|
||||
int i = ARRAY_SIZE(bws) - 1;
|
||||
u32 bw;
|
||||
@@ -2547,6 +2547,7 @@ static void handle_band_custom(struct wiphy *wiphy,
|
||||
void wiphy_apply_custom_regulatory(struct wiphy *wiphy,
|
||||
const struct ieee80211_regdomain *regd)
|
||||
{
|
||||
const struct ieee80211_regdomain *new_regd, *tmp;
|
||||
enum nl80211_band band;
|
||||
unsigned int bands_set = 0;
|
||||
|
||||
@@ -2566,6 +2567,13 @@ void wiphy_apply_custom_regulatory(struct wiphy *wiphy,
|
||||
* on your device's supported bands.
|
||||
*/
|
||||
WARN_ON(!bands_set);
|
||||
new_regd = reg_copy_regd(regd);
|
||||
if (IS_ERR(new_regd))
|
||||
return;
|
||||
|
||||
tmp = get_wiphy_regdom(wiphy);
|
||||
rcu_assign_pointer(wiphy->regd, new_regd);
|
||||
rcu_free_regdom(tmp);
|
||||
}
|
||||
EXPORT_SYMBOL(wiphy_apply_custom_regulatory);
|
||||
|
||||
|
@@ -726,7 +726,7 @@ static int cfg80211_scan_6ghz(struct cfg80211_registered_device *rdev)
|
||||
int n_channels, count = 0, err;
|
||||
struct cfg80211_scan_request *request, *rdev_req = rdev->scan_req;
|
||||
LIST_HEAD(coloc_ap_list);
|
||||
bool need_scan_psc;
|
||||
bool need_scan_psc = true;
|
||||
const struct ieee80211_sband_iftype_data *iftd;
|
||||
|
||||
rdev_req->scan_6ghz = true;
|
||||
@@ -770,20 +770,18 @@ static int cfg80211_scan_6ghz(struct cfg80211_registered_device *rdev)
|
||||
(void *)&request->channels[n_channels];
|
||||
|
||||
/*
|
||||
* PSC channels should not be scanned if all the reported co-located APs
|
||||
* are indicating that all APs in the same ESS are co-located
|
||||
* PSC channels should not be scanned in case of direct scan with 1 SSID
|
||||
* and at least one of the reported co-located APs with same SSID
|
||||
* indicating that all APs in the same ESS are co-located
|
||||
*/
|
||||
if (count) {
|
||||
need_scan_psc = false;
|
||||
|
||||
if (count && request->n_ssids == 1 && request->ssids[0].ssid_len) {
|
||||
list_for_each_entry(ap, &coloc_ap_list, list) {
|
||||
if (!ap->colocated_ess) {
|
||||
need_scan_psc = true;
|
||||
if (ap->colocated_ess &&
|
||||
cfg80211_find_ssid_match(ap, request)) {
|
||||
need_scan_psc = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
need_scan_psc = true;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1901,6 +1899,9 @@ cfg80211_inform_single_bss_data(struct wiphy *wiphy,
|
||||
tmp.pub.beacon_interval = beacon_interval;
|
||||
tmp.pub.capability = capability;
|
||||
tmp.ts_boottime = data->boottime_ns;
|
||||
tmp.parent_tsf = data->parent_tsf;
|
||||
ether_addr_copy(tmp.parent_bssid, data->parent_bssid);
|
||||
|
||||
if (non_tx_data) {
|
||||
tmp.pub.transmitted_bss = non_tx_data->tx_bss;
|
||||
ts = bss_from_pub(non_tx_data->tx_bss)->ts;
|
||||
|
@@ -2679,19 +2679,23 @@ DEFINE_EVENT(netdev_frame_event, cfg80211_rx_mlme_mgmt,
|
||||
);
|
||||
|
||||
TRACE_EVENT(cfg80211_tx_mlme_mgmt,
|
||||
TP_PROTO(struct net_device *netdev, const u8 *buf, int len),
|
||||
TP_ARGS(netdev, buf, len),
|
||||
TP_PROTO(struct net_device *netdev, const u8 *buf, int len,
|
||||
bool reconnect),
|
||||
TP_ARGS(netdev, buf, len, reconnect),
|
||||
TP_STRUCT__entry(
|
||||
NETDEV_ENTRY
|
||||
__dynamic_array(u8, frame, len)
|
||||
__field(int, reconnect)
|
||||
),
|
||||
TP_fast_assign(
|
||||
NETDEV_ASSIGN;
|
||||
memcpy(__get_dynamic_array(frame), buf, len);
|
||||
__entry->reconnect = reconnect;
|
||||
),
|
||||
TP_printk(NETDEV_PR_FMT ", ftype:0x%.2x",
|
||||
TP_printk(NETDEV_PR_FMT ", ftype:0x%.2x reconnect:%d",
|
||||
NETDEV_PR_ARG,
|
||||
le16_to_cpup((__le16 *)__get_dynamic_array(frame)))
|
||||
le16_to_cpup((__le16 *)__get_dynamic_array(frame)),
|
||||
__entry->reconnect)
|
||||
);
|
||||
|
||||
DECLARE_EVENT_CLASS(netdev_mac_evt,
|
||||
@@ -3542,6 +3546,25 @@ TRACE_EVENT(rdev_reset_tid_config,
|
||||
TP_printk(WIPHY_PR_FMT ", " NETDEV_PR_FMT ", peer: " MAC_PR_FMT ", tids: 0x%x",
|
||||
WIPHY_PR_ARG, NETDEV_PR_ARG, MAC_PR_ARG(peer), __entry->tids)
|
||||
);
|
||||
|
||||
TRACE_EVENT(rdev_set_sar_specs,
|
||||
TP_PROTO(struct wiphy *wiphy, struct cfg80211_sar_specs *sar),
|
||||
TP_ARGS(wiphy, sar),
|
||||
TP_STRUCT__entry(
|
||||
WIPHY_ENTRY
|
||||
__field(u16, type)
|
||||
__field(u16, num)
|
||||
),
|
||||
TP_fast_assign(
|
||||
WIPHY_ASSIGN;
|
||||
__entry->type = sar->type;
|
||||
__entry->num = sar->num_sub_specs;
|
||||
|
||||
),
|
||||
TP_printk(WIPHY_PR_FMT ", Set type:%d, num_specs:%d",
|
||||
WIPHY_PR_ARG, __entry->type, __entry->num)
|
||||
);
|
||||
|
||||
#endif /* !__RDEV_OPS_TRACE || TRACE_HEADER_MULTI_READ */
|
||||
|
||||
#undef TRACE_INCLUDE_PATH
|
||||
|
@@ -272,18 +272,53 @@ bool cfg80211_supported_cipher_suite(struct wiphy *wiphy, u32 cipher)
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool
|
||||
cfg80211_igtk_cipher_supported(struct cfg80211_registered_device *rdev)
|
||||
{
|
||||
struct wiphy *wiphy = &rdev->wiphy;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < wiphy->n_cipher_suites; i++) {
|
||||
switch (wiphy->cipher_suites[i]) {
|
||||
case WLAN_CIPHER_SUITE_AES_CMAC:
|
||||
case WLAN_CIPHER_SUITE_BIP_CMAC_256:
|
||||
case WLAN_CIPHER_SUITE_BIP_GMAC_128:
|
||||
case WLAN_CIPHER_SUITE_BIP_GMAC_256:
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool cfg80211_valid_key_idx(struct cfg80211_registered_device *rdev,
|
||||
int key_idx, bool pairwise)
|
||||
{
|
||||
int max_key_idx;
|
||||
|
||||
if (pairwise)
|
||||
max_key_idx = 3;
|
||||
else if (wiphy_ext_feature_isset(&rdev->wiphy,
|
||||
NL80211_EXT_FEATURE_BEACON_PROTECTION) ||
|
||||
wiphy_ext_feature_isset(&rdev->wiphy,
|
||||
NL80211_EXT_FEATURE_BEACON_PROTECTION_CLIENT))
|
||||
max_key_idx = 7;
|
||||
else if (cfg80211_igtk_cipher_supported(rdev))
|
||||
max_key_idx = 5;
|
||||
else
|
||||
max_key_idx = 3;
|
||||
|
||||
if (key_idx < 0 || key_idx > max_key_idx)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
int cfg80211_validate_key_settings(struct cfg80211_registered_device *rdev,
|
||||
struct key_params *params, int key_idx,
|
||||
bool pairwise, const u8 *mac_addr)
|
||||
{
|
||||
int max_key_idx = 5;
|
||||
|
||||
if (wiphy_ext_feature_isset(&rdev->wiphy,
|
||||
NL80211_EXT_FEATURE_BEACON_PROTECTION) ||
|
||||
wiphy_ext_feature_isset(&rdev->wiphy,
|
||||
NL80211_EXT_FEATURE_BEACON_PROTECTION_CLIENT))
|
||||
max_key_idx = 7;
|
||||
if (key_idx < 0 || key_idx > max_key_idx)
|
||||
if (!cfg80211_valid_key_idx(rdev, key_idx, pairwise))
|
||||
return -EINVAL;
|
||||
|
||||
if (!pairwise && mac_addr && !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN))
|
||||
@@ -335,6 +370,7 @@ int cfg80211_validate_key_settings(struct cfg80211_registered_device *rdev,
|
||||
case WLAN_CIPHER_SUITE_WEP104:
|
||||
if (key_idx > 3)
|
||||
return -EINVAL;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@@ -1421,39 +1421,78 @@ static int cfg80211_wext_siwpmksa(struct net_device *dev,
|
||||
}
|
||||
}
|
||||
|
||||
#define DEFINE_WEXT_COMPAT_STUB(func, type) \
|
||||
static int __ ## func(struct net_device *dev, \
|
||||
struct iw_request_info *info, \
|
||||
union iwreq_data *wrqu, \
|
||||
char *extra) \
|
||||
{ \
|
||||
return func(dev, info, (type *)wrqu, extra); \
|
||||
}
|
||||
|
||||
DEFINE_WEXT_COMPAT_STUB(cfg80211_wext_giwname, char)
|
||||
DEFINE_WEXT_COMPAT_STUB(cfg80211_wext_siwfreq, struct iw_freq)
|
||||
DEFINE_WEXT_COMPAT_STUB(cfg80211_wext_giwfreq, struct iw_freq)
|
||||
DEFINE_WEXT_COMPAT_STUB(cfg80211_wext_siwmode, u32)
|
||||
DEFINE_WEXT_COMPAT_STUB(cfg80211_wext_giwmode, u32)
|
||||
DEFINE_WEXT_COMPAT_STUB(cfg80211_wext_giwrange, struct iw_point)
|
||||
DEFINE_WEXT_COMPAT_STUB(cfg80211_wext_siwap, struct sockaddr)
|
||||
DEFINE_WEXT_COMPAT_STUB(cfg80211_wext_giwap, struct sockaddr)
|
||||
DEFINE_WEXT_COMPAT_STUB(cfg80211_wext_siwmlme, struct iw_point)
|
||||
DEFINE_WEXT_COMPAT_STUB(cfg80211_wext_giwscan, struct iw_point)
|
||||
DEFINE_WEXT_COMPAT_STUB(cfg80211_wext_siwessid, struct iw_point)
|
||||
DEFINE_WEXT_COMPAT_STUB(cfg80211_wext_giwessid, struct iw_point)
|
||||
DEFINE_WEXT_COMPAT_STUB(cfg80211_wext_siwrate, struct iw_param)
|
||||
DEFINE_WEXT_COMPAT_STUB(cfg80211_wext_giwrate, struct iw_param)
|
||||
DEFINE_WEXT_COMPAT_STUB(cfg80211_wext_siwrts, struct iw_param)
|
||||
DEFINE_WEXT_COMPAT_STUB(cfg80211_wext_giwrts, struct iw_param)
|
||||
DEFINE_WEXT_COMPAT_STUB(cfg80211_wext_siwfrag, struct iw_param)
|
||||
DEFINE_WEXT_COMPAT_STUB(cfg80211_wext_giwfrag, struct iw_param)
|
||||
DEFINE_WEXT_COMPAT_STUB(cfg80211_wext_siwretry, struct iw_param)
|
||||
DEFINE_WEXT_COMPAT_STUB(cfg80211_wext_giwretry, struct iw_param)
|
||||
DEFINE_WEXT_COMPAT_STUB(cfg80211_wext_siwencode, struct iw_point)
|
||||
DEFINE_WEXT_COMPAT_STUB(cfg80211_wext_giwencode, struct iw_point)
|
||||
DEFINE_WEXT_COMPAT_STUB(cfg80211_wext_giwpower, struct iw_param)
|
||||
DEFINE_WEXT_COMPAT_STUB(cfg80211_wext_siwpower, struct iw_param)
|
||||
DEFINE_WEXT_COMPAT_STUB(cfg80211_wext_siwgenie, struct iw_point)
|
||||
DEFINE_WEXT_COMPAT_STUB(cfg80211_wext_giwauth, struct iw_param)
|
||||
DEFINE_WEXT_COMPAT_STUB(cfg80211_wext_siwauth, struct iw_param)
|
||||
DEFINE_WEXT_COMPAT_STUB(cfg80211_wext_siwencodeext, struct iw_point)
|
||||
DEFINE_WEXT_COMPAT_STUB(cfg80211_wext_siwpmksa, struct iw_point)
|
||||
|
||||
static const iw_handler cfg80211_handlers[] = {
|
||||
[IW_IOCTL_IDX(SIOCGIWNAME)] = (iw_handler) cfg80211_wext_giwname,
|
||||
[IW_IOCTL_IDX(SIOCSIWFREQ)] = (iw_handler) cfg80211_wext_siwfreq,
|
||||
[IW_IOCTL_IDX(SIOCGIWFREQ)] = (iw_handler) cfg80211_wext_giwfreq,
|
||||
[IW_IOCTL_IDX(SIOCSIWMODE)] = (iw_handler) cfg80211_wext_siwmode,
|
||||
[IW_IOCTL_IDX(SIOCGIWMODE)] = (iw_handler) cfg80211_wext_giwmode,
|
||||
[IW_IOCTL_IDX(SIOCGIWRANGE)] = (iw_handler) cfg80211_wext_giwrange,
|
||||
[IW_IOCTL_IDX(SIOCSIWAP)] = (iw_handler) cfg80211_wext_siwap,
|
||||
[IW_IOCTL_IDX(SIOCGIWAP)] = (iw_handler) cfg80211_wext_giwap,
|
||||
[IW_IOCTL_IDX(SIOCSIWMLME)] = (iw_handler) cfg80211_wext_siwmlme,
|
||||
[IW_IOCTL_IDX(SIOCSIWSCAN)] = (iw_handler) cfg80211_wext_siwscan,
|
||||
[IW_IOCTL_IDX(SIOCGIWSCAN)] = (iw_handler) cfg80211_wext_giwscan,
|
||||
[IW_IOCTL_IDX(SIOCSIWESSID)] = (iw_handler) cfg80211_wext_siwessid,
|
||||
[IW_IOCTL_IDX(SIOCGIWESSID)] = (iw_handler) cfg80211_wext_giwessid,
|
||||
[IW_IOCTL_IDX(SIOCSIWRATE)] = (iw_handler) cfg80211_wext_siwrate,
|
||||
[IW_IOCTL_IDX(SIOCGIWRATE)] = (iw_handler) cfg80211_wext_giwrate,
|
||||
[IW_IOCTL_IDX(SIOCSIWRTS)] = (iw_handler) cfg80211_wext_siwrts,
|
||||
[IW_IOCTL_IDX(SIOCGIWRTS)] = (iw_handler) cfg80211_wext_giwrts,
|
||||
[IW_IOCTL_IDX(SIOCSIWFRAG)] = (iw_handler) cfg80211_wext_siwfrag,
|
||||
[IW_IOCTL_IDX(SIOCGIWFRAG)] = (iw_handler) cfg80211_wext_giwfrag,
|
||||
[IW_IOCTL_IDX(SIOCSIWTXPOW)] = (iw_handler) cfg80211_wext_siwtxpower,
|
||||
[IW_IOCTL_IDX(SIOCGIWTXPOW)] = (iw_handler) cfg80211_wext_giwtxpower,
|
||||
[IW_IOCTL_IDX(SIOCSIWRETRY)] = (iw_handler) cfg80211_wext_siwretry,
|
||||
[IW_IOCTL_IDX(SIOCGIWRETRY)] = (iw_handler) cfg80211_wext_giwretry,
|
||||
[IW_IOCTL_IDX(SIOCSIWENCODE)] = (iw_handler) cfg80211_wext_siwencode,
|
||||
[IW_IOCTL_IDX(SIOCGIWENCODE)] = (iw_handler) cfg80211_wext_giwencode,
|
||||
[IW_IOCTL_IDX(SIOCSIWPOWER)] = (iw_handler) cfg80211_wext_siwpower,
|
||||
[IW_IOCTL_IDX(SIOCGIWPOWER)] = (iw_handler) cfg80211_wext_giwpower,
|
||||
[IW_IOCTL_IDX(SIOCSIWGENIE)] = (iw_handler) cfg80211_wext_siwgenie,
|
||||
[IW_IOCTL_IDX(SIOCSIWAUTH)] = (iw_handler) cfg80211_wext_siwauth,
|
||||
[IW_IOCTL_IDX(SIOCGIWAUTH)] = (iw_handler) cfg80211_wext_giwauth,
|
||||
[IW_IOCTL_IDX(SIOCSIWENCODEEXT)]= (iw_handler) cfg80211_wext_siwencodeext,
|
||||
[IW_IOCTL_IDX(SIOCSIWPMKSA)] = (iw_handler) cfg80211_wext_siwpmksa,
|
||||
[IW_IOCTL_IDX(SIOCGIWNAME)] = __cfg80211_wext_giwname,
|
||||
[IW_IOCTL_IDX(SIOCSIWFREQ)] = __cfg80211_wext_siwfreq,
|
||||
[IW_IOCTL_IDX(SIOCGIWFREQ)] = __cfg80211_wext_giwfreq,
|
||||
[IW_IOCTL_IDX(SIOCSIWMODE)] = __cfg80211_wext_siwmode,
|
||||
[IW_IOCTL_IDX(SIOCGIWMODE)] = __cfg80211_wext_giwmode,
|
||||
[IW_IOCTL_IDX(SIOCGIWRANGE)] = __cfg80211_wext_giwrange,
|
||||
[IW_IOCTL_IDX(SIOCSIWAP)] = __cfg80211_wext_siwap,
|
||||
[IW_IOCTL_IDX(SIOCGIWAP)] = __cfg80211_wext_giwap,
|
||||
[IW_IOCTL_IDX(SIOCSIWMLME)] = __cfg80211_wext_siwmlme,
|
||||
[IW_IOCTL_IDX(SIOCSIWSCAN)] = cfg80211_wext_siwscan,
|
||||
[IW_IOCTL_IDX(SIOCGIWSCAN)] = __cfg80211_wext_giwscan,
|
||||
[IW_IOCTL_IDX(SIOCSIWESSID)] = __cfg80211_wext_siwessid,
|
||||
[IW_IOCTL_IDX(SIOCGIWESSID)] = __cfg80211_wext_giwessid,
|
||||
[IW_IOCTL_IDX(SIOCSIWRATE)] = __cfg80211_wext_siwrate,
|
||||
[IW_IOCTL_IDX(SIOCGIWRATE)] = __cfg80211_wext_giwrate,
|
||||
[IW_IOCTL_IDX(SIOCSIWRTS)] = __cfg80211_wext_siwrts,
|
||||
[IW_IOCTL_IDX(SIOCGIWRTS)] = __cfg80211_wext_giwrts,
|
||||
[IW_IOCTL_IDX(SIOCSIWFRAG)] = __cfg80211_wext_siwfrag,
|
||||
[IW_IOCTL_IDX(SIOCGIWFRAG)] = __cfg80211_wext_giwfrag,
|
||||
[IW_IOCTL_IDX(SIOCSIWTXPOW)] = cfg80211_wext_siwtxpower,
|
||||
[IW_IOCTL_IDX(SIOCGIWTXPOW)] = cfg80211_wext_giwtxpower,
|
||||
[IW_IOCTL_IDX(SIOCSIWRETRY)] = __cfg80211_wext_siwretry,
|
||||
[IW_IOCTL_IDX(SIOCGIWRETRY)] = __cfg80211_wext_giwretry,
|
||||
[IW_IOCTL_IDX(SIOCSIWENCODE)] = __cfg80211_wext_siwencode,
|
||||
[IW_IOCTL_IDX(SIOCGIWENCODE)] = __cfg80211_wext_giwencode,
|
||||
[IW_IOCTL_IDX(SIOCSIWPOWER)] = __cfg80211_wext_siwpower,
|
||||
[IW_IOCTL_IDX(SIOCGIWPOWER)] = __cfg80211_wext_giwpower,
|
||||
[IW_IOCTL_IDX(SIOCSIWGENIE)] = __cfg80211_wext_siwgenie,
|
||||
[IW_IOCTL_IDX(SIOCSIWAUTH)] = __cfg80211_wext_siwauth,
|
||||
[IW_IOCTL_IDX(SIOCGIWAUTH)] = __cfg80211_wext_giwauth,
|
||||
[IW_IOCTL_IDX(SIOCSIWENCODEEXT)]= __cfg80211_wext_siwencodeext,
|
||||
[IW_IOCTL_IDX(SIOCSIWPMKSA)] = __cfg80211_wext_siwpmksa,
|
||||
};
|
||||
|
||||
const struct iw_handler_def cfg80211_wext_handler = {
|
||||
|
Reference in New Issue
Block a user