Lines Matching +full:ieee80211 +full:- +full:freq +full:- +full:limit

1 // SPDX-License-Identifier: GPL-2.0-only
3 * This is the new netlink-based wireless configuration interface.
5 * Copyright 2006-2010 Johannes Berg <johannes@sipsolutions.net>
6 * Copyright 2013-2014 Intel Mobile Communications GmbH
7 * Copyright 2015-2017 Intel Deutschland GmbH
8 * Copyright (C) 2018-2023 Intel Corporation
17 #include <linux/ieee80211.h>
32 #include "rdev-ops.h"
50 NL80211_MCGRP_TESTMODE /* keep last - ifdef! */
74 int wiphy_idx = -1; in __cfg80211_wdev_from_attrs()
75 int ifidx = -1; in __cfg80211_wdev_from_attrs()
78 return ERR_PTR(-EINVAL); in __cfg80211_wdev_from_attrs()
90 lockdep_assert_held(&rdev->wiphy.mtx); in __cfg80211_wdev_from_attrs()
92 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) { in __cfg80211_wdev_from_attrs()
93 if (have_ifidx && wdev->netdev && in __cfg80211_wdev_from_attrs()
94 wdev->netdev->ifindex == ifidx) { in __cfg80211_wdev_from_attrs()
98 if (have_wdev_id && wdev->identifier == (u32)wdev_id) { in __cfg80211_wdev_from_attrs()
104 return result ?: ERR_PTR(-ENODEV); in __cfg80211_wdev_from_attrs()
112 if (wiphy_net(&rdev->wiphy) != netns) in __cfg80211_wdev_from_attrs()
115 if (have_wdev_id && rdev->wiphy_idx != wiphy_idx) in __cfg80211_wdev_from_attrs()
118 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) { in __cfg80211_wdev_from_attrs()
119 if (have_ifidx && wdev->netdev && in __cfg80211_wdev_from_attrs()
120 wdev->netdev->ifindex == ifidx) { in __cfg80211_wdev_from_attrs()
124 if (have_wdev_id && wdev->identifier == (u32)wdev_id) { in __cfg80211_wdev_from_attrs()
136 return ERR_PTR(-ENODEV); in __cfg80211_wdev_from_attrs()
150 return ERR_PTR(-EINVAL); in __cfg80211_rdev_from_attrs()
164 list_for_each_entry(wdev, &tmp->wiphy.wdev_list, list) { in __cfg80211_rdev_from_attrs()
165 if (wdev->identifier != (u32)wdev_id) in __cfg80211_rdev_from_attrs()
175 return ERR_PTR(-EINVAL); in __cfg80211_rdev_from_attrs()
185 if (netdev->ieee80211_ptr) in __cfg80211_rdev_from_attrs()
187 netdev->ieee80211_ptr->wiphy); in __cfg80211_rdev_from_attrs()
191 /* not wireless device -- return error */ in __cfg80211_rdev_from_attrs()
193 return ERR_PTR(-EINVAL); in __cfg80211_rdev_from_attrs()
195 /* mismatch -- return error */ in __cfg80211_rdev_from_attrs()
197 return ERR_PTR(-EINVAL); in __cfg80211_rdev_from_attrs()
204 return ERR_PTR(-ENODEV); in __cfg80211_rdev_from_attrs()
206 if (netns != wiphy_net(&rdev->wiphy)) in __cfg80211_rdev_from_attrs()
207 return ERR_PTR(-ENODEV); in __cfg80211_rdev_from_attrs()
222 return __cfg80211_rdev_from_attrs(netns, info->attrs); in cfg80211_get_dev_from_info()
238 s1g_bcn = ieee80211_is_s1g_beacon(mgmt->frame_control); in validate_beacon_head()
252 if (ieee80211_hdrlen(mgmt->frame_control) != hdrlen) in validate_beacon_head()
256 len -= fixedlen; in validate_beacon_head()
267 return -EINVAL; in validate_beacon_head()
285 return -EINVAL; in validate_ie_attr()
292 return -EINVAL; in validate_he_capa()
475 .len = 20-1 },
501 [NL80211_ATTR_IFNAME] = { .type = NLA_NUL_STRING, .len = IFNAMSIZ-1 },
531 NLA_POLICY_MAX(NLA_U8, NUM_NL80211_PLINK_ACTIONS - 1),
543 /* allow 3 for NUL-termination, we used to declare this NLA_STRING */
610 NLA_POLICY_MAX(NLA_U8, NUM_NL80211_PLINK_STATES - 1),
706 [NL80211_ATTR_TSID] = NLA_POLICY_MAX(NLA_U8, IEEE80211_NUM_TIDS - 1),
708 NLA_POLICY_MAX(NLA_U8, IEEE80211_NUM_UPS - 1),
720 NLA_POLICY_MAX(NLA_U8, NUM_NL80211_P2P_PS_STATUS - 1),
767 [NL80211_ATTR_VLAN_ID] = NLA_POLICY_RANGE(NLA_U16, 1, VLAN_N_VID - 2),
834 [NL80211_KEY_TYPE] = NLA_POLICY_MAX(NLA_U32, NUM_NL80211_KEYTYPES - 1),
991 if (!cb->args[0]) { in nl80211_prepare_wdev_dump()
998 return -ENOMEM; in nl80211_prepare_wdev_dump()
1002 err = nlmsg_parse_deprecated(cb->nlh, in nl80211_prepare_wdev_dump()
1012 *wdev = __cfg80211_wdev_from_attrs(NULL, sock_net(cb->skb->sk), in nl80211_prepare_wdev_dump()
1019 *rdev = wiphy_to_rdev((*wdev)->wiphy); in nl80211_prepare_wdev_dump()
1020 mutex_lock(&(*rdev)->wiphy.mtx); in nl80211_prepare_wdev_dump()
1022 /* 0 is the first index - add 1 to parse only once */ in nl80211_prepare_wdev_dump()
1023 cb->args[0] = (*rdev)->wiphy_idx + 1; in nl80211_prepare_wdev_dump()
1024 cb->args[1] = (*wdev)->identifier; in nl80211_prepare_wdev_dump()
1031 wiphy = wiphy_idx_to_wiphy(cb->args[0] - 1); in nl80211_prepare_wdev_dump()
1034 return -ENODEV; in nl80211_prepare_wdev_dump()
1039 list_for_each_entry(tmp, &(*rdev)->wiphy.wdev_list, list) { in nl80211_prepare_wdev_dump()
1040 if (tmp->identifier == cb->args[1]) { in nl80211_prepare_wdev_dump()
1048 return -ENODEV; in nl80211_prepare_wdev_dump()
1050 mutex_lock(&(*rdev)->wiphy.mtx); in nl80211_prepare_wdev_dump()
1082 rule->wmm_rule.client[j].cw_min) || in nl80211_msg_put_wmm_rules()
1084 rule->wmm_rule.client[j].cw_max) || in nl80211_msg_put_wmm_rules()
1086 rule->wmm_rule.client[j].aifsn) || in nl80211_msg_put_wmm_rules()
1088 rule->wmm_rule.client[j].cot)) in nl80211_msg_put_wmm_rules()
1098 return -ENOBUFS; in nl80211_msg_put_wmm_rules()
1106 * list to protect old user-space tools from breaking in nl80211_msg_put_channel()
1108 if (!large && chan->flags & in nl80211_msg_put_channel()
1111 if (!large && chan->freq_offset) in nl80211_msg_put_channel()
1115 chan->center_freq)) in nl80211_msg_put_channel()
1118 if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_OFFSET, chan->freq_offset)) in nl80211_msg_put_channel()
1121 if ((chan->flags & IEEE80211_CHAN_PSD) && in nl80211_msg_put_channel()
1122 nla_put_s8(msg, NL80211_FREQUENCY_ATTR_PSD, chan->psd)) in nl80211_msg_put_channel()
1125 if ((chan->flags & IEEE80211_CHAN_DISABLED) && in nl80211_msg_put_channel()
1128 if (chan->flags & IEEE80211_CHAN_NO_IR) { in nl80211_msg_put_channel()
1134 if (chan->flags & IEEE80211_CHAN_RADAR) { in nl80211_msg_put_channel()
1140 time = elapsed_jiffies_msecs(chan->dfs_state_entered); in nl80211_msg_put_channel()
1143 chan->dfs_state)) in nl80211_msg_put_channel()
1150 chan->dfs_cac_ms)) in nl80211_msg_put_channel()
1156 if ((chan->flags & IEEE80211_CHAN_NO_HT40MINUS) && in nl80211_msg_put_channel()
1159 if ((chan->flags & IEEE80211_CHAN_NO_HT40PLUS) && in nl80211_msg_put_channel()
1162 if ((chan->flags & IEEE80211_CHAN_NO_80MHZ) && in nl80211_msg_put_channel()
1165 if ((chan->flags & IEEE80211_CHAN_NO_160MHZ) && in nl80211_msg_put_channel()
1168 if ((chan->flags & IEEE80211_CHAN_INDOOR_ONLY) && in nl80211_msg_put_channel()
1171 if ((chan->flags & IEEE80211_CHAN_IR_CONCURRENT) && in nl80211_msg_put_channel()
1174 if ((chan->flags & IEEE80211_CHAN_NO_20MHZ) && in nl80211_msg_put_channel()
1177 if ((chan->flags & IEEE80211_CHAN_NO_10MHZ) && in nl80211_msg_put_channel()
1180 if ((chan->flags & IEEE80211_CHAN_NO_HE) && in nl80211_msg_put_channel()
1183 if ((chan->flags & IEEE80211_CHAN_1MHZ) && in nl80211_msg_put_channel()
1186 if ((chan->flags & IEEE80211_CHAN_2MHZ) && in nl80211_msg_put_channel()
1189 if ((chan->flags & IEEE80211_CHAN_4MHZ) && in nl80211_msg_put_channel()
1192 if ((chan->flags & IEEE80211_CHAN_8MHZ) && in nl80211_msg_put_channel()
1195 if ((chan->flags & IEEE80211_CHAN_16MHZ) && in nl80211_msg_put_channel()
1198 if ((chan->flags & IEEE80211_CHAN_NO_320MHZ) && in nl80211_msg_put_channel()
1201 if ((chan->flags & IEEE80211_CHAN_NO_EHT) && in nl80211_msg_put_channel()
1204 if ((chan->flags & IEEE80211_CHAN_DFS_CONCURRENT) && in nl80211_msg_put_channel()
1207 if ((chan->flags & IEEE80211_CHAN_NO_UHB_VLP_CLIENT) && in nl80211_msg_put_channel()
1210 if ((chan->flags & IEEE80211_CHAN_NO_UHB_AFC_CLIENT) && in nl80211_msg_put_channel()
1216 DBM_TO_MBM(chan->max_power))) in nl80211_msg_put_channel()
1221 freq_reg_info(wiphy, MHZ_TO_KHZ(chan->center_freq)); in nl80211_msg_put_channel()
1223 if (!IS_ERR_OR_NULL(rule) && rule->has_wmm) { in nl80211_msg_put_channel()
1232 return -ENOBUFS; in nl80211_msg_put_channel()
1242 if (txqstats->filled & BIT(NL80211_TXQ_STATS_ ## attr) && \ in nl80211_put_txq_stats()
1243 nla_put_u32(msg, NL80211_TXQ_STATS_ ## attr, txqstats->memb)) \ in nl80211_put_txq_stats()
1271 * nl80211_link_id - return link ID
1296 return -1; in nl80211_link_id_or_invalid()
1315 info->extack); in nl80211_parse_key_new()
1319 k->def = !!tb[NL80211_KEY_DEFAULT]; in nl80211_parse_key_new()
1320 k->defmgmt = !!tb[NL80211_KEY_DEFAULT_MGMT]; in nl80211_parse_key_new()
1321 k->defbeacon = !!tb[NL80211_KEY_DEFAULT_BEACON]; in nl80211_parse_key_new()
1323 if (k->def) { in nl80211_parse_key_new()
1324 k->def_uni = true; in nl80211_parse_key_new()
1325 k->def_multi = true; in nl80211_parse_key_new()
1327 if (k->defmgmt || k->defbeacon) in nl80211_parse_key_new()
1328 k->def_multi = true; in nl80211_parse_key_new()
1331 k->idx = nla_get_u8(tb[NL80211_KEY_IDX]); in nl80211_parse_key_new()
1334 k->p.key = nla_data(tb[NL80211_KEY_DATA]); in nl80211_parse_key_new()
1335 k->p.key_len = nla_len(tb[NL80211_KEY_DATA]); in nl80211_parse_key_new()
1339 k->p.seq = nla_data(tb[NL80211_KEY_SEQ]); in nl80211_parse_key_new()
1340 k->p.seq_len = nla_len(tb[NL80211_KEY_SEQ]); in nl80211_parse_key_new()
1344 k->p.cipher = nla_get_u32(tb[NL80211_KEY_CIPHER]); in nl80211_parse_key_new()
1347 k->type = nla_get_u32(tb[NL80211_KEY_TYPE]); in nl80211_parse_key_new()
1353 NUM_NL80211_KEY_DEFAULT_TYPES - 1, in nl80211_parse_key_new()
1356 info->extack); in nl80211_parse_key_new()
1360 k->def_uni = kdt[NL80211_KEY_DEFAULT_TYPE_UNICAST]; in nl80211_parse_key_new()
1361 k->def_multi = kdt[NL80211_KEY_DEFAULT_TYPE_MULTICAST]; in nl80211_parse_key_new()
1365 k->p.mode = nla_get_u8(tb[NL80211_KEY_MODE]); in nl80211_parse_key_new()
1372 if (info->attrs[NL80211_ATTR_KEY_DATA]) { in nl80211_parse_key_old()
1373 k->p.key = nla_data(info->attrs[NL80211_ATTR_KEY_DATA]); in nl80211_parse_key_old()
1374 k->p.key_len = nla_len(info->attrs[NL80211_ATTR_KEY_DATA]); in nl80211_parse_key_old()
1377 if (info->attrs[NL80211_ATTR_KEY_SEQ]) { in nl80211_parse_key_old()
1378 k->p.seq = nla_data(info->attrs[NL80211_ATTR_KEY_SEQ]); in nl80211_parse_key_old()
1379 k->p.seq_len = nla_len(info->attrs[NL80211_ATTR_KEY_SEQ]); in nl80211_parse_key_old()
1382 if (info->attrs[NL80211_ATTR_KEY_IDX]) in nl80211_parse_key_old()
1383 k->idx = nla_get_u8(info->attrs[NL80211_ATTR_KEY_IDX]); in nl80211_parse_key_old()
1385 if (info->attrs[NL80211_ATTR_KEY_CIPHER]) in nl80211_parse_key_old()
1386 k->p.cipher = nla_get_u32(info->attrs[NL80211_ATTR_KEY_CIPHER]); in nl80211_parse_key_old()
1388 k->def = !!info->attrs[NL80211_ATTR_KEY_DEFAULT]; in nl80211_parse_key_old()
1389 k->defmgmt = !!info->attrs[NL80211_ATTR_KEY_DEFAULT_MGMT]; in nl80211_parse_key_old()
1391 if (k->def) { in nl80211_parse_key_old()
1392 k->def_uni = true; in nl80211_parse_key_old()
1393 k->def_multi = true; in nl80211_parse_key_old()
1395 if (k->defmgmt) in nl80211_parse_key_old()
1396 k->def_multi = true; in nl80211_parse_key_old()
1398 if (info->attrs[NL80211_ATTR_KEY_TYPE]) in nl80211_parse_key_old()
1399 k->type = nla_get_u32(info->attrs[NL80211_ATTR_KEY_TYPE]); in nl80211_parse_key_old()
1401 if (info->attrs[NL80211_ATTR_KEY_DEFAULT_TYPES]) { in nl80211_parse_key_old()
1404 NUM_NL80211_KEY_DEFAULT_TYPES - 1, in nl80211_parse_key_old()
1405 info->attrs[NL80211_ATTR_KEY_DEFAULT_TYPES], in nl80211_parse_key_old()
1407 info->extack); in nl80211_parse_key_old()
1411 k->def_uni = kdt[NL80211_KEY_DEFAULT_TYPE_UNICAST]; in nl80211_parse_key_old()
1412 k->def_multi = kdt[NL80211_KEY_DEFAULT_TYPE_MULTICAST]; in nl80211_parse_key_old()
1423 k->idx = -1; in nl80211_parse_key()
1424 k->type = -1; in nl80211_parse_key()
1426 if (info->attrs[NL80211_ATTR_KEY]) in nl80211_parse_key()
1427 err = nl80211_parse_key_new(info, info->attrs[NL80211_ATTR_KEY], k); in nl80211_parse_key()
1434 if ((k->def ? 1 : 0) + (k->defmgmt ? 1 : 0) + in nl80211_parse_key()
1435 (k->defbeacon ? 1 : 0) > 1) { in nl80211_parse_key()
1438 return -EINVAL; in nl80211_parse_key()
1441 if (k->defmgmt || k->defbeacon) { in nl80211_parse_key()
1442 if (k->def_uni || !k->def_multi) { in nl80211_parse_key()
1445 return -EINVAL; in nl80211_parse_key()
1449 if (k->idx != -1) { in nl80211_parse_key()
1450 if (k->defmgmt) { in nl80211_parse_key()
1451 if (k->idx < 4 || k->idx > 5) { in nl80211_parse_key()
1454 return -EINVAL; in nl80211_parse_key()
1456 } else if (k->defbeacon) { in nl80211_parse_key()
1457 if (k->idx < 6 || k->idx > 7) { in nl80211_parse_key()
1460 return -EINVAL; in nl80211_parse_key()
1462 } else if (k->def) { in nl80211_parse_key()
1463 if (k->idx < 0 || k->idx > 3) { in nl80211_parse_key()
1464 GENL_SET_ERR_MSG(info, "def key idx not 0-3"); in nl80211_parse_key()
1465 return -EINVAL; in nl80211_parse_key()
1468 if (k->idx < 0 || k->idx > 7) { in nl80211_parse_key()
1469 GENL_SET_ERR_MSG(info, "key idx not 0-7"); in nl80211_parse_key()
1470 return -EINVAL; in nl80211_parse_key()
1482 struct nlattr *keys = info->attrs[NL80211_ATTR_KEYS]; in nl80211_parse_connkeys()
1499 return ERR_PTR(-ENOMEM); in nl80211_parse_connkeys()
1501 result->def = -1; in nl80211_parse_connkeys()
1505 parse.idx = -1; in nl80211_parse_connkeys()
1510 err = -EINVAL; in nl80211_parse_connkeys()
1514 GENL_SET_ERR_MSG(info, "key index out of range [0-3]"); in nl80211_parse_connkeys()
1524 result->def = parse.idx; in nl80211_parse_connkeys()
1536 err = -EINVAL; in nl80211_parse_connkeys()
1539 result->params[parse.idx].cipher = parse.p.cipher; in nl80211_parse_connkeys()
1540 result->params[parse.idx].key_len = parse.p.key_len; in nl80211_parse_connkeys()
1541 result->params[parse.idx].key = result->data[parse.idx]; in nl80211_parse_connkeys()
1542 memcpy(result->data[parse.idx], parse.p.key, parse.p.key_len); in nl80211_parse_connkeys()
1549 if (result->def < 0) { in nl80211_parse_connkeys()
1550 err = -EINVAL; in nl80211_parse_connkeys()
1563 lockdep_assert_wiphy(wdev->wiphy); in nl80211_key_allowed()
1565 switch (wdev->iftype) { in nl80211_key_allowed()
1572 if (wdev->u.ibss.current_bss) in nl80211_key_allowed()
1574 return -ENOLINK; in nl80211_key_allowed()
1577 if (wdev->connected) in nl80211_key_allowed()
1579 return -ENOLINK; in nl80211_key_allowed()
1581 if (wiphy_ext_feature_isset(wdev->wiphy, in nl80211_key_allowed()
1584 return -EINVAL; in nl80211_key_allowed()
1591 return -EINVAL; in nl80211_key_allowed()
1598 u32 freq) in nl80211_get_valid_chan() argument
1602 chan = ieee80211_get_channel_khz(wiphy, freq); in nl80211_get_valid_chan()
1603 if (!chan || chan->flags & IEEE80211_CHAN_DISABLED) in nl80211_get_valid_chan()
1628 return -ENOBUFS; in nl80211_put_iftypes()
1643 for (i = 0; i < wiphy->n_iface_combinations; i++) { in nl80211_put_iface_combinations()
1647 c = &wiphy->iface_combinations[i]; in nl80211_put_iface_combinations()
1658 for (j = 0; j < c->n_limits; j++) { in nl80211_put_iface_combinations()
1665 c->limits[j].max)) in nl80211_put_iface_combinations()
1668 c->limits[j].types)) in nl80211_put_iface_combinations()
1675 if (c->beacon_int_infra_match && in nl80211_put_iface_combinations()
1679 c->num_different_channels) || in nl80211_put_iface_combinations()
1681 c->max_interfaces)) in nl80211_put_iface_combinations()
1685 c->radar_detect_widths) || in nl80211_put_iface_combinations()
1687 c->radar_detect_regions))) in nl80211_put_iface_combinations()
1689 if (c->beacon_int_min_gcd && in nl80211_put_iface_combinations()
1691 c->beacon_int_min_gcd)) in nl80211_put_iface_combinations()
1701 return -ENOBUFS; in nl80211_put_iface_combinations()
1708 const struct wiphy_wowlan_tcp_support *tcp = rdev->wiphy.wowlan->tcp; in nl80211_send_wowlan_tcp_caps()
1717 return -ENOBUFS; in nl80211_send_wowlan_tcp_caps()
1720 tcp->data_payload_max)) in nl80211_send_wowlan_tcp_caps()
1721 return -ENOBUFS; in nl80211_send_wowlan_tcp_caps()
1724 tcp->data_payload_max)) in nl80211_send_wowlan_tcp_caps()
1725 return -ENOBUFS; in nl80211_send_wowlan_tcp_caps()
1727 if (tcp->seq && nla_put_flag(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ)) in nl80211_send_wowlan_tcp_caps()
1728 return -ENOBUFS; in nl80211_send_wowlan_tcp_caps()
1730 if (tcp->tok && nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN, in nl80211_send_wowlan_tcp_caps()
1731 sizeof(*tcp->tok), tcp->tok)) in nl80211_send_wowlan_tcp_caps()
1732 return -ENOBUFS; in nl80211_send_wowlan_tcp_caps()
1735 tcp->data_interval_max)) in nl80211_send_wowlan_tcp_caps()
1736 return -ENOBUFS; in nl80211_send_wowlan_tcp_caps()
1739 tcp->wake_payload_max)) in nl80211_send_wowlan_tcp_caps()
1740 return -ENOBUFS; in nl80211_send_wowlan_tcp_caps()
1752 if (!rdev->wiphy.wowlan) in nl80211_send_wowlan()
1758 return -ENOBUFS; in nl80211_send_wowlan()
1760 if (((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_ANY) && in nl80211_send_wowlan()
1762 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_DISCONNECT) && in nl80211_send_wowlan()
1764 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_MAGIC_PKT) && in nl80211_send_wowlan()
1766 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_SUPPORTS_GTK_REKEY) && in nl80211_send_wowlan()
1768 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_GTK_REKEY_FAILURE) && in nl80211_send_wowlan()
1770 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_EAP_IDENTITY_REQ) && in nl80211_send_wowlan()
1772 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_4WAY_HANDSHAKE) && in nl80211_send_wowlan()
1774 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_RFKILL_RELEASE) && in nl80211_send_wowlan()
1776 return -ENOBUFS; in nl80211_send_wowlan()
1778 if (rdev->wiphy.wowlan->n_patterns) { in nl80211_send_wowlan()
1780 .max_patterns = rdev->wiphy.wowlan->n_patterns, in nl80211_send_wowlan()
1781 .min_pattern_len = rdev->wiphy.wowlan->pattern_min_len, in nl80211_send_wowlan()
1782 .max_pattern_len = rdev->wiphy.wowlan->pattern_max_len, in nl80211_send_wowlan()
1783 .max_pkt_offset = rdev->wiphy.wowlan->max_pkt_offset, in nl80211_send_wowlan()
1788 return -ENOBUFS; in nl80211_send_wowlan()
1791 if ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_NET_DETECT) && in nl80211_send_wowlan()
1793 rdev->wiphy.wowlan->max_nd_match_sets)) in nl80211_send_wowlan()
1794 return -ENOBUFS; in nl80211_send_wowlan()
1797 return -ENOBUFS; in nl80211_send_wowlan()
1810 if (!rdev->wiphy.coalesce) in nl80211_send_coalesce()
1813 rule.max_rules = rdev->wiphy.coalesce->n_rules; in nl80211_send_coalesce()
1814 rule.max_delay = rdev->wiphy.coalesce->max_delay; in nl80211_send_coalesce()
1815 rule.pat.max_patterns = rdev->wiphy.coalesce->n_patterns; in nl80211_send_coalesce()
1816 rule.pat.min_pattern_len = rdev->wiphy.coalesce->pattern_min_len; in nl80211_send_coalesce()
1817 rule.pat.max_pattern_len = rdev->wiphy.coalesce->pattern_max_len; in nl80211_send_coalesce()
1818 rule.pat.max_pkt_offset = rdev->wiphy.coalesce->max_pkt_offset; in nl80211_send_coalesce()
1821 return -ENOBUFS; in nl80211_send_coalesce()
1831 const struct ieee80211_sta_he_cap *he_cap = &iftdata->he_cap; in nl80211_send_iftype_data()
1832 const struct ieee80211_sta_eht_cap *eht_cap = &iftdata->eht_cap; in nl80211_send_iftype_data()
1835 iftdata->types_mask)) in nl80211_send_iftype_data()
1836 return -ENOBUFS; in nl80211_send_iftype_data()
1838 if (he_cap->has_he) { in nl80211_send_iftype_data()
1840 sizeof(he_cap->he_cap_elem.mac_cap_info), in nl80211_send_iftype_data()
1841 he_cap->he_cap_elem.mac_cap_info) || in nl80211_send_iftype_data()
1843 sizeof(he_cap->he_cap_elem.phy_cap_info), in nl80211_send_iftype_data()
1844 he_cap->he_cap_elem.phy_cap_info) || in nl80211_send_iftype_data()
1846 sizeof(he_cap->he_mcs_nss_supp), in nl80211_send_iftype_data()
1847 &he_cap->he_mcs_nss_supp) || in nl80211_send_iftype_data()
1849 sizeof(he_cap->ppe_thres), he_cap->ppe_thres)) in nl80211_send_iftype_data()
1850 return -ENOBUFS; in nl80211_send_iftype_data()
1853 if (eht_cap->has_eht && he_cap->has_he) { in nl80211_send_iftype_data()
1858 is_ap = iftdata->types_mask & BIT(NL80211_IFTYPE_AP) || in nl80211_send_iftype_data()
1859 iftdata->types_mask & BIT(NL80211_IFTYPE_P2P_GO); in nl80211_send_iftype_data()
1862 ieee80211_eht_mcs_nss_size(&he_cap->he_cap_elem, in nl80211_send_iftype_data()
1863 &eht_cap->eht_cap_elem, in nl80211_send_iftype_data()
1866 ppe_thres_hdr = get_unaligned_le16(&eht_cap->eht_ppe_thres[0]); in nl80211_send_iftype_data()
1869 eht_cap->eht_cap_elem.phy_cap_info); in nl80211_send_iftype_data()
1872 sizeof(eht_cap->eht_cap_elem.mac_cap_info), in nl80211_send_iftype_data()
1873 eht_cap->eht_cap_elem.mac_cap_info) || in nl80211_send_iftype_data()
1875 sizeof(eht_cap->eht_cap_elem.phy_cap_info), in nl80211_send_iftype_data()
1876 eht_cap->eht_cap_elem.phy_cap_info) || in nl80211_send_iftype_data()
1878 mcs_nss_size, &eht_cap->eht_mcs_nss_supp) || in nl80211_send_iftype_data()
1880 ppe_thresh_size, eht_cap->eht_ppe_thres)) in nl80211_send_iftype_data()
1881 return -ENOBUFS; in nl80211_send_iftype_data()
1884 if (sband->band == NL80211_BAND_6GHZ && in nl80211_send_iftype_data()
1886 sizeof(iftdata->he_6ghz_capa), in nl80211_send_iftype_data()
1887 &iftdata->he_6ghz_capa)) in nl80211_send_iftype_data()
1888 return -ENOBUFS; in nl80211_send_iftype_data()
1890 if (iftdata->vendor_elems.data && iftdata->vendor_elems.len && in nl80211_send_iftype_data()
1892 iftdata->vendor_elems.len, iftdata->vendor_elems.data)) in nl80211_send_iftype_data()
1893 return -ENOBUFS; in nl80211_send_iftype_data()
1907 if (sband->ht_cap.ht_supported && in nl80211_send_band_rateinfo()
1909 sizeof(sband->ht_cap.mcs), in nl80211_send_band_rateinfo()
1910 &sband->ht_cap.mcs) || in nl80211_send_band_rateinfo()
1912 sband->ht_cap.cap) || in nl80211_send_band_rateinfo()
1914 sband->ht_cap.ampdu_factor) || in nl80211_send_band_rateinfo()
1916 sband->ht_cap.ampdu_density))) in nl80211_send_band_rateinfo()
1917 return -ENOBUFS; in nl80211_send_band_rateinfo()
1920 if (sband->vht_cap.vht_supported && in nl80211_send_band_rateinfo()
1922 sizeof(sband->vht_cap.vht_mcs), in nl80211_send_band_rateinfo()
1923 &sband->vht_cap.vht_mcs) || in nl80211_send_band_rateinfo()
1925 sband->vht_cap.cap))) in nl80211_send_band_rateinfo()
1926 return -ENOBUFS; in nl80211_send_band_rateinfo()
1928 if (large && sband->n_iftype_data) { in nl80211_send_band_rateinfo()
1936 return -ENOBUFS; in nl80211_send_band_rateinfo()
1943 return -ENOBUFS; in nl80211_send_band_rateinfo()
1956 if (large && sband->edmg_cap.channels && in nl80211_send_band_rateinfo()
1958 sband->edmg_cap.channels) || in nl80211_send_band_rateinfo()
1960 sband->edmg_cap.bw_config))) in nl80211_send_band_rateinfo()
1962 return -ENOBUFS; in nl80211_send_band_rateinfo()
1967 return -ENOBUFS; in nl80211_send_band_rateinfo()
1969 for (i = 0; i < sband->n_bitrates; i++) { in nl80211_send_band_rateinfo()
1972 return -ENOBUFS; in nl80211_send_band_rateinfo()
1974 rate = &sband->bitrates[i]; in nl80211_send_band_rateinfo()
1976 rate->bitrate)) in nl80211_send_band_rateinfo()
1977 return -ENOBUFS; in nl80211_send_band_rateinfo()
1978 if ((rate->flags & IEEE80211_RATE_SHORT_PREAMBLE) && in nl80211_send_band_rateinfo()
1981 return -ENOBUFS; in nl80211_send_band_rateinfo()
1989 if (sband->band == NL80211_BAND_S1GHZ && sband->s1g_cap.s1g && in nl80211_send_band_rateinfo()
1991 sizeof(sband->s1g_cap.cap), in nl80211_send_band_rateinfo()
1992 sband->s1g_cap.cap) || in nl80211_send_band_rateinfo()
1994 sizeof(sband->s1g_cap.nss_mcs), in nl80211_send_band_rateinfo()
1995 sband->s1g_cap.nss_mcs))) in nl80211_send_band_rateinfo()
1996 return -ENOBUFS; in nl80211_send_band_rateinfo()
2015 return -ENOBUFS; in nl80211_send_mgmt_stypes()
2020 return -ENOBUFS; in nl80211_send_mgmt_stypes()
2027 return -ENOBUFS; in nl80211_send_mgmt_stypes()
2038 return -ENOBUFS; in nl80211_send_mgmt_stypes()
2043 return -ENOBUFS; in nl80211_send_mgmt_stypes()
2050 return -ENOBUFS; in nl80211_send_mgmt_stypes()
2063 if (rdev->ops->op) { \
2097 if (rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL) in nl80211_add_commands_unsplit()
2102 if (rdev->wiphy.flags & WIPHY_FLAG_NETNS_OK) { in nl80211_add_commands_unsplit()
2107 if (rdev->ops->set_monitor_channel || rdev->ops->start_ap || in nl80211_add_commands_unsplit()
2108 rdev->ops->join_mesh) { in nl80211_add_commands_unsplit()
2113 if (rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) { in nl80211_add_commands_unsplit()
2117 if (rdev->wiphy.max_sched_scan_reqs) in nl80211_add_commands_unsplit()
2121 if (rdev->wiphy.flags & WIPHY_FLAG_REPORTS_OBSS) { in nl80211_add_commands_unsplit()
2132 if (rdev->ops->connect || rdev->ops->auth) { in nl80211_add_commands_unsplit()
2138 if (rdev->ops->disconnect || rdev->ops->deauth) { in nl80211_add_commands_unsplit()
2146 return -ENOBUFS; in nl80211_add_commands_unsplit()
2155 if (!cap->ftm.supported) in nl80211_send_pmsr_ftm_capa()
2160 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
2162 if (cap->ftm.asap && nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_ASAP)) in nl80211_send_pmsr_ftm_capa()
2163 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
2164 if (cap->ftm.non_asap && in nl80211_send_pmsr_ftm_capa()
2166 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
2167 if (cap->ftm.request_lci && in nl80211_send_pmsr_ftm_capa()
2169 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
2170 if (cap->ftm.request_civicloc && in nl80211_send_pmsr_ftm_capa()
2172 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
2174 cap->ftm.preambles)) in nl80211_send_pmsr_ftm_capa()
2175 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
2177 cap->ftm.bandwidths)) in nl80211_send_pmsr_ftm_capa()
2178 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
2179 if (cap->ftm.max_bursts_exponent >= 0 && in nl80211_send_pmsr_ftm_capa()
2181 cap->ftm.max_bursts_exponent)) in nl80211_send_pmsr_ftm_capa()
2182 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
2183 if (cap->ftm.max_ftms_per_burst && in nl80211_send_pmsr_ftm_capa()
2185 cap->ftm.max_ftms_per_burst)) in nl80211_send_pmsr_ftm_capa()
2186 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
2187 if (cap->ftm.trigger_based && in nl80211_send_pmsr_ftm_capa()
2189 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
2190 if (cap->ftm.non_trigger_based && in nl80211_send_pmsr_ftm_capa()
2192 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
2201 const struct cfg80211_pmsr_capabilities *cap = rdev->wiphy.pmsr_capa; in nl80211_send_pmsr_capa()
2214 return -ENOBUFS; in nl80211_send_pmsr_capa()
2216 if (nla_put_u32(msg, NL80211_PMSR_ATTR_MAX_PEERS, cap->max_peers)) in nl80211_send_pmsr_capa()
2217 return -ENOBUFS; in nl80211_send_pmsr_capa()
2219 if (cap->report_ap_tsf && in nl80211_send_pmsr_capa()
2221 return -ENOBUFS; in nl80211_send_pmsr_capa()
2223 if (cap->randomize_mac_addr && in nl80211_send_pmsr_capa()
2225 return -ENOBUFS; in nl80211_send_pmsr_capa()
2229 return -ENOBUFS; in nl80211_send_pmsr_capa()
2232 return -ENOBUFS; in nl80211_send_pmsr_capa()
2248 if (!rdev->wiphy.num_iftype_akm_suites || in nl80211_put_iftype_akm_suites()
2249 !rdev->wiphy.iftype_akm_suites) in nl80211_put_iftype_akm_suites()
2254 return -ENOBUFS; in nl80211_put_iftype_akm_suites()
2256 for (i = 0; i < rdev->wiphy.num_iftype_akm_suites; i++) { in nl80211_put_iftype_akm_suites()
2259 return -ENOBUFS; in nl80211_put_iftype_akm_suites()
2261 iftype_akms = &rdev->wiphy.iftype_akm_suites[i]; in nl80211_put_iftype_akm_suites()
2264 iftype_akms->iftypes_mask)) in nl80211_put_iftype_akm_suites()
2265 return -ENOBUFS; in nl80211_put_iftype_akm_suites()
2268 sizeof(u32) * iftype_akms->n_akm_suites, in nl80211_put_iftype_akm_suites()
2269 iftype_akms->akm_suites)) { in nl80211_put_iftype_akm_suites()
2270 return -ENOBUFS; in nl80211_put_iftype_akm_suites()
2286 if (!rdev->wiphy.tid_config_support.vif && in nl80211_put_tid_config_support()
2287 !rdev->wiphy.tid_config_support.peer) in nl80211_put_tid_config_support()
2292 return -ENOSPC; in nl80211_put_tid_config_support()
2294 if (rdev->wiphy.tid_config_support.vif && in nl80211_put_tid_config_support()
2296 rdev->wiphy.tid_config_support.vif, in nl80211_put_tid_config_support()
2300 if (rdev->wiphy.tid_config_support.peer && in nl80211_put_tid_config_support()
2302 rdev->wiphy.tid_config_support.peer, in nl80211_put_tid_config_support()
2308 rdev->wiphy.tid_config_support.max_retry)) in nl80211_put_tid_config_support()
2311 rdev->wiphy.tid_config_support.max_retry)) in nl80211_put_tid_config_support()
2319 return -ENOBUFS; in nl80211_put_tid_config_support()
2330 if (!rdev->wiphy.sar_capa) in nl80211_put_sar_specs()
2333 num_freq_ranges = rdev->wiphy.sar_capa->num_freq_ranges; in nl80211_put_sar_specs()
2337 return -ENOSPC; in nl80211_put_sar_specs()
2339 if (nla_put_u32(msg, NL80211_SAR_ATTR_TYPE, rdev->wiphy.sar_capa->type)) in nl80211_put_sar_specs()
2353 rdev->wiphy.sar_capa->freq_ranges[i].start_freq)) in nl80211_put_sar_specs()
2357 rdev->wiphy.sar_capa->freq_ranges[i].end_freq)) in nl80211_put_sar_specs()
2369 return -ENOBUFS; in nl80211_put_sar_specs()
2376 if (!wiphy->mbssid_max_interfaces) in nl80211_put_mbssid_support()
2381 return -ENOBUFS; in nl80211_put_mbssid_support()
2384 wiphy->mbssid_max_interfaces)) in nl80211_put_mbssid_support()
2387 if (wiphy->ema_max_profile_periodicity && in nl80211_put_mbssid_support()
2390 wiphy->ema_max_profile_periodicity)) in nl80211_put_mbssid_support()
2398 return -ENOBUFS; in nl80211_put_mbssid_support()
2421 rdev->wiphy.mgmt_stypes; in nl80211_send_wiphy()
2426 return -ENOBUFS; in nl80211_send_wiphy()
2429 return -EINVAL; in nl80211_send_wiphy()
2431 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_wiphy()
2433 wiphy_name(&rdev->wiphy)) || in nl80211_send_wiphy()
2441 switch (state->split_start) { in nl80211_send_wiphy()
2444 rdev->wiphy.retry_short) || in nl80211_send_wiphy()
2446 rdev->wiphy.retry_long) || in nl80211_send_wiphy()
2448 rdev->wiphy.frag_threshold) || in nl80211_send_wiphy()
2450 rdev->wiphy.rts_threshold) || in nl80211_send_wiphy()
2452 rdev->wiphy.coverage_class) || in nl80211_send_wiphy()
2454 rdev->wiphy.max_scan_ssids) || in nl80211_send_wiphy()
2456 rdev->wiphy.max_sched_scan_ssids) || in nl80211_send_wiphy()
2458 rdev->wiphy.max_scan_ie_len) || in nl80211_send_wiphy()
2460 rdev->wiphy.max_sched_scan_ie_len) || in nl80211_send_wiphy()
2462 rdev->wiphy.max_match_sets)) in nl80211_send_wiphy()
2465 if ((rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN) && in nl80211_send_wiphy()
2468 if ((rdev->wiphy.flags & WIPHY_FLAG_MESH_AUTH) && in nl80211_send_wiphy()
2471 if ((rdev->wiphy.flags & WIPHY_FLAG_AP_UAPSD) && in nl80211_send_wiphy()
2474 if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_FW_ROAM) && in nl80211_send_wiphy()
2477 if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) && in nl80211_send_wiphy()
2480 if ((rdev->wiphy.flags & WIPHY_FLAG_TDLS_EXTERNAL_SETUP) && in nl80211_send_wiphy()
2483 state->split_start++; in nl80211_send_wiphy()
2484 if (state->split) in nl80211_send_wiphy()
2489 sizeof(u32) * rdev->wiphy.n_cipher_suites, in nl80211_send_wiphy()
2490 rdev->wiphy.cipher_suites)) in nl80211_send_wiphy()
2494 rdev->wiphy.max_num_pmkids)) in nl80211_send_wiphy()
2497 if ((rdev->wiphy.flags & WIPHY_FLAG_CONTROL_PORT_PROTOCOL) && in nl80211_send_wiphy()
2502 rdev->wiphy.available_antennas_tx) || in nl80211_send_wiphy()
2504 rdev->wiphy.available_antennas_rx)) in nl80211_send_wiphy()
2507 if ((rdev->wiphy.flags & WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD) && in nl80211_send_wiphy()
2509 rdev->wiphy.probe_resp_offload)) in nl80211_send_wiphy()
2512 if ((rdev->wiphy.available_antennas_tx || in nl80211_send_wiphy()
2513 rdev->wiphy.available_antennas_rx) && in nl80211_send_wiphy()
2514 rdev->ops->get_antenna) { in nl80211_send_wiphy()
2530 state->split_start++; in nl80211_send_wiphy()
2531 if (state->split) in nl80211_send_wiphy()
2536 rdev->wiphy.interface_modes)) in nl80211_send_wiphy()
2538 state->split_start++; in nl80211_send_wiphy()
2539 if (state->split) in nl80211_send_wiphy()
2548 for (band = state->band_start; in nl80211_send_wiphy()
2549 band < (state->split ? in nl80211_send_wiphy()
2556 if (band > NL80211_BAND_5GHZ && !state->split) in nl80211_send_wiphy()
2559 sband = rdev->wiphy.bands[band]; in nl80211_send_wiphy()
2568 switch (state->chan_start) { in nl80211_send_wiphy()
2571 state->split)) in nl80211_send_wiphy()
2573 state->chan_start++; in nl80211_send_wiphy()
2574 if (state->split) in nl80211_send_wiphy()
2584 for (i = state->chan_start - 1; in nl80211_send_wiphy()
2585 i < sband->n_channels; in nl80211_send_wiphy()
2592 chan = &sband->channels[i]; in nl80211_send_wiphy()
2595 msg, &rdev->wiphy, chan, in nl80211_send_wiphy()
2596 state->split)) in nl80211_send_wiphy()
2600 if (state->split) in nl80211_send_wiphy()
2603 if (i < sband->n_channels) in nl80211_send_wiphy()
2604 state->chan_start = i + 2; in nl80211_send_wiphy()
2606 state->chan_start = 0; in nl80211_send_wiphy()
2612 if (state->split) { in nl80211_send_wiphy()
2614 if (state->chan_start) in nl80211_send_wiphy()
2615 band--; in nl80211_send_wiphy()
2622 state->band_start = band + 1; in nl80211_send_wiphy()
2624 state->band_start = 0; in nl80211_send_wiphy()
2627 if (state->band_start == 0 && state->chan_start == 0) in nl80211_send_wiphy()
2628 state->split_start++; in nl80211_send_wiphy()
2629 if (state->split) in nl80211_send_wiphy()
2641 if (state->split) { in nl80211_send_wiphy()
2644 if (rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH) in nl80211_send_wiphy()
2647 if (rdev->wiphy.features & in nl80211_send_wiphy()
2653 if (rdev->wiphy.sar_capa) in nl80211_send_wiphy()
2659 state->split_start++; in nl80211_send_wiphy()
2660 if (state->split) in nl80211_send_wiphy()
2664 if (rdev->ops->remain_on_channel && in nl80211_send_wiphy()
2665 (rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL) && in nl80211_send_wiphy()
2668 rdev->wiphy.max_remain_on_channel_duration)) in nl80211_send_wiphy()
2671 if ((rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX) && in nl80211_send_wiphy()
2675 state->split_start++; in nl80211_send_wiphy()
2676 if (state->split) in nl80211_send_wiphy()
2681 if (nl80211_send_wowlan(msg, rdev, state->split)) in nl80211_send_wiphy()
2683 state->split_start++; in nl80211_send_wiphy()
2684 if (state->split) in nl80211_send_wiphy()
2687 state->split_start++; in nl80211_send_wiphy()
2692 rdev->wiphy.software_iftypes)) in nl80211_send_wiphy()
2695 if (nl80211_put_iface_combinations(&rdev->wiphy, msg, in nl80211_send_wiphy()
2696 state->split)) in nl80211_send_wiphy()
2699 state->split_start++; in nl80211_send_wiphy()
2700 if (state->split) in nl80211_send_wiphy()
2704 if ((rdev->wiphy.flags & WIPHY_FLAG_HAVE_AP_SME) && in nl80211_send_wiphy()
2706 rdev->wiphy.ap_sme_capa)) in nl80211_send_wiphy()
2709 features = rdev->wiphy.features; in nl80211_send_wiphy()
2711 * We can only add the per-channel limit information if the in nl80211_send_wiphy()
2715 if (state->split) in nl80211_send_wiphy()
2720 if (rdev->wiphy.ht_capa_mod_mask && in nl80211_send_wiphy()
2722 sizeof(*rdev->wiphy.ht_capa_mod_mask), in nl80211_send_wiphy()
2723 rdev->wiphy.ht_capa_mod_mask)) in nl80211_send_wiphy()
2726 if (rdev->wiphy.flags & WIPHY_FLAG_HAVE_AP_SME && in nl80211_send_wiphy()
2727 rdev->wiphy.max_acl_mac_addrs && in nl80211_send_wiphy()
2729 rdev->wiphy.max_acl_mac_addrs)) in nl80211_send_wiphy()
2742 if (state->split) in nl80211_send_wiphy()
2743 state->split_start++; in nl80211_send_wiphy()
2745 state->split_start = 0; in nl80211_send_wiphy()
2752 rdev->wiphy.max_sched_scan_plans) || in nl80211_send_wiphy()
2754 rdev->wiphy.max_sched_scan_plan_interval) || in nl80211_send_wiphy()
2756 rdev->wiphy.max_sched_scan_plan_iterations)) in nl80211_send_wiphy()
2759 if (rdev->wiphy.extended_capabilities && in nl80211_send_wiphy()
2761 rdev->wiphy.extended_capabilities_len, in nl80211_send_wiphy()
2762 rdev->wiphy.extended_capabilities) || in nl80211_send_wiphy()
2764 rdev->wiphy.extended_capabilities_len, in nl80211_send_wiphy()
2765 rdev->wiphy.extended_capabilities_mask))) in nl80211_send_wiphy()
2768 if (rdev->wiphy.vht_capa_mod_mask && in nl80211_send_wiphy()
2770 sizeof(*rdev->wiphy.vht_capa_mod_mask), in nl80211_send_wiphy()
2771 rdev->wiphy.vht_capa_mod_mask)) in nl80211_send_wiphy()
2775 rdev->wiphy.perm_addr)) in nl80211_send_wiphy()
2778 if (!is_zero_ether_addr(rdev->wiphy.addr_mask) && in nl80211_send_wiphy()
2780 rdev->wiphy.addr_mask)) in nl80211_send_wiphy()
2783 if (rdev->wiphy.n_addresses > 1) { in nl80211_send_wiphy()
2790 for (i = 0; i < rdev->wiphy.n_addresses; i++) in nl80211_send_wiphy()
2792 rdev->wiphy.addresses[i].addr)) in nl80211_send_wiphy()
2798 state->split_start++; in nl80211_send_wiphy()
2804 if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_5_10_MHZ) && in nl80211_send_wiphy()
2809 if (rdev->wiphy.max_ap_assoc_sta && in nl80211_send_wiphy()
2811 rdev->wiphy.max_ap_assoc_sta)) in nl80211_send_wiphy()
2814 state->split_start++; in nl80211_send_wiphy()
2817 if (rdev->wiphy.n_vendor_commands) { in nl80211_send_wiphy()
2826 for (i = 0; i < rdev->wiphy.n_vendor_commands; i++) { in nl80211_send_wiphy()
2827 info = &rdev->wiphy.vendor_commands[i].info; in nl80211_send_wiphy()
2834 if (rdev->wiphy.n_vendor_events) { in nl80211_send_wiphy()
2843 for (i = 0; i < rdev->wiphy.n_vendor_events; i++) { in nl80211_send_wiphy()
2844 info = &rdev->wiphy.vendor_events[i]; in nl80211_send_wiphy()
2850 state->split_start++; in nl80211_send_wiphy()
2853 if (rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH && in nl80211_send_wiphy()
2855 rdev->wiphy.max_num_csa_counters)) in nl80211_send_wiphy()
2858 if (rdev->wiphy.regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED && in nl80211_send_wiphy()
2862 if (rdev->wiphy.max_sched_scan_reqs && in nl80211_send_wiphy()
2864 rdev->wiphy.max_sched_scan_reqs)) in nl80211_send_wiphy()
2868 sizeof(rdev->wiphy.ext_features), in nl80211_send_wiphy()
2869 rdev->wiphy.ext_features)) in nl80211_send_wiphy()
2872 if (rdev->wiphy.bss_select_support) { in nl80211_send_wiphy()
2874 u32 bss_select_support = rdev->wiphy.bss_select_support; in nl80211_send_wiphy()
2892 state->split_start++; in nl80211_send_wiphy()
2895 if (rdev->wiphy.num_iftype_ext_capab && in nl80211_send_wiphy()
2896 rdev->wiphy.iftype_ext_capab) { in nl80211_send_wiphy()
2904 for (i = state->capa_start; in nl80211_send_wiphy()
2905 i < rdev->wiphy.num_iftype_ext_capab; i++) { in nl80211_send_wiphy()
2908 capab = &rdev->wiphy.iftype_ext_capab[i]; in nl80211_send_wiphy()
2914 capab->iftype) || in nl80211_send_wiphy()
2916 capab->extended_capabilities_len, in nl80211_send_wiphy()
2917 capab->extended_capabilities) || in nl80211_send_wiphy()
2919 capab->extended_capabilities_len, in nl80211_send_wiphy()
2920 capab->extended_capabilities_mask)) in nl80211_send_wiphy()
2923 if (rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_MLO && in nl80211_send_wiphy()
2926 capab->eml_capabilities) || in nl80211_send_wiphy()
2929 capab->mld_capa_and_ops))) in nl80211_send_wiphy()
2933 if (state->split) in nl80211_send_wiphy()
2937 if (i < rdev->wiphy.num_iftype_ext_capab) { in nl80211_send_wiphy()
2938 state->capa_start = i + 1; in nl80211_send_wiphy()
2944 rdev->wiphy.nan_supported_bands)) in nl80211_send_wiphy()
2947 if (wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_send_wiphy()
2959 rdev->wiphy.txq_limit)) in nl80211_send_wiphy()
2962 rdev->wiphy.txq_memory_limit)) in nl80211_send_wiphy()
2965 rdev->wiphy.txq_quantum)) in nl80211_send_wiphy()
2969 state->split_start++; in nl80211_send_wiphy()
2975 state->split_start++; in nl80211_send_wiphy()
2978 if (rdev->wiphy.akm_suites && in nl80211_send_wiphy()
2980 sizeof(u32) * rdev->wiphy.n_akm_suites, in nl80211_send_wiphy()
2981 rdev->wiphy.akm_suites)) in nl80211_send_wiphy()
2989 state->split_start++; in nl80211_send_wiphy()
2995 if (nl80211_put_mbssid_support(&rdev->wiphy, msg)) in nl80211_send_wiphy()
2999 rdev->wiphy.max_num_akm_suites)) in nl80211_send_wiphy()
3002 if (rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_MLO) in nl80211_send_wiphy()
3005 if (rdev->wiphy.hw_timestamp_max_peers && in nl80211_send_wiphy()
3007 rdev->wiphy.hw_timestamp_max_peers)) in nl80211_send_wiphy()
3011 state->split_start = 0; in nl80211_send_wiphy()
3020 return -EMSGSIZE; in nl80211_send_wiphy()
3031 return -ENOMEM; in nl80211_dump_wiphy_parse()
3033 ret = nlmsg_parse_deprecated(cb->nlh, in nl80211_dump_wiphy_parse()
3043 state->split = tb[NL80211_ATTR_SPLIT_WIPHY_DUMP]; in nl80211_dump_wiphy_parse()
3045 state->filter_wiphy = nla_get_u32(tb[NL80211_ATTR_WIPHY]); in nl80211_dump_wiphy_parse()
3047 state->filter_wiphy = nla_get_u64(tb[NL80211_ATTR_WDEV]) >> 32; in nl80211_dump_wiphy_parse()
3053 netdev = __dev_get_by_index(sock_net(skb->sk), ifidx); in nl80211_dump_wiphy_parse()
3055 ret = -ENODEV; in nl80211_dump_wiphy_parse()
3058 if (netdev->ieee80211_ptr) { in nl80211_dump_wiphy_parse()
3060 netdev->ieee80211_ptr->wiphy); in nl80211_dump_wiphy_parse()
3061 state->filter_wiphy = rdev->wiphy_idx; in nl80211_dump_wiphy_parse()
3074 struct nl80211_dump_wiphy_state *state = (void *)cb->args[0]; in nl80211_dump_wiphy()
3082 return -ENOMEM; in nl80211_dump_wiphy()
3084 state->filter_wiphy = -1; in nl80211_dump_wiphy()
3091 cb->args[0] = (long)state; in nl80211_dump_wiphy()
3095 if (!net_eq(wiphy_net(&rdev->wiphy), sock_net(skb->sk))) in nl80211_dump_wiphy()
3097 if (++idx <= state->start) in nl80211_dump_wiphy()
3099 if (state->filter_wiphy != -1 && in nl80211_dump_wiphy()
3100 state->filter_wiphy != rdev->wiphy_idx) in nl80211_dump_wiphy()
3102 wiphy_lock(&rdev->wiphy); in nl80211_dump_wiphy()
3107 NETLINK_CB(cb->skb).portid, in nl80211_dump_wiphy()
3108 cb->nlh->nlmsg_seq, in nl80211_dump_wiphy()
3124 if ((ret == -ENOBUFS || ret == -EMSGSIZE) && in nl80211_dump_wiphy()
3125 !skb->len && !state->split && in nl80211_dump_wiphy()
3126 cb->min_dump_alloc < 4096) { in nl80211_dump_wiphy()
3127 cb->min_dump_alloc = 4096; in nl80211_dump_wiphy()
3128 state->split_start = 0; in nl80211_dump_wiphy()
3129 wiphy_unlock(&rdev->wiphy); in nl80211_dump_wiphy()
3133 idx--; in nl80211_dump_wiphy()
3136 } while (state->split_start > 0); in nl80211_dump_wiphy()
3137 wiphy_unlock(&rdev->wiphy); in nl80211_dump_wiphy()
3142 state->start = idx; in nl80211_dump_wiphy()
3144 return skb->len; in nl80211_dump_wiphy()
3149 kfree((void *)cb->args[0]); in nl80211_dump_wiphy_done()
3156 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_wiphy()
3161 return -ENOMEM; in nl80211_get_wiphy()
3164 info->snd_portid, info->snd_seq, 0, in nl80211_get_wiphy()
3167 return -ENOBUFS; in nl80211_get_wiphy()
3189 return -EINVAL; in parse_txq_params()
3192 txq_params->txop = nla_get_u16(tb[NL80211_TXQ_ATTR_TXOP]); in parse_txq_params()
3193 txq_params->cwmin = nla_get_u16(tb[NL80211_TXQ_ATTR_CWMIN]); in parse_txq_params()
3194 txq_params->cwmax = nla_get_u16(tb[NL80211_TXQ_ATTR_CWMAX]); in parse_txq_params()
3195 txq_params->aifs = nla_get_u8(tb[NL80211_TXQ_ATTR_AIFS]); in parse_txq_params()
3198 return -EINVAL; in parse_txq_params()
3199 txq_params->ac = array_index_nospec(ac, NL80211_NUM_ACS); in parse_txq_params()
3212 * low-level driver when the AP starts or the mesh is joined. in nl80211_can_set_dev_channel()
3214 * the channel in the start-ap or join-mesh commands instead. in nl80211_can_set_dev_channel()
3221 wdev->iftype == NL80211_IFTYPE_AP || in nl80211_can_set_dev_channel()
3222 wdev->iftype == NL80211_IFTYPE_MESH_POINT || in nl80211_can_set_dev_channel()
3223 wdev->iftype == NL80211_IFTYPE_MONITOR || in nl80211_can_set_dev_channel()
3224 wdev->iftype == NL80211_IFTYPE_P2P_GO; in nl80211_can_set_dev_channel()
3232 if (!wiphy_ext_feature_isset(&rdev->wiphy, NL80211_EXT_FEATURE_PUNCT)) in nl80211_parse_punct_bitmap()
3233 return -EINVAL; in nl80211_parse_punct_bitmap()
3235 *punct_bitmap = nla_get_u32(info->attrs[NL80211_ATTR_PUNCT_BITMAP]); in nl80211_parse_punct_bitmap()
3237 return -EINVAL; in nl80211_parse_punct_bitmap()
3246 struct netlink_ext_ack *extack = info->extack; in nl80211_parse_chandef()
3247 struct nlattr **attrs = info->attrs; in nl80211_parse_chandef()
3253 return -EINVAL; in nl80211_parse_chandef()
3257 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ])); in nl80211_parse_chandef()
3258 if (info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]) in nl80211_parse_chandef()
3260 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]); in nl80211_parse_chandef()
3263 chandef->chan = ieee80211_get_channel_khz(&rdev->wiphy, control_freq); in nl80211_parse_chandef()
3264 chandef->width = NL80211_CHAN_WIDTH_20_NOHT; in nl80211_parse_chandef()
3265 chandef->center_freq1 = KHZ_TO_MHZ(control_freq); in nl80211_parse_chandef()
3266 chandef->freq1_offset = control_freq % 1000; in nl80211_parse_chandef()
3267 chandef->center_freq2 = 0; in nl80211_parse_chandef()
3270 if (!chandef->chan || chandef->chan->flags & IEEE80211_CHAN_DISABLED) { in nl80211_parse_chandef()
3273 return -EINVAL; in nl80211_parse_chandef()
3286 cfg80211_chandef_create(chandef, chandef->chan, in nl80211_parse_chandef()
3290 chandef->center_freq1 != nla_get_u32(attrs[NL80211_ATTR_CENTER_FREQ1])) { in nl80211_parse_chandef()
3294 return -EINVAL; in nl80211_parse_chandef()
3302 return -EINVAL; in nl80211_parse_chandef()
3309 return -EINVAL; in nl80211_parse_chandef()
3312 chandef->width = in nl80211_parse_chandef()
3314 if (chandef->chan->band == NL80211_BAND_S1GHZ) { in nl80211_parse_chandef()
3316 if (chandef->width != ieee80211_s1g_channel_width(chandef->chan)) { in nl80211_parse_chandef()
3320 return -EINVAL; in nl80211_parse_chandef()
3324 chandef->center_freq1 = in nl80211_parse_chandef()
3327 chandef->freq1_offset = nla_get_u32( in nl80211_parse_chandef()
3330 chandef->freq1_offset = 0; in nl80211_parse_chandef()
3333 chandef->center_freq2 = in nl80211_parse_chandef()
3337 if (info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]) { in nl80211_parse_chandef()
3338 chandef->edmg.channels = in nl80211_parse_chandef()
3339 nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]); in nl80211_parse_chandef()
3341 if (info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]) in nl80211_parse_chandef()
3342 chandef->edmg.bw_config = in nl80211_parse_chandef()
3343 nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]); in nl80211_parse_chandef()
3345 chandef->edmg.bw_config = 0; in nl80211_parse_chandef()
3346 chandef->edmg.channels = 0; in nl80211_parse_chandef()
3351 return -EINVAL; in nl80211_parse_chandef()
3354 if (!cfg80211_chandef_usable(&rdev->wiphy, chandef, in nl80211_parse_chandef()
3357 return -EINVAL; in nl80211_parse_chandef()
3360 if ((chandef->width == NL80211_CHAN_WIDTH_5 || in nl80211_parse_chandef()
3361 chandef->width == NL80211_CHAN_WIDTH_10) && in nl80211_parse_chandef()
3362 !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_5_10_MHZ)) { in nl80211_parse_chandef()
3364 return -EINVAL; in nl80211_parse_chandef()
3382 wdev = dev->ieee80211_ptr; in __nl80211_set_channel()
3384 return -EOPNOTSUPP; in __nl80211_set_channel()
3386 iftype = wdev->iftype; in __nl80211_set_channel()
3389 if (wdev && wdev->valid_links) in __nl80211_set_channel()
3390 return -EINVAL; in __nl80211_set_channel()
3401 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &chandef, in __nl80211_set_channel()
3403 return -EINVAL; in __nl80211_set_channel()
3404 if (wdev->links[link_id].ap.beacon_interval) { in __nl80211_set_channel()
3407 if (!dev || !rdev->ops->set_ap_chanwidth || in __nl80211_set_channel()
3408 !(rdev->wiphy.features & in __nl80211_set_channel()
3410 return -EBUSY; in __nl80211_set_channel()
3413 cur_chan = wdev->links[link_id].ap.chandef.chan; in __nl80211_set_channel()
3415 return -EBUSY; in __nl80211_set_channel()
3421 wdev->links[link_id].ap.chandef = chandef; in __nl80211_set_channel()
3423 wdev->u.ap.preset_chandef = chandef; in __nl80211_set_channel()
3434 return -EINVAL; in __nl80211_set_channel()
3439 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_channel()
3440 int link_id = nl80211_link_id_or_invalid(info->attrs); in nl80211_set_channel()
3441 struct net_device *netdev = info->user_ptr[1]; in nl80211_set_channel()
3463 * done for backward compatibility -- previously in nl80211_set_wiphy()
3470 if (info->attrs[NL80211_ATTR_IFINDEX]) { in nl80211_set_wiphy()
3471 int ifindex = nla_get_u32(info->attrs[NL80211_ATTR_IFINDEX]); in nl80211_set_wiphy()
3474 if (netdev && netdev->ieee80211_ptr) in nl80211_set_wiphy()
3475 rdev = wiphy_to_rdev(netdev->ieee80211_ptr->wiphy); in nl80211_set_wiphy()
3482 info->attrs); in nl80211_set_wiphy()
3491 wdev = netdev->ieee80211_ptr; in nl80211_set_wiphy()
3493 wiphy_lock(&rdev->wiphy); in nl80211_set_wiphy()
3500 if (info->attrs[NL80211_ATTR_WIPHY_NAME]) in nl80211_set_wiphy()
3502 rdev, nla_data(info->attrs[NL80211_ATTR_WIPHY_NAME])); in nl80211_set_wiphy()
3508 if (info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS]) { in nl80211_set_wiphy()
3512 if (!rdev->ops->set_txq_params) { in nl80211_set_wiphy()
3513 result = -EOPNOTSUPP; in nl80211_set_wiphy()
3518 result = -EINVAL; in nl80211_set_wiphy()
3522 if (netdev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && in nl80211_set_wiphy()
3523 netdev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) { in nl80211_set_wiphy()
3524 result = -EINVAL; in nl80211_set_wiphy()
3529 result = -ENETDOWN; in nl80211_set_wiphy()
3534 info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS], in nl80211_set_wiphy()
3540 info->extack); in nl80211_set_wiphy()
3548 nl80211_link_id_or_invalid(info->attrs); in nl80211_set_wiphy()
3551 !(netdev->ieee80211_ptr->valid_links & in nl80211_set_wiphy()
3553 result = -ENOLINK; in nl80211_set_wiphy()
3555 !netdev->ieee80211_ptr->valid_links) in nl80211_set_wiphy()
3556 result = -EINVAL; in nl80211_set_wiphy()
3565 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { in nl80211_set_wiphy()
3566 int link_id = nl80211_link_id_or_invalid(info->attrs); in nl80211_set_wiphy()
3581 if (info->attrs[NL80211_ATTR_WIPHY_TX_POWER_SETTING]) { in nl80211_set_wiphy()
3586 if (!(rdev->wiphy.features & NL80211_FEATURE_VIF_TXPOWER)) in nl80211_set_wiphy()
3589 if (!rdev->ops->set_tx_power) { in nl80211_set_wiphy()
3590 result = -EOPNOTSUPP; in nl80211_set_wiphy()
3595 type = nla_get_u32(info->attrs[idx]); in nl80211_set_wiphy()
3597 if (!info->attrs[NL80211_ATTR_WIPHY_TX_POWER_LEVEL] && in nl80211_set_wiphy()
3599 result = -EINVAL; in nl80211_set_wiphy()
3605 mbm = nla_get_u32(info->attrs[idx]); in nl80211_set_wiphy()
3613 if (info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX] && in nl80211_set_wiphy()
3614 info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]) { in nl80211_set_wiphy()
3617 if ((!rdev->wiphy.available_antennas_tx && in nl80211_set_wiphy()
3618 !rdev->wiphy.available_antennas_rx) || in nl80211_set_wiphy()
3619 !rdev->ops->set_antenna) { in nl80211_set_wiphy()
3620 result = -EOPNOTSUPP; in nl80211_set_wiphy()
3624 tx_ant = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX]); in nl80211_set_wiphy()
3625 rx_ant = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]); in nl80211_set_wiphy()
3629 if ((~tx_ant && (tx_ant & ~rdev->wiphy.available_antennas_tx)) || in nl80211_set_wiphy()
3630 (~rx_ant && (rx_ant & ~rdev->wiphy.available_antennas_rx))) { in nl80211_set_wiphy()
3631 result = -EINVAL; in nl80211_set_wiphy()
3635 tx_ant = tx_ant & rdev->wiphy.available_antennas_tx; in nl80211_set_wiphy()
3636 rx_ant = rx_ant & rdev->wiphy.available_antennas_rx; in nl80211_set_wiphy()
3645 if (info->attrs[NL80211_ATTR_WIPHY_RETRY_SHORT]) { in nl80211_set_wiphy()
3647 info->attrs[NL80211_ATTR_WIPHY_RETRY_SHORT]); in nl80211_set_wiphy()
3652 if (info->attrs[NL80211_ATTR_WIPHY_RETRY_LONG]) { in nl80211_set_wiphy()
3654 info->attrs[NL80211_ATTR_WIPHY_RETRY_LONG]); in nl80211_set_wiphy()
3659 if (info->attrs[NL80211_ATTR_WIPHY_FRAG_THRESHOLD]) { in nl80211_set_wiphy()
3661 info->attrs[NL80211_ATTR_WIPHY_FRAG_THRESHOLD]); in nl80211_set_wiphy()
3663 result = -EINVAL; in nl80211_set_wiphy()
3667 if (frag_threshold != (u32) -1) { in nl80211_set_wiphy()
3679 if (info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]) { in nl80211_set_wiphy()
3681 info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]); in nl80211_set_wiphy()
3685 if (info->attrs[NL80211_ATTR_WIPHY_COVERAGE_CLASS]) { in nl80211_set_wiphy()
3686 if (info->attrs[NL80211_ATTR_WIPHY_DYN_ACK]) { in nl80211_set_wiphy()
3687 result = -EINVAL; in nl80211_set_wiphy()
3692 info->attrs[NL80211_ATTR_WIPHY_COVERAGE_CLASS]); in nl80211_set_wiphy()
3696 if (info->attrs[NL80211_ATTR_WIPHY_DYN_ACK]) { in nl80211_set_wiphy()
3697 if (!(rdev->wiphy.features & NL80211_FEATURE_ACKTO_ESTIMATION)) { in nl80211_set_wiphy()
3698 result = -EOPNOTSUPP; in nl80211_set_wiphy()
3705 if (info->attrs[NL80211_ATTR_TXQ_LIMIT]) { in nl80211_set_wiphy()
3706 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_set_wiphy()
3708 result = -EOPNOTSUPP; in nl80211_set_wiphy()
3712 info->attrs[NL80211_ATTR_TXQ_LIMIT]); in nl80211_set_wiphy()
3716 if (info->attrs[NL80211_ATTR_TXQ_MEMORY_LIMIT]) { in nl80211_set_wiphy()
3717 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_set_wiphy()
3719 result = -EOPNOTSUPP; in nl80211_set_wiphy()
3723 info->attrs[NL80211_ATTR_TXQ_MEMORY_LIMIT]); in nl80211_set_wiphy()
3727 if (info->attrs[NL80211_ATTR_TXQ_QUANTUM]) { in nl80211_set_wiphy()
3728 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_set_wiphy()
3730 result = -EOPNOTSUPP; in nl80211_set_wiphy()
3734 info->attrs[NL80211_ATTR_TXQ_QUANTUM]); in nl80211_set_wiphy()
3744 if (!rdev->ops->set_wiphy_params) { in nl80211_set_wiphy()
3745 result = -EOPNOTSUPP; in nl80211_set_wiphy()
3749 old_retry_short = rdev->wiphy.retry_short; in nl80211_set_wiphy()
3750 old_retry_long = rdev->wiphy.retry_long; in nl80211_set_wiphy()
3751 old_frag_threshold = rdev->wiphy.frag_threshold; in nl80211_set_wiphy()
3752 old_rts_threshold = rdev->wiphy.rts_threshold; in nl80211_set_wiphy()
3753 old_coverage_class = rdev->wiphy.coverage_class; in nl80211_set_wiphy()
3754 old_txq_limit = rdev->wiphy.txq_limit; in nl80211_set_wiphy()
3755 old_txq_memory_limit = rdev->wiphy.txq_memory_limit; in nl80211_set_wiphy()
3756 old_txq_quantum = rdev->wiphy.txq_quantum; in nl80211_set_wiphy()
3759 rdev->wiphy.retry_short = retry_short; in nl80211_set_wiphy()
3761 rdev->wiphy.retry_long = retry_long; in nl80211_set_wiphy()
3763 rdev->wiphy.frag_threshold = frag_threshold; in nl80211_set_wiphy()
3765 rdev->wiphy.rts_threshold = rts_threshold; in nl80211_set_wiphy()
3767 rdev->wiphy.coverage_class = coverage_class; in nl80211_set_wiphy()
3769 rdev->wiphy.txq_limit = txq_limit; in nl80211_set_wiphy()
3771 rdev->wiphy.txq_memory_limit = txq_memory_limit; in nl80211_set_wiphy()
3773 rdev->wiphy.txq_quantum = txq_quantum; in nl80211_set_wiphy()
3777 rdev->wiphy.retry_short = old_retry_short; in nl80211_set_wiphy()
3778 rdev->wiphy.retry_long = old_retry_long; in nl80211_set_wiphy()
3779 rdev->wiphy.frag_threshold = old_frag_threshold; in nl80211_set_wiphy()
3780 rdev->wiphy.rts_threshold = old_rts_threshold; in nl80211_set_wiphy()
3781 rdev->wiphy.coverage_class = old_coverage_class; in nl80211_set_wiphy()
3782 rdev->wiphy.txq_limit = old_txq_limit; in nl80211_set_wiphy()
3783 rdev->wiphy.txq_memory_limit = old_txq_memory_limit; in nl80211_set_wiphy()
3784 rdev->wiphy.txq_quantum = old_txq_quantum; in nl80211_set_wiphy()
3792 wiphy_unlock(&rdev->wiphy); in nl80211_set_wiphy()
3799 return -EINVAL; in nl80211_send_chandef()
3802 chandef->chan->center_freq)) in nl80211_send_chandef()
3803 return -ENOBUFS; in nl80211_send_chandef()
3805 chandef->chan->freq_offset)) in nl80211_send_chandef()
3806 return -ENOBUFS; in nl80211_send_chandef()
3807 switch (chandef->width) { in nl80211_send_chandef()
3813 return -ENOBUFS; in nl80211_send_chandef()
3818 if (nla_put_u32(msg, NL80211_ATTR_CHANNEL_WIDTH, chandef->width)) in nl80211_send_chandef()
3819 return -ENOBUFS; in nl80211_send_chandef()
3820 if (nla_put_u32(msg, NL80211_ATTR_CENTER_FREQ1, chandef->center_freq1)) in nl80211_send_chandef()
3821 return -ENOBUFS; in nl80211_send_chandef()
3822 if (chandef->center_freq2 && in nl80211_send_chandef()
3823 nla_put_u32(msg, NL80211_ATTR_CENTER_FREQ2, chandef->center_freq2)) in nl80211_send_chandef()
3824 return -ENOBUFS; in nl80211_send_chandef()
3834 struct net_device *dev = wdev->netdev; in nl80211_send_iface()
3837 lockdep_assert_wiphy(&rdev->wiphy); in nl80211_send_iface()
3845 return -1; in nl80211_send_iface()
3848 (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in nl80211_send_iface()
3849 nla_put_string(msg, NL80211_ATTR_IFNAME, dev->name))) in nl80211_send_iface()
3852 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_iface()
3853 nla_put_u32(msg, NL80211_ATTR_IFTYPE, wdev->iftype) || in nl80211_send_iface()
3858 rdev->devlist_generation ^ in nl80211_send_iface()
3860 nla_put_u8(msg, NL80211_ATTR_4ADDR, wdev->use_4addr)) in nl80211_send_iface()
3863 if (rdev->ops->get_channel && !wdev->valid_links) { in nl80211_send_iface()
3872 if (rdev->ops->get_tx_power) { in nl80211_send_iface()
3882 switch (wdev->iftype) { in nl80211_send_iface()
3885 if (wdev->u.ap.ssid_len && in nl80211_send_iface()
3886 nla_put(msg, NL80211_ATTR_SSID, wdev->u.ap.ssid_len, in nl80211_send_iface()
3887 wdev->u.ap.ssid)) in nl80211_send_iface()
3892 if (wdev->u.client.ssid_len && in nl80211_send_iface()
3893 nla_put(msg, NL80211_ATTR_SSID, wdev->u.client.ssid_len, in nl80211_send_iface()
3894 wdev->u.client.ssid)) in nl80211_send_iface()
3898 if (wdev->u.ibss.ssid_len && in nl80211_send_iface()
3899 nla_put(msg, NL80211_ATTR_SSID, wdev->u.ibss.ssid_len, in nl80211_send_iface()
3900 wdev->u.ibss.ssid)) in nl80211_send_iface()
3908 if (rdev->ops->get_txq_stats) { in nl80211_send_iface()
3918 if (wdev->valid_links) { in nl80211_send_iface()
3937 wdev->links[link_id].addr)) in nl80211_send_iface()
3955 return -EMSGSIZE; in nl80211_send_iface()
3962 int wp_start = cb->args[0]; in nl80211_dump_interface()
3963 int if_start = cb->args[1]; in nl80211_dump_interface()
3964 int filter_wiphy = -1; in nl80211_dump_interface()
3970 if (!cb->args[2]) { in nl80211_dump_interface()
3972 .filter_wiphy = -1, in nl80211_dump_interface()
3982 * if filtering, set cb->args[2] to +1 since 0 is the default in nl80211_dump_interface()
3986 cb->args[2] = filter_wiphy + 1; in nl80211_dump_interface()
3988 cb->args[2] = -1; in nl80211_dump_interface()
3989 } else if (cb->args[2] > 0) { in nl80211_dump_interface()
3990 filter_wiphy = cb->args[2] - 1; in nl80211_dump_interface()
3994 if (!net_eq(wiphy_net(&rdev->wiphy), sock_net(skb->sk))) in nl80211_dump_interface()
4001 if (filter_wiphy >= 0 && filter_wiphy != rdev->wiphy_idx) in nl80211_dump_interface()
4006 wiphy_lock(&rdev->wiphy); in nl80211_dump_interface()
4007 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) { in nl80211_dump_interface()
4012 if (nl80211_send_iface(skb, NETLINK_CB(cb->skb).portid, in nl80211_dump_interface()
4013 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_dump_interface()
4016 wiphy_unlock(&rdev->wiphy); in nl80211_dump_interface()
4021 wiphy_unlock(&rdev->wiphy); in nl80211_dump_interface()
4027 cb->args[0] = wp_idx; in nl80211_dump_interface()
4028 cb->args[1] = if_idx; in nl80211_dump_interface()
4030 ret = skb->len; in nl80211_dump_interface()
4040 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_interface()
4041 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_get_interface()
4045 return -ENOMEM; in nl80211_get_interface()
4047 if (nl80211_send_iface(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_interface()
4050 return -ENOBUFS; in nl80211_get_interface()
4073 return -EINVAL; in parse_monitor_flags()
4076 return -EINVAL; in parse_monitor_flags()
4095 if (info->attrs[NL80211_ATTR_MNTR_FLAGS]) { in nl80211_parse_mon_options()
4097 return -EINVAL; in nl80211_parse_mon_options()
4099 err = parse_monitor_flags(info->attrs[NL80211_ATTR_MNTR_FLAGS], in nl80211_parse_mon_options()
4100 &params->flags); in nl80211_parse_mon_options()
4107 if (params->flags & MONITOR_FLAG_ACTIVE && in nl80211_parse_mon_options()
4108 !(rdev->wiphy.features & NL80211_FEATURE_ACTIVE_MONITOR)) in nl80211_parse_mon_options()
4109 return -EOPNOTSUPP; in nl80211_parse_mon_options()
4111 if (info->attrs[NL80211_ATTR_MU_MIMO_GROUP_DATA]) { in nl80211_parse_mon_options()
4116 return -EINVAL; in nl80211_parse_mon_options()
4118 if (!wiphy_ext_feature_isset(&rdev->wiphy, cap_flag)) in nl80211_parse_mon_options()
4119 return -EOPNOTSUPP; in nl80211_parse_mon_options()
4122 nla_data(info->attrs[NL80211_ATTR_MU_MIMO_GROUP_DATA]); in nl80211_parse_mon_options()
4126 (mumimo_groups[VHT_MUMIMO_GROUPS_DATA_LEN - 1] & BIT(7))) in nl80211_parse_mon_options()
4127 return -EINVAL; in nl80211_parse_mon_options()
4129 params->vht_mumimo_groups = mumimo_groups; in nl80211_parse_mon_options()
4133 if (info->attrs[NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR]) { in nl80211_parse_mon_options()
4137 return -EINVAL; in nl80211_parse_mon_options()
4139 if (!wiphy_ext_feature_isset(&rdev->wiphy, cap_flag)) in nl80211_parse_mon_options()
4140 return -EOPNOTSUPP; in nl80211_parse_mon_options()
4142 params->vht_mumimo_follow_addr = in nl80211_parse_mon_options()
4143 nla_data(info->attrs[NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR]); in nl80211_parse_mon_options()
4156 return -EBUSY; in nl80211_valid_4addr()
4162 if (rdev->wiphy.flags & WIPHY_FLAG_4ADDR_AP) in nl80211_valid_4addr()
4166 if (rdev->wiphy.flags & WIPHY_FLAG_4ADDR_STATION) in nl80211_valid_4addr()
4173 return -EOPNOTSUPP; in nl80211_valid_4addr()
4178 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_interface()
4182 struct net_device *dev = info->user_ptr[1]; in nl80211_set_interface()
4187 otype = ntype = dev->ieee80211_ptr->iftype; in nl80211_set_interface()
4189 if (info->attrs[NL80211_ATTR_IFTYPE]) { in nl80211_set_interface()
4190 ntype = nla_get_u32(info->attrs[NL80211_ATTR_IFTYPE]); in nl80211_set_interface()
4195 if (info->attrs[NL80211_ATTR_MESH_ID]) { in nl80211_set_interface()
4196 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_interface()
4199 return -EINVAL; in nl80211_set_interface()
4201 return -EINVAL; in nl80211_set_interface()
4203 return -EBUSY; in nl80211_set_interface()
4207 wdev->u.mesh.id_up_len = in nl80211_set_interface()
4208 nla_len(info->attrs[NL80211_ATTR_MESH_ID]); in nl80211_set_interface()
4209 memcpy(wdev->u.mesh.id, in nl80211_set_interface()
4210 nla_data(info->attrs[NL80211_ATTR_MESH_ID]), in nl80211_set_interface()
4211 wdev->u.mesh.id_up_len); in nl80211_set_interface()
4214 if (info->attrs[NL80211_ATTR_4ADDR]) { in nl80211_set_interface()
4215 params.use_4addr = !!nla_get_u8(info->attrs[NL80211_ATTR_4ADDR]); in nl80211_set_interface()
4221 params.use_4addr = -1; in nl80211_set_interface()
4235 if (!err && params.use_4addr != -1) in nl80211_set_interface()
4236 dev->ieee80211_ptr->use_4addr = params.use_4addr; in nl80211_set_interface()
4239 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_interface()
4249 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in _nl80211_new_interface()
4258 if (!info->attrs[NL80211_ATTR_IFNAME]) in _nl80211_new_interface()
4259 return -EINVAL; in _nl80211_new_interface()
4261 if (info->attrs[NL80211_ATTR_IFTYPE]) in _nl80211_new_interface()
4262 type = nla_get_u32(info->attrs[NL80211_ATTR_IFTYPE]); in _nl80211_new_interface()
4264 if (!rdev->ops->add_virtual_intf) in _nl80211_new_interface()
4265 return -EOPNOTSUPP; in _nl80211_new_interface()
4268 rdev->wiphy.features & NL80211_FEATURE_MAC_ON_CREATE) && in _nl80211_new_interface()
4269 info->attrs[NL80211_ATTR_MAC]) { in _nl80211_new_interface()
4270 nla_memcpy(params.macaddr, info->attrs[NL80211_ATTR_MAC], in _nl80211_new_interface()
4273 return -EADDRNOTAVAIL; in _nl80211_new_interface()
4276 if (info->attrs[NL80211_ATTR_4ADDR]) { in _nl80211_new_interface()
4277 params.use_4addr = !!nla_get_u8(info->attrs[NL80211_ATTR_4ADDR]); in _nl80211_new_interface()
4283 if (!cfg80211_iftype_allowed(&rdev->wiphy, type, params.use_4addr, 0)) in _nl80211_new_interface()
4284 return -EOPNOTSUPP; in _nl80211_new_interface()
4292 return -ENOMEM; in _nl80211_new_interface()
4295 nla_data(info->attrs[NL80211_ATTR_IFNAME]), in _nl80211_new_interface()
4299 return -EPROTO; in _nl80211_new_interface()
4305 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) in _nl80211_new_interface()
4306 wdev->owner_nlportid = info->snd_portid; in _nl80211_new_interface()
4310 if (!info->attrs[NL80211_ATTR_MESH_ID]) in _nl80211_new_interface()
4314 wdev->u.mesh.id_up_len = in _nl80211_new_interface()
4315 nla_len(info->attrs[NL80211_ATTR_MESH_ID]); in _nl80211_new_interface()
4316 memcpy(wdev->u.mesh.id, in _nl80211_new_interface()
4317 nla_data(info->attrs[NL80211_ATTR_MESH_ID]), in _nl80211_new_interface()
4318 wdev->u.mesh.id_up_len); in _nl80211_new_interface()
4333 if (nl80211_send_iface(msg, info->snd_portid, info->snd_seq, 0, in _nl80211_new_interface()
4336 return -ENOBUFS; in _nl80211_new_interface()
4344 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_new_interface()
4350 wiphy_lock(&rdev->wiphy); in nl80211_new_interface()
4352 wiphy_unlock(&rdev->wiphy); in nl80211_new_interface()
4359 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_del_interface()
4360 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_del_interface()
4362 if (!rdev->ops->del_virtual_intf) in nl80211_del_interface()
4363 return -EOPNOTSUPP; in nl80211_del_interface()
4374 mutex_unlock(&rdev->wiphy.mtx); in nl80211_del_interface()
4383 if (!wdev->netdev) in nl80211_del_interface()
4384 info->user_ptr[1] = NULL; in nl80211_del_interface()
4386 dev_close(wdev->netdev); in nl80211_del_interface()
4388 mutex_lock(&rdev->wiphy.mtx); in nl80211_del_interface()
4395 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_noack_map()
4396 struct net_device *dev = info->user_ptr[1]; in nl80211_set_noack_map()
4399 if (!info->attrs[NL80211_ATTR_NOACK_MAP]) in nl80211_set_noack_map()
4400 return -EINVAL; in nl80211_set_noack_map()
4402 if (!rdev->ops->set_noack_map) in nl80211_set_noack_map()
4403 return -EOPNOTSUPP; in nl80211_set_noack_map()
4405 noack_map = nla_get_u16(info->attrs[NL80211_ATTR_NOACK_MAP]); in nl80211_set_noack_map()
4415 if (link_id != -1) { in nl80211_validate_key_link_id()
4418 return -EINVAL; in nl80211_validate_key_link_id()
4424 if (wdev->valid_links) { in nl80211_validate_key_link_id()
4425 if (link_id == -1) { in nl80211_validate_key_link_id()
4428 return -EINVAL; in nl80211_validate_key_link_id()
4430 if (!(wdev->valid_links & BIT(link_id))) { in nl80211_validate_key_link_id()
4432 return -EINVAL; in nl80211_validate_key_link_id()
4434 } else if (link_id != -1) { in nl80211_validate_key_link_id()
4435 GENL_SET_ERR_MSG(info, "link ID not allowed for non-MLO group key"); in nl80211_validate_key_link_id()
4436 return -EINVAL; in nl80211_validate_key_link_id()
4453 if ((params->key && in get_key_callback()
4454 nla_put(cookie->msg, NL80211_ATTR_KEY_DATA, in get_key_callback()
4455 params->key_len, params->key)) || in get_key_callback()
4456 (params->seq && in get_key_callback()
4457 nla_put(cookie->msg, NL80211_ATTR_KEY_SEQ, in get_key_callback()
4458 params->seq_len, params->seq)) || in get_key_callback()
4459 (params->cipher && in get_key_callback()
4460 nla_put_u32(cookie->msg, NL80211_ATTR_KEY_CIPHER, in get_key_callback()
4461 params->cipher))) in get_key_callback()
4464 key = nla_nest_start_noflag(cookie->msg, NL80211_ATTR_KEY); in get_key_callback()
4468 if ((params->key && in get_key_callback()
4469 nla_put(cookie->msg, NL80211_KEY_DATA, in get_key_callback()
4470 params->key_len, params->key)) || in get_key_callback()
4471 (params->seq && in get_key_callback()
4472 nla_put(cookie->msg, NL80211_KEY_SEQ, in get_key_callback()
4473 params->seq_len, params->seq)) || in get_key_callback()
4474 (params->cipher && in get_key_callback()
4475 nla_put_u32(cookie->msg, NL80211_KEY_CIPHER, in get_key_callback()
4476 params->cipher))) in get_key_callback()
4479 if (nla_put_u8(cookie->msg, NL80211_KEY_IDX, cookie->idx)) in get_key_callback()
4482 nla_nest_end(cookie->msg, key); in get_key_callback()
4486 cookie->error = 1; in get_key_callback()
4491 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_key()
4493 struct net_device *dev = info->user_ptr[1]; in nl80211_get_key()
4503 int link_id = nl80211_link_id_or_invalid(info->attrs); in nl80211_get_key()
4504 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_get_key()
4506 if (wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_get_key()
4510 if ((wdev->iftype == NL80211_IFTYPE_STATION || in nl80211_get_key()
4511 wdev->iftype == NL80211_IFTYPE_P2P_CLIENT) && in nl80211_get_key()
4512 wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_get_key()
4516 if (info->attrs[NL80211_ATTR_KEY_IDX]) { in nl80211_get_key()
4517 key_idx = nla_get_u8(info->attrs[NL80211_ATTR_KEY_IDX]); in nl80211_get_key()
4521 return -EINVAL; in nl80211_get_key()
4525 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_get_key()
4526 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_get_key()
4529 if (info->attrs[NL80211_ATTR_KEY_TYPE]) { in nl80211_get_key()
4530 u32 kt = nla_get_u32(info->attrs[NL80211_ATTR_KEY_TYPE]); in nl80211_get_key()
4534 return -EINVAL; in nl80211_get_key()
4538 if (!rdev->ops->get_key) in nl80211_get_key()
4539 return -EOPNOTSUPP; in nl80211_get_key()
4541 if (!pairwise && mac_addr && !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN)) in nl80211_get_key()
4542 return -ENOENT; in nl80211_get_key()
4546 return -ENOMEM; in nl80211_get_key()
4548 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_key()
4556 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in nl80211_get_key()
4580 err = -ENOBUFS; in nl80211_get_key()
4588 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_key()
4591 struct net_device *dev = info->user_ptr[1]; in nl80211_set_key()
4592 int link_id = nl80211_link_id_or_invalid(info->attrs); in nl80211_set_key()
4593 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_key()
4600 return -EINVAL; in nl80211_set_key()
4607 return -EINVAL; in nl80211_set_key()
4610 if (!rdev->ops->set_default_key) in nl80211_set_key()
4611 return -EOPNOTSUPP; in nl80211_set_key()
4628 wdev->wext.default_key = key.idx; in nl80211_set_key()
4633 return -EINVAL; in nl80211_set_key()
4635 if (!rdev->ops->set_default_mgmt_key) in nl80211_set_key()
4636 return -EOPNOTSUPP; in nl80211_set_key()
4651 wdev->wext.default_mgmt_key = key.idx; in nl80211_set_key()
4656 return -EINVAL; in nl80211_set_key()
4658 if (!rdev->ops->set_default_beacon_key) in nl80211_set_key()
4659 return -EOPNOTSUPP; in nl80211_set_key()
4671 wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_set_key()
4675 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_set_key()
4676 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_set_key()
4679 return -EINVAL; in nl80211_set_key()
4690 return -EINVAL; in nl80211_set_key()
4695 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_new_key()
4697 struct net_device *dev = info->user_ptr[1]; in nl80211_new_key()
4700 int link_id = nl80211_link_id_or_invalid(info->attrs); in nl80211_new_key()
4701 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_new_key()
4709 return -EINVAL; in nl80211_new_key()
4712 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_new_key()
4713 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_new_key()
4715 if (key.type == -1) { in nl80211_new_key()
4726 return -EINVAL; in nl80211_new_key()
4730 info->attrs[NL80211_ATTR_VLAN_ID]) in nl80211_new_key()
4731 key.p.vlan_id = nla_get_u16(info->attrs[NL80211_ATTR_VLAN_ID]); in nl80211_new_key()
4733 if (!rdev->ops->add_key) in nl80211_new_key()
4734 return -EOPNOTSUPP; in nl80211_new_key()
4740 return -EINVAL; in nl80211_new_key()
4764 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_del_key()
4766 struct net_device *dev = info->user_ptr[1]; in nl80211_del_key()
4769 int link_id = nl80211_link_id_or_invalid(info->attrs); in nl80211_del_key()
4770 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_del_key()
4776 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_del_key()
4777 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_del_key()
4779 if (key.type == -1) { in nl80211_del_key()
4789 return -EINVAL; in nl80211_del_key()
4793 return -EINVAL; in nl80211_del_key()
4795 if (!rdev->ops->del_key) in nl80211_del_key()
4796 return -EOPNOTSUPP; in nl80211_del_key()
4801 !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN)) in nl80211_del_key()
4802 err = -ENOENT; in nl80211_del_key()
4815 if (key.idx == wdev->wext.default_key) in nl80211_del_key()
4816 wdev->wext.default_key = -1; in nl80211_del_key()
4817 else if (key.idx == wdev->wext.default_mgmt_key) in nl80211_del_key()
4818 wdev->wext.default_mgmt_key = -1; in nl80211_del_key()
4833 return -EINVAL; in validate_acl_mac_addrs()
4854 if (!wiphy->max_acl_mac_addrs) in parse_acl_data()
4855 return ERR_PTR(-EOPNOTSUPP); in parse_acl_data()
4857 if (!info->attrs[NL80211_ATTR_ACL_POLICY]) in parse_acl_data()
4858 return ERR_PTR(-EINVAL); in parse_acl_data()
4860 acl_policy = nla_get_u32(info->attrs[NL80211_ATTR_ACL_POLICY]); in parse_acl_data()
4863 return ERR_PTR(-EINVAL); in parse_acl_data()
4865 if (!info->attrs[NL80211_ATTR_MAC_ADDRS]) in parse_acl_data()
4866 return ERR_PTR(-EINVAL); in parse_acl_data()
4868 n_entries = validate_acl_mac_addrs(info->attrs[NL80211_ATTR_MAC_ADDRS]); in parse_acl_data()
4872 if (n_entries > wiphy->max_acl_mac_addrs) in parse_acl_data()
4873 return ERR_PTR(-EOPNOTSUPP); in parse_acl_data()
4877 return ERR_PTR(-ENOMEM); in parse_acl_data()
4878 acl->n_acl_entries = n_entries; in parse_acl_data()
4880 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_MAC_ADDRS], tmp) { in parse_acl_data()
4881 memcpy(acl->mac_addrs[i].addr, nla_data(attr), ETH_ALEN); in parse_acl_data()
4884 acl->acl_policy = acl_policy; in parse_acl_data()
4891 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_mac_acl()
4892 struct net_device *dev = info->user_ptr[1]; in nl80211_set_mac_acl()
4896 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && in nl80211_set_mac_acl()
4897 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_set_mac_acl()
4898 return -EOPNOTSUPP; in nl80211_set_mac_acl()
4900 if (!dev->ieee80211_ptr->links[0].ap.beacon_interval) in nl80211_set_mac_acl()
4901 return -EINVAL; in nl80211_set_mac_acl()
4903 acl = parse_acl_data(&rdev->wiphy, info); in nl80211_set_mac_acl()
4924 for (ridx = 0; ridx < sband->n_bitrates; ridx++) { in rateset_to_mask()
4926 &sband->bitrates[ridx]; in rateset_to_mask()
4927 if (rate == srate->bitrate) { in rateset_to_mask()
4932 if (ridx == sband->n_bitrates) in rateset_to_mask()
4959 if (sband->ht_cap.mcs.rx_mask[ridx] & rbit) in ht_rateset_to_mask()
5006 u16 tx_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map); in vht_set_mcs_mask()
5010 if (!sband->vht_cap.vht_supported) in vht_set_mcs_mask()
5019 if ((tx_mcs_mask[i] & txrate->mcs[i]) == txrate->mcs[i]) in vht_set_mcs_mask()
5020 mcs[i] = txrate->mcs[i]; in vht_set_mcs_mask()
5059 struct net_device *dev = info->user_ptr[1]; in he_get_txmcsmap()
5060 struct wireless_dev *wdev = dev->ieee80211_ptr; in he_get_txmcsmap()
5070 return le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_80); in he_get_txmcsmap()
5073 switch (chandef->width) { in he_get_txmcsmap()
5075 tx_mcs = he_cap->he_mcs_nss_supp.tx_mcs_80p80; in he_get_txmcsmap()
5078 tx_mcs = he_cap->he_mcs_nss_supp.tx_mcs_160; in he_get_txmcsmap()
5081 tx_mcs = he_cap->he_mcs_nss_supp.tx_mcs_80; in he_get_txmcsmap()
5100 he_cap = ieee80211_get_he_iftype_cap(sband, wdev->iftype); in he_set_mcs_mask()
5112 if ((tx_mcs_mask[i] & txrate->mcs[i]) == txrate->mcs[i]) in he_set_mcs_mask()
5113 mcs[i] = txrate->mcs[i]; in he_set_mcs_mask()
5130 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_parse_tx_bitrate_mask()
5131 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_parse_tx_bitrate_mask()
5145 sband = rdev->wiphy.bands[i]; in nl80211_parse_tx_bitrate_mask()
5150 mask->control[i].legacy = (1 << sband->n_bitrates) - 1; in nl80211_parse_tx_bitrate_mask()
5151 memcpy(mask->control[i].ht_mcs, in nl80211_parse_tx_bitrate_mask()
5152 sband->ht_cap.mcs.rx_mask, in nl80211_parse_tx_bitrate_mask()
5153 sizeof(mask->control[i].ht_mcs)); in nl80211_parse_tx_bitrate_mask()
5155 if (sband->vht_cap.vht_supported) { in nl80211_parse_tx_bitrate_mask()
5156 vht_tx_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map); in nl80211_parse_tx_bitrate_mask()
5157 vht_build_mcs_mask(vht_tx_mcs_map, mask->control[i].vht_mcs); in nl80211_parse_tx_bitrate_mask()
5160 he_cap = ieee80211_get_he_iftype_cap(sband, wdev->iftype); in nl80211_parse_tx_bitrate_mask()
5165 he_build_mcs_mask(he_tx_mcs_map, mask->control[i].he_mcs); in nl80211_parse_tx_bitrate_mask()
5167 mask->control[i].he_gi = 0xFF; in nl80211_parse_tx_bitrate_mask()
5168 mask->control[i].he_ltf = 0xFF; in nl80211_parse_tx_bitrate_mask()
5184 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
5185 sband = rdev->wiphy.bands[band]; in nl80211_parse_tx_bitrate_mask()
5187 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
5191 info->extack); in nl80211_parse_tx_bitrate_mask()
5195 mask->control[band].legacy = rateset_to_mask( in nl80211_parse_tx_bitrate_mask()
5199 if ((mask->control[band].legacy == 0) && in nl80211_parse_tx_bitrate_mask()
5201 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
5208 mask->control[band].ht_mcs)) in nl80211_parse_tx_bitrate_mask()
5209 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
5216 mask->control[band].vht_mcs)) in nl80211_parse_tx_bitrate_mask()
5217 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
5221 mask->control[band].gi = in nl80211_parse_tx_bitrate_mask()
5223 if (mask->control[band].gi > NL80211_TXRATE_FORCE_LGI) in nl80211_parse_tx_bitrate_mask()
5224 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
5229 mask->control[band].he_mcs, in nl80211_parse_tx_bitrate_mask()
5231 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
5234 mask->control[band].he_gi = in nl80211_parse_tx_bitrate_mask()
5237 mask->control[band].he_ltf = in nl80211_parse_tx_bitrate_mask()
5240 if (mask->control[band].legacy == 0) { in nl80211_parse_tx_bitrate_mask()
5244 if (!(rdev->wiphy.bands[band]->ht_cap.ht_supported || in nl80211_parse_tx_bitrate_mask()
5245 rdev->wiphy.bands[band]->vht_cap.vht_supported || in nl80211_parse_tx_bitrate_mask()
5246 ieee80211_get_he_iftype_cap(sband, wdev->iftype))) in nl80211_parse_tx_bitrate_mask()
5247 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
5250 if (mask->control[band].ht_mcs[i]) in nl80211_parse_tx_bitrate_mask()
5254 if (mask->control[band].vht_mcs[i]) in nl80211_parse_tx_bitrate_mask()
5258 if (mask->control[band].he_mcs[i]) in nl80211_parse_tx_bitrate_mask()
5262 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
5275 u32 rate = beacon_rate->control[band].legacy; in validate_beacon_tx_rate()
5279 return -EINVAL; in validate_beacon_tx_rate()
5283 if (hweight8(beacon_rate->control[band].ht_mcs[i]) > 1) { in validate_beacon_tx_rate()
5284 return -EINVAL; in validate_beacon_tx_rate()
5285 } else if (beacon_rate->control[band].ht_mcs[i]) { in validate_beacon_tx_rate()
5288 return -EINVAL; in validate_beacon_tx_rate()
5291 return -EINVAL; in validate_beacon_tx_rate()
5296 if (hweight16(beacon_rate->control[band].vht_mcs[i]) > 1) { in validate_beacon_tx_rate()
5297 return -EINVAL; in validate_beacon_tx_rate()
5298 } else if (beacon_rate->control[band].vht_mcs[i]) { in validate_beacon_tx_rate()
5301 return -EINVAL; in validate_beacon_tx_rate()
5304 return -EINVAL; in validate_beacon_tx_rate()
5309 if (hweight16(beacon_rate->control[band].he_mcs[i]) > 1) { in validate_beacon_tx_rate()
5310 return -EINVAL; in validate_beacon_tx_rate()
5311 } else if (beacon_rate->control[band].he_mcs[i]) { in validate_beacon_tx_rate()
5314 return -EINVAL; in validate_beacon_tx_rate()
5317 return -EINVAL; in validate_beacon_tx_rate()
5322 return -EINVAL; in validate_beacon_tx_rate()
5325 !wiphy_ext_feature_isset(&rdev->wiphy, in validate_beacon_tx_rate()
5327 return -EINVAL; in validate_beacon_tx_rate()
5329 !wiphy_ext_feature_isset(&rdev->wiphy, in validate_beacon_tx_rate()
5331 return -EINVAL; in validate_beacon_tx_rate()
5333 !wiphy_ext_feature_isset(&rdev->wiphy, in validate_beacon_tx_rate()
5335 return -EINVAL; in validate_beacon_tx_rate()
5337 !wiphy_ext_feature_isset(&rdev->wiphy, in validate_beacon_tx_rate()
5339 return -EINVAL; in validate_beacon_tx_rate()
5352 if (!wiphy->mbssid_max_interfaces) in nl80211_parse_mbssid_config()
5353 return -EOPNOTSUPP; in nl80211_parse_mbssid_config()
5358 return -EINVAL; in nl80211_parse_mbssid_config()
5360 config->ema = nla_get_flag(tb[NL80211_MBSSID_CONFIG_ATTR_EMA]); in nl80211_parse_mbssid_config()
5361 if (config->ema) { in nl80211_parse_mbssid_config()
5362 if (!wiphy->ema_max_profile_periodicity) in nl80211_parse_mbssid_config()
5363 return -EOPNOTSUPP; in nl80211_parse_mbssid_config()
5365 if (num_elems > wiphy->ema_max_profile_periodicity) in nl80211_parse_mbssid_config()
5366 return -EINVAL; in nl80211_parse_mbssid_config()
5369 config->index = nla_get_u8(tb[NL80211_MBSSID_CONFIG_ATTR_INDEX]); in nl80211_parse_mbssid_config()
5370 if (config->index >= wiphy->mbssid_max_interfaces || in nl80211_parse_mbssid_config()
5371 (!config->index && !num_elems)) in nl80211_parse_mbssid_config()
5372 return -EINVAL; in nl80211_parse_mbssid_config()
5378 if ((!config->index && tx_ifindex != dev->ifindex) || in nl80211_parse_mbssid_config()
5379 (config->index && tx_ifindex == dev->ifindex)) in nl80211_parse_mbssid_config()
5380 return -EINVAL; in nl80211_parse_mbssid_config()
5382 if (tx_ifindex != dev->ifindex) { in nl80211_parse_mbssid_config()
5386 if (!tx_netdev || !tx_netdev->ieee80211_ptr || in nl80211_parse_mbssid_config()
5387 tx_netdev->ieee80211_ptr->wiphy != wiphy || in nl80211_parse_mbssid_config()
5388 tx_netdev->ieee80211_ptr->iftype != in nl80211_parse_mbssid_config()
5391 return -EINVAL; in nl80211_parse_mbssid_config()
5394 config->tx_wdev = tx_netdev->ieee80211_ptr; in nl80211_parse_mbssid_config()
5396 config->tx_wdev = dev->ieee80211_ptr; in nl80211_parse_mbssid_config()
5398 } else if (!config->index) { in nl80211_parse_mbssid_config()
5399 config->tx_wdev = dev->ieee80211_ptr; in nl80211_parse_mbssid_config()
5401 return -EINVAL; in nl80211_parse_mbssid_config()
5415 if (!wiphy->mbssid_max_interfaces) in nl80211_parse_mbssid_elems()
5416 return ERR_PTR(-EINVAL); in nl80211_parse_mbssid_elems()
5420 return ERR_PTR(-EINVAL); in nl80211_parse_mbssid_elems()
5426 return ERR_PTR(-ENOMEM); in nl80211_parse_mbssid_elems()
5427 elems->cnt = num_elems; in nl80211_parse_mbssid_elems()
5430 elems->elem[i].data = nla_data(nl_elems); in nl80211_parse_mbssid_elems()
5431 elems->elem[i].len = nla_len(nl_elems); in nl80211_parse_mbssid_elems()
5458 return ERR_PTR(-ENOMEM); in nl80211_parse_rnr_elems()
5459 elems->cnt = num_elems; in nl80211_parse_rnr_elems()
5462 elems->elem[i].data = nla_data(nl_elems); in nl80211_parse_rnr_elems()
5463 elems->elem[i].len = nla_len(nl_elems); in nl80211_parse_rnr_elems()
5481 return -EINVAL; in nl80211_parse_he_bss_color()
5483 he_bss_color->color = in nl80211_parse_he_bss_color()
5485 he_bss_color->enabled = in nl80211_parse_he_bss_color()
5487 he_bss_color->partial = in nl80211_parse_he_bss_color()
5503 bcn->link_id = nl80211_link_id(attrs); in nl80211_parse_beacon()
5506 bcn->head = nla_data(attrs[NL80211_ATTR_BEACON_HEAD]); in nl80211_parse_beacon()
5507 bcn->head_len = nla_len(attrs[NL80211_ATTR_BEACON_HEAD]); in nl80211_parse_beacon()
5508 if (!bcn->head_len) in nl80211_parse_beacon()
5509 return -EINVAL; in nl80211_parse_beacon()
5514 bcn->tail = nla_data(attrs[NL80211_ATTR_BEACON_TAIL]); in nl80211_parse_beacon()
5515 bcn->tail_len = nla_len(attrs[NL80211_ATTR_BEACON_TAIL]); in nl80211_parse_beacon()
5520 return -EINVAL; in nl80211_parse_beacon()
5523 bcn->beacon_ies = nla_data(attrs[NL80211_ATTR_IE]); in nl80211_parse_beacon()
5524 bcn->beacon_ies_len = nla_len(attrs[NL80211_ATTR_IE]); in nl80211_parse_beacon()
5528 bcn->proberesp_ies = in nl80211_parse_beacon()
5530 bcn->proberesp_ies_len = in nl80211_parse_beacon()
5535 bcn->assocresp_ies = in nl80211_parse_beacon()
5537 bcn->assocresp_ies_len = in nl80211_parse_beacon()
5542 bcn->probe_resp = nla_data(attrs[NL80211_ATTR_PROBE_RESP]); in nl80211_parse_beacon()
5543 bcn->probe_resp_len = nla_len(attrs[NL80211_ATTR_PROBE_RESP]); in nl80211_parse_beacon()
5557 wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_parse_beacon()
5559 bcn->ftm_responder = 1; in nl80211_parse_beacon()
5561 return -EOPNOTSUPP; in nl80211_parse_beacon()
5564 bcn->lci = nla_data(tb[NL80211_FTM_RESP_ATTR_LCI]); in nl80211_parse_beacon()
5565 bcn->lci_len = nla_len(tb[NL80211_FTM_RESP_ATTR_LCI]); in nl80211_parse_beacon()
5569 bcn->civicloc = nla_data(tb[NL80211_FTM_RESP_ATTR_CIVICLOC]); in nl80211_parse_beacon()
5570 bcn->civicloc_len = nla_len(tb[NL80211_FTM_RESP_ATTR_CIVICLOC]); in nl80211_parse_beacon()
5573 bcn->ftm_responder = -1; in nl80211_parse_beacon()
5578 &bcn->he_bss_color); in nl80211_parse_beacon()
5581 bcn->he_bss_color_valid = true; in nl80211_parse_beacon()
5586 nl80211_parse_mbssid_elems(&rdev->wiphy, in nl80211_parse_beacon()
5592 bcn->mbssid_ies = mbssid; in nl80211_parse_beacon()
5594 if (bcn->mbssid_ies && attrs[NL80211_ATTR_EMA_RNR_ELEMS]) { in nl80211_parse_beacon()
5596 nl80211_parse_rnr_elems(&rdev->wiphy, in nl80211_parse_beacon()
5603 if (rnr && rnr->cnt < bcn->mbssid_ies->cnt) in nl80211_parse_beacon()
5604 return -EINVAL; in nl80211_parse_beacon()
5606 bcn->rnr_ies = rnr; in nl80211_parse_beacon()
5625 return -EINVAL; in nl80211_parse_he_obss_pd()
5627 he_obss_pd->sr_ctrl = nla_get_u8(tb[NL80211_HE_OBSS_PD_ATTR_SR_CTRL]); in nl80211_parse_he_obss_pd()
5630 he_obss_pd->min_offset = in nl80211_parse_he_obss_pd()
5633 he_obss_pd->max_offset = in nl80211_parse_he_obss_pd()
5636 he_obss_pd->non_srg_max_offset = in nl80211_parse_he_obss_pd()
5639 if (he_obss_pd->min_offset > he_obss_pd->max_offset) in nl80211_parse_he_obss_pd()
5640 return -EINVAL; in nl80211_parse_he_obss_pd()
5643 memcpy(he_obss_pd->bss_color_bitmap, in nl80211_parse_he_obss_pd()
5645 sizeof(he_obss_pd->bss_color_bitmap)); in nl80211_parse_he_obss_pd()
5648 memcpy(he_obss_pd->partial_bssid_bitmap, in nl80211_parse_he_obss_pd()
5650 sizeof(he_obss_pd->partial_bssid_bitmap)); in nl80211_parse_he_obss_pd()
5652 he_obss_pd->enable = true; in nl80211_parse_he_obss_pd()
5664 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_parse_fils_discovery()
5666 return -EINVAL; in nl80211_parse_fils_discovery()
5676 fd->update = true; in nl80211_parse_fils_discovery()
5683 return -EINVAL; in nl80211_parse_fils_discovery()
5685 fd->tmpl_len = nla_len(tb[NL80211_FILS_DISCOVERY_ATTR_TMPL]); in nl80211_parse_fils_discovery()
5686 fd->tmpl = nla_data(tb[NL80211_FILS_DISCOVERY_ATTR_TMPL]); in nl80211_parse_fils_discovery()
5687 fd->min_interval = nla_get_u32(tb[NL80211_FILS_DISCOVERY_ATTR_INT_MIN]); in nl80211_parse_fils_discovery()
5688 fd->max_interval = nla_get_u32(tb[NL80211_FILS_DISCOVERY_ATTR_INT_MAX]); in nl80211_parse_fils_discovery()
5689 fd->update = true; in nl80211_parse_fils_discovery()
5701 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_parse_unsol_bcast_probe_resp()
5703 return -EINVAL; in nl80211_parse_unsol_bcast_probe_resp()
5712 presp->update = true; in nl80211_parse_unsol_bcast_probe_resp()
5718 return -EINVAL; in nl80211_parse_unsol_bcast_probe_resp()
5720 presp->tmpl = nla_data(tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_TMPL]); in nl80211_parse_unsol_bcast_probe_resp()
5721 presp->tmpl_len = nla_len(tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_TMPL]); in nl80211_parse_unsol_bcast_probe_resp()
5722 presp->interval = nla_get_u32(tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_INT]); in nl80211_parse_unsol_bcast_probe_resp()
5723 presp->update = true; in nl80211_parse_unsol_bcast_probe_resp()
5735 for (i = 0; i < rates->datalen; i++) { in nl80211_check_ap_rate_selectors()
5736 if (rates->data[i] == BSS_MEMBERSHIP_SELECTOR_HT_PHY) in nl80211_check_ap_rate_selectors()
5737 params->ht_required = true; in nl80211_check_ap_rate_selectors()
5738 if (rates->data[i] == BSS_MEMBERSHIP_SELECTOR_VHT_PHY) in nl80211_check_ap_rate_selectors()
5739 params->vht_required = true; in nl80211_check_ap_rate_selectors()
5740 if (rates->data[i] == BSS_MEMBERSHIP_SELECTOR_HE_PHY) in nl80211_check_ap_rate_selectors()
5741 params->he_required = true; in nl80211_check_ap_rate_selectors()
5742 if (rates->data[i] == BSS_MEMBERSHIP_SELECTOR_SAE_H2E) in nl80211_check_ap_rate_selectors()
5743 params->sae_h2e_required = true; in nl80211_check_ap_rate_selectors()
5754 const struct cfg80211_beacon_data *bcn = &params->beacon; in nl80211_calculate_ap_params()
5755 size_t ies_len = bcn->tail_len; in nl80211_calculate_ap_params()
5756 const u8 *ies = bcn->tail; in nl80211_calculate_ap_params()
5767 if (cap && cap->datalen >= sizeof(*params->ht_cap)) in nl80211_calculate_ap_params()
5768 params->ht_cap = (void *)cap->data; in nl80211_calculate_ap_params()
5770 if (cap && cap->datalen >= sizeof(*params->vht_cap)) in nl80211_calculate_ap_params()
5771 params->vht_cap = (void *)cap->data; in nl80211_calculate_ap_params()
5773 if (cap && cap->datalen >= sizeof(*params->he_cap) + 1) in nl80211_calculate_ap_params()
5774 params->he_cap = (void *)(cap->data + 1); in nl80211_calculate_ap_params()
5776 if (cap && cap->datalen >= sizeof(*params->he_oper) + 1) in nl80211_calculate_ap_params()
5777 params->he_oper = (void *)(cap->data + 1); in nl80211_calculate_ap_params()
5780 if (!cap->datalen) in nl80211_calculate_ap_params()
5781 return -EINVAL; in nl80211_calculate_ap_params()
5782 params->eht_cap = (void *)(cap->data + 1); in nl80211_calculate_ap_params()
5783 if (!ieee80211_eht_capa_size_ok((const u8 *)params->he_cap, in nl80211_calculate_ap_params()
5784 (const u8 *)params->eht_cap, in nl80211_calculate_ap_params()
5785 cap->datalen - 1, true)) in nl80211_calculate_ap_params()
5786 return -EINVAL; in nl80211_calculate_ap_params()
5790 if (!cap->datalen) in nl80211_calculate_ap_params()
5791 return -EINVAL; in nl80211_calculate_ap_params()
5792 params->eht_oper = (void *)(cap->data + 1); in nl80211_calculate_ap_params()
5793 if (!ieee80211_eht_oper_size_ok((const u8 *)params->eht_oper, in nl80211_calculate_ap_params()
5794 cap->datalen - 1)) in nl80211_calculate_ap_params()
5795 return -EINVAL; in nl80211_calculate_ap_params()
5805 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) { in nl80211_get_ap_channel()
5806 if (wdev->iftype != NL80211_IFTYPE_AP && in nl80211_get_ap_channel()
5807 wdev->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_get_ap_channel()
5810 if (!wdev->u.ap.preset_chandef.chan) in nl80211_get_ap_channel()
5813 params->chandef = wdev->u.ap.preset_chandef; in nl80211_get_ap_channel()
5829 if (!(rdev->wiphy.features & NL80211_FEATURE_SAE) && in nl80211_valid_auth_type()
5832 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_valid_auth_type()
5840 if (!(rdev->wiphy.features & NL80211_FEATURE_SAE) && in nl80211_valid_auth_type()
5841 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_valid_auth_type()
5851 &rdev->wiphy, in nl80211_valid_auth_type()
5857 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_valid_auth_type()
5875 struct wiphy *wiphy = wdev->wiphy; in nl80211_send_ap_started()
5888 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_ap_started()
5889 nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex) || in nl80211_send_ap_started()
5892 (wdev->u.ap.ssid_len && in nl80211_send_ap_started()
5893 nla_put(msg, NL80211_ATTR_SSID, wdev->u.ap.ssid_len, in nl80211_send_ap_started()
5894 wdev->u.ap.ssid)) || in nl80211_send_ap_started()
5895 (wdev->valid_links && in nl80211_send_ap_started()
5910 struct ieee80211_channel *channel = params->chandef.chan; in nl80211_validate_ap_phy_operation()
5912 if ((params->he_cap || params->he_oper) && in nl80211_validate_ap_phy_operation()
5913 (channel->flags & IEEE80211_CHAN_NO_HE)) in nl80211_validate_ap_phy_operation()
5914 return -EOPNOTSUPP; in nl80211_validate_ap_phy_operation()
5916 if ((params->eht_cap || params->eht_oper) && in nl80211_validate_ap_phy_operation()
5917 (channel->flags & IEEE80211_CHAN_NO_EHT)) in nl80211_validate_ap_phy_operation()
5918 return -EOPNOTSUPP; in nl80211_validate_ap_phy_operation()
5925 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_start_ap()
5926 unsigned int link_id = nl80211_link_id(info->attrs); in nl80211_start_ap()
5927 struct net_device *dev = info->user_ptr[1]; in nl80211_start_ap()
5928 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_start_ap()
5932 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && in nl80211_start_ap()
5933 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_start_ap()
5934 return -EOPNOTSUPP; in nl80211_start_ap()
5936 if (!rdev->ops->start_ap) in nl80211_start_ap()
5937 return -EOPNOTSUPP; in nl80211_start_ap()
5939 if (wdev->links[link_id].ap.beacon_interval) in nl80211_start_ap()
5940 return -EALREADY; in nl80211_start_ap()
5943 if (!info->attrs[NL80211_ATTR_BEACON_INTERVAL] || in nl80211_start_ap()
5944 !info->attrs[NL80211_ATTR_DTIM_PERIOD] || in nl80211_start_ap()
5945 !info->attrs[NL80211_ATTR_BEACON_HEAD]) in nl80211_start_ap()
5946 return -EINVAL; in nl80211_start_ap()
5950 return -ENOMEM; in nl80211_start_ap()
5952 err = nl80211_parse_beacon(rdev, info->attrs, &params->beacon, in nl80211_start_ap()
5953 info->extack); in nl80211_start_ap()
5957 params->beacon_interval = in nl80211_start_ap()
5958 nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]); in nl80211_start_ap()
5959 params->dtim_period = in nl80211_start_ap()
5960 nla_get_u32(info->attrs[NL80211_ATTR_DTIM_PERIOD]); in nl80211_start_ap()
5962 err = cfg80211_validate_beacon_int(rdev, dev->ieee80211_ptr->iftype, in nl80211_start_ap()
5963 params->beacon_interval); in nl80211_start_ap()
5972 * additional information -- drivers must check! in nl80211_start_ap()
5974 if (info->attrs[NL80211_ATTR_SSID]) { in nl80211_start_ap()
5975 params->ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); in nl80211_start_ap()
5976 params->ssid_len = in nl80211_start_ap()
5977 nla_len(info->attrs[NL80211_ATTR_SSID]); in nl80211_start_ap()
5978 if (params->ssid_len == 0) { in nl80211_start_ap()
5979 err = -EINVAL; in nl80211_start_ap()
5983 if (wdev->u.ap.ssid_len && in nl80211_start_ap()
5984 (wdev->u.ap.ssid_len != params->ssid_len || in nl80211_start_ap()
5985 memcmp(wdev->u.ap.ssid, params->ssid, params->ssid_len))) { in nl80211_start_ap()
5987 err = -EINVAL; in nl80211_start_ap()
5990 } else if (wdev->valid_links) { in nl80211_start_ap()
5992 err = -EINVAL; in nl80211_start_ap()
5996 if (info->attrs[NL80211_ATTR_HIDDEN_SSID]) in nl80211_start_ap()
5997 params->hidden_ssid = nla_get_u32( in nl80211_start_ap()
5998 info->attrs[NL80211_ATTR_HIDDEN_SSID]); in nl80211_start_ap()
6000 params->privacy = !!info->attrs[NL80211_ATTR_PRIVACY]; in nl80211_start_ap()
6002 if (info->attrs[NL80211_ATTR_AUTH_TYPE]) { in nl80211_start_ap()
6003 params->auth_type = nla_get_u32( in nl80211_start_ap()
6004 info->attrs[NL80211_ATTR_AUTH_TYPE]); in nl80211_start_ap()
6005 if (!nl80211_valid_auth_type(rdev, params->auth_type, in nl80211_start_ap()
6007 err = -EINVAL; in nl80211_start_ap()
6011 params->auth_type = NL80211_AUTHTYPE_AUTOMATIC; in nl80211_start_ap()
6013 err = nl80211_crypto_settings(rdev, info, &params->crypto, in nl80211_start_ap()
6018 if (info->attrs[NL80211_ATTR_INACTIVITY_TIMEOUT]) { in nl80211_start_ap()
6019 if (!(rdev->wiphy.features & NL80211_FEATURE_INACTIVITY_TIMER)) { in nl80211_start_ap()
6020 err = -EOPNOTSUPP; in nl80211_start_ap()
6023 params->inactivity_timeout = nla_get_u16( in nl80211_start_ap()
6024 info->attrs[NL80211_ATTR_INACTIVITY_TIMEOUT]); in nl80211_start_ap()
6027 if (info->attrs[NL80211_ATTR_P2P_CTWINDOW]) { in nl80211_start_ap()
6028 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) { in nl80211_start_ap()
6029 err = -EINVAL; in nl80211_start_ap()
6032 params->p2p_ctwindow = in nl80211_start_ap()
6033 nla_get_u8(info->attrs[NL80211_ATTR_P2P_CTWINDOW]); in nl80211_start_ap()
6034 if (params->p2p_ctwindow != 0 && in nl80211_start_ap()
6035 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_CTWIN)) { in nl80211_start_ap()
6036 err = -EINVAL; in nl80211_start_ap()
6041 if (info->attrs[NL80211_ATTR_P2P_OPPPS]) { in nl80211_start_ap()
6044 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) { in nl80211_start_ap()
6045 err = -EINVAL; in nl80211_start_ap()
6048 tmp = nla_get_u8(info->attrs[NL80211_ATTR_P2P_OPPPS]); in nl80211_start_ap()
6049 params->p2p_opp_ps = tmp; in nl80211_start_ap()
6050 if (params->p2p_opp_ps != 0 && in nl80211_start_ap()
6051 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_OPPPS)) { in nl80211_start_ap()
6052 err = -EINVAL; in nl80211_start_ap()
6057 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { in nl80211_start_ap()
6058 err = nl80211_parse_chandef(rdev, info, &params->chandef); in nl80211_start_ap()
6061 } else if (wdev->valid_links) { in nl80211_start_ap()
6063 err = -EINVAL; in nl80211_start_ap()
6065 } else if (wdev->u.ap.preset_chandef.chan) { in nl80211_start_ap()
6066 params->chandef = wdev->u.ap.preset_chandef; in nl80211_start_ap()
6068 err = -EINVAL; in nl80211_start_ap()
6072 if (info->attrs[NL80211_ATTR_PUNCT_BITMAP]) { in nl80211_start_ap()
6074 &params->chandef, in nl80211_start_ap()
6075 &params->punct_bitmap); in nl80211_start_ap()
6080 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &params->chandef, in nl80211_start_ap()
6081 wdev->iftype)) { in nl80211_start_ap()
6082 err = -EINVAL; in nl80211_start_ap()
6086 if (info->attrs[NL80211_ATTR_TX_RATES]) { in nl80211_start_ap()
6087 err = nl80211_parse_tx_bitrate_mask(info, info->attrs, in nl80211_start_ap()
6089 &params->beacon_rate, in nl80211_start_ap()
6094 err = validate_beacon_tx_rate(rdev, params->chandef.chan->band, in nl80211_start_ap()
6095 &params->beacon_rate); in nl80211_start_ap()
6100 if (info->attrs[NL80211_ATTR_SMPS_MODE]) { in nl80211_start_ap()
6101 params->smps_mode = in nl80211_start_ap()
6102 nla_get_u8(info->attrs[NL80211_ATTR_SMPS_MODE]); in nl80211_start_ap()
6103 switch (params->smps_mode) { in nl80211_start_ap()
6107 if (!(rdev->wiphy.features & in nl80211_start_ap()
6109 err = -EINVAL; in nl80211_start_ap()
6114 if (!(rdev->wiphy.features & in nl80211_start_ap()
6116 err = -EINVAL; in nl80211_start_ap()
6121 err = -EINVAL; in nl80211_start_ap()
6125 params->smps_mode = NL80211_SMPS_OFF; in nl80211_start_ap()
6128 params->pbss = nla_get_flag(info->attrs[NL80211_ATTR_PBSS]); in nl80211_start_ap()
6129 if (params->pbss && !rdev->wiphy.bands[NL80211_BAND_60GHZ]) { in nl80211_start_ap()
6130 err = -EOPNOTSUPP; in nl80211_start_ap()
6134 if (info->attrs[NL80211_ATTR_ACL_POLICY]) { in nl80211_start_ap()
6135 params->acl = parse_acl_data(&rdev->wiphy, info); in nl80211_start_ap()
6136 if (IS_ERR(params->acl)) { in nl80211_start_ap()
6137 err = PTR_ERR(params->acl); in nl80211_start_ap()
6138 params->acl = NULL; in nl80211_start_ap()
6143 params->twt_responder = in nl80211_start_ap()
6144 nla_get_flag(info->attrs[NL80211_ATTR_TWT_RESPONDER]); in nl80211_start_ap()
6146 if (info->attrs[NL80211_ATTR_HE_OBSS_PD]) { in nl80211_start_ap()
6148 info->attrs[NL80211_ATTR_HE_OBSS_PD], in nl80211_start_ap()
6149 &params->he_obss_pd); in nl80211_start_ap()
6154 if (info->attrs[NL80211_ATTR_FILS_DISCOVERY]) { in nl80211_start_ap()
6156 info->attrs[NL80211_ATTR_FILS_DISCOVERY], in nl80211_start_ap()
6157 &params->fils_discovery); in nl80211_start_ap()
6162 if (info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP]) { in nl80211_start_ap()
6164 rdev, info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP], in nl80211_start_ap()
6165 &params->unsol_bcast_probe_resp); in nl80211_start_ap()
6170 if (info->attrs[NL80211_ATTR_MBSSID_CONFIG]) { in nl80211_start_ap()
6171 err = nl80211_parse_mbssid_config(&rdev->wiphy, dev, in nl80211_start_ap()
6172 info->attrs[NL80211_ATTR_MBSSID_CONFIG], in nl80211_start_ap()
6173 &params->mbssid_config, in nl80211_start_ap()
6174 params->beacon.mbssid_ies ? in nl80211_start_ap()
6175 params->beacon.mbssid_ies->cnt : in nl80211_start_ap()
6181 if (!params->mbssid_config.ema && params->beacon.rnr_ies) { in nl80211_start_ap()
6182 err = -EINVAL; in nl80211_start_ap()
6194 if (info->attrs[NL80211_ATTR_AP_SETTINGS_FLAGS]) in nl80211_start_ap()
6195 params->flags = nla_get_u32( in nl80211_start_ap()
6196 info->attrs[NL80211_ATTR_AP_SETTINGS_FLAGS]); in nl80211_start_ap()
6197 else if (info->attrs[NL80211_ATTR_EXTERNAL_AUTH_SUPPORT]) in nl80211_start_ap()
6198 params->flags |= NL80211_AP_SETTINGS_EXTERNAL_AUTH_SUPPORT; in nl80211_start_ap()
6200 if (wdev->conn_owner_nlportid && in nl80211_start_ap()
6201 info->attrs[NL80211_ATTR_SOCKET_OWNER] && in nl80211_start_ap()
6202 wdev->conn_owner_nlportid != info->snd_portid) { in nl80211_start_ap()
6203 err = -EINVAL; in nl80211_start_ap()
6207 /* FIXME: validate MLO/link-id against driver capabilities */ in nl80211_start_ap()
6211 wdev->links[link_id].ap.beacon_interval = params->beacon_interval; in nl80211_start_ap()
6212 wdev->links[link_id].ap.chandef = params->chandef; in nl80211_start_ap()
6213 wdev->u.ap.ssid_len = params->ssid_len; in nl80211_start_ap()
6214 memcpy(wdev->u.ap.ssid, params->ssid, in nl80211_start_ap()
6215 params->ssid_len); in nl80211_start_ap()
6217 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) in nl80211_start_ap()
6218 wdev->conn_owner_nlportid = info->snd_portid; in nl80211_start_ap()
6223 kfree(params->acl); in nl80211_start_ap()
6224 kfree(params->beacon.mbssid_ies); in nl80211_start_ap()
6225 if (params->mbssid_config.tx_wdev && in nl80211_start_ap()
6226 params->mbssid_config.tx_wdev->netdev && in nl80211_start_ap()
6227 params->mbssid_config.tx_wdev->netdev != dev) in nl80211_start_ap()
6228 dev_put(params->mbssid_config.tx_wdev->netdev); in nl80211_start_ap()
6229 kfree(params->beacon.rnr_ies); in nl80211_start_ap()
6237 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_beacon()
6238 unsigned int link_id = nl80211_link_id(info->attrs); in nl80211_set_beacon()
6239 struct net_device *dev = info->user_ptr[1]; in nl80211_set_beacon()
6240 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_beacon()
6245 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && in nl80211_set_beacon()
6246 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_set_beacon()
6247 return -EOPNOTSUPP; in nl80211_set_beacon()
6249 if (!rdev->ops->change_beacon) in nl80211_set_beacon()
6250 return -EOPNOTSUPP; in nl80211_set_beacon()
6252 if (!wdev->links[link_id].ap.beacon_interval) in nl80211_set_beacon()
6253 return -EINVAL; in nl80211_set_beacon()
6257 return -ENOMEM; in nl80211_set_beacon()
6259 err = nl80211_parse_beacon(rdev, info->attrs, &params->beacon, in nl80211_set_beacon()
6260 info->extack); in nl80211_set_beacon()
6264 attr = info->attrs[NL80211_ATTR_FILS_DISCOVERY]; in nl80211_set_beacon()
6267 &params->fils_discovery); in nl80211_set_beacon()
6272 attr = info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP]; in nl80211_set_beacon()
6275 &params->unsol_bcast_probe_resp); in nl80211_set_beacon()
6283 kfree(params->beacon.mbssid_ies); in nl80211_set_beacon()
6284 kfree(params->beacon.rnr_ies); in nl80211_set_beacon()
6291 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_stop_ap()
6292 unsigned int link_id = nl80211_link_id(info->attrs); in nl80211_stop_ap()
6293 struct net_device *dev = info->user_ptr[1]; in nl80211_stop_ap()
6319 nla = info->attrs[NL80211_ATTR_STA_FLAGS2]; in parse_station_flags()
6324 params->sta_flags_mask = sta_flags->mask; in parse_station_flags()
6325 params->sta_flags_set = sta_flags->set; in parse_station_flags()
6326 params->sta_flags_set &= params->sta_flags_mask; in parse_station_flags()
6327 if ((params->sta_flags_mask | in parse_station_flags()
6328 params->sta_flags_set) & BIT(__NL80211_STA_FLAG_INVALID)) in parse_station_flags()
6329 return -EINVAL; in parse_station_flags()
6335 nla = info->attrs[NL80211_ATTR_STA_FLAGS]; in parse_station_flags()
6339 if (nla_parse_nested_deprecated(flags, NL80211_STA_FLAG_MAX, nla, sta_flags_policy, info->extack)) in parse_station_flags()
6340 return -EINVAL; in parse_station_flags()
6352 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHORIZED) | in parse_station_flags()
6359 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHORIZED) | in parse_station_flags()
6363 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHENTICATED) | in parse_station_flags()
6368 return -EINVAL; in parse_station_flags()
6373 params->sta_flags_set |= (1<<flag); in parse_station_flags()
6377 return -EINVAL; in parse_station_flags()
6397 /* report 16-bit bitrate only if we can */ in nl80211_put_sta_rate()
6406 switch (info->bw) { in nl80211_put_sta_rate()
6445 WARN_ON(!(info->flags & RATE_INFO_FLAGS_HE_MCS)); in nl80211_put_sta_rate()
6452 WARN_ON(!(info->flags & RATE_INFO_FLAGS_EHT_MCS)); in nl80211_put_sta_rate()
6459 if (info->flags & RATE_INFO_FLAGS_MCS) { in nl80211_put_sta_rate()
6460 if (nla_put_u8(msg, NL80211_RATE_INFO_MCS, info->mcs)) in nl80211_put_sta_rate()
6462 if (info->flags & RATE_INFO_FLAGS_SHORT_GI && in nl80211_put_sta_rate()
6465 } else if (info->flags & RATE_INFO_FLAGS_VHT_MCS) { in nl80211_put_sta_rate()
6466 if (nla_put_u8(msg, NL80211_RATE_INFO_VHT_MCS, info->mcs)) in nl80211_put_sta_rate()
6468 if (nla_put_u8(msg, NL80211_RATE_INFO_VHT_NSS, info->nss)) in nl80211_put_sta_rate()
6470 if (info->flags & RATE_INFO_FLAGS_SHORT_GI && in nl80211_put_sta_rate()
6473 } else if (info->flags & RATE_INFO_FLAGS_HE_MCS) { in nl80211_put_sta_rate()
6474 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_MCS, info->mcs)) in nl80211_put_sta_rate()
6476 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_NSS, info->nss)) in nl80211_put_sta_rate()
6478 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_GI, info->he_gi)) in nl80211_put_sta_rate()
6480 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_DCM, info->he_dcm)) in nl80211_put_sta_rate()
6482 if (info->bw == RATE_INFO_BW_HE_RU && in nl80211_put_sta_rate()
6484 info->he_ru_alloc)) in nl80211_put_sta_rate()
6486 } else if (info->flags & RATE_INFO_FLAGS_S1G_MCS) { in nl80211_put_sta_rate()
6487 if (nla_put_u8(msg, NL80211_RATE_INFO_S1G_MCS, info->mcs)) in nl80211_put_sta_rate()
6489 if (nla_put_u8(msg, NL80211_RATE_INFO_S1G_NSS, info->nss)) in nl80211_put_sta_rate()
6491 if (info->flags & RATE_INFO_FLAGS_SHORT_GI && in nl80211_put_sta_rate()
6494 } else if (info->flags & RATE_INFO_FLAGS_EHT_MCS) { in nl80211_put_sta_rate()
6495 if (nla_put_u8(msg, NL80211_RATE_INFO_EHT_MCS, info->mcs)) in nl80211_put_sta_rate()
6497 if (nla_put_u8(msg, NL80211_RATE_INFO_EHT_NSS, info->nss)) in nl80211_put_sta_rate()
6499 if (nla_put_u8(msg, NL80211_RATE_INFO_EHT_GI, info->eht_gi)) in nl80211_put_sta_rate()
6501 if (info->bw == RATE_INFO_BW_EHT_RU && in nl80211_put_sta_rate()
6503 info->eht_ru_alloc)) in nl80211_put_sta_rate()
6549 return -1; in nl80211_send_station()
6552 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in nl80211_send_station()
6554 nla_put_u32(msg, NL80211_ATTR_GENERATION, sinfo->generation)) in nl80211_send_station()
6563 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_ ## attr) && \ in nl80211_send_station()
6565 sinfo->memb)) \ in nl80211_send_station()
6569 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_ ## attr) && \ in nl80211_send_station()
6571 sinfo->memb, NL80211_STA_INFO_PAD)) \ in nl80211_send_station()
6579 if (sinfo->filled & (BIT_ULL(NL80211_STA_INFO_RX_BYTES) | in nl80211_send_station()
6582 (u32)sinfo->rx_bytes)) in nl80211_send_station()
6585 if (sinfo->filled & (BIT_ULL(NL80211_STA_INFO_TX_BYTES) | in nl80211_send_station()
6588 (u32)sinfo->tx_bytes)) in nl80211_send_station()
6599 if (wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_send_station()
6603 switch (rdev->wiphy.signal_type) { in nl80211_send_station()
6611 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL)) { in nl80211_send_station()
6612 if (!nl80211_put_signal(msg, sinfo->chains, in nl80211_send_station()
6613 sinfo->chain_signal, in nl80211_send_station()
6617 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL_AVG)) { in nl80211_send_station()
6618 if (!nl80211_put_signal(msg, sinfo->chains, in nl80211_send_station()
6619 sinfo->chain_signal_avg, in nl80211_send_station()
6623 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_TX_BITRATE)) { in nl80211_send_station()
6624 if (!nl80211_put_sta_rate(msg, &sinfo->txrate, in nl80211_send_station()
6628 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_RX_BITRATE)) { in nl80211_send_station()
6629 if (!nl80211_put_sta_rate(msg, &sinfo->rxrate, in nl80211_send_station()
6647 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_BSS_PARAM)) { in nl80211_send_station()
6653 if (((sinfo->bss_param.flags & BSS_PARAM_FLAGS_CTS_PROT) && in nl80211_send_station()
6655 ((sinfo->bss_param.flags & BSS_PARAM_FLAGS_SHORT_PREAMBLE) && in nl80211_send_station()
6657 ((sinfo->bss_param.flags & BSS_PARAM_FLAGS_SHORT_SLOT_TIME) && in nl80211_send_station()
6660 sinfo->bss_param.dtim_period) || in nl80211_send_station()
6662 sinfo->bss_param.beacon_interval)) in nl80211_send_station()
6667 if ((sinfo->filled & BIT_ULL(NL80211_STA_INFO_STA_FLAGS)) && in nl80211_send_station()
6670 &sinfo->sta_flags)) in nl80211_send_station()
6679 if (wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_send_station()
6688 if (sinfo->pertid) { in nl80211_send_station()
6701 tidstats = &sinfo->pertid[tid]; in nl80211_send_station()
6703 if (!tidstats->filled) in nl80211_send_station()
6711 if (tidstats->filled & BIT(NL80211_TID_STATS_ ## attr) && \ in nl80211_send_station()
6713 tidstats->memb, NL80211_TID_STATS_PAD)) \ in nl80211_send_station()
6723 if ((tidstats->filled & in nl80211_send_station()
6725 !nl80211_put_txq_stats(msg, &tidstats->txq_stats, in nl80211_send_station()
6737 if (sinfo->assoc_req_ies_len && in nl80211_send_station()
6738 nla_put(msg, NL80211_ATTR_IE, sinfo->assoc_req_ies_len, in nl80211_send_station()
6739 sinfo->assoc_req_ies)) in nl80211_send_station()
6742 if (sinfo->assoc_resp_ies_len && in nl80211_send_station()
6743 nla_put(msg, NL80211_ATTR_RESP_IE, sinfo->assoc_resp_ies_len, in nl80211_send_station()
6744 sinfo->assoc_resp_ies)) in nl80211_send_station()
6747 if (sinfo->mlo_params_valid) { in nl80211_send_station()
6749 sinfo->assoc_link_id)) in nl80211_send_station()
6752 if (!is_zero_ether_addr(sinfo->mld_addr) && in nl80211_send_station()
6754 sinfo->mld_addr)) in nl80211_send_station()
6765 return -EMSGSIZE; in nl80211_send_station()
6775 int sta_idx = cb->args[2]; in nl80211_dump_station()
6782 __acquire(&rdev->wiphy.mtx); in nl80211_dump_station()
6784 if (!wdev->netdev) { in nl80211_dump_station()
6785 err = -EINVAL; in nl80211_dump_station()
6789 if (!rdev->ops->dump_station) { in nl80211_dump_station()
6790 err = -EOPNOTSUPP; in nl80211_dump_station()
6796 err = rdev_dump_station(rdev, wdev->netdev, sta_idx, in nl80211_dump_station()
6798 if (err == -ENOENT) in nl80211_dump_station()
6804 NETLINK_CB(cb->skb).portid, in nl80211_dump_station()
6805 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_dump_station()
6806 rdev, wdev->netdev, mac_addr, in nl80211_dump_station()
6814 cb->args[2] = sta_idx; in nl80211_dump_station()
6815 err = skb->len; in nl80211_dump_station()
6817 wiphy_unlock(&rdev->wiphy); in nl80211_dump_station()
6824 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_station()
6825 struct net_device *dev = info->user_ptr[1]; in nl80211_get_station()
6833 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_get_station()
6834 return -EINVAL; in nl80211_get_station()
6836 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_get_station()
6838 if (!rdev->ops->get_station) in nl80211_get_station()
6839 return -EOPNOTSUPP; in nl80211_get_station()
6848 return -ENOMEM; in nl80211_get_station()
6852 info->snd_portid, info->snd_seq, 0, in nl80211_get_station()
6855 return -ENOBUFS; in nl80211_get_station()
6865 if (params->listen_interval != -1 && in cfg80211_check_station_change()
6867 return -EINVAL; in cfg80211_check_station_change()
6869 if (params->support_p2p_ps != -1 && in cfg80211_check_station_change()
6871 return -EINVAL; in cfg80211_check_station_change()
6873 if (params->aid && in cfg80211_check_station_change()
6874 !(params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) && in cfg80211_check_station_change()
6876 return -EINVAL; in cfg80211_check_station_change()
6885 * No ignoring the TDLS flag here -- the userspace mesh in cfg80211_check_station_change()
6889 if (params->sta_flags_mask & in cfg80211_check_station_change()
6893 return -EINVAL; in cfg80211_check_station_change()
6897 if (!(params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER))) in cfg80211_check_station_change()
6898 return -EINVAL; in cfg80211_check_station_change()
6900 params->sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER); in cfg80211_check_station_change()
6903 /* disallow mesh-specific things */ in cfg80211_check_station_change()
6904 if (params->plink_action != NL80211_PLINK_ACTION_NO_ACTION) in cfg80211_check_station_change()
6905 return -EINVAL; in cfg80211_check_station_change()
6906 if (params->local_pm) in cfg80211_check_station_change()
6907 return -EINVAL; in cfg80211_check_station_change()
6908 if (params->sta_modify_mask & STATION_PARAM_APPLY_PLINK_STATE) in cfg80211_check_station_change()
6909 return -EINVAL; in cfg80211_check_station_change()
6915 if (params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) in cfg80211_check_station_change()
6916 return -EINVAL; in cfg80211_check_station_change()
6919 * a hostapd/wpa_supplicant issue -- it always includes the in cfg80211_check_station_change()
6922 params->sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER); in cfg80211_check_station_change()
6928 if (params->sta_modify_mask & STATION_PARAM_APPLY_UAPSD) in cfg80211_check_station_change()
6929 return -EINVAL; in cfg80211_check_station_change()
6930 if (params->sta_modify_mask & STATION_PARAM_APPLY_CAPABILITY) in cfg80211_check_station_change()
6931 return -EINVAL; in cfg80211_check_station_change()
6932 if (params->link_sta_params.supported_rates) in cfg80211_check_station_change()
6933 return -EINVAL; in cfg80211_check_station_change()
6934 if (params->ext_capab || params->link_sta_params.ht_capa || in cfg80211_check_station_change()
6935 params->link_sta_params.vht_capa || in cfg80211_check_station_change()
6936 params->link_sta_params.he_capa || in cfg80211_check_station_change()
6937 params->link_sta_params.eht_capa) in cfg80211_check_station_change()
6938 return -EINVAL; in cfg80211_check_station_change()
6943 if (params->vlan) in cfg80211_check_station_change()
6944 return -EINVAL; in cfg80211_check_station_change()
6950 if (!(params->sta_flags_mask & BIT(NL80211_STA_FLAG_AUTHORIZED))) in cfg80211_check_station_change()
6951 return -EOPNOTSUPP; in cfg80211_check_station_change()
6956 if (params->sta_flags_mask & in cfg80211_check_station_change()
6963 return -EINVAL; in cfg80211_check_station_change()
6966 if (!(wiphy->features & NL80211_FEATURE_FULL_AP_CLIENT_STATE) && in cfg80211_check_station_change()
6967 params->sta_flags_mask & in cfg80211_check_station_change()
6970 return -EINVAL; in cfg80211_check_station_change()
6975 if (params->sta_flags_mask & ~BIT(NL80211_STA_FLAG_AUTHORIZED)) in cfg80211_check_station_change()
6976 return -EINVAL; in cfg80211_check_station_change()
6980 if (params->sta_flags_mask & ~(BIT(NL80211_STA_FLAG_AUTHORIZED) | in cfg80211_check_station_change()
6982 return -EINVAL; in cfg80211_check_station_change()
6984 if (params->sta_flags_set & BIT(NL80211_STA_FLAG_AUTHORIZED) && in cfg80211_check_station_change()
6985 !params->link_sta_params.supported_rates) in cfg80211_check_station_change()
6986 return -EINVAL; in cfg80211_check_station_change()
6990 return -EINVAL; in cfg80211_check_station_change()
6992 if (params->sta_modify_mask & STATION_PARAM_APPLY_PLINK_STATE) in cfg80211_check_station_change()
6993 return -EINVAL; in cfg80211_check_station_change()
6996 if (params->plink_action != NL80211_PLINK_ACTION_NO_ACTION && in cfg80211_check_station_change()
6997 params->plink_action != NL80211_PLINK_ACTION_BLOCK) in cfg80211_check_station_change()
6998 return -EINVAL; in cfg80211_check_station_change()
7009 params->link_sta_params.opmode_notif_used = false; in cfg80211_check_station_change()
7021 struct nlattr *vlanattr = info->attrs[NL80211_ATTR_STA_VLAN]; in get_vlan()
7030 return ERR_PTR(-ENODEV); in get_vlan()
7032 if (!v->ieee80211_ptr || v->ieee80211_ptr->wiphy != &rdev->wiphy) { in get_vlan()
7033 ret = -EINVAL; in get_vlan()
7037 if (v->ieee80211_ptr->iftype != NL80211_IFTYPE_AP_VLAN && in get_vlan()
7038 v->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && in get_vlan()
7039 v->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) { in get_vlan()
7040 ret = -EINVAL; in get_vlan()
7045 ret = -ENETDOWN; in get_vlan()
7063 if (!info->attrs[NL80211_ATTR_STA_WME]) in nl80211_parse_sta_wme()
7066 nla = info->attrs[NL80211_ATTR_STA_WME]; in nl80211_parse_sta_wme()
7069 info->extack); in nl80211_parse_sta_wme()
7074 params->uapsd_queues = nla_get_u8( in nl80211_parse_sta_wme()
7076 if (params->uapsd_queues & ~IEEE80211_WMM_IE_STA_QOSINFO_AC_MASK) in nl80211_parse_sta_wme()
7077 return -EINVAL; in nl80211_parse_sta_wme()
7080 params->max_sp = nla_get_u8(tb[NL80211_STA_WME_MAX_SP]); in nl80211_parse_sta_wme()
7082 if (params->max_sp & ~IEEE80211_WMM_IE_STA_QOSINFO_SP_MASK) in nl80211_parse_sta_wme()
7083 return -EINVAL; in nl80211_parse_sta_wme()
7085 params->sta_modify_mask |= STATION_PARAM_APPLY_UAPSD; in nl80211_parse_sta_wme()
7093 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]) { in nl80211_parse_sta_channel_info()
7094 params->supported_channels = in nl80211_parse_sta_channel_info()
7095 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]); in nl80211_parse_sta_channel_info()
7096 params->supported_channels_len = in nl80211_parse_sta_channel_info()
7097 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]); in nl80211_parse_sta_channel_info()
7103 if (params->supported_channels_len % 2) in nl80211_parse_sta_channel_info()
7104 return -EINVAL; in nl80211_parse_sta_channel_info()
7107 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]) { in nl80211_parse_sta_channel_info()
7108 params->supported_oper_classes = in nl80211_parse_sta_channel_info()
7109 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]); in nl80211_parse_sta_channel_info()
7110 params->supported_oper_classes_len = in nl80211_parse_sta_channel_info()
7111 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]); in nl80211_parse_sta_channel_info()
7121 if (info->attrs[NL80211_ATTR_PEER_AID]) in nl80211_set_station_tdls()
7122 params->aid = nla_get_u16(info->attrs[NL80211_ATTR_PEER_AID]); in nl80211_set_station_tdls()
7123 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) in nl80211_set_station_tdls()
7124 params->link_sta_params.ht_capa = in nl80211_set_station_tdls()
7125 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]); in nl80211_set_station_tdls()
7126 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) in nl80211_set_station_tdls()
7127 params->link_sta_params.vht_capa = in nl80211_set_station_tdls()
7128 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]); in nl80211_set_station_tdls()
7129 if (info->attrs[NL80211_ATTR_HE_CAPABILITY]) { in nl80211_set_station_tdls()
7130 params->link_sta_params.he_capa = in nl80211_set_station_tdls()
7131 nla_data(info->attrs[NL80211_ATTR_HE_CAPABILITY]); in nl80211_set_station_tdls()
7132 params->link_sta_params.he_capa_len = in nl80211_set_station_tdls()
7133 nla_len(info->attrs[NL80211_ATTR_HE_CAPABILITY]); in nl80211_set_station_tdls()
7135 if (info->attrs[NL80211_ATTR_EHT_CAPABILITY]) { in nl80211_set_station_tdls()
7136 params->link_sta_params.eht_capa = in nl80211_set_station_tdls()
7137 nla_data(info->attrs[NL80211_ATTR_EHT_CAPABILITY]); in nl80211_set_station_tdls()
7138 params->link_sta_params.eht_capa_len = in nl80211_set_station_tdls()
7139 nla_len(info->attrs[NL80211_ATTR_EHT_CAPABILITY]); in nl80211_set_station_tdls()
7141 if (!ieee80211_eht_capa_size_ok((const u8 *)params->link_sta_params.he_capa, in nl80211_set_station_tdls()
7142 (const u8 *)params->link_sta_params.eht_capa, in nl80211_set_station_tdls()
7143 params->link_sta_params.eht_capa_len, in nl80211_set_station_tdls()
7145 return -EINVAL; in nl80211_set_station_tdls()
7160 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_parse_sta_txpower_setting()
7163 if (info->attrs[NL80211_ATTR_STA_TX_POWER_SETTING]) { in nl80211_parse_sta_txpower_setting()
7164 if (!rdev->ops->set_tx_power || in nl80211_parse_sta_txpower_setting()
7165 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_parse_sta_txpower_setting()
7167 return -EOPNOTSUPP; in nl80211_parse_sta_txpower_setting()
7170 txpwr->type = nla_get_u8(info->attrs[idx]); in nl80211_parse_sta_txpower_setting()
7172 if (txpwr->type == NL80211_TX_POWER_LIMITED) { in nl80211_parse_sta_txpower_setting()
7175 if (info->attrs[idx]) in nl80211_parse_sta_txpower_setting()
7176 txpwr->power = nla_get_s16(info->attrs[idx]); in nl80211_parse_sta_txpower_setting()
7178 return -EINVAL; in nl80211_parse_sta_txpower_setting()
7191 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_station()
7192 struct net_device *dev = info->user_ptr[1]; in nl80211_set_station()
7199 if (!rdev->ops->change_station) in nl80211_set_station()
7200 return -EOPNOTSUPP; in nl80211_set_station()
7207 if (info->attrs[NL80211_ATTR_STA_AID]) in nl80211_set_station()
7208 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_STA_AID]); in nl80211_set_station()
7210 if (info->attrs[NL80211_ATTR_VLAN_ID]) in nl80211_set_station()
7211 params.vlan_id = nla_get_u16(info->attrs[NL80211_ATTR_VLAN_ID]); in nl80211_set_station()
7213 if (info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]) in nl80211_set_station()
7215 nla_get_u16(info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]); in nl80211_set_station()
7217 params.listen_interval = -1; in nl80211_set_station()
7219 if (info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]) in nl80211_set_station()
7221 nla_get_u8(info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]); in nl80211_set_station()
7223 params.support_p2p_ps = -1; in nl80211_set_station()
7225 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_set_station()
7226 return -EINVAL; in nl80211_set_station()
7229 nl80211_link_id_or_invalid(info->attrs); in nl80211_set_station()
7231 if (info->attrs[NL80211_ATTR_MLD_ADDR]) { in nl80211_set_station()
7238 return -EINVAL; in nl80211_set_station()
7240 mac_addr = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]); in nl80211_set_station()
7243 nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_set_station()
7245 return -EINVAL; in nl80211_set_station()
7247 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_set_station()
7251 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) { in nl80211_set_station()
7253 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); in nl80211_set_station()
7255 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); in nl80211_set_station()
7258 if (info->attrs[NL80211_ATTR_STA_CAPABILITY]) { in nl80211_set_station()
7260 nla_get_u16(info->attrs[NL80211_ATTR_STA_CAPABILITY]); in nl80211_set_station()
7264 if (info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]) { in nl80211_set_station()
7266 nla_data(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); in nl80211_set_station()
7268 nla_len(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); in nl80211_set_station()
7271 if (parse_station_flags(info, dev->ieee80211_ptr->iftype, &params)) in nl80211_set_station()
7272 return -EINVAL; in nl80211_set_station()
7274 if (info->attrs[NL80211_ATTR_STA_PLINK_ACTION]) in nl80211_set_station()
7276 nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_ACTION]); in nl80211_set_station()
7278 if (info->attrs[NL80211_ATTR_STA_PLINK_STATE]) { in nl80211_set_station()
7280 nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_STATE]); in nl80211_set_station()
7281 if (info->attrs[NL80211_ATTR_MESH_PEER_AID]) in nl80211_set_station()
7283 info->attrs[NL80211_ATTR_MESH_PEER_AID]); in nl80211_set_station()
7287 if (info->attrs[NL80211_ATTR_LOCAL_MESH_POWER_MODE]) in nl80211_set_station()
7289 info->attrs[NL80211_ATTR_LOCAL_MESH_POWER_MODE]); in nl80211_set_station()
7291 if (info->attrs[NL80211_ATTR_OPMODE_NOTIF]) { in nl80211_set_station()
7294 nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]); in nl80211_set_station()
7297 if (info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]) in nl80211_set_station()
7299 nla_data(info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]); in nl80211_set_station()
7301 if (info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]) in nl80211_set_station()
7303 nla_get_u16(info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]); in nl80211_set_station()
7306 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_set_station()
7308 return -EOPNOTSUPP; in nl80211_set_station()
7325 switch (dev->ieee80211_ptr->iftype) { in nl80211_set_station()
7335 err = -EOPNOTSUPP; in nl80211_set_station()
7350 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_new_station()
7352 struct net_device *dev = info->user_ptr[1]; in nl80211_new_station()
7353 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_new_station()
7361 if (!rdev->ops->add_station) in nl80211_new_station()
7362 return -EOPNOTSUPP; in nl80211_new_station()
7364 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_new_station()
7365 return -EINVAL; in nl80211_new_station()
7367 if (!info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]) in nl80211_new_station()
7368 return -EINVAL; in nl80211_new_station()
7370 if (!info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) in nl80211_new_station()
7371 return -EINVAL; in nl80211_new_station()
7373 if (!info->attrs[NL80211_ATTR_STA_AID] && in nl80211_new_station()
7374 !info->attrs[NL80211_ATTR_PEER_AID]) in nl80211_new_station()
7375 return -EINVAL; in nl80211_new_station()
7378 nl80211_link_id_or_invalid(info->attrs); in nl80211_new_station()
7380 if (info->attrs[NL80211_ATTR_MLD_ADDR]) { in nl80211_new_station()
7381 mac_addr = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]); in nl80211_new_station()
7384 nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_new_station()
7386 return -EINVAL; in nl80211_new_station()
7388 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_new_station()
7392 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); in nl80211_new_station()
7394 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); in nl80211_new_station()
7396 nla_get_u16(info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]); in nl80211_new_station()
7398 if (info->attrs[NL80211_ATTR_VLAN_ID]) in nl80211_new_station()
7399 params.vlan_id = nla_get_u16(info->attrs[NL80211_ATTR_VLAN_ID]); in nl80211_new_station()
7401 if (info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]) { in nl80211_new_station()
7403 nla_get_u8(info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]); in nl80211_new_station()
7410 dev->ieee80211_ptr->iftype == NL80211_IFTYPE_P2P_GO; in nl80211_new_station()
7413 if (info->attrs[NL80211_ATTR_PEER_AID]) in nl80211_new_station()
7414 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_PEER_AID]); in nl80211_new_station()
7416 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_STA_AID]); in nl80211_new_station()
7418 if (info->attrs[NL80211_ATTR_STA_CAPABILITY]) { in nl80211_new_station()
7420 nla_get_u16(info->attrs[NL80211_ATTR_STA_CAPABILITY]); in nl80211_new_station()
7424 if (info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]) { in nl80211_new_station()
7426 nla_data(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); in nl80211_new_station()
7428 nla_len(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); in nl80211_new_station()
7431 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) in nl80211_new_station()
7433 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]); in nl80211_new_station()
7435 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) in nl80211_new_station()
7437 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]); in nl80211_new_station()
7439 if (info->attrs[NL80211_ATTR_HE_CAPABILITY]) { in nl80211_new_station()
7441 nla_data(info->attrs[NL80211_ATTR_HE_CAPABILITY]); in nl80211_new_station()
7443 nla_len(info->attrs[NL80211_ATTR_HE_CAPABILITY]); in nl80211_new_station()
7445 if (info->attrs[NL80211_ATTR_EHT_CAPABILITY]) { in nl80211_new_station()
7447 nla_data(info->attrs[NL80211_ATTR_EHT_CAPABILITY]); in nl80211_new_station()
7449 nla_len(info->attrs[NL80211_ATTR_EHT_CAPABILITY]); in nl80211_new_station()
7455 return -EINVAL; in nl80211_new_station()
7459 if (info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]) in nl80211_new_station()
7461 nla_data(info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]); in nl80211_new_station()
7463 if (info->attrs[NL80211_ATTR_OPMODE_NOTIF]) { in nl80211_new_station()
7466 nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]); in nl80211_new_station()
7469 if (info->attrs[NL80211_ATTR_STA_PLINK_ACTION]) in nl80211_new_station()
7471 nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_ACTION]); in nl80211_new_station()
7473 if (info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]) in nl80211_new_station()
7475 nla_get_u16(info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]); in nl80211_new_station()
7478 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_new_station()
7480 return -EOPNOTSUPP; in nl80211_new_station()
7496 if (parse_station_flags(info, dev->ieee80211_ptr->iftype, &params)) in nl80211_new_station()
7497 return -EINVAL; in nl80211_new_station()
7512 return -EINVAL; in nl80211_new_station()
7518 return -EINVAL; in nl80211_new_station()
7523 switch (dev->ieee80211_ptr->iftype) { in nl80211_new_station()
7528 if (!(rdev->wiphy.flags & WIPHY_FLAG_AP_UAPSD) || in nl80211_new_station()
7534 info->attrs[NL80211_ATTR_PEER_AID]) in nl80211_new_station()
7535 return -EINVAL; in nl80211_new_station()
7540 if (!(rdev->wiphy.features & in nl80211_new_station()
7543 return -EINVAL; in nl80211_new_station()
7571 return -EINVAL; in nl80211_new_station()
7574 info->attrs[NL80211_ATTR_PEER_AID]) in nl80211_new_station()
7575 return -EINVAL; in nl80211_new_station()
7586 return -EINVAL; in nl80211_new_station()
7589 return -EINVAL; in nl80211_new_station()
7591 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS)) in nl80211_new_station()
7592 return -EOPNOTSUPP; in nl80211_new_station()
7594 if (!(rdev->wiphy.flags & WIPHY_FLAG_TDLS_EXTERNAL_SETUP)) in nl80211_new_station()
7595 return -EOPNOTSUPP; in nl80211_new_station()
7603 return -EOPNOTSUPP; in nl80211_new_station()
7608 if (wdev->valid_links) { in nl80211_new_station()
7610 err = -EINVAL; in nl80211_new_station()
7613 if (!(wdev->valid_links & BIT(params.link_sta_params.link_id))) { in nl80211_new_station()
7614 err = -ENOLINK; in nl80211_new_station()
7619 err = -EINVAL; in nl80211_new_station()
7631 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_del_station()
7632 struct net_device *dev = info->user_ptr[1]; in nl80211_del_station()
7637 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_del_station()
7638 params.mac = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_del_station()
7640 switch (dev->ieee80211_ptr->iftype) { in nl80211_del_station()
7649 if (wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_del_station()
7652 return -EINVAL; in nl80211_del_station()
7654 return -EINVAL; in nl80211_del_station()
7657 if (!rdev->ops->del_station) in nl80211_del_station()
7658 return -EOPNOTSUPP; in nl80211_del_station()
7660 if (info->attrs[NL80211_ATTR_MGMT_SUBTYPE]) { in nl80211_del_station()
7662 nla_get_u8(info->attrs[NL80211_ATTR_MGMT_SUBTYPE]); in nl80211_del_station()
7665 return -EINVAL; in nl80211_del_station()
7671 if (info->attrs[NL80211_ATTR_REASON_CODE]) { in nl80211_del_station()
7673 nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); in nl80211_del_station()
7675 return -EINVAL; /* 0 is reserved */ in nl80211_del_station()
7694 return -1; in nl80211_send_mpath()
7696 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in nl80211_send_mpath()
7699 nla_put_u32(msg, NL80211_ATTR_GENERATION, pinfo->generation)) in nl80211_send_mpath()
7705 if ((pinfo->filled & MPATH_INFO_FRAME_QLEN) && in nl80211_send_mpath()
7707 pinfo->frame_qlen)) in nl80211_send_mpath()
7709 if (((pinfo->filled & MPATH_INFO_SN) && in nl80211_send_mpath()
7710 nla_put_u32(msg, NL80211_MPATH_INFO_SN, pinfo->sn)) || in nl80211_send_mpath()
7711 ((pinfo->filled & MPATH_INFO_METRIC) && in nl80211_send_mpath()
7713 pinfo->metric)) || in nl80211_send_mpath()
7714 ((pinfo->filled & MPATH_INFO_EXPTIME) && in nl80211_send_mpath()
7716 pinfo->exptime)) || in nl80211_send_mpath()
7717 ((pinfo->filled & MPATH_INFO_FLAGS) && in nl80211_send_mpath()
7719 pinfo->flags)) || in nl80211_send_mpath()
7720 ((pinfo->filled & MPATH_INFO_DISCOVERY_TIMEOUT) && in nl80211_send_mpath()
7722 pinfo->discovery_timeout)) || in nl80211_send_mpath()
7723 ((pinfo->filled & MPATH_INFO_DISCOVERY_RETRIES) && in nl80211_send_mpath()
7725 pinfo->discovery_retries)) || in nl80211_send_mpath()
7726 ((pinfo->filled & MPATH_INFO_HOP_COUNT) && in nl80211_send_mpath()
7728 pinfo->hop_count)) || in nl80211_send_mpath()
7729 ((pinfo->filled & MPATH_INFO_PATH_CHANGE) && in nl80211_send_mpath()
7731 pinfo->path_change_count))) in nl80211_send_mpath()
7741 return -EMSGSIZE; in nl80211_send_mpath()
7752 int path_idx = cb->args[2]; in nl80211_dump_mpath()
7759 __acquire(&rdev->wiphy.mtx); in nl80211_dump_mpath()
7761 if (!rdev->ops->dump_mpath) { in nl80211_dump_mpath()
7762 err = -EOPNOTSUPP; in nl80211_dump_mpath()
7766 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) { in nl80211_dump_mpath()
7767 err = -EOPNOTSUPP; in nl80211_dump_mpath()
7772 err = rdev_dump_mpath(rdev, wdev->netdev, path_idx, dst, in nl80211_dump_mpath()
7774 if (err == -ENOENT) in nl80211_dump_mpath()
7779 if (nl80211_send_mpath(skb, NETLINK_CB(cb->skb).portid, in nl80211_dump_mpath()
7780 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_dump_mpath()
7781 wdev->netdev, dst, next_hop, in nl80211_dump_mpath()
7789 cb->args[2] = path_idx; in nl80211_dump_mpath()
7790 err = skb->len; in nl80211_dump_mpath()
7792 wiphy_unlock(&rdev->wiphy); in nl80211_dump_mpath()
7798 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_mpath()
7800 struct net_device *dev = info->user_ptr[1]; in nl80211_get_mpath()
7808 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_get_mpath()
7809 return -EINVAL; in nl80211_get_mpath()
7811 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_get_mpath()
7813 if (!rdev->ops->get_mpath) in nl80211_get_mpath()
7814 return -EOPNOTSUPP; in nl80211_get_mpath()
7816 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_get_mpath()
7817 return -EOPNOTSUPP; in nl80211_get_mpath()
7825 return -ENOMEM; in nl80211_get_mpath()
7827 if (nl80211_send_mpath(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_mpath()
7830 return -ENOBUFS; in nl80211_get_mpath()
7838 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_mpath()
7839 struct net_device *dev = info->user_ptr[1]; in nl80211_set_mpath()
7843 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_set_mpath()
7844 return -EINVAL; in nl80211_set_mpath()
7846 if (!info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]) in nl80211_set_mpath()
7847 return -EINVAL; in nl80211_set_mpath()
7849 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_set_mpath()
7850 next_hop = nla_data(info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]); in nl80211_set_mpath()
7852 if (!rdev->ops->change_mpath) in nl80211_set_mpath()
7853 return -EOPNOTSUPP; in nl80211_set_mpath()
7855 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_set_mpath()
7856 return -EOPNOTSUPP; in nl80211_set_mpath()
7863 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_new_mpath()
7864 struct net_device *dev = info->user_ptr[1]; in nl80211_new_mpath()
7868 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_new_mpath()
7869 return -EINVAL; in nl80211_new_mpath()
7871 if (!info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]) in nl80211_new_mpath()
7872 return -EINVAL; in nl80211_new_mpath()
7874 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_new_mpath()
7875 next_hop = nla_data(info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]); in nl80211_new_mpath()
7877 if (!rdev->ops->add_mpath) in nl80211_new_mpath()
7878 return -EOPNOTSUPP; in nl80211_new_mpath()
7880 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_new_mpath()
7881 return -EOPNOTSUPP; in nl80211_new_mpath()
7888 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_del_mpath()
7889 struct net_device *dev = info->user_ptr[1]; in nl80211_del_mpath()
7892 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_del_mpath()
7893 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_del_mpath()
7895 if (!rdev->ops->del_mpath) in nl80211_del_mpath()
7896 return -EOPNOTSUPP; in nl80211_del_mpath()
7898 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_del_mpath()
7899 return -EOPNOTSUPP; in nl80211_del_mpath()
7906 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_mpp()
7908 struct net_device *dev = info->user_ptr[1]; in nl80211_get_mpp()
7916 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_get_mpp()
7917 return -EINVAL; in nl80211_get_mpp()
7919 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_get_mpp()
7921 if (!rdev->ops->get_mpp) in nl80211_get_mpp()
7922 return -EOPNOTSUPP; in nl80211_get_mpp()
7924 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_get_mpp()
7925 return -EOPNOTSUPP; in nl80211_get_mpp()
7933 return -ENOMEM; in nl80211_get_mpp()
7935 if (nl80211_send_mpath(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_mpp()
7938 return -ENOBUFS; in nl80211_get_mpp()
7952 int path_idx = cb->args[2]; in nl80211_dump_mpp()
7959 __acquire(&rdev->wiphy.mtx); in nl80211_dump_mpp()
7961 if (!rdev->ops->dump_mpp) { in nl80211_dump_mpp()
7962 err = -EOPNOTSUPP; in nl80211_dump_mpp()
7966 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) { in nl80211_dump_mpp()
7967 err = -EOPNOTSUPP; in nl80211_dump_mpp()
7972 err = rdev_dump_mpp(rdev, wdev->netdev, path_idx, dst, in nl80211_dump_mpp()
7974 if (err == -ENOENT) in nl80211_dump_mpp()
7979 if (nl80211_send_mpath(skb, NETLINK_CB(cb->skb).portid, in nl80211_dump_mpp()
7980 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_dump_mpp()
7981 wdev->netdev, dst, mpp, in nl80211_dump_mpp()
7989 cb->args[2] = path_idx; in nl80211_dump_mpp()
7990 err = skb->len; in nl80211_dump_mpp()
7992 wiphy_unlock(&rdev->wiphy); in nl80211_dump_mpp()
7998 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_bss()
7999 struct net_device *dev = info->user_ptr[1]; in nl80211_set_bss()
8003 params.link_id = nl80211_link_id_or_invalid(info->attrs); in nl80211_set_bss()
8005 params.use_cts_prot = -1; in nl80211_set_bss()
8006 params.use_short_preamble = -1; in nl80211_set_bss()
8007 params.use_short_slot_time = -1; in nl80211_set_bss()
8008 params.ap_isolate = -1; in nl80211_set_bss()
8009 params.ht_opmode = -1; in nl80211_set_bss()
8010 params.p2p_ctwindow = -1; in nl80211_set_bss()
8011 params.p2p_opp_ps = -1; in nl80211_set_bss()
8013 if (info->attrs[NL80211_ATTR_BSS_CTS_PROT]) in nl80211_set_bss()
8015 nla_get_u8(info->attrs[NL80211_ATTR_BSS_CTS_PROT]); in nl80211_set_bss()
8016 if (info->attrs[NL80211_ATTR_BSS_SHORT_PREAMBLE]) in nl80211_set_bss()
8018 nla_get_u8(info->attrs[NL80211_ATTR_BSS_SHORT_PREAMBLE]); in nl80211_set_bss()
8019 if (info->attrs[NL80211_ATTR_BSS_SHORT_SLOT_TIME]) in nl80211_set_bss()
8021 nla_get_u8(info->attrs[NL80211_ATTR_BSS_SHORT_SLOT_TIME]); in nl80211_set_bss()
8022 if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) { in nl80211_set_bss()
8024 nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); in nl80211_set_bss()
8026 nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); in nl80211_set_bss()
8028 if (info->attrs[NL80211_ATTR_AP_ISOLATE]) in nl80211_set_bss()
8029 params.ap_isolate = !!nla_get_u8(info->attrs[NL80211_ATTR_AP_ISOLATE]); in nl80211_set_bss()
8030 if (info->attrs[NL80211_ATTR_BSS_HT_OPMODE]) in nl80211_set_bss()
8032 nla_get_u16(info->attrs[NL80211_ATTR_BSS_HT_OPMODE]); in nl80211_set_bss()
8034 if (info->attrs[NL80211_ATTR_P2P_CTWINDOW]) { in nl80211_set_bss()
8035 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_set_bss()
8036 return -EINVAL; in nl80211_set_bss()
8038 nla_get_u8(info->attrs[NL80211_ATTR_P2P_CTWINDOW]); in nl80211_set_bss()
8040 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_CTWIN)) in nl80211_set_bss()
8041 return -EINVAL; in nl80211_set_bss()
8044 if (info->attrs[NL80211_ATTR_P2P_OPPPS]) { in nl80211_set_bss()
8047 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_set_bss()
8048 return -EINVAL; in nl80211_set_bss()
8049 tmp = nla_get_u8(info->attrs[NL80211_ATTR_P2P_OPPPS]); in nl80211_set_bss()
8052 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_OPPPS)) in nl80211_set_bss()
8053 return -EINVAL; in nl80211_set_bss()
8056 if (!rdev->ops->change_bss) in nl80211_set_bss()
8057 return -EOPNOTSUPP; in nl80211_set_bss()
8059 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && in nl80211_set_bss()
8060 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_set_bss()
8061 return -EOPNOTSUPP; in nl80211_set_bss()
8075 * completely when built-in to the kernel right between the time in nl80211_req_set_reg()
8080 return -EINPROGRESS; in nl80211_req_set_reg()
8082 if (info->attrs[NL80211_ATTR_USER_REG_HINT_TYPE]) in nl80211_req_set_reg()
8084 nla_get_u32(info->attrs[NL80211_ATTR_USER_REG_HINT_TYPE]); in nl80211_req_set_reg()
8091 if (!info->attrs[NL80211_ATTR_REG_ALPHA2]) in nl80211_req_set_reg()
8092 return -EINVAL; in nl80211_req_set_reg()
8094 data = nla_data(info->attrs[NL80211_ATTR_REG_ALPHA2]); in nl80211_req_set_reg()
8097 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) { in nl80211_req_set_reg()
8098 owner_nlportid = info->snd_portid; in nl80211_req_set_reg()
8099 is_indoor = !!info->attrs[NL80211_ATTR_REG_INDOOR]; in nl80211_req_set_reg()
8107 return -EINVAL; in nl80211_req_set_reg()
8119 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_mesh_config()
8120 struct net_device *dev = info->user_ptr[1]; in nl80211_get_mesh_config()
8121 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_get_mesh_config()
8128 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_get_mesh_config()
8129 return -EOPNOTSUPP; in nl80211_get_mesh_config()
8131 if (!rdev->ops->get_mesh_config) in nl80211_get_mesh_config()
8132 return -EOPNOTSUPP; in nl80211_get_mesh_config()
8135 if (!wdev->u.mesh.id_len) in nl80211_get_mesh_config()
8146 return -ENOMEM; in nl80211_get_mesh_config()
8147 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_mesh_config()
8154 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in nl80211_get_mesh_config()
8225 return -ENOBUFS; in nl80211_get_mesh_config()
8260 NLA_POLICY_RANGE(NLA_S32, -255, 0),
8303 cfg->param = fn(tb[attr]); \ in nl80211_parse_mesh_config()
8304 mask |= BIT((attr) - 1); \ in nl80211_parse_mesh_config()
8308 if (!info->attrs[NL80211_ATTR_MESH_CONFIG]) in nl80211_parse_mesh_config()
8309 return -EINVAL; in nl80211_parse_mesh_config()
8310 …ated(tb, NL80211_MESHCONF_ATTR_MAX, info->attrs[NL80211_ATTR_MESH_CONFIG], nl80211_meshconf_params… in nl80211_parse_mesh_config()
8311 return -EINVAL; in nl80211_parse_mesh_config()
8349 (cfg->path_refresh_time < 1 || cfg->path_refresh_time > 65535)) in nl80211_parse_mesh_config()
8350 return -EINVAL; in nl80211_parse_mesh_config()
8359 (cfg->dot11MeshHWMPactivePathTimeout < 1 || in nl80211_parse_mesh_config()
8360 cfg->dot11MeshHWMPactivePathTimeout > 65535)) in nl80211_parse_mesh_config()
8361 return -EINVAL; in nl80211_parse_mesh_config()
8393 * IEEE 802.11-2016 9.4.2.57 HT Operation element. in nl80211_parse_mesh_config()
8401 return -EINVAL; in nl80211_parse_mesh_config()
8406 cfg->ht_opmode = ht_opmode; in nl80211_parse_mesh_config()
8407 mask |= (1 << (NL80211_MESHCONF_HT_OPMODE - 1)); in nl80211_parse_mesh_config()
8414 (cfg->dot11MeshHWMPactivePathToRootTimeout < 1 || in nl80211_parse_mesh_config()
8415 cfg->dot11MeshHWMPactivePathToRootTimeout > 65535)) in nl80211_parse_mesh_config()
8416 return -EINVAL; in nl80211_parse_mesh_config()
8443 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_parse_mesh_setup()
8446 if (!info->attrs[NL80211_ATTR_MESH_SETUP]) in nl80211_parse_mesh_setup()
8447 return -EINVAL; in nl80211_parse_mesh_setup()
8448 …ed(tb, NL80211_MESH_SETUP_ATTR_MAX, info->attrs[NL80211_ATTR_MESH_SETUP], nl80211_mesh_setup_param… in nl80211_parse_mesh_setup()
8449 return -EINVAL; in nl80211_parse_mesh_setup()
8452 setup->sync_method = in nl80211_parse_mesh_setup()
8458 setup->path_sel_proto = in nl80211_parse_mesh_setup()
8464 setup->path_metric = in nl80211_parse_mesh_setup()
8472 setup->ie = nla_data(ieattr); in nl80211_parse_mesh_setup()
8473 setup->ie_len = nla_len(ieattr); in nl80211_parse_mesh_setup()
8476 !(rdev->wiphy.features & NL80211_FEATURE_USERSPACE_MPM)) in nl80211_parse_mesh_setup()
8477 return -EINVAL; in nl80211_parse_mesh_setup()
8478 setup->user_mpm = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_MPM]); in nl80211_parse_mesh_setup()
8479 setup->is_authenticated = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_AUTH]); in nl80211_parse_mesh_setup()
8480 setup->is_secure = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_AMPE]); in nl80211_parse_mesh_setup()
8481 if (setup->is_secure) in nl80211_parse_mesh_setup()
8482 setup->user_mpm = true; in nl80211_parse_mesh_setup()
8485 if (!setup->user_mpm) in nl80211_parse_mesh_setup()
8486 return -EINVAL; in nl80211_parse_mesh_setup()
8487 setup->auth_id = in nl80211_parse_mesh_setup()
8497 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_update_mesh_config()
8498 struct net_device *dev = info->user_ptr[1]; in nl80211_update_mesh_config()
8499 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_update_mesh_config()
8504 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_update_mesh_config()
8505 return -EOPNOTSUPP; in nl80211_update_mesh_config()
8507 if (!rdev->ops->update_mesh_config) in nl80211_update_mesh_config()
8508 return -EOPNOTSUPP; in nl80211_update_mesh_config()
8514 if (!wdev->u.mesh.id_len) in nl80211_update_mesh_config()
8515 err = -ENOLINK; in nl80211_update_mesh_config()
8529 if (nla_put_string(msg, NL80211_ATTR_REG_ALPHA2, regdom->alpha2) || in nl80211_put_regdom()
8530 (regdom->dfs_region && in nl80211_put_regdom()
8531 nla_put_u8(msg, NL80211_ATTR_DFS_REGION, regdom->dfs_region))) in nl80211_put_regdom()
8538 for (i = 0; i < regdom->n_reg_rules; i++) { in nl80211_put_regdom()
8545 reg_rule = &regdom->reg_rules[i]; in nl80211_put_regdom()
8546 freq_range = &reg_rule->freq_range; in nl80211_put_regdom()
8547 power_rule = &reg_rule->power_rule; in nl80211_put_regdom()
8553 max_bandwidth_khz = freq_range->max_bandwidth_khz; in nl80211_put_regdom()
8559 reg_rule->flags) || in nl80211_put_regdom()
8561 freq_range->start_freq_khz) || in nl80211_put_regdom()
8563 freq_range->end_freq_khz) || in nl80211_put_regdom()
8567 power_rule->max_antenna_gain) || in nl80211_put_regdom()
8569 power_rule->max_eirp) || in nl80211_put_regdom()
8571 reg_rule->dfs_cac_ms)) in nl80211_put_regdom()
8574 if ((reg_rule->flags & NL80211_RRF_PSD) && in nl80211_put_regdom()
8576 reg_rule->psd)) in nl80211_put_regdom()
8586 return -EMSGSIZE; in nl80211_put_regdom()
8595 int err = -EMSGSIZE; in nl80211_get_reg_do()
8600 return -ENOBUFS; in nl80211_get_reg_do()
8602 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_reg_do()
8609 if (info->attrs[NL80211_ATTR_WIPHY]) { in nl80211_get_reg_do()
8618 wiphy = &rdev->wiphy; in nl80211_get_reg_do()
8619 self_managed = wiphy->regulatory_flags & in nl80211_get_reg_do()
8626 /* a self-managed-reg device must have a private regdom */ in nl80211_get_reg_do()
8628 err = -EINVAL; in nl80211_get_reg_do()
8669 void *hdr = nl80211hdr_put(msg, NETLINK_CB(cb->skb).portid, seq, flags, in nl80211_send_regdom()
8673 return -1; in nl80211_send_regdom()
8689 if (wiphy && wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED && in nl80211_send_regdom()
8698 return -EMSGSIZE; in nl80211_send_regdom()
8706 int err, reg_idx, start = cb->args[2]; in nl80211_get_reg_dump()
8711 err = nl80211_send_regdom(skb, cb, cb->nlh->nlmsg_seq, in nl80211_get_reg_dump()
8721 regdom = get_wiphy_regdom(&rdev->wiphy); in nl80211_get_reg_dump()
8728 err = nl80211_send_regdom(skb, cb, cb->nlh->nlmsg_seq, in nl80211_get_reg_dump()
8729 NLM_F_MULTI, &rdev->wiphy, regdom); in nl80211_get_reg_dump()
8731 reg_idx--; in nl80211_get_reg_dump()
8736 cb->args[2] = reg_idx; in nl80211_get_reg_dump()
8737 err = skb->len; in nl80211_get_reg_dump()
8757 struct ieee80211_freq_range *freq_range = &reg_rule->freq_range; in parse_reg_rule()
8758 struct ieee80211_power_rule *power_rule = &reg_rule->power_rule; in parse_reg_rule()
8761 return -EINVAL; in parse_reg_rule()
8763 return -EINVAL; in parse_reg_rule()
8765 return -EINVAL; in parse_reg_rule()
8767 return -EINVAL; in parse_reg_rule()
8769 return -EINVAL; in parse_reg_rule()
8771 reg_rule->flags = nla_get_u32(tb[NL80211_ATTR_REG_RULE_FLAGS]); in parse_reg_rule()
8773 freq_range->start_freq_khz = in parse_reg_rule()
8775 freq_range->end_freq_khz = in parse_reg_rule()
8777 freq_range->max_bandwidth_khz = in parse_reg_rule()
8780 power_rule->max_eirp = in parse_reg_rule()
8784 power_rule->max_antenna_gain = in parse_reg_rule()
8788 reg_rule->dfs_cac_ms = in parse_reg_rule()
8804 if (!info->attrs[NL80211_ATTR_REG_ALPHA2]) in nl80211_set_reg()
8805 return -EINVAL; in nl80211_set_reg()
8807 if (!info->attrs[NL80211_ATTR_REG_RULES]) in nl80211_set_reg()
8808 return -EINVAL; in nl80211_set_reg()
8810 alpha2 = nla_data(info->attrs[NL80211_ATTR_REG_ALPHA2]); in nl80211_set_reg()
8812 if (info->attrs[NL80211_ATTR_DFS_REGION]) in nl80211_set_reg()
8813 dfs_region = nla_get_u8(info->attrs[NL80211_ATTR_DFS_REGION]); in nl80211_set_reg()
8815 nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES], in nl80211_set_reg()
8819 return -EINVAL; in nl80211_set_reg()
8824 r = -EINVAL; in nl80211_set_reg()
8830 r = -ENOMEM; in nl80211_set_reg()
8834 rd->n_reg_rules = num_rules; in nl80211_set_reg()
8835 rd->alpha2[0] = alpha2[0]; in nl80211_set_reg()
8836 rd->alpha2[1] = alpha2[1]; in nl80211_set_reg()
8843 rd->dfs_region = dfs_region; in nl80211_set_reg()
8845 nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES], in nl80211_set_reg()
8849 info->extack); in nl80211_set_reg()
8852 r = parse_reg_rule(tb, &rd->reg_rules[rule_idx]); in nl80211_set_reg()
8859 r = -EINVAL; in nl80211_set_reg()
8906 return b < NUM_NL80211_BANDS && wiphy->bands[b]; in is_band_valid()
8921 return -EINVAL; in parse_bss_select()
8933 return -EINVAL; in parse_bss_select()
8938 bss_select->behaviour = __NL80211_BSS_SELECT_ATTR_INVALID; in parse_bss_select()
8941 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_RSSI; in parse_bss_select()
8944 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_BAND_PREF; in parse_bss_select()
8945 bss_select->param.band_pref = in parse_bss_select()
8947 if (!is_band_valid(wiphy, bss_select->param.band_pref)) in parse_bss_select()
8948 return -EINVAL; in parse_bss_select()
8955 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_RSSI_ADJUST; in parse_bss_select()
8956 bss_select->param.adjust.band = adj_param->band; in parse_bss_select()
8957 bss_select->param.adjust.delta = adj_param->delta; in parse_bss_select()
8958 if (!is_band_valid(wiphy, bss_select->param.adjust.band)) in parse_bss_select()
8959 return -EINVAL; in parse_bss_select()
8962 /* user-space did not provide behaviour attribute */ in parse_bss_select()
8963 if (bss_select->behaviour == __NL80211_BSS_SELECT_ATTR_INVALID) in parse_bss_select()
8964 return -EINVAL; in parse_bss_select()
8966 if (!(wiphy->bss_select_support & BIT(bss_select->behaviour))) in parse_bss_select()
8967 return -EINVAL; in parse_bss_select()
8988 return -EINVAL; in nl80211_parse_random_mac()
8996 return -EINVAL; in nl80211_parse_random_mac()
9015 lockdep_assert_wiphy(wdev->wiphy); in cfg80211_off_channel_oper_allowed()
9032 if (!chandef || !chandef->chan) in cfg80211_off_channel_oper_allowed()
9039 * the off-channel operation. in cfg80211_off_channel_oper_allowed()
9042 if (chandef->chan->flags & IEEE80211_CHAN_RADAR) in cfg80211_off_channel_oper_allowed()
9049 return regulatory_pre_cac_allowed(wdev->wiphy); in cfg80211_off_channel_oper_allowed()
9080 flags = &req->flags; in nl80211_check_scan_flags()
9081 mac_addr = req->mac_addr; in nl80211_check_scan_flags()
9082 mac_addr_mask = req->mac_addr_mask; in nl80211_check_scan_flags()
9087 flags = &req->flags; in nl80211_check_scan_flags()
9088 mac_addr = req->mac_addr; in nl80211_check_scan_flags()
9089 mac_addr_mask = req->mac_addr_mask; in nl80211_check_scan_flags()
9095 !(wiphy->features & NL80211_FEATURE_LOW_PRIORITY_SCAN)) || in nl80211_check_scan_flags()
9123 return -EOPNOTSUPP; in nl80211_check_scan_flags()
9128 if (!(wiphy->features & randomness_flag) || in nl80211_check_scan_flags()
9129 (wdev && wdev->connected)) in nl80211_check_scan_flags()
9130 return -EOPNOTSUPP; in nl80211_check_scan_flags()
9142 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_trigger_scan()
9143 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_trigger_scan()
9152 wiphy = &rdev->wiphy; in nl80211_trigger_scan()
9154 if (wdev->iftype == NL80211_IFTYPE_NAN) in nl80211_trigger_scan()
9155 return -EOPNOTSUPP; in nl80211_trigger_scan()
9157 if (!rdev->ops->scan) in nl80211_trigger_scan()
9158 return -EOPNOTSUPP; in nl80211_trigger_scan()
9160 if (rdev->scan_req || rdev->scan_msg) in nl80211_trigger_scan()
9161 return -EBUSY; in nl80211_trigger_scan()
9163 if (info->attrs[NL80211_ATTR_SCAN_FREQ_KHZ]) { in nl80211_trigger_scan()
9166 return -EOPNOTSUPP; in nl80211_trigger_scan()
9167 scan_freqs = info->attrs[NL80211_ATTR_SCAN_FREQ_KHZ]; in nl80211_trigger_scan()
9169 } else if (info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]) in nl80211_trigger_scan()
9170 scan_freqs = info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]; in nl80211_trigger_scan()
9175 return -EINVAL; in nl80211_trigger_scan()
9180 if (info->attrs[NL80211_ATTR_SCAN_SSIDS]) in nl80211_trigger_scan()
9181 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp) in nl80211_trigger_scan()
9184 if (n_ssids > wiphy->max_scan_ssids) in nl80211_trigger_scan()
9185 return -EINVAL; in nl80211_trigger_scan()
9187 if (info->attrs[NL80211_ATTR_IE]) in nl80211_trigger_scan()
9188 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_trigger_scan()
9192 if (ie_len > wiphy->max_scan_ie_len) in nl80211_trigger_scan()
9193 return -EINVAL; in nl80211_trigger_scan()
9196 size = size_add(size, array_size(sizeof(*request->ssids), n_ssids)); in nl80211_trigger_scan()
9200 return -ENOMEM; in nl80211_trigger_scan()
9203 request->ssids = (void *)&request->channels[n_channels]; in nl80211_trigger_scan()
9204 request->n_ssids = n_ssids; in nl80211_trigger_scan()
9207 request->ie = (void *)(request->ssids + n_ssids); in nl80211_trigger_scan()
9209 request->ie = (void *)(request->channels + n_channels); in nl80211_trigger_scan()
9217 int freq = nla_get_u32(attr); in nl80211_trigger_scan() local
9220 freq = MHZ_TO_KHZ(freq); in nl80211_trigger_scan()
9222 chan = ieee80211_get_channel_khz(wiphy, freq); in nl80211_trigger_scan()
9224 err = -EINVAL; in nl80211_trigger_scan()
9229 if (chan->flags & IEEE80211_CHAN_DISABLED) in nl80211_trigger_scan()
9232 request->channels[i] = chan; in nl80211_trigger_scan()
9242 if (!wiphy->bands[band]) in nl80211_trigger_scan()
9244 for (j = 0; j < wiphy->bands[band]->n_channels; j++) { in nl80211_trigger_scan()
9247 chan = &wiphy->bands[band]->channels[j]; in nl80211_trigger_scan()
9249 if (chan->flags & IEEE80211_CHAN_DISABLED) in nl80211_trigger_scan()
9252 request->channels[i] = chan; in nl80211_trigger_scan()
9259 err = -EINVAL; in nl80211_trigger_scan()
9263 request->n_channels = i; in nl80211_trigger_scan()
9265 for (i = 0; i < request->n_channels; i++) { in nl80211_trigger_scan()
9266 struct ieee80211_channel *chan = request->channels[i]; in nl80211_trigger_scan()
9268 /* if we can go off-channel to the target channel we're good */ in nl80211_trigger_scan()
9273 err = -EBUSY; in nl80211_trigger_scan()
9280 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp) { in nl80211_trigger_scan()
9282 err = -EINVAL; in nl80211_trigger_scan()
9285 request->ssids[i].ssid_len = nla_len(attr); in nl80211_trigger_scan()
9286 memcpy(request->ssids[i].ssid, nla_data(attr), nla_len(attr)); in nl80211_trigger_scan()
9291 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_trigger_scan()
9292 request->ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_trigger_scan()
9293 memcpy((void *)request->ie, in nl80211_trigger_scan()
9294 nla_data(info->attrs[NL80211_ATTR_IE]), in nl80211_trigger_scan()
9295 request->ie_len); in nl80211_trigger_scan()
9299 if (wiphy->bands[i]) in nl80211_trigger_scan()
9300 request->rates[i] = in nl80211_trigger_scan()
9301 (1 << wiphy->bands[i]->n_bitrates) - 1; in nl80211_trigger_scan()
9303 if (info->attrs[NL80211_ATTR_SCAN_SUPP_RATES]) { in nl80211_trigger_scan()
9305 info->attrs[NL80211_ATTR_SCAN_SUPP_RATES], in nl80211_trigger_scan()
9310 err = -EINVAL; in nl80211_trigger_scan()
9314 if (!wiphy->bands[band]) in nl80211_trigger_scan()
9317 err = ieee80211_get_ratemask(wiphy->bands[band], in nl80211_trigger_scan()
9320 &request->rates[band]); in nl80211_trigger_scan()
9326 if (info->attrs[NL80211_ATTR_MEASUREMENT_DURATION]) { in nl80211_trigger_scan()
9327 request->duration = in nl80211_trigger_scan()
9328 nla_get_u16(info->attrs[NL80211_ATTR_MEASUREMENT_DURATION]); in nl80211_trigger_scan()
9329 request->duration_mandatory = in nl80211_trigger_scan()
9330 nla_get_flag(info->attrs[NL80211_ATTR_MEASUREMENT_DURATION_MANDATORY]); in nl80211_trigger_scan()
9333 err = nl80211_check_scan_flags(wiphy, wdev, request, info->attrs, in nl80211_trigger_scan()
9338 request->no_cck = in nl80211_trigger_scan()
9339 nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]); in nl80211_trigger_scan()
9350 if (info->attrs[NL80211_ATTR_BSSID]) in nl80211_trigger_scan()
9351 memcpy(request->bssid, in nl80211_trigger_scan()
9352 nla_data(info->attrs[NL80211_ATTR_BSSID]), ETH_ALEN); in nl80211_trigger_scan()
9353 else if (!(request->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) && in nl80211_trigger_scan()
9354 info->attrs[NL80211_ATTR_MAC]) in nl80211_trigger_scan()
9355 memcpy(request->bssid, nla_data(info->attrs[NL80211_ATTR_MAC]), in nl80211_trigger_scan()
9358 eth_broadcast_addr(request->bssid); in nl80211_trigger_scan()
9360 request->tsf_report_link_id = nl80211_link_id_or_invalid(info->attrs); in nl80211_trigger_scan()
9361 request->wdev = wdev; in nl80211_trigger_scan()
9362 request->wiphy = &rdev->wiphy; in nl80211_trigger_scan()
9363 request->scan_start = jiffies; in nl80211_trigger_scan()
9365 rdev->scan_req = request; in nl80211_trigger_scan()
9372 dev_hold(wdev->netdev); in nl80211_trigger_scan()
9377 rdev->scan_req = NULL; in nl80211_trigger_scan()
9385 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_abort_scan()
9386 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_abort_scan()
9388 if (!rdev->ops->abort_scan) in nl80211_abort_scan()
9389 return -EOPNOTSUPP; in nl80211_abort_scan()
9391 if (rdev->scan_msg) in nl80211_abort_scan()
9394 if (!rdev->scan_req) in nl80211_abort_scan()
9395 return -ENOENT; in nl80211_abort_scan()
9420 return -EINVAL; in nl80211_parse_sched_scan_plans()
9422 request->scan_plans[0].interval = in nl80211_parse_sched_scan_plans()
9424 if (!request->scan_plans[0].interval) in nl80211_parse_sched_scan_plans()
9425 return -EINVAL; in nl80211_parse_sched_scan_plans()
9427 if (request->scan_plans[0].interval > in nl80211_parse_sched_scan_plans()
9428 wiphy->max_sched_scan_plan_interval) in nl80211_parse_sched_scan_plans()
9429 request->scan_plans[0].interval = in nl80211_parse_sched_scan_plans()
9430 wiphy->max_sched_scan_plan_interval; in nl80211_parse_sched_scan_plans()
9439 return -EINVAL; in nl80211_parse_sched_scan_plans()
9449 return -EINVAL; in nl80211_parse_sched_scan_plans()
9451 request->scan_plans[i].interval = in nl80211_parse_sched_scan_plans()
9453 if (!request->scan_plans[i].interval || in nl80211_parse_sched_scan_plans()
9454 request->scan_plans[i].interval > in nl80211_parse_sched_scan_plans()
9455 wiphy->max_sched_scan_plan_interval) in nl80211_parse_sched_scan_plans()
9456 return -EINVAL; in nl80211_parse_sched_scan_plans()
9459 request->scan_plans[i].iterations = in nl80211_parse_sched_scan_plans()
9461 if (!request->scan_plans[i].iterations || in nl80211_parse_sched_scan_plans()
9462 (request->scan_plans[i].iterations > in nl80211_parse_sched_scan_plans()
9463 wiphy->max_sched_scan_plan_iterations)) in nl80211_parse_sched_scan_plans()
9464 return -EINVAL; in nl80211_parse_sched_scan_plans()
9465 } else if (i < n_plans - 1) { in nl80211_parse_sched_scan_plans()
9470 return -EINVAL; in nl80211_parse_sched_scan_plans()
9480 if (request->scan_plans[n_plans - 1].iterations) in nl80211_parse_sched_scan_plans()
9481 return -EINVAL; in nl80211_parse_sched_scan_plans()
9498 ret = -EOPNOTSUPP; in nl80211_parse_sched_scan_per_band_rssi()
9501 match_sets->per_band_rssi_thold[i] = in nl80211_parse_sched_scan_per_band_rssi()
9507 match_sets->per_band_rssi_thold[i] = rssi_thold; in nl80211_parse_sched_scan_per_band_rssi()
9513 return -EINVAL; in nl80211_parse_sched_scan_per_band_rssi()
9515 match_sets->per_band_rssi_thold[band] = nla_get_s32(attr); in nl80211_parse_sched_scan_per_band_rssi()
9537 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
9547 if (n_ssids > wiphy->max_sched_scan_ssids) in nl80211_parse_sched_scan()
9548 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
9557 * global RSSI for all other matchsets - if there are other matchsets. in nl80211_parse_sched_scan()
9576 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
9595 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
9602 if (ie_len > wiphy->max_sched_scan_ie_len) in nl80211_parse_sched_scan()
9603 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
9611 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
9624 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
9629 if (!n_plans || n_plans > wiphy->max_sched_scan_plans) in nl80211_parse_sched_scan()
9630 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
9636 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
9639 size = size_add(size, array_size(sizeof(*request->ssids), n_ssids)); in nl80211_parse_sched_scan()
9640 size = size_add(size, array_size(sizeof(*request->match_sets), in nl80211_parse_sched_scan()
9642 size = size_add(size, array_size(sizeof(*request->scan_plans), in nl80211_parse_sched_scan()
9647 return ERR_PTR(-ENOMEM); in nl80211_parse_sched_scan()
9650 request->ssids = (void *)&request->channels[n_channels]; in nl80211_parse_sched_scan()
9651 request->n_ssids = n_ssids; in nl80211_parse_sched_scan()
9654 request->ie = (void *)(request->ssids + n_ssids); in nl80211_parse_sched_scan()
9656 request->ie = (void *)(request->channels + n_channels); in nl80211_parse_sched_scan()
9660 if (request->ie) in nl80211_parse_sched_scan()
9661 request->match_sets = (void *)(request->ie + ie_len); in nl80211_parse_sched_scan()
9663 request->match_sets = in nl80211_parse_sched_scan()
9664 (void *)(request->ssids + n_ssids); in nl80211_parse_sched_scan()
9666 request->match_sets = in nl80211_parse_sched_scan()
9667 (void *)(request->channels + n_channels); in nl80211_parse_sched_scan()
9669 request->n_match_sets = n_match_sets; in nl80211_parse_sched_scan()
9672 request->scan_plans = (void *)(request->match_sets + in nl80211_parse_sched_scan()
9674 else if (request->ie) in nl80211_parse_sched_scan()
9675 request->scan_plans = (void *)(request->ie + ie_len); in nl80211_parse_sched_scan()
9677 request->scan_plans = (void *)(request->ssids + n_ssids); in nl80211_parse_sched_scan()
9679 request->scan_plans = (void *)(request->channels + n_channels); in nl80211_parse_sched_scan()
9681 request->n_scan_plans = n_plans; in nl80211_parse_sched_scan()
9694 err = -EINVAL; in nl80211_parse_sched_scan()
9699 if (chan->flags & IEEE80211_CHAN_DISABLED) in nl80211_parse_sched_scan()
9702 request->channels[i] = chan; in nl80211_parse_sched_scan()
9710 if (!wiphy->bands[band]) in nl80211_parse_sched_scan()
9712 for (j = 0; j < wiphy->bands[band]->n_channels; j++) { in nl80211_parse_sched_scan()
9715 chan = &wiphy->bands[band]->channels[j]; in nl80211_parse_sched_scan()
9717 if (chan->flags & IEEE80211_CHAN_DISABLED) in nl80211_parse_sched_scan()
9720 request->channels[i] = chan; in nl80211_parse_sched_scan()
9727 err = -EINVAL; in nl80211_parse_sched_scan()
9731 request->n_channels = i; in nl80211_parse_sched_scan()
9738 err = -EINVAL; in nl80211_parse_sched_scan()
9741 request->ssids[i].ssid_len = nla_len(attr); in nl80211_parse_sched_scan()
9742 memcpy(request->ssids[i].ssid, nla_data(attr), in nl80211_parse_sched_scan()
9775 err = -EINVAL; in nl80211_parse_sched_scan()
9780 memcpy(request->match_sets[i].ssid.ssid, in nl80211_parse_sched_scan()
9782 request->match_sets[i].ssid.ssid_len = in nl80211_parse_sched_scan()
9786 memcpy(request->match_sets[i].bssid, in nl80211_parse_sched_scan()
9789 /* special attribute - old implementation w/a */ in nl80211_parse_sched_scan()
9790 request->match_sets[i].rssi_thold = default_match_rssi; in nl80211_parse_sched_scan()
9793 request->match_sets[i].rssi_thold = in nl80211_parse_sched_scan()
9798 &request->match_sets[i], in nl80211_parse_sched_scan()
9800 request->match_sets[i].rssi_thold); in nl80211_parse_sched_scan()
9809 request->match_sets[0].rssi_thold = default_match_rssi; in nl80211_parse_sched_scan()
9811 request->min_rssi_thold = INT_MAX; in nl80211_parse_sched_scan()
9813 request->min_rssi_thold = in nl80211_parse_sched_scan()
9814 min(request->match_sets[i].rssi_thold, in nl80211_parse_sched_scan()
9815 request->min_rssi_thold); in nl80211_parse_sched_scan()
9817 request->min_rssi_thold = NL80211_SCAN_RSSI_THOLD_OFF; in nl80211_parse_sched_scan()
9821 request->ie_len = ie_len; in nl80211_parse_sched_scan()
9822 memcpy((void *)request->ie, in nl80211_parse_sched_scan()
9824 request->ie_len); in nl80211_parse_sched_scan()
9832 request->delay = in nl80211_parse_sched_scan()
9836 request->relative_rssi = nla_get_s8( in nl80211_parse_sched_scan()
9838 request->relative_rssi_set = true; in nl80211_parse_sched_scan()
9841 if (request->relative_rssi_set && in nl80211_parse_sched_scan()
9847 request->rssi_adjust.band = rssi_adjust->band; in nl80211_parse_sched_scan()
9848 request->rssi_adjust.delta = rssi_adjust->delta; in nl80211_parse_sched_scan()
9849 if (!is_band_valid(wiphy, request->rssi_adjust.band)) { in nl80211_parse_sched_scan()
9850 err = -EINVAL; in nl80211_parse_sched_scan()
9859 request->scan_start = jiffies; in nl80211_parse_sched_scan()
9871 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_start_sched_scan()
9872 struct net_device *dev = info->user_ptr[1]; in nl80211_start_sched_scan()
9873 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_start_sched_scan()
9878 if (!rdev->wiphy.max_sched_scan_reqs || !rdev->ops->sched_scan_start) in nl80211_start_sched_scan()
9879 return -EOPNOTSUPP; in nl80211_start_sched_scan()
9881 want_multi = info->attrs[NL80211_ATTR_SCHED_SCAN_MULTI]; in nl80211_start_sched_scan()
9886 sched_scan_req = nl80211_parse_sched_scan(&rdev->wiphy, wdev, in nl80211_start_sched_scan()
9887 info->attrs, in nl80211_start_sched_scan()
9888 rdev->wiphy.max_match_sets); in nl80211_start_sched_scan()
9895 * or if driver does not support multi-scheduled scan in nl80211_start_sched_scan()
9897 if (want_multi && rdev->wiphy.max_sched_scan_reqs > 1) in nl80211_start_sched_scan()
9898 sched_scan_req->reqid = cfg80211_assign_cookie(rdev); in nl80211_start_sched_scan()
9904 sched_scan_req->dev = dev; in nl80211_start_sched_scan()
9905 sched_scan_req->wiphy = &rdev->wiphy; in nl80211_start_sched_scan()
9907 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) in nl80211_start_sched_scan()
9908 sched_scan_req->owner_nlportid = info->snd_portid; in nl80211_start_sched_scan()
9925 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_stop_sched_scan()
9928 if (!rdev->wiphy.max_sched_scan_reqs || !rdev->ops->sched_scan_stop) in nl80211_stop_sched_scan()
9929 return -EOPNOTSUPP; in nl80211_stop_sched_scan()
9931 if (info->attrs[NL80211_ATTR_COOKIE]) { in nl80211_stop_sched_scan()
9932 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); in nl80211_stop_sched_scan()
9936 req = list_first_or_null_rcu(&rdev->sched_scan_req_list, in nl80211_stop_sched_scan()
9939 if (!req || req->reqid || in nl80211_stop_sched_scan()
9940 (req->owner_nlportid && in nl80211_stop_sched_scan()
9941 req->owner_nlportid != info->snd_portid)) in nl80211_stop_sched_scan()
9942 return -ENOENT; in nl80211_stop_sched_scan()
9950 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_start_radar_detection()
9951 struct net_device *dev = info->user_ptr[1]; in nl80211_start_radar_detection()
9952 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_start_radar_detection()
9953 struct wiphy *wiphy = wdev->wiphy; in nl80211_start_radar_detection()
9957 int err = -EINVAL; in nl80211_start_radar_detection()
9959 flush_delayed_work(&rdev->dfs_update_channels_wk); in nl80211_start_radar_detection()
9971 err = cfg80211_chandef_dfs_required(wiphy, &chandef, wdev->iftype); in nl80211_start_radar_detection()
9976 err = -EINVAL; in nl80211_start_radar_detection()
9981 err = -EINVAL; in nl80211_start_radar_detection()
9985 if (nla_get_flag(info->attrs[NL80211_ATTR_RADAR_BACKGROUND])) { in nl80211_start_radar_detection()
9992 err = -EBUSY; in nl80211_start_radar_detection()
9996 if (wdev->cac_started) { in nl80211_start_radar_detection()
9997 err = -EBUSY; in nl80211_start_radar_detection()
10003 err = -EOPNOTSUPP; in nl80211_start_radar_detection()
10007 if (!rdev->ops->start_radar_detection) { in nl80211_start_radar_detection()
10008 err = -EOPNOTSUPP; in nl80211_start_radar_detection()
10012 cac_time_ms = cfg80211_chandef_dfs_cac_time(&rdev->wiphy, &chandef); in nl80211_start_radar_detection()
10018 wdev->links[0].ap.chandef = chandef; in nl80211_start_radar_detection()
10019 wdev->cac_started = true; in nl80211_start_radar_detection()
10020 wdev->cac_start_time = jiffies; in nl80211_start_radar_detection()
10021 wdev->cac_time_ms = cac_time_ms; in nl80211_start_radar_detection()
10032 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_notify_radar_detection()
10033 struct net_device *dev = info->user_ptr[1]; in nl80211_notify_radar_detection()
10034 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_notify_radar_detection()
10035 struct wiphy *wiphy = wdev->wiphy; in nl80211_notify_radar_detection()
10044 return -EINVAL; in nl80211_notify_radar_detection()
10053 err = cfg80211_chandef_dfs_required(wiphy, &chandef, wdev->iftype); in nl80211_notify_radar_detection()
10062 return -EINVAL; in nl80211_notify_radar_detection()
10068 if (chandef.chan->dfs_state == NL80211_DFS_UNAVAILABLE) in nl80211_notify_radar_detection()
10075 rdev->radar_chandef = chandef; in nl80211_notify_radar_detection()
10078 queue_work(cfg80211_wq, &rdev->propagate_radar_detect_wk); in nl80211_notify_radar_detection()
10085 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_channel_switch()
10086 unsigned int link_id = nl80211_link_id(info->attrs); in nl80211_channel_switch()
10087 struct net_device *dev = info->user_ptr[1]; in nl80211_channel_switch()
10088 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_channel_switch()
10097 if (!rdev->ops->channel_switch || in nl80211_channel_switch()
10098 !(rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH)) in nl80211_channel_switch()
10099 return -EOPNOTSUPP; in nl80211_channel_switch()
10101 switch (dev->ieee80211_ptr->iftype) { in nl80211_channel_switch()
10113 if (!wdev->links[link_id].ap.beacon_interval) in nl80211_channel_switch()
10114 return -ENOTCONN; in nl80211_channel_switch()
10117 if (!wdev->u.ibss.ssid_len) in nl80211_channel_switch()
10118 return -ENOTCONN; in nl80211_channel_switch()
10121 if (!wdev->u.mesh.id_len) in nl80211_channel_switch()
10122 return -ENOTCONN; in nl80211_channel_switch()
10125 return -EOPNOTSUPP; in nl80211_channel_switch()
10129 params.beacon_csa.ftm_responder = -1; in nl80211_channel_switch()
10131 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ] || in nl80211_channel_switch()
10132 !info->attrs[NL80211_ATTR_CH_SWITCH_COUNT]) in nl80211_channel_switch()
10133 return -EINVAL; in nl80211_channel_switch()
10136 if (need_new_beacon && !info->attrs[NL80211_ATTR_CSA_IES]) in nl80211_channel_switch()
10137 return -EINVAL; in nl80211_channel_switch()
10142 cs_count = nla_get_u32(info->attrs[NL80211_ATTR_CH_SWITCH_COUNT]); in nl80211_channel_switch()
10144 return -EINVAL; in nl80211_channel_switch()
10151 err = nl80211_parse_beacon(rdev, info->attrs, &params.beacon_after, in nl80211_channel_switch()
10152 info->extack); in nl80211_channel_switch()
10159 err = -ENOMEM; in nl80211_channel_switch()
10164 info->attrs[NL80211_ATTR_CSA_IES], in nl80211_channel_switch()
10165 nl80211_policy, info->extack); in nl80211_channel_switch()
10170 info->extack); in nl80211_channel_switch()
10175 err = -EINVAL; in nl80211_channel_switch()
10181 err = -EINVAL; in nl80211_channel_switch()
10186 if (rdev->wiphy.max_num_csa_counters && in nl80211_channel_switch()
10188 rdev->wiphy.max_num_csa_counters)) { in nl80211_channel_switch()
10189 err = -EINVAL; in nl80211_channel_switch()
10196 /* sanity checks - counters should fit and be the same */ in nl80211_channel_switch()
10201 err = -EINVAL; in nl80211_channel_switch()
10206 err = -EINVAL; in nl80211_channel_switch()
10214 err = -EINVAL; in nl80211_channel_switch()
10219 if (rdev->wiphy.max_num_csa_counters && in nl80211_channel_switch()
10221 rdev->wiphy.max_num_csa_counters)) { in nl80211_channel_switch()
10222 err = -EINVAL; in nl80211_channel_switch()
10229 /* sanity checks - counters should fit and be the same */ in nl80211_channel_switch()
10234 err = -EINVAL; in nl80211_channel_switch()
10240 err = -EINVAL; in nl80211_channel_switch()
10251 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &params.chandef, in nl80211_channel_switch()
10252 wdev->iftype)) { in nl80211_channel_switch()
10253 err = -EINVAL; in nl80211_channel_switch()
10257 err = cfg80211_chandef_dfs_required(wdev->wiphy, in nl80211_channel_switch()
10259 wdev->iftype); in nl80211_channel_switch()
10266 !nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS])) { in nl80211_channel_switch()
10267 err = -EINVAL; in nl80211_channel_switch()
10272 if (info->attrs[NL80211_ATTR_CH_SWITCH_BLOCK_TX]) in nl80211_channel_switch()
10275 if (info->attrs[NL80211_ATTR_PUNCT_BITMAP]) { in nl80211_channel_switch()
10300 struct cfg80211_bss *res = &intbss->pub; in nl80211_send_bss()
10306 lockdep_assert_wiphy(wdev->wiphy); in nl80211_send_bss()
10308 hdr = nl80211hdr_put(msg, NETLINK_CB(cb->skb).portid, seq, flags, in nl80211_send_bss()
10311 return -1; in nl80211_send_bss()
10315 if (nla_put_u32(msg, NL80211_ATTR_GENERATION, rdev->bss_generation)) in nl80211_send_bss()
10317 if (wdev->netdev && in nl80211_send_bss()
10318 nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex)) in nl80211_send_bss()
10327 if ((!is_zero_ether_addr(res->bssid) && in nl80211_send_bss()
10328 nla_put(msg, NL80211_BSS_BSSID, ETH_ALEN, res->bssid))) in nl80211_send_bss()
10333 if (rcu_access_pointer(res->proberesp_ies) && in nl80211_send_bss()
10340 ies = rcu_dereference(res->ies); in nl80211_send_bss()
10342 if (nla_put_u64_64bit(msg, NL80211_BSS_TSF, ies->tsf, in nl80211_send_bss()
10345 if (ies->len && nla_put(msg, NL80211_BSS_INFORMATION_ELEMENTS, in nl80211_send_bss()
10346 ies->len, ies->data)) in nl80211_send_bss()
10351 ies = rcu_dereference(res->beacon_ies); in nl80211_send_bss()
10352 if (ies && ies->from_beacon) { in nl80211_send_bss()
10353 if (nla_put_u64_64bit(msg, NL80211_BSS_BEACON_TSF, ies->tsf, in nl80211_send_bss()
10356 if (ies->len && nla_put(msg, NL80211_BSS_BEACON_IES, in nl80211_send_bss()
10357 ies->len, ies->data)) in nl80211_send_bss()
10362 if (res->beacon_interval && in nl80211_send_bss()
10363 nla_put_u16(msg, NL80211_BSS_BEACON_INTERVAL, res->beacon_interval)) in nl80211_send_bss()
10365 if (nla_put_u16(msg, NL80211_BSS_CAPABILITY, res->capability) || in nl80211_send_bss()
10366 nla_put_u32(msg, NL80211_BSS_FREQUENCY, res->channel->center_freq) || in nl80211_send_bss()
10368 res->channel->freq_offset) || in nl80211_send_bss()
10370 jiffies_to_msecs(jiffies - intbss->ts))) in nl80211_send_bss()
10373 if (intbss->parent_tsf && in nl80211_send_bss()
10375 intbss->parent_tsf, NL80211_BSS_PAD) || in nl80211_send_bss()
10377 intbss->parent_bssid))) in nl80211_send_bss()
10380 if (intbss->ts_boottime && in nl80211_send_bss()
10382 intbss->ts_boottime, NL80211_BSS_PAD)) in nl80211_send_bss()
10385 if (!nl80211_put_signal(msg, intbss->pub.chains, in nl80211_send_bss()
10386 intbss->pub.chain_signal, in nl80211_send_bss()
10390 switch (rdev->wiphy.signal_type) { in nl80211_send_bss()
10392 if (nla_put_u32(msg, NL80211_BSS_SIGNAL_MBM, res->signal)) in nl80211_send_bss()
10396 if (nla_put_u8(msg, NL80211_BSS_SIGNAL_UNSPEC, res->signal)) in nl80211_send_bss()
10403 switch (wdev->iftype) { in nl80211_send_bss()
10407 if (intbss == wdev->links[link_id].client.current_bss && in nl80211_send_bss()
10410 (wdev->valid_links && in nl80211_send_bss()
10414 wdev->u.client.connected_addr))))) in nl80211_send_bss()
10419 if (intbss == wdev->u.ibss.current_bss && in nl80211_send_bss()
10428 if (nla_put_u32(msg, NL80211_BSS_USE_FOR, res->use_for)) in nl80211_send_bss()
10431 if (res->cannot_use_reasons && in nl80211_send_bss()
10433 res->cannot_use_reasons, in nl80211_send_bss()
10446 return -EMSGSIZE; in nl80211_send_bss()
10455 int start = cb->args[2], idx = 0; in nl80211_dump_scan()
10461 return -ENOMEM; in nl80211_dump_scan()
10469 __acquire(&rdev->wiphy.mtx); in nl80211_dump_scan()
10475 spin_lock_bh(&rdev->bss_lock); in nl80211_dump_scan()
10479 * into multiple messages. It is unlikely that any more bss-es will be in nl80211_dump_scan()
10486 cb->seq = rdev->bss_generation; in nl80211_dump_scan()
10488 list_for_each_entry(scan, &rdev->bss_list, list) { in nl80211_dump_scan()
10492 !(scan->pub.use_for & NL80211_BSS_USE_FOR_NORMAL)) in nl80211_dump_scan()
10495 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_dump_scan()
10497 idx--; in nl80211_dump_scan()
10502 spin_unlock_bh(&rdev->bss_lock); in nl80211_dump_scan()
10504 cb->args[2] = idx; in nl80211_dump_scan()
10505 wiphy_unlock(&rdev->wiphy); in nl80211_dump_scan()
10507 return skb->len; in nl80211_dump_scan()
10519 if (!survey->channel && !allow_radio_stats) in nl80211_send_survey()
10525 return -ENOMEM; in nl80211_send_survey()
10527 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) in nl80211_send_survey()
10534 if (survey->channel && in nl80211_send_survey()
10536 survey->channel->center_freq)) in nl80211_send_survey()
10539 if (survey->channel && survey->channel->freq_offset && in nl80211_send_survey()
10541 survey->channel->freq_offset)) in nl80211_send_survey()
10544 if ((survey->filled & SURVEY_INFO_NOISE_DBM) && in nl80211_send_survey()
10545 nla_put_u8(msg, NL80211_SURVEY_INFO_NOISE, survey->noise)) in nl80211_send_survey()
10547 if ((survey->filled & SURVEY_INFO_IN_USE) && in nl80211_send_survey()
10550 if ((survey->filled & SURVEY_INFO_TIME) && in nl80211_send_survey()
10552 survey->time, NL80211_SURVEY_INFO_PAD)) in nl80211_send_survey()
10554 if ((survey->filled & SURVEY_INFO_TIME_BUSY) && in nl80211_send_survey()
10556 survey->time_busy, NL80211_SURVEY_INFO_PAD)) in nl80211_send_survey()
10558 if ((survey->filled & SURVEY_INFO_TIME_EXT_BUSY) && in nl80211_send_survey()
10560 survey->time_ext_busy, NL80211_SURVEY_INFO_PAD)) in nl80211_send_survey()
10562 if ((survey->filled & SURVEY_INFO_TIME_RX) && in nl80211_send_survey()
10564 survey->time_rx, NL80211_SURVEY_INFO_PAD)) in nl80211_send_survey()
10566 if ((survey->filled & SURVEY_INFO_TIME_TX) && in nl80211_send_survey()
10568 survey->time_tx, NL80211_SURVEY_INFO_PAD)) in nl80211_send_survey()
10570 if ((survey->filled & SURVEY_INFO_TIME_SCAN) && in nl80211_send_survey()
10572 survey->time_scan, NL80211_SURVEY_INFO_PAD)) in nl80211_send_survey()
10574 if ((survey->filled & SURVEY_INFO_TIME_BSS_RX) && in nl80211_send_survey()
10576 survey->time_bss_rx, NL80211_SURVEY_INFO_PAD)) in nl80211_send_survey()
10586 return -EMSGSIZE; in nl80211_send_survey()
10595 int survey_idx = cb->args[2]; in nl80211_dump_survey()
10601 return -ENOMEM; in nl80211_dump_survey()
10609 __acquire(&rdev->wiphy.mtx); in nl80211_dump_survey()
10614 if (!wdev->netdev) { in nl80211_dump_survey()
10615 res = -EINVAL; in nl80211_dump_survey()
10619 if (!rdev->ops->dump_survey) { in nl80211_dump_survey()
10620 res = -EOPNOTSUPP; in nl80211_dump_survey()
10625 res = rdev_dump_survey(rdev, wdev->netdev, survey_idx, &survey); in nl80211_dump_survey()
10626 if (res == -ENOENT) in nl80211_dump_survey()
10631 /* don't send disabled channels, but do send non-channel data */ in nl80211_dump_survey()
10633 survey.channel->flags & IEEE80211_CHAN_DISABLED) { in nl80211_dump_survey()
10639 NETLINK_CB(cb->skb).portid, in nl80211_dump_survey()
10640 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_dump_survey()
10641 wdev->netdev, radio_stats, &survey) < 0) in nl80211_dump_survey()
10647 cb->args[2] = survey_idx; in nl80211_dump_survey()
10648 res = skb->len; in nl80211_dump_survey()
10651 wiphy_unlock(&rdev->wiphy); in nl80211_dump_survey()
10664 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_authenticate()
10665 struct net_device *dev = info->user_ptr[1]; in nl80211_authenticate()
10673 u32 freq; in nl80211_authenticate() local
10675 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_authenticate()
10676 return -EINVAL; in nl80211_authenticate()
10678 if (!info->attrs[NL80211_ATTR_AUTH_TYPE]) in nl80211_authenticate()
10679 return -EINVAL; in nl80211_authenticate()
10681 if (!info->attrs[NL80211_ATTR_SSID]) in nl80211_authenticate()
10682 return -EINVAL; in nl80211_authenticate()
10684 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ]) in nl80211_authenticate()
10685 return -EINVAL; in nl80211_authenticate()
10692 if (key.type != -1 && key.type != NL80211_KEYTYPE_GROUP) in nl80211_authenticate()
10693 return -EINVAL; in nl80211_authenticate()
10695 return -EINVAL; in nl80211_authenticate()
10700 return -EINVAL; in nl80211_authenticate()
10702 return -EINVAL; in nl80211_authenticate()
10712 for (i = 0; i < rdev->wiphy.n_cipher_suites; i++) { in nl80211_authenticate()
10713 if (key.p.cipher == rdev->wiphy.cipher_suites[i]) { in nl80211_authenticate()
10719 return -EINVAL; in nl80211_authenticate()
10722 if (!rdev->ops->auth) in nl80211_authenticate()
10723 return -EOPNOTSUPP; in nl80211_authenticate()
10725 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_authenticate()
10726 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_authenticate()
10727 return -EOPNOTSUPP; in nl80211_authenticate()
10729 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_authenticate()
10730 freq = MHZ_TO_KHZ(nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ])); in nl80211_authenticate()
10731 if (info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]) in nl80211_authenticate()
10732 freq += in nl80211_authenticate()
10733 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]); in nl80211_authenticate()
10735 chan = nl80211_get_valid_chan(&rdev->wiphy, freq); in nl80211_authenticate()
10737 return -EINVAL; in nl80211_authenticate()
10739 ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); in nl80211_authenticate()
10740 ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); in nl80211_authenticate()
10742 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_authenticate()
10743 req.ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_authenticate()
10744 req.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_authenticate()
10747 auth_type = nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]); in nl80211_authenticate()
10749 return -EINVAL; in nl80211_authenticate()
10755 !info->attrs[NL80211_ATTR_AUTH_DATA]) in nl80211_authenticate()
10756 return -EINVAL; in nl80211_authenticate()
10758 if (info->attrs[NL80211_ATTR_AUTH_DATA]) { in nl80211_authenticate()
10763 return -EINVAL; in nl80211_authenticate()
10764 req.auth_data = nla_data(info->attrs[NL80211_ATTR_AUTH_DATA]); in nl80211_authenticate()
10765 req.auth_data_len = nla_len(info->attrs[NL80211_ATTR_AUTH_DATA]); in nl80211_authenticate()
10768 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; in nl80211_authenticate()
10781 req.link_id = nl80211_link_id_or_invalid(info->attrs); in nl80211_authenticate()
10783 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_MLO)) in nl80211_authenticate()
10784 return -EINVAL; in nl80211_authenticate()
10785 if (!info->attrs[NL80211_ATTR_MLD_ADDR]) in nl80211_authenticate()
10786 return -EINVAL; in nl80211_authenticate()
10787 req.ap_mld_addr = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]); in nl80211_authenticate()
10789 return -EINVAL; in nl80211_authenticate()
10792 req.bss = cfg80211_get_bss(&rdev->wiphy, chan, bssid, ssid, ssid_len, in nl80211_authenticate()
10796 return -ENOENT; in nl80211_authenticate()
10800 cfg80211_put_bss(&rdev->wiphy, req.bss); in nl80211_authenticate()
10808 if (!info->attrs[NL80211_ATTR_SOCKET_OWNER]) { in validate_pae_over_nl80211()
10810 return -EINVAL; in validate_pae_over_nl80211()
10813 if (!rdev->ops->tx_control_port || in validate_pae_over_nl80211()
10814 !wiphy_ext_feature_isset(&rdev->wiphy, in validate_pae_over_nl80211()
10816 return -EOPNOTSUPP; in validate_pae_over_nl80211()
10828 settings->control_port = info->attrs[NL80211_ATTR_CONTROL_PORT]; in nl80211_crypto_settings()
10830 if (info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]) { in nl80211_crypto_settings()
10834 info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]); in nl80211_crypto_settings()
10835 settings->control_port_ethertype = cpu_to_be16(proto); in nl80211_crypto_settings()
10836 if (!(rdev->wiphy.flags & WIPHY_FLAG_CONTROL_PORT_PROTOCOL) && in nl80211_crypto_settings()
10838 return -EINVAL; in nl80211_crypto_settings()
10839 if (info->attrs[NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT]) in nl80211_crypto_settings()
10840 settings->control_port_no_encrypt = true; in nl80211_crypto_settings()
10842 settings->control_port_ethertype = cpu_to_be16(ETH_P_PAE); in nl80211_crypto_settings()
10844 if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) { in nl80211_crypto_settings()
10850 settings->control_port_over_nl80211 = true; in nl80211_crypto_settings()
10852 if (info->attrs[NL80211_ATTR_CONTROL_PORT_NO_PREAUTH]) in nl80211_crypto_settings()
10853 settings->control_port_no_preauth = true; in nl80211_crypto_settings()
10856 if (info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]) { in nl80211_crypto_settings()
10860 data = nla_data(info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]); in nl80211_crypto_settings()
10861 len = nla_len(info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]); in nl80211_crypto_settings()
10862 settings->n_ciphers_pairwise = len / sizeof(u32); in nl80211_crypto_settings()
10865 return -EINVAL; in nl80211_crypto_settings()
10867 if (settings->n_ciphers_pairwise > cipher_limit) in nl80211_crypto_settings()
10868 return -EINVAL; in nl80211_crypto_settings()
10870 memcpy(settings->ciphers_pairwise, data, len); in nl80211_crypto_settings()
10872 for (i = 0; i < settings->n_ciphers_pairwise; i++) in nl80211_crypto_settings()
10874 &rdev->wiphy, in nl80211_crypto_settings()
10875 settings->ciphers_pairwise[i])) in nl80211_crypto_settings()
10876 return -EINVAL; in nl80211_crypto_settings()
10879 if (info->attrs[NL80211_ATTR_CIPHER_SUITE_GROUP]) { in nl80211_crypto_settings()
10880 settings->cipher_group = in nl80211_crypto_settings()
10881 nla_get_u32(info->attrs[NL80211_ATTR_CIPHER_SUITE_GROUP]); in nl80211_crypto_settings()
10882 if (!cfg80211_supported_cipher_suite(&rdev->wiphy, in nl80211_crypto_settings()
10883 settings->cipher_group)) in nl80211_crypto_settings()
10884 return -EINVAL; in nl80211_crypto_settings()
10887 if (info->attrs[NL80211_ATTR_WPA_VERSIONS]) { in nl80211_crypto_settings()
10888 settings->wpa_versions = in nl80211_crypto_settings()
10889 nla_get_u32(info->attrs[NL80211_ATTR_WPA_VERSIONS]); in nl80211_crypto_settings()
10890 if (!nl80211_valid_wpa_versions(settings->wpa_versions)) in nl80211_crypto_settings()
10891 return -EINVAL; in nl80211_crypto_settings()
10894 if (info->attrs[NL80211_ATTR_AKM_SUITES]) { in nl80211_crypto_settings()
10898 data = nla_data(info->attrs[NL80211_ATTR_AKM_SUITES]); in nl80211_crypto_settings()
10899 len = nla_len(info->attrs[NL80211_ATTR_AKM_SUITES]); in nl80211_crypto_settings()
10900 settings->n_akm_suites = len / sizeof(u32); in nl80211_crypto_settings()
10903 return -EINVAL; in nl80211_crypto_settings()
10905 if (settings->n_akm_suites > rdev->wiphy.max_num_akm_suites) in nl80211_crypto_settings()
10906 return -EINVAL; in nl80211_crypto_settings()
10908 memcpy(settings->akm_suites, data, len); in nl80211_crypto_settings()
10911 if (info->attrs[NL80211_ATTR_PMK]) { in nl80211_crypto_settings()
10912 if (nla_len(info->attrs[NL80211_ATTR_PMK]) != WLAN_PMK_LEN) in nl80211_crypto_settings()
10913 return -EINVAL; in nl80211_crypto_settings()
10914 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_crypto_settings()
10916 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_crypto_settings()
10918 return -EINVAL; in nl80211_crypto_settings()
10919 settings->psk = nla_data(info->attrs[NL80211_ATTR_PMK]); in nl80211_crypto_settings()
10922 if (info->attrs[NL80211_ATTR_SAE_PASSWORD]) { in nl80211_crypto_settings()
10923 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_crypto_settings()
10925 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_crypto_settings()
10927 return -EINVAL; in nl80211_crypto_settings()
10928 settings->sae_pwd = in nl80211_crypto_settings()
10929 nla_data(info->attrs[NL80211_ATTR_SAE_PASSWORD]); in nl80211_crypto_settings()
10930 settings->sae_pwd_len = in nl80211_crypto_settings()
10931 nla_len(info->attrs[NL80211_ATTR_SAE_PASSWORD]); in nl80211_crypto_settings()
10934 if (info->attrs[NL80211_ATTR_SAE_PWE]) in nl80211_crypto_settings()
10935 settings->sae_pwe = in nl80211_crypto_settings()
10936 nla_get_u8(info->attrs[NL80211_ATTR_SAE_PWE]); in nl80211_crypto_settings()
10938 settings->sae_pwe = NL80211_SAE_PWE_UNSPECIFIED; in nl80211_crypto_settings()
10951 u32 freq, use_for = 0; in nl80211_assoc_bss() local
10954 return ERR_PTR(-EINVAL); in nl80211_assoc_bss()
10958 freq = MHZ_TO_KHZ(nla_get_u32(attrs[NL80211_ATTR_WIPHY_FREQ])); in nl80211_assoc_bss()
10960 freq += nla_get_u32(attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]); in nl80211_assoc_bss()
10962 chan = nl80211_get_valid_chan(&rdev->wiphy, freq); in nl80211_assoc_bss()
10964 return ERR_PTR(-EINVAL); in nl80211_assoc_bss()
10971 bss = __cfg80211_get_bss(&rdev->wiphy, chan, bssid, in nl80211_assoc_bss()
10977 return ERR_PTR(-ENOENT); in nl80211_assoc_bss()
10984 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_associate()
10985 struct net_device *dev = info->user_ptr[1]; in nl80211_associate()
10992 if (dev->ieee80211_ptr->conn_owner_nlportid && in nl80211_associate()
10993 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) in nl80211_associate()
10994 return -EPERM; in nl80211_associate()
10996 if (!info->attrs[NL80211_ATTR_SSID]) in nl80211_associate()
10997 return -EINVAL; in nl80211_associate()
10999 if (!rdev->ops->assoc) in nl80211_associate()
11000 return -EOPNOTSUPP; in nl80211_associate()
11002 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_associate()
11003 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_associate()
11004 return -EOPNOTSUPP; in nl80211_associate()
11006 ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); in nl80211_associate()
11007 ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); in nl80211_associate()
11009 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_associate()
11010 req.ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_associate()
11011 req.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_associate()
11015 NL_SET_ERR_MSG_ATTR(info->extack, in nl80211_associate()
11016 info->attrs[NL80211_ATTR_IE], in nl80211_associate()
11017 "non-inheritance makes no sense"); in nl80211_associate()
11018 return -EINVAL; in nl80211_associate()
11022 if (info->attrs[NL80211_ATTR_USE_MFP]) { in nl80211_associate()
11024 nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]); in nl80211_associate()
11028 return -EINVAL; in nl80211_associate()
11031 if (info->attrs[NL80211_ATTR_PREV_BSSID]) in nl80211_associate()
11032 req.prev_bssid = nla_data(info->attrs[NL80211_ATTR_PREV_BSSID]); in nl80211_associate()
11034 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HT])) in nl80211_associate()
11037 if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) in nl80211_associate()
11039 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]), in nl80211_associate()
11042 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) { in nl80211_associate()
11043 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) in nl80211_associate()
11044 return -EINVAL; in nl80211_associate()
11046 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]), in nl80211_associate()
11050 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_VHT])) in nl80211_associate()
11053 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HE])) in nl80211_associate()
11056 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_EHT])) in nl80211_associate()
11059 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) in nl80211_associate()
11061 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]), in nl80211_associate()
11064 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) { in nl80211_associate()
11065 if (!info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) in nl80211_associate()
11066 return -EINVAL; in nl80211_associate()
11068 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]), in nl80211_associate()
11072 if (nla_get_flag(info->attrs[NL80211_ATTR_USE_RRM])) { in nl80211_associate()
11073 if (!((rdev->wiphy.features & in nl80211_associate()
11075 (rdev->wiphy.features & NL80211_FEATURE_QUIET)) && in nl80211_associate()
11076 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_associate()
11078 return -EINVAL; in nl80211_associate()
11082 if (info->attrs[NL80211_ATTR_FILS_KEK]) { in nl80211_associate()
11083 req.fils_kek = nla_data(info->attrs[NL80211_ATTR_FILS_KEK]); in nl80211_associate()
11084 req.fils_kek_len = nla_len(info->attrs[NL80211_ATTR_FILS_KEK]); in nl80211_associate()
11085 if (!info->attrs[NL80211_ATTR_FILS_NONCES]) in nl80211_associate()
11086 return -EINVAL; in nl80211_associate()
11088 nla_data(info->attrs[NL80211_ATTR_FILS_NONCES]); in nl80211_associate()
11091 if (info->attrs[NL80211_ATTR_S1G_CAPABILITY_MASK]) { in nl80211_associate()
11092 if (!info->attrs[NL80211_ATTR_S1G_CAPABILITY]) in nl80211_associate()
11093 return -EINVAL; in nl80211_associate()
11095 nla_data(info->attrs[NL80211_ATTR_S1G_CAPABILITY_MASK]), in nl80211_associate()
11099 if (info->attrs[NL80211_ATTR_S1G_CAPABILITY]) { in nl80211_associate()
11100 if (!info->attrs[NL80211_ATTR_S1G_CAPABILITY_MASK]) in nl80211_associate()
11101 return -EINVAL; in nl80211_associate()
11103 nla_data(info->attrs[NL80211_ATTR_S1G_CAPABILITY]), in nl80211_associate()
11107 req.link_id = nl80211_link_id_or_invalid(info->attrs); in nl80211_associate()
11109 if (info->attrs[NL80211_ATTR_MLO_LINKS]) { in nl80211_associate()
11115 return -EINVAL; in nl80211_associate()
11117 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_MLO)) in nl80211_associate()
11118 return -EINVAL; in nl80211_associate()
11120 if (info->attrs[NL80211_ATTR_MAC] || in nl80211_associate()
11121 info->attrs[NL80211_ATTR_WIPHY_FREQ] || in nl80211_associate()
11122 !info->attrs[NL80211_ATTR_MLD_ADDR]) in nl80211_associate()
11123 return -EINVAL; in nl80211_associate()
11125 req.ap_mld_addr = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]); in nl80211_associate()
11130 return -ENOMEM; in nl80211_associate()
11133 info->attrs[NL80211_ATTR_MLO_LINKS], in nl80211_associate()
11141 err = -EINVAL; in nl80211_associate()
11142 NL_SET_BAD_ATTR(info->extack, link); in nl80211_associate()
11149 err = -EINVAL; in nl80211_associate()
11150 NL_SET_BAD_ATTR(info->extack, link); in nl80211_associate()
11159 NL_SET_ERR_MSG_ATTR(info->extack, in nl80211_associate()
11173 NL_SET_ERR_MSG_ATTR(info->extack, in nl80211_associate()
11176 err = -EINVAL; in nl80211_associate()
11183 NL_SET_ERR_MSG_ATTR(info->extack, in nl80211_associate()
11185 "cannot deal with non-inheritance"); in nl80211_associate()
11186 err = -EINVAL; in nl80211_associate()
11196 err = -EINVAL; in nl80211_associate()
11202 "cannot have per-link elems on assoc link"); in nl80211_associate()
11203 err = -EINVAL; in nl80211_associate()
11210 err = -EINVAL; in nl80211_associate()
11218 return -EINVAL; in nl80211_associate()
11220 req.bss = nl80211_assoc_bss(rdev, ssid, ssid_len, info->attrs, in nl80211_associate()
11221 -1, -1); in nl80211_associate()
11224 ap_addr = req.bss->bssid; in nl80211_associate()
11234 if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) { in nl80211_associate()
11235 dev->ieee80211_ptr->conn_owner_nlportid = in nl80211_associate()
11236 info->snd_portid; in nl80211_associate()
11237 memcpy(dev->ieee80211_ptr->disconnect_bssid, in nl80211_associate()
11242 if (info->attrs[NL80211_ATTR_MLO_LINKS]) { in nl80211_associate()
11244 info->attrs[NL80211_ATTR_MLO_LINKS], in nl80211_associate()
11263 NL_SET_BAD_ATTR(info->extack, link); in nl80211_associate()
11272 cfg80211_put_bss(&rdev->wiphy, req.links[link_id].bss); in nl80211_associate()
11273 cfg80211_put_bss(&rdev->wiphy, req.bss); in nl80211_associate()
11281 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_deauthenticate()
11282 struct net_device *dev = info->user_ptr[1]; in nl80211_deauthenticate()
11288 if (dev->ieee80211_ptr->conn_owner_nlportid && in nl80211_deauthenticate()
11289 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) in nl80211_deauthenticate()
11290 return -EPERM; in nl80211_deauthenticate()
11292 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_deauthenticate()
11293 return -EINVAL; in nl80211_deauthenticate()
11295 if (!info->attrs[NL80211_ATTR_REASON_CODE]) in nl80211_deauthenticate()
11296 return -EINVAL; in nl80211_deauthenticate()
11298 if (!rdev->ops->deauth) in nl80211_deauthenticate()
11299 return -EOPNOTSUPP; in nl80211_deauthenticate()
11301 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_deauthenticate()
11302 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_deauthenticate()
11303 return -EOPNOTSUPP; in nl80211_deauthenticate()
11305 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_deauthenticate()
11307 reason_code = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); in nl80211_deauthenticate()
11310 return -EINVAL; in nl80211_deauthenticate()
11313 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_deauthenticate()
11314 ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_deauthenticate()
11315 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_deauthenticate()
11318 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; in nl80211_deauthenticate()
11326 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_disassociate()
11327 struct net_device *dev = info->user_ptr[1]; in nl80211_disassociate()
11333 if (dev->ieee80211_ptr->conn_owner_nlportid && in nl80211_disassociate()
11334 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) in nl80211_disassociate()
11335 return -EPERM; in nl80211_disassociate()
11337 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_disassociate()
11338 return -EINVAL; in nl80211_disassociate()
11340 if (!info->attrs[NL80211_ATTR_REASON_CODE]) in nl80211_disassociate()
11341 return -EINVAL; in nl80211_disassociate()
11343 if (!rdev->ops->disassoc) in nl80211_disassociate()
11344 return -EOPNOTSUPP; in nl80211_disassociate()
11346 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_disassociate()
11347 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_disassociate()
11348 return -EOPNOTSUPP; in nl80211_disassociate()
11350 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_disassociate()
11352 reason_code = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); in nl80211_disassociate()
11355 return -EINVAL; in nl80211_disassociate()
11358 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_disassociate()
11359 ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_disassociate()
11360 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_disassociate()
11363 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; in nl80211_disassociate()
11374 struct wiphy *wiphy = &rdev->wiphy; in nl80211_parse_mcast_rate()
11381 sband = wiphy->bands[band]; in nl80211_parse_mcast_rate()
11385 for (i = 0; i < sband->n_bitrates; i++) { in nl80211_parse_mcast_rate()
11386 if (sband->bitrates[i].bitrate == rateval) { in nl80211_parse_mcast_rate()
11399 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_join_ibss()
11400 struct net_device *dev = info->user_ptr[1]; in nl80211_join_ibss()
11408 if (!info->attrs[NL80211_ATTR_SSID] || in nl80211_join_ibss()
11409 !nla_len(info->attrs[NL80211_ATTR_SSID])) in nl80211_join_ibss()
11410 return -EINVAL; in nl80211_join_ibss()
11414 if (info->attrs[NL80211_ATTR_BEACON_INTERVAL]) in nl80211_join_ibss()
11416 nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]); in nl80211_join_ibss()
11423 if (!rdev->ops->join_ibss) in nl80211_join_ibss()
11424 return -EOPNOTSUPP; in nl80211_join_ibss()
11426 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC) in nl80211_join_ibss()
11427 return -EOPNOTSUPP; in nl80211_join_ibss()
11429 wiphy = &rdev->wiphy; in nl80211_join_ibss()
11431 if (info->attrs[NL80211_ATTR_MAC]) { in nl80211_join_ibss()
11432 ibss.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_join_ibss()
11435 return -EINVAL; in nl80211_join_ibss()
11437 ibss.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); in nl80211_join_ibss()
11438 ibss.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); in nl80211_join_ibss()
11440 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_join_ibss()
11441 ibss.ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_join_ibss()
11442 ibss.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_join_ibss()
11449 if (!cfg80211_reg_can_beacon(&rdev->wiphy, &ibss.chandef, in nl80211_join_ibss()
11451 return -EINVAL; in nl80211_join_ibss()
11460 if (!(rdev->wiphy.features & NL80211_FEATURE_HT_IBSS)) in nl80211_join_ibss()
11461 return -EINVAL; in nl80211_join_ibss()
11466 if (!(rdev->wiphy.features & NL80211_FEATURE_HT_IBSS)) in nl80211_join_ibss()
11467 return -EINVAL; in nl80211_join_ibss()
11468 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_join_ibss()
11470 return -EINVAL; in nl80211_join_ibss()
11473 return -EINVAL; in nl80211_join_ibss()
11475 return -EINVAL; in nl80211_join_ibss()
11478 ibss.channel_fixed = !!info->attrs[NL80211_ATTR_FREQ_FIXED]; in nl80211_join_ibss()
11479 ibss.privacy = !!info->attrs[NL80211_ATTR_PRIVACY]; in nl80211_join_ibss()
11481 if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) { in nl80211_join_ibss()
11483 nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); in nl80211_join_ibss()
11485 nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); in nl80211_join_ibss()
11487 wiphy->bands[ibss.chandef.chan->band]; in nl80211_join_ibss()
11495 if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) in nl80211_join_ibss()
11497 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]), in nl80211_join_ibss()
11500 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) { in nl80211_join_ibss()
11501 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) in nl80211_join_ibss()
11502 return -EINVAL; in nl80211_join_ibss()
11504 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]), in nl80211_join_ibss()
11508 if (info->attrs[NL80211_ATTR_MCAST_RATE] && in nl80211_join_ibss()
11510 nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]))) in nl80211_join_ibss()
11511 return -EINVAL; in nl80211_join_ibss()
11513 if (ibss.privacy && info->attrs[NL80211_ATTR_KEYS]) { in nl80211_join_ibss()
11523 return -EINVAL; in nl80211_join_ibss()
11528 nla_get_flag(info->attrs[NL80211_ATTR_CONTROL_PORT]); in nl80211_join_ibss()
11530 if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) { in nl80211_join_ibss()
11542 nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS]); in nl80211_join_ibss()
11547 else if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) in nl80211_join_ibss()
11548 dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid; in nl80211_join_ibss()
11555 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_leave_ibss()
11556 struct net_device *dev = info->user_ptr[1]; in nl80211_leave_ibss()
11558 if (!rdev->ops->leave_ibss) in nl80211_leave_ibss()
11559 return -EOPNOTSUPP; in nl80211_leave_ibss()
11561 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC) in nl80211_leave_ibss()
11562 return -EOPNOTSUPP; in nl80211_leave_ibss()
11569 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_mcast_rate()
11570 struct net_device *dev = info->user_ptr[1]; in nl80211_set_mcast_rate()
11574 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC && in nl80211_set_mcast_rate()
11575 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT && in nl80211_set_mcast_rate()
11576 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_OCB) in nl80211_set_mcast_rate()
11577 return -EOPNOTSUPP; in nl80211_set_mcast_rate()
11579 if (!rdev->ops->set_mcast_rate) in nl80211_set_mcast_rate()
11580 return -EOPNOTSUPP; in nl80211_set_mcast_rate()
11584 if (!info->attrs[NL80211_ATTR_MCAST_RATE]) in nl80211_set_mcast_rate()
11585 return -EINVAL; in nl80211_set_mcast_rate()
11587 nla_rate = nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]); in nl80211_set_mcast_rate()
11589 return -EINVAL; in nl80211_set_mcast_rate()
11616 if (nla_put_u32(skb, NL80211_ATTR_WIPHY, rdev->wiphy_idx)) in __cfg80211_alloc_vendor_skb()
11621 info->vendor_id)) in __cfg80211_alloc_vendor_skb()
11624 info->subcmd)) in __cfg80211_alloc_vendor_skb()
11632 if (wdev->netdev && in __cfg80211_alloc_vendor_skb()
11634 wdev->netdev->ifindex)) in __cfg80211_alloc_vendor_skb()
11642 ((void **)skb->cb)[0] = rdev; in __cfg80211_alloc_vendor_skb()
11643 ((void **)skb->cb)[1] = hdr; in __cfg80211_alloc_vendor_skb()
11644 ((void **)skb->cb)[2] = data; in __cfg80211_alloc_vendor_skb()
11666 if (WARN_ON(vendor_event_idx != -1)) in __cfg80211_alloc_event_skb()
11672 vendor_event_idx >= wiphy->n_vendor_events)) in __cfg80211_alloc_event_skb()
11674 info = &wiphy->vendor_events[vendor_event_idx]; in __cfg80211_alloc_event_skb()
11688 struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0]; in __cfg80211_send_event_skb()
11689 void *hdr = ((void **)skb->cb)[1]; in __cfg80211_send_event_skb()
11691 struct nlattr *data = ((void **)skb->cb)[2]; in __cfg80211_send_event_skb()
11695 memset(skb->cb, 0, sizeof(skb->cb)); in __cfg80211_send_event_skb()
11700 if (nlhdr->nlmsg_pid) { in __cfg80211_send_event_skb()
11701 genlmsg_unicast(wiphy_net(&rdev->wiphy), skb, in __cfg80211_send_event_skb()
11702 nlhdr->nlmsg_pid); in __cfg80211_send_event_skb()
11704 if (data->nla_type == NL80211_ATTR_VENDOR_DATA) in __cfg80211_send_event_skb()
11707 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), in __cfg80211_send_event_skb()
11716 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_testmode_do()
11720 lockdep_assert_held(&rdev->wiphy.mtx); in nl80211_testmode_do()
11723 info->attrs); in nl80211_testmode_do()
11725 if (!rdev->ops->testmode_cmd) in nl80211_testmode_do()
11726 return -EOPNOTSUPP; in nl80211_testmode_do()
11730 if (err != -EINVAL) in nl80211_testmode_do()
11733 } else if (wdev->wiphy != &rdev->wiphy) { in nl80211_testmode_do()
11734 return -EINVAL; in nl80211_testmode_do()
11737 if (!info->attrs[NL80211_ATTR_TESTDATA]) in nl80211_testmode_do()
11738 return -EINVAL; in nl80211_testmode_do()
11740 rdev->cur_cmd_info = info; in nl80211_testmode_do()
11742 nla_data(info->attrs[NL80211_ATTR_TESTDATA]), in nl80211_testmode_do()
11743 nla_len(info->attrs[NL80211_ATTR_TESTDATA])); in nl80211_testmode_do()
11744 rdev->cur_cmd_info = NULL; in nl80211_testmode_do()
11761 if (cb->args[0]) { in nl80211_testmode_dump()
11766 phy_idx = cb->args[0] - 1; in nl80211_testmode_dump()
11770 err = -ENOENT; in nl80211_testmode_dump()
11777 err = -ENOMEM; in nl80211_testmode_dump()
11781 err = nlmsg_parse_deprecated(cb->nlh, in nl80211_testmode_dump()
11788 rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk), attrbuf); in nl80211_testmode_dump()
11793 phy_idx = rdev->wiphy_idx; in nl80211_testmode_dump()
11796 cb->args[1] = (long)attrbuf[NL80211_ATTR_TESTDATA]; in nl80211_testmode_dump()
11799 if (cb->args[1]) { in nl80211_testmode_dump()
11800 data = nla_data((void *)cb->args[1]); in nl80211_testmode_dump()
11801 data_len = nla_len((void *)cb->args[1]); in nl80211_testmode_dump()
11804 if (!rdev->ops->testmode_dump) { in nl80211_testmode_dump()
11805 err = -EOPNOTSUPP; in nl80211_testmode_dump()
11810 void *hdr = nl80211hdr_put(skb, NETLINK_CB(cb->skb).portid, in nl80211_testmode_dump()
11811 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_testmode_dump()
11831 if (err == -ENOBUFS || err == -ENOENT) { in nl80211_testmode_dump()
11842 err = skb->len; in nl80211_testmode_dump()
11844 cb->args[0] = phy_idx + 1; in nl80211_testmode_dump()
11854 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_connect()
11855 struct net_device *dev = info->user_ptr[1]; in nl80211_connect()
11859 u32 freq = 0; in nl80211_connect() local
11864 if (!info->attrs[NL80211_ATTR_SSID] || in nl80211_connect()
11865 !nla_len(info->attrs[NL80211_ATTR_SSID])) in nl80211_connect()
11866 return -EINVAL; in nl80211_connect()
11868 if (info->attrs[NL80211_ATTR_AUTH_TYPE]) { in nl80211_connect()
11870 nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]); in nl80211_connect()
11873 return -EINVAL; in nl80211_connect()
11877 connect.privacy = info->attrs[NL80211_ATTR_PRIVACY]; in nl80211_connect()
11879 if (info->attrs[NL80211_ATTR_WANT_1X_4WAY_HS] && in nl80211_connect()
11880 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_connect()
11882 return -EINVAL; in nl80211_connect()
11883 connect.want_1x = info->attrs[NL80211_ATTR_WANT_1X_4WAY_HS]; in nl80211_connect()
11890 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_connect()
11891 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_connect()
11892 return -EOPNOTSUPP; in nl80211_connect()
11894 wiphy = &rdev->wiphy; in nl80211_connect()
11896 connect.bg_scan_period = -1; in nl80211_connect()
11897 if (info->attrs[NL80211_ATTR_BG_SCAN_PERIOD] && in nl80211_connect()
11898 (wiphy->flags & WIPHY_FLAG_SUPPORTS_FW_ROAM)) { in nl80211_connect()
11900 nla_get_u16(info->attrs[NL80211_ATTR_BG_SCAN_PERIOD]); in nl80211_connect()
11903 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_connect()
11904 connect.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_connect()
11905 else if (info->attrs[NL80211_ATTR_MAC_HINT]) in nl80211_connect()
11907 nla_data(info->attrs[NL80211_ATTR_MAC_HINT]); in nl80211_connect()
11908 connect.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); in nl80211_connect()
11909 connect.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); in nl80211_connect()
11911 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_connect()
11912 connect.ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_connect()
11913 connect.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_connect()
11916 if (info->attrs[NL80211_ATTR_USE_MFP]) { in nl80211_connect()
11917 connect.mfp = nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]); in nl80211_connect()
11919 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_connect()
11921 return -EOPNOTSUPP; in nl80211_connect()
11926 if (info->attrs[NL80211_ATTR_PREV_BSSID]) in nl80211_connect()
11928 nla_data(info->attrs[NL80211_ATTR_PREV_BSSID]); in nl80211_connect()
11930 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) in nl80211_connect()
11931 freq = MHZ_TO_KHZ(nla_get_u32( in nl80211_connect()
11932 info->attrs[NL80211_ATTR_WIPHY_FREQ])); in nl80211_connect()
11933 if (info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]) in nl80211_connect()
11934 freq += in nl80211_connect()
11935 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]); in nl80211_connect()
11937 if (freq) { in nl80211_connect()
11938 connect.channel = nl80211_get_valid_chan(wiphy, freq); in nl80211_connect()
11940 return -EINVAL; in nl80211_connect()
11941 } else if (info->attrs[NL80211_ATTR_WIPHY_FREQ_HINT]) { in nl80211_connect()
11942 freq = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_HINT]); in nl80211_connect()
11943 freq = MHZ_TO_KHZ(freq); in nl80211_connect()
11944 connect.channel_hint = nl80211_get_valid_chan(wiphy, freq); in nl80211_connect()
11946 return -EINVAL; in nl80211_connect()
11949 if (info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]) { in nl80211_connect()
11951 nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]); in nl80211_connect()
11953 if (info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]) in nl80211_connect()
11955 nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]); in nl80211_connect()
11958 if (connect.privacy && info->attrs[NL80211_ATTR_KEYS]) { in nl80211_connect()
11964 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HT])) in nl80211_connect()
11967 if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) in nl80211_connect()
11969 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]), in nl80211_connect()
11972 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) { in nl80211_connect()
11973 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) { in nl80211_connect()
11975 return -EINVAL; in nl80211_connect()
11978 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]), in nl80211_connect()
11982 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_VHT])) in nl80211_connect()
11985 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HE])) in nl80211_connect()
11988 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_EHT])) in nl80211_connect()
11991 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) in nl80211_connect()
11993 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]), in nl80211_connect()
11996 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) { in nl80211_connect()
11997 if (!info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) { in nl80211_connect()
11999 return -EINVAL; in nl80211_connect()
12002 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]), in nl80211_connect()
12006 if (nla_get_flag(info->attrs[NL80211_ATTR_USE_RRM])) { in nl80211_connect()
12007 if (!((rdev->wiphy.features & in nl80211_connect()
12009 (rdev->wiphy.features & NL80211_FEATURE_QUIET)) && in nl80211_connect()
12010 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_connect()
12013 return -EINVAL; in nl80211_connect()
12018 connect.pbss = nla_get_flag(info->attrs[NL80211_ATTR_PBSS]); in nl80211_connect()
12019 if (connect.pbss && !rdev->wiphy.bands[NL80211_BAND_60GHZ]) { in nl80211_connect()
12021 return -EOPNOTSUPP; in nl80211_connect()
12024 if (info->attrs[NL80211_ATTR_BSS_SELECT]) { in nl80211_connect()
12028 return -EINVAL; in nl80211_connect()
12031 err = parse_bss_select(info->attrs[NL80211_ATTR_BSS_SELECT], in nl80211_connect()
12039 if (wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_connect()
12041 info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] && in nl80211_connect()
12042 info->attrs[NL80211_ATTR_FILS_ERP_REALM] && in nl80211_connect()
12043 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] && in nl80211_connect()
12044 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { in nl80211_connect()
12046 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); in nl80211_connect()
12048 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); in nl80211_connect()
12050 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); in nl80211_connect()
12052 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); in nl80211_connect()
12055 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM]); in nl80211_connect()
12057 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); in nl80211_connect()
12059 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); in nl80211_connect()
12060 } else if (info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] || in nl80211_connect()
12061 info->attrs[NL80211_ATTR_FILS_ERP_REALM] || in nl80211_connect()
12062 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] || in nl80211_connect()
12063 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { in nl80211_connect()
12065 return -EINVAL; in nl80211_connect()
12068 if (nla_get_flag(info->attrs[NL80211_ATTR_EXTERNAL_AUTH_SUPPORT])) { in nl80211_connect()
12069 if (!info->attrs[NL80211_ATTR_SOCKET_OWNER]) { in nl80211_connect()
12073 return -EINVAL; in nl80211_connect()
12078 if (nla_get_flag(info->attrs[NL80211_ATTR_MLO_SUPPORT])) in nl80211_connect()
12086 if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) { in nl80211_connect()
12087 dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid; in nl80211_connect()
12089 memcpy(dev->ieee80211_ptr->disconnect_bssid, in nl80211_connect()
12092 eth_zero_addr(dev->ieee80211_ptr->disconnect_bssid); in nl80211_connect()
12102 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_update_connect_params()
12103 struct net_device *dev = info->user_ptr[1]; in nl80211_update_connect_params()
12104 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_update_connect_params()
12109 if (!rdev->ops->update_connect_params) in nl80211_update_connect_params()
12110 return -EOPNOTSUPP; in nl80211_update_connect_params()
12112 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_update_connect_params()
12113 connect.ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_update_connect_params()
12114 connect.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_update_connect_params()
12118 fils_sk_offload = wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_update_connect_params()
12122 * when driver supports fils-sk offload all attributes must be in nl80211_update_connect_params()
12123 * provided. So the else covers "fils-sk-not-all" and in nl80211_update_connect_params()
12124 * "no-fils-sk-any". in nl80211_update_connect_params()
12127 info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] && in nl80211_update_connect_params()
12128 info->attrs[NL80211_ATTR_FILS_ERP_REALM] && in nl80211_update_connect_params()
12129 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] && in nl80211_update_connect_params()
12130 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { in nl80211_update_connect_params()
12132 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); in nl80211_update_connect_params()
12134 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); in nl80211_update_connect_params()
12136 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); in nl80211_update_connect_params()
12138 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); in nl80211_update_connect_params()
12141 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM]); in nl80211_update_connect_params()
12143 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); in nl80211_update_connect_params()
12145 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); in nl80211_update_connect_params()
12147 } else if (info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] || in nl80211_update_connect_params()
12148 info->attrs[NL80211_ATTR_FILS_ERP_REALM] || in nl80211_update_connect_params()
12149 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] || in nl80211_update_connect_params()
12150 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { in nl80211_update_connect_params()
12151 return -EINVAL; in nl80211_update_connect_params()
12154 if (info->attrs[NL80211_ATTR_AUTH_TYPE]) { in nl80211_update_connect_params()
12155 auth_type = nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]); in nl80211_update_connect_params()
12158 return -EINVAL; in nl80211_update_connect_params()
12162 return -EINVAL; in nl80211_update_connect_params()
12168 if (!wdev->connected) in nl80211_update_connect_params()
12169 return -ENOLINK; in nl80211_update_connect_params()
12176 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_disconnect()
12177 struct net_device *dev = info->user_ptr[1]; in nl80211_disconnect()
12180 if (dev->ieee80211_ptr->conn_owner_nlportid && in nl80211_disconnect()
12181 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) in nl80211_disconnect()
12182 return -EPERM; in nl80211_disconnect()
12184 if (!info->attrs[NL80211_ATTR_REASON_CODE]) in nl80211_disconnect()
12187 reason = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); in nl80211_disconnect()
12190 return -EINVAL; in nl80211_disconnect()
12192 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_disconnect()
12193 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_disconnect()
12194 return -EOPNOTSUPP; in nl80211_disconnect()
12201 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_wiphy_netns()
12205 if (info->attrs[NL80211_ATTR_PID]) { in nl80211_wiphy_netns()
12206 u32 pid = nla_get_u32(info->attrs[NL80211_ATTR_PID]); in nl80211_wiphy_netns()
12209 } else if (info->attrs[NL80211_ATTR_NETNS_FD]) { in nl80211_wiphy_netns()
12210 u32 fd = nla_get_u32(info->attrs[NL80211_ATTR_NETNS_FD]); in nl80211_wiphy_netns()
12214 return -EINVAL; in nl80211_wiphy_netns()
12223 if (!net_eq(wiphy_net(&rdev->wiphy), net)) in nl80211_wiphy_netns()
12232 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_pmksa()
12233 struct net_device *dev = info->user_ptr[1]; in nl80211_set_pmksa()
12239 ap_pmksa_caching_support = wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_set_pmksa()
12242 if (!info->attrs[NL80211_ATTR_PMKID]) in nl80211_set_pmksa()
12243 return -EINVAL; in nl80211_set_pmksa()
12245 pmksa.pmkid = nla_data(info->attrs[NL80211_ATTR_PMKID]); in nl80211_set_pmksa()
12247 if (info->attrs[NL80211_ATTR_MAC]) { in nl80211_set_pmksa()
12248 pmksa.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_set_pmksa()
12249 } else if (info->attrs[NL80211_ATTR_SSID] && in nl80211_set_pmksa()
12250 info->attrs[NL80211_ATTR_FILS_CACHE_ID] && in nl80211_set_pmksa()
12251 info->attrs[NL80211_ATTR_PMK]) { in nl80211_set_pmksa()
12252 pmksa.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); in nl80211_set_pmksa()
12253 pmksa.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); in nl80211_set_pmksa()
12254 pmksa.cache_id = nla_data(info->attrs[NL80211_ATTR_FILS_CACHE_ID]); in nl80211_set_pmksa()
12256 return -EINVAL; in nl80211_set_pmksa()
12259 if (info->attrs[NL80211_ATTR_PMK]) { in nl80211_set_pmksa()
12260 pmksa.pmk = nla_data(info->attrs[NL80211_ATTR_PMK]); in nl80211_set_pmksa()
12261 pmksa.pmk_len = nla_len(info->attrs[NL80211_ATTR_PMK]); in nl80211_set_pmksa()
12264 if (info->attrs[NL80211_ATTR_PMK_LIFETIME]) in nl80211_set_pmksa()
12266 nla_get_u32(info->attrs[NL80211_ATTR_PMK_LIFETIME]); in nl80211_set_pmksa()
12268 if (info->attrs[NL80211_ATTR_PMK_REAUTH_THRESHOLD]) in nl80211_set_pmksa()
12270 nla_get_u8(info->attrs[NL80211_ATTR_PMK_REAUTH_THRESHOLD]); in nl80211_set_pmksa()
12272 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_set_pmksa()
12273 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT && in nl80211_set_pmksa()
12274 !((dev->ieee80211_ptr->iftype == NL80211_IFTYPE_AP || in nl80211_set_pmksa()
12275 dev->ieee80211_ptr->iftype == NL80211_IFTYPE_P2P_GO) && in nl80211_set_pmksa()
12277 return -EOPNOTSUPP; in nl80211_set_pmksa()
12279 if (!rdev->ops->set_pmksa) in nl80211_set_pmksa()
12280 return -EOPNOTSUPP; in nl80211_set_pmksa()
12287 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_del_pmksa()
12288 struct net_device *dev = info->user_ptr[1]; in nl80211_del_pmksa()
12296 sae_offload_support = wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_del_pmksa()
12298 owe_offload_support = wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_del_pmksa()
12300 ap_pmksa_caching_support = wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_del_pmksa()
12303 if (info->attrs[NL80211_ATTR_PMKID]) in nl80211_del_pmksa()
12304 pmksa.pmkid = nla_data(info->attrs[NL80211_ATTR_PMKID]); in nl80211_del_pmksa()
12306 if (info->attrs[NL80211_ATTR_MAC]) { in nl80211_del_pmksa()
12307 pmksa.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_del_pmksa()
12308 } else if (info->attrs[NL80211_ATTR_SSID]) { in nl80211_del_pmksa()
12312 if (info->attrs[NL80211_ATTR_FILS_CACHE_ID] && in nl80211_del_pmksa()
12313 info->attrs[NL80211_ATTR_PMK]) { in nl80211_del_pmksa()
12314 pmksa.cache_id = nla_data(info->attrs[NL80211_ATTR_FILS_CACHE_ID]); in nl80211_del_pmksa()
12316 return -EINVAL; in nl80211_del_pmksa()
12318 pmksa.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); in nl80211_del_pmksa()
12319 pmksa.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); in nl80211_del_pmksa()
12321 return -EINVAL; in nl80211_del_pmksa()
12324 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_del_pmksa()
12325 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT && in nl80211_del_pmksa()
12326 !((dev->ieee80211_ptr->iftype == NL80211_IFTYPE_AP || in nl80211_del_pmksa()
12327 dev->ieee80211_ptr->iftype == NL80211_IFTYPE_P2P_GO) && in nl80211_del_pmksa()
12329 return -EOPNOTSUPP; in nl80211_del_pmksa()
12331 if (!rdev->ops->del_pmksa) in nl80211_del_pmksa()
12332 return -EOPNOTSUPP; in nl80211_del_pmksa()
12339 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_flush_pmksa()
12340 struct net_device *dev = info->user_ptr[1]; in nl80211_flush_pmksa()
12342 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_flush_pmksa()
12343 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_flush_pmksa()
12344 return -EOPNOTSUPP; in nl80211_flush_pmksa()
12346 if (!rdev->ops->flush_pmksa) in nl80211_flush_pmksa()
12347 return -EOPNOTSUPP; in nl80211_flush_pmksa()
12354 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_tdls_mgmt()
12355 struct net_device *dev = info->user_ptr[1]; in nl80211_tdls_mgmt()
12363 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) || in nl80211_tdls_mgmt()
12364 !rdev->ops->tdls_mgmt) in nl80211_tdls_mgmt()
12365 return -EOPNOTSUPP; in nl80211_tdls_mgmt()
12367 if (!info->attrs[NL80211_ATTR_TDLS_ACTION] || in nl80211_tdls_mgmt()
12368 !info->attrs[NL80211_ATTR_STATUS_CODE] || in nl80211_tdls_mgmt()
12369 !info->attrs[NL80211_ATTR_TDLS_DIALOG_TOKEN] || in nl80211_tdls_mgmt()
12370 !info->attrs[NL80211_ATTR_IE] || in nl80211_tdls_mgmt()
12371 !info->attrs[NL80211_ATTR_MAC]) in nl80211_tdls_mgmt()
12372 return -EINVAL; in nl80211_tdls_mgmt()
12374 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_tdls_mgmt()
12375 action_code = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_ACTION]); in nl80211_tdls_mgmt()
12376 status_code = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]); in nl80211_tdls_mgmt()
12377 dialog_token = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_DIALOG_TOKEN]); in nl80211_tdls_mgmt()
12378 initiator = nla_get_flag(info->attrs[NL80211_ATTR_TDLS_INITIATOR]); in nl80211_tdls_mgmt()
12379 if (info->attrs[NL80211_ATTR_TDLS_PEER_CAPABILITY]) in nl80211_tdls_mgmt()
12381 nla_get_u32(info->attrs[NL80211_ATTR_TDLS_PEER_CAPABILITY]); in nl80211_tdls_mgmt()
12382 link_id = nl80211_link_id_or_invalid(info->attrs); in nl80211_tdls_mgmt()
12387 nla_data(info->attrs[NL80211_ATTR_IE]), in nl80211_tdls_mgmt()
12388 nla_len(info->attrs[NL80211_ATTR_IE])); in nl80211_tdls_mgmt()
12393 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_tdls_oper()
12394 struct net_device *dev = info->user_ptr[1]; in nl80211_tdls_oper()
12398 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) || in nl80211_tdls_oper()
12399 !rdev->ops->tdls_oper) in nl80211_tdls_oper()
12400 return -EOPNOTSUPP; in nl80211_tdls_oper()
12402 if (!info->attrs[NL80211_ATTR_TDLS_OPERATION] || in nl80211_tdls_oper()
12403 !info->attrs[NL80211_ATTR_MAC]) in nl80211_tdls_oper()
12404 return -EINVAL; in nl80211_tdls_oper()
12406 operation = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_OPERATION]); in nl80211_tdls_oper()
12407 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_tdls_oper()
12415 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_remain_on_channel()
12416 unsigned int link_id = nl80211_link_id(info->attrs); in nl80211_remain_on_channel()
12417 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_remain_on_channel()
12425 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ] || in nl80211_remain_on_channel()
12426 !info->attrs[NL80211_ATTR_DURATION]) in nl80211_remain_on_channel()
12427 return -EINVAL; in nl80211_remain_on_channel()
12429 duration = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]); in nl80211_remain_on_channel()
12431 if (!rdev->ops->remain_on_channel || in nl80211_remain_on_channel()
12432 !(rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL)) in nl80211_remain_on_channel()
12433 return -EOPNOTSUPP; in nl80211_remain_on_channel()
12440 duration > rdev->wiphy.max_remain_on_channel_duration) in nl80211_remain_on_channel()
12441 return -EINVAL; in nl80211_remain_on_channel()
12455 return -EBUSY; in nl80211_remain_on_channel()
12463 return -EBUSY; in nl80211_remain_on_channel()
12468 return -ENOMEM; in nl80211_remain_on_channel()
12470 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_remain_on_channel()
12473 err = -ENOBUFS; in nl80211_remain_on_channel()
12492 err = -ENOBUFS; in nl80211_remain_on_channel()
12501 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_cancel_remain_on_channel()
12502 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_cancel_remain_on_channel()
12505 if (!info->attrs[NL80211_ATTR_COOKIE]) in nl80211_cancel_remain_on_channel()
12506 return -EINVAL; in nl80211_cancel_remain_on_channel()
12508 if (!rdev->ops->cancel_remain_on_channel) in nl80211_cancel_remain_on_channel()
12509 return -EOPNOTSUPP; in nl80211_cancel_remain_on_channel()
12511 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); in nl80211_cancel_remain_on_channel()
12520 unsigned int link_id = nl80211_link_id(info->attrs); in nl80211_set_tx_bitrate_mask()
12521 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_tx_bitrate_mask()
12522 struct net_device *dev = info->user_ptr[1]; in nl80211_set_tx_bitrate_mask()
12525 if (!rdev->ops->set_bitrate_mask) in nl80211_set_tx_bitrate_mask()
12526 return -EOPNOTSUPP; in nl80211_set_tx_bitrate_mask()
12528 err = nl80211_parse_tx_bitrate_mask(info, info->attrs, in nl80211_set_tx_bitrate_mask()
12539 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_register_mgmt()
12540 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_register_mgmt()
12543 if (!info->attrs[NL80211_ATTR_FRAME_MATCH]) in nl80211_register_mgmt()
12544 return -EINVAL; in nl80211_register_mgmt()
12546 if (info->attrs[NL80211_ATTR_FRAME_TYPE]) in nl80211_register_mgmt()
12547 frame_type = nla_get_u16(info->attrs[NL80211_ATTR_FRAME_TYPE]); in nl80211_register_mgmt()
12549 switch (wdev->iftype) { in nl80211_register_mgmt()
12560 if (!wiphy_ext_feature_isset(wdev->wiphy, in nl80211_register_mgmt()
12562 return -EOPNOTSUPP; in nl80211_register_mgmt()
12565 return -EOPNOTSUPP; in nl80211_register_mgmt()
12569 if (!rdev->ops->mgmt_tx) in nl80211_register_mgmt()
12570 return -EOPNOTSUPP; in nl80211_register_mgmt()
12572 if (info->attrs[NL80211_ATTR_RECEIVE_MULTICAST] && in nl80211_register_mgmt()
12573 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_register_mgmt()
12577 return -EOPNOTSUPP; in nl80211_register_mgmt()
12580 return cfg80211_mlme_register_mgmt(wdev, info->snd_portid, frame_type, in nl80211_register_mgmt()
12581 nla_data(info->attrs[NL80211_ATTR_FRAME_MATCH]), in nl80211_register_mgmt()
12582 nla_len(info->attrs[NL80211_ATTR_FRAME_MATCH]), in nl80211_register_mgmt()
12583 info->attrs[NL80211_ATTR_RECEIVE_MULTICAST], in nl80211_register_mgmt()
12584 info->extack); in nl80211_register_mgmt()
12589 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_tx_mgmt()
12590 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_tx_mgmt()
12598 info->attrs[NL80211_ATTR_DONT_WAIT_FOR_ACK], in nl80211_tx_mgmt()
12601 if (!info->attrs[NL80211_ATTR_FRAME]) in nl80211_tx_mgmt()
12602 return -EINVAL; in nl80211_tx_mgmt()
12604 if (!rdev->ops->mgmt_tx) in nl80211_tx_mgmt()
12605 return -EOPNOTSUPP; in nl80211_tx_mgmt()
12607 switch (wdev->iftype) { in nl80211_tx_mgmt()
12609 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ]) in nl80211_tx_mgmt()
12610 return -EINVAL; in nl80211_tx_mgmt()
12621 if (!wiphy_ext_feature_isset(wdev->wiphy, in nl80211_tx_mgmt()
12623 return -EOPNOTSUPP; in nl80211_tx_mgmt()
12626 return -EOPNOTSUPP; in nl80211_tx_mgmt()
12629 if (info->attrs[NL80211_ATTR_DURATION]) { in nl80211_tx_mgmt()
12630 if (!(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX)) in nl80211_tx_mgmt()
12631 return -EINVAL; in nl80211_tx_mgmt()
12632 params.wait = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]); in nl80211_tx_mgmt()
12639 params.wait > rdev->wiphy.max_remain_on_channel_duration) in nl80211_tx_mgmt()
12640 return -EINVAL; in nl80211_tx_mgmt()
12643 params.offchan = info->attrs[NL80211_ATTR_OFFCHANNEL_TX_OK]; in nl80211_tx_mgmt()
12645 if (params.offchan && !(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX)) in nl80211_tx_mgmt()
12646 return -EINVAL; in nl80211_tx_mgmt()
12648 params.no_cck = nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]); in nl80211_tx_mgmt()
12654 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { in nl80211_tx_mgmt()
12661 return -EINVAL; in nl80211_tx_mgmt()
12665 return -EBUSY; in nl80211_tx_mgmt()
12667 params.link_id = nl80211_link_id_or_invalid(info->attrs); in nl80211_tx_mgmt()
12674 !(wdev->valid_links & BIT(params.link_id))) in nl80211_tx_mgmt()
12675 return -EINVAL; in nl80211_tx_mgmt()
12677 params.buf = nla_data(info->attrs[NL80211_ATTR_FRAME]); in nl80211_tx_mgmt()
12678 params.len = nla_len(info->attrs[NL80211_ATTR_FRAME]); in nl80211_tx_mgmt()
12680 if (info->attrs[NL80211_ATTR_CSA_C_OFFSETS_TX]) { in nl80211_tx_mgmt()
12681 int len = nla_len(info->attrs[NL80211_ATTR_CSA_C_OFFSETS_TX]); in nl80211_tx_mgmt()
12685 return -EINVAL; in nl80211_tx_mgmt()
12689 nla_data(info->attrs[NL80211_ATTR_CSA_C_OFFSETS_TX]); in nl80211_tx_mgmt()
12694 return -EINVAL; in nl80211_tx_mgmt()
12701 return -ENOMEM; in nl80211_tx_mgmt()
12703 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_tx_mgmt()
12706 err = -ENOBUFS; in nl80211_tx_mgmt()
12728 err = -ENOBUFS; in nl80211_tx_mgmt()
12736 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_tx_mgmt_cancel_wait()
12737 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_tx_mgmt_cancel_wait()
12740 if (!info->attrs[NL80211_ATTR_COOKIE]) in nl80211_tx_mgmt_cancel_wait()
12741 return -EINVAL; in nl80211_tx_mgmt_cancel_wait()
12743 if (!rdev->ops->mgmt_tx_cancel_wait) in nl80211_tx_mgmt_cancel_wait()
12744 return -EOPNOTSUPP; in nl80211_tx_mgmt_cancel_wait()
12746 switch (wdev->iftype) { in nl80211_tx_mgmt_cancel_wait()
12756 if (!wiphy_ext_feature_isset(wdev->wiphy, in nl80211_tx_mgmt_cancel_wait()
12758 return -EOPNOTSUPP; in nl80211_tx_mgmt_cancel_wait()
12761 return -EOPNOTSUPP; in nl80211_tx_mgmt_cancel_wait()
12764 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); in nl80211_tx_mgmt_cancel_wait()
12771 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_power_save()
12773 struct net_device *dev = info->user_ptr[1]; in nl80211_set_power_save()
12778 if (!info->attrs[NL80211_ATTR_PS_STATE]) in nl80211_set_power_save()
12779 return -EINVAL; in nl80211_set_power_save()
12781 ps_state = nla_get_u32(info->attrs[NL80211_ATTR_PS_STATE]); in nl80211_set_power_save()
12783 wdev = dev->ieee80211_ptr; in nl80211_set_power_save()
12785 if (!rdev->ops->set_power_mgmt) in nl80211_set_power_save()
12786 return -EOPNOTSUPP; in nl80211_set_power_save()
12790 if (state == wdev->ps) in nl80211_set_power_save()
12793 err = rdev_set_power_mgmt(rdev, dev, state, wdev->ps_timeout); in nl80211_set_power_save()
12795 wdev->ps = state; in nl80211_set_power_save()
12801 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_power_save()
12804 struct net_device *dev = info->user_ptr[1]; in nl80211_get_power_save()
12809 wdev = dev->ieee80211_ptr; in nl80211_get_power_save()
12811 if (!rdev->ops->set_power_mgmt) in nl80211_get_power_save()
12812 return -EOPNOTSUPP; in nl80211_get_power_save()
12816 return -ENOMEM; in nl80211_get_power_save()
12818 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_power_save()
12821 err = -ENOBUFS; in nl80211_get_power_save()
12825 if (wdev->ps) in nl80211_get_power_save()
12837 err = -ENOBUFS; in nl80211_get_power_save()
12857 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_cqm_txe()
12858 struct net_device *dev = info->user_ptr[1]; in nl80211_set_cqm_txe()
12859 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_cqm_txe()
12862 return -EINVAL; in nl80211_set_cqm_txe()
12864 if (!rdev->ops->set_cqm_txe_config) in nl80211_set_cqm_txe()
12865 return -EOPNOTSUPP; in nl80211_set_cqm_txe()
12867 if (wdev->iftype != NL80211_IFTYPE_STATION && in nl80211_set_cqm_txe()
12868 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_set_cqm_txe()
12869 return -EOPNOTSUPP; in nl80211_set_cqm_txe()
12878 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_cqm_rssi_update()
12890 if (!cqm_config->last_rssi_event_value && in cfg80211_cqm_rssi_update()
12891 wdev->links[0].client.current_bss && in cfg80211_cqm_rssi_update()
12892 rdev->ops->get_station) { in cfg80211_cqm_rssi_update()
12896 mac_addr = wdev->links[0].client.current_bss->pub.bssid; in cfg80211_cqm_rssi_update()
12904 cqm_config->last_rssi_event_value = in cfg80211_cqm_rssi_update()
12908 last = cqm_config->last_rssi_event_value; in cfg80211_cqm_rssi_update()
12909 hyst = cqm_config->rssi_hyst; in cfg80211_cqm_rssi_update()
12910 n = cqm_config->n_rssi_thresholds; in cfg80211_cqm_rssi_update()
12914 if (last < cqm_config->rssi_thresholds[i]) in cfg80211_cqm_rssi_update()
12918 low_index = i - 1; in cfg80211_cqm_rssi_update()
12921 low = cqm_config->rssi_thresholds[low_index] - hyst; in cfg80211_cqm_rssi_update()
12927 high = cqm_config->rssi_thresholds[i] + hyst - 1; in cfg80211_cqm_rssi_update()
12939 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_cqm_rssi()
12941 struct net_device *dev = info->user_ptr[1]; in nl80211_set_cqm_rssi()
12942 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_cqm_rssi()
12949 return -EINVAL; in nl80211_set_cqm_rssi()
12954 if (wdev->iftype != NL80211_IFTYPE_STATION && in nl80211_set_cqm_rssi()
12955 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_set_cqm_rssi()
12956 return -EOPNOTSUPP; in nl80211_set_cqm_rssi()
12961 old = wiphy_dereference(wdev->wiphy, wdev->cqm_config); in nl80211_set_cqm_rssi()
12968 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_set_cqm_rssi()
12970 !rdev->ops->set_cqm_rssi_range_config) in nl80211_set_cqm_rssi()
12971 return -EOPNOTSUPP; in nl80211_set_cqm_rssi()
12973 if (!rdev->ops->set_cqm_rssi_config) in nl80211_set_cqm_rssi()
12974 return -EOPNOTSUPP; in nl80211_set_cqm_rssi()
12982 return -ENOMEM; in nl80211_set_cqm_rssi()
12984 cqm_config->rssi_hyst = hysteresis; in nl80211_set_cqm_rssi()
12985 cqm_config->n_rssi_thresholds = n_thresholds; in nl80211_set_cqm_rssi()
12986 memcpy(cqm_config->rssi_thresholds, thresholds, in nl80211_set_cqm_rssi()
12989 cqm_config->use_range_api = n_thresholds > 1 || in nl80211_set_cqm_rssi()
12990 !rdev->ops->set_cqm_rssi_config; in nl80211_set_cqm_rssi()
12992 rcu_assign_pointer(wdev->cqm_config, cqm_config); in nl80211_set_cqm_rssi()
12994 if (cqm_config->use_range_api) in nl80211_set_cqm_rssi()
13001 RCU_INIT_POINTER(wdev->cqm_config, NULL); in nl80211_set_cqm_rssi()
13003 if (old->use_range_api) in nl80211_set_cqm_rssi()
13010 rcu_assign_pointer(wdev->cqm_config, old); in nl80211_set_cqm_rssi()
13025 cqm = info->attrs[NL80211_ATTR_CQM]; in nl80211_set_cqm()
13027 return -EINVAL; in nl80211_set_cqm()
13031 info->extack); in nl80211_set_cqm()
13043 return -EINVAL; in nl80211_set_cqm()
13059 return -EINVAL; in nl80211_set_cqm()
13064 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_join_ocb()
13065 struct net_device *dev = info->user_ptr[1]; in nl80211_join_ocb()
13078 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_leave_ocb()
13079 struct net_device *dev = info->user_ptr[1]; in nl80211_leave_ocb()
13086 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_join_mesh()
13087 struct net_device *dev = info->user_ptr[1]; in nl80211_join_mesh()
13096 if (info->attrs[NL80211_ATTR_MESH_CONFIG]) { in nl80211_join_mesh()
13103 if (!info->attrs[NL80211_ATTR_MESH_ID] || in nl80211_join_mesh()
13104 !nla_len(info->attrs[NL80211_ATTR_MESH_ID])) in nl80211_join_mesh()
13105 return -EINVAL; in nl80211_join_mesh()
13107 setup.mesh_id = nla_data(info->attrs[NL80211_ATTR_MESH_ID]); in nl80211_join_mesh()
13108 setup.mesh_id_len = nla_len(info->attrs[NL80211_ATTR_MESH_ID]); in nl80211_join_mesh()
13110 if (info->attrs[NL80211_ATTR_MCAST_RATE] && in nl80211_join_mesh()
13112 nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]))) in nl80211_join_mesh()
13113 return -EINVAL; in nl80211_join_mesh()
13115 if (info->attrs[NL80211_ATTR_BEACON_INTERVAL]) { in nl80211_join_mesh()
13117 nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]); in nl80211_join_mesh()
13126 if (info->attrs[NL80211_ATTR_DTIM_PERIOD]) { in nl80211_join_mesh()
13128 nla_get_u32(info->attrs[NL80211_ATTR_DTIM_PERIOD]); in nl80211_join_mesh()
13130 return -EINVAL; in nl80211_join_mesh()
13133 if (info->attrs[NL80211_ATTR_MESH_SETUP]) { in nl80211_join_mesh()
13143 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { in nl80211_join_mesh()
13152 if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) { in nl80211_join_mesh()
13153 u8 *rates = nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); in nl80211_join_mesh()
13155 nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); in nl80211_join_mesh()
13159 return -EINVAL; in nl80211_join_mesh()
13161 sband = rdev->wiphy.bands[setup.chandef.chan->band]; in nl80211_join_mesh()
13169 if (info->attrs[NL80211_ATTR_TX_RATES]) { in nl80211_join_mesh()
13170 err = nl80211_parse_tx_bitrate_mask(info, info->attrs, in nl80211_join_mesh()
13178 return -EINVAL; in nl80211_join_mesh()
13180 err = validate_beacon_tx_rate(rdev, setup.chandef.chan->band, in nl80211_join_mesh()
13187 nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS]); in nl80211_join_mesh()
13189 if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) { in nl80211_join_mesh()
13199 if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) in nl80211_join_mesh()
13200 dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid; in nl80211_join_mesh()
13207 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_leave_mesh()
13208 struct net_device *dev = info->user_ptr[1]; in nl80211_leave_mesh()
13217 struct cfg80211_wowlan *wowlan = rdev->wiphy.wowlan_config; in nl80211_send_wowlan_patterns()
13221 if (!wowlan->n_patterns) in nl80211_send_wowlan_patterns()
13226 return -ENOBUFS; in nl80211_send_wowlan_patterns()
13228 for (i = 0; i < wowlan->n_patterns; i++) { in nl80211_send_wowlan_patterns()
13231 return -ENOBUFS; in nl80211_send_wowlan_patterns()
13232 pat_len = wowlan->patterns[i].pattern_len; in nl80211_send_wowlan_patterns()
13234 wowlan->patterns[i].mask) || in nl80211_send_wowlan_patterns()
13236 wowlan->patterns[i].pattern) || in nl80211_send_wowlan_patterns()
13238 wowlan->patterns[i].pkt_offset)) in nl80211_send_wowlan_patterns()
13239 return -ENOBUFS; in nl80211_send_wowlan_patterns()
13258 return -ENOBUFS; in nl80211_send_wowlan_tcp()
13260 if (nla_put_in_addr(msg, NL80211_WOWLAN_TCP_SRC_IPV4, tcp->src) || in nl80211_send_wowlan_tcp()
13261 nla_put_in_addr(msg, NL80211_WOWLAN_TCP_DST_IPV4, tcp->dst) || in nl80211_send_wowlan_tcp()
13262 nla_put(msg, NL80211_WOWLAN_TCP_DST_MAC, ETH_ALEN, tcp->dst_mac) || in nl80211_send_wowlan_tcp()
13263 nla_put_u16(msg, NL80211_WOWLAN_TCP_SRC_PORT, tcp->src_port) || in nl80211_send_wowlan_tcp()
13264 nla_put_u16(msg, NL80211_WOWLAN_TCP_DST_PORT, tcp->dst_port) || in nl80211_send_wowlan_tcp()
13266 tcp->payload_len, tcp->payload) || in nl80211_send_wowlan_tcp()
13268 tcp->data_interval) || in nl80211_send_wowlan_tcp()
13270 tcp->wake_len, tcp->wake_data) || in nl80211_send_wowlan_tcp()
13272 DIV_ROUND_UP(tcp->wake_len, 8), tcp->wake_mask)) in nl80211_send_wowlan_tcp()
13273 return -ENOBUFS; in nl80211_send_wowlan_tcp()
13275 if (tcp->payload_seq.len && in nl80211_send_wowlan_tcp()
13277 sizeof(tcp->payload_seq), &tcp->payload_seq)) in nl80211_send_wowlan_tcp()
13278 return -ENOBUFS; in nl80211_send_wowlan_tcp()
13280 if (tcp->payload_tok.len && in nl80211_send_wowlan_tcp()
13282 sizeof(tcp->payload_tok) + tcp->tokens_size, in nl80211_send_wowlan_tcp()
13283 &tcp->payload_tok)) in nl80211_send_wowlan_tcp()
13284 return -ENOBUFS; in nl80211_send_wowlan_tcp()
13302 return -ENOBUFS; in nl80211_send_wowlan_nd()
13304 if (req->n_scan_plans == 1 && in nl80211_send_wowlan_nd()
13306 req->scan_plans[0].interval * 1000)) in nl80211_send_wowlan_nd()
13307 return -ENOBUFS; in nl80211_send_wowlan_nd()
13309 if (nla_put_u32(msg, NL80211_ATTR_SCHED_SCAN_DELAY, req->delay)) in nl80211_send_wowlan_nd()
13310 return -ENOBUFS; in nl80211_send_wowlan_nd()
13312 if (req->relative_rssi_set) { in nl80211_send_wowlan_nd()
13316 req->relative_rssi)) in nl80211_send_wowlan_nd()
13317 return -ENOBUFS; in nl80211_send_wowlan_nd()
13319 rssi_adjust.band = req->rssi_adjust.band; in nl80211_send_wowlan_nd()
13320 rssi_adjust.delta = req->rssi_adjust.delta; in nl80211_send_wowlan_nd()
13323 return -ENOBUFS; in nl80211_send_wowlan_nd()
13328 return -ENOBUFS; in nl80211_send_wowlan_nd()
13330 for (i = 0; i < req->n_channels; i++) { in nl80211_send_wowlan_nd()
13331 if (nla_put_u32(msg, i, req->channels[i]->center_freq)) in nl80211_send_wowlan_nd()
13332 return -ENOBUFS; in nl80211_send_wowlan_nd()
13337 if (req->n_match_sets) { in nl80211_send_wowlan_nd()
13341 return -ENOBUFS; in nl80211_send_wowlan_nd()
13343 for (i = 0; i < req->n_match_sets; i++) { in nl80211_send_wowlan_nd()
13346 return -ENOBUFS; in nl80211_send_wowlan_nd()
13349 req->match_sets[i].ssid.ssid_len, in nl80211_send_wowlan_nd()
13350 req->match_sets[i].ssid.ssid)) in nl80211_send_wowlan_nd()
13351 return -ENOBUFS; in nl80211_send_wowlan_nd()
13359 return -ENOBUFS; in nl80211_send_wowlan_nd()
13361 for (i = 0; i < req->n_scan_plans; i++) { in nl80211_send_wowlan_nd()
13364 return -ENOBUFS; in nl80211_send_wowlan_nd()
13367 req->scan_plans[i].interval) || in nl80211_send_wowlan_nd()
13368 (req->scan_plans[i].iterations && in nl80211_send_wowlan_nd()
13370 req->scan_plans[i].iterations))) in nl80211_send_wowlan_nd()
13371 return -ENOBUFS; in nl80211_send_wowlan_nd()
13383 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_wowlan()
13388 if (!rdev->wiphy.wowlan) in nl80211_get_wowlan()
13389 return -EOPNOTSUPP; in nl80211_get_wowlan()
13391 if (rdev->wiphy.wowlan_config && rdev->wiphy.wowlan_config->tcp) { in nl80211_get_wowlan()
13393 size += rdev->wiphy.wowlan_config->tcp->tokens_size + in nl80211_get_wowlan()
13394 rdev->wiphy.wowlan_config->tcp->payload_len + in nl80211_get_wowlan()
13395 rdev->wiphy.wowlan_config->tcp->wake_len + in nl80211_get_wowlan()
13396 rdev->wiphy.wowlan_config->tcp->wake_len / 8; in nl80211_get_wowlan()
13401 return -ENOMEM; in nl80211_get_wowlan()
13403 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_wowlan()
13408 if (rdev->wiphy.wowlan_config) { in nl80211_get_wowlan()
13416 if ((rdev->wiphy.wowlan_config->any && in nl80211_get_wowlan()
13418 (rdev->wiphy.wowlan_config->disconnect && in nl80211_get_wowlan()
13420 (rdev->wiphy.wowlan_config->magic_pkt && in nl80211_get_wowlan()
13422 (rdev->wiphy.wowlan_config->gtk_rekey_failure && in nl80211_get_wowlan()
13424 (rdev->wiphy.wowlan_config->eap_identity_req && in nl80211_get_wowlan()
13426 (rdev->wiphy.wowlan_config->four_way_handshake && in nl80211_get_wowlan()
13428 (rdev->wiphy.wowlan_config->rfkill_release && in nl80211_get_wowlan()
13436 rdev->wiphy.wowlan_config->tcp)) in nl80211_get_wowlan()
13441 rdev->wiphy.wowlan_config->nd_config)) in nl80211_get_wowlan()
13452 return -ENOBUFS; in nl80211_get_wowlan()
13467 if (!rdev->wiphy.wowlan->tcp) in nl80211_parse_wowlan_tcp()
13468 return -EINVAL; in nl80211_parse_wowlan_tcp()
13483 return -EINVAL; in nl80211_parse_wowlan_tcp()
13486 if (data_size > rdev->wiphy.wowlan->tcp->data_payload_max) in nl80211_parse_wowlan_tcp()
13487 return -EINVAL; in nl80211_parse_wowlan_tcp()
13490 rdev->wiphy.wowlan->tcp->data_interval_max || in nl80211_parse_wowlan_tcp()
13492 return -EINVAL; in nl80211_parse_wowlan_tcp()
13495 if (wake_size > rdev->wiphy.wowlan->tcp->wake_payload_max) in nl80211_parse_wowlan_tcp()
13496 return -EINVAL; in nl80211_parse_wowlan_tcp()
13500 return -EINVAL; in nl80211_parse_wowlan_tcp()
13506 tokens_size = tokln - sizeof(*tok); in nl80211_parse_wowlan_tcp()
13508 if (!tok->len || tokens_size % tok->len) in nl80211_parse_wowlan_tcp()
13509 return -EINVAL; in nl80211_parse_wowlan_tcp()
13510 if (!rdev->wiphy.wowlan->tcp->tok) in nl80211_parse_wowlan_tcp()
13511 return -EINVAL; in nl80211_parse_wowlan_tcp()
13512 if (tok->len > rdev->wiphy.wowlan->tcp->tok->max_len) in nl80211_parse_wowlan_tcp()
13513 return -EINVAL; in nl80211_parse_wowlan_tcp()
13514 if (tok->len < rdev->wiphy.wowlan->tcp->tok->min_len) in nl80211_parse_wowlan_tcp()
13515 return -EINVAL; in nl80211_parse_wowlan_tcp()
13516 if (tokens_size > rdev->wiphy.wowlan->tcp->tok->bufsize) in nl80211_parse_wowlan_tcp()
13517 return -EINVAL; in nl80211_parse_wowlan_tcp()
13518 if (tok->offset + tok->len > data_size) in nl80211_parse_wowlan_tcp()
13519 return -EINVAL; in nl80211_parse_wowlan_tcp()
13524 if (!rdev->wiphy.wowlan->tcp->seq) in nl80211_parse_wowlan_tcp()
13525 return -EINVAL; in nl80211_parse_wowlan_tcp()
13526 if (seq->len == 0 || seq->len > 4) in nl80211_parse_wowlan_tcp()
13527 return -EINVAL; in nl80211_parse_wowlan_tcp()
13528 if (seq->len + seq->offset > data_size) in nl80211_parse_wowlan_tcp()
13529 return -EINVAL; in nl80211_parse_wowlan_tcp()
13539 return -ENOMEM; in nl80211_parse_wowlan_tcp()
13540 cfg->src = nla_get_in_addr(tb[NL80211_WOWLAN_TCP_SRC_IPV4]); in nl80211_parse_wowlan_tcp()
13541 cfg->dst = nla_get_in_addr(tb[NL80211_WOWLAN_TCP_DST_IPV4]); in nl80211_parse_wowlan_tcp()
13542 memcpy(cfg->dst_mac, nla_data(tb[NL80211_WOWLAN_TCP_DST_MAC]), in nl80211_parse_wowlan_tcp()
13550 err = __sock_create(wiphy_net(&rdev->wiphy), PF_INET, SOCK_STREAM, in nl80211_parse_wowlan_tcp()
13551 IPPROTO_TCP, &cfg->sock, 1); in nl80211_parse_wowlan_tcp()
13556 if (inet_csk_get_port(cfg->sock->sk, port)) { in nl80211_parse_wowlan_tcp()
13557 sock_release(cfg->sock); in nl80211_parse_wowlan_tcp()
13559 return -EADDRINUSE; in nl80211_parse_wowlan_tcp()
13561 cfg->src_port = inet_sk(cfg->sock->sk)->inet_num; in nl80211_parse_wowlan_tcp()
13565 return -EINVAL; in nl80211_parse_wowlan_tcp()
13567 cfg->src_port = port; in nl80211_parse_wowlan_tcp()
13570 cfg->dst_port = nla_get_u16(tb[NL80211_WOWLAN_TCP_DST_PORT]); in nl80211_parse_wowlan_tcp()
13571 cfg->payload_len = data_size; in nl80211_parse_wowlan_tcp()
13572 cfg->payload = (u8 *)cfg + sizeof(*cfg) + tokens_size; in nl80211_parse_wowlan_tcp()
13573 memcpy((void *)cfg->payload, in nl80211_parse_wowlan_tcp()
13577 cfg->payload_seq = *seq; in nl80211_parse_wowlan_tcp()
13578 cfg->data_interval = nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]); in nl80211_parse_wowlan_tcp()
13579 cfg->wake_len = wake_size; in nl80211_parse_wowlan_tcp()
13580 cfg->wake_data = (u8 *)cfg + sizeof(*cfg) + tokens_size + data_size; in nl80211_parse_wowlan_tcp()
13581 memcpy((void *)cfg->wake_data, in nl80211_parse_wowlan_tcp()
13584 cfg->wake_mask = (u8 *)cfg + sizeof(*cfg) + tokens_size + in nl80211_parse_wowlan_tcp()
13586 memcpy((void *)cfg->wake_mask, in nl80211_parse_wowlan_tcp()
13590 cfg->tokens_size = tokens_size; in nl80211_parse_wowlan_tcp()
13591 cfg->payload_tok = *tok; in nl80211_parse_wowlan_tcp()
13592 memcpy(cfg->payload_tok.token_stream, tok->token_stream, in nl80211_parse_wowlan_tcp()
13596 trig->tcp = cfg; in nl80211_parse_wowlan_tcp()
13611 return -ENOMEM; in nl80211_parse_wowlan_nd()
13613 if (!(wowlan->flags & WIPHY_WOWLAN_NET_DETECT)) { in nl80211_parse_wowlan_nd()
13614 err = -EOPNOTSUPP; in nl80211_parse_wowlan_nd()
13623 trig->nd_config = nl80211_parse_sched_scan(&rdev->wiphy, NULL, tb, in nl80211_parse_wowlan_nd()
13624 wowlan->max_nd_match_sets); in nl80211_parse_wowlan_nd()
13625 err = PTR_ERR_OR_ZERO(trig->nd_config); in nl80211_parse_wowlan_nd()
13627 trig->nd_config = NULL; in nl80211_parse_wowlan_nd()
13636 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_wowlan()
13640 const struct wiphy_wowlan_support *wowlan = rdev->wiphy.wowlan; in nl80211_set_wowlan()
13642 bool prev_enabled = rdev->wiphy.wowlan_config; in nl80211_set_wowlan()
13646 return -EOPNOTSUPP; in nl80211_set_wowlan()
13648 if (!info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS]) { in nl80211_set_wowlan()
13650 rdev->wiphy.wowlan_config = NULL; in nl80211_set_wowlan()
13655 info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS], in nl80211_set_wowlan()
13656 nl80211_wowlan_policy, info->extack); in nl80211_set_wowlan()
13661 if (!(wowlan->flags & WIPHY_WOWLAN_ANY)) in nl80211_set_wowlan()
13662 return -EINVAL; in nl80211_set_wowlan()
13667 if (!(wowlan->flags & WIPHY_WOWLAN_DISCONNECT)) in nl80211_set_wowlan()
13668 return -EINVAL; in nl80211_set_wowlan()
13674 if (!(wowlan->flags & WIPHY_WOWLAN_MAGIC_PKT)) in nl80211_set_wowlan()
13675 return -EINVAL; in nl80211_set_wowlan()
13681 return -EINVAL; in nl80211_set_wowlan()
13684 if (!(wowlan->flags & WIPHY_WOWLAN_GTK_REKEY_FAILURE)) in nl80211_set_wowlan()
13685 return -EINVAL; in nl80211_set_wowlan()
13691 if (!(wowlan->flags & WIPHY_WOWLAN_EAP_IDENTITY_REQ)) in nl80211_set_wowlan()
13692 return -EINVAL; in nl80211_set_wowlan()
13698 if (!(wowlan->flags & WIPHY_WOWLAN_4WAY_HANDSHAKE)) in nl80211_set_wowlan()
13699 return -EINVAL; in nl80211_set_wowlan()
13705 if (!(wowlan->flags & WIPHY_WOWLAN_RFKILL_RELEASE)) in nl80211_set_wowlan()
13706 return -EINVAL; in nl80211_set_wowlan()
13722 if (n_patterns > wowlan->n_patterns) in nl80211_set_wowlan()
13723 return -EINVAL; in nl80211_set_wowlan()
13729 return -ENOMEM; in nl80211_set_wowlan()
13742 info->extack); in nl80211_set_wowlan()
13746 err = -EINVAL; in nl80211_set_wowlan()
13754 if (pat_len > wowlan->pattern_max_len || in nl80211_set_wowlan()
13755 pat_len < wowlan->pattern_min_len) in nl80211_set_wowlan()
13763 if (pkt_offset > wowlan->max_pkt_offset) in nl80211_set_wowlan()
13769 err = -ENOMEM; in nl80211_set_wowlan()
13810 err = -EINVAL; in nl80211_set_wowlan()
13816 err = -ENOMEM; in nl80211_set_wowlan()
13820 rdev->wiphy.wowlan_config = ntrig; in nl80211_set_wowlan()
13823 if (rdev->ops->set_wakeup && in nl80211_set_wowlan()
13824 prev_enabled != !!rdev->wiphy.wowlan_config) in nl80211_set_wowlan()
13825 rdev_set_wakeup(rdev, rdev->wiphy.wowlan_config); in nl80211_set_wowlan()
13832 if (new_triggers.tcp && new_triggers.tcp->sock) in nl80211_set_wowlan()
13833 sock_release(new_triggers.tcp->sock); in nl80211_set_wowlan()
13847 if (!rdev->coalesce->n_rules) in nl80211_send_coalesce_rules()
13852 return -ENOBUFS; in nl80211_send_coalesce_rules()
13854 for (i = 0; i < rdev->coalesce->n_rules; i++) { in nl80211_send_coalesce_rules()
13857 return -ENOBUFS; in nl80211_send_coalesce_rules()
13859 rule = &rdev->coalesce->rules[i]; in nl80211_send_coalesce_rules()
13861 rule->delay)) in nl80211_send_coalesce_rules()
13862 return -ENOBUFS; in nl80211_send_coalesce_rules()
13865 rule->condition)) in nl80211_send_coalesce_rules()
13866 return -ENOBUFS; in nl80211_send_coalesce_rules()
13871 return -ENOBUFS; in nl80211_send_coalesce_rules()
13873 for (j = 0; j < rule->n_patterns; j++) { in nl80211_send_coalesce_rules()
13876 return -ENOBUFS; in nl80211_send_coalesce_rules()
13877 pat_len = rule->patterns[j].pattern_len; in nl80211_send_coalesce_rules()
13880 rule->patterns[j].mask) || in nl80211_send_coalesce_rules()
13882 rule->patterns[j].pattern) || in nl80211_send_coalesce_rules()
13884 rule->patterns[j].pkt_offset)) in nl80211_send_coalesce_rules()
13885 return -ENOBUFS; in nl80211_send_coalesce_rules()
13898 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_coalesce()
13902 if (!rdev->wiphy.coalesce) in nl80211_get_coalesce()
13903 return -EOPNOTSUPP; in nl80211_get_coalesce()
13907 return -ENOMEM; in nl80211_get_coalesce()
13909 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_coalesce()
13914 if (rdev->coalesce && nl80211_send_coalesce_rules(msg, rdev)) in nl80211_get_coalesce()
13922 return -ENOBUFS; in nl80211_get_coalesce()
13927 struct cfg80211_coalesce *coalesce = rdev->coalesce; in cfg80211_rdev_free_coalesce()
13934 for (i = 0; i < coalesce->n_rules; i++) { in cfg80211_rdev_free_coalesce()
13935 rule = &coalesce->rules[i]; in cfg80211_rdev_free_coalesce()
13936 for (j = 0; j < rule->n_patterns; j++) in cfg80211_rdev_free_coalesce()
13937 kfree(rule->patterns[j].mask); in cfg80211_rdev_free_coalesce()
13938 kfree(rule->patterns); in cfg80211_rdev_free_coalesce()
13940 kfree(coalesce->rules); in cfg80211_rdev_free_coalesce()
13942 rdev->coalesce = NULL; in cfg80211_rdev_free_coalesce()
13950 const struct wiphy_coalesce_support *coalesce = rdev->wiphy.coalesce; in nl80211_parse_coalesce_rule()
13961 new_rule->delay = in nl80211_parse_coalesce_rule()
13963 if (new_rule->delay > coalesce->max_delay) in nl80211_parse_coalesce_rule()
13964 return -EINVAL; in nl80211_parse_coalesce_rule()
13967 new_rule->condition = in nl80211_parse_coalesce_rule()
13971 return -EINVAL; in nl80211_parse_coalesce_rule()
13976 if (n_patterns > coalesce->n_patterns) in nl80211_parse_coalesce_rule()
13977 return -EINVAL; in nl80211_parse_coalesce_rule()
13979 new_rule->patterns = kcalloc(n_patterns, sizeof(new_rule->patterns[0]), in nl80211_parse_coalesce_rule()
13981 if (!new_rule->patterns) in nl80211_parse_coalesce_rule()
13982 return -ENOMEM; in nl80211_parse_coalesce_rule()
13984 new_rule->n_patterns = n_patterns; in nl80211_parse_coalesce_rule()
14000 return -EINVAL; in nl80211_parse_coalesce_rule()
14004 return -EINVAL; in nl80211_parse_coalesce_rule()
14005 if (pat_len > coalesce->pattern_max_len || in nl80211_parse_coalesce_rule()
14006 pat_len < coalesce->pattern_min_len) in nl80211_parse_coalesce_rule()
14007 return -EINVAL; in nl80211_parse_coalesce_rule()
14013 if (pkt_offset > coalesce->max_pkt_offset) in nl80211_parse_coalesce_rule()
14014 return -EINVAL; in nl80211_parse_coalesce_rule()
14015 new_rule->patterns[i].pkt_offset = pkt_offset; in nl80211_parse_coalesce_rule()
14019 return -ENOMEM; in nl80211_parse_coalesce_rule()
14021 new_rule->patterns[i].mask = mask_pat; in nl80211_parse_coalesce_rule()
14026 new_rule->patterns[i].pattern = mask_pat; in nl80211_parse_coalesce_rule()
14027 new_rule->patterns[i].pattern_len = pat_len; in nl80211_parse_coalesce_rule()
14038 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_coalesce()
14039 const struct wiphy_coalesce_support *coalesce = rdev->wiphy.coalesce; in nl80211_set_coalesce()
14046 if (!rdev->wiphy.coalesce || !rdev->ops->set_coalesce) in nl80211_set_coalesce()
14047 return -EOPNOTSUPP; in nl80211_set_coalesce()
14049 if (!info->attrs[NL80211_ATTR_COALESCE_RULE]) { in nl80211_set_coalesce()
14055 nla_for_each_nested(rule, info->attrs[NL80211_ATTR_COALESCE_RULE], in nl80211_set_coalesce()
14058 if (n_rules > coalesce->n_rules) in nl80211_set_coalesce()
14059 return -EINVAL; in nl80211_set_coalesce()
14064 return -ENOMEM; in nl80211_set_coalesce()
14069 nla_for_each_nested(rule, info->attrs[NL80211_ATTR_COALESCE_RULE], in nl80211_set_coalesce()
14085 err = -ENOMEM; in nl80211_set_coalesce()
14089 rdev->coalesce = n_coalesce; in nl80211_set_coalesce()
14095 for (j = 0; j < tmp_rule->n_patterns; j++) in nl80211_set_coalesce()
14096 kfree(tmp_rule->patterns[j].mask); in nl80211_set_coalesce()
14097 kfree(tmp_rule->patterns); in nl80211_set_coalesce()
14106 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_rekey_data()
14107 struct net_device *dev = info->user_ptr[1]; in nl80211_set_rekey_data()
14108 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_rekey_data()
14113 if (!info->attrs[NL80211_ATTR_REKEY_DATA]) in nl80211_set_rekey_data()
14114 return -EINVAL; in nl80211_set_rekey_data()
14117 info->attrs[NL80211_ATTR_REKEY_DATA], in nl80211_set_rekey_data()
14118 nl80211_rekey_policy, info->extack); in nl80211_set_rekey_data()
14124 return -EINVAL; in nl80211_set_rekey_data()
14126 !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_EXT_KEK_KCK && in nl80211_set_rekey_data()
14128 return -ERANGE; in nl80211_set_rekey_data()
14130 !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_EXT_KEK_KCK && in nl80211_set_rekey_data()
14132 !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_EXT_KCK_32 && in nl80211_set_rekey_data()
14134 return -ERANGE; in nl80211_set_rekey_data()
14144 if (!wdev->connected) in nl80211_set_rekey_data()
14145 return -ENOTCONN; in nl80211_set_rekey_data()
14147 if (!rdev->ops->set_rekey_data) in nl80211_set_rekey_data()
14148 return -EOPNOTSUPP; in nl80211_set_rekey_data()
14156 struct net_device *dev = info->user_ptr[1]; in nl80211_register_unexpected_frame()
14157 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_register_unexpected_frame()
14159 if (wdev->iftype != NL80211_IFTYPE_AP && in nl80211_register_unexpected_frame()
14160 wdev->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_register_unexpected_frame()
14161 return -EINVAL; in nl80211_register_unexpected_frame()
14163 if (wdev->ap_unexpected_nlportid) in nl80211_register_unexpected_frame()
14164 return -EBUSY; in nl80211_register_unexpected_frame()
14166 wdev->ap_unexpected_nlportid = info->snd_portid; in nl80211_register_unexpected_frame()
14173 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_probe_client()
14174 struct net_device *dev = info->user_ptr[1]; in nl80211_probe_client()
14175 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_probe_client()
14182 if (wdev->iftype != NL80211_IFTYPE_AP && in nl80211_probe_client()
14183 wdev->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_probe_client()
14184 return -EOPNOTSUPP; in nl80211_probe_client()
14186 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_probe_client()
14187 return -EINVAL; in nl80211_probe_client()
14189 if (!rdev->ops->probe_client) in nl80211_probe_client()
14190 return -EOPNOTSUPP; in nl80211_probe_client()
14194 return -ENOMEM; in nl80211_probe_client()
14196 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_probe_client()
14199 err = -ENOBUFS; in nl80211_probe_client()
14203 addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_probe_client()
14218 err = -ENOBUFS; in nl80211_probe_client()
14226 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_register_beacons()
14230 if (!(rdev->wiphy.flags & WIPHY_FLAG_REPORTS_OBSS)) in nl80211_register_beacons()
14231 return -EOPNOTSUPP; in nl80211_register_beacons()
14235 return -ENOMEM; in nl80211_register_beacons()
14238 spin_lock_bh(&rdev->beacon_registrations_lock); in nl80211_register_beacons()
14239 list_for_each_entry(reg, &rdev->beacon_registrations, list) { in nl80211_register_beacons()
14240 if (reg->nlportid == info->snd_portid) { in nl80211_register_beacons()
14241 rv = -EALREADY; in nl80211_register_beacons()
14246 nreg->nlportid = info->snd_portid; in nl80211_register_beacons()
14247 list_add(&nreg->list, &rdev->beacon_registrations); in nl80211_register_beacons()
14249 spin_unlock_bh(&rdev->beacon_registrations_lock); in nl80211_register_beacons()
14253 spin_unlock_bh(&rdev->beacon_registrations_lock); in nl80211_register_beacons()
14260 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_start_p2p_device()
14261 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_start_p2p_device()
14264 if (!rdev->ops->start_p2p_device) in nl80211_start_p2p_device()
14265 return -EOPNOTSUPP; in nl80211_start_p2p_device()
14267 if (wdev->iftype != NL80211_IFTYPE_P2P_DEVICE) in nl80211_start_p2p_device()
14268 return -EOPNOTSUPP; in nl80211_start_p2p_device()
14273 if (rfkill_blocked(rdev->wiphy.rfkill)) in nl80211_start_p2p_device()
14274 return -ERFKILL; in nl80211_start_p2p_device()
14280 wdev->is_running = true; in nl80211_start_p2p_device()
14281 rdev->opencount++; in nl80211_start_p2p_device()
14288 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_stop_p2p_device()
14289 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_stop_p2p_device()
14291 if (wdev->iftype != NL80211_IFTYPE_P2P_DEVICE) in nl80211_stop_p2p_device()
14292 return -EOPNOTSUPP; in nl80211_stop_p2p_device()
14294 if (!rdev->ops->stop_p2p_device) in nl80211_stop_p2p_device()
14295 return -EOPNOTSUPP; in nl80211_stop_p2p_device()
14304 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_start_nan()
14305 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_start_nan()
14309 if (wdev->iftype != NL80211_IFTYPE_NAN) in nl80211_start_nan()
14310 return -EOPNOTSUPP; in nl80211_start_nan()
14313 return -EEXIST; in nl80211_start_nan()
14315 if (rfkill_blocked(rdev->wiphy.rfkill)) in nl80211_start_nan()
14316 return -ERFKILL; in nl80211_start_nan()
14318 if (!info->attrs[NL80211_ATTR_NAN_MASTER_PREF]) in nl80211_start_nan()
14319 return -EINVAL; in nl80211_start_nan()
14322 nla_get_u8(info->attrs[NL80211_ATTR_NAN_MASTER_PREF]); in nl80211_start_nan()
14324 if (info->attrs[NL80211_ATTR_BANDS]) { in nl80211_start_nan()
14325 u32 bands = nla_get_u32(info->attrs[NL80211_ATTR_BANDS]); in nl80211_start_nan()
14327 if (bands & ~(u32)wdev->wiphy->nan_supported_bands) in nl80211_start_nan()
14328 return -EOPNOTSUPP; in nl80211_start_nan()
14331 return -EINVAL; in nl80211_start_nan()
14340 wdev->is_running = true; in nl80211_start_nan()
14341 rdev->opencount++; in nl80211_start_nan()
14348 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_stop_nan()
14349 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_stop_nan()
14351 if (wdev->iftype != NL80211_IFTYPE_NAN) in nl80211_stop_nan()
14352 return -EOPNOTSUPP; in nl80211_stop_nan()
14370 return -EINVAL; in validate_nan_filter()
14387 BUILD_BUG_ON(sizeof(*func->rx_filters) != sizeof(*func->tx_filters)); in handle_nan_filter()
14389 filter = kcalloc(n_entries, sizeof(*func->rx_filters), GFP_KERNEL); in handle_nan_filter()
14391 return -ENOMEM; in handle_nan_filter()
14403 func->num_tx_filters = n_entries; in handle_nan_filter()
14404 func->tx_filters = filter; in handle_nan_filter()
14406 func->num_rx_filters = n_entries; in handle_nan_filter()
14407 func->rx_filters = filter; in handle_nan_filter()
14419 return -ENOMEM; in handle_nan_filter()
14425 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_nan_add_func()
14426 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_nan_add_func()
14433 if (wdev->iftype != NL80211_IFTYPE_NAN) in nl80211_nan_add_func()
14434 return -EOPNOTSUPP; in nl80211_nan_add_func()
14437 return -ENOTCONN; in nl80211_nan_add_func()
14439 if (!info->attrs[NL80211_ATTR_NAN_FUNC]) in nl80211_nan_add_func()
14440 return -EINVAL; in nl80211_nan_add_func()
14443 info->attrs[NL80211_ATTR_NAN_FUNC], in nl80211_nan_add_func()
14445 info->extack); in nl80211_nan_add_func()
14451 return -ENOMEM; in nl80211_nan_add_func()
14453 func->cookie = cfg80211_assign_cookie(rdev); in nl80211_nan_add_func()
14456 err = -EINVAL; in nl80211_nan_add_func()
14461 func->type = nla_get_u8(tb[NL80211_NAN_FUNC_TYPE]); in nl80211_nan_add_func()
14464 err = -EINVAL; in nl80211_nan_add_func()
14468 memcpy(func->service_id, nla_data(tb[NL80211_NAN_FUNC_SERVICE_ID]), in nl80211_nan_add_func()
14469 sizeof(func->service_id)); in nl80211_nan_add_func()
14471 func->close_range = in nl80211_nan_add_func()
14475 func->serv_spec_info_len = in nl80211_nan_add_func()
14477 func->serv_spec_info = in nl80211_nan_add_func()
14479 func->serv_spec_info_len, in nl80211_nan_add_func()
14481 if (!func->serv_spec_info) { in nl80211_nan_add_func()
14482 err = -ENOMEM; in nl80211_nan_add_func()
14488 func->ttl = nla_get_u32(tb[NL80211_NAN_FUNC_TTL]); in nl80211_nan_add_func()
14490 switch (func->type) { in nl80211_nan_add_func()
14493 err = -EINVAL; in nl80211_nan_add_func()
14497 func->publish_type = in nl80211_nan_add_func()
14499 func->publish_bcast = in nl80211_nan_add_func()
14502 if ((!(func->publish_type & NL80211_NAN_SOLICITED_PUBLISH)) && in nl80211_nan_add_func()
14503 func->publish_bcast) { in nl80211_nan_add_func()
14504 err = -EINVAL; in nl80211_nan_add_func()
14509 func->subscribe_active = in nl80211_nan_add_func()
14516 err = -EINVAL; in nl80211_nan_add_func()
14520 func->followup_id = in nl80211_nan_add_func()
14522 func->followup_reqid = in nl80211_nan_add_func()
14524 memcpy(func->followup_dest.addr, in nl80211_nan_add_func()
14526 sizeof(func->followup_dest.addr)); in nl80211_nan_add_func()
14527 if (func->ttl) { in nl80211_nan_add_func()
14528 err = -EINVAL; in nl80211_nan_add_func()
14533 err = -EINVAL; in nl80211_nan_add_func()
14544 info->extack); in nl80211_nan_add_func()
14548 func->srf_include = in nl80211_nan_add_func()
14554 err = -EINVAL; in nl80211_nan_add_func()
14558 func->srf_bf_len = in nl80211_nan_add_func()
14560 func->srf_bf = in nl80211_nan_add_func()
14562 func->srf_bf_len, GFP_KERNEL); in nl80211_nan_add_func()
14563 if (!func->srf_bf) { in nl80211_nan_add_func()
14564 err = -ENOMEM; in nl80211_nan_add_func()
14568 func->srf_bf_idx = in nl80211_nan_add_func()
14576 err = -EINVAL; in nl80211_nan_add_func()
14582 err = -EINVAL; in nl80211_nan_add_func()
14586 func->srf_num_macs = n_entries; in nl80211_nan_add_func()
14587 func->srf_macs = in nl80211_nan_add_func()
14588 kcalloc(n_entries, sizeof(*func->srf_macs), in nl80211_nan_add_func()
14590 if (!func->srf_macs) { in nl80211_nan_add_func()
14591 err = -ENOMEM; in nl80211_nan_add_func()
14596 memcpy(func->srf_macs[i++].addr, nla_data(attr), in nl80211_nan_add_func()
14597 sizeof(*func->srf_macs)); in nl80211_nan_add_func()
14617 err = -ENOMEM; in nl80211_nan_add_func()
14621 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_nan_add_func()
14623 /* This can't really happen - we just allocated 4KB */ in nl80211_nan_add_func()
14625 err = -ENOMEM; in nl80211_nan_add_func()
14638 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, func->cookie, in nl80211_nan_add_func()
14647 func->instance_id)) in nl80211_nan_add_func()
14657 return -ENOBUFS; in nl80211_nan_add_func()
14663 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_nan_del_func()
14664 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_nan_del_func()
14667 if (wdev->iftype != NL80211_IFTYPE_NAN) in nl80211_nan_del_func()
14668 return -EOPNOTSUPP; in nl80211_nan_del_func()
14671 return -ENOTCONN; in nl80211_nan_del_func()
14673 if (!info->attrs[NL80211_ATTR_COOKIE]) in nl80211_nan_del_func()
14674 return -EINVAL; in nl80211_nan_del_func()
14676 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); in nl80211_nan_del_func()
14686 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_nan_change_config()
14687 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_nan_change_config()
14691 if (wdev->iftype != NL80211_IFTYPE_NAN) in nl80211_nan_change_config()
14692 return -EOPNOTSUPP; in nl80211_nan_change_config()
14695 return -ENOTCONN; in nl80211_nan_change_config()
14697 if (info->attrs[NL80211_ATTR_NAN_MASTER_PREF]) { in nl80211_nan_change_config()
14699 nla_get_u8(info->attrs[NL80211_ATTR_NAN_MASTER_PREF]); in nl80211_nan_change_config()
14701 return -EINVAL; in nl80211_nan_change_config()
14706 if (info->attrs[NL80211_ATTR_BANDS]) { in nl80211_nan_change_config()
14707 u32 bands = nla_get_u32(info->attrs[NL80211_ATTR_BANDS]); in nl80211_nan_change_config()
14709 if (bands & ~(u32)wdev->wiphy->nan_supported_bands) in nl80211_nan_change_config()
14710 return -EOPNOTSUPP; in nl80211_nan_change_config()
14713 return -EINVAL; in nl80211_nan_change_config()
14720 return -EINVAL; in nl80211_nan_change_config()
14728 struct wiphy *wiphy = wdev->wiphy; in cfg80211_nan_match()
14734 if (WARN_ON(!match->inst_id || !match->peer_inst_id || !match->addr)) in cfg80211_nan_match()
14747 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_nan_match()
14748 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, in cfg80211_nan_match()
14749 wdev->netdev->ifindex)) || in cfg80211_nan_match()
14754 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, match->cookie, in cfg80211_nan_match()
14756 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, match->addr)) in cfg80211_nan_match()
14768 if (nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, match->inst_id)) in cfg80211_nan_match()
14778 if (nla_put_u8(msg, NL80211_NAN_FUNC_TYPE, match->type) || in cfg80211_nan_match()
14779 nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, match->peer_inst_id)) in cfg80211_nan_match()
14782 if (match->info && match->info_len && in cfg80211_nan_match()
14783 nla_put(msg, NL80211_NAN_FUNC_SERVICE_INFO, match->info_len, in cfg80211_nan_match()
14784 match->info)) in cfg80211_nan_match()
14791 if (!wdev->owner_nlportid) in cfg80211_nan_match()
14792 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), in cfg80211_nan_match()
14795 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, in cfg80211_nan_match()
14796 wdev->owner_nlportid); in cfg80211_nan_match()
14810 struct wiphy *wiphy = wdev->wiphy; in cfg80211_nan_func_terminated()
14829 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_nan_func_terminated()
14830 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, in cfg80211_nan_func_terminated()
14831 wdev->netdev->ifindex)) || in cfg80211_nan_func_terminated()
14851 if (!wdev->owner_nlportid) in cfg80211_nan_func_terminated()
14852 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), in cfg80211_nan_func_terminated()
14855 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, in cfg80211_nan_func_terminated()
14856 wdev->owner_nlportid); in cfg80211_nan_func_terminated()
14873 return -ENOMEM; in nl80211_get_protocol_features()
14875 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_protocol_features()
14889 return -ENOBUFS; in nl80211_get_protocol_features()
14894 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_update_ft_ies()
14896 struct net_device *dev = info->user_ptr[1]; in nl80211_update_ft_ies()
14898 if (!rdev->ops->update_ft_ies) in nl80211_update_ft_ies()
14899 return -EOPNOTSUPP; in nl80211_update_ft_ies()
14901 if (!info->attrs[NL80211_ATTR_MDID] || in nl80211_update_ft_ies()
14902 !info->attrs[NL80211_ATTR_IE]) in nl80211_update_ft_ies()
14903 return -EINVAL; in nl80211_update_ft_ies()
14906 ft_params.md = nla_get_u16(info->attrs[NL80211_ATTR_MDID]); in nl80211_update_ft_ies()
14907 ft_params.ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_update_ft_ies()
14908 ft_params.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_update_ft_ies()
14916 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_crit_protocol_start()
14917 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_crit_protocol_start()
14922 if (!rdev->ops->crit_proto_start) in nl80211_crit_protocol_start()
14923 return -EOPNOTSUPP; in nl80211_crit_protocol_start()
14925 if (WARN_ON(!rdev->ops->crit_proto_stop)) in nl80211_crit_protocol_start()
14926 return -EINVAL; in nl80211_crit_protocol_start()
14928 if (rdev->crit_proto_nlportid) in nl80211_crit_protocol_start()
14929 return -EBUSY; in nl80211_crit_protocol_start()
14932 if (info->attrs[NL80211_ATTR_CRIT_PROT_ID]) in nl80211_crit_protocol_start()
14933 proto = nla_get_u16(info->attrs[NL80211_ATTR_CRIT_PROT_ID]); in nl80211_crit_protocol_start()
14936 return -EINVAL; in nl80211_crit_protocol_start()
14939 if (!info->attrs[NL80211_ATTR_MAX_CRIT_PROT_DURATION]) in nl80211_crit_protocol_start()
14940 return -EINVAL; in nl80211_crit_protocol_start()
14943 nla_get_u16(info->attrs[NL80211_ATTR_MAX_CRIT_PROT_DURATION]); in nl80211_crit_protocol_start()
14947 rdev->crit_proto_nlportid = info->snd_portid; in nl80211_crit_protocol_start()
14955 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_crit_protocol_stop()
14956 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_crit_protocol_stop()
14958 if (!rdev->ops->crit_proto_stop) in nl80211_crit_protocol_stop()
14959 return -EOPNOTSUPP; in nl80211_crit_protocol_stop()
14961 if (rdev->crit_proto_nlportid) { in nl80211_crit_protocol_stop()
14962 rdev->crit_proto_nlportid = 0; in nl80211_crit_protocol_stop()
14972 if (vcmd->policy == VENDOR_CMD_RAW_DATA) { in nl80211_vendor_check_policy()
14973 if (attr->nla_type & NLA_F_NESTED) { in nl80211_vendor_check_policy()
14976 return -EINVAL; in nl80211_vendor_check_policy()
14982 if (!(attr->nla_type & NLA_F_NESTED)) { in nl80211_vendor_check_policy()
14984 return -EINVAL; in nl80211_vendor_check_policy()
14987 return nla_validate_nested(attr, vcmd->maxattr, vcmd->policy, extack); in nl80211_vendor_check_policy()
14992 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_vendor_cmd()
14995 info->attrs); in nl80211_vendor_cmd()
14999 if (!rdev->wiphy.vendor_commands) in nl80211_vendor_cmd()
15000 return -EOPNOTSUPP; in nl80211_vendor_cmd()
15004 if (err != -EINVAL) in nl80211_vendor_cmd()
15007 } else if (wdev->wiphy != &rdev->wiphy) { in nl80211_vendor_cmd()
15008 return -EINVAL; in nl80211_vendor_cmd()
15011 if (!info->attrs[NL80211_ATTR_VENDOR_ID] || in nl80211_vendor_cmd()
15012 !info->attrs[NL80211_ATTR_VENDOR_SUBCMD]) in nl80211_vendor_cmd()
15013 return -EINVAL; in nl80211_vendor_cmd()
15015 vid = nla_get_u32(info->attrs[NL80211_ATTR_VENDOR_ID]); in nl80211_vendor_cmd()
15016 subcmd = nla_get_u32(info->attrs[NL80211_ATTR_VENDOR_SUBCMD]); in nl80211_vendor_cmd()
15017 for (i = 0; i < rdev->wiphy.n_vendor_commands; i++) { in nl80211_vendor_cmd()
15022 vcmd = &rdev->wiphy.vendor_commands[i]; in nl80211_vendor_cmd()
15024 if (vcmd->info.vendor_id != vid || vcmd->info.subcmd != subcmd) in nl80211_vendor_cmd()
15027 if (vcmd->flags & (WIPHY_VENDOR_CMD_NEED_WDEV | in nl80211_vendor_cmd()
15030 return -EINVAL; in nl80211_vendor_cmd()
15031 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_NETDEV && in nl80211_vendor_cmd()
15032 !wdev->netdev) in nl80211_vendor_cmd()
15033 return -EINVAL; in nl80211_vendor_cmd()
15035 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_RUNNING) { in nl80211_vendor_cmd()
15037 return -ENETDOWN; in nl80211_vendor_cmd()
15043 if (!vcmd->doit) in nl80211_vendor_cmd()
15044 return -EOPNOTSUPP; in nl80211_vendor_cmd()
15046 if (info->attrs[NL80211_ATTR_VENDOR_DATA]) { in nl80211_vendor_cmd()
15047 data = nla_data(info->attrs[NL80211_ATTR_VENDOR_DATA]); in nl80211_vendor_cmd()
15048 len = nla_len(info->attrs[NL80211_ATTR_VENDOR_DATA]); in nl80211_vendor_cmd()
15051 info->attrs[NL80211_ATTR_VENDOR_DATA], in nl80211_vendor_cmd()
15052 info->extack); in nl80211_vendor_cmd()
15057 rdev->cur_cmd_info = info; in nl80211_vendor_cmd()
15058 err = vcmd->doit(&rdev->wiphy, wdev, data, len); in nl80211_vendor_cmd()
15059 rdev->cur_cmd_info = NULL; in nl80211_vendor_cmd()
15063 return -EOPNOTSUPP; in nl80211_vendor_cmd()
15074 int vcmd_idx = -1; in nl80211_prepare_vendor_dump()
15079 if (cb->args[0]) { in nl80211_prepare_vendor_dump()
15081 struct wiphy *wiphy = wiphy_idx_to_wiphy(cb->args[0] - 1); in nl80211_prepare_vendor_dump()
15085 return -ENODEV; in nl80211_prepare_vendor_dump()
15089 if (cb->args[1]) { in nl80211_prepare_vendor_dump()
15090 list_for_each_entry(tmp, &wiphy->wdev_list, list) { in nl80211_prepare_vendor_dump()
15091 if (tmp->identifier == cb->args[1] - 1) { in nl80211_prepare_vendor_dump()
15104 return -ENOMEM; in nl80211_prepare_vendor_dump()
15106 err = nlmsg_parse_deprecated(cb->nlh, in nl80211_prepare_vendor_dump()
15115 err = -EINVAL; in nl80211_prepare_vendor_dump()
15119 *wdev = __cfg80211_wdev_from_attrs(NULL, sock_net(skb->sk), attrbuf); in nl80211_prepare_vendor_dump()
15123 *rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk), attrbuf); in nl80211_prepare_vendor_dump()
15132 for (i = 0; i < (*rdev)->wiphy.n_vendor_commands; i++) { in nl80211_prepare_vendor_dump()
15135 vcmd = &(*rdev)->wiphy.vendor_commands[i]; in nl80211_prepare_vendor_dump()
15137 if (vcmd->info.vendor_id != vid || vcmd->info.subcmd != subcmd) in nl80211_prepare_vendor_dump()
15140 if (!vcmd->dumpit) { in nl80211_prepare_vendor_dump()
15141 err = -EOPNOTSUPP; in nl80211_prepare_vendor_dump()
15150 err = -EOPNOTSUPP; in nl80211_prepare_vendor_dump()
15159 &(*rdev)->wiphy.vendor_commands[vcmd_idx], in nl80211_prepare_vendor_dump()
15161 cb->extack); in nl80211_prepare_vendor_dump()
15166 /* 0 is the first index - add 1 to parse only once */ in nl80211_prepare_vendor_dump()
15167 cb->args[0] = (*rdev)->wiphy_idx + 1; in nl80211_prepare_vendor_dump()
15169 cb->args[1] = *wdev ? (*wdev)->identifier + 1 : 0; in nl80211_prepare_vendor_dump()
15170 cb->args[2] = vcmd_idx; in nl80211_prepare_vendor_dump()
15171 cb->args[3] = (unsigned long)data; in nl80211_prepare_vendor_dump()
15172 cb->args[4] = data_len; in nl80211_prepare_vendor_dump()
15198 vcmd_idx = cb->args[2]; in nl80211_vendor_cmd_dump()
15199 data = (void *)cb->args[3]; in nl80211_vendor_cmd_dump()
15200 data_len = cb->args[4]; in nl80211_vendor_cmd_dump()
15201 vcmd = &rdev->wiphy.vendor_commands[vcmd_idx]; in nl80211_vendor_cmd_dump()
15203 if (vcmd->flags & (WIPHY_VENDOR_CMD_NEED_WDEV | in nl80211_vendor_cmd_dump()
15206 err = -EINVAL; in nl80211_vendor_cmd_dump()
15209 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_NETDEV && in nl80211_vendor_cmd_dump()
15210 !wdev->netdev) { in nl80211_vendor_cmd_dump()
15211 err = -EINVAL; in nl80211_vendor_cmd_dump()
15215 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_RUNNING) { in nl80211_vendor_cmd_dump()
15217 err = -ENETDOWN; in nl80211_vendor_cmd_dump()
15224 void *hdr = nl80211hdr_put(skb, NETLINK_CB(cb->skb).portid, in nl80211_vendor_cmd_dump()
15225 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_vendor_cmd_dump()
15230 if (nla_put_u32(skb, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_vendor_cmd_dump()
15245 err = vcmd->dumpit(&rdev->wiphy, wdev, skb, data, data_len, in nl80211_vendor_cmd_dump()
15246 (unsigned long *)&cb->args[5]); in nl80211_vendor_cmd_dump()
15249 if (err == -ENOBUFS || err == -ENOENT) { in nl80211_vendor_cmd_dump()
15260 err = skb->len; in nl80211_vendor_cmd_dump()
15273 if (WARN_ON(!rdev->cur_cmd_info)) in __cfg80211_alloc_reply_skb()
15277 rdev->cur_cmd_info->snd_portid, in __cfg80211_alloc_reply_skb()
15278 rdev->cur_cmd_info->snd_seq, in __cfg80211_alloc_reply_skb()
15285 struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0]; in cfg80211_vendor_cmd_reply()
15286 void *hdr = ((void **)skb->cb)[1]; in cfg80211_vendor_cmd_reply()
15287 struct nlattr *data = ((void **)skb->cb)[2]; in cfg80211_vendor_cmd_reply()
15290 memset(skb->cb, 0, sizeof(skb->cb)); in cfg80211_vendor_cmd_reply()
15292 if (WARN_ON(!rdev->cur_cmd_info)) { in cfg80211_vendor_cmd_reply()
15294 return -EINVAL; in cfg80211_vendor_cmd_reply()
15299 return genlmsg_reply(skb, rdev->cur_cmd_info); in cfg80211_vendor_cmd_reply()
15307 if (WARN_ON(!rdev->cur_cmd_info)) in cfg80211_vendor_cmd_get_sender()
15310 return rdev->cur_cmd_info->snd_portid; in cfg80211_vendor_cmd_get_sender()
15317 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_qos_map()
15319 struct net_device *dev = info->user_ptr[1]; in nl80211_set_qos_map()
15323 if (!rdev->ops->set_qos_map) in nl80211_set_qos_map()
15324 return -EOPNOTSUPP; in nl80211_set_qos_map()
15326 if (info->attrs[NL80211_ATTR_QOS_MAP]) { in nl80211_set_qos_map()
15327 pos = nla_data(info->attrs[NL80211_ATTR_QOS_MAP]); in nl80211_set_qos_map()
15328 len = nla_len(info->attrs[NL80211_ATTR_QOS_MAP]); in nl80211_set_qos_map()
15331 return -EINVAL; in nl80211_set_qos_map()
15335 return -ENOMEM; in nl80211_set_qos_map()
15337 num_des = (len - IEEE80211_QOS_MAP_LEN_MIN) >> 1; in nl80211_set_qos_map()
15341 memcpy(qos_map->dscp_exception, pos, des_len); in nl80211_set_qos_map()
15342 qos_map->num_des = num_des; in nl80211_set_qos_map()
15344 if (qos_map->dscp_exception[des].up > 7) { in nl80211_set_qos_map()
15346 return -EINVAL; in nl80211_set_qos_map()
15351 memcpy(qos_map->up, pos, IEEE80211_QOS_MAP_LEN_MIN); in nl80211_set_qos_map()
15354 ret = nl80211_key_allowed(dev->ieee80211_ptr); in nl80211_set_qos_map()
15364 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_add_tx_ts()
15365 struct net_device *dev = info->user_ptr[1]; in nl80211_add_tx_ts()
15366 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_add_tx_ts()
15371 if (!(rdev->wiphy.features & NL80211_FEATURE_SUPPORTS_WMM_ADMISSION)) in nl80211_add_tx_ts()
15372 return -EOPNOTSUPP; in nl80211_add_tx_ts()
15374 if (!info->attrs[NL80211_ATTR_TSID] || !info->attrs[NL80211_ATTR_MAC] || in nl80211_add_tx_ts()
15375 !info->attrs[NL80211_ATTR_USER_PRIO]) in nl80211_add_tx_ts()
15376 return -EINVAL; in nl80211_add_tx_ts()
15378 tsid = nla_get_u8(info->attrs[NL80211_ATTR_TSID]); in nl80211_add_tx_ts()
15379 up = nla_get_u8(info->attrs[NL80211_ATTR_USER_PRIO]); in nl80211_add_tx_ts()
15381 /* WMM uses TIDs 0-7 even for TSPEC */ in nl80211_add_tx_ts()
15387 return -EINVAL; in nl80211_add_tx_ts()
15390 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_add_tx_ts()
15392 if (info->attrs[NL80211_ATTR_ADMITTED_TIME]) { in nl80211_add_tx_ts()
15394 nla_get_u16(info->attrs[NL80211_ATTR_ADMITTED_TIME]); in nl80211_add_tx_ts()
15396 return -EINVAL; in nl80211_add_tx_ts()
15399 switch (wdev->iftype) { in nl80211_add_tx_ts()
15402 if (wdev->connected) in nl80211_add_tx_ts()
15404 return -ENOTCONN; in nl80211_add_tx_ts()
15406 return -EOPNOTSUPP; in nl80211_add_tx_ts()
15414 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_del_tx_ts()
15415 struct net_device *dev = info->user_ptr[1]; in nl80211_del_tx_ts()
15419 if (!info->attrs[NL80211_ATTR_TSID] || !info->attrs[NL80211_ATTR_MAC]) in nl80211_del_tx_ts()
15420 return -EINVAL; in nl80211_del_tx_ts()
15422 tsid = nla_get_u8(info->attrs[NL80211_ATTR_TSID]); in nl80211_del_tx_ts()
15423 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_del_tx_ts()
15431 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_tdls_channel_switch()
15432 struct net_device *dev = info->user_ptr[1]; in nl80211_tdls_channel_switch()
15433 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_tdls_channel_switch()
15439 if (!rdev->ops->tdls_channel_switch || in nl80211_tdls_channel_switch()
15440 !(rdev->wiphy.features & NL80211_FEATURE_TDLS_CHANNEL_SWITCH)) in nl80211_tdls_channel_switch()
15441 return -EOPNOTSUPP; in nl80211_tdls_channel_switch()
15443 switch (dev->ieee80211_ptr->iftype) { in nl80211_tdls_channel_switch()
15448 return -EOPNOTSUPP; in nl80211_tdls_channel_switch()
15451 if (!info->attrs[NL80211_ATTR_MAC] || in nl80211_tdls_channel_switch()
15452 !info->attrs[NL80211_ATTR_OPER_CLASS]) in nl80211_tdls_channel_switch()
15453 return -EINVAL; in nl80211_tdls_channel_switch()
15460 * Don't allow wide channels on the 2.4Ghz band, as per IEEE802.11-2012 in nl80211_tdls_channel_switch()
15464 if (chandef.chan->band == NL80211_BAND_2GHZ && in nl80211_tdls_channel_switch()
15467 return -EINVAL; in nl80211_tdls_channel_switch()
15470 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &chandef, in nl80211_tdls_channel_switch()
15471 wdev->iftype)) in nl80211_tdls_channel_switch()
15472 return -EINVAL; in nl80211_tdls_channel_switch()
15475 if (cfg80211_chandef_dfs_required(wdev->wiphy, &chandef, wdev->iftype)) in nl80211_tdls_channel_switch()
15476 return -EINVAL; in nl80211_tdls_channel_switch()
15478 addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_tdls_channel_switch()
15479 oper_class = nla_get_u8(info->attrs[NL80211_ATTR_OPER_CLASS]); in nl80211_tdls_channel_switch()
15487 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_tdls_cancel_channel_switch()
15488 struct net_device *dev = info->user_ptr[1]; in nl80211_tdls_cancel_channel_switch()
15491 if (!rdev->ops->tdls_channel_switch || in nl80211_tdls_cancel_channel_switch()
15492 !rdev->ops->tdls_cancel_channel_switch || in nl80211_tdls_cancel_channel_switch()
15493 !(rdev->wiphy.features & NL80211_FEATURE_TDLS_CHANNEL_SWITCH)) in nl80211_tdls_cancel_channel_switch()
15494 return -EOPNOTSUPP; in nl80211_tdls_cancel_channel_switch()
15496 switch (dev->ieee80211_ptr->iftype) { in nl80211_tdls_cancel_channel_switch()
15501 return -EOPNOTSUPP; in nl80211_tdls_cancel_channel_switch()
15504 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_tdls_cancel_channel_switch()
15505 return -EINVAL; in nl80211_tdls_cancel_channel_switch()
15507 addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_tdls_cancel_channel_switch()
15517 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_multicast_to_unicast()
15518 struct net_device *dev = info->user_ptr[1]; in nl80211_set_multicast_to_unicast()
15519 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_multicast_to_unicast()
15523 if (!rdev->ops->set_multicast_to_unicast) in nl80211_set_multicast_to_unicast()
15524 return -EOPNOTSUPP; in nl80211_set_multicast_to_unicast()
15526 if (wdev->iftype != NL80211_IFTYPE_AP && in nl80211_set_multicast_to_unicast()
15527 wdev->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_set_multicast_to_unicast()
15528 return -EOPNOTSUPP; in nl80211_set_multicast_to_unicast()
15530 nla = info->attrs[NL80211_ATTR_MULTICAST_TO_UNICAST_ENABLED]; in nl80211_set_multicast_to_unicast()
15538 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_pmk()
15539 struct net_device *dev = info->user_ptr[1]; in nl80211_set_pmk()
15540 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_pmk()
15543 if (wdev->iftype != NL80211_IFTYPE_STATION && in nl80211_set_pmk()
15544 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_set_pmk()
15545 return -EOPNOTSUPP; in nl80211_set_pmk()
15547 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_set_pmk()
15549 return -EOPNOTSUPP; in nl80211_set_pmk()
15551 if (!info->attrs[NL80211_ATTR_MAC] || !info->attrs[NL80211_ATTR_PMK]) in nl80211_set_pmk()
15552 return -EINVAL; in nl80211_set_pmk()
15554 if (!wdev->connected) in nl80211_set_pmk()
15555 return -ENOTCONN; in nl80211_set_pmk()
15557 pmk_conf.aa = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_set_pmk()
15558 if (memcmp(pmk_conf.aa, wdev->u.client.connected_addr, ETH_ALEN)) in nl80211_set_pmk()
15559 return -EINVAL; in nl80211_set_pmk()
15561 pmk_conf.pmk = nla_data(info->attrs[NL80211_ATTR_PMK]); in nl80211_set_pmk()
15562 pmk_conf.pmk_len = nla_len(info->attrs[NL80211_ATTR_PMK]); in nl80211_set_pmk()
15565 return -EINVAL; in nl80211_set_pmk()
15567 if (info->attrs[NL80211_ATTR_PMKR0_NAME]) in nl80211_set_pmk()
15569 nla_data(info->attrs[NL80211_ATTR_PMKR0_NAME]); in nl80211_set_pmk()
15576 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_del_pmk()
15577 struct net_device *dev = info->user_ptr[1]; in nl80211_del_pmk()
15578 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_del_pmk()
15581 if (wdev->iftype != NL80211_IFTYPE_STATION && in nl80211_del_pmk()
15582 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_del_pmk()
15583 return -EOPNOTSUPP; in nl80211_del_pmk()
15585 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_del_pmk()
15587 return -EOPNOTSUPP; in nl80211_del_pmk()
15589 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_del_pmk()
15590 return -EINVAL; in nl80211_del_pmk()
15592 aa = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_del_pmk()
15598 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_external_auth()
15599 struct net_device *dev = info->user_ptr[1]; in nl80211_external_auth()
15602 if (!rdev->ops->external_auth) in nl80211_external_auth()
15603 return -EOPNOTSUPP; in nl80211_external_auth()
15605 if (!info->attrs[NL80211_ATTR_SSID] && in nl80211_external_auth()
15606 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && in nl80211_external_auth()
15607 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_external_auth()
15608 return -EINVAL; in nl80211_external_auth()
15610 if (!info->attrs[NL80211_ATTR_BSSID]) in nl80211_external_auth()
15611 return -EINVAL; in nl80211_external_auth()
15613 if (!info->attrs[NL80211_ATTR_STATUS_CODE]) in nl80211_external_auth()
15614 return -EINVAL; in nl80211_external_auth()
15618 if (info->attrs[NL80211_ATTR_SSID]) { in nl80211_external_auth()
15619 params.ssid.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); in nl80211_external_auth()
15621 return -EINVAL; in nl80211_external_auth()
15623 nla_data(info->attrs[NL80211_ATTR_SSID]), in nl80211_external_auth()
15627 memcpy(params.bssid, nla_data(info->attrs[NL80211_ATTR_BSSID]), in nl80211_external_auth()
15630 params.status = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]); in nl80211_external_auth()
15632 if (info->attrs[NL80211_ATTR_PMKID]) in nl80211_external_auth()
15633 params.pmkid = nla_data(info->attrs[NL80211_ATTR_PMKID]); in nl80211_external_auth()
15640 bool dont_wait_for_ack = info->attrs[NL80211_ATTR_DONT_WAIT_FOR_ACK]; in nl80211_tx_control_port()
15641 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_tx_control_port()
15642 struct net_device *dev = info->user_ptr[1]; in nl80211_tx_control_port()
15643 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_tx_control_port()
15653 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_tx_control_port()
15655 return -EOPNOTSUPP; in nl80211_tx_control_port()
15657 if (!rdev->ops->tx_control_port) in nl80211_tx_control_port()
15658 return -EOPNOTSUPP; in nl80211_tx_control_port()
15660 if (!info->attrs[NL80211_ATTR_FRAME] || in nl80211_tx_control_port()
15661 !info->attrs[NL80211_ATTR_MAC] || in nl80211_tx_control_port()
15662 !info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]) { in nl80211_tx_control_port()
15664 return -EINVAL; in nl80211_tx_control_port()
15667 switch (wdev->iftype) { in nl80211_tx_control_port()
15673 if (wdev->u.ibss.current_bss) in nl80211_tx_control_port()
15675 return -ENOTCONN; in nl80211_tx_control_port()
15678 if (wdev->connected) in nl80211_tx_control_port()
15680 return -ENOTCONN; in nl80211_tx_control_port()
15682 return -EOPNOTSUPP; in nl80211_tx_control_port()
15685 buf = nla_data(info->attrs[NL80211_ATTR_FRAME]); in nl80211_tx_control_port()
15686 len = nla_len(info->attrs[NL80211_ATTR_FRAME]); in nl80211_tx_control_port()
15687 dest = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_tx_control_port()
15688 proto = nla_get_u16(info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]); in nl80211_tx_control_port()
15690 nla_get_flag(info->attrs[NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT]); in nl80211_tx_control_port()
15692 link_id = nl80211_link_id_or_invalid(info->attrs); in nl80211_tx_control_port()
15698 nl_set_extack_cookie_u64(info->extack, cookie); in nl80211_tx_control_port()
15705 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_ftm_responder_stats()
15706 struct net_device *dev = info->user_ptr[1]; in nl80211_get_ftm_responder_stats()
15707 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_get_ftm_responder_stats()
15709 unsigned int link_id = nl80211_link_id(info->attrs); in nl80211_get_ftm_responder_stats()
15715 if (wdev->iftype != NL80211_IFTYPE_AP || in nl80211_get_ftm_responder_stats()
15716 !wdev->links[link_id].ap.beacon_interval) in nl80211_get_ftm_responder_stats()
15717 return -EOPNOTSUPP; in nl80211_get_ftm_responder_stats()
15724 return -ENODATA; in nl80211_get_ftm_responder_stats()
15728 return -ENOMEM; in nl80211_get_ftm_responder_stats()
15730 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_ftm_responder_stats()
15735 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) in nl80211_get_ftm_responder_stats()
15772 return -ENOBUFS; in nl80211_get_ftm_responder_stats()
15777 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_update_owe_info()
15779 struct net_device *dev = info->user_ptr[1]; in nl80211_update_owe_info()
15781 if (!rdev->ops->update_owe_info) in nl80211_update_owe_info()
15782 return -EOPNOTSUPP; in nl80211_update_owe_info()
15784 if (!info->attrs[NL80211_ATTR_STATUS_CODE] || in nl80211_update_owe_info()
15785 !info->attrs[NL80211_ATTR_MAC]) in nl80211_update_owe_info()
15786 return -EINVAL; in nl80211_update_owe_info()
15789 owe_info.status = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]); in nl80211_update_owe_info()
15790 nla_memcpy(owe_info.peer, info->attrs[NL80211_ATTR_MAC], ETH_ALEN); in nl80211_update_owe_info()
15792 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_update_owe_info()
15793 owe_info.ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_update_owe_info()
15794 owe_info.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_update_owe_info()
15802 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_probe_mesh_link()
15803 struct net_device *dev = info->user_ptr[1]; in nl80211_probe_mesh_link()
15804 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_probe_mesh_link()
15811 if (!rdev->ops->probe_mesh_link || !rdev->ops->get_station) in nl80211_probe_mesh_link()
15812 return -EOPNOTSUPP; in nl80211_probe_mesh_link()
15814 if (!info->attrs[NL80211_ATTR_MAC] || in nl80211_probe_mesh_link()
15815 !info->attrs[NL80211_ATTR_FRAME]) { in nl80211_probe_mesh_link()
15817 return -EINVAL; in nl80211_probe_mesh_link()
15820 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_probe_mesh_link()
15821 return -EOPNOTSUPP; in nl80211_probe_mesh_link()
15823 dest = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_probe_mesh_link()
15824 buf = nla_data(info->attrs[NL80211_ATTR_FRAME]); in nl80211_probe_mesh_link()
15825 len = nla_len(info->attrs[NL80211_ATTR_FRAME]); in nl80211_probe_mesh_link()
15828 return -EINVAL; in nl80211_probe_mesh_link()
15831 !ether_addr_equal(buf + ETH_ALEN, dev->dev_addr)) in nl80211_probe_mesh_link()
15832 return -EINVAL; in nl80211_probe_mesh_link()
15849 struct netlink_ext_ack *extack = info->extack; in parse_tid_conf()
15854 return -EINVAL; in parse_tid_conf()
15856 tid_conf->config_override = in parse_tid_conf()
15858 tid_conf->tids = nla_get_u16(attrs[NL80211_TID_CONFIG_ATTR_TIDS]); in parse_tid_conf()
15860 if (tid_conf->config_override) { in parse_tid_conf()
15861 if (rdev->ops->reset_tid_config) { in parse_tid_conf()
15863 tid_conf->tids); in parse_tid_conf()
15867 return -EINVAL; in parse_tid_conf()
15872 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_NOACK); in parse_tid_conf()
15873 tid_conf->noack = in parse_tid_conf()
15878 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_RETRY_SHORT); in parse_tid_conf()
15879 tid_conf->retry_short = in parse_tid_conf()
15882 if (tid_conf->retry_short > rdev->wiphy.max_data_retry_count) in parse_tid_conf()
15883 return -EINVAL; in parse_tid_conf()
15887 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_RETRY_LONG); in parse_tid_conf()
15888 tid_conf->retry_long = in parse_tid_conf()
15891 if (tid_conf->retry_long > rdev->wiphy.max_data_retry_count) in parse_tid_conf()
15892 return -EINVAL; in parse_tid_conf()
15896 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_AMPDU_CTRL); in parse_tid_conf()
15897 tid_conf->ampdu = in parse_tid_conf()
15902 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL); in parse_tid_conf()
15903 tid_conf->rtscts = in parse_tid_conf()
15908 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_AMSDU_CTRL); in parse_tid_conf()
15909 tid_conf->amsdu = in parse_tid_conf()
15916 tid_conf->txrate_type = nla_get_u8(attrs[idx]); in parse_tid_conf()
15918 if (tid_conf->txrate_type != NL80211_TX_RATE_AUTOMATIC) { in parse_tid_conf()
15921 &tid_conf->txrate_mask, dev, in parse_tid_conf()
15926 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_TX_RATE); in parse_tid_conf()
15928 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE); in parse_tid_conf()
15932 mask = rdev->wiphy.tid_config_support.peer; in parse_tid_conf()
15934 mask = rdev->wiphy.tid_config_support.vif; in parse_tid_conf()
15936 if (tid_conf->mask & ~mask) { in parse_tid_conf()
15938 return -EOPNOTSUPP; in parse_tid_conf()
15947 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_tid_config()
15949 unsigned int link_id = nl80211_link_id(info->attrs); in nl80211_set_tid_config()
15950 struct net_device *dev = info->user_ptr[1]; in nl80211_set_tid_config()
15954 int ret = -EINVAL; in nl80211_set_tid_config()
15957 if (!info->attrs[NL80211_ATTR_TID_CONFIG]) in nl80211_set_tid_config()
15958 return -EINVAL; in nl80211_set_tid_config()
15960 if (!rdev->ops->set_tid_config) in nl80211_set_tid_config()
15961 return -EOPNOTSUPP; in nl80211_set_tid_config()
15963 nla_for_each_nested(tid, info->attrs[NL80211_ATTR_TID_CONFIG], in nl80211_set_tid_config()
15970 return -ENOMEM; in nl80211_set_tid_config()
15972 tid_config->n_tid_conf = num_conf; in nl80211_set_tid_config()
15974 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_set_tid_config()
15975 tid_config->peer = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_set_tid_config()
15977 nla_for_each_nested(tid, info->attrs[NL80211_ATTR_TID_CONFIG], in nl80211_set_tid_config()
15986 &tid_config->tid_conf[conf_idx], in nl80211_set_tid_config()
15987 info, tid_config->peer, link_id); in nl80211_set_tid_config()
16003 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_color_change()
16005 struct net_device *dev = info->user_ptr[1]; in nl80211_color_change()
16006 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_color_change()
16011 if (!rdev->ops->color_change) in nl80211_color_change()
16012 return -EOPNOTSUPP; in nl80211_color_change()
16014 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_color_change()
16016 return -EOPNOTSUPP; in nl80211_color_change()
16018 if (wdev->iftype != NL80211_IFTYPE_AP) in nl80211_color_change()
16019 return -EOPNOTSUPP; in nl80211_color_change()
16021 if (!info->attrs[NL80211_ATTR_COLOR_CHANGE_COUNT] || in nl80211_color_change()
16022 !info->attrs[NL80211_ATTR_COLOR_CHANGE_COLOR] || in nl80211_color_change()
16023 !info->attrs[NL80211_ATTR_COLOR_CHANGE_ELEMS]) in nl80211_color_change()
16024 return -EINVAL; in nl80211_color_change()
16026 params.count = nla_get_u8(info->attrs[NL80211_ATTR_COLOR_CHANGE_COUNT]); in nl80211_color_change()
16027 params.color = nla_get_u8(info->attrs[NL80211_ATTR_COLOR_CHANGE_COLOR]); in nl80211_color_change()
16029 err = nl80211_parse_beacon(rdev, info->attrs, &params.beacon_next, in nl80211_color_change()
16030 info->extack); in nl80211_color_change()
16036 return -ENOMEM; in nl80211_color_change()
16039 info->attrs[NL80211_ATTR_COLOR_CHANGE_ELEMS], in nl80211_color_change()
16040 nl80211_policy, info->extack); in nl80211_color_change()
16045 info->extack); in nl80211_color_change()
16050 err = -EINVAL; in nl80211_color_change()
16055 err = -EINVAL; in nl80211_color_change()
16061 err = -EINVAL; in nl80211_color_change()
16066 err = -EINVAL; in nl80211_color_change()
16075 err = -EINVAL; in nl80211_color_change()
16081 err = -EINVAL; in nl80211_color_change()
16087 err = -EINVAL; in nl80211_color_change()
16108 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_fils_aad()
16109 struct net_device *dev = info->user_ptr[1]; in nl80211_set_fils_aad()
16113 if (!info->attrs[NL80211_ATTR_MAC] || in nl80211_set_fils_aad()
16114 !info->attrs[NL80211_ATTR_FILS_KEK] || in nl80211_set_fils_aad()
16115 !info->attrs[NL80211_ATTR_FILS_NONCES]) in nl80211_set_fils_aad()
16116 return -EINVAL; in nl80211_set_fils_aad()
16118 fils_aad.macaddr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_set_fils_aad()
16119 fils_aad.kek_len = nla_len(info->attrs[NL80211_ATTR_FILS_KEK]); in nl80211_set_fils_aad()
16120 fils_aad.kek = nla_data(info->attrs[NL80211_ATTR_FILS_KEK]); in nl80211_set_fils_aad()
16121 nonces = nla_data(info->attrs[NL80211_ATTR_FILS_NONCES]); in nl80211_set_fils_aad()
16130 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_add_link()
16131 unsigned int link_id = nl80211_link_id(info->attrs); in nl80211_add_link()
16132 struct net_device *dev = info->user_ptr[1]; in nl80211_add_link()
16133 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_add_link()
16136 if (!(wdev->wiphy->flags & WIPHY_FLAG_SUPPORTS_MLO)) in nl80211_add_link()
16137 return -EINVAL; in nl80211_add_link()
16139 switch (wdev->iftype) { in nl80211_add_link()
16143 return -EINVAL; in nl80211_add_link()
16146 if (!info->attrs[NL80211_ATTR_MAC] || in nl80211_add_link()
16147 !is_valid_ether_addr(nla_data(info->attrs[NL80211_ATTR_MAC]))) in nl80211_add_link()
16148 return -EINVAL; in nl80211_add_link()
16150 wdev->valid_links |= BIT(link_id); in nl80211_add_link()
16151 ether_addr_copy(wdev->links[link_id].addr, in nl80211_add_link()
16152 nla_data(info->attrs[NL80211_ATTR_MAC])); in nl80211_add_link()
16156 wdev->valid_links &= ~BIT(link_id); in nl80211_add_link()
16157 eth_zero_addr(wdev->links[link_id].addr); in nl80211_add_link()
16165 unsigned int link_id = nl80211_link_id(info->attrs); in nl80211_remove_link()
16166 struct net_device *dev = info->user_ptr[1]; in nl80211_remove_link()
16167 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_remove_link()
16170 if (!info->attrs[NL80211_ATTR_MLO_LINK_ID]) in nl80211_remove_link()
16171 return -EINVAL; in nl80211_remove_link()
16173 switch (wdev->iftype) { in nl80211_remove_link()
16177 return -EINVAL; in nl80211_remove_link()
16190 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_add_mod_link_station()
16191 struct net_device *dev = info->user_ptr[1]; in nl80211_add_mod_link_station()
16194 if ((add && !rdev->ops->add_link_station) || in nl80211_add_mod_link_station()
16195 (!add && !rdev->ops->mod_link_station)) in nl80211_add_mod_link_station()
16196 return -EOPNOTSUPP; in nl80211_add_mod_link_station()
16198 if (add && !info->attrs[NL80211_ATTR_MAC]) in nl80211_add_mod_link_station()
16199 return -EINVAL; in nl80211_add_mod_link_station()
16201 if (!info->attrs[NL80211_ATTR_MLD_ADDR]) in nl80211_add_mod_link_station()
16202 return -EINVAL; in nl80211_add_mod_link_station()
16204 if (add && !info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) in nl80211_add_mod_link_station()
16205 return -EINVAL; in nl80211_add_mod_link_station()
16207 params.mld_mac = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]); in nl80211_add_mod_link_station()
16209 if (info->attrs[NL80211_ATTR_MAC]) { in nl80211_add_mod_link_station()
16210 params.link_mac = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_add_mod_link_station()
16212 return -EINVAL; in nl80211_add_mod_link_station()
16215 if (!info->attrs[NL80211_ATTR_MLO_LINK_ID]) in nl80211_add_mod_link_station()
16216 return -EINVAL; in nl80211_add_mod_link_station()
16218 params.link_id = nla_get_u8(info->attrs[NL80211_ATTR_MLO_LINK_ID]); in nl80211_add_mod_link_station()
16220 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) { in nl80211_add_mod_link_station()
16222 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); in nl80211_add_mod_link_station()
16224 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); in nl80211_add_mod_link_station()
16227 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) in nl80211_add_mod_link_station()
16229 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]); in nl80211_add_mod_link_station()
16231 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) in nl80211_add_mod_link_station()
16233 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]); in nl80211_add_mod_link_station()
16235 if (info->attrs[NL80211_ATTR_HE_CAPABILITY]) { in nl80211_add_mod_link_station()
16237 nla_data(info->attrs[NL80211_ATTR_HE_CAPABILITY]); in nl80211_add_mod_link_station()
16239 nla_len(info->attrs[NL80211_ATTR_HE_CAPABILITY]); in nl80211_add_mod_link_station()
16241 if (info->attrs[NL80211_ATTR_EHT_CAPABILITY]) { in nl80211_add_mod_link_station()
16243 nla_data(info->attrs[NL80211_ATTR_EHT_CAPABILITY]); in nl80211_add_mod_link_station()
16245 nla_len(info->attrs[NL80211_ATTR_EHT_CAPABILITY]); in nl80211_add_mod_link_station()
16251 return -EINVAL; in nl80211_add_mod_link_station()
16255 if (info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]) in nl80211_add_mod_link_station()
16257 nla_data(info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]); in nl80211_add_mod_link_station()
16259 if (info->attrs[NL80211_ATTR_OPMODE_NOTIF]) { in nl80211_add_mod_link_station()
16262 nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]); in nl80211_add_mod_link_station()
16292 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_remove_link_station()
16293 struct net_device *dev = info->user_ptr[1]; in nl80211_remove_link_station()
16295 if (!rdev->ops->del_link_station) in nl80211_remove_link_station()
16296 return -EOPNOTSUPP; in nl80211_remove_link_station()
16298 if (!info->attrs[NL80211_ATTR_MLD_ADDR] || in nl80211_remove_link_station()
16299 !info->attrs[NL80211_ATTR_MLO_LINK_ID]) in nl80211_remove_link_station()
16300 return -EINVAL; in nl80211_remove_link_station()
16302 params.mld_mac = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]); in nl80211_remove_link_station()
16303 params.link_id = nla_get_u8(info->attrs[NL80211_ATTR_MLO_LINK_ID]); in nl80211_remove_link_station()
16311 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_hw_timestamp()
16312 struct net_device *dev = info->user_ptr[1]; in nl80211_set_hw_timestamp()
16315 if (!rdev->wiphy.hw_timestamp_max_peers) in nl80211_set_hw_timestamp()
16316 return -EOPNOTSUPP; in nl80211_set_hw_timestamp()
16318 if (!info->attrs[NL80211_ATTR_MAC] && in nl80211_set_hw_timestamp()
16319 rdev->wiphy.hw_timestamp_max_peers != CFG80211_HW_TIMESTAMP_ALL_PEERS) in nl80211_set_hw_timestamp()
16320 return -EOPNOTSUPP; in nl80211_set_hw_timestamp()
16322 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_set_hw_timestamp()
16323 hwts.macaddr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_set_hw_timestamp()
16326 nla_get_flag(info->attrs[NL80211_ATTR_HW_TIMESTAMP_ENABLED]); in nl80211_set_hw_timestamp()
16335 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_ttlm()
16336 struct net_device *dev = info->user_ptr[1]; in nl80211_set_ttlm()
16337 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_ttlm()
16339 if (wdev->iftype != NL80211_IFTYPE_STATION && in nl80211_set_ttlm()
16340 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_set_ttlm()
16341 return -EOPNOTSUPP; in nl80211_set_ttlm()
16343 if (!wdev->connected) in nl80211_set_ttlm()
16344 return -ENOLINK; in nl80211_set_ttlm()
16346 if (!info->attrs[NL80211_ATTR_MLO_TTLM_DLINK] || in nl80211_set_ttlm()
16347 !info->attrs[NL80211_ATTR_MLO_TTLM_ULINK]) in nl80211_set_ttlm()
16348 return -EINVAL; in nl80211_set_ttlm()
16351 info->attrs[NL80211_ATTR_MLO_TTLM_DLINK], in nl80211_set_ttlm()
16354 info->attrs[NL80211_ATTR_MLO_TTLM_ULINK], in nl80211_set_ttlm()
16458 if (WARN_ON(ops->internal_flags >= ARRAY_SIZE(nl80211_internal_flags))) in nl80211_pre_doit()
16459 return -EINVAL; in nl80211_pre_doit()
16461 internal_flags = nl80211_internal_flags[ops->internal_flags]; in nl80211_pre_doit()
16470 info->user_ptr[0] = rdev; in nl80211_pre_doit()
16474 info->attrs); in nl80211_pre_doit()
16480 dev = wdev->netdev; in nl80211_pre_doit()
16482 rdev = wiphy_to_rdev(wdev->wiphy); in nl80211_pre_doit()
16486 err = -EINVAL; in nl80211_pre_doit()
16490 info->user_ptr[1] = dev; in nl80211_pre_doit()
16492 info->user_ptr[1] = wdev; in nl80211_pre_doit()
16497 err = -ENETDOWN; in nl80211_pre_doit()
16501 info->user_ptr[0] = rdev; in nl80211_pre_doit()
16505 struct nlattr *link_id = info->attrs[NL80211_ATTR_MLO_LINK_ID]; in nl80211_pre_doit()
16508 err = -EINVAL; in nl80211_pre_doit()
16512 /* MLO -> require valid link ID */ in nl80211_pre_doit()
16513 if (wdev->valid_links && in nl80211_pre_doit()
16515 !(wdev->valid_links & BIT(nla_get_u8(link_id))))) { in nl80211_pre_doit()
16516 err = -EINVAL; in nl80211_pre_doit()
16520 /* non-MLO -> no link ID attribute accepted */ in nl80211_pre_doit()
16521 if (!wdev->valid_links && link_id) { in nl80211_pre_doit()
16522 err = -EINVAL; in nl80211_pre_doit()
16528 if (info->attrs[NL80211_ATTR_MLO_LINK_ID] || in nl80211_pre_doit()
16529 (wdev && wdev->valid_links)) { in nl80211_pre_doit()
16530 err = -EINVAL; in nl80211_pre_doit()
16536 wiphy_lock(&rdev->wiphy); in nl80211_pre_doit()
16538 __release(&rdev->wiphy.mtx); in nl80211_pre_doit()
16554 u32 internal_flags = nl80211_internal_flags[ops->internal_flags]; in nl80211_post_doit()
16556 if (info->user_ptr[1]) { in nl80211_post_doit()
16558 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_post_doit()
16560 dev_put(wdev->netdev); in nl80211_post_doit()
16562 dev_put(info->user_ptr[1]); in nl80211_post_doit()
16566 if (info->user_ptr[0] && in nl80211_post_doit()
16568 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_post_doit()
16571 __acquire(&rdev->wiphy.mtx); in nl80211_post_doit()
16572 wiphy_unlock(&rdev->wiphy); in nl80211_post_doit()
16597 return -EINVAL; in nl80211_set_sar_sub_specs()
16601 return -EINVAL; in nl80211_set_sar_sub_specs()
16606 if (range_index >= rdev->wiphy.sar_capa->num_freq_ranges) in nl80211_set_sar_sub_specs()
16607 return -EINVAL; in nl80211_set_sar_sub_specs()
16611 if (sar_specs->sub_specs[i].freq_range_index == range_index) in nl80211_set_sar_sub_specs()
16612 return -EINVAL; in nl80211_set_sar_sub_specs()
16615 sar_specs->sub_specs[index].power = in nl80211_set_sar_sub_specs()
16618 sar_specs->sub_specs[index].freq_range_index = range_index; in nl80211_set_sar_sub_specs()
16625 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_sar_specs()
16634 if (!rdev->wiphy.sar_capa || !rdev->ops->set_sar_specs) in nl80211_set_sar_specs()
16635 return -EOPNOTSUPP; in nl80211_set_sar_specs()
16637 if (!info->attrs[NL80211_ATTR_SAR_SPEC]) in nl80211_set_sar_specs()
16638 return -EINVAL; in nl80211_set_sar_specs()
16641 info->attrs[NL80211_ATTR_SAR_SPEC], in nl80211_set_sar_specs()
16645 return -EINVAL; in nl80211_set_sar_specs()
16648 if (type != rdev->wiphy.sar_capa->type) in nl80211_set_sar_specs()
16649 return -EINVAL; in nl80211_set_sar_specs()
16655 if (specs > rdev->wiphy.sar_capa->num_freq_ranges) in nl80211_set_sar_specs()
16656 return -EINVAL; in nl80211_set_sar_specs()
16660 return -ENOMEM; in nl80211_set_sar_specs()
16662 sar_spec->type = type; in nl80211_set_sar_specs()
16672 err = -EINVAL; in nl80211_set_sar_specs()
16677 err = -EINVAL; in nl80211_set_sar_specs()
16683 sar_spec->num_sub_specs = specs; in nl80211_set_sar_specs()
16685 rdev->cur_cmd_info = info; in nl80211_set_sar_specs()
16687 rdev->cur_cmd_info = NULL; in nl80211_set_sar_specs()
17589 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_notify_wiphy()
17608 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_notify_iface()
17615 struct cfg80211_scan_request *req = rdev->scan_req; in nl80211_add_scan_req()
17626 for (i = 0; i < req->n_ssids; i++) { in nl80211_add_scan_req()
17627 if (nla_put(msg, i, req->ssids[i].ssid_len, req->ssids[i].ssid)) in nl80211_add_scan_req()
17632 if (req->flags & NL80211_SCAN_FLAG_FREQ_KHZ) { in nl80211_add_scan_req()
17636 for (i = 0; i < req->n_channels; i++) { in nl80211_add_scan_req()
17638 ieee80211_channel_to_khz(req->channels[i]))) in nl80211_add_scan_req()
17647 for (i = 0; i < req->n_channels; i++) { in nl80211_add_scan_req()
17648 if (nla_put_u32(msg, i, req->channels[i]->center_freq)) in nl80211_add_scan_req()
17654 if (req->ie && in nl80211_add_scan_req()
17655 nla_put(msg, NL80211_ATTR_IE, req->ie_len, req->ie)) in nl80211_add_scan_req()
17658 if (req->flags && in nl80211_add_scan_req()
17659 nla_put_u32(msg, NL80211_ATTR_SCAN_FLAGS, req->flags)) in nl80211_add_scan_req()
17662 info = rdev->int_scan_req ? &rdev->int_scan_req->info : in nl80211_add_scan_req()
17663 &rdev->scan_req->info; in nl80211_add_scan_req()
17664 if (info->scan_start_tsf && in nl80211_add_scan_req()
17666 info->scan_start_tsf, NL80211_BSS_PAD) || in nl80211_add_scan_req()
17668 info->tsf_bssid))) in nl80211_add_scan_req()
17673 return -ENOBUFS; in nl80211_add_scan_req()
17686 return -1; in nl80211_prep_scan_msg()
17688 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_prep_scan_msg()
17689 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, in nl80211_prep_scan_msg()
17690 wdev->netdev->ifindex)) || in nl80211_prep_scan_msg()
17703 return -EMSGSIZE; in nl80211_prep_scan_msg()
17714 return -1; in nl80211_prep_sched_scan_msg()
17717 wiphy_to_rdev(req->wiphy)->wiphy_idx) || in nl80211_prep_sched_scan_msg()
17718 nla_put_u32(msg, NL80211_ATTR_IFINDEX, req->dev->ifindex) || in nl80211_prep_sched_scan_msg()
17719 nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, req->reqid, in nl80211_prep_sched_scan_msg()
17728 return -EMSGSIZE; in nl80211_prep_sched_scan_msg()
17746 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_scan_start()
17776 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_scan_msg()
17793 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(req->wiphy), msg, 0, in nl80211_send_sched_scan()
17801 if (nla_put_u8(msg, NL80211_ATTR_REG_INITIATOR, request->initiator)) in nl80211_reg_change_event_fill()
17804 if (request->alpha2[0] == '0' && request->alpha2[1] == '0') { in nl80211_reg_change_event_fill()
17808 } else if (request->alpha2[0] == '9' && request->alpha2[1] == '9') { in nl80211_reg_change_event_fill()
17812 } else if ((request->alpha2[0] == '9' && request->alpha2[1] == '8') || in nl80211_reg_change_event_fill()
17813 request->intersect) { in nl80211_reg_change_event_fill()
17821 request->alpha2)) in nl80211_reg_change_event_fill()
17825 if (request->wiphy_idx != WIPHY_IDX_INVALID) { in nl80211_reg_change_event_fill()
17826 struct wiphy *wiphy = wiphy_idx_to_wiphy(request->wiphy_idx); in nl80211_reg_change_event_fill()
17829 nla_put_u32(msg, NL80211_ATTR_WIPHY, request->wiphy_idx)) in nl80211_reg_change_event_fill()
17833 wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED && in nl80211_reg_change_event_fill()
17896 msg = nlmsg_new(100 + event->buf_len + event->req_ies_len, gfp); in nl80211_send_mlme_event()
17900 hdr = nl80211hdr_put(msg, 0, 0, 0, event->cmd); in nl80211_send_mlme_event()
17906 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_mlme_event()
17907 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_send_mlme_event()
17908 nla_put(msg, NL80211_ATTR_FRAME, event->buf_len, event->buf) || in nl80211_send_mlme_event()
17909 (event->req_ies && in nl80211_send_mlme_event()
17910 nla_put(msg, NL80211_ATTR_REQ_IE, event->req_ies_len, in nl80211_send_mlme_event()
17911 event->req_ies))) in nl80211_send_mlme_event()
17914 if (event->reconnect && in nl80211_send_mlme_event()
17918 if (event->uapsd_queues >= 0) { in nl80211_send_mlme_event()
17925 event->uapsd_queues)) in nl80211_send_mlme_event()
17933 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_mlme_event()
17949 .uapsd_queues = -1, in nl80211_send_rx_auth()
17961 .buf = data->buf, in nl80211_send_rx_assoc()
17962 .buf_len = data->len, in nl80211_send_rx_assoc()
17963 .uapsd_queues = data->uapsd_queues, in nl80211_send_rx_assoc()
17964 .req_ies = data->req_ies, in nl80211_send_rx_assoc()
17965 .req_ies_len = data->req_ies_len, in nl80211_send_rx_assoc()
17980 .uapsd_queues = -1, in nl80211_send_deauth()
17995 .uapsd_queues = -1, in nl80211_send_disassoc()
18004 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_rx_unprot_mlme_mgmt()
18005 struct wiphy *wiphy = wdev->wiphy; in cfg80211_rx_unprot_mlme_mgmt()
18011 .uapsd_queues = -1, in cfg80211_rx_unprot_mlme_mgmt()
18017 if (ieee80211_is_deauth(mgmt->frame_control)) { in cfg80211_rx_unprot_mlme_mgmt()
18019 } else if (ieee80211_is_disassoc(mgmt->frame_control)) { in cfg80211_rx_unprot_mlme_mgmt()
18021 } else if (ieee80211_is_beacon(mgmt->frame_control)) { in cfg80211_rx_unprot_mlme_mgmt()
18022 if (wdev->unprot_beacon_reported && in cfg80211_rx_unprot_mlme_mgmt()
18023 elapsed_jiffies_msecs(wdev->unprot_beacon_reported) < 10000) in cfg80211_rx_unprot_mlme_mgmt()
18026 wdev->unprot_beacon_reported = jiffies; in cfg80211_rx_unprot_mlme_mgmt()
18053 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_mlme_timeout()
18054 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_send_mlme_timeout()
18061 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_mlme_timeout()
18094 const u8 *connected_addr = cr->valid_links ? in nl80211_send_connect_result()
18095 cr->ap_mld_addr : cr->links[0].bssid; in nl80211_send_connect_result()
18097 if (cr->valid_links) { in nl80211_send_connect_result()
18103 link_info_size += cr->links[link].addr ? in nl80211_send_connect_result()
18105 link_info_size += (cr->links[link].bssid || in nl80211_send_connect_result()
18106 cr->links[link].bss) ? in nl80211_send_connect_result()
18112 msg = nlmsg_new(100 + cr->req_ie_len + cr->resp_ie_len + in nl80211_send_connect_result()
18113 cr->fils.kek_len + cr->fils.pmk_len + in nl80211_send_connect_result()
18114 (cr->fils.pmkid ? WLAN_PMKID_LEN : 0) + link_info_size, in nl80211_send_connect_result()
18125 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_connect_result()
18126 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_send_connect_result()
18130 cr->status < 0 ? WLAN_STATUS_UNSPECIFIED_FAILURE : in nl80211_send_connect_result()
18131 cr->status) || in nl80211_send_connect_result()
18132 (cr->status < 0 && in nl80211_send_connect_result()
18135 cr->timeout_reason))) || in nl80211_send_connect_result()
18136 (cr->req_ie && in nl80211_send_connect_result()
18137 nla_put(msg, NL80211_ATTR_REQ_IE, cr->req_ie_len, cr->req_ie)) || in nl80211_send_connect_result()
18138 (cr->resp_ie && in nl80211_send_connect_result()
18139 nla_put(msg, NL80211_ATTR_RESP_IE, cr->resp_ie_len, in nl80211_send_connect_result()
18140 cr->resp_ie)) || in nl80211_send_connect_result()
18141 (cr->fils.update_erp_next_seq_num && in nl80211_send_connect_result()
18143 cr->fils.erp_next_seq_num)) || in nl80211_send_connect_result()
18144 (cr->status == WLAN_STATUS_SUCCESS && in nl80211_send_connect_result()
18145 ((cr->fils.kek && in nl80211_send_connect_result()
18146 nla_put(msg, NL80211_ATTR_FILS_KEK, cr->fils.kek_len, in nl80211_send_connect_result()
18147 cr->fils.kek)) || in nl80211_send_connect_result()
18148 (cr->fils.pmk && in nl80211_send_connect_result()
18149 nla_put(msg, NL80211_ATTR_PMK, cr->fils.pmk_len, cr->fils.pmk)) || in nl80211_send_connect_result()
18150 (cr->fils.pmkid && in nl80211_send_connect_result()
18151 nla_put(msg, NL80211_ATTR_PMKID, WLAN_PMKID_LEN, cr->fils.pmkid))))) in nl80211_send_connect_result()
18154 if (cr->valid_links) { in nl80211_send_connect_result()
18164 const u8 *bssid = cr->links[link].bss ? in nl80211_send_connect_result()
18165 cr->links[link].bss->bssid : in nl80211_send_connect_result()
18166 cr->links[link].bssid; in nl80211_send_connect_result()
18175 (cr->links[link].addr && in nl80211_send_connect_result()
18177 cr->links[link].addr)) || in nl80211_send_connect_result()
18179 cr->links[link].status)) in nl80211_send_connect_result()
18190 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_connect_result()
18206 const u8 *connected_addr = info->ap_mld_addr ? in nl80211_send_roamed()
18207 info->ap_mld_addr : in nl80211_send_roamed()
18208 (info->links[0].bss ? in nl80211_send_roamed()
18209 info->links[0].bss->bssid : in nl80211_send_roamed()
18210 info->links[0].bssid); in nl80211_send_roamed()
18212 if (info->valid_links) { in nl80211_send_roamed()
18218 link_info_size += info->links[link].addr ? in nl80211_send_roamed()
18220 link_info_size += (info->links[link].bssid || in nl80211_send_roamed()
18221 info->links[link].bss) ? in nl80211_send_roamed()
18226 msg = nlmsg_new(100 + info->req_ie_len + info->resp_ie_len + in nl80211_send_roamed()
18227 info->fils.kek_len + info->fils.pmk_len + in nl80211_send_roamed()
18228 (info->fils.pmkid ? WLAN_PMKID_LEN : 0) + in nl80211_send_roamed()
18239 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_roamed()
18240 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_send_roamed()
18242 (info->req_ie && in nl80211_send_roamed()
18243 nla_put(msg, NL80211_ATTR_REQ_IE, info->req_ie_len, in nl80211_send_roamed()
18244 info->req_ie)) || in nl80211_send_roamed()
18245 (info->resp_ie && in nl80211_send_roamed()
18246 nla_put(msg, NL80211_ATTR_RESP_IE, info->resp_ie_len, in nl80211_send_roamed()
18247 info->resp_ie)) || in nl80211_send_roamed()
18248 (info->fils.update_erp_next_seq_num && in nl80211_send_roamed()
18250 info->fils.erp_next_seq_num)) || in nl80211_send_roamed()
18251 (info->fils.kek && in nl80211_send_roamed()
18252 nla_put(msg, NL80211_ATTR_FILS_KEK, info->fils.kek_len, in nl80211_send_roamed()
18253 info->fils.kek)) || in nl80211_send_roamed()
18254 (info->fils.pmk && in nl80211_send_roamed()
18255 nla_put(msg, NL80211_ATTR_PMK, info->fils.pmk_len, info->fils.pmk)) || in nl80211_send_roamed()
18256 (info->fils.pmkid && in nl80211_send_roamed()
18257 nla_put(msg, NL80211_ATTR_PMKID, WLAN_PMKID_LEN, info->fils.pmkid))) in nl80211_send_roamed()
18260 if (info->valid_links) { in nl80211_send_roamed()
18270 const u8 *bssid = info->links[link].bss ? in nl80211_send_roamed()
18271 info->links[link].bss->bssid : in nl80211_send_roamed()
18272 info->links[link].bssid; in nl80211_send_roamed()
18281 (info->links[link].addr && in nl80211_send_roamed()
18283 info->links[link].addr))) in nl80211_send_roamed()
18294 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_roamed()
18319 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_port_authorized()
18320 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_send_port_authorized()
18331 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_port_authorized()
18356 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_disconnected()
18357 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_send_disconnected()
18367 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_disconnected()
18377 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_links_removed()
18378 struct wiphy *wiphy = wdev->wiphy; in cfg80211_links_removed()
18384 lockdep_assert_wiphy(wdev->wiphy); in cfg80211_links_removed()
18387 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_STATION && in cfg80211_links_removed()
18388 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT)) in cfg80211_links_removed()
18391 if (WARN_ON(!wdev->valid_links || !link_mask || in cfg80211_links_removed()
18392 (wdev->valid_links & link_mask) != link_mask || in cfg80211_links_removed()
18393 wdev->valid_links == link_mask)) in cfg80211_links_removed()
18397 wdev->valid_links &= ~link_mask; in cfg80211_links_removed()
18409 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_links_removed()
18410 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) in cfg80211_links_removed()
18436 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_links_removed()
18462 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_ibss_bssid()
18463 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_send_ibss_bssid()
18469 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_ibss_bssid()
18481 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_notify_new_peer_candidate()
18482 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_notify_new_peer_candidate()
18486 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_MESH_POINT)) in cfg80211_notify_new_peer_candidate()
18501 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_notify_new_peer_candidate()
18502 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in cfg80211_notify_new_peer_candidate()
18512 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_notify_new_peer_candidate()
18539 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_michael_mic_failure()
18540 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_michael_mic_failure()
18543 (key_id != -1 && in nl80211_michael_mic_failure()
18550 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_michael_mic_failure()
18633 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_remain_on_chan_event()
18634 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, in nl80211_send_remain_on_chan_event()
18635 wdev->netdev->ifindex)) || in nl80211_send_remain_on_chan_event()
18638 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, chan->center_freq) || in nl80211_send_remain_on_chan_event()
18651 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_remain_on_chan_event()
18662 struct wireless_dev *wdev = netdev->ieee80211_ptr; in cfg80211_assoc_comeback()
18663 struct wiphy *wiphy = wdev->wiphy; in cfg80211_assoc_comeback()
18680 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_assoc_comeback()
18681 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in cfg80211_assoc_comeback()
18688 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_assoc_comeback()
18701 struct wiphy *wiphy = wdev->wiphy; in cfg80211_ready_on_channel()
18715 struct wiphy *wiphy = wdev->wiphy; in cfg80211_remain_on_channel_expired()
18728 struct wiphy *wiphy = wdev->wiphy; in cfg80211_tx_mgmt_expired()
18740 struct wiphy *wiphy = dev->ieee80211_ptr->wiphy; in cfg80211_new_sta()
18756 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_new_sta()
18764 struct wiphy *wiphy = dev->ieee80211_ptr->wiphy; in cfg80211_del_sta_sinfo()
18786 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_del_sta_sinfo()
18795 struct wiphy *wiphy = dev->ieee80211_ptr->wiphy; in cfg80211_conn_failed()
18810 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in cfg80211_conn_failed()
18817 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_conn_failed()
18829 struct wireless_dev *wdev = dev->ieee80211_ptr; in __nl80211_unexpected_frame()
18830 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in __nl80211_unexpected_frame()
18833 u32 nlportid = READ_ONCE(wdev->ap_unexpected_nlportid); in __nl80211_unexpected_frame()
18848 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in __nl80211_unexpected_frame()
18849 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in __nl80211_unexpected_frame()
18854 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); in __nl80211_unexpected_frame()
18865 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_rx_spurious_frame()
18870 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP && in cfg80211_rx_spurious_frame()
18871 wdev->iftype != NL80211_IFTYPE_P2P_GO)) { in cfg80211_rx_spurious_frame()
18885 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_rx_unexpected_4addr_frame()
18890 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP && in cfg80211_rx_unexpected_4addr_frame()
18891 wdev->iftype != NL80211_IFTYPE_P2P_GO && in cfg80211_rx_unexpected_4addr_frame()
18892 wdev->iftype != NL80211_IFTYPE_AP_VLAN)) { in cfg80211_rx_unexpected_4addr_frame()
18908 struct net_device *netdev = wdev->netdev; in nl80211_send_mgmt()
18912 msg = nlmsg_new(100 + info->len, gfp); in nl80211_send_mgmt()
18914 return -ENOMEM; in nl80211_send_mgmt()
18919 return -ENOMEM; in nl80211_send_mgmt()
18922 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_mgmt()
18924 netdev->ifindex)) || in nl80211_send_mgmt()
18927 (info->have_link_id && in nl80211_send_mgmt()
18928 nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, info->link_id)) || in nl80211_send_mgmt()
18929 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, KHZ_TO_MHZ(info->freq)) || in nl80211_send_mgmt()
18930 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ_OFFSET, info->freq % 1000) || in nl80211_send_mgmt()
18931 (info->sig_dbm && in nl80211_send_mgmt()
18932 nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, info->sig_dbm)) || in nl80211_send_mgmt()
18933 nla_put(msg, NL80211_ATTR_FRAME, info->len, info->buf) || in nl80211_send_mgmt()
18934 (info->flags && in nl80211_send_mgmt()
18935 nla_put_u32(msg, NL80211_ATTR_RXMGMT_FLAGS, info->flags)) || in nl80211_send_mgmt()
18936 (info->rx_tstamp && nla_put_u64_64bit(msg, in nl80211_send_mgmt()
18938 info->rx_tstamp, in nl80211_send_mgmt()
18940 (info->ack_tstamp && nla_put_u64_64bit(msg, in nl80211_send_mgmt()
18942 info->ack_tstamp, in nl80211_send_mgmt()
18948 return genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); in nl80211_send_mgmt()
18952 return -ENOBUFS; in nl80211_send_mgmt()
18959 struct wiphy *wiphy = wdev->wiphy; in nl80211_frame_tx_status()
18961 struct net_device *netdev = wdev->netdev; in nl80211_frame_tx_status()
18966 trace_cfg80211_mgmt_tx_status(wdev, status->cookie, in nl80211_frame_tx_status()
18967 status->ack); in nl80211_frame_tx_status()
18969 trace_cfg80211_control_port_tx_status(wdev, status->cookie, in nl80211_frame_tx_status()
18970 status->ack); in nl80211_frame_tx_status()
18972 msg = nlmsg_new(100 + status->len, gfp); in nl80211_frame_tx_status()
18982 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_frame_tx_status()
18984 netdev->ifindex)) || in nl80211_frame_tx_status()
18987 nla_put(msg, NL80211_ATTR_FRAME, status->len, status->buf) || in nl80211_frame_tx_status()
18988 nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, status->cookie, in nl80211_frame_tx_status()
18990 (status->ack && nla_put_flag(msg, NL80211_ATTR_ACK)) || in nl80211_frame_tx_status()
18991 (status->tx_tstamp && in nl80211_frame_tx_status()
18993 status->tx_tstamp, NL80211_ATTR_PAD)) || in nl80211_frame_tx_status()
18994 (status->ack_tstamp && in nl80211_frame_tx_status()
18996 status->ack_tstamp, NL80211_ATTR_PAD))) in nl80211_frame_tx_status()
19001 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_frame_tx_status()
19038 struct wireless_dev *wdev = dev->ieee80211_ptr; in __nl80211_rx_control_port()
19039 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in __nl80211_rx_control_port()
19041 const u8 *addr = ehdr->h_source; in __nl80211_rx_control_port()
19042 u16 proto = be16_to_cpu(skb->protocol); in __nl80211_rx_control_port()
19047 u32 nlportid = READ_ONCE(wdev->conn_owner_nlportid); in __nl80211_rx_control_port()
19050 return -ENOENT; in __nl80211_rx_control_port()
19052 msg = nlmsg_new(100 + skb->len, gfp); in __nl80211_rx_control_port()
19054 return -ENOMEM; in __nl80211_rx_control_port()
19059 return -ENOBUFS; in __nl80211_rx_control_port()
19062 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in __nl80211_rx_control_port()
19063 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in __nl80211_rx_control_port()
19074 frame = nla_reserve(msg, NL80211_ATTR_FRAME, skb->len); in __nl80211_rx_control_port()
19078 skb_copy_bits(skb, 0, nla_data(frame), skb->len); in __nl80211_rx_control_port()
19081 return genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); in __nl80211_rx_control_port()
19085 return -ENOBUFS; in __nl80211_rx_control_port()
19104 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_prepare_cqm()
19105 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_prepare_cqm()
19112 cb = (void **)msg->cb; in cfg80211_prepare_cqm()
19120 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_prepare_cqm()
19121 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) in cfg80211_prepare_cqm()
19141 void **cb = (void **)msg->cb; in cfg80211_send_cqm()
19147 memset(msg->cb, 0, sizeof(msg->cb)); in cfg80211_send_cqm()
19149 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_send_cqm()
19157 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_cqm_rssi_notify()
19167 cqm_config = rcu_dereference(wdev->cqm_config); in cfg80211_cqm_rssi_notify()
19169 cqm_config->last_rssi_event_value = rssi_level; in cfg80211_cqm_rssi_notify()
19170 cqm_config->last_rssi_event_type = rssi_event; in cfg80211_cqm_rssi_notify()
19171 wiphy_work_queue(wdev->wiphy, &wdev->cqm_rssi_work); in cfg80211_cqm_rssi_notify()
19187 cqm_config = wiphy_dereference(wdev->wiphy, wdev->cqm_config); in cfg80211_cqm_rssi_notify_work()
19191 if (cqm_config->use_range_api) in cfg80211_cqm_rssi_notify_work()
19192 cfg80211_cqm_rssi_update(rdev, wdev->netdev, cqm_config); in cfg80211_cqm_rssi_notify_work()
19194 rssi_level = cqm_config->last_rssi_event_value; in cfg80211_cqm_rssi_notify_work()
19195 rssi_event = cqm_config->last_rssi_event_type; in cfg80211_cqm_rssi_notify_work()
19197 msg = cfg80211_prepare_cqm(wdev->netdev, NULL, GFP_KERNEL); in cfg80211_cqm_rssi_notify_work()
19303 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_gtk_rekey_notify()
19304 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_gtk_rekey_notify()
19320 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_gtk_rekey_notify()
19331 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_gtk_rekey_notify()
19332 struct wiphy *wiphy = wdev->wiphy; in cfg80211_gtk_rekey_notify()
19359 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_pmksa_candidate_notify()
19360 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex)) in nl80211_pmksa_candidate_notify()
19377 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_pmksa_candidate_notify()
19388 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_pmksa_candidate_notify()
19389 struct wiphy *wiphy = wdev->wiphy; in cfg80211_pmksa_candidate_notify()
19405 struct wireless_dev *wdev = netdev->ieee80211_ptr; in nl80211_ch_switch_notify()
19419 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex)) in nl80211_ch_switch_notify()
19422 if (wdev->valid_links && in nl80211_ch_switch_notify()
19442 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_ch_switch_notify()
19454 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_ch_switch_notify()
19455 struct wiphy *wiphy = wdev->wiphy; in cfg80211_ch_switch_notify()
19458 lockdep_assert_wiphy(wdev->wiphy); in cfg80211_ch_switch_notify()
19463 switch (wdev->iftype) { in cfg80211_ch_switch_notify()
19466 if (!WARN_ON(!wdev->links[link_id].client.current_bss)) in cfg80211_ch_switch_notify()
19468 chandef->chan); in cfg80211_ch_switch_notify()
19471 wdev->u.mesh.chandef = *chandef; in cfg80211_ch_switch_notify()
19472 wdev->u.mesh.preset_chandef = *chandef; in cfg80211_ch_switch_notify()
19476 wdev->links[link_id].ap.chandef = *chandef; in cfg80211_ch_switch_notify()
19479 wdev->u.ibss.chandef = *chandef; in cfg80211_ch_switch_notify()
19500 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_ch_switch_started_notify()
19501 struct wiphy *wiphy = wdev->wiphy; in cfg80211_ch_switch_started_notify()
19504 lockdep_assert_wiphy(wdev->wiphy); in cfg80211_ch_switch_started_notify()
19521 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_bss_color_notify()
19522 struct wiphy *wiphy = wdev->wiphy; in cfg80211_bss_color_notify()
19527 lockdep_assert_wiphy(wdev->wiphy); in cfg80211_bss_color_notify()
19533 return -ENOMEM; in cfg80211_bss_color_notify()
19539 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) in cfg80211_bss_color_notify()
19553 return genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), in cfg80211_bss_color_notify()
19558 return -EINVAL; in cfg80211_bss_color_notify()
19581 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx)) in nl80211_radar_notify()
19586 struct wireless_dev *wdev = netdev->ieee80211_ptr; in nl80211_radar_notify()
19588 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_radar_notify()
19602 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_radar_notify()
19615 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_sta_opmode_change_notify()
19616 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_sta_opmode_change_notify()
19632 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx)) in cfg80211_sta_opmode_change_notify()
19635 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) in cfg80211_sta_opmode_change_notify()
19641 if ((sta_opmode->changed & STA_OPMODE_SMPS_MODE_CHANGED) && in cfg80211_sta_opmode_change_notify()
19642 nla_put_u8(msg, NL80211_ATTR_SMPS_MODE, sta_opmode->smps_mode)) in cfg80211_sta_opmode_change_notify()
19645 if ((sta_opmode->changed & STA_OPMODE_MAX_BW_CHANGED) && in cfg80211_sta_opmode_change_notify()
19646 nla_put_u32(msg, NL80211_ATTR_CHANNEL_WIDTH, sta_opmode->bw)) in cfg80211_sta_opmode_change_notify()
19649 if ((sta_opmode->changed & STA_OPMODE_N_SS_CHANGED) && in cfg80211_sta_opmode_change_notify()
19650 nla_put_u8(msg, NL80211_ATTR_NSS, sta_opmode->rx_nss)) in cfg80211_sta_opmode_change_notify()
19655 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_sta_opmode_change_notify()
19669 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_probe_status()
19670 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_probe_status()
19687 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_probe_status()
19688 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in cfg80211_probe_status()
19699 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_probe_status()
19709 size_t len, int freq, int sig_dbm) in cfg80211_report_obss_beacon_khz() argument
19716 trace_cfg80211_report_obss_beacon(wiphy, frame, len, freq, sig_dbm); in cfg80211_report_obss_beacon_khz()
19718 spin_lock_bh(&rdev->beacon_registrations_lock); in cfg80211_report_obss_beacon_khz()
19719 list_for_each_entry(reg, &rdev->beacon_registrations, list) { in cfg80211_report_obss_beacon_khz()
19722 spin_unlock_bh(&rdev->beacon_registrations_lock); in cfg80211_report_obss_beacon_khz()
19730 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_report_obss_beacon_khz()
19731 (freq && in cfg80211_report_obss_beacon_khz()
19733 KHZ_TO_MHZ(freq)) || in cfg80211_report_obss_beacon_khz()
19735 freq % 1000))) || in cfg80211_report_obss_beacon_khz()
19743 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, reg->nlportid); in cfg80211_report_obss_beacon_khz()
19745 spin_unlock_bh(&rdev->beacon_registrations_lock); in cfg80211_report_obss_beacon_khz()
19749 spin_unlock_bh(&rdev->beacon_registrations_lock); in cfg80211_report_obss_beacon_khz()
19758 struct cfg80211_wowlan_nd_info *nd = wakeup->net_detect; in cfg80211_net_detect_results()
19765 return -EMSGSIZE; in cfg80211_net_detect_results()
19767 for (i = 0; i < nd->n_matches; i++) { in cfg80211_net_detect_results()
19768 struct cfg80211_wowlan_nd_match *match = nd->matches[i]; in cfg80211_net_detect_results()
19781 if (nla_put(msg, NL80211_ATTR_SSID, match->ssid.ssid_len, in cfg80211_net_detect_results()
19782 match->ssid.ssid)) { in cfg80211_net_detect_results()
19787 if (match->n_channels) { in cfg80211_net_detect_results()
19795 for (j = 0; j < match->n_channels; j++) { in cfg80211_net_detect_results()
19796 if (nla_put_u32(msg, j, match->channels[j])) { in cfg80211_net_detect_results()
19818 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_report_wowlan_wakeup()
19823 trace_cfg80211_report_wowlan_wakeup(wdev->wiphy, wdev, wakeup); in cfg80211_report_wowlan_wakeup()
19826 size += wakeup->packet_present_len; in cfg80211_report_wowlan_wakeup()
19836 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_report_wowlan_wakeup()
19841 if (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, in cfg80211_report_wowlan_wakeup()
19842 wdev->netdev->ifindex)) in cfg80211_report_wowlan_wakeup()
19853 if (wakeup->disconnect && in cfg80211_report_wowlan_wakeup()
19856 if (wakeup->magic_pkt && in cfg80211_report_wowlan_wakeup()
19859 if (wakeup->gtk_rekey_failure && in cfg80211_report_wowlan_wakeup()
19862 if (wakeup->eap_identity_req && in cfg80211_report_wowlan_wakeup()
19865 if (wakeup->four_way_handshake && in cfg80211_report_wowlan_wakeup()
19868 if (wakeup->rfkill_release && in cfg80211_report_wowlan_wakeup()
19872 if (wakeup->pattern_idx >= 0 && in cfg80211_report_wowlan_wakeup()
19874 wakeup->pattern_idx)) in cfg80211_report_wowlan_wakeup()
19877 if (wakeup->tcp_match && in cfg80211_report_wowlan_wakeup()
19881 if (wakeup->tcp_connlost && in cfg80211_report_wowlan_wakeup()
19885 if (wakeup->tcp_nomoretokens && in cfg80211_report_wowlan_wakeup()
19890 if (wakeup->packet) { in cfg80211_report_wowlan_wakeup()
19894 if (!wakeup->packet_80211) { in cfg80211_report_wowlan_wakeup()
19901 if (wakeup->packet_len && in cfg80211_report_wowlan_wakeup()
19902 nla_put_u32(msg, len_attr, wakeup->packet_len)) in cfg80211_report_wowlan_wakeup()
19905 if (nla_put(msg, pkt_attr, wakeup->packet_present_len, in cfg80211_report_wowlan_wakeup()
19906 wakeup->packet)) in cfg80211_report_wowlan_wakeup()
19910 if (wakeup->net_detect && in cfg80211_report_wowlan_wakeup()
19919 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_report_wowlan_wakeup()
19933 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_tdls_oper_request()
19934 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_tdls_oper_request()
19938 trace_cfg80211_tdls_oper_request(wdev->wiphy, dev, peer, oper, in cfg80211_tdls_oper_request()
19951 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_tdls_oper_request()
19952 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in cfg80211_tdls_oper_request()
19961 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_tdls_oper_request()
19979 if (state != NETLINK_URELEASE || notify->protocol != NETLINK_GENERIC) in nl80211_netlink_notify()
19988 &rdev->sched_scan_req_list, in nl80211_netlink_notify()
19990 if (sched_scan_req->owner_nlportid == notify->portid) { in nl80211_netlink_notify()
19991 sched_scan_req->nl_owner_dead = true; in nl80211_netlink_notify()
19992 wiphy_work_queue(&rdev->wiphy, in nl80211_netlink_notify()
19993 &rdev->sched_scan_stop_wk); in nl80211_netlink_notify()
19997 list_for_each_entry_rcu(wdev, &rdev->wiphy.wdev_list, list) { in nl80211_netlink_notify()
19998 cfg80211_mlme_unregister_socket(wdev, notify->portid); in nl80211_netlink_notify()
20000 if (wdev->owner_nlportid == notify->portid) { in nl80211_netlink_notify()
20001 wdev->nl_owner_dead = true; in nl80211_netlink_notify()
20002 schedule_work(&rdev->destroy_work); in nl80211_netlink_notify()
20003 } else if (wdev->conn_owner_nlportid == notify->portid) { in nl80211_netlink_notify()
20004 schedule_work(&wdev->disconnect_wk); in nl80211_netlink_notify()
20007 cfg80211_release_pmsr(wdev, notify->portid); in nl80211_netlink_notify()
20010 spin_lock_bh(&rdev->beacon_registrations_lock); in nl80211_netlink_notify()
20011 list_for_each_entry_safe(reg, tmp, &rdev->beacon_registrations, in nl80211_netlink_notify()
20013 if (reg->nlportid == notify->portid) { in nl80211_netlink_notify()
20014 list_del(&reg->list); in nl80211_netlink_notify()
20019 spin_unlock_bh(&rdev->beacon_registrations_lock); in nl80211_netlink_notify()
20028 regulatory_netlink_notify(notify->portid); in nl80211_netlink_notify()
20039 struct wiphy *wiphy = netdev->ieee80211_ptr->wiphy; in cfg80211_ft_event()
20046 if (!ft_event->target_ap) in cfg80211_ft_event()
20049 msg = nlmsg_new(100 + ft_event->ies_len + ft_event->ric_ies_len, in cfg80211_ft_event()
20058 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_ft_event()
20059 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in cfg80211_ft_event()
20060 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, ft_event->target_ap)) in cfg80211_ft_event()
20063 if (ft_event->ies && in cfg80211_ft_event()
20064 nla_put(msg, NL80211_ATTR_IE, ft_event->ies_len, ft_event->ies)) in cfg80211_ft_event()
20066 if (ft_event->ric_ies && in cfg80211_ft_event()
20067 nla_put(msg, NL80211_ATTR_IE_RIC, ft_event->ric_ies_len, in cfg80211_ft_event()
20068 ft_event->ric_ies)) in cfg80211_ft_event()
20073 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_ft_event()
20088 rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_crit_proto_stopped()
20089 if (!rdev->crit_proto_nlportid) in cfg80211_crit_proto_stopped()
20092 nlportid = rdev->crit_proto_nlportid; in cfg80211_crit_proto_stopped()
20093 rdev->crit_proto_nlportid = 0; in cfg80211_crit_proto_stopped()
20103 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_crit_proto_stopped()
20110 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); in cfg80211_crit_proto_stopped()
20120 struct wiphy *wiphy = wdev->wiphy; in nl80211_send_ap_stopped()
20133 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_ap_stopped()
20134 nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex) || in nl80211_send_ap_stopped()
20137 (wdev->valid_links && in nl80211_send_ap_stopped()
20154 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_external_auth_request()
20155 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_external_auth_request()
20159 if (!wdev->conn_owner_nlportid) in cfg80211_external_auth_request()
20160 return -EINVAL; in cfg80211_external_auth_request()
20164 return -ENOMEM; in cfg80211_external_auth_request()
20170 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_external_auth_request()
20171 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in cfg80211_external_auth_request()
20172 nla_put_u32(msg, NL80211_ATTR_AKM_SUITES, params->key_mgmt_suite) || in cfg80211_external_auth_request()
20174 params->action) || in cfg80211_external_auth_request()
20175 nla_put(msg, NL80211_ATTR_BSSID, ETH_ALEN, params->bssid) || in cfg80211_external_auth_request()
20176 nla_put(msg, NL80211_ATTR_SSID, params->ssid.ssid_len, in cfg80211_external_auth_request()
20177 params->ssid.ssid) || in cfg80211_external_auth_request()
20178 (!is_zero_ether_addr(params->mld_addr) && in cfg80211_external_auth_request()
20179 nla_put(msg, NL80211_ATTR_MLD_ADDR, ETH_ALEN, params->mld_addr))) in cfg80211_external_auth_request()
20183 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, in cfg80211_external_auth_request()
20184 wdev->conn_owner_nlportid); in cfg80211_external_auth_request()
20189 return -ENOBUFS; in cfg80211_external_auth_request()
20197 struct wiphy *wiphy = netdev->ieee80211_ptr->wiphy; in cfg80211_update_owe_info_event()
20212 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_update_owe_info_event()
20213 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in cfg80211_update_owe_info_event()
20214 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, owe_info->peer)) in cfg80211_update_owe_info_event()
20217 if (!owe_info->ie_len || in cfg80211_update_owe_info_event()
20218 nla_put(msg, NL80211_ATTR_IE, owe_info->ie_len, owe_info->ie)) in cfg80211_update_owe_info_event()
20221 if (owe_info->assoc_link_id != -1) { in cfg80211_update_owe_info_event()
20223 owe_info->assoc_link_id)) in cfg80211_update_owe_info_event()
20226 if (!is_zero_ether_addr(owe_info->peer_mld_addr) && in cfg80211_update_owe_info_event()
20228 owe_info->peer_mld_addr)) in cfg80211_update_owe_info_event()
20234 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_update_owe_info_event()
20246 struct wiphy *wiphy = wdev->wiphy; in cfg80211_schedule_channels_check()
20249 if (wdev->iftype == NL80211_IFTYPE_STATION && in cfg80211_schedule_channels_check()
20253 wiphy->regulatory_flags & REGULATORY_ENABLE_RELAX_NO_IR))) in cfg80211_schedule_channels_check()