Lines Matching +full:ftm +full:- +full:src

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-2024 Intel Corporation
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()
306 return -EINVAL; in validate_supported_selectors()
493 .len = 20-1 },
519 [NL80211_ATTR_IFNAME] = { .type = NLA_NUL_STRING, .len = IFNAMSIZ-1 },
549 NLA_POLICY_MAX(NLA_U8, NUM_NL80211_PLINK_ACTIONS - 1),
561 /* allow 3 for NUL-termination, we used to declare this NLA_STRING */
632 NLA_POLICY_MAX(NLA_U8, NUM_NL80211_PLINK_STATES - 1),
728 [NL80211_ATTR_TSID] = NLA_POLICY_MAX(NLA_U8, IEEE80211_NUM_TIDS - 1),
730 NLA_POLICY_MAX(NLA_U8, IEEE80211_NUM_UPS - 1),
742 NLA_POLICY_MAX(NLA_U8, NUM_NL80211_P2P_PS_STATUS - 1),
789 [NL80211_ATTR_VLAN_ID] = NLA_POLICY_RANGE(NLA_U16, 1, VLAN_N_VID - 2),
832 NLA_POLICY_RANGE(NLA_U8, 0, IEEE80211_MLD_MAX_NUM_LINKS - 1),
863 [NL80211_KEY_TYPE] = NLA_POLICY_MAX(NLA_U32, NUM_NL80211_KEYTYPES - 1),
1009 if (!cb->args[0]) { in nl80211_prepare_wdev_dump()
1016 return -ENOMEM; in nl80211_prepare_wdev_dump()
1020 err = nlmsg_parse_deprecated(cb->nlh, in nl80211_prepare_wdev_dump()
1030 *wdev = __cfg80211_wdev_from_attrs(NULL, sock_net(cb->skb->sk), in nl80211_prepare_wdev_dump()
1037 *rdev = wiphy_to_rdev((*wdev)->wiphy); in nl80211_prepare_wdev_dump()
1038 mutex_lock(&(*rdev)->wiphy.mtx); in nl80211_prepare_wdev_dump()
1040 /* 0 is the first index - add 1 to parse only once */ in nl80211_prepare_wdev_dump()
1041 cb->args[0] = (*rdev)->wiphy_idx + 1; in nl80211_prepare_wdev_dump()
1042 cb->args[1] = (*wdev)->identifier; in nl80211_prepare_wdev_dump()
1049 wiphy = wiphy_idx_to_wiphy(cb->args[0] - 1); in nl80211_prepare_wdev_dump()
1052 return -ENODEV; in nl80211_prepare_wdev_dump()
1057 list_for_each_entry(tmp, &(*rdev)->wiphy.wdev_list, list) { in nl80211_prepare_wdev_dump()
1058 if (tmp->identifier == cb->args[1]) { in nl80211_prepare_wdev_dump()
1066 return -ENODEV; in nl80211_prepare_wdev_dump()
1068 mutex_lock(&(*rdev)->wiphy.mtx); in nl80211_prepare_wdev_dump()
1100 rule->wmm_rule.client[j].cw_min) || in nl80211_msg_put_wmm_rules()
1102 rule->wmm_rule.client[j].cw_max) || in nl80211_msg_put_wmm_rules()
1104 rule->wmm_rule.client[j].aifsn) || in nl80211_msg_put_wmm_rules()
1106 rule->wmm_rule.client[j].cot)) in nl80211_msg_put_wmm_rules()
1116 return -ENOBUFS; in nl80211_msg_put_wmm_rules()
1124 * list to protect old user-space tools from breaking in nl80211_msg_put_channel()
1126 if (!large && chan->flags & in nl80211_msg_put_channel()
1129 if (!large && chan->freq_offset) in nl80211_msg_put_channel()
1133 chan->center_freq)) in nl80211_msg_put_channel()
1136 if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_OFFSET, chan->freq_offset)) in nl80211_msg_put_channel()
1139 if ((chan->flags & IEEE80211_CHAN_PSD) && in nl80211_msg_put_channel()
1140 nla_put_s8(msg, NL80211_FREQUENCY_ATTR_PSD, chan->psd)) in nl80211_msg_put_channel()
1143 if ((chan->flags & IEEE80211_CHAN_DISABLED) && in nl80211_msg_put_channel()
1146 if (chan->flags & IEEE80211_CHAN_NO_IR) { in nl80211_msg_put_channel()
1152 if (chan->flags & IEEE80211_CHAN_RADAR) { in nl80211_msg_put_channel()
1158 time = elapsed_jiffies_msecs(chan->dfs_state_entered); in nl80211_msg_put_channel()
1161 chan->dfs_state)) in nl80211_msg_put_channel()
1168 chan->dfs_cac_ms)) in nl80211_msg_put_channel()
1174 if ((chan->flags & IEEE80211_CHAN_NO_HT40MINUS) && in nl80211_msg_put_channel()
1177 if ((chan->flags & IEEE80211_CHAN_NO_HT40PLUS) && in nl80211_msg_put_channel()
1180 if ((chan->flags & IEEE80211_CHAN_NO_80MHZ) && in nl80211_msg_put_channel()
1183 if ((chan->flags & IEEE80211_CHAN_NO_160MHZ) && in nl80211_msg_put_channel()
1186 if ((chan->flags & IEEE80211_CHAN_INDOOR_ONLY) && in nl80211_msg_put_channel()
1189 if ((chan->flags & IEEE80211_CHAN_IR_CONCURRENT) && in nl80211_msg_put_channel()
1192 if ((chan->flags & IEEE80211_CHAN_NO_20MHZ) && in nl80211_msg_put_channel()
1195 if ((chan->flags & IEEE80211_CHAN_NO_10MHZ) && in nl80211_msg_put_channel()
1198 if ((chan->flags & IEEE80211_CHAN_NO_HE) && in nl80211_msg_put_channel()
1201 if ((chan->flags & IEEE80211_CHAN_1MHZ) && in nl80211_msg_put_channel()
1204 if ((chan->flags & IEEE80211_CHAN_2MHZ) && in nl80211_msg_put_channel()
1207 if ((chan->flags & IEEE80211_CHAN_4MHZ) && in nl80211_msg_put_channel()
1210 if ((chan->flags & IEEE80211_CHAN_8MHZ) && in nl80211_msg_put_channel()
1213 if ((chan->flags & IEEE80211_CHAN_16MHZ) && in nl80211_msg_put_channel()
1216 if ((chan->flags & IEEE80211_CHAN_NO_320MHZ) && in nl80211_msg_put_channel()
1219 if ((chan->flags & IEEE80211_CHAN_NO_EHT) && in nl80211_msg_put_channel()
1222 if ((chan->flags & IEEE80211_CHAN_DFS_CONCURRENT) && in nl80211_msg_put_channel()
1225 if ((chan->flags & IEEE80211_CHAN_NO_6GHZ_VLP_CLIENT) && in nl80211_msg_put_channel()
1228 if ((chan->flags & IEEE80211_CHAN_NO_6GHZ_AFC_CLIENT) && in nl80211_msg_put_channel()
1231 if ((chan->flags & IEEE80211_CHAN_CAN_MONITOR) && in nl80211_msg_put_channel()
1234 if ((chan->flags & IEEE80211_CHAN_ALLOW_6GHZ_VLP_AP) && in nl80211_msg_put_channel()
1240 DBM_TO_MBM(chan->max_power))) in nl80211_msg_put_channel()
1245 freq_reg_info(wiphy, MHZ_TO_KHZ(chan->center_freq)); in nl80211_msg_put_channel()
1247 if (!IS_ERR_OR_NULL(rule) && rule->has_wmm) { in nl80211_msg_put_channel()
1256 return -ENOBUFS; in nl80211_msg_put_channel()
1266 if (txqstats->filled & BIT(NL80211_TXQ_STATS_ ## attr) && \ in nl80211_put_txq_stats()
1267 nla_put_u32(msg, NL80211_TXQ_STATS_ ## attr, txqstats->memb)) \ in nl80211_put_txq_stats()
1295 * nl80211_link_id - return link ID
1317 return -1; in nl80211_link_id_or_invalid()
1336 info->extack); in nl80211_parse_key_new()
1340 k->def = !!tb[NL80211_KEY_DEFAULT]; in nl80211_parse_key_new()
1341 k->defmgmt = !!tb[NL80211_KEY_DEFAULT_MGMT]; in nl80211_parse_key_new()
1342 k->defbeacon = !!tb[NL80211_KEY_DEFAULT_BEACON]; in nl80211_parse_key_new()
1344 if (k->def) { in nl80211_parse_key_new()
1345 k->def_uni = true; in nl80211_parse_key_new()
1346 k->def_multi = true; in nl80211_parse_key_new()
1348 if (k->defmgmt || k->defbeacon) in nl80211_parse_key_new()
1349 k->def_multi = true; in nl80211_parse_key_new()
1352 k->idx = nla_get_u8(tb[NL80211_KEY_IDX]); in nl80211_parse_key_new()
1355 k->p.key = nla_data(tb[NL80211_KEY_DATA]); in nl80211_parse_key_new()
1356 k->p.key_len = nla_len(tb[NL80211_KEY_DATA]); in nl80211_parse_key_new()
1360 k->p.seq = nla_data(tb[NL80211_KEY_SEQ]); in nl80211_parse_key_new()
1361 k->p.seq_len = nla_len(tb[NL80211_KEY_SEQ]); in nl80211_parse_key_new()
1365 k->p.cipher = nla_get_u32(tb[NL80211_KEY_CIPHER]); in nl80211_parse_key_new()
1368 k->type = nla_get_u32(tb[NL80211_KEY_TYPE]); in nl80211_parse_key_new()
1374 NUM_NL80211_KEY_DEFAULT_TYPES - 1, in nl80211_parse_key_new()
1377 info->extack); in nl80211_parse_key_new()
1381 k->def_uni = kdt[NL80211_KEY_DEFAULT_TYPE_UNICAST]; in nl80211_parse_key_new()
1382 k->def_multi = kdt[NL80211_KEY_DEFAULT_TYPE_MULTICAST]; in nl80211_parse_key_new()
1386 k->p.mode = nla_get_u8(tb[NL80211_KEY_MODE]); in nl80211_parse_key_new()
1393 if (info->attrs[NL80211_ATTR_KEY_DATA]) { in nl80211_parse_key_old()
1394 k->p.key = nla_data(info->attrs[NL80211_ATTR_KEY_DATA]); in nl80211_parse_key_old()
1395 k->p.key_len = nla_len(info->attrs[NL80211_ATTR_KEY_DATA]); in nl80211_parse_key_old()
1398 if (info->attrs[NL80211_ATTR_KEY_SEQ]) { in nl80211_parse_key_old()
1399 k->p.seq = nla_data(info->attrs[NL80211_ATTR_KEY_SEQ]); in nl80211_parse_key_old()
1400 k->p.seq_len = nla_len(info->attrs[NL80211_ATTR_KEY_SEQ]); in nl80211_parse_key_old()
1403 if (info->attrs[NL80211_ATTR_KEY_IDX]) in nl80211_parse_key_old()
1404 k->idx = nla_get_u8(info->attrs[NL80211_ATTR_KEY_IDX]); in nl80211_parse_key_old()
1406 if (info->attrs[NL80211_ATTR_KEY_CIPHER]) in nl80211_parse_key_old()
1407 k->p.cipher = nla_get_u32(info->attrs[NL80211_ATTR_KEY_CIPHER]); in nl80211_parse_key_old()
1409 k->def = !!info->attrs[NL80211_ATTR_KEY_DEFAULT]; in nl80211_parse_key_old()
1410 k->defmgmt = !!info->attrs[NL80211_ATTR_KEY_DEFAULT_MGMT]; in nl80211_parse_key_old()
1412 if (k->def) { in nl80211_parse_key_old()
1413 k->def_uni = true; in nl80211_parse_key_old()
1414 k->def_multi = true; in nl80211_parse_key_old()
1416 if (k->defmgmt) in nl80211_parse_key_old()
1417 k->def_multi = true; in nl80211_parse_key_old()
1419 if (info->attrs[NL80211_ATTR_KEY_TYPE]) in nl80211_parse_key_old()
1420 k->type = nla_get_u32(info->attrs[NL80211_ATTR_KEY_TYPE]); in nl80211_parse_key_old()
1422 if (info->attrs[NL80211_ATTR_KEY_DEFAULT_TYPES]) { in nl80211_parse_key_old()
1425 NUM_NL80211_KEY_DEFAULT_TYPES - 1, in nl80211_parse_key_old()
1426 info->attrs[NL80211_ATTR_KEY_DEFAULT_TYPES], in nl80211_parse_key_old()
1428 info->extack); in nl80211_parse_key_old()
1432 k->def_uni = kdt[NL80211_KEY_DEFAULT_TYPE_UNICAST]; in nl80211_parse_key_old()
1433 k->def_multi = kdt[NL80211_KEY_DEFAULT_TYPE_MULTICAST]; in nl80211_parse_key_old()
1444 k->idx = -1; in nl80211_parse_key()
1445 k->type = -1; in nl80211_parse_key()
1447 if (info->attrs[NL80211_ATTR_KEY]) in nl80211_parse_key()
1448 err = nl80211_parse_key_new(info, info->attrs[NL80211_ATTR_KEY], k); in nl80211_parse_key()
1455 if ((k->def ? 1 : 0) + (k->defmgmt ? 1 : 0) + in nl80211_parse_key()
1456 (k->defbeacon ? 1 : 0) > 1) { in nl80211_parse_key()
1459 return -EINVAL; in nl80211_parse_key()
1462 if (k->defmgmt || k->defbeacon) { in nl80211_parse_key()
1463 if (k->def_uni || !k->def_multi) { in nl80211_parse_key()
1466 return -EINVAL; in nl80211_parse_key()
1470 if (k->idx != -1) { in nl80211_parse_key()
1471 if (k->defmgmt) { in nl80211_parse_key()
1472 if (k->idx < 4 || k->idx > 5) { in nl80211_parse_key()
1475 return -EINVAL; in nl80211_parse_key()
1477 } else if (k->defbeacon) { in nl80211_parse_key()
1478 if (k->idx < 6 || k->idx > 7) { in nl80211_parse_key()
1481 return -EINVAL; in nl80211_parse_key()
1483 } else if (k->def) { in nl80211_parse_key()
1484 if (k->idx < 0 || k->idx > 3) { in nl80211_parse_key()
1485 GENL_SET_ERR_MSG(info, "def key idx not 0-3"); in nl80211_parse_key()
1486 return -EINVAL; in nl80211_parse_key()
1489 if (k->idx < 0 || k->idx > 7) { in nl80211_parse_key()
1490 GENL_SET_ERR_MSG(info, "key idx not 0-7"); in nl80211_parse_key()
1491 return -EINVAL; in nl80211_parse_key()
1503 struct nlattr *keys = info->attrs[NL80211_ATTR_KEYS]; in nl80211_parse_connkeys()
1520 return ERR_PTR(-ENOMEM); in nl80211_parse_connkeys()
1522 result->def = -1; in nl80211_parse_connkeys()
1526 parse.idx = -1; in nl80211_parse_connkeys()
1531 err = -EINVAL; in nl80211_parse_connkeys()
1535 GENL_SET_ERR_MSG(info, "key index out of range [0-3]"); in nl80211_parse_connkeys()
1545 result->def = parse.idx; in nl80211_parse_connkeys()
1557 err = -EINVAL; in nl80211_parse_connkeys()
1560 result->params[parse.idx].cipher = parse.p.cipher; in nl80211_parse_connkeys()
1561 result->params[parse.idx].key_len = parse.p.key_len; in nl80211_parse_connkeys()
1562 result->params[parse.idx].key = result->data[parse.idx]; in nl80211_parse_connkeys()
1563 memcpy(result->data[parse.idx], parse.p.key, parse.p.key_len); in nl80211_parse_connkeys()
1570 if (result->def < 0) { in nl80211_parse_connkeys()
1571 err = -EINVAL; in nl80211_parse_connkeys()
1584 lockdep_assert_wiphy(wdev->wiphy); in nl80211_key_allowed()
1586 switch (wdev->iftype) { in nl80211_key_allowed()
1593 if (wdev->u.ibss.current_bss) in nl80211_key_allowed()
1595 return -ENOLINK; in nl80211_key_allowed()
1598 if (wdev->connected) in nl80211_key_allowed()
1600 return -ENOLINK; in nl80211_key_allowed()
1602 if (wiphy_ext_feature_isset(wdev->wiphy, in nl80211_key_allowed()
1605 return -EINVAL; in nl80211_key_allowed()
1612 return -EINVAL; in nl80211_key_allowed()
1624 if (!chan || chan->flags & IEEE80211_CHAN_DISABLED) in nl80211_get_valid_chan()
1649 return -ENOBUFS; in nl80211_put_iftypes()
1668 for (i = 0; i < c->n_limits; i++) { in nl80211_put_ifcomb_data()
1674 if (nla_put_u32(msg, NL80211_IFACE_LIMIT_MAX, c->limits[i].max)) in nl80211_put_ifcomb_data()
1677 c->limits[i].types)) in nl80211_put_ifcomb_data()
1684 if (c->beacon_int_infra_match && in nl80211_put_ifcomb_data()
1688 c->num_different_channels) || in nl80211_put_ifcomb_data()
1690 c->max_interfaces)) in nl80211_put_ifcomb_data()
1694 c->radar_detect_widths) || in nl80211_put_ifcomb_data()
1696 c->radar_detect_regions))) in nl80211_put_ifcomb_data()
1698 if (c->beacon_int_min_gcd && in nl80211_put_ifcomb_data()
1700 c->beacon_int_min_gcd)) in nl80211_put_ifcomb_data()
1707 return -ENOBUFS; in nl80211_put_ifcomb_data()
1724 c = wiphy->radio[0].iface_combinations; in nl80211_put_iface_combinations()
1725 n = wiphy->radio[0].n_iface_combinations; in nl80211_put_iface_combinations()
1727 c = wiphy->iface_combinations; in nl80211_put_iface_combinations()
1728 n = wiphy->n_iface_combinations; in nl80211_put_iface_combinations()
1738 return -ENOBUFS; in nl80211_put_iface_combinations()
1745 const struct wiphy_wowlan_tcp_support *tcp = rdev->wiphy.wowlan->tcp; in nl80211_send_wowlan_tcp_caps()
1754 return -ENOBUFS; in nl80211_send_wowlan_tcp_caps()
1757 tcp->data_payload_max)) in nl80211_send_wowlan_tcp_caps()
1758 return -ENOBUFS; in nl80211_send_wowlan_tcp_caps()
1761 tcp->data_payload_max)) in nl80211_send_wowlan_tcp_caps()
1762 return -ENOBUFS; in nl80211_send_wowlan_tcp_caps()
1764 if (tcp->seq && nla_put_flag(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ)) in nl80211_send_wowlan_tcp_caps()
1765 return -ENOBUFS; in nl80211_send_wowlan_tcp_caps()
1767 if (tcp->tok && nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN, in nl80211_send_wowlan_tcp_caps()
1768 sizeof(*tcp->tok), tcp->tok)) in nl80211_send_wowlan_tcp_caps()
1769 return -ENOBUFS; in nl80211_send_wowlan_tcp_caps()
1772 tcp->data_interval_max)) in nl80211_send_wowlan_tcp_caps()
1773 return -ENOBUFS; in nl80211_send_wowlan_tcp_caps()
1776 tcp->wake_payload_max)) in nl80211_send_wowlan_tcp_caps()
1777 return -ENOBUFS; in nl80211_send_wowlan_tcp_caps()
1789 if (!rdev->wiphy.wowlan) in nl80211_send_wowlan()
1795 return -ENOBUFS; in nl80211_send_wowlan()
1797 if (((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_ANY) && in nl80211_send_wowlan()
1799 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_DISCONNECT) && in nl80211_send_wowlan()
1801 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_MAGIC_PKT) && in nl80211_send_wowlan()
1803 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_SUPPORTS_GTK_REKEY) && in nl80211_send_wowlan()
1805 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_GTK_REKEY_FAILURE) && in nl80211_send_wowlan()
1807 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_EAP_IDENTITY_REQ) && in nl80211_send_wowlan()
1809 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_4WAY_HANDSHAKE) && in nl80211_send_wowlan()
1811 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_RFKILL_RELEASE) && in nl80211_send_wowlan()
1813 return -ENOBUFS; in nl80211_send_wowlan()
1815 if (rdev->wiphy.wowlan->n_patterns) { in nl80211_send_wowlan()
1817 .max_patterns = rdev->wiphy.wowlan->n_patterns, in nl80211_send_wowlan()
1818 .min_pattern_len = rdev->wiphy.wowlan->pattern_min_len, in nl80211_send_wowlan()
1819 .max_pattern_len = rdev->wiphy.wowlan->pattern_max_len, in nl80211_send_wowlan()
1820 .max_pkt_offset = rdev->wiphy.wowlan->max_pkt_offset, in nl80211_send_wowlan()
1825 return -ENOBUFS; in nl80211_send_wowlan()
1828 if ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_NET_DETECT) && in nl80211_send_wowlan()
1830 rdev->wiphy.wowlan->max_nd_match_sets)) in nl80211_send_wowlan()
1831 return -ENOBUFS; in nl80211_send_wowlan()
1834 return -ENOBUFS; in nl80211_send_wowlan()
1847 if (!rdev->wiphy.coalesce) in nl80211_send_coalesce()
1850 rule.max_rules = rdev->wiphy.coalesce->n_rules; in nl80211_send_coalesce()
1851 rule.max_delay = rdev->wiphy.coalesce->max_delay; in nl80211_send_coalesce()
1852 rule.pat.max_patterns = rdev->wiphy.coalesce->n_patterns; in nl80211_send_coalesce()
1853 rule.pat.min_pattern_len = rdev->wiphy.coalesce->pattern_min_len; in nl80211_send_coalesce()
1854 rule.pat.max_pattern_len = rdev->wiphy.coalesce->pattern_max_len; in nl80211_send_coalesce()
1855 rule.pat.max_pkt_offset = rdev->wiphy.coalesce->max_pkt_offset; in nl80211_send_coalesce()
1858 return -ENOBUFS; in nl80211_send_coalesce()
1868 const struct ieee80211_sta_he_cap *he_cap = &iftdata->he_cap; in nl80211_send_iftype_data()
1869 const struct ieee80211_sta_eht_cap *eht_cap = &iftdata->eht_cap; in nl80211_send_iftype_data()
1872 iftdata->types_mask)) in nl80211_send_iftype_data()
1873 return -ENOBUFS; in nl80211_send_iftype_data()
1875 if (he_cap->has_he) { in nl80211_send_iftype_data()
1877 sizeof(he_cap->he_cap_elem.mac_cap_info), in nl80211_send_iftype_data()
1878 he_cap->he_cap_elem.mac_cap_info) || in nl80211_send_iftype_data()
1880 sizeof(he_cap->he_cap_elem.phy_cap_info), in nl80211_send_iftype_data()
1881 he_cap->he_cap_elem.phy_cap_info) || in nl80211_send_iftype_data()
1883 sizeof(he_cap->he_mcs_nss_supp), in nl80211_send_iftype_data()
1884 &he_cap->he_mcs_nss_supp) || in nl80211_send_iftype_data()
1886 sizeof(he_cap->ppe_thres), he_cap->ppe_thres)) in nl80211_send_iftype_data()
1887 return -ENOBUFS; in nl80211_send_iftype_data()
1890 if (eht_cap->has_eht && he_cap->has_he) { in nl80211_send_iftype_data()
1895 is_ap = iftdata->types_mask & BIT(NL80211_IFTYPE_AP) || in nl80211_send_iftype_data()
1896 iftdata->types_mask & BIT(NL80211_IFTYPE_P2P_GO); in nl80211_send_iftype_data()
1899 ieee80211_eht_mcs_nss_size(&he_cap->he_cap_elem, in nl80211_send_iftype_data()
1900 &eht_cap->eht_cap_elem, in nl80211_send_iftype_data()
1903 ppe_thres_hdr = get_unaligned_le16(&eht_cap->eht_ppe_thres[0]); in nl80211_send_iftype_data()
1906 eht_cap->eht_cap_elem.phy_cap_info); in nl80211_send_iftype_data()
1909 sizeof(eht_cap->eht_cap_elem.mac_cap_info), in nl80211_send_iftype_data()
1910 eht_cap->eht_cap_elem.mac_cap_info) || in nl80211_send_iftype_data()
1912 sizeof(eht_cap->eht_cap_elem.phy_cap_info), in nl80211_send_iftype_data()
1913 eht_cap->eht_cap_elem.phy_cap_info) || in nl80211_send_iftype_data()
1915 mcs_nss_size, &eht_cap->eht_mcs_nss_supp) || in nl80211_send_iftype_data()
1917 ppe_thresh_size, eht_cap->eht_ppe_thres)) in nl80211_send_iftype_data()
1918 return -ENOBUFS; in nl80211_send_iftype_data()
1921 if (sband->band == NL80211_BAND_6GHZ && in nl80211_send_iftype_data()
1923 sizeof(iftdata->he_6ghz_capa), in nl80211_send_iftype_data()
1924 &iftdata->he_6ghz_capa)) in nl80211_send_iftype_data()
1925 return -ENOBUFS; in nl80211_send_iftype_data()
1927 if (iftdata->vendor_elems.data && iftdata->vendor_elems.len && in nl80211_send_iftype_data()
1929 iftdata->vendor_elems.len, iftdata->vendor_elems.data)) in nl80211_send_iftype_data()
1930 return -ENOBUFS; in nl80211_send_iftype_data()
1944 if (sband->ht_cap.ht_supported && in nl80211_send_band_rateinfo()
1946 sizeof(sband->ht_cap.mcs), in nl80211_send_band_rateinfo()
1947 &sband->ht_cap.mcs) || in nl80211_send_band_rateinfo()
1949 sband->ht_cap.cap) || in nl80211_send_band_rateinfo()
1951 sband->ht_cap.ampdu_factor) || in nl80211_send_band_rateinfo()
1953 sband->ht_cap.ampdu_density))) in nl80211_send_band_rateinfo()
1954 return -ENOBUFS; in nl80211_send_band_rateinfo()
1957 if (sband->vht_cap.vht_supported && in nl80211_send_band_rateinfo()
1959 sizeof(sband->vht_cap.vht_mcs), in nl80211_send_band_rateinfo()
1960 &sband->vht_cap.vht_mcs) || in nl80211_send_band_rateinfo()
1962 sband->vht_cap.cap))) in nl80211_send_band_rateinfo()
1963 return -ENOBUFS; in nl80211_send_band_rateinfo()
1965 if (large && sband->n_iftype_data) { in nl80211_send_band_rateinfo()
1973 return -ENOBUFS; in nl80211_send_band_rateinfo()
1980 return -ENOBUFS; in nl80211_send_band_rateinfo()
1993 if (large && sband->edmg_cap.channels && in nl80211_send_band_rateinfo()
1995 sband->edmg_cap.channels) || in nl80211_send_band_rateinfo()
1997 sband->edmg_cap.bw_config))) in nl80211_send_band_rateinfo()
1999 return -ENOBUFS; in nl80211_send_band_rateinfo()
2004 return -ENOBUFS; in nl80211_send_band_rateinfo()
2006 for (i = 0; i < sband->n_bitrates; i++) { in nl80211_send_band_rateinfo()
2009 return -ENOBUFS; in nl80211_send_band_rateinfo()
2011 rate = &sband->bitrates[i]; in nl80211_send_band_rateinfo()
2013 rate->bitrate)) in nl80211_send_band_rateinfo()
2014 return -ENOBUFS; in nl80211_send_band_rateinfo()
2015 if ((rate->flags & IEEE80211_RATE_SHORT_PREAMBLE) && in nl80211_send_band_rateinfo()
2018 return -ENOBUFS; in nl80211_send_band_rateinfo()
2026 if (sband->band == NL80211_BAND_S1GHZ && sband->s1g_cap.s1g && in nl80211_send_band_rateinfo()
2028 sizeof(sband->s1g_cap.cap), in nl80211_send_band_rateinfo()
2029 sband->s1g_cap.cap) || in nl80211_send_band_rateinfo()
2031 sizeof(sband->s1g_cap.nss_mcs), in nl80211_send_band_rateinfo()
2032 sband->s1g_cap.nss_mcs))) in nl80211_send_band_rateinfo()
2033 return -ENOBUFS; in nl80211_send_band_rateinfo()
2052 return -ENOBUFS; in nl80211_send_mgmt_stypes()
2057 return -ENOBUFS; in nl80211_send_mgmt_stypes()
2064 return -ENOBUFS; in nl80211_send_mgmt_stypes()
2075 return -ENOBUFS; in nl80211_send_mgmt_stypes()
2080 return -ENOBUFS; in nl80211_send_mgmt_stypes()
2087 return -ENOBUFS; in nl80211_send_mgmt_stypes()
2100 if (rdev->ops->op) { \
2134 if (rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL) in nl80211_add_commands_unsplit()
2139 if (rdev->wiphy.flags & WIPHY_FLAG_NETNS_OK) { in nl80211_add_commands_unsplit()
2144 if (rdev->ops->set_monitor_channel || rdev->ops->start_ap || in nl80211_add_commands_unsplit()
2145 rdev->ops->join_mesh) { in nl80211_add_commands_unsplit()
2150 if (rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) { in nl80211_add_commands_unsplit()
2154 if (rdev->wiphy.max_sched_scan_reqs) in nl80211_add_commands_unsplit()
2158 if (rdev->wiphy.flags & WIPHY_FLAG_REPORTS_OBSS) { in nl80211_add_commands_unsplit()
2169 if (rdev->ops->connect || rdev->ops->auth) { in nl80211_add_commands_unsplit()
2175 if (rdev->ops->disconnect || rdev->ops->deauth) { in nl80211_add_commands_unsplit()
2183 return -ENOBUFS; in nl80211_add_commands_unsplit()
2190 struct nlattr *ftm; in nl80211_send_pmsr_ftm_capa() local
2192 if (!cap->ftm.supported) in nl80211_send_pmsr_ftm_capa()
2195 ftm = nla_nest_start_noflag(msg, NL80211_PMSR_TYPE_FTM); in nl80211_send_pmsr_ftm_capa()
2196 if (!ftm) in nl80211_send_pmsr_ftm_capa()
2197 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
2199 if (cap->ftm.asap && nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_ASAP)) in nl80211_send_pmsr_ftm_capa()
2200 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
2201 if (cap->ftm.non_asap && in nl80211_send_pmsr_ftm_capa()
2203 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
2204 if (cap->ftm.request_lci && in nl80211_send_pmsr_ftm_capa()
2206 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
2207 if (cap->ftm.request_civicloc && in nl80211_send_pmsr_ftm_capa()
2209 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
2211 cap->ftm.preambles)) in nl80211_send_pmsr_ftm_capa()
2212 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
2214 cap->ftm.bandwidths)) in nl80211_send_pmsr_ftm_capa()
2215 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
2216 if (cap->ftm.max_bursts_exponent >= 0 && in nl80211_send_pmsr_ftm_capa()
2218 cap->ftm.max_bursts_exponent)) in nl80211_send_pmsr_ftm_capa()
2219 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
2220 if (cap->ftm.max_ftms_per_burst && in nl80211_send_pmsr_ftm_capa()
2222 cap->ftm.max_ftms_per_burst)) in nl80211_send_pmsr_ftm_capa()
2223 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
2224 if (cap->ftm.trigger_based && in nl80211_send_pmsr_ftm_capa()
2226 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
2227 if (cap->ftm.non_trigger_based && in nl80211_send_pmsr_ftm_capa()
2229 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
2231 nla_nest_end(msg, ftm); in nl80211_send_pmsr_ftm_capa()
2238 const struct cfg80211_pmsr_capabilities *cap = rdev->wiphy.pmsr_capa; in nl80211_send_pmsr_capa()
2251 return -ENOBUFS; in nl80211_send_pmsr_capa()
2253 if (nla_put_u32(msg, NL80211_PMSR_ATTR_MAX_PEERS, cap->max_peers)) in nl80211_send_pmsr_capa()
2254 return -ENOBUFS; in nl80211_send_pmsr_capa()
2256 if (cap->report_ap_tsf && in nl80211_send_pmsr_capa()
2258 return -ENOBUFS; in nl80211_send_pmsr_capa()
2260 if (cap->randomize_mac_addr && in nl80211_send_pmsr_capa()
2262 return -ENOBUFS; in nl80211_send_pmsr_capa()
2266 return -ENOBUFS; in nl80211_send_pmsr_capa()
2269 return -ENOBUFS; in nl80211_send_pmsr_capa()
2285 if (!rdev->wiphy.num_iftype_akm_suites || in nl80211_put_iftype_akm_suites()
2286 !rdev->wiphy.iftype_akm_suites) in nl80211_put_iftype_akm_suites()
2291 return -ENOBUFS; in nl80211_put_iftype_akm_suites()
2293 for (i = 0; i < rdev->wiphy.num_iftype_akm_suites; i++) { in nl80211_put_iftype_akm_suites()
2296 return -ENOBUFS; in nl80211_put_iftype_akm_suites()
2298 iftype_akms = &rdev->wiphy.iftype_akm_suites[i]; in nl80211_put_iftype_akm_suites()
2301 iftype_akms->iftypes_mask)) in nl80211_put_iftype_akm_suites()
2302 return -ENOBUFS; in nl80211_put_iftype_akm_suites()
2305 sizeof(u32) * iftype_akms->n_akm_suites, in nl80211_put_iftype_akm_suites()
2306 iftype_akms->akm_suites)) { in nl80211_put_iftype_akm_suites()
2307 return -ENOBUFS; in nl80211_put_iftype_akm_suites()
2323 if (!rdev->wiphy.tid_config_support.vif && in nl80211_put_tid_config_support()
2324 !rdev->wiphy.tid_config_support.peer) in nl80211_put_tid_config_support()
2329 return -ENOSPC; in nl80211_put_tid_config_support()
2331 if (rdev->wiphy.tid_config_support.vif && in nl80211_put_tid_config_support()
2333 rdev->wiphy.tid_config_support.vif, in nl80211_put_tid_config_support()
2337 if (rdev->wiphy.tid_config_support.peer && in nl80211_put_tid_config_support()
2339 rdev->wiphy.tid_config_support.peer, in nl80211_put_tid_config_support()
2345 rdev->wiphy.tid_config_support.max_retry)) in nl80211_put_tid_config_support()
2348 rdev->wiphy.tid_config_support.max_retry)) in nl80211_put_tid_config_support()
2356 return -ENOBUFS; in nl80211_put_tid_config_support()
2367 if (!rdev->wiphy.sar_capa) in nl80211_put_sar_specs()
2370 num_freq_ranges = rdev->wiphy.sar_capa->num_freq_ranges; in nl80211_put_sar_specs()
2374 return -ENOSPC; in nl80211_put_sar_specs()
2376 if (nla_put_u32(msg, NL80211_SAR_ATTR_TYPE, rdev->wiphy.sar_capa->type)) in nl80211_put_sar_specs()
2390 rdev->wiphy.sar_capa->freq_ranges[i].start_freq)) in nl80211_put_sar_specs()
2394 rdev->wiphy.sar_capa->freq_ranges[i].end_freq)) in nl80211_put_sar_specs()
2406 return -ENOBUFS; in nl80211_put_sar_specs()
2413 if (!wiphy->mbssid_max_interfaces) in nl80211_put_mbssid_support()
2418 return -ENOBUFS; in nl80211_put_mbssid_support()
2421 wiphy->mbssid_max_interfaces)) in nl80211_put_mbssid_support()
2424 if (wiphy->ema_max_profile_periodicity && in nl80211_put_mbssid_support()
2427 wiphy->ema_max_profile_periodicity)) in nl80211_put_mbssid_support()
2435 return -ENOBUFS; in nl80211_put_mbssid_support()
2440 const struct wiphy_radio *r = &wiphy->radio[idx]; in nl80211_put_radio()
2446 return -ENOBUFS; in nl80211_put_radio()
2451 if (r->antenna_mask && in nl80211_put_radio()
2453 r->antenna_mask)) in nl80211_put_radio()
2456 for (i = 0; i < r->n_freq_range; i++) { in nl80211_put_radio()
2457 const struct wiphy_radio_freq_range *range = &r->freq_range[i]; in nl80211_put_radio()
2464 range->start_freq) || in nl80211_put_radio()
2466 range->end_freq)) in nl80211_put_radio()
2472 for (i = 0; i < r->n_iface_combinations; i++) in nl80211_put_radio()
2475 &r->iface_combinations[i], in nl80211_put_radio()
2484 return -ENOBUFS; in nl80211_put_radio()
2492 if (!wiphy->n_radio) in nl80211_put_radios()
2497 return -ENOBUFS; in nl80211_put_radios()
2499 for (i = 0; i < wiphy->n_radio; i++) in nl80211_put_radios()
2507 -1, true, NLA_F_NESTED)) in nl80211_put_radios()
2508 return -ENOBUFS; in nl80211_put_radios()
2514 return -ENOBUFS; in nl80211_put_radios()
2537 rdev->wiphy.mgmt_stypes; in nl80211_send_wiphy()
2542 return -ENOBUFS; in nl80211_send_wiphy()
2545 return -EINVAL; in nl80211_send_wiphy()
2547 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_wiphy()
2549 wiphy_name(&rdev->wiphy)) || in nl80211_send_wiphy()
2557 switch (state->split_start) { in nl80211_send_wiphy()
2560 rdev->wiphy.retry_short) || in nl80211_send_wiphy()
2562 rdev->wiphy.retry_long) || in nl80211_send_wiphy()
2564 rdev->wiphy.frag_threshold) || in nl80211_send_wiphy()
2566 rdev->wiphy.rts_threshold) || in nl80211_send_wiphy()
2568 rdev->wiphy.coverage_class) || in nl80211_send_wiphy()
2570 rdev->wiphy.max_scan_ssids) || in nl80211_send_wiphy()
2572 rdev->wiphy.max_sched_scan_ssids) || in nl80211_send_wiphy()
2574 rdev->wiphy.max_scan_ie_len) || in nl80211_send_wiphy()
2576 rdev->wiphy.max_sched_scan_ie_len) || in nl80211_send_wiphy()
2578 rdev->wiphy.max_match_sets)) in nl80211_send_wiphy()
2581 if ((rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN) && in nl80211_send_wiphy()
2584 if ((rdev->wiphy.flags & WIPHY_FLAG_MESH_AUTH) && in nl80211_send_wiphy()
2587 if ((rdev->wiphy.flags & WIPHY_FLAG_AP_UAPSD) && in nl80211_send_wiphy()
2590 if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_FW_ROAM) && in nl80211_send_wiphy()
2593 if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) && in nl80211_send_wiphy()
2596 if ((rdev->wiphy.flags & WIPHY_FLAG_TDLS_EXTERNAL_SETUP) && in nl80211_send_wiphy()
2599 state->split_start++; in nl80211_send_wiphy()
2600 if (state->split) in nl80211_send_wiphy()
2605 sizeof(u32) * rdev->wiphy.n_cipher_suites, in nl80211_send_wiphy()
2606 rdev->wiphy.cipher_suites)) in nl80211_send_wiphy()
2610 rdev->wiphy.max_num_pmkids)) in nl80211_send_wiphy()
2613 if ((rdev->wiphy.flags & WIPHY_FLAG_CONTROL_PORT_PROTOCOL) && in nl80211_send_wiphy()
2618 rdev->wiphy.available_antennas_tx) || in nl80211_send_wiphy()
2620 rdev->wiphy.available_antennas_rx)) in nl80211_send_wiphy()
2623 if ((rdev->wiphy.flags & WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD) && in nl80211_send_wiphy()
2625 rdev->wiphy.probe_resp_offload)) in nl80211_send_wiphy()
2628 if ((rdev->wiphy.available_antennas_tx || in nl80211_send_wiphy()
2629 rdev->wiphy.available_antennas_rx) && in nl80211_send_wiphy()
2630 rdev->ops->get_antenna) { in nl80211_send_wiphy()
2646 state->split_start++; in nl80211_send_wiphy()
2647 if (state->split) in nl80211_send_wiphy()
2652 rdev->wiphy.interface_modes)) in nl80211_send_wiphy()
2654 state->split_start++; in nl80211_send_wiphy()
2655 if (state->split) in nl80211_send_wiphy()
2664 for (band = state->band_start; in nl80211_send_wiphy()
2665 band < (state->split ? in nl80211_send_wiphy()
2672 if (band > NL80211_BAND_5GHZ && !state->split) in nl80211_send_wiphy()
2675 sband = rdev->wiphy.bands[band]; in nl80211_send_wiphy()
2684 switch (state->chan_start) { in nl80211_send_wiphy()
2687 state->split)) in nl80211_send_wiphy()
2689 state->chan_start++; in nl80211_send_wiphy()
2690 if (state->split) in nl80211_send_wiphy()
2700 for (i = state->chan_start - 1; in nl80211_send_wiphy()
2701 i < sband->n_channels; in nl80211_send_wiphy()
2708 chan = &sband->channels[i]; in nl80211_send_wiphy()
2711 msg, &rdev->wiphy, chan, in nl80211_send_wiphy()
2712 state->split)) in nl80211_send_wiphy()
2716 if (state->split) in nl80211_send_wiphy()
2719 if (i < sband->n_channels) in nl80211_send_wiphy()
2720 state->chan_start = i + 2; in nl80211_send_wiphy()
2722 state->chan_start = 0; in nl80211_send_wiphy()
2728 if (state->split) { in nl80211_send_wiphy()
2730 if (state->chan_start) in nl80211_send_wiphy()
2731 band--; in nl80211_send_wiphy()
2738 state->band_start = band + 1; in nl80211_send_wiphy()
2740 state->band_start = 0; in nl80211_send_wiphy()
2743 if (state->band_start == 0 && state->chan_start == 0) in nl80211_send_wiphy()
2744 state->split_start++; in nl80211_send_wiphy()
2745 if (state->split) in nl80211_send_wiphy()
2757 if (state->split) { in nl80211_send_wiphy()
2760 if (rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH) in nl80211_send_wiphy()
2763 if (rdev->wiphy.features & in nl80211_send_wiphy()
2769 if (rdev->wiphy.sar_capa) in nl80211_send_wiphy()
2775 state->split_start++; in nl80211_send_wiphy()
2776 if (state->split) in nl80211_send_wiphy()
2780 if (rdev->ops->remain_on_channel && in nl80211_send_wiphy()
2781 (rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL) && in nl80211_send_wiphy()
2784 rdev->wiphy.max_remain_on_channel_duration)) in nl80211_send_wiphy()
2787 if ((rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX) && in nl80211_send_wiphy()
2791 state->split_start++; in nl80211_send_wiphy()
2792 if (state->split) in nl80211_send_wiphy()
2797 if (nl80211_send_wowlan(msg, rdev, state->split)) in nl80211_send_wiphy()
2799 state->split_start++; in nl80211_send_wiphy()
2800 if (state->split) in nl80211_send_wiphy()
2803 state->split_start++; in nl80211_send_wiphy()
2808 rdev->wiphy.software_iftypes)) in nl80211_send_wiphy()
2811 if (nl80211_put_iface_combinations(&rdev->wiphy, msg, in nl80211_send_wiphy()
2813 rdev->wiphy.n_radio ? 0 : -1, in nl80211_send_wiphy()
2814 state->split, 0)) in nl80211_send_wiphy()
2817 state->split_start++; in nl80211_send_wiphy()
2818 if (state->split) in nl80211_send_wiphy()
2822 if ((rdev->wiphy.flags & WIPHY_FLAG_HAVE_AP_SME) && in nl80211_send_wiphy()
2824 rdev->wiphy.ap_sme_capa)) in nl80211_send_wiphy()
2827 features = rdev->wiphy.features; in nl80211_send_wiphy()
2829 * We can only add the per-channel limit information if the in nl80211_send_wiphy()
2833 if (state->split) in nl80211_send_wiphy()
2838 if (rdev->wiphy.ht_capa_mod_mask && in nl80211_send_wiphy()
2840 sizeof(*rdev->wiphy.ht_capa_mod_mask), in nl80211_send_wiphy()
2841 rdev->wiphy.ht_capa_mod_mask)) in nl80211_send_wiphy()
2844 if (rdev->wiphy.flags & WIPHY_FLAG_HAVE_AP_SME && in nl80211_send_wiphy()
2845 rdev->wiphy.max_acl_mac_addrs && in nl80211_send_wiphy()
2847 rdev->wiphy.max_acl_mac_addrs)) in nl80211_send_wiphy()
2860 if (state->split) in nl80211_send_wiphy()
2861 state->split_start++; in nl80211_send_wiphy()
2863 state->split_start = 0; in nl80211_send_wiphy()
2870 rdev->wiphy.max_sched_scan_plans) || in nl80211_send_wiphy()
2872 rdev->wiphy.max_sched_scan_plan_interval) || in nl80211_send_wiphy()
2874 rdev->wiphy.max_sched_scan_plan_iterations)) in nl80211_send_wiphy()
2877 if (rdev->wiphy.extended_capabilities && in nl80211_send_wiphy()
2879 rdev->wiphy.extended_capabilities_len, in nl80211_send_wiphy()
2880 rdev->wiphy.extended_capabilities) || in nl80211_send_wiphy()
2882 rdev->wiphy.extended_capabilities_len, in nl80211_send_wiphy()
2883 rdev->wiphy.extended_capabilities_mask))) in nl80211_send_wiphy()
2886 if (rdev->wiphy.vht_capa_mod_mask && in nl80211_send_wiphy()
2888 sizeof(*rdev->wiphy.vht_capa_mod_mask), in nl80211_send_wiphy()
2889 rdev->wiphy.vht_capa_mod_mask)) in nl80211_send_wiphy()
2893 rdev->wiphy.perm_addr)) in nl80211_send_wiphy()
2896 if (!is_zero_ether_addr(rdev->wiphy.addr_mask) && in nl80211_send_wiphy()
2898 rdev->wiphy.addr_mask)) in nl80211_send_wiphy()
2901 if (rdev->wiphy.n_addresses > 1) { in nl80211_send_wiphy()
2908 for (i = 0; i < rdev->wiphy.n_addresses; i++) in nl80211_send_wiphy()
2910 rdev->wiphy.addresses[i].addr)) in nl80211_send_wiphy()
2916 state->split_start++; in nl80211_send_wiphy()
2922 if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_5_10_MHZ) && in nl80211_send_wiphy()
2927 if (rdev->wiphy.max_ap_assoc_sta && in nl80211_send_wiphy()
2929 rdev->wiphy.max_ap_assoc_sta)) in nl80211_send_wiphy()
2932 state->split_start++; in nl80211_send_wiphy()
2935 if (rdev->wiphy.n_vendor_commands) { in nl80211_send_wiphy()
2944 for (i = 0; i < rdev->wiphy.n_vendor_commands; i++) { in nl80211_send_wiphy()
2945 info = &rdev->wiphy.vendor_commands[i].info; in nl80211_send_wiphy()
2952 if (rdev->wiphy.n_vendor_events) { in nl80211_send_wiphy()
2961 for (i = 0; i < rdev->wiphy.n_vendor_events; i++) { in nl80211_send_wiphy()
2962 info = &rdev->wiphy.vendor_events[i]; in nl80211_send_wiphy()
2968 state->split_start++; in nl80211_send_wiphy()
2971 if (rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH && in nl80211_send_wiphy()
2973 rdev->wiphy.max_num_csa_counters)) in nl80211_send_wiphy()
2976 if (rdev->wiphy.regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED && in nl80211_send_wiphy()
2980 if (rdev->wiphy.max_sched_scan_reqs && in nl80211_send_wiphy()
2982 rdev->wiphy.max_sched_scan_reqs)) in nl80211_send_wiphy()
2986 sizeof(rdev->wiphy.ext_features), in nl80211_send_wiphy()
2987 rdev->wiphy.ext_features)) in nl80211_send_wiphy()
2990 if (rdev->wiphy.bss_select_support) { in nl80211_send_wiphy()
2992 u32 bss_select_support = rdev->wiphy.bss_select_support; in nl80211_send_wiphy()
3010 state->split_start++; in nl80211_send_wiphy()
3013 if (rdev->wiphy.num_iftype_ext_capab && in nl80211_send_wiphy()
3014 rdev->wiphy.iftype_ext_capab) { in nl80211_send_wiphy()
3022 for (i = state->capa_start; in nl80211_send_wiphy()
3023 i < rdev->wiphy.num_iftype_ext_capab; i++) { in nl80211_send_wiphy()
3026 capab = &rdev->wiphy.iftype_ext_capab[i]; in nl80211_send_wiphy()
3032 capab->iftype) || in nl80211_send_wiphy()
3034 capab->extended_capabilities_len, in nl80211_send_wiphy()
3035 capab->extended_capabilities) || in nl80211_send_wiphy()
3037 capab->extended_capabilities_len, in nl80211_send_wiphy()
3038 capab->extended_capabilities_mask)) in nl80211_send_wiphy()
3041 if (rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_MLO && in nl80211_send_wiphy()
3044 capab->eml_capabilities) || in nl80211_send_wiphy()
3047 capab->mld_capa_and_ops))) in nl80211_send_wiphy()
3051 if (state->split) in nl80211_send_wiphy()
3055 if (i < rdev->wiphy.num_iftype_ext_capab) { in nl80211_send_wiphy()
3056 state->capa_start = i + 1; in nl80211_send_wiphy()
3062 rdev->wiphy.nan_supported_bands)) in nl80211_send_wiphy()
3065 if (wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_send_wiphy()
3077 rdev->wiphy.txq_limit)) in nl80211_send_wiphy()
3080 rdev->wiphy.txq_memory_limit)) in nl80211_send_wiphy()
3083 rdev->wiphy.txq_quantum)) in nl80211_send_wiphy()
3087 state->split_start++; in nl80211_send_wiphy()
3093 state->split_start++; in nl80211_send_wiphy()
3096 if (rdev->wiphy.akm_suites && in nl80211_send_wiphy()
3098 sizeof(u32) * rdev->wiphy.n_akm_suites, in nl80211_send_wiphy()
3099 rdev->wiphy.akm_suites)) in nl80211_send_wiphy()
3107 state->split_start++; in nl80211_send_wiphy()
3113 if (nl80211_put_mbssid_support(&rdev->wiphy, msg)) in nl80211_send_wiphy()
3117 rdev->wiphy.max_num_akm_suites)) in nl80211_send_wiphy()
3120 if (rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_MLO) in nl80211_send_wiphy()
3123 if (rdev->wiphy.hw_timestamp_max_peers && in nl80211_send_wiphy()
3125 rdev->wiphy.hw_timestamp_max_peers)) in nl80211_send_wiphy()
3128 state->split_start++; in nl80211_send_wiphy()
3131 if (nl80211_put_radios(&rdev->wiphy, msg)) in nl80211_send_wiphy()
3135 state->split_start = 0; in nl80211_send_wiphy()
3144 return -EMSGSIZE; in nl80211_send_wiphy()
3155 return -ENOMEM; in nl80211_dump_wiphy_parse()
3157 ret = nlmsg_parse_deprecated(cb->nlh, in nl80211_dump_wiphy_parse()
3167 state->split = tb[NL80211_ATTR_SPLIT_WIPHY_DUMP]; in nl80211_dump_wiphy_parse()
3169 state->filter_wiphy = nla_get_u32(tb[NL80211_ATTR_WIPHY]); in nl80211_dump_wiphy_parse()
3171 state->filter_wiphy = nla_get_u64(tb[NL80211_ATTR_WDEV]) >> 32; in nl80211_dump_wiphy_parse()
3177 netdev = __dev_get_by_index(sock_net(skb->sk), ifidx); in nl80211_dump_wiphy_parse()
3179 ret = -ENODEV; in nl80211_dump_wiphy_parse()
3182 if (netdev->ieee80211_ptr) { in nl80211_dump_wiphy_parse()
3184 netdev->ieee80211_ptr->wiphy); in nl80211_dump_wiphy_parse()
3185 state->filter_wiphy = rdev->wiphy_idx; in nl80211_dump_wiphy_parse()
3198 struct nl80211_dump_wiphy_state *state = (void *)cb->args[0]; in nl80211_dump_wiphy()
3206 return -ENOMEM; in nl80211_dump_wiphy()
3208 state->filter_wiphy = -1; in nl80211_dump_wiphy()
3215 cb->args[0] = (long)state; in nl80211_dump_wiphy()
3219 if (!net_eq(wiphy_net(&rdev->wiphy), sock_net(skb->sk))) in nl80211_dump_wiphy()
3221 if (++idx <= state->start) in nl80211_dump_wiphy()
3223 if (state->filter_wiphy != -1 && in nl80211_dump_wiphy()
3224 state->filter_wiphy != rdev->wiphy_idx) in nl80211_dump_wiphy()
3226 wiphy_lock(&rdev->wiphy); in nl80211_dump_wiphy()
3231 NETLINK_CB(cb->skb).portid, in nl80211_dump_wiphy()
3232 cb->nlh->nlmsg_seq, in nl80211_dump_wiphy()
3248 if ((ret == -ENOBUFS || ret == -EMSGSIZE) && in nl80211_dump_wiphy()
3249 !skb->len && !state->split && in nl80211_dump_wiphy()
3250 cb->min_dump_alloc < 4096) { in nl80211_dump_wiphy()
3251 cb->min_dump_alloc = 4096; in nl80211_dump_wiphy()
3252 state->split_start = 0; in nl80211_dump_wiphy()
3253 wiphy_unlock(&rdev->wiphy); in nl80211_dump_wiphy()
3257 idx--; in nl80211_dump_wiphy()
3260 } while (state->split_start > 0); in nl80211_dump_wiphy()
3261 wiphy_unlock(&rdev->wiphy); in nl80211_dump_wiphy()
3266 state->start = idx; in nl80211_dump_wiphy()
3268 return skb->len; in nl80211_dump_wiphy()
3273 kfree((void *)cb->args[0]); in nl80211_dump_wiphy_done()
3280 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_wiphy()
3285 return -ENOMEM; in nl80211_get_wiphy()
3288 info->snd_portid, info->snd_seq, 0, in nl80211_get_wiphy()
3291 return -ENOBUFS; in nl80211_get_wiphy()
3313 return -EINVAL; in parse_txq_params()
3316 txq_params->txop = nla_get_u16(tb[NL80211_TXQ_ATTR_TXOP]); in parse_txq_params()
3317 txq_params->cwmin = nla_get_u16(tb[NL80211_TXQ_ATTR_CWMIN]); in parse_txq_params()
3318 txq_params->cwmax = nla_get_u16(tb[NL80211_TXQ_ATTR_CWMAX]); in parse_txq_params()
3319 txq_params->aifs = nla_get_u8(tb[NL80211_TXQ_ATTR_AIFS]); in parse_txq_params()
3322 return -EINVAL; in parse_txq_params()
3323 txq_params->ac = array_index_nospec(ac, NL80211_NUM_ACS); in parse_txq_params()
3336 * low-level driver when the AP starts or the mesh is joined. in nl80211_can_set_dev_channel()
3338 * the channel in the start-ap or join-mesh commands instead. in nl80211_can_set_dev_channel()
3345 wdev->iftype == NL80211_IFTYPE_AP || in nl80211_can_set_dev_channel()
3346 wdev->iftype == NL80211_IFTYPE_MESH_POINT || in nl80211_can_set_dev_channel()
3347 wdev->iftype == NL80211_IFTYPE_MONITOR || in nl80211_can_set_dev_channel()
3348 wdev->iftype == NL80211_IFTYPE_P2P_GO; in nl80211_can_set_dev_channel()
3355 struct netlink_ext_ack *extack = info->extack; in _nl80211_parse_chandef()
3356 struct nlattr **attrs = info->attrs; in _nl80211_parse_chandef()
3362 return -EINVAL; in _nl80211_parse_chandef()
3366 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ])); in _nl80211_parse_chandef()
3367 if (info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]) in _nl80211_parse_chandef()
3369 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]); in _nl80211_parse_chandef()
3372 chandef->chan = ieee80211_get_channel_khz(&rdev->wiphy, control_freq); in _nl80211_parse_chandef()
3373 chandef->width = NL80211_CHAN_WIDTH_20_NOHT; in _nl80211_parse_chandef()
3374 chandef->center_freq1 = KHZ_TO_MHZ(control_freq); in _nl80211_parse_chandef()
3375 chandef->freq1_offset = control_freq % 1000; in _nl80211_parse_chandef()
3376 chandef->center_freq2 = 0; in _nl80211_parse_chandef()
3378 if (!chandef->chan) { in _nl80211_parse_chandef()
3381 return -EINVAL; in _nl80211_parse_chandef()
3394 cfg80211_chandef_create(chandef, chandef->chan, in _nl80211_parse_chandef()
3398 chandef->center_freq1 != nla_get_u32(attrs[NL80211_ATTR_CENTER_FREQ1])) { in _nl80211_parse_chandef()
3402 return -EINVAL; in _nl80211_parse_chandef()
3410 return -EINVAL; in _nl80211_parse_chandef()
3417 return -EINVAL; in _nl80211_parse_chandef()
3420 chandef->width = in _nl80211_parse_chandef()
3422 if (chandef->chan->band == NL80211_BAND_S1GHZ) { in _nl80211_parse_chandef()
3424 if (chandef->width != ieee80211_s1g_channel_width(chandef->chan)) { in _nl80211_parse_chandef()
3428 return -EINVAL; in _nl80211_parse_chandef()
3432 chandef->center_freq1 = in _nl80211_parse_chandef()
3434 chandef->freq1_offset = in _nl80211_parse_chandef()
3439 chandef->center_freq2 = in _nl80211_parse_chandef()
3443 if (info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]) { in _nl80211_parse_chandef()
3444 chandef->edmg.channels = in _nl80211_parse_chandef()
3445 nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]); in _nl80211_parse_chandef()
3447 if (info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]) in _nl80211_parse_chandef()
3448 chandef->edmg.bw_config = in _nl80211_parse_chandef()
3449 nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]); in _nl80211_parse_chandef()
3451 chandef->edmg.bw_config = 0; in _nl80211_parse_chandef()
3452 chandef->edmg.channels = 0; in _nl80211_parse_chandef()
3455 if (info->attrs[NL80211_ATTR_PUNCT_BITMAP]) { in _nl80211_parse_chandef()
3456 chandef->punctured = in _nl80211_parse_chandef()
3457 nla_get_u32(info->attrs[NL80211_ATTR_PUNCT_BITMAP]); in _nl80211_parse_chandef()
3459 if (chandef->punctured && in _nl80211_parse_chandef()
3460 !wiphy_ext_feature_isset(&rdev->wiphy, in _nl80211_parse_chandef()
3464 return -EINVAL; in _nl80211_parse_chandef()
3470 return -EINVAL; in _nl80211_parse_chandef()
3473 if (!_cfg80211_chandef_usable(&rdev->wiphy, chandef, in _nl80211_parse_chandef()
3477 return -EINVAL; in _nl80211_parse_chandef()
3480 if ((chandef->width == NL80211_CHAN_WIDTH_5 || in _nl80211_parse_chandef()
3481 chandef->width == NL80211_CHAN_WIDTH_10) && in _nl80211_parse_chandef()
3482 !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_5_10_MHZ)) { in _nl80211_parse_chandef()
3484 return -EINVAL; in _nl80211_parse_chandef()
3509 wdev = dev->ieee80211_ptr; in __nl80211_set_channel()
3511 return -EOPNOTSUPP; in __nl80211_set_channel()
3513 iftype = wdev->iftype; in __nl80211_set_channel()
3516 if (wdev && wdev->valid_links) in __nl80211_set_channel()
3517 return -EINVAL; in __nl80211_set_channel()
3530 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &chandef, in __nl80211_set_channel()
3532 return -EINVAL; in __nl80211_set_channel()
3533 if (wdev->links[link_id].ap.beacon_interval) { in __nl80211_set_channel()
3536 if (!dev || !rdev->ops->set_ap_chanwidth || in __nl80211_set_channel()
3537 !(rdev->wiphy.features & in __nl80211_set_channel()
3539 return -EBUSY; in __nl80211_set_channel()
3542 cur_chan = wdev->links[link_id].ap.chandef.chan; in __nl80211_set_channel()
3544 return -EBUSY; in __nl80211_set_channel()
3547 switch (wdev->links[link_id].ap.chandef.width) { in __nl80211_set_channel()
3557 return -EINVAL; in __nl80211_set_channel()
3570 return -EINVAL; in __nl80211_set_channel()
3577 wdev->links[link_id].ap.chandef = chandef; in __nl80211_set_channel()
3579 wdev->u.ap.preset_chandef = chandef; in __nl80211_set_channel()
3590 return -EINVAL; in __nl80211_set_channel()
3595 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_channel()
3596 int link_id = nl80211_link_id_or_invalid(info->attrs); in nl80211_set_channel()
3597 struct net_device *netdev = info->user_ptr[1]; in nl80211_set_channel()
3619 * done for backward compatibility -- previously in nl80211_set_wiphy()
3626 if (info->attrs[NL80211_ATTR_IFINDEX]) { in nl80211_set_wiphy()
3627 int ifindex = nla_get_u32(info->attrs[NL80211_ATTR_IFINDEX]); in nl80211_set_wiphy()
3630 if (netdev && netdev->ieee80211_ptr) in nl80211_set_wiphy()
3631 rdev = wiphy_to_rdev(netdev->ieee80211_ptr->wiphy); in nl80211_set_wiphy()
3638 info->attrs); in nl80211_set_wiphy()
3647 wdev = netdev->ieee80211_ptr; in nl80211_set_wiphy()
3649 guard(wiphy)(&rdev->wiphy); in nl80211_set_wiphy()
3656 if (info->attrs[NL80211_ATTR_WIPHY_NAME]) in nl80211_set_wiphy()
3658 rdev, nla_data(info->attrs[NL80211_ATTR_WIPHY_NAME])); in nl80211_set_wiphy()
3664 if (info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS]) { in nl80211_set_wiphy()
3668 if (!rdev->ops->set_txq_params) in nl80211_set_wiphy()
3669 return -EOPNOTSUPP; in nl80211_set_wiphy()
3672 return -EINVAL; in nl80211_set_wiphy()
3674 if (netdev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && in nl80211_set_wiphy()
3675 netdev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_set_wiphy()
3676 return -EINVAL; in nl80211_set_wiphy()
3679 return -ENETDOWN; in nl80211_set_wiphy()
3682 info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS], in nl80211_set_wiphy()
3688 info->extack); in nl80211_set_wiphy()
3697 nl80211_link_id_or_invalid(info->attrs); in nl80211_set_wiphy()
3700 !(netdev->ieee80211_ptr->valid_links & in nl80211_set_wiphy()
3702 result = -ENOLINK; in nl80211_set_wiphy()
3704 !netdev->ieee80211_ptr->valid_links) in nl80211_set_wiphy()
3705 result = -EINVAL; in nl80211_set_wiphy()
3714 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { in nl80211_set_wiphy()
3715 int link_id = nl80211_link_id_or_invalid(info->attrs); in nl80211_set_wiphy()
3730 if (info->attrs[NL80211_ATTR_WIPHY_TX_POWER_SETTING]) { in nl80211_set_wiphy()
3735 if (!(rdev->wiphy.features & NL80211_FEATURE_VIF_TXPOWER)) in nl80211_set_wiphy()
3738 if (!rdev->ops->set_tx_power) in nl80211_set_wiphy()
3739 return -EOPNOTSUPP; in nl80211_set_wiphy()
3742 type = nla_get_u32(info->attrs[idx]); in nl80211_set_wiphy()
3744 if (!info->attrs[NL80211_ATTR_WIPHY_TX_POWER_LEVEL] && in nl80211_set_wiphy()
3746 return -EINVAL; in nl80211_set_wiphy()
3750 mbm = nla_get_u32(info->attrs[idx]); in nl80211_set_wiphy()
3758 if (info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX] && in nl80211_set_wiphy()
3759 info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]) { in nl80211_set_wiphy()
3762 if ((!rdev->wiphy.available_antennas_tx && in nl80211_set_wiphy()
3763 !rdev->wiphy.available_antennas_rx) || in nl80211_set_wiphy()
3764 !rdev->ops->set_antenna) in nl80211_set_wiphy()
3765 return -EOPNOTSUPP; in nl80211_set_wiphy()
3767 tx_ant = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX]); in nl80211_set_wiphy()
3768 rx_ant = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]); in nl80211_set_wiphy()
3772 if ((~tx_ant && (tx_ant & ~rdev->wiphy.available_antennas_tx)) || in nl80211_set_wiphy()
3773 (~rx_ant && (rx_ant & ~rdev->wiphy.available_antennas_rx))) in nl80211_set_wiphy()
3774 return -EINVAL; in nl80211_set_wiphy()
3776 tx_ant = tx_ant & rdev->wiphy.available_antennas_tx; in nl80211_set_wiphy()
3777 rx_ant = rx_ant & rdev->wiphy.available_antennas_rx; in nl80211_set_wiphy()
3786 if (info->attrs[NL80211_ATTR_WIPHY_RETRY_SHORT]) { in nl80211_set_wiphy()
3788 info->attrs[NL80211_ATTR_WIPHY_RETRY_SHORT]); in nl80211_set_wiphy()
3793 if (info->attrs[NL80211_ATTR_WIPHY_RETRY_LONG]) { in nl80211_set_wiphy()
3795 info->attrs[NL80211_ATTR_WIPHY_RETRY_LONG]); in nl80211_set_wiphy()
3800 if (info->attrs[NL80211_ATTR_WIPHY_FRAG_THRESHOLD]) { in nl80211_set_wiphy()
3802 info->attrs[NL80211_ATTR_WIPHY_FRAG_THRESHOLD]); in nl80211_set_wiphy()
3804 return -EINVAL; in nl80211_set_wiphy()
3806 if (frag_threshold != (u32) -1) { in nl80211_set_wiphy()
3818 if (info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]) { in nl80211_set_wiphy()
3820 info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]); in nl80211_set_wiphy()
3824 if (info->attrs[NL80211_ATTR_WIPHY_COVERAGE_CLASS]) { in nl80211_set_wiphy()
3825 if (info->attrs[NL80211_ATTR_WIPHY_DYN_ACK]) in nl80211_set_wiphy()
3826 return -EINVAL; in nl80211_set_wiphy()
3829 info->attrs[NL80211_ATTR_WIPHY_COVERAGE_CLASS]); in nl80211_set_wiphy()
3833 if (info->attrs[NL80211_ATTR_WIPHY_DYN_ACK]) { in nl80211_set_wiphy()
3834 if (!(rdev->wiphy.features & NL80211_FEATURE_ACKTO_ESTIMATION)) in nl80211_set_wiphy()
3835 return -EOPNOTSUPP; in nl80211_set_wiphy()
3840 if (info->attrs[NL80211_ATTR_TXQ_LIMIT]) { in nl80211_set_wiphy()
3841 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_set_wiphy()
3843 return -EOPNOTSUPP; in nl80211_set_wiphy()
3846 info->attrs[NL80211_ATTR_TXQ_LIMIT]); in nl80211_set_wiphy()
3850 if (info->attrs[NL80211_ATTR_TXQ_MEMORY_LIMIT]) { in nl80211_set_wiphy()
3851 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_set_wiphy()
3853 return -EOPNOTSUPP; in nl80211_set_wiphy()
3856 info->attrs[NL80211_ATTR_TXQ_MEMORY_LIMIT]); in nl80211_set_wiphy()
3860 if (info->attrs[NL80211_ATTR_TXQ_QUANTUM]) { in nl80211_set_wiphy()
3861 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_set_wiphy()
3863 return -EOPNOTSUPP; in nl80211_set_wiphy()
3866 info->attrs[NL80211_ATTR_TXQ_QUANTUM]); in nl80211_set_wiphy()
3876 if (!rdev->ops->set_wiphy_params) in nl80211_set_wiphy()
3877 return -EOPNOTSUPP; in nl80211_set_wiphy()
3879 old_retry_short = rdev->wiphy.retry_short; in nl80211_set_wiphy()
3880 old_retry_long = rdev->wiphy.retry_long; in nl80211_set_wiphy()
3881 old_frag_threshold = rdev->wiphy.frag_threshold; in nl80211_set_wiphy()
3882 old_rts_threshold = rdev->wiphy.rts_threshold; in nl80211_set_wiphy()
3883 old_coverage_class = rdev->wiphy.coverage_class; in nl80211_set_wiphy()
3884 old_txq_limit = rdev->wiphy.txq_limit; in nl80211_set_wiphy()
3885 old_txq_memory_limit = rdev->wiphy.txq_memory_limit; in nl80211_set_wiphy()
3886 old_txq_quantum = rdev->wiphy.txq_quantum; in nl80211_set_wiphy()
3889 rdev->wiphy.retry_short = retry_short; in nl80211_set_wiphy()
3891 rdev->wiphy.retry_long = retry_long; in nl80211_set_wiphy()
3893 rdev->wiphy.frag_threshold = frag_threshold; in nl80211_set_wiphy()
3895 rdev->wiphy.rts_threshold = rts_threshold; in nl80211_set_wiphy()
3897 rdev->wiphy.coverage_class = coverage_class; in nl80211_set_wiphy()
3899 rdev->wiphy.txq_limit = txq_limit; in nl80211_set_wiphy()
3901 rdev->wiphy.txq_memory_limit = txq_memory_limit; in nl80211_set_wiphy()
3903 rdev->wiphy.txq_quantum = txq_quantum; in nl80211_set_wiphy()
3907 rdev->wiphy.retry_short = old_retry_short; in nl80211_set_wiphy()
3908 rdev->wiphy.retry_long = old_retry_long; in nl80211_set_wiphy()
3909 rdev->wiphy.frag_threshold = old_frag_threshold; in nl80211_set_wiphy()
3910 rdev->wiphy.rts_threshold = old_rts_threshold; in nl80211_set_wiphy()
3911 rdev->wiphy.coverage_class = old_coverage_class; in nl80211_set_wiphy()
3912 rdev->wiphy.txq_limit = old_txq_limit; in nl80211_set_wiphy()
3913 rdev->wiphy.txq_memory_limit = old_txq_memory_limit; in nl80211_set_wiphy()
3914 rdev->wiphy.txq_quantum = old_txq_quantum; in nl80211_set_wiphy()
3925 return -EINVAL; in nl80211_send_chandef()
3928 chandef->chan->center_freq)) in nl80211_send_chandef()
3929 return -ENOBUFS; in nl80211_send_chandef()
3931 chandef->chan->freq_offset)) in nl80211_send_chandef()
3932 return -ENOBUFS; in nl80211_send_chandef()
3933 switch (chandef->width) { in nl80211_send_chandef()
3939 return -ENOBUFS; in nl80211_send_chandef()
3944 if (nla_put_u32(msg, NL80211_ATTR_CHANNEL_WIDTH, chandef->width)) in nl80211_send_chandef()
3945 return -ENOBUFS; in nl80211_send_chandef()
3946 if (nla_put_u32(msg, NL80211_ATTR_CENTER_FREQ1, chandef->center_freq1)) in nl80211_send_chandef()
3947 return -ENOBUFS; in nl80211_send_chandef()
3948 if (chandef->center_freq2 && in nl80211_send_chandef()
3949 nla_put_u32(msg, NL80211_ATTR_CENTER_FREQ2, chandef->center_freq2)) in nl80211_send_chandef()
3950 return -ENOBUFS; in nl80211_send_chandef()
3951 if (chandef->punctured && in nl80211_send_chandef()
3952 nla_put_u32(msg, NL80211_ATTR_PUNCT_BITMAP, chandef->punctured)) in nl80211_send_chandef()
3953 return -ENOBUFS; in nl80211_send_chandef()
3964 struct net_device *dev = wdev->netdev; in nl80211_send_iface()
3967 lockdep_assert_wiphy(&rdev->wiphy); in nl80211_send_iface()
3975 return -1; in nl80211_send_iface()
3978 (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in nl80211_send_iface()
3979 nla_put_string(msg, NL80211_ATTR_IFNAME, dev->name))) in nl80211_send_iface()
3982 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_iface()
3983 nla_put_u32(msg, NL80211_ATTR_IFTYPE, wdev->iftype) || in nl80211_send_iface()
3988 rdev->devlist_generation ^ in nl80211_send_iface()
3990 nla_put_u8(msg, NL80211_ATTR_4ADDR, wdev->use_4addr) || in nl80211_send_iface()
3991 nla_put_u32(msg, NL80211_ATTR_VIF_RADIO_MASK, wdev->radio_mask)) in nl80211_send_iface()
3994 if (rdev->ops->get_channel && !wdev->valid_links) { in nl80211_send_iface()
4003 if (rdev->ops->get_tx_power && !wdev->valid_links) { in nl80211_send_iface()
4013 switch (wdev->iftype) { in nl80211_send_iface()
4016 if (wdev->u.ap.ssid_len && in nl80211_send_iface()
4017 nla_put(msg, NL80211_ATTR_SSID, wdev->u.ap.ssid_len, in nl80211_send_iface()
4018 wdev->u.ap.ssid)) in nl80211_send_iface()
4023 if (wdev->u.client.ssid_len && in nl80211_send_iface()
4024 nla_put(msg, NL80211_ATTR_SSID, wdev->u.client.ssid_len, in nl80211_send_iface()
4025 wdev->u.client.ssid)) in nl80211_send_iface()
4029 if (wdev->u.ibss.ssid_len && in nl80211_send_iface()
4030 nla_put(msg, NL80211_ATTR_SSID, wdev->u.ibss.ssid_len, in nl80211_send_iface()
4031 wdev->u.ibss.ssid)) in nl80211_send_iface()
4039 if (rdev->ops->get_txq_stats) { in nl80211_send_iface()
4049 if (wdev->valid_links) { in nl80211_send_iface()
4068 wdev->links[link_id].addr)) in nl80211_send_iface()
4075 if (rdev->ops->get_tx_power) { in nl80211_send_iface()
4095 return -EMSGSIZE; in nl80211_send_iface()
4102 int wp_start = cb->args[0]; in nl80211_dump_interface()
4103 int if_start = cb->args[1]; in nl80211_dump_interface()
4104 int filter_wiphy = -1; in nl80211_dump_interface()
4110 if (!cb->args[2]) { in nl80211_dump_interface()
4112 .filter_wiphy = -1, in nl80211_dump_interface()
4122 * if filtering, set cb->args[2] to +1 since 0 is the default in nl80211_dump_interface()
4126 cb->args[2] = filter_wiphy + 1; in nl80211_dump_interface()
4128 cb->args[2] = -1; in nl80211_dump_interface()
4129 } else if (cb->args[2] > 0) { in nl80211_dump_interface()
4130 filter_wiphy = cb->args[2] - 1; in nl80211_dump_interface()
4134 if (!net_eq(wiphy_net(&rdev->wiphy), sock_net(skb->sk))) in nl80211_dump_interface()
4141 if (filter_wiphy >= 0 && filter_wiphy != rdev->wiphy_idx) in nl80211_dump_interface()
4146 guard(wiphy)(&rdev->wiphy); in nl80211_dump_interface()
4148 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) { in nl80211_dump_interface()
4154 if (nl80211_send_iface(skb, NETLINK_CB(cb->skb).portid, in nl80211_dump_interface()
4155 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_dump_interface()
4167 cb->args[0] = wp_idx; in nl80211_dump_interface()
4168 cb->args[1] = if_idx; in nl80211_dump_interface()
4170 ret = skb->len; in nl80211_dump_interface()
4180 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_interface()
4181 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_get_interface()
4185 return -ENOMEM; in nl80211_get_interface()
4187 if (nl80211_send_iface(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_interface()
4190 return -ENOBUFS; in nl80211_get_interface()
4214 return -EINVAL; in parse_monitor_flags()
4217 return -EINVAL; in parse_monitor_flags()
4226 return -EOPNOTSUPP; in parse_monitor_flags()
4241 if (info->attrs[NL80211_ATTR_MNTR_FLAGS]) { in nl80211_parse_mon_options()
4243 return -EINVAL; in nl80211_parse_mon_options()
4245 err = parse_monitor_flags(info->attrs[NL80211_ATTR_MNTR_FLAGS], in nl80211_parse_mon_options()
4246 &params->flags); in nl80211_parse_mon_options()
4253 if (params->flags & MONITOR_FLAG_ACTIVE && in nl80211_parse_mon_options()
4254 !(rdev->wiphy.features & NL80211_FEATURE_ACTIVE_MONITOR)) in nl80211_parse_mon_options()
4255 return -EOPNOTSUPP; in nl80211_parse_mon_options()
4257 if (info->attrs[NL80211_ATTR_MU_MIMO_GROUP_DATA]) { in nl80211_parse_mon_options()
4262 return -EINVAL; in nl80211_parse_mon_options()
4264 if (!wiphy_ext_feature_isset(&rdev->wiphy, cap_flag)) in nl80211_parse_mon_options()
4265 return -EOPNOTSUPP; in nl80211_parse_mon_options()
4268 nla_data(info->attrs[NL80211_ATTR_MU_MIMO_GROUP_DATA]); in nl80211_parse_mon_options()
4272 (mumimo_groups[VHT_MUMIMO_GROUPS_DATA_LEN - 1] & BIT(7))) in nl80211_parse_mon_options()
4273 return -EINVAL; in nl80211_parse_mon_options()
4275 params->vht_mumimo_groups = mumimo_groups; in nl80211_parse_mon_options()
4279 if (info->attrs[NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR]) { in nl80211_parse_mon_options()
4283 return -EINVAL; in nl80211_parse_mon_options()
4285 if (!wiphy_ext_feature_isset(&rdev->wiphy, cap_flag)) in nl80211_parse_mon_options()
4286 return -EOPNOTSUPP; in nl80211_parse_mon_options()
4288 params->vht_mumimo_follow_addr = in nl80211_parse_mon_options()
4289 nla_data(info->attrs[NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR]); in nl80211_parse_mon_options()
4302 return -EBUSY; in nl80211_valid_4addr()
4308 if (rdev->wiphy.flags & WIPHY_FLAG_4ADDR_AP) in nl80211_valid_4addr()
4312 if (rdev->wiphy.flags & WIPHY_FLAG_4ADDR_STATION) in nl80211_valid_4addr()
4319 return -EOPNOTSUPP; in nl80211_valid_4addr()
4325 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_parse_vif_radio_mask()
4326 struct nlattr *attr = info->attrs[NL80211_ATTR_VIF_RADIO_MASK]; in nl80211_parse_vif_radio_mask()
4334 allowed = BIT(rdev->wiphy.n_radio) - 1; in nl80211_parse_vif_radio_mask()
4337 return -EINVAL; in nl80211_parse_vif_radio_mask()
4347 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_interface()
4351 struct net_device *dev = info->user_ptr[1]; in nl80211_set_interface()
4352 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_interface()
4358 otype = ntype = dev->ieee80211_ptr->iftype; in nl80211_set_interface()
4360 if (info->attrs[NL80211_ATTR_IFTYPE]) { in nl80211_set_interface()
4361 ntype = nla_get_u32(info->attrs[NL80211_ATTR_IFTYPE]); in nl80211_set_interface()
4366 if (info->attrs[NL80211_ATTR_MESH_ID]) { in nl80211_set_interface()
4368 return -EINVAL; in nl80211_set_interface()
4370 return -EINVAL; in nl80211_set_interface()
4372 return -EBUSY; in nl80211_set_interface()
4374 wdev->u.mesh.id_up_len = in nl80211_set_interface()
4375 nla_len(info->attrs[NL80211_ATTR_MESH_ID]); in nl80211_set_interface()
4376 memcpy(wdev->u.mesh.id, in nl80211_set_interface()
4377 nla_data(info->attrs[NL80211_ATTR_MESH_ID]), in nl80211_set_interface()
4378 wdev->u.mesh.id_up_len); in nl80211_set_interface()
4381 if (info->attrs[NL80211_ATTR_4ADDR]) { in nl80211_set_interface()
4382 params.use_4addr = !!nla_get_u8(info->attrs[NL80211_ATTR_4ADDR]); in nl80211_set_interface()
4388 params.use_4addr = -1; in nl80211_set_interface()
4401 return -EBUSY; in nl80211_set_interface()
4408 if (!err && params.use_4addr != -1) in nl80211_set_interface()
4409 dev->ieee80211_ptr->use_4addr = params.use_4addr; in nl80211_set_interface()
4412 wdev->radio_mask = radio_mask; in nl80211_set_interface()
4422 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in _nl80211_new_interface()
4432 if (!info->attrs[NL80211_ATTR_IFNAME]) in _nl80211_new_interface()
4433 return -EINVAL; in _nl80211_new_interface()
4435 if (info->attrs[NL80211_ATTR_IFTYPE]) in _nl80211_new_interface()
4436 type = nla_get_u32(info->attrs[NL80211_ATTR_IFTYPE]); in _nl80211_new_interface()
4438 if (!rdev->ops->add_virtual_intf) in _nl80211_new_interface()
4439 return -EOPNOTSUPP; in _nl80211_new_interface()
4442 rdev->wiphy.features & NL80211_FEATURE_MAC_ON_CREATE) && in _nl80211_new_interface()
4443 info->attrs[NL80211_ATTR_MAC]) { in _nl80211_new_interface()
4444 nla_memcpy(params.macaddr, info->attrs[NL80211_ATTR_MAC], in _nl80211_new_interface()
4447 return -EADDRNOTAVAIL; in _nl80211_new_interface()
4450 if (info->attrs[NL80211_ATTR_4ADDR]) { in _nl80211_new_interface()
4451 params.use_4addr = !!nla_get_u8(info->attrs[NL80211_ATTR_4ADDR]); in _nl80211_new_interface()
4457 if (!cfg80211_iftype_allowed(&rdev->wiphy, type, params.use_4addr, 0)) in _nl80211_new_interface()
4458 return -EOPNOTSUPP; in _nl80211_new_interface()
4470 return -ENOMEM; in _nl80211_new_interface()
4473 nla_data(info->attrs[NL80211_ATTR_IFNAME]), in _nl80211_new_interface()
4477 return -EPROTO; in _nl80211_new_interface()
4483 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) in _nl80211_new_interface()
4484 wdev->owner_nlportid = info->snd_portid; in _nl80211_new_interface()
4488 if (!info->attrs[NL80211_ATTR_MESH_ID]) in _nl80211_new_interface()
4490 wdev->u.mesh.id_up_len = in _nl80211_new_interface()
4491 nla_len(info->attrs[NL80211_ATTR_MESH_ID]); in _nl80211_new_interface()
4492 memcpy(wdev->u.mesh.id, in _nl80211_new_interface()
4493 nla_data(info->attrs[NL80211_ATTR_MESH_ID]), in _nl80211_new_interface()
4494 wdev->u.mesh.id_up_len); in _nl80211_new_interface()
4510 wdev->radio_mask = radio_mask; in _nl80211_new_interface()
4512 if (nl80211_send_iface(msg, info->snd_portid, info->snd_seq, 0, in _nl80211_new_interface()
4515 return -ENOBUFS; in _nl80211_new_interface()
4523 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_new_interface()
4528 guard(wiphy)(&rdev->wiphy); in nl80211_new_interface()
4535 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_del_interface()
4536 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_del_interface()
4538 if (!rdev->ops->del_virtual_intf) in nl80211_del_interface()
4539 return -EOPNOTSUPP; in nl80211_del_interface()
4550 mutex_unlock(&rdev->wiphy.mtx); in nl80211_del_interface()
4559 if (!wdev->netdev) in nl80211_del_interface()
4560 info->user_ptr[1] = NULL; in nl80211_del_interface()
4562 dev_close(wdev->netdev); in nl80211_del_interface()
4564 mutex_lock(&rdev->wiphy.mtx); in nl80211_del_interface()
4571 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_noack_map()
4572 struct net_device *dev = info->user_ptr[1]; in nl80211_set_noack_map()
4575 if (!info->attrs[NL80211_ATTR_NOACK_MAP]) in nl80211_set_noack_map()
4576 return -EINVAL; in nl80211_set_noack_map()
4578 if (!rdev->ops->set_noack_map) in nl80211_set_noack_map()
4579 return -EOPNOTSUPP; in nl80211_set_noack_map()
4581 noack_map = nla_get_u16(info->attrs[NL80211_ATTR_NOACK_MAP]); in nl80211_set_noack_map()
4591 if (link_id != -1) { in nl80211_validate_key_link_id()
4594 return -EINVAL; in nl80211_validate_key_link_id()
4600 if (wdev->valid_links) { in nl80211_validate_key_link_id()
4601 if (link_id == -1) { in nl80211_validate_key_link_id()
4604 return -EINVAL; in nl80211_validate_key_link_id()
4606 if (!(wdev->valid_links & BIT(link_id))) { in nl80211_validate_key_link_id()
4608 return -EINVAL; in nl80211_validate_key_link_id()
4610 } else if (link_id != -1) { in nl80211_validate_key_link_id()
4611 GENL_SET_ERR_MSG(info, "link ID not allowed for non-MLO group key"); in nl80211_validate_key_link_id()
4612 return -EINVAL; in nl80211_validate_key_link_id()
4629 if ((params->seq && in get_key_callback()
4630 nla_put(cookie->msg, NL80211_ATTR_KEY_SEQ, in get_key_callback()
4631 params->seq_len, params->seq)) || in get_key_callback()
4632 (params->cipher && in get_key_callback()
4633 nla_put_u32(cookie->msg, NL80211_ATTR_KEY_CIPHER, in get_key_callback()
4634 params->cipher))) in get_key_callback()
4637 key = nla_nest_start_noflag(cookie->msg, NL80211_ATTR_KEY); in get_key_callback()
4641 if ((params->seq && in get_key_callback()
4642 nla_put(cookie->msg, NL80211_KEY_SEQ, in get_key_callback()
4643 params->seq_len, params->seq)) || in get_key_callback()
4644 (params->cipher && in get_key_callback()
4645 nla_put_u32(cookie->msg, NL80211_KEY_CIPHER, in get_key_callback()
4646 params->cipher))) in get_key_callback()
4649 if (nla_put_u8(cookie->msg, NL80211_KEY_IDX, cookie->idx)) in get_key_callback()
4652 nla_nest_end(cookie->msg, key); in get_key_callback()
4656 cookie->error = 1; in get_key_callback()
4661 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_key()
4663 struct net_device *dev = info->user_ptr[1]; in nl80211_get_key()
4673 int link_id = nl80211_link_id_or_invalid(info->attrs); in nl80211_get_key()
4674 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_get_key()
4676 if (wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_get_key()
4680 if ((wdev->iftype == NL80211_IFTYPE_STATION || in nl80211_get_key()
4681 wdev->iftype == NL80211_IFTYPE_P2P_CLIENT) && in nl80211_get_key()
4682 wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_get_key()
4686 if (info->attrs[NL80211_ATTR_KEY_IDX]) { in nl80211_get_key()
4687 key_idx = nla_get_u8(info->attrs[NL80211_ATTR_KEY_IDX]); in nl80211_get_key()
4691 return -EINVAL; in nl80211_get_key()
4695 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_get_key()
4696 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_get_key()
4699 if (info->attrs[NL80211_ATTR_KEY_TYPE]) { in nl80211_get_key()
4700 u32 kt = nla_get_u32(info->attrs[NL80211_ATTR_KEY_TYPE]); in nl80211_get_key()
4704 return -EINVAL; in nl80211_get_key()
4708 if (!rdev->ops->get_key) in nl80211_get_key()
4709 return -EOPNOTSUPP; in nl80211_get_key()
4711 if (!pairwise && mac_addr && !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN)) in nl80211_get_key()
4712 return -ENOENT; in nl80211_get_key()
4716 return -ENOMEM; in nl80211_get_key()
4718 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_key()
4726 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in nl80211_get_key()
4750 err = -ENOBUFS; in nl80211_get_key()
4758 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_key()
4761 struct net_device *dev = info->user_ptr[1]; in nl80211_set_key()
4762 int link_id = nl80211_link_id_or_invalid(info->attrs); in nl80211_set_key()
4763 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_key()
4770 return -EINVAL; in nl80211_set_key()
4777 return -EINVAL; in nl80211_set_key()
4780 if (!rdev->ops->set_default_key) in nl80211_set_key()
4781 return -EOPNOTSUPP; in nl80211_set_key()
4798 wdev->wext.default_key = key.idx; in nl80211_set_key()
4803 return -EINVAL; in nl80211_set_key()
4805 if (!rdev->ops->set_default_mgmt_key) in nl80211_set_key()
4806 return -EOPNOTSUPP; in nl80211_set_key()
4821 wdev->wext.default_mgmt_key = key.idx; in nl80211_set_key()
4826 return -EINVAL; in nl80211_set_key()
4828 if (!rdev->ops->set_default_beacon_key) in nl80211_set_key()
4829 return -EOPNOTSUPP; in nl80211_set_key()
4841 wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_set_key()
4845 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_set_key()
4846 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_set_key()
4849 return -EINVAL; in nl80211_set_key()
4860 return -EINVAL; in nl80211_set_key()
4865 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_new_key()
4867 struct net_device *dev = info->user_ptr[1]; in nl80211_new_key()
4870 int link_id = nl80211_link_id_or_invalid(info->attrs); in nl80211_new_key()
4871 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_new_key()
4879 return -EINVAL; in nl80211_new_key()
4882 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_new_key()
4883 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_new_key()
4885 if (key.type == -1) { in nl80211_new_key()
4896 return -EINVAL; in nl80211_new_key()
4900 info->attrs[NL80211_ATTR_VLAN_ID]) in nl80211_new_key()
4901 key.p.vlan_id = nla_get_u16(info->attrs[NL80211_ATTR_VLAN_ID]); in nl80211_new_key()
4903 if (!rdev->ops->add_key) in nl80211_new_key()
4904 return -EOPNOTSUPP; in nl80211_new_key()
4910 return -EINVAL; in nl80211_new_key()
4934 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_del_key()
4936 struct net_device *dev = info->user_ptr[1]; in nl80211_del_key()
4939 int link_id = nl80211_link_id_or_invalid(info->attrs); in nl80211_del_key()
4940 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_del_key()
4946 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_del_key()
4947 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_del_key()
4949 if (key.type == -1) { in nl80211_del_key()
4959 return -EINVAL; in nl80211_del_key()
4963 return -EINVAL; in nl80211_del_key()
4965 if (!rdev->ops->del_key) in nl80211_del_key()
4966 return -EOPNOTSUPP; in nl80211_del_key()
4971 !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN)) in nl80211_del_key()
4972 err = -ENOENT; in nl80211_del_key()
4985 if (key.idx == wdev->wext.default_key) in nl80211_del_key()
4986 wdev->wext.default_key = -1; in nl80211_del_key()
4987 else if (key.idx == wdev->wext.default_mgmt_key) in nl80211_del_key()
4988 wdev->wext.default_mgmt_key = -1; in nl80211_del_key()
5003 return -EINVAL; in validate_acl_mac_addrs()
5024 if (!wiphy->max_acl_mac_addrs) in parse_acl_data()
5025 return ERR_PTR(-EOPNOTSUPP); in parse_acl_data()
5027 if (!info->attrs[NL80211_ATTR_ACL_POLICY]) in parse_acl_data()
5028 return ERR_PTR(-EINVAL); in parse_acl_data()
5030 acl_policy = nla_get_u32(info->attrs[NL80211_ATTR_ACL_POLICY]); in parse_acl_data()
5033 return ERR_PTR(-EINVAL); in parse_acl_data()
5035 if (!info->attrs[NL80211_ATTR_MAC_ADDRS]) in parse_acl_data()
5036 return ERR_PTR(-EINVAL); in parse_acl_data()
5038 n_entries = validate_acl_mac_addrs(info->attrs[NL80211_ATTR_MAC_ADDRS]); in parse_acl_data()
5042 if (n_entries > wiphy->max_acl_mac_addrs) in parse_acl_data()
5043 return ERR_PTR(-EOPNOTSUPP); in parse_acl_data()
5047 return ERR_PTR(-ENOMEM); in parse_acl_data()
5048 acl->n_acl_entries = n_entries; in parse_acl_data()
5050 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_MAC_ADDRS], tmp) { in parse_acl_data()
5051 memcpy(acl->mac_addrs[i].addr, nla_data(attr), ETH_ALEN); in parse_acl_data()
5054 acl->acl_policy = acl_policy; in parse_acl_data()
5061 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_mac_acl()
5062 struct net_device *dev = info->user_ptr[1]; in nl80211_set_mac_acl()
5066 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && in nl80211_set_mac_acl()
5067 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_set_mac_acl()
5068 return -EOPNOTSUPP; in nl80211_set_mac_acl()
5070 if (!dev->ieee80211_ptr->links[0].ap.beacon_interval) in nl80211_set_mac_acl()
5071 return -EINVAL; in nl80211_set_mac_acl()
5073 acl = parse_acl_data(&rdev->wiphy, info); in nl80211_set_mac_acl()
5094 for (ridx = 0; ridx < sband->n_bitrates; ridx++) { in rateset_to_mask()
5096 &sband->bitrates[ridx]; in rateset_to_mask()
5097 if (rate == srate->bitrate) { in rateset_to_mask()
5102 if (ridx == sband->n_bitrates) in rateset_to_mask()
5129 if (sband->ht_cap.mcs.rx_mask[ridx] & rbit) in ht_rateset_to_mask()
5176 u16 tx_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map); in vht_set_mcs_mask()
5180 if (!sband->vht_cap.vht_supported) in vht_set_mcs_mask()
5189 if ((tx_mcs_mask[i] & txrate->mcs[i]) == txrate->mcs[i]) in vht_set_mcs_mask()
5190 mcs[i] = txrate->mcs[i]; in vht_set_mcs_mask()
5229 struct net_device *dev = info->user_ptr[1]; in he_get_txmcsmap()
5230 struct wireless_dev *wdev = dev->ieee80211_ptr; in he_get_txmcsmap()
5240 return le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_80); in he_get_txmcsmap()
5243 switch (chandef->width) { in he_get_txmcsmap()
5245 tx_mcs = he_cap->he_mcs_nss_supp.tx_mcs_80p80; in he_get_txmcsmap()
5248 tx_mcs = he_cap->he_mcs_nss_supp.tx_mcs_160; in he_get_txmcsmap()
5251 tx_mcs = he_cap->he_mcs_nss_supp.tx_mcs_80; in he_get_txmcsmap()
5270 he_cap = ieee80211_get_he_iftype_cap(sband, wdev->iftype); in he_set_mcs_mask()
5282 if ((tx_mcs_mask[i] & txrate->mcs[i]) == txrate->mcs[i]) in he_set_mcs_mask()
5283 mcs[i] = txrate->mcs[i]; in he_set_mcs_mask()
5300 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_parse_tx_bitrate_mask()
5301 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_parse_tx_bitrate_mask()
5315 sband = rdev->wiphy.bands[i]; in nl80211_parse_tx_bitrate_mask()
5320 mask->control[i].legacy = (1 << sband->n_bitrates) - 1; in nl80211_parse_tx_bitrate_mask()
5321 memcpy(mask->control[i].ht_mcs, in nl80211_parse_tx_bitrate_mask()
5322 sband->ht_cap.mcs.rx_mask, in nl80211_parse_tx_bitrate_mask()
5323 sizeof(mask->control[i].ht_mcs)); in nl80211_parse_tx_bitrate_mask()
5325 if (sband->vht_cap.vht_supported) { in nl80211_parse_tx_bitrate_mask()
5326 vht_tx_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map); in nl80211_parse_tx_bitrate_mask()
5327 vht_build_mcs_mask(vht_tx_mcs_map, mask->control[i].vht_mcs); in nl80211_parse_tx_bitrate_mask()
5330 he_cap = ieee80211_get_he_iftype_cap(sband, wdev->iftype); in nl80211_parse_tx_bitrate_mask()
5335 he_build_mcs_mask(he_tx_mcs_map, mask->control[i].he_mcs); in nl80211_parse_tx_bitrate_mask()
5337 mask->control[i].he_gi = 0xFF; in nl80211_parse_tx_bitrate_mask()
5338 mask->control[i].he_ltf = 0xFF; in nl80211_parse_tx_bitrate_mask()
5354 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
5355 sband = rdev->wiphy.bands[band]; in nl80211_parse_tx_bitrate_mask()
5357 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
5361 info->extack); in nl80211_parse_tx_bitrate_mask()
5365 mask->control[band].legacy = rateset_to_mask( in nl80211_parse_tx_bitrate_mask()
5369 if ((mask->control[band].legacy == 0) && in nl80211_parse_tx_bitrate_mask()
5371 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
5378 mask->control[band].ht_mcs)) in nl80211_parse_tx_bitrate_mask()
5379 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
5386 mask->control[band].vht_mcs)) in nl80211_parse_tx_bitrate_mask()
5387 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
5391 mask->control[band].gi = in nl80211_parse_tx_bitrate_mask()
5393 if (mask->control[band].gi > NL80211_TXRATE_FORCE_LGI) in nl80211_parse_tx_bitrate_mask()
5394 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
5399 mask->control[band].he_mcs, in nl80211_parse_tx_bitrate_mask()
5401 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
5404 mask->control[band].he_gi = in nl80211_parse_tx_bitrate_mask()
5407 mask->control[band].he_ltf = in nl80211_parse_tx_bitrate_mask()
5410 if (mask->control[band].legacy == 0) { in nl80211_parse_tx_bitrate_mask()
5414 if (!(rdev->wiphy.bands[band]->ht_cap.ht_supported || in nl80211_parse_tx_bitrate_mask()
5415 rdev->wiphy.bands[band]->vht_cap.vht_supported || in nl80211_parse_tx_bitrate_mask()
5416 ieee80211_get_he_iftype_cap(sband, wdev->iftype))) in nl80211_parse_tx_bitrate_mask()
5417 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
5420 if (mask->control[band].ht_mcs[i]) in nl80211_parse_tx_bitrate_mask()
5424 if (mask->control[band].vht_mcs[i]) in nl80211_parse_tx_bitrate_mask()
5428 if (mask->control[band].he_mcs[i]) in nl80211_parse_tx_bitrate_mask()
5432 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
5445 u32 rate = beacon_rate->control[band].legacy; in validate_beacon_tx_rate()
5449 return -EINVAL; in validate_beacon_tx_rate()
5453 if (hweight8(beacon_rate->control[band].ht_mcs[i]) > 1) { in validate_beacon_tx_rate()
5454 return -EINVAL; in validate_beacon_tx_rate()
5455 } else if (beacon_rate->control[band].ht_mcs[i]) { in validate_beacon_tx_rate()
5458 return -EINVAL; in validate_beacon_tx_rate()
5461 return -EINVAL; in validate_beacon_tx_rate()
5466 if (hweight16(beacon_rate->control[band].vht_mcs[i]) > 1) { in validate_beacon_tx_rate()
5467 return -EINVAL; in validate_beacon_tx_rate()
5468 } else if (beacon_rate->control[band].vht_mcs[i]) { in validate_beacon_tx_rate()
5471 return -EINVAL; in validate_beacon_tx_rate()
5474 return -EINVAL; in validate_beacon_tx_rate()
5479 if (hweight16(beacon_rate->control[band].he_mcs[i]) > 1) { in validate_beacon_tx_rate()
5480 return -EINVAL; in validate_beacon_tx_rate()
5481 } else if (beacon_rate->control[band].he_mcs[i]) { in validate_beacon_tx_rate()
5484 return -EINVAL; in validate_beacon_tx_rate()
5487 return -EINVAL; in validate_beacon_tx_rate()
5492 return -EINVAL; in validate_beacon_tx_rate()
5495 !wiphy_ext_feature_isset(&rdev->wiphy, in validate_beacon_tx_rate()
5497 return -EINVAL; in validate_beacon_tx_rate()
5499 !wiphy_ext_feature_isset(&rdev->wiphy, in validate_beacon_tx_rate()
5501 return -EINVAL; in validate_beacon_tx_rate()
5503 !wiphy_ext_feature_isset(&rdev->wiphy, in validate_beacon_tx_rate()
5505 return -EINVAL; in validate_beacon_tx_rate()
5507 !wiphy_ext_feature_isset(&rdev->wiphy, in validate_beacon_tx_rate()
5509 return -EINVAL; in validate_beacon_tx_rate()
5522 if (!wiphy->mbssid_max_interfaces) in nl80211_parse_mbssid_config()
5523 return -EOPNOTSUPP; in nl80211_parse_mbssid_config()
5528 return -EINVAL; in nl80211_parse_mbssid_config()
5530 config->ema = nla_get_flag(tb[NL80211_MBSSID_CONFIG_ATTR_EMA]); in nl80211_parse_mbssid_config()
5531 if (config->ema) { in nl80211_parse_mbssid_config()
5532 if (!wiphy->ema_max_profile_periodicity) in nl80211_parse_mbssid_config()
5533 return -EOPNOTSUPP; in nl80211_parse_mbssid_config()
5535 if (num_elems > wiphy->ema_max_profile_periodicity) in nl80211_parse_mbssid_config()
5536 return -EINVAL; in nl80211_parse_mbssid_config()
5539 config->index = nla_get_u8(tb[NL80211_MBSSID_CONFIG_ATTR_INDEX]); in nl80211_parse_mbssid_config()
5540 if (config->index >= wiphy->mbssid_max_interfaces || in nl80211_parse_mbssid_config()
5541 (!config->index && !num_elems)) in nl80211_parse_mbssid_config()
5542 return -EINVAL; in nl80211_parse_mbssid_config()
5548 if ((!config->index && tx_ifindex != dev->ifindex) || in nl80211_parse_mbssid_config()
5549 (config->index && tx_ifindex == dev->ifindex)) in nl80211_parse_mbssid_config()
5550 return -EINVAL; in nl80211_parse_mbssid_config()
5552 if (tx_ifindex != dev->ifindex) { in nl80211_parse_mbssid_config()
5556 if (!tx_netdev || !tx_netdev->ieee80211_ptr || in nl80211_parse_mbssid_config()
5557 tx_netdev->ieee80211_ptr->wiphy != wiphy || in nl80211_parse_mbssid_config()
5558 tx_netdev->ieee80211_ptr->iftype != in nl80211_parse_mbssid_config()
5561 return -EINVAL; in nl80211_parse_mbssid_config()
5564 config->tx_wdev = tx_netdev->ieee80211_ptr; in nl80211_parse_mbssid_config()
5566 config->tx_wdev = dev->ieee80211_ptr; in nl80211_parse_mbssid_config()
5568 } else if (!config->index) { in nl80211_parse_mbssid_config()
5569 config->tx_wdev = dev->ieee80211_ptr; in nl80211_parse_mbssid_config()
5571 return -EINVAL; in nl80211_parse_mbssid_config()
5585 if (!wiphy->mbssid_max_interfaces) in nl80211_parse_mbssid_elems()
5586 return ERR_PTR(-EINVAL); in nl80211_parse_mbssid_elems()
5590 return ERR_PTR(-EINVAL); in nl80211_parse_mbssid_elems()
5596 return ERR_PTR(-ENOMEM); in nl80211_parse_mbssid_elems()
5597 elems->cnt = num_elems; in nl80211_parse_mbssid_elems()
5600 elems->elem[i].data = nla_data(nl_elems); in nl80211_parse_mbssid_elems()
5601 elems->elem[i].len = nla_len(nl_elems); in nl80211_parse_mbssid_elems()
5628 return ERR_PTR(-ENOMEM); in nl80211_parse_rnr_elems()
5629 elems->cnt = num_elems; in nl80211_parse_rnr_elems()
5632 elems->elem[i].data = nla_data(nl_elems); in nl80211_parse_rnr_elems()
5633 elems->elem[i].len = nla_len(nl_elems); in nl80211_parse_rnr_elems()
5651 return -EINVAL; in nl80211_parse_he_bss_color()
5653 he_bss_color->color = in nl80211_parse_he_bss_color()
5655 he_bss_color->enabled = in nl80211_parse_he_bss_color()
5657 he_bss_color->partial = in nl80211_parse_he_bss_color()
5673 bcn->link_id = nl80211_link_id(attrs); in nl80211_parse_beacon()
5676 bcn->head = nla_data(attrs[NL80211_ATTR_BEACON_HEAD]); in nl80211_parse_beacon()
5677 bcn->head_len = nla_len(attrs[NL80211_ATTR_BEACON_HEAD]); in nl80211_parse_beacon()
5678 if (!bcn->head_len) in nl80211_parse_beacon()
5679 return -EINVAL; in nl80211_parse_beacon()
5684 bcn->tail = nla_data(attrs[NL80211_ATTR_BEACON_TAIL]); in nl80211_parse_beacon()
5685 bcn->tail_len = nla_len(attrs[NL80211_ATTR_BEACON_TAIL]); in nl80211_parse_beacon()
5690 return -EINVAL; in nl80211_parse_beacon()
5693 bcn->beacon_ies = nla_data(attrs[NL80211_ATTR_IE]); in nl80211_parse_beacon()
5694 bcn->beacon_ies_len = nla_len(attrs[NL80211_ATTR_IE]); in nl80211_parse_beacon()
5698 bcn->proberesp_ies = in nl80211_parse_beacon()
5700 bcn->proberesp_ies_len = in nl80211_parse_beacon()
5705 bcn->assocresp_ies = in nl80211_parse_beacon()
5707 bcn->assocresp_ies_len = in nl80211_parse_beacon()
5712 bcn->probe_resp = nla_data(attrs[NL80211_ATTR_PROBE_RESP]); in nl80211_parse_beacon()
5713 bcn->probe_resp_len = nla_len(attrs[NL80211_ATTR_PROBE_RESP]); in nl80211_parse_beacon()
5727 wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_parse_beacon()
5729 bcn->ftm_responder = 1; in nl80211_parse_beacon()
5731 return -EOPNOTSUPP; in nl80211_parse_beacon()
5734 bcn->lci = nla_data(tb[NL80211_FTM_RESP_ATTR_LCI]); in nl80211_parse_beacon()
5735 bcn->lci_len = nla_len(tb[NL80211_FTM_RESP_ATTR_LCI]); in nl80211_parse_beacon()
5739 bcn->civicloc = nla_data(tb[NL80211_FTM_RESP_ATTR_CIVICLOC]); in nl80211_parse_beacon()
5740 bcn->civicloc_len = nla_len(tb[NL80211_FTM_RESP_ATTR_CIVICLOC]); in nl80211_parse_beacon()
5743 bcn->ftm_responder = -1; in nl80211_parse_beacon()
5748 &bcn->he_bss_color); in nl80211_parse_beacon()
5751 bcn->he_bss_color_valid = true; in nl80211_parse_beacon()
5756 nl80211_parse_mbssid_elems(&rdev->wiphy, in nl80211_parse_beacon()
5762 bcn->mbssid_ies = mbssid; in nl80211_parse_beacon()
5764 if (bcn->mbssid_ies && attrs[NL80211_ATTR_EMA_RNR_ELEMS]) { in nl80211_parse_beacon()
5766 nl80211_parse_rnr_elems(&rdev->wiphy, in nl80211_parse_beacon()
5773 if (rnr && rnr->cnt < bcn->mbssid_ies->cnt) in nl80211_parse_beacon()
5774 return -EINVAL; in nl80211_parse_beacon()
5776 bcn->rnr_ies = rnr; in nl80211_parse_beacon()
5795 return -EINVAL; in nl80211_parse_he_obss_pd()
5797 he_obss_pd->sr_ctrl = nla_get_u8(tb[NL80211_HE_OBSS_PD_ATTR_SR_CTRL]); in nl80211_parse_he_obss_pd()
5800 he_obss_pd->min_offset = in nl80211_parse_he_obss_pd()
5803 he_obss_pd->max_offset = in nl80211_parse_he_obss_pd()
5806 he_obss_pd->non_srg_max_offset = in nl80211_parse_he_obss_pd()
5809 if (he_obss_pd->min_offset > he_obss_pd->max_offset) in nl80211_parse_he_obss_pd()
5810 return -EINVAL; in nl80211_parse_he_obss_pd()
5813 memcpy(he_obss_pd->bss_color_bitmap, in nl80211_parse_he_obss_pd()
5815 sizeof(he_obss_pd->bss_color_bitmap)); in nl80211_parse_he_obss_pd()
5818 memcpy(he_obss_pd->partial_bssid_bitmap, in nl80211_parse_he_obss_pd()
5820 sizeof(he_obss_pd->partial_bssid_bitmap)); in nl80211_parse_he_obss_pd()
5822 he_obss_pd->enable = true; in nl80211_parse_he_obss_pd()
5834 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_parse_fils_discovery()
5836 return -EINVAL; in nl80211_parse_fils_discovery()
5846 fd->update = true; in nl80211_parse_fils_discovery()
5853 return -EINVAL; in nl80211_parse_fils_discovery()
5855 fd->tmpl_len = nla_len(tb[NL80211_FILS_DISCOVERY_ATTR_TMPL]); in nl80211_parse_fils_discovery()
5856 fd->tmpl = nla_data(tb[NL80211_FILS_DISCOVERY_ATTR_TMPL]); in nl80211_parse_fils_discovery()
5857 fd->min_interval = nla_get_u32(tb[NL80211_FILS_DISCOVERY_ATTR_INT_MIN]); in nl80211_parse_fils_discovery()
5858 fd->max_interval = nla_get_u32(tb[NL80211_FILS_DISCOVERY_ATTR_INT_MAX]); in nl80211_parse_fils_discovery()
5859 fd->update = true; in nl80211_parse_fils_discovery()
5871 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_parse_unsol_bcast_probe_resp()
5873 return -EINVAL; in nl80211_parse_unsol_bcast_probe_resp()
5882 presp->update = true; in nl80211_parse_unsol_bcast_probe_resp()
5888 return -EINVAL; in nl80211_parse_unsol_bcast_probe_resp()
5890 presp->tmpl = nla_data(tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_TMPL]); in nl80211_parse_unsol_bcast_probe_resp()
5891 presp->tmpl_len = nla_len(tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_TMPL]); in nl80211_parse_unsol_bcast_probe_resp()
5892 presp->interval = nla_get_u32(tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_INT]); in nl80211_parse_unsol_bcast_probe_resp()
5893 presp->update = true; in nl80211_parse_unsol_bcast_probe_resp()
5905 for (i = 0; i < rates->datalen; i++) { in nl80211_check_ap_rate_selectors()
5906 if (rates->data[i] == BSS_MEMBERSHIP_SELECTOR_HT_PHY) in nl80211_check_ap_rate_selectors()
5907 params->ht_required = true; in nl80211_check_ap_rate_selectors()
5908 if (rates->data[i] == BSS_MEMBERSHIP_SELECTOR_VHT_PHY) in nl80211_check_ap_rate_selectors()
5909 params->vht_required = true; in nl80211_check_ap_rate_selectors()
5910 if (rates->data[i] == BSS_MEMBERSHIP_SELECTOR_HE_PHY) in nl80211_check_ap_rate_selectors()
5911 params->he_required = true; in nl80211_check_ap_rate_selectors()
5912 if (rates->data[i] == BSS_MEMBERSHIP_SELECTOR_SAE_H2E) in nl80211_check_ap_rate_selectors()
5913 params->sae_h2e_required = true; in nl80211_check_ap_rate_selectors()
5924 const struct cfg80211_beacon_data *bcn = &params->beacon; in nl80211_calculate_ap_params()
5925 size_t ies_len = bcn->tail_len; in nl80211_calculate_ap_params()
5926 const u8 *ies = bcn->tail; in nl80211_calculate_ap_params()
5937 if (cap && cap->datalen >= sizeof(*params->ht_cap)) in nl80211_calculate_ap_params()
5938 params->ht_cap = (void *)cap->data; in nl80211_calculate_ap_params()
5940 if (cap && cap->datalen >= sizeof(*params->vht_cap)) in nl80211_calculate_ap_params()
5941 params->vht_cap = (void *)cap->data; in nl80211_calculate_ap_params()
5943 if (cap && cap->datalen >= sizeof(*params->he_cap) + 1) in nl80211_calculate_ap_params()
5944 params->he_cap = (void *)(cap->data + 1); in nl80211_calculate_ap_params()
5946 if (cap && cap->datalen >= sizeof(*params->he_oper) + 1) in nl80211_calculate_ap_params()
5947 params->he_oper = (void *)(cap->data + 1); in nl80211_calculate_ap_params()
5950 if (!cap->datalen) in nl80211_calculate_ap_params()
5951 return -EINVAL; in nl80211_calculate_ap_params()
5952 params->eht_cap = (void *)(cap->data + 1); in nl80211_calculate_ap_params()
5953 if (!ieee80211_eht_capa_size_ok((const u8 *)params->he_cap, in nl80211_calculate_ap_params()
5954 (const u8 *)params->eht_cap, in nl80211_calculate_ap_params()
5955 cap->datalen - 1, true)) in nl80211_calculate_ap_params()
5956 return -EINVAL; in nl80211_calculate_ap_params()
5960 if (!cap->datalen) in nl80211_calculate_ap_params()
5961 return -EINVAL; in nl80211_calculate_ap_params()
5962 params->eht_oper = (void *)(cap->data + 1); in nl80211_calculate_ap_params()
5963 if (!ieee80211_eht_oper_size_ok((const u8 *)params->eht_oper, in nl80211_calculate_ap_params()
5964 cap->datalen - 1)) in nl80211_calculate_ap_params()
5965 return -EINVAL; in nl80211_calculate_ap_params()
5975 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) { in nl80211_get_ap_channel()
5976 if (wdev->iftype != NL80211_IFTYPE_AP && in nl80211_get_ap_channel()
5977 wdev->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_get_ap_channel()
5980 if (!wdev->u.ap.preset_chandef.chan) in nl80211_get_ap_channel()
5983 params->chandef = wdev->u.ap.preset_chandef; in nl80211_get_ap_channel()
5999 if (!(rdev->wiphy.features & NL80211_FEATURE_SAE) && in nl80211_valid_auth_type()
6002 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_valid_auth_type()
6010 if (!(rdev->wiphy.features & NL80211_FEATURE_SAE) && in nl80211_valid_auth_type()
6011 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_valid_auth_type()
6021 &rdev->wiphy, in nl80211_valid_auth_type()
6027 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_valid_auth_type()
6045 struct wiphy *wiphy = wdev->wiphy; in nl80211_send_ap_started()
6058 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_ap_started()
6059 nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex) || in nl80211_send_ap_started()
6062 (wdev->u.ap.ssid_len && in nl80211_send_ap_started()
6063 nla_put(msg, NL80211_ATTR_SSID, wdev->u.ap.ssid_len, in nl80211_send_ap_started()
6064 wdev->u.ap.ssid)) || in nl80211_send_ap_started()
6065 (wdev->valid_links && in nl80211_send_ap_started()
6080 struct ieee80211_channel *channel = params->chandef.chan; in nl80211_validate_ap_phy_operation()
6082 if ((params->he_cap || params->he_oper) && in nl80211_validate_ap_phy_operation()
6083 (channel->flags & IEEE80211_CHAN_NO_HE)) in nl80211_validate_ap_phy_operation()
6084 return -EOPNOTSUPP; in nl80211_validate_ap_phy_operation()
6086 if ((params->eht_cap || params->eht_oper) && in nl80211_validate_ap_phy_operation()
6087 (channel->flags & IEEE80211_CHAN_NO_EHT)) in nl80211_validate_ap_phy_operation()
6088 return -EOPNOTSUPP; in nl80211_validate_ap_phy_operation()
6095 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_start_ap()
6097 unsigned int link_id = nl80211_link_id(info->attrs); in nl80211_start_ap()
6098 struct net_device *dev = info->user_ptr[1]; in nl80211_start_ap()
6099 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_start_ap()
6103 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && in nl80211_start_ap()
6104 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_start_ap()
6105 return -EOPNOTSUPP; in nl80211_start_ap()
6107 if (!rdev->ops->start_ap) in nl80211_start_ap()
6108 return -EOPNOTSUPP; in nl80211_start_ap()
6110 if (wdev->links[link_id].cac_started) in nl80211_start_ap()
6111 return -EBUSY; in nl80211_start_ap()
6113 if (wdev->links[link_id].ap.beacon_interval) in nl80211_start_ap()
6114 return -EALREADY; in nl80211_start_ap()
6117 if (!info->attrs[NL80211_ATTR_BEACON_INTERVAL] || in nl80211_start_ap()
6118 !info->attrs[NL80211_ATTR_DTIM_PERIOD] || in nl80211_start_ap()
6119 !info->attrs[NL80211_ATTR_BEACON_HEAD]) in nl80211_start_ap()
6120 return -EINVAL; in nl80211_start_ap()
6122 if (info->attrs[NL80211_ATTR_SMPS_MODE] && in nl80211_start_ap()
6123 nla_get_u8(info->attrs[NL80211_ATTR_SMPS_MODE]) != NL80211_SMPS_OFF) in nl80211_start_ap()
6124 return -EOPNOTSUPP; in nl80211_start_ap()
6128 return -ENOMEM; in nl80211_start_ap()
6130 err = nl80211_parse_beacon(rdev, info->attrs, &params->beacon, in nl80211_start_ap()
6131 info->extack); in nl80211_start_ap()
6135 params->beacon_interval = in nl80211_start_ap()
6136 nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]); in nl80211_start_ap()
6137 params->dtim_period = in nl80211_start_ap()
6138 nla_get_u32(info->attrs[NL80211_ATTR_DTIM_PERIOD]); in nl80211_start_ap()
6140 err = cfg80211_validate_beacon_int(rdev, dev->ieee80211_ptr->iftype, in nl80211_start_ap()
6141 params->beacon_interval); in nl80211_start_ap()
6150 * additional information -- drivers must check! in nl80211_start_ap()
6152 if (info->attrs[NL80211_ATTR_SSID]) { in nl80211_start_ap()
6153 params->ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); in nl80211_start_ap()
6154 params->ssid_len = in nl80211_start_ap()
6155 nla_len(info->attrs[NL80211_ATTR_SSID]); in nl80211_start_ap()
6156 if (params->ssid_len == 0) { in nl80211_start_ap()
6157 err = -EINVAL; in nl80211_start_ap()
6161 if (wdev->u.ap.ssid_len && in nl80211_start_ap()
6162 (wdev->u.ap.ssid_len != params->ssid_len || in nl80211_start_ap()
6163 memcmp(wdev->u.ap.ssid, params->ssid, params->ssid_len))) { in nl80211_start_ap()
6165 err = -EINVAL; in nl80211_start_ap()
6168 } else if (wdev->valid_links) { in nl80211_start_ap()
6170 err = -EINVAL; in nl80211_start_ap()
6174 if (info->attrs[NL80211_ATTR_HIDDEN_SSID]) in nl80211_start_ap()
6175 params->hidden_ssid = nla_get_u32( in nl80211_start_ap()
6176 info->attrs[NL80211_ATTR_HIDDEN_SSID]); in nl80211_start_ap()
6178 params->privacy = !!info->attrs[NL80211_ATTR_PRIVACY]; in nl80211_start_ap()
6180 if (info->attrs[NL80211_ATTR_AUTH_TYPE]) { in nl80211_start_ap()
6181 params->auth_type = nla_get_u32( in nl80211_start_ap()
6182 info->attrs[NL80211_ATTR_AUTH_TYPE]); in nl80211_start_ap()
6183 if (!nl80211_valid_auth_type(rdev, params->auth_type, in nl80211_start_ap()
6185 err = -EINVAL; in nl80211_start_ap()
6189 params->auth_type = NL80211_AUTHTYPE_AUTOMATIC; in nl80211_start_ap()
6191 err = nl80211_crypto_settings(rdev, info, &params->crypto, in nl80211_start_ap()
6196 if (info->attrs[NL80211_ATTR_INACTIVITY_TIMEOUT]) { in nl80211_start_ap()
6197 if (!(rdev->wiphy.features & NL80211_FEATURE_INACTIVITY_TIMER)) { in nl80211_start_ap()
6198 err = -EOPNOTSUPP; in nl80211_start_ap()
6201 params->inactivity_timeout = nla_get_u16( in nl80211_start_ap()
6202 info->attrs[NL80211_ATTR_INACTIVITY_TIMEOUT]); in nl80211_start_ap()
6205 if (info->attrs[NL80211_ATTR_P2P_CTWINDOW]) { in nl80211_start_ap()
6206 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) { in nl80211_start_ap()
6207 err = -EINVAL; in nl80211_start_ap()
6210 params->p2p_ctwindow = in nl80211_start_ap()
6211 nla_get_u8(info->attrs[NL80211_ATTR_P2P_CTWINDOW]); in nl80211_start_ap()
6212 if (params->p2p_ctwindow != 0 && in nl80211_start_ap()
6213 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_CTWIN)) { in nl80211_start_ap()
6214 err = -EINVAL; in nl80211_start_ap()
6219 if (info->attrs[NL80211_ATTR_P2P_OPPPS]) { in nl80211_start_ap()
6222 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) { in nl80211_start_ap()
6223 err = -EINVAL; in nl80211_start_ap()
6226 tmp = nla_get_u8(info->attrs[NL80211_ATTR_P2P_OPPPS]); in nl80211_start_ap()
6227 params->p2p_opp_ps = tmp; in nl80211_start_ap()
6228 if (params->p2p_opp_ps != 0 && in nl80211_start_ap()
6229 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_OPPPS)) { in nl80211_start_ap()
6230 err = -EINVAL; in nl80211_start_ap()
6235 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { in nl80211_start_ap()
6236 err = nl80211_parse_chandef(rdev, info, &params->chandef); in nl80211_start_ap()
6239 } else if (wdev->valid_links) { in nl80211_start_ap()
6241 err = -EINVAL; in nl80211_start_ap()
6243 } else if (wdev->u.ap.preset_chandef.chan) { in nl80211_start_ap()
6244 params->chandef = wdev->u.ap.preset_chandef; in nl80211_start_ap()
6246 err = -EINVAL; in nl80211_start_ap()
6250 beacon_check.iftype = wdev->iftype; in nl80211_start_ap()
6253 cfg80211_get_6ghz_power_type(params->beacon.tail, in nl80211_start_ap()
6254 params->beacon.tail_len); in nl80211_start_ap()
6255 if (!cfg80211_reg_check_beaconing(&rdev->wiphy, &params->chandef, in nl80211_start_ap()
6257 err = -EINVAL; in nl80211_start_ap()
6261 if (info->attrs[NL80211_ATTR_TX_RATES]) { in nl80211_start_ap()
6262 err = nl80211_parse_tx_bitrate_mask(info, info->attrs, in nl80211_start_ap()
6264 &params->beacon_rate, in nl80211_start_ap()
6269 err = validate_beacon_tx_rate(rdev, params->chandef.chan->band, in nl80211_start_ap()
6270 &params->beacon_rate); in nl80211_start_ap()
6275 params->pbss = nla_get_flag(info->attrs[NL80211_ATTR_PBSS]); in nl80211_start_ap()
6276 if (params->pbss && !rdev->wiphy.bands[NL80211_BAND_60GHZ]) { in nl80211_start_ap()
6277 err = -EOPNOTSUPP; in nl80211_start_ap()
6281 if (info->attrs[NL80211_ATTR_ACL_POLICY]) { in nl80211_start_ap()
6282 params->acl = parse_acl_data(&rdev->wiphy, info); in nl80211_start_ap()
6283 if (IS_ERR(params->acl)) { in nl80211_start_ap()
6284 err = PTR_ERR(params->acl); in nl80211_start_ap()
6285 params->acl = NULL; in nl80211_start_ap()
6290 params->twt_responder = in nl80211_start_ap()
6291 nla_get_flag(info->attrs[NL80211_ATTR_TWT_RESPONDER]); in nl80211_start_ap()
6293 if (info->attrs[NL80211_ATTR_HE_OBSS_PD]) { in nl80211_start_ap()
6295 info->attrs[NL80211_ATTR_HE_OBSS_PD], in nl80211_start_ap()
6296 &params->he_obss_pd); in nl80211_start_ap()
6301 if (info->attrs[NL80211_ATTR_FILS_DISCOVERY]) { in nl80211_start_ap()
6303 info->attrs[NL80211_ATTR_FILS_DISCOVERY], in nl80211_start_ap()
6304 &params->fils_discovery); in nl80211_start_ap()
6309 if (info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP]) { in nl80211_start_ap()
6311 rdev, info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP], in nl80211_start_ap()
6312 &params->unsol_bcast_probe_resp); in nl80211_start_ap()
6317 if (info->attrs[NL80211_ATTR_MBSSID_CONFIG]) { in nl80211_start_ap()
6318 err = nl80211_parse_mbssid_config(&rdev->wiphy, dev, in nl80211_start_ap()
6319 info->attrs[NL80211_ATTR_MBSSID_CONFIG], in nl80211_start_ap()
6320 &params->mbssid_config, in nl80211_start_ap()
6321 params->beacon.mbssid_ies ? in nl80211_start_ap()
6322 params->beacon.mbssid_ies->cnt : in nl80211_start_ap()
6328 if (!params->mbssid_config.ema && params->beacon.rnr_ies) { in nl80211_start_ap()
6329 err = -EINVAL; in nl80211_start_ap()
6341 if (info->attrs[NL80211_ATTR_AP_SETTINGS_FLAGS]) in nl80211_start_ap()
6342 params->flags = nla_get_u32( in nl80211_start_ap()
6343 info->attrs[NL80211_ATTR_AP_SETTINGS_FLAGS]); in nl80211_start_ap()
6344 else if (info->attrs[NL80211_ATTR_EXTERNAL_AUTH_SUPPORT]) in nl80211_start_ap()
6345 params->flags |= NL80211_AP_SETTINGS_EXTERNAL_AUTH_SUPPORT; in nl80211_start_ap()
6347 if (wdev->conn_owner_nlportid && in nl80211_start_ap()
6348 info->attrs[NL80211_ATTR_SOCKET_OWNER] && in nl80211_start_ap()
6349 wdev->conn_owner_nlportid != info->snd_portid) { in nl80211_start_ap()
6350 err = -EINVAL; in nl80211_start_ap()
6354 /* FIXME: validate MLO/link-id against driver capabilities */ in nl80211_start_ap()
6358 wdev->links[link_id].ap.beacon_interval = params->beacon_interval; in nl80211_start_ap()
6359 wdev->links[link_id].ap.chandef = params->chandef; in nl80211_start_ap()
6360 wdev->u.ap.ssid_len = params->ssid_len; in nl80211_start_ap()
6361 memcpy(wdev->u.ap.ssid, params->ssid, in nl80211_start_ap()
6362 params->ssid_len); in nl80211_start_ap()
6364 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) in nl80211_start_ap()
6365 wdev->conn_owner_nlportid = info->snd_portid; in nl80211_start_ap()
6370 kfree(params->acl); in nl80211_start_ap()
6371 kfree(params->beacon.mbssid_ies); in nl80211_start_ap()
6372 if (params->mbssid_config.tx_wdev && in nl80211_start_ap()
6373 params->mbssid_config.tx_wdev->netdev && in nl80211_start_ap()
6374 params->mbssid_config.tx_wdev->netdev != dev) in nl80211_start_ap()
6375 dev_put(params->mbssid_config.tx_wdev->netdev); in nl80211_start_ap()
6376 kfree(params->beacon.rnr_ies); in nl80211_start_ap()
6384 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_beacon()
6386 unsigned int link_id = nl80211_link_id(info->attrs); in nl80211_set_beacon()
6387 struct net_device *dev = info->user_ptr[1]; in nl80211_set_beacon()
6388 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_beacon()
6393 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && in nl80211_set_beacon()
6394 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_set_beacon()
6395 return -EOPNOTSUPP; in nl80211_set_beacon()
6397 if (!rdev->ops->change_beacon) in nl80211_set_beacon()
6398 return -EOPNOTSUPP; in nl80211_set_beacon()
6400 if (!wdev->links[link_id].ap.beacon_interval) in nl80211_set_beacon()
6401 return -EINVAL; in nl80211_set_beacon()
6405 return -ENOMEM; in nl80211_set_beacon()
6407 err = nl80211_parse_beacon(rdev, info->attrs, &params->beacon, in nl80211_set_beacon()
6408 info->extack); in nl80211_set_beacon()
6413 beacon_check.iftype = wdev->iftype; in nl80211_set_beacon()
6416 cfg80211_get_6ghz_power_type(params->beacon.tail, in nl80211_set_beacon()
6417 params->beacon.tail_len); in nl80211_set_beacon()
6418 if (!cfg80211_reg_check_beaconing(&rdev->wiphy, in nl80211_set_beacon()
6419 &wdev->links[link_id].ap.chandef, in nl80211_set_beacon()
6421 err = -EINVAL; in nl80211_set_beacon()
6425 attr = info->attrs[NL80211_ATTR_FILS_DISCOVERY]; in nl80211_set_beacon()
6428 &params->fils_discovery); in nl80211_set_beacon()
6433 attr = info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP]; in nl80211_set_beacon()
6436 &params->unsol_bcast_probe_resp); in nl80211_set_beacon()
6444 kfree(params->beacon.mbssid_ies); in nl80211_set_beacon()
6445 kfree(params->beacon.rnr_ies); in nl80211_set_beacon()
6452 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_stop_ap()
6453 unsigned int link_id = nl80211_link_id(info->attrs); in nl80211_stop_ap()
6454 struct net_device *dev = info->user_ptr[1]; in nl80211_stop_ap()
6480 nla = info->attrs[NL80211_ATTR_STA_FLAGS2]; in parse_station_flags()
6485 params->sta_flags_mask = sta_flags->mask; in parse_station_flags()
6486 params->sta_flags_set = sta_flags->set; in parse_station_flags()
6487 params->sta_flags_set &= params->sta_flags_mask; in parse_station_flags()
6488 if ((params->sta_flags_mask | in parse_station_flags()
6489 params->sta_flags_set) & BIT(__NL80211_STA_FLAG_INVALID)) in parse_station_flags()
6490 return -EINVAL; in parse_station_flags()
6496 nla = info->attrs[NL80211_ATTR_STA_FLAGS]; in parse_station_flags()
6500 if (nla_parse_nested_deprecated(flags, NL80211_STA_FLAG_MAX, nla, sta_flags_policy, info->extack)) in parse_station_flags()
6501 return -EINVAL; in parse_station_flags()
6513 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHORIZED) | in parse_station_flags()
6520 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHORIZED) | in parse_station_flags()
6524 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHENTICATED) | in parse_station_flags()
6529 return -EINVAL; in parse_station_flags()
6534 params->sta_flags_set |= (1<<flag); in parse_station_flags()
6538 return -EINVAL; in parse_station_flags()
6558 /* report 16-bit bitrate only if we can */ in nl80211_put_sta_rate()
6567 switch (info->bw) { in nl80211_put_sta_rate()
6606 WARN_ON(!(info->flags & RATE_INFO_FLAGS_HE_MCS)); in nl80211_put_sta_rate()
6613 WARN_ON(!(info->flags & RATE_INFO_FLAGS_EHT_MCS)); in nl80211_put_sta_rate()
6620 if (info->flags & RATE_INFO_FLAGS_MCS) { in nl80211_put_sta_rate()
6621 if (nla_put_u8(msg, NL80211_RATE_INFO_MCS, info->mcs)) in nl80211_put_sta_rate()
6623 if (info->flags & RATE_INFO_FLAGS_SHORT_GI && in nl80211_put_sta_rate()
6626 } else if (info->flags & RATE_INFO_FLAGS_VHT_MCS) { in nl80211_put_sta_rate()
6627 if (nla_put_u8(msg, NL80211_RATE_INFO_VHT_MCS, info->mcs)) in nl80211_put_sta_rate()
6629 if (nla_put_u8(msg, NL80211_RATE_INFO_VHT_NSS, info->nss)) in nl80211_put_sta_rate()
6631 if (info->flags & RATE_INFO_FLAGS_SHORT_GI && in nl80211_put_sta_rate()
6634 } else if (info->flags & RATE_INFO_FLAGS_HE_MCS) { in nl80211_put_sta_rate()
6635 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_MCS, info->mcs)) in nl80211_put_sta_rate()
6637 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_NSS, info->nss)) in nl80211_put_sta_rate()
6639 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_GI, info->he_gi)) in nl80211_put_sta_rate()
6641 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_DCM, info->he_dcm)) in nl80211_put_sta_rate()
6643 if (info->bw == RATE_INFO_BW_HE_RU && in nl80211_put_sta_rate()
6645 info->he_ru_alloc)) in nl80211_put_sta_rate()
6647 } else if (info->flags & RATE_INFO_FLAGS_S1G_MCS) { in nl80211_put_sta_rate()
6648 if (nla_put_u8(msg, NL80211_RATE_INFO_S1G_MCS, info->mcs)) in nl80211_put_sta_rate()
6650 if (nla_put_u8(msg, NL80211_RATE_INFO_S1G_NSS, info->nss)) in nl80211_put_sta_rate()
6652 if (info->flags & RATE_INFO_FLAGS_SHORT_GI && in nl80211_put_sta_rate()
6655 } else if (info->flags & RATE_INFO_FLAGS_EHT_MCS) { in nl80211_put_sta_rate()
6656 if (nla_put_u8(msg, NL80211_RATE_INFO_EHT_MCS, info->mcs)) in nl80211_put_sta_rate()
6658 if (nla_put_u8(msg, NL80211_RATE_INFO_EHT_NSS, info->nss)) in nl80211_put_sta_rate()
6660 if (nla_put_u8(msg, NL80211_RATE_INFO_EHT_GI, info->eht_gi)) in nl80211_put_sta_rate()
6662 if (info->bw == RATE_INFO_BW_EHT_RU && in nl80211_put_sta_rate()
6664 info->eht_ru_alloc)) in nl80211_put_sta_rate()
6710 return -1; in nl80211_send_station()
6713 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in nl80211_send_station()
6715 nla_put_u32(msg, NL80211_ATTR_GENERATION, sinfo->generation)) in nl80211_send_station()
6724 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_ ## attr) && \ in nl80211_send_station()
6726 sinfo->memb)) \ in nl80211_send_station()
6730 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_ ## attr) && \ in nl80211_send_station()
6732 sinfo->memb, NL80211_STA_INFO_PAD)) \ in nl80211_send_station()
6740 if (sinfo->filled & (BIT_ULL(NL80211_STA_INFO_RX_BYTES) | in nl80211_send_station()
6743 (u32)sinfo->rx_bytes)) in nl80211_send_station()
6746 if (sinfo->filled & (BIT_ULL(NL80211_STA_INFO_TX_BYTES) | in nl80211_send_station()
6749 (u32)sinfo->tx_bytes)) in nl80211_send_station()
6760 if (wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_send_station()
6764 switch (rdev->wiphy.signal_type) { in nl80211_send_station()
6772 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL)) { in nl80211_send_station()
6773 if (!nl80211_put_signal(msg, sinfo->chains, in nl80211_send_station()
6774 sinfo->chain_signal, in nl80211_send_station()
6778 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL_AVG)) { in nl80211_send_station()
6779 if (!nl80211_put_signal(msg, sinfo->chains, in nl80211_send_station()
6780 sinfo->chain_signal_avg, in nl80211_send_station()
6784 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_TX_BITRATE)) { in nl80211_send_station()
6785 if (!nl80211_put_sta_rate(msg, &sinfo->txrate, in nl80211_send_station()
6789 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_RX_BITRATE)) { in nl80211_send_station()
6790 if (!nl80211_put_sta_rate(msg, &sinfo->rxrate, in nl80211_send_station()
6808 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_BSS_PARAM)) { in nl80211_send_station()
6814 if (((sinfo->bss_param.flags & BSS_PARAM_FLAGS_CTS_PROT) && in nl80211_send_station()
6816 ((sinfo->bss_param.flags & BSS_PARAM_FLAGS_SHORT_PREAMBLE) && in nl80211_send_station()
6818 ((sinfo->bss_param.flags & BSS_PARAM_FLAGS_SHORT_SLOT_TIME) && in nl80211_send_station()
6821 sinfo->bss_param.dtim_period) || in nl80211_send_station()
6823 sinfo->bss_param.beacon_interval)) in nl80211_send_station()
6828 if ((sinfo->filled & BIT_ULL(NL80211_STA_INFO_STA_FLAGS)) && in nl80211_send_station()
6831 &sinfo->sta_flags)) in nl80211_send_station()
6840 if (wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_send_station()
6849 if (sinfo->pertid) { in nl80211_send_station()
6862 tidstats = &sinfo->pertid[tid]; in nl80211_send_station()
6864 if (!tidstats->filled) in nl80211_send_station()
6872 if (tidstats->filled & BIT(NL80211_TID_STATS_ ## attr) && \ in nl80211_send_station()
6874 tidstats->memb, NL80211_TID_STATS_PAD)) \ in nl80211_send_station()
6884 if ((tidstats->filled & in nl80211_send_station()
6886 !nl80211_put_txq_stats(msg, &tidstats->txq_stats, in nl80211_send_station()
6898 if (sinfo->assoc_req_ies_len && in nl80211_send_station()
6899 nla_put(msg, NL80211_ATTR_IE, sinfo->assoc_req_ies_len, in nl80211_send_station()
6900 sinfo->assoc_req_ies)) in nl80211_send_station()
6903 if (sinfo->assoc_resp_ies_len && in nl80211_send_station()
6904 nla_put(msg, NL80211_ATTR_RESP_IE, sinfo->assoc_resp_ies_len, in nl80211_send_station()
6905 sinfo->assoc_resp_ies)) in nl80211_send_station()
6908 if (sinfo->mlo_params_valid) { in nl80211_send_station()
6910 sinfo->assoc_link_id)) in nl80211_send_station()
6913 if (!is_zero_ether_addr(sinfo->mld_addr) && in nl80211_send_station()
6915 sinfo->mld_addr)) in nl80211_send_station()
6926 return -EMSGSIZE; in nl80211_send_station()
6936 int sta_idx = cb->args[2]; in nl80211_dump_station()
6943 __acquire(&rdev->wiphy.mtx); in nl80211_dump_station()
6945 if (!wdev->netdev) { in nl80211_dump_station()
6946 err = -EINVAL; in nl80211_dump_station()
6950 if (!rdev->ops->dump_station) { in nl80211_dump_station()
6951 err = -EOPNOTSUPP; in nl80211_dump_station()
6957 err = rdev_dump_station(rdev, wdev->netdev, sta_idx, in nl80211_dump_station()
6959 if (err == -ENOENT) in nl80211_dump_station()
6965 NETLINK_CB(cb->skb).portid, in nl80211_dump_station()
6966 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_dump_station()
6967 rdev, wdev->netdev, mac_addr, in nl80211_dump_station()
6975 cb->args[2] = sta_idx; in nl80211_dump_station()
6976 err = skb->len; in nl80211_dump_station()
6978 wiphy_unlock(&rdev->wiphy); in nl80211_dump_station()
6985 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_station()
6986 struct net_device *dev = info->user_ptr[1]; in nl80211_get_station()
6994 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_get_station()
6995 return -EINVAL; in nl80211_get_station()
6997 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_get_station()
6999 if (!rdev->ops->get_station) in nl80211_get_station()
7000 return -EOPNOTSUPP; in nl80211_get_station()
7009 return -ENOMEM; in nl80211_get_station()
7013 info->snd_portid, info->snd_seq, 0, in nl80211_get_station()
7016 return -ENOBUFS; in nl80211_get_station()
7026 if (params->listen_interval != -1 && in cfg80211_check_station_change()
7028 return -EINVAL; in cfg80211_check_station_change()
7030 if (params->support_p2p_ps != -1 && in cfg80211_check_station_change()
7032 return -EINVAL; in cfg80211_check_station_change()
7034 if (params->aid && in cfg80211_check_station_change()
7035 !(params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) && in cfg80211_check_station_change()
7037 return -EINVAL; in cfg80211_check_station_change()
7046 * No ignoring the TDLS flag here -- the userspace mesh in cfg80211_check_station_change()
7050 if (params->sta_flags_mask & in cfg80211_check_station_change()
7054 return -EINVAL; in cfg80211_check_station_change()
7058 if (!(params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER))) in cfg80211_check_station_change()
7059 return -EINVAL; in cfg80211_check_station_change()
7061 params->sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER); in cfg80211_check_station_change()
7064 /* disallow mesh-specific things */ in cfg80211_check_station_change()
7065 if (params->plink_action != NL80211_PLINK_ACTION_NO_ACTION) in cfg80211_check_station_change()
7066 return -EINVAL; in cfg80211_check_station_change()
7067 if (params->local_pm) in cfg80211_check_station_change()
7068 return -EINVAL; in cfg80211_check_station_change()
7069 if (params->sta_modify_mask & STATION_PARAM_APPLY_PLINK_STATE) in cfg80211_check_station_change()
7070 return -EINVAL; in cfg80211_check_station_change()
7076 if (params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) in cfg80211_check_station_change()
7077 return -EINVAL; in cfg80211_check_station_change()
7080 * a hostapd/wpa_supplicant issue -- it always includes the in cfg80211_check_station_change()
7083 params->sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER); in cfg80211_check_station_change()
7089 if (params->sta_modify_mask & STATION_PARAM_APPLY_UAPSD) in cfg80211_check_station_change()
7090 return -EINVAL; in cfg80211_check_station_change()
7091 if (params->sta_modify_mask & STATION_PARAM_APPLY_CAPABILITY) in cfg80211_check_station_change()
7092 return -EINVAL; in cfg80211_check_station_change()
7093 if (params->link_sta_params.supported_rates) in cfg80211_check_station_change()
7094 return -EINVAL; in cfg80211_check_station_change()
7095 if (params->ext_capab || params->link_sta_params.ht_capa || in cfg80211_check_station_change()
7096 params->link_sta_params.vht_capa || in cfg80211_check_station_change()
7097 params->link_sta_params.he_capa || in cfg80211_check_station_change()
7098 params->link_sta_params.eht_capa) in cfg80211_check_station_change()
7099 return -EINVAL; in cfg80211_check_station_change()
7100 if (params->sta_flags_mask & BIT(NL80211_STA_FLAG_SPP_AMSDU)) in cfg80211_check_station_change()
7101 return -EINVAL; in cfg80211_check_station_change()
7106 if (params->vlan) in cfg80211_check_station_change()
7107 return -EINVAL; in cfg80211_check_station_change()
7113 if (!(params->sta_flags_mask & BIT(NL80211_STA_FLAG_AUTHORIZED))) in cfg80211_check_station_change()
7114 return -EOPNOTSUPP; in cfg80211_check_station_change()
7119 if (params->sta_flags_mask & in cfg80211_check_station_change()
7127 return -EINVAL; in cfg80211_check_station_change()
7130 if (!(wiphy->features & NL80211_FEATURE_FULL_AP_CLIENT_STATE) && in cfg80211_check_station_change()
7131 params->sta_flags_mask & in cfg80211_check_station_change()
7134 return -EINVAL; in cfg80211_check_station_change()
7139 if (params->sta_flags_mask & ~BIT(NL80211_STA_FLAG_AUTHORIZED)) in cfg80211_check_station_change()
7140 return -EINVAL; in cfg80211_check_station_change()
7144 if (params->sta_flags_mask & ~(BIT(NL80211_STA_FLAG_AUTHORIZED) | in cfg80211_check_station_change()
7146 return -EINVAL; in cfg80211_check_station_change()
7148 if (params->sta_flags_set & BIT(NL80211_STA_FLAG_AUTHORIZED) && in cfg80211_check_station_change()
7149 !params->link_sta_params.supported_rates) in cfg80211_check_station_change()
7150 return -EINVAL; in cfg80211_check_station_change()
7154 return -EINVAL; in cfg80211_check_station_change()
7156 if (params->sta_modify_mask & STATION_PARAM_APPLY_PLINK_STATE) in cfg80211_check_station_change()
7157 return -EINVAL; in cfg80211_check_station_change()
7160 if (params->plink_action != NL80211_PLINK_ACTION_NO_ACTION && in cfg80211_check_station_change()
7161 params->plink_action != NL80211_PLINK_ACTION_BLOCK) in cfg80211_check_station_change()
7162 return -EINVAL; in cfg80211_check_station_change()
7173 params->link_sta_params.opmode_notif_used = false; in cfg80211_check_station_change()
7185 struct nlattr *vlanattr = info->attrs[NL80211_ATTR_STA_VLAN]; in get_vlan()
7194 return ERR_PTR(-ENODEV); in get_vlan()
7196 if (!v->ieee80211_ptr || v->ieee80211_ptr->wiphy != &rdev->wiphy) { in get_vlan()
7197 ret = -EINVAL; in get_vlan()
7201 if (v->ieee80211_ptr->iftype != NL80211_IFTYPE_AP_VLAN && in get_vlan()
7202 v->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && in get_vlan()
7203 v->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) { in get_vlan()
7204 ret = -EINVAL; in get_vlan()
7209 ret = -ENETDOWN; in get_vlan()
7227 if (!info->attrs[NL80211_ATTR_STA_WME]) in nl80211_parse_sta_wme()
7230 nla = info->attrs[NL80211_ATTR_STA_WME]; in nl80211_parse_sta_wme()
7233 info->extack); in nl80211_parse_sta_wme()
7238 params->uapsd_queues = nla_get_u8( in nl80211_parse_sta_wme()
7240 if (params->uapsd_queues & ~IEEE80211_WMM_IE_STA_QOSINFO_AC_MASK) in nl80211_parse_sta_wme()
7241 return -EINVAL; in nl80211_parse_sta_wme()
7244 params->max_sp = nla_get_u8(tb[NL80211_STA_WME_MAX_SP]); in nl80211_parse_sta_wme()
7246 if (params->max_sp & ~IEEE80211_WMM_IE_STA_QOSINFO_SP_MASK) in nl80211_parse_sta_wme()
7247 return -EINVAL; in nl80211_parse_sta_wme()
7249 params->sta_modify_mask |= STATION_PARAM_APPLY_UAPSD; in nl80211_parse_sta_wme()
7257 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]) { in nl80211_parse_sta_channel_info()
7258 params->supported_channels = in nl80211_parse_sta_channel_info()
7259 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]); in nl80211_parse_sta_channel_info()
7260 params->supported_channels_len = in nl80211_parse_sta_channel_info()
7261 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]); in nl80211_parse_sta_channel_info()
7267 if (params->supported_channels_len % 2) in nl80211_parse_sta_channel_info()
7268 return -EINVAL; in nl80211_parse_sta_channel_info()
7271 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]) { in nl80211_parse_sta_channel_info()
7272 params->supported_oper_classes = in nl80211_parse_sta_channel_info()
7273 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]); in nl80211_parse_sta_channel_info()
7274 params->supported_oper_classes_len = in nl80211_parse_sta_channel_info()
7275 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]); in nl80211_parse_sta_channel_info()
7285 if (info->attrs[NL80211_ATTR_PEER_AID]) in nl80211_set_station_tdls()
7286 params->aid = nla_get_u16(info->attrs[NL80211_ATTR_PEER_AID]); in nl80211_set_station_tdls()
7287 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) in nl80211_set_station_tdls()
7288 params->link_sta_params.ht_capa = in nl80211_set_station_tdls()
7289 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]); in nl80211_set_station_tdls()
7290 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) in nl80211_set_station_tdls()
7291 params->link_sta_params.vht_capa = in nl80211_set_station_tdls()
7292 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]); in nl80211_set_station_tdls()
7293 if (info->attrs[NL80211_ATTR_HE_CAPABILITY]) { in nl80211_set_station_tdls()
7294 params->link_sta_params.he_capa = in nl80211_set_station_tdls()
7295 nla_data(info->attrs[NL80211_ATTR_HE_CAPABILITY]); in nl80211_set_station_tdls()
7296 params->link_sta_params.he_capa_len = in nl80211_set_station_tdls()
7297 nla_len(info->attrs[NL80211_ATTR_HE_CAPABILITY]); in nl80211_set_station_tdls()
7299 if (info->attrs[NL80211_ATTR_EHT_CAPABILITY]) { in nl80211_set_station_tdls()
7300 params->link_sta_params.eht_capa = in nl80211_set_station_tdls()
7301 nla_data(info->attrs[NL80211_ATTR_EHT_CAPABILITY]); in nl80211_set_station_tdls()
7302 params->link_sta_params.eht_capa_len = in nl80211_set_station_tdls()
7303 nla_len(info->attrs[NL80211_ATTR_EHT_CAPABILITY]); in nl80211_set_station_tdls()
7305 if (!ieee80211_eht_capa_size_ok((const u8 *)params->link_sta_params.he_capa, in nl80211_set_station_tdls()
7306 (const u8 *)params->link_sta_params.eht_capa, in nl80211_set_station_tdls()
7307 params->link_sta_params.eht_capa_len, in nl80211_set_station_tdls()
7309 return -EINVAL; in nl80211_set_station_tdls()
7324 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_parse_sta_txpower_setting()
7327 if (info->attrs[NL80211_ATTR_STA_TX_POWER_SETTING]) { in nl80211_parse_sta_txpower_setting()
7328 if (!rdev->ops->set_tx_power || in nl80211_parse_sta_txpower_setting()
7329 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_parse_sta_txpower_setting()
7331 return -EOPNOTSUPP; in nl80211_parse_sta_txpower_setting()
7334 txpwr->type = nla_get_u8(info->attrs[idx]); in nl80211_parse_sta_txpower_setting()
7336 if (txpwr->type == NL80211_TX_POWER_LIMITED) { in nl80211_parse_sta_txpower_setting()
7339 if (info->attrs[idx]) in nl80211_parse_sta_txpower_setting()
7340 txpwr->power = nla_get_s16(info->attrs[idx]); in nl80211_parse_sta_txpower_setting()
7342 return -EINVAL; in nl80211_parse_sta_txpower_setting()
7355 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_station()
7356 struct net_device *dev = info->user_ptr[1]; in nl80211_set_station()
7363 if (!rdev->ops->change_station) in nl80211_set_station()
7364 return -EOPNOTSUPP; in nl80211_set_station()
7371 if (info->attrs[NL80211_ATTR_STA_AID]) in nl80211_set_station()
7372 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_STA_AID]); in nl80211_set_station()
7374 if (info->attrs[NL80211_ATTR_VLAN_ID]) in nl80211_set_station()
7375 params.vlan_id = nla_get_u16(info->attrs[NL80211_ATTR_VLAN_ID]); in nl80211_set_station()
7377 if (info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]) in nl80211_set_station()
7379 nla_get_u16(info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]); in nl80211_set_station()
7381 params.listen_interval = -1; in nl80211_set_station()
7383 if (info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]) in nl80211_set_station()
7385 nla_get_u8(info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]); in nl80211_set_station()
7387 params.support_p2p_ps = -1; in nl80211_set_station()
7389 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_set_station()
7390 return -EINVAL; in nl80211_set_station()
7393 nl80211_link_id_or_invalid(info->attrs); in nl80211_set_station()
7395 if (info->attrs[NL80211_ATTR_MLD_ADDR]) { in nl80211_set_station()
7402 return -EINVAL; in nl80211_set_station()
7404 mac_addr = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]); in nl80211_set_station()
7407 nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_set_station()
7409 return -EINVAL; in nl80211_set_station()
7411 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_set_station()
7415 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) { in nl80211_set_station()
7417 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); in nl80211_set_station()
7419 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); in nl80211_set_station()
7422 if (info->attrs[NL80211_ATTR_STA_CAPABILITY]) { in nl80211_set_station()
7424 nla_get_u16(info->attrs[NL80211_ATTR_STA_CAPABILITY]); in nl80211_set_station()
7428 if (info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]) { in nl80211_set_station()
7430 nla_data(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); in nl80211_set_station()
7432 nla_len(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); in nl80211_set_station()
7435 if (parse_station_flags(info, dev->ieee80211_ptr->iftype, &params)) in nl80211_set_station()
7436 return -EINVAL; in nl80211_set_station()
7438 if (info->attrs[NL80211_ATTR_STA_PLINK_ACTION]) in nl80211_set_station()
7440 nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_ACTION]); in nl80211_set_station()
7442 if (info->attrs[NL80211_ATTR_STA_PLINK_STATE]) { in nl80211_set_station()
7444 nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_STATE]); in nl80211_set_station()
7445 if (info->attrs[NL80211_ATTR_MESH_PEER_AID]) in nl80211_set_station()
7447 info->attrs[NL80211_ATTR_MESH_PEER_AID]); in nl80211_set_station()
7451 if (info->attrs[NL80211_ATTR_LOCAL_MESH_POWER_MODE]) in nl80211_set_station()
7453 info->attrs[NL80211_ATTR_LOCAL_MESH_POWER_MODE]); in nl80211_set_station()
7455 if (info->attrs[NL80211_ATTR_OPMODE_NOTIF]) { in nl80211_set_station()
7458 nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]); in nl80211_set_station()
7461 if (info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]) in nl80211_set_station()
7463 nla_data(info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]); in nl80211_set_station()
7465 if (info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]) in nl80211_set_station()
7467 nla_get_u16(info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]); in nl80211_set_station()
7470 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_set_station()
7472 return -EOPNOTSUPP; in nl80211_set_station()
7489 switch (dev->ieee80211_ptr->iftype) { in nl80211_set_station()
7499 err = -EOPNOTSUPP; in nl80211_set_station()
7514 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_new_station()
7516 struct net_device *dev = info->user_ptr[1]; in nl80211_new_station()
7517 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_new_station()
7525 if (!rdev->ops->add_station) in nl80211_new_station()
7526 return -EOPNOTSUPP; in nl80211_new_station()
7528 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_new_station()
7529 return -EINVAL; in nl80211_new_station()
7531 if (!info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]) in nl80211_new_station()
7532 return -EINVAL; in nl80211_new_station()
7534 if (!info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) in nl80211_new_station()
7535 return -EINVAL; in nl80211_new_station()
7537 if (!info->attrs[NL80211_ATTR_STA_AID] && in nl80211_new_station()
7538 !info->attrs[NL80211_ATTR_PEER_AID]) in nl80211_new_station()
7539 return -EINVAL; in nl80211_new_station()
7542 nl80211_link_id_or_invalid(info->attrs); in nl80211_new_station()
7544 if (info->attrs[NL80211_ATTR_MLD_ADDR]) { in nl80211_new_station()
7545 mac_addr = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]); in nl80211_new_station()
7548 nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_new_station()
7550 return -EINVAL; in nl80211_new_station()
7552 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_new_station()
7556 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); in nl80211_new_station()
7558 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); in nl80211_new_station()
7560 nla_get_u16(info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]); in nl80211_new_station()
7562 if (info->attrs[NL80211_ATTR_VLAN_ID]) in nl80211_new_station()
7563 params.vlan_id = nla_get_u16(info->attrs[NL80211_ATTR_VLAN_ID]); in nl80211_new_station()
7565 if (info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]) { in nl80211_new_station()
7567 nla_get_u8(info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]); in nl80211_new_station()
7574 dev->ieee80211_ptr->iftype == NL80211_IFTYPE_P2P_GO; in nl80211_new_station()
7577 if (info->attrs[NL80211_ATTR_PEER_AID]) in nl80211_new_station()
7578 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_PEER_AID]); in nl80211_new_station()
7580 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_STA_AID]); in nl80211_new_station()
7582 if (info->attrs[NL80211_ATTR_STA_CAPABILITY]) { in nl80211_new_station()
7584 nla_get_u16(info->attrs[NL80211_ATTR_STA_CAPABILITY]); in nl80211_new_station()
7588 if (info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]) { in nl80211_new_station()
7590 nla_data(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); in nl80211_new_station()
7592 nla_len(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); in nl80211_new_station()
7595 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) in nl80211_new_station()
7597 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]); in nl80211_new_station()
7599 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) in nl80211_new_station()
7601 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]); in nl80211_new_station()
7603 if (info->attrs[NL80211_ATTR_HE_CAPABILITY]) { in nl80211_new_station()
7605 nla_data(info->attrs[NL80211_ATTR_HE_CAPABILITY]); in nl80211_new_station()
7607 nla_len(info->attrs[NL80211_ATTR_HE_CAPABILITY]); in nl80211_new_station()
7609 if (info->attrs[NL80211_ATTR_EHT_CAPABILITY]) { in nl80211_new_station()
7611 nla_data(info->attrs[NL80211_ATTR_EHT_CAPABILITY]); in nl80211_new_station()
7613 nla_len(info->attrs[NL80211_ATTR_EHT_CAPABILITY]); in nl80211_new_station()
7619 return -EINVAL; in nl80211_new_station()
7623 if (info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]) in nl80211_new_station()
7625 nla_data(info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]); in nl80211_new_station()
7627 if (info->attrs[NL80211_ATTR_OPMODE_NOTIF]) { in nl80211_new_station()
7630 nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]); in nl80211_new_station()
7633 if (info->attrs[NL80211_ATTR_STA_PLINK_ACTION]) in nl80211_new_station()
7635 nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_ACTION]); in nl80211_new_station()
7637 if (info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]) in nl80211_new_station()
7639 nla_get_u16(info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]); in nl80211_new_station()
7642 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_new_station()
7644 return -EOPNOTSUPP; in nl80211_new_station()
7660 if (parse_station_flags(info, dev->ieee80211_ptr->iftype, &params)) in nl80211_new_station()
7661 return -EINVAL; in nl80211_new_station()
7676 return -EINVAL; in nl80211_new_station()
7682 return -EINVAL; in nl80211_new_station()
7687 switch (dev->ieee80211_ptr->iftype) { in nl80211_new_station()
7692 if (!(rdev->wiphy.flags & WIPHY_FLAG_AP_UAPSD) || in nl80211_new_station()
7698 info->attrs[NL80211_ATTR_PEER_AID]) in nl80211_new_station()
7699 return -EINVAL; in nl80211_new_station()
7704 if (!(rdev->wiphy.features & in nl80211_new_station()
7707 return -EINVAL; in nl80211_new_station()
7709 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_new_station()
7712 return -EINVAL; in nl80211_new_station()
7740 return -EINVAL; in nl80211_new_station()
7743 info->attrs[NL80211_ATTR_PEER_AID]) in nl80211_new_station()
7744 return -EINVAL; in nl80211_new_station()
7755 return -EINVAL; in nl80211_new_station()
7758 return -EINVAL; in nl80211_new_station()
7760 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS)) in nl80211_new_station()
7761 return -EOPNOTSUPP; in nl80211_new_station()
7763 if (!(rdev->wiphy.flags & WIPHY_FLAG_TDLS_EXTERNAL_SETUP)) in nl80211_new_station()
7764 return -EOPNOTSUPP; in nl80211_new_station()
7772 return -EOPNOTSUPP; in nl80211_new_station()
7777 if (wdev->valid_links) { in nl80211_new_station()
7779 err = -EINVAL; in nl80211_new_station()
7782 if (!(wdev->valid_links & BIT(params.link_sta_params.link_id))) { in nl80211_new_station()
7783 err = -ENOLINK; in nl80211_new_station()
7788 err = -EINVAL; in nl80211_new_station()
7800 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_del_station()
7801 struct net_device *dev = info->user_ptr[1]; in nl80211_del_station()
7802 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_del_station()
7804 int link_id = nl80211_link_id_or_invalid(info->attrs); in nl80211_del_station()
7808 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_del_station()
7809 params.mac = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_del_station()
7811 switch (wdev->iftype) { in nl80211_del_station()
7820 if (wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_del_station()
7823 return -EINVAL; in nl80211_del_station()
7825 return -EINVAL; in nl80211_del_station()
7828 if (!rdev->ops->del_station) in nl80211_del_station()
7829 return -EOPNOTSUPP; in nl80211_del_station()
7831 if (info->attrs[NL80211_ATTR_MGMT_SUBTYPE]) { in nl80211_del_station()
7833 nla_get_u8(info->attrs[NL80211_ATTR_MGMT_SUBTYPE]); in nl80211_del_station()
7836 return -EINVAL; in nl80211_del_station()
7842 if (info->attrs[NL80211_ATTR_REASON_CODE]) { in nl80211_del_station()
7844 nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); in nl80211_del_station()
7846 return -EINVAL; /* 0 is reserved */ in nl80211_del_station()
7852 /* Link ID not expected in case of non-ML operation */ in nl80211_del_station()
7853 if (!wdev->valid_links && link_id != -1) in nl80211_del_station()
7854 return -EINVAL; in nl80211_del_station()
7857 if (wdev->valid_links && link_id >= 0 && in nl80211_del_station()
7858 !(wdev->valid_links & BIT(link_id))) in nl80211_del_station()
7859 return -EINVAL; in nl80211_del_station()
7876 return -1; in nl80211_send_mpath()
7878 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in nl80211_send_mpath()
7881 nla_put_u32(msg, NL80211_ATTR_GENERATION, pinfo->generation)) in nl80211_send_mpath()
7887 if ((pinfo->filled & MPATH_INFO_FRAME_QLEN) && in nl80211_send_mpath()
7889 pinfo->frame_qlen)) in nl80211_send_mpath()
7891 if (((pinfo->filled & MPATH_INFO_SN) && in nl80211_send_mpath()
7892 nla_put_u32(msg, NL80211_MPATH_INFO_SN, pinfo->sn)) || in nl80211_send_mpath()
7893 ((pinfo->filled & MPATH_INFO_METRIC) && in nl80211_send_mpath()
7895 pinfo->metric)) || in nl80211_send_mpath()
7896 ((pinfo->filled & MPATH_INFO_EXPTIME) && in nl80211_send_mpath()
7898 pinfo->exptime)) || in nl80211_send_mpath()
7899 ((pinfo->filled & MPATH_INFO_FLAGS) && in nl80211_send_mpath()
7901 pinfo->flags)) || in nl80211_send_mpath()
7902 ((pinfo->filled & MPATH_INFO_DISCOVERY_TIMEOUT) && in nl80211_send_mpath()
7904 pinfo->discovery_timeout)) || in nl80211_send_mpath()
7905 ((pinfo->filled & MPATH_INFO_DISCOVERY_RETRIES) && in nl80211_send_mpath()
7907 pinfo->discovery_retries)) || in nl80211_send_mpath()
7908 ((pinfo->filled & MPATH_INFO_HOP_COUNT) && in nl80211_send_mpath()
7910 pinfo->hop_count)) || in nl80211_send_mpath()
7911 ((pinfo->filled & MPATH_INFO_PATH_CHANGE) && in nl80211_send_mpath()
7913 pinfo->path_change_count))) in nl80211_send_mpath()
7923 return -EMSGSIZE; in nl80211_send_mpath()
7934 int path_idx = cb->args[2]; in nl80211_dump_mpath()
7941 __acquire(&rdev->wiphy.mtx); in nl80211_dump_mpath()
7943 if (!rdev->ops->dump_mpath) { in nl80211_dump_mpath()
7944 err = -EOPNOTSUPP; in nl80211_dump_mpath()
7948 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) { in nl80211_dump_mpath()
7949 err = -EOPNOTSUPP; in nl80211_dump_mpath()
7954 err = rdev_dump_mpath(rdev, wdev->netdev, path_idx, dst, in nl80211_dump_mpath()
7956 if (err == -ENOENT) in nl80211_dump_mpath()
7961 if (nl80211_send_mpath(skb, NETLINK_CB(cb->skb).portid, in nl80211_dump_mpath()
7962 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_dump_mpath()
7963 wdev->netdev, dst, next_hop, in nl80211_dump_mpath()
7971 cb->args[2] = path_idx; in nl80211_dump_mpath()
7972 err = skb->len; in nl80211_dump_mpath()
7974 wiphy_unlock(&rdev->wiphy); in nl80211_dump_mpath()
7980 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_mpath()
7982 struct net_device *dev = info->user_ptr[1]; in nl80211_get_mpath()
7990 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_get_mpath()
7991 return -EINVAL; in nl80211_get_mpath()
7993 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_get_mpath()
7995 if (!rdev->ops->get_mpath) in nl80211_get_mpath()
7996 return -EOPNOTSUPP; in nl80211_get_mpath()
7998 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_get_mpath()
7999 return -EOPNOTSUPP; in nl80211_get_mpath()
8007 return -ENOMEM; in nl80211_get_mpath()
8009 if (nl80211_send_mpath(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_mpath()
8012 return -ENOBUFS; in nl80211_get_mpath()
8020 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_mpath()
8021 struct net_device *dev = info->user_ptr[1]; in nl80211_set_mpath()
8025 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_set_mpath()
8026 return -EINVAL; in nl80211_set_mpath()
8028 if (!info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]) in nl80211_set_mpath()
8029 return -EINVAL; in nl80211_set_mpath()
8031 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_set_mpath()
8032 next_hop = nla_data(info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]); in nl80211_set_mpath()
8034 if (!rdev->ops->change_mpath) in nl80211_set_mpath()
8035 return -EOPNOTSUPP; in nl80211_set_mpath()
8037 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_set_mpath()
8038 return -EOPNOTSUPP; in nl80211_set_mpath()
8045 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_new_mpath()
8046 struct net_device *dev = info->user_ptr[1]; in nl80211_new_mpath()
8050 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_new_mpath()
8051 return -EINVAL; in nl80211_new_mpath()
8053 if (!info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]) in nl80211_new_mpath()
8054 return -EINVAL; in nl80211_new_mpath()
8056 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_new_mpath()
8057 next_hop = nla_data(info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]); in nl80211_new_mpath()
8059 if (!rdev->ops->add_mpath) in nl80211_new_mpath()
8060 return -EOPNOTSUPP; in nl80211_new_mpath()
8062 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_new_mpath()
8063 return -EOPNOTSUPP; in nl80211_new_mpath()
8070 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_del_mpath()
8071 struct net_device *dev = info->user_ptr[1]; in nl80211_del_mpath()
8074 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_del_mpath()
8075 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_del_mpath()
8077 if (!rdev->ops->del_mpath) in nl80211_del_mpath()
8078 return -EOPNOTSUPP; in nl80211_del_mpath()
8080 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_del_mpath()
8081 return -EOPNOTSUPP; in nl80211_del_mpath()
8088 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_mpp()
8090 struct net_device *dev = info->user_ptr[1]; in nl80211_get_mpp()
8098 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_get_mpp()
8099 return -EINVAL; in nl80211_get_mpp()
8101 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_get_mpp()
8103 if (!rdev->ops->get_mpp) in nl80211_get_mpp()
8104 return -EOPNOTSUPP; in nl80211_get_mpp()
8106 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_get_mpp()
8107 return -EOPNOTSUPP; in nl80211_get_mpp()
8115 return -ENOMEM; in nl80211_get_mpp()
8117 if (nl80211_send_mpath(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_mpp()
8120 return -ENOBUFS; in nl80211_get_mpp()
8134 int path_idx = cb->args[2]; in nl80211_dump_mpp()
8141 __acquire(&rdev->wiphy.mtx); in nl80211_dump_mpp()
8143 if (!rdev->ops->dump_mpp) { in nl80211_dump_mpp()
8144 err = -EOPNOTSUPP; in nl80211_dump_mpp()
8148 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) { in nl80211_dump_mpp()
8149 err = -EOPNOTSUPP; in nl80211_dump_mpp()
8154 err = rdev_dump_mpp(rdev, wdev->netdev, path_idx, dst, in nl80211_dump_mpp()
8156 if (err == -ENOENT) in nl80211_dump_mpp()
8161 if (nl80211_send_mpath(skb, NETLINK_CB(cb->skb).portid, in nl80211_dump_mpp()
8162 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_dump_mpp()
8163 wdev->netdev, dst, mpp, in nl80211_dump_mpp()
8171 cb->args[2] = path_idx; in nl80211_dump_mpp()
8172 err = skb->len; in nl80211_dump_mpp()
8174 wiphy_unlock(&rdev->wiphy); in nl80211_dump_mpp()
8180 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_bss()
8181 struct net_device *dev = info->user_ptr[1]; in nl80211_set_bss()
8185 params.link_id = nl80211_link_id_or_invalid(info->attrs); in nl80211_set_bss()
8187 params.use_cts_prot = -1; in nl80211_set_bss()
8188 params.use_short_preamble = -1; in nl80211_set_bss()
8189 params.use_short_slot_time = -1; in nl80211_set_bss()
8190 params.ap_isolate = -1; in nl80211_set_bss()
8191 params.ht_opmode = -1; in nl80211_set_bss()
8192 params.p2p_ctwindow = -1; in nl80211_set_bss()
8193 params.p2p_opp_ps = -1; in nl80211_set_bss()
8195 if (info->attrs[NL80211_ATTR_BSS_CTS_PROT]) in nl80211_set_bss()
8197 nla_get_u8(info->attrs[NL80211_ATTR_BSS_CTS_PROT]); in nl80211_set_bss()
8198 if (info->attrs[NL80211_ATTR_BSS_SHORT_PREAMBLE]) in nl80211_set_bss()
8200 nla_get_u8(info->attrs[NL80211_ATTR_BSS_SHORT_PREAMBLE]); in nl80211_set_bss()
8201 if (info->attrs[NL80211_ATTR_BSS_SHORT_SLOT_TIME]) in nl80211_set_bss()
8203 nla_get_u8(info->attrs[NL80211_ATTR_BSS_SHORT_SLOT_TIME]); in nl80211_set_bss()
8204 if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) { in nl80211_set_bss()
8206 nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); in nl80211_set_bss()
8208 nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); in nl80211_set_bss()
8210 if (info->attrs[NL80211_ATTR_AP_ISOLATE]) in nl80211_set_bss()
8211 params.ap_isolate = !!nla_get_u8(info->attrs[NL80211_ATTR_AP_ISOLATE]); in nl80211_set_bss()
8212 if (info->attrs[NL80211_ATTR_BSS_HT_OPMODE]) in nl80211_set_bss()
8214 nla_get_u16(info->attrs[NL80211_ATTR_BSS_HT_OPMODE]); in nl80211_set_bss()
8216 if (info->attrs[NL80211_ATTR_P2P_CTWINDOW]) { in nl80211_set_bss()
8217 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_set_bss()
8218 return -EINVAL; in nl80211_set_bss()
8220 nla_get_u8(info->attrs[NL80211_ATTR_P2P_CTWINDOW]); in nl80211_set_bss()
8222 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_CTWIN)) in nl80211_set_bss()
8223 return -EINVAL; in nl80211_set_bss()
8226 if (info->attrs[NL80211_ATTR_P2P_OPPPS]) { in nl80211_set_bss()
8229 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_set_bss()
8230 return -EINVAL; in nl80211_set_bss()
8231 tmp = nla_get_u8(info->attrs[NL80211_ATTR_P2P_OPPPS]); in nl80211_set_bss()
8234 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_OPPPS)) in nl80211_set_bss()
8235 return -EINVAL; in nl80211_set_bss()
8238 if (!rdev->ops->change_bss) in nl80211_set_bss()
8239 return -EOPNOTSUPP; in nl80211_set_bss()
8241 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && in nl80211_set_bss()
8242 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_set_bss()
8243 return -EOPNOTSUPP; in nl80211_set_bss()
8257 * completely when built-in to the kernel right between the time in nl80211_req_set_reg()
8262 return -EINPROGRESS; in nl80211_req_set_reg()
8265 nla_get_u32_default(info->attrs[NL80211_ATTR_USER_REG_HINT_TYPE], in nl80211_req_set_reg()
8271 if (!info->attrs[NL80211_ATTR_REG_ALPHA2]) in nl80211_req_set_reg()
8272 return -EINVAL; in nl80211_req_set_reg()
8274 data = nla_data(info->attrs[NL80211_ATTR_REG_ALPHA2]); in nl80211_req_set_reg()
8277 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) { in nl80211_req_set_reg()
8278 owner_nlportid = info->snd_portid; in nl80211_req_set_reg()
8279 is_indoor = !!info->attrs[NL80211_ATTR_REG_INDOOR]; in nl80211_req_set_reg()
8288 return -EINVAL; in nl80211_req_set_reg()
8300 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_mesh_config()
8301 struct net_device *dev = info->user_ptr[1]; in nl80211_get_mesh_config()
8302 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_get_mesh_config()
8309 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_get_mesh_config()
8310 return -EOPNOTSUPP; in nl80211_get_mesh_config()
8312 if (!rdev->ops->get_mesh_config) in nl80211_get_mesh_config()
8313 return -EOPNOTSUPP; in nl80211_get_mesh_config()
8316 if (!wdev->u.mesh.id_len) in nl80211_get_mesh_config()
8327 return -ENOMEM; in nl80211_get_mesh_config()
8328 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_mesh_config()
8335 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in nl80211_get_mesh_config()
8406 return -ENOBUFS; in nl80211_get_mesh_config()
8441 NLA_POLICY_RANGE(NLA_S32, -255, 0),
8484 cfg->param = fn(tb[attr]); \ in nl80211_parse_mesh_config()
8485 mask |= BIT((attr) - 1); \ in nl80211_parse_mesh_config()
8489 if (!info->attrs[NL80211_ATTR_MESH_CONFIG]) in nl80211_parse_mesh_config()
8490 return -EINVAL; in nl80211_parse_mesh_config()
8491 …ated(tb, NL80211_MESHCONF_ATTR_MAX, info->attrs[NL80211_ATTR_MESH_CONFIG], nl80211_meshconf_params… in nl80211_parse_mesh_config()
8492 return -EINVAL; in nl80211_parse_mesh_config()
8530 (cfg->path_refresh_time < 1 || cfg->path_refresh_time > 65535)) in nl80211_parse_mesh_config()
8531 return -EINVAL; in nl80211_parse_mesh_config()
8540 (cfg->dot11MeshHWMPactivePathTimeout < 1 || in nl80211_parse_mesh_config()
8541 cfg->dot11MeshHWMPactivePathTimeout > 65535)) in nl80211_parse_mesh_config()
8542 return -EINVAL; in nl80211_parse_mesh_config()
8574 * IEEE 802.11-2016 9.4.2.57 HT Operation element. in nl80211_parse_mesh_config()
8582 return -EINVAL; in nl80211_parse_mesh_config()
8587 cfg->ht_opmode = ht_opmode; in nl80211_parse_mesh_config()
8588 mask |= (1 << (NL80211_MESHCONF_HT_OPMODE - 1)); in nl80211_parse_mesh_config()
8595 (cfg->dot11MeshHWMPactivePathToRootTimeout < 1 || in nl80211_parse_mesh_config()
8596 cfg->dot11MeshHWMPactivePathToRootTimeout > 65535)) in nl80211_parse_mesh_config()
8597 return -EINVAL; in nl80211_parse_mesh_config()
8624 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_parse_mesh_setup()
8627 if (!info->attrs[NL80211_ATTR_MESH_SETUP]) in nl80211_parse_mesh_setup()
8628 return -EINVAL; in nl80211_parse_mesh_setup()
8629 …ed(tb, NL80211_MESH_SETUP_ATTR_MAX, info->attrs[NL80211_ATTR_MESH_SETUP], nl80211_mesh_setup_param… in nl80211_parse_mesh_setup()
8630 return -EINVAL; in nl80211_parse_mesh_setup()
8633 setup->sync_method = in nl80211_parse_mesh_setup()
8639 setup->path_sel_proto = in nl80211_parse_mesh_setup()
8645 setup->path_metric = in nl80211_parse_mesh_setup()
8653 setup->ie = nla_data(ieattr); in nl80211_parse_mesh_setup()
8654 setup->ie_len = nla_len(ieattr); in nl80211_parse_mesh_setup()
8657 !(rdev->wiphy.features & NL80211_FEATURE_USERSPACE_MPM)) in nl80211_parse_mesh_setup()
8658 return -EINVAL; in nl80211_parse_mesh_setup()
8659 setup->user_mpm = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_MPM]); in nl80211_parse_mesh_setup()
8660 setup->is_authenticated = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_AUTH]); in nl80211_parse_mesh_setup()
8661 setup->is_secure = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_AMPE]); in nl80211_parse_mesh_setup()
8662 if (setup->is_secure) in nl80211_parse_mesh_setup()
8663 setup->user_mpm = true; in nl80211_parse_mesh_setup()
8666 if (!setup->user_mpm) in nl80211_parse_mesh_setup()
8667 return -EINVAL; in nl80211_parse_mesh_setup()
8668 setup->auth_id = in nl80211_parse_mesh_setup()
8678 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_update_mesh_config()
8679 struct net_device *dev = info->user_ptr[1]; in nl80211_update_mesh_config()
8680 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_update_mesh_config()
8685 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_update_mesh_config()
8686 return -EOPNOTSUPP; in nl80211_update_mesh_config()
8688 if (!rdev->ops->update_mesh_config) in nl80211_update_mesh_config()
8689 return -EOPNOTSUPP; in nl80211_update_mesh_config()
8695 if (!wdev->u.mesh.id_len) in nl80211_update_mesh_config()
8696 err = -ENOLINK; in nl80211_update_mesh_config()
8710 if (nla_put_string(msg, NL80211_ATTR_REG_ALPHA2, regdom->alpha2) || in nl80211_put_regdom()
8711 (regdom->dfs_region && in nl80211_put_regdom()
8712 nla_put_u8(msg, NL80211_ATTR_DFS_REGION, regdom->dfs_region))) in nl80211_put_regdom()
8719 for (i = 0; i < regdom->n_reg_rules; i++) { in nl80211_put_regdom()
8726 reg_rule = &regdom->reg_rules[i]; in nl80211_put_regdom()
8727 freq_range = &reg_rule->freq_range; in nl80211_put_regdom()
8728 power_rule = &reg_rule->power_rule; in nl80211_put_regdom()
8734 max_bandwidth_khz = freq_range->max_bandwidth_khz; in nl80211_put_regdom()
8740 reg_rule->flags) || in nl80211_put_regdom()
8742 freq_range->start_freq_khz) || in nl80211_put_regdom()
8744 freq_range->end_freq_khz) || in nl80211_put_regdom()
8748 power_rule->max_antenna_gain) || in nl80211_put_regdom()
8750 power_rule->max_eirp) || in nl80211_put_regdom()
8752 reg_rule->dfs_cac_ms)) in nl80211_put_regdom()
8755 if ((reg_rule->flags & NL80211_RRF_PSD) && in nl80211_put_regdom()
8757 reg_rule->psd)) in nl80211_put_regdom()
8767 return -EMSGSIZE; in nl80211_put_regdom()
8776 int err = -EMSGSIZE; in nl80211_get_reg_do()
8781 return -ENOBUFS; in nl80211_get_reg_do()
8783 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_reg_do()
8790 if (info->attrs[NL80211_ATTR_WIPHY]) { in nl80211_get_reg_do()
8799 wiphy = &rdev->wiphy; in nl80211_get_reg_do()
8800 self_managed = wiphy->regulatory_flags & in nl80211_get_reg_do()
8807 /* a self-managed-reg device must have a private regdom */ in nl80211_get_reg_do()
8809 err = -EINVAL; in nl80211_get_reg_do()
8850 void *hdr = nl80211hdr_put(msg, NETLINK_CB(cb->skb).portid, seq, flags, in nl80211_send_regdom()
8854 return -1; in nl80211_send_regdom()
8870 if (wiphy && wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED && in nl80211_send_regdom()
8879 return -EMSGSIZE; in nl80211_send_regdom()
8887 int err, reg_idx, start = cb->args[2]; in nl80211_get_reg_dump()
8892 err = nl80211_send_regdom(skb, cb, cb->nlh->nlmsg_seq, in nl80211_get_reg_dump()
8902 regdom = get_wiphy_regdom(&rdev->wiphy); in nl80211_get_reg_dump()
8909 err = nl80211_send_regdom(skb, cb, cb->nlh->nlmsg_seq, in nl80211_get_reg_dump()
8910 NLM_F_MULTI, &rdev->wiphy, regdom); in nl80211_get_reg_dump()
8912 reg_idx--; in nl80211_get_reg_dump()
8917 cb->args[2] = reg_idx; in nl80211_get_reg_dump()
8918 err = skb->len; in nl80211_get_reg_dump()
8938 struct ieee80211_freq_range *freq_range = &reg_rule->freq_range; in parse_reg_rule()
8939 struct ieee80211_power_rule *power_rule = &reg_rule->power_rule; in parse_reg_rule()
8942 return -EINVAL; in parse_reg_rule()
8944 return -EINVAL; in parse_reg_rule()
8946 return -EINVAL; in parse_reg_rule()
8948 return -EINVAL; in parse_reg_rule()
8950 return -EINVAL; in parse_reg_rule()
8952 reg_rule->flags = nla_get_u32(tb[NL80211_ATTR_REG_RULE_FLAGS]); in parse_reg_rule()
8954 freq_range->start_freq_khz = in parse_reg_rule()
8956 freq_range->end_freq_khz = in parse_reg_rule()
8958 freq_range->max_bandwidth_khz = in parse_reg_rule()
8961 power_rule->max_eirp = in parse_reg_rule()
8965 power_rule->max_antenna_gain = in parse_reg_rule()
8969 reg_rule->dfs_cac_ms = in parse_reg_rule()
8985 if (!info->attrs[NL80211_ATTR_REG_ALPHA2]) in nl80211_set_reg()
8986 return -EINVAL; in nl80211_set_reg()
8988 if (!info->attrs[NL80211_ATTR_REG_RULES]) in nl80211_set_reg()
8989 return -EINVAL; in nl80211_set_reg()
8991 alpha2 = nla_data(info->attrs[NL80211_ATTR_REG_ALPHA2]); in nl80211_set_reg()
8993 if (info->attrs[NL80211_ATTR_DFS_REGION]) in nl80211_set_reg()
8994 dfs_region = nla_get_u8(info->attrs[NL80211_ATTR_DFS_REGION]); in nl80211_set_reg()
8996 nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES], in nl80211_set_reg()
9000 return -EINVAL; in nl80211_set_reg()
9005 r = -EINVAL; in nl80211_set_reg()
9011 r = -ENOMEM; in nl80211_set_reg()
9015 rd->n_reg_rules = num_rules; in nl80211_set_reg()
9016 rd->alpha2[0] = alpha2[0]; in nl80211_set_reg()
9017 rd->alpha2[1] = alpha2[1]; in nl80211_set_reg()
9024 rd->dfs_region = dfs_region; in nl80211_set_reg()
9026 nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES], in nl80211_set_reg()
9030 info->extack); in nl80211_set_reg()
9033 r = parse_reg_rule(tb, &rd->reg_rules[rule_idx]); in nl80211_set_reg()
9040 r = -EINVAL; in nl80211_set_reg()
9087 return b < NUM_NL80211_BANDS && wiphy->bands[b]; in is_band_valid()
9102 return -EINVAL; in parse_bss_select()
9114 return -EINVAL; in parse_bss_select()
9119 bss_select->behaviour = __NL80211_BSS_SELECT_ATTR_INVALID; in parse_bss_select()
9122 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_RSSI; in parse_bss_select()
9125 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_BAND_PREF; in parse_bss_select()
9126 bss_select->param.band_pref = in parse_bss_select()
9128 if (!is_band_valid(wiphy, bss_select->param.band_pref)) in parse_bss_select()
9129 return -EINVAL; in parse_bss_select()
9136 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_RSSI_ADJUST; in parse_bss_select()
9137 bss_select->param.adjust.band = adj_param->band; in parse_bss_select()
9138 bss_select->param.adjust.delta = adj_param->delta; in parse_bss_select()
9139 if (!is_band_valid(wiphy, bss_select->param.adjust.band)) in parse_bss_select()
9140 return -EINVAL; in parse_bss_select()
9143 /* user-space did not provide behaviour attribute */ in parse_bss_select()
9144 if (bss_select->behaviour == __NL80211_BSS_SELECT_ATTR_INVALID) in parse_bss_select()
9145 return -EINVAL; in parse_bss_select()
9147 if (!(wiphy->bss_select_support & BIT(bss_select->behaviour))) in parse_bss_select()
9148 return -EINVAL; in parse_bss_select()
9169 return -EINVAL; in nl80211_parse_random_mac()
9177 return -EINVAL; in nl80211_parse_random_mac()
9196 lockdep_assert_wiphy(wdev->wiphy); in cfg80211_off_channel_oper_allowed()
9216 if (!chandef || !chandef->chan) in cfg80211_off_channel_oper_allowed()
9223 * the off-channel operation. in cfg80211_off_channel_oper_allowed()
9226 if (chandef->chan->flags & IEEE80211_CHAN_RADAR) in cfg80211_off_channel_oper_allowed()
9233 return regulatory_pre_cac_allowed(wdev->wiphy); in cfg80211_off_channel_oper_allowed()
9264 flags = &req->flags; in nl80211_check_scan_flags()
9265 mac_addr = req->mac_addr; in nl80211_check_scan_flags()
9266 mac_addr_mask = req->mac_addr_mask; in nl80211_check_scan_flags()
9271 flags = &req->flags; in nl80211_check_scan_flags()
9272 mac_addr = req->mac_addr; in nl80211_check_scan_flags()
9273 mac_addr_mask = req->mac_addr_mask; in nl80211_check_scan_flags()
9279 !(wiphy->features & NL80211_FEATURE_LOW_PRIORITY_SCAN)) || in nl80211_check_scan_flags()
9307 return -EOPNOTSUPP; in nl80211_check_scan_flags()
9312 if (!(wiphy->features & randomness_flag) || in nl80211_check_scan_flags()
9313 (wdev && wdev->connected)) in nl80211_check_scan_flags()
9314 return -EOPNOTSUPP; in nl80211_check_scan_flags()
9326 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_trigger_scan()
9327 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_trigger_scan()
9337 wiphy = &rdev->wiphy; in nl80211_trigger_scan()
9339 if (wdev->iftype == NL80211_IFTYPE_NAN) in nl80211_trigger_scan()
9340 return -EOPNOTSUPP; in nl80211_trigger_scan()
9342 if (!rdev->ops->scan) in nl80211_trigger_scan()
9343 return -EOPNOTSUPP; in nl80211_trigger_scan()
9345 if (rdev->scan_req || rdev->scan_msg) in nl80211_trigger_scan()
9346 return -EBUSY; in nl80211_trigger_scan()
9348 if (info->attrs[NL80211_ATTR_SCAN_FREQ_KHZ]) { in nl80211_trigger_scan()
9351 return -EOPNOTSUPP; in nl80211_trigger_scan()
9352 scan_freqs = info->attrs[NL80211_ATTR_SCAN_FREQ_KHZ]; in nl80211_trigger_scan()
9354 } else if (info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]) in nl80211_trigger_scan()
9355 scan_freqs = info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]; in nl80211_trigger_scan()
9360 return -EINVAL; in nl80211_trigger_scan()
9365 if (info->attrs[NL80211_ATTR_SCAN_SSIDS]) in nl80211_trigger_scan()
9366 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp) in nl80211_trigger_scan()
9369 if (n_ssids > wiphy->max_scan_ssids) in nl80211_trigger_scan()
9370 return -EINVAL; in nl80211_trigger_scan()
9372 if (info->attrs[NL80211_ATTR_IE]) in nl80211_trigger_scan()
9373 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_trigger_scan()
9377 if (ie_len > wiphy->max_scan_ie_len) in nl80211_trigger_scan()
9378 return -EINVAL; in nl80211_trigger_scan()
9382 size = size_add(size, array_size(sizeof(*request->ssids), n_ssids)); in nl80211_trigger_scan()
9387 return -ENOMEM; in nl80211_trigger_scan()
9388 request->n_channels = n_channels; in nl80211_trigger_scan()
9391 request->ssids = (void *)request + ssids_offset; in nl80211_trigger_scan()
9392 request->n_ssids = n_ssids; in nl80211_trigger_scan()
9394 request->ie = (void *)request + ie_offset; in nl80211_trigger_scan()
9408 err = -EINVAL; in nl80211_trigger_scan()
9413 if (chan->flags & IEEE80211_CHAN_DISABLED || in nl80211_trigger_scan()
9417 request->channels[i] = chan; in nl80211_trigger_scan()
9427 if (!wiphy->bands[band]) in nl80211_trigger_scan()
9429 for (j = 0; j < wiphy->bands[band]->n_channels; j++) { in nl80211_trigger_scan()
9432 chan = &wiphy->bands[band]->channels[j]; in nl80211_trigger_scan()
9434 if (chan->flags & IEEE80211_CHAN_DISABLED || in nl80211_trigger_scan()
9438 request->channels[i] = chan; in nl80211_trigger_scan()
9445 err = -EINVAL; in nl80211_trigger_scan()
9449 request->n_channels = i; in nl80211_trigger_scan()
9451 for (i = 0; i < request->n_channels; i++) { in nl80211_trigger_scan()
9452 struct ieee80211_channel *chan = request->channels[i]; in nl80211_trigger_scan()
9454 /* if we can go off-channel to the target channel we're good */ in nl80211_trigger_scan()
9459 err = -EBUSY; in nl80211_trigger_scan()
9466 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp) { in nl80211_trigger_scan()
9468 err = -EINVAL; in nl80211_trigger_scan()
9471 request->ssids[i].ssid_len = nla_len(attr); in nl80211_trigger_scan()
9472 memcpy(request->ssids[i].ssid, nla_data(attr), nla_len(attr)); in nl80211_trigger_scan()
9477 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_trigger_scan()
9478 request->ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_trigger_scan()
9479 memcpy((void *)request->ie, in nl80211_trigger_scan()
9480 nla_data(info->attrs[NL80211_ATTR_IE]), in nl80211_trigger_scan()
9481 request->ie_len); in nl80211_trigger_scan()
9485 if (wiphy->bands[i]) in nl80211_trigger_scan()
9486 request->rates[i] = in nl80211_trigger_scan()
9487 (1 << wiphy->bands[i]->n_bitrates) - 1; in nl80211_trigger_scan()
9489 if (info->attrs[NL80211_ATTR_SCAN_SUPP_RATES]) { in nl80211_trigger_scan()
9491 info->attrs[NL80211_ATTR_SCAN_SUPP_RATES], in nl80211_trigger_scan()
9496 err = -EINVAL; in nl80211_trigger_scan()
9500 if (!wiphy->bands[band]) in nl80211_trigger_scan()
9503 err = ieee80211_get_ratemask(wiphy->bands[band], in nl80211_trigger_scan()
9506 &request->rates[band]); in nl80211_trigger_scan()
9512 if (info->attrs[NL80211_ATTR_MEASUREMENT_DURATION]) { in nl80211_trigger_scan()
9513 request->duration = in nl80211_trigger_scan()
9514 nla_get_u16(info->attrs[NL80211_ATTR_MEASUREMENT_DURATION]); in nl80211_trigger_scan()
9515 request->duration_mandatory = in nl80211_trigger_scan()
9516 nla_get_flag(info->attrs[NL80211_ATTR_MEASUREMENT_DURATION_MANDATORY]); in nl80211_trigger_scan()
9519 err = nl80211_check_scan_flags(wiphy, wdev, request, info->attrs, in nl80211_trigger_scan()
9524 request->no_cck = in nl80211_trigger_scan()
9525 nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]); in nl80211_trigger_scan()
9536 if (info->attrs[NL80211_ATTR_BSSID]) in nl80211_trigger_scan()
9537 memcpy(request->bssid, in nl80211_trigger_scan()
9538 nla_data(info->attrs[NL80211_ATTR_BSSID]), ETH_ALEN); in nl80211_trigger_scan()
9539 else if (!(request->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) && in nl80211_trigger_scan()
9540 info->attrs[NL80211_ATTR_MAC]) in nl80211_trigger_scan()
9541 memcpy(request->bssid, nla_data(info->attrs[NL80211_ATTR_MAC]), in nl80211_trigger_scan()
9544 eth_broadcast_addr(request->bssid); in nl80211_trigger_scan()
9546 request->tsf_report_link_id = nl80211_link_id_or_invalid(info->attrs); in nl80211_trigger_scan()
9547 request->wdev = wdev; in nl80211_trigger_scan()
9548 request->wiphy = &rdev->wiphy; in nl80211_trigger_scan()
9549 request->scan_start = jiffies; in nl80211_trigger_scan()
9551 rdev->scan_req = request; in nl80211_trigger_scan()
9558 dev_hold(wdev->netdev); in nl80211_trigger_scan()
9563 rdev->scan_req = NULL; in nl80211_trigger_scan()
9571 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_abort_scan()
9572 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_abort_scan()
9574 if (!rdev->ops->abort_scan) in nl80211_abort_scan()
9575 return -EOPNOTSUPP; in nl80211_abort_scan()
9577 if (rdev->scan_msg) in nl80211_abort_scan()
9580 if (!rdev->scan_req) in nl80211_abort_scan()
9581 return -ENOENT; in nl80211_abort_scan()
9606 return -EINVAL; in nl80211_parse_sched_scan_plans()
9608 request->scan_plans[0].interval = in nl80211_parse_sched_scan_plans()
9610 if (!request->scan_plans[0].interval) in nl80211_parse_sched_scan_plans()
9611 return -EINVAL; in nl80211_parse_sched_scan_plans()
9613 if (request->scan_plans[0].interval > in nl80211_parse_sched_scan_plans()
9614 wiphy->max_sched_scan_plan_interval) in nl80211_parse_sched_scan_plans()
9615 request->scan_plans[0].interval = in nl80211_parse_sched_scan_plans()
9616 wiphy->max_sched_scan_plan_interval; in nl80211_parse_sched_scan_plans()
9625 return -EINVAL; in nl80211_parse_sched_scan_plans()
9635 return -EINVAL; in nl80211_parse_sched_scan_plans()
9637 request->scan_plans[i].interval = in nl80211_parse_sched_scan_plans()
9639 if (!request->scan_plans[i].interval || in nl80211_parse_sched_scan_plans()
9640 request->scan_plans[i].interval > in nl80211_parse_sched_scan_plans()
9641 wiphy->max_sched_scan_plan_interval) in nl80211_parse_sched_scan_plans()
9642 return -EINVAL; in nl80211_parse_sched_scan_plans()
9645 request->scan_plans[i].iterations = in nl80211_parse_sched_scan_plans()
9647 if (!request->scan_plans[i].iterations || in nl80211_parse_sched_scan_plans()
9648 (request->scan_plans[i].iterations > in nl80211_parse_sched_scan_plans()
9649 wiphy->max_sched_scan_plan_iterations)) in nl80211_parse_sched_scan_plans()
9650 return -EINVAL; in nl80211_parse_sched_scan_plans()
9651 } else if (i < n_plans - 1) { in nl80211_parse_sched_scan_plans()
9656 return -EINVAL; in nl80211_parse_sched_scan_plans()
9666 if (request->scan_plans[n_plans - 1].iterations) in nl80211_parse_sched_scan_plans()
9667 return -EINVAL; in nl80211_parse_sched_scan_plans()
9688 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
9698 if (n_ssids > wiphy->max_sched_scan_ssids) in nl80211_parse_sched_scan()
9699 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
9708 * global RSSI for all other matchsets - if there are other matchsets. in nl80211_parse_sched_scan()
9727 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
9746 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
9753 if (ie_len > wiphy->max_sched_scan_ie_len) in nl80211_parse_sched_scan()
9754 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
9762 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
9775 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
9780 if (!n_plans || n_plans > wiphy->max_sched_scan_plans) in nl80211_parse_sched_scan()
9781 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
9787 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
9790 size = size_add(size, array_size(sizeof(*request->ssids), n_ssids)); in nl80211_parse_sched_scan()
9791 size = size_add(size, array_size(sizeof(*request->match_sets), in nl80211_parse_sched_scan()
9793 size = size_add(size, array_size(sizeof(*request->scan_plans), in nl80211_parse_sched_scan()
9798 return ERR_PTR(-ENOMEM); in nl80211_parse_sched_scan()
9799 request->n_channels = n_channels; in nl80211_parse_sched_scan()
9802 request->ssids = (void *)request + in nl80211_parse_sched_scan()
9804 request->n_ssids = n_ssids; in nl80211_parse_sched_scan()
9807 request->ie = (void *)(request->ssids + n_ssids); in nl80211_parse_sched_scan()
9809 request->ie = (void *)(request->channels + n_channels); in nl80211_parse_sched_scan()
9813 if (request->ie) in nl80211_parse_sched_scan()
9814 request->match_sets = (void *)(request->ie + ie_len); in nl80211_parse_sched_scan()
9816 request->match_sets = in nl80211_parse_sched_scan()
9817 (void *)(request->ssids + n_ssids); in nl80211_parse_sched_scan()
9819 request->match_sets = in nl80211_parse_sched_scan()
9820 (void *)(request->channels + n_channels); in nl80211_parse_sched_scan()
9822 request->n_match_sets = n_match_sets; in nl80211_parse_sched_scan()
9825 request->scan_plans = (void *)(request->match_sets + in nl80211_parse_sched_scan()
9827 else if (request->ie) in nl80211_parse_sched_scan()
9828 request->scan_plans = (void *)(request->ie + ie_len); in nl80211_parse_sched_scan()
9830 request->scan_plans = (void *)(request->ssids + n_ssids); in nl80211_parse_sched_scan()
9832 request->scan_plans = (void *)(request->channels + n_channels); in nl80211_parse_sched_scan()
9834 request->n_scan_plans = n_plans; in nl80211_parse_sched_scan()
9847 err = -EINVAL; in nl80211_parse_sched_scan()
9852 if (chan->flags & IEEE80211_CHAN_DISABLED) in nl80211_parse_sched_scan()
9855 request->channels[i] = chan; in nl80211_parse_sched_scan()
9863 if (!wiphy->bands[band]) in nl80211_parse_sched_scan()
9865 for (j = 0; j < wiphy->bands[band]->n_channels; j++) { in nl80211_parse_sched_scan()
9868 chan = &wiphy->bands[band]->channels[j]; in nl80211_parse_sched_scan()
9870 if (chan->flags & IEEE80211_CHAN_DISABLED) in nl80211_parse_sched_scan()
9873 request->channels[i] = chan; in nl80211_parse_sched_scan()
9880 err = -EINVAL; in nl80211_parse_sched_scan()
9884 request->n_channels = i; in nl80211_parse_sched_scan()
9891 err = -EINVAL; in nl80211_parse_sched_scan()
9894 request->ssids[i].ssid_len = nla_len(attr); in nl80211_parse_sched_scan()
9895 memcpy(request->ssids[i].ssid, nla_data(attr), in nl80211_parse_sched_scan()
9928 err = -EINVAL; in nl80211_parse_sched_scan()
9933 memcpy(request->match_sets[i].ssid.ssid, in nl80211_parse_sched_scan()
9935 request->match_sets[i].ssid.ssid_len = in nl80211_parse_sched_scan()
9939 memcpy(request->match_sets[i].bssid, in nl80211_parse_sched_scan()
9942 /* special attribute - old implementation w/a */ in nl80211_parse_sched_scan()
9943 request->match_sets[i].rssi_thold = default_match_rssi; in nl80211_parse_sched_scan()
9946 request->match_sets[i].rssi_thold = in nl80211_parse_sched_scan()
9953 request->match_sets[0].rssi_thold = default_match_rssi; in nl80211_parse_sched_scan()
9955 request->min_rssi_thold = INT_MAX; in nl80211_parse_sched_scan()
9957 request->min_rssi_thold = in nl80211_parse_sched_scan()
9958 min(request->match_sets[i].rssi_thold, in nl80211_parse_sched_scan()
9959 request->min_rssi_thold); in nl80211_parse_sched_scan()
9961 request->min_rssi_thold = NL80211_SCAN_RSSI_THOLD_OFF; in nl80211_parse_sched_scan()
9965 request->ie_len = ie_len; in nl80211_parse_sched_scan()
9966 memcpy((void *)request->ie, in nl80211_parse_sched_scan()
9968 request->ie_len); in nl80211_parse_sched_scan()
9976 request->delay = in nl80211_parse_sched_scan()
9980 request->relative_rssi = nla_get_s8( in nl80211_parse_sched_scan()
9982 request->relative_rssi_set = true; in nl80211_parse_sched_scan()
9985 if (request->relative_rssi_set && in nl80211_parse_sched_scan()
9991 request->rssi_adjust.band = rssi_adjust->band; in nl80211_parse_sched_scan()
9992 request->rssi_adjust.delta = rssi_adjust->delta; in nl80211_parse_sched_scan()
9993 if (!is_band_valid(wiphy, request->rssi_adjust.band)) { in nl80211_parse_sched_scan()
9994 err = -EINVAL; in nl80211_parse_sched_scan()
10003 request->scan_start = jiffies; in nl80211_parse_sched_scan()
10015 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_start_sched_scan()
10016 struct net_device *dev = info->user_ptr[1]; in nl80211_start_sched_scan()
10017 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_start_sched_scan()
10022 if (!rdev->wiphy.max_sched_scan_reqs || !rdev->ops->sched_scan_start) in nl80211_start_sched_scan()
10023 return -EOPNOTSUPP; in nl80211_start_sched_scan()
10025 want_multi = info->attrs[NL80211_ATTR_SCHED_SCAN_MULTI]; in nl80211_start_sched_scan()
10030 sched_scan_req = nl80211_parse_sched_scan(&rdev->wiphy, wdev, in nl80211_start_sched_scan()
10031 info->attrs, in nl80211_start_sched_scan()
10032 rdev->wiphy.max_match_sets); in nl80211_start_sched_scan()
10039 * or if driver does not support multi-scheduled scan in nl80211_start_sched_scan()
10041 if (want_multi && rdev->wiphy.max_sched_scan_reqs > 1) in nl80211_start_sched_scan()
10042 sched_scan_req->reqid = cfg80211_assign_cookie(rdev); in nl80211_start_sched_scan()
10048 sched_scan_req->dev = dev; in nl80211_start_sched_scan()
10049 sched_scan_req->wiphy = &rdev->wiphy; in nl80211_start_sched_scan()
10051 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) in nl80211_start_sched_scan()
10052 sched_scan_req->owner_nlportid = info->snd_portid; in nl80211_start_sched_scan()
10069 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_stop_sched_scan()
10072 if (!rdev->wiphy.max_sched_scan_reqs || !rdev->ops->sched_scan_stop) in nl80211_stop_sched_scan()
10073 return -EOPNOTSUPP; in nl80211_stop_sched_scan()
10075 if (info->attrs[NL80211_ATTR_COOKIE]) { in nl80211_stop_sched_scan()
10076 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); in nl80211_stop_sched_scan()
10080 req = list_first_or_null_rcu(&rdev->sched_scan_req_list, in nl80211_stop_sched_scan()
10083 if (!req || req->reqid || in nl80211_stop_sched_scan()
10084 (req->owner_nlportid && in nl80211_stop_sched_scan()
10085 req->owner_nlportid != info->snd_portid)) in nl80211_stop_sched_scan()
10086 return -ENOENT; in nl80211_stop_sched_scan()
10094 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_start_radar_detection()
10095 struct net_device *dev = info->user_ptr[1]; in nl80211_start_radar_detection()
10096 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_start_radar_detection()
10097 int link_id = nl80211_link_id(info->attrs); in nl80211_start_radar_detection()
10098 struct wiphy *wiphy = wdev->wiphy; in nl80211_start_radar_detection()
10104 flush_delayed_work(&rdev->dfs_update_channels_wk); in nl80211_start_radar_detection()
10106 switch (wdev->iftype) { in nl80211_start_radar_detection()
10113 /* caution - see cfg80211_beaconing_iface_active() below */ in nl80211_start_radar_detection()
10114 return -EINVAL; in nl80211_start_radar_detection()
10121 return -EINVAL; in nl80211_start_radar_detection()
10127 err = cfg80211_chandef_dfs_required(wiphy, &chandef, wdev->iftype); in nl80211_start_radar_detection()
10132 return -EINVAL; in nl80211_start_radar_detection()
10135 return -EINVAL; in nl80211_start_radar_detection()
10137 if (nla_get_flag(info->attrs[NL80211_ATTR_RADAR_BACKGROUND])) in nl80211_start_radar_detection()
10145 if (wdev->valid_links && in nl80211_start_radar_detection()
10146 !wdev->links[link_id].ap.beacon_interval) { in nl80211_start_radar_detection()
10149 return -EBUSY; in nl80211_start_radar_detection()
10153 if (wdev->links[link_id].cac_started) in nl80211_start_radar_detection()
10154 return -EBUSY; in nl80211_start_radar_detection()
10158 return -EOPNOTSUPP; in nl80211_start_radar_detection()
10160 if (!rdev->ops->start_radar_detection) in nl80211_start_radar_detection()
10161 return -EOPNOTSUPP; in nl80211_start_radar_detection()
10163 cac_time_ms = cfg80211_chandef_dfs_cac_time(&rdev->wiphy, &chandef); in nl80211_start_radar_detection()
10172 switch (wdev->iftype) { in nl80211_start_radar_detection()
10175 wdev->links[0].ap.chandef = chandef; in nl80211_start_radar_detection()
10178 wdev->u.ibss.chandef = chandef; in nl80211_start_radar_detection()
10181 wdev->u.mesh.chandef = chandef; in nl80211_start_radar_detection()
10186 wdev->links[link_id].cac_started = true; in nl80211_start_radar_detection()
10187 wdev->links[link_id].cac_start_time = jiffies; in nl80211_start_radar_detection()
10188 wdev->links[link_id].cac_time_ms = cac_time_ms; in nl80211_start_radar_detection()
10196 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_notify_radar_detection()
10197 struct net_device *dev = info->user_ptr[1]; in nl80211_notify_radar_detection()
10198 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_notify_radar_detection()
10199 struct wiphy *wiphy = wdev->wiphy; in nl80211_notify_radar_detection()
10208 return -EINVAL; in nl80211_notify_radar_detection()
10217 err = cfg80211_chandef_dfs_required(wiphy, &chandef, wdev->iftype); in nl80211_notify_radar_detection()
10226 return -EINVAL; in nl80211_notify_radar_detection()
10232 if (chandef.chan->dfs_state == NL80211_DFS_UNAVAILABLE) in nl80211_notify_radar_detection()
10239 rdev->radar_chandef = chandef; in nl80211_notify_radar_detection()
10242 queue_work(cfg80211_wq, &rdev->propagate_radar_detect_wk); in nl80211_notify_radar_detection()
10260 return -EINVAL; in nl80211_parse_counter_offsets()
10263 if (rdev->wiphy.max_num_csa_counters && in nl80211_parse_counter_offsets()
10264 (*n_offsets > rdev->wiphy.max_num_csa_counters)) in nl80211_parse_counter_offsets()
10265 return -EINVAL; in nl80211_parse_counter_offsets()
10269 /* sanity checks - counters should fit and be the same */ in nl80211_parse_counter_offsets()
10274 return -EINVAL; in nl80211_parse_counter_offsets()
10276 if (first_count != -1 && data[offset] != first_count) in nl80211_parse_counter_offsets()
10277 return -EINVAL; in nl80211_parse_counter_offsets()
10285 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_channel_switch()
10286 unsigned int link_id = nl80211_link_id(info->attrs); in nl80211_channel_switch()
10287 struct net_device *dev = info->user_ptr[1]; in nl80211_channel_switch()
10288 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_channel_switch()
10296 if (!rdev->ops->channel_switch || in nl80211_channel_switch()
10297 !(rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH)) in nl80211_channel_switch()
10298 return -EOPNOTSUPP; in nl80211_channel_switch()
10300 switch (dev->ieee80211_ptr->iftype) { in nl80211_channel_switch()
10312 if (!wdev->links[link_id].ap.beacon_interval) in nl80211_channel_switch()
10313 return -ENOTCONN; in nl80211_channel_switch()
10316 if (!wdev->u.ibss.ssid_len) in nl80211_channel_switch()
10317 return -ENOTCONN; in nl80211_channel_switch()
10320 if (!wdev->u.mesh.id_len) in nl80211_channel_switch()
10321 return -ENOTCONN; in nl80211_channel_switch()
10324 return -EOPNOTSUPP; in nl80211_channel_switch()
10328 params.beacon_csa.ftm_responder = -1; in nl80211_channel_switch()
10330 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ] || in nl80211_channel_switch()
10331 !info->attrs[NL80211_ATTR_CH_SWITCH_COUNT]) in nl80211_channel_switch()
10332 return -EINVAL; in nl80211_channel_switch()
10335 if (need_new_beacon && !info->attrs[NL80211_ATTR_CSA_IES]) in nl80211_channel_switch()
10336 return -EINVAL; in nl80211_channel_switch()
10341 cs_count = nla_get_u32(info->attrs[NL80211_ATTR_CH_SWITCH_COUNT]); in nl80211_channel_switch()
10343 return -EINVAL; in nl80211_channel_switch()
10350 err = nl80211_parse_beacon(rdev, info->attrs, &params.beacon_after, in nl80211_channel_switch()
10351 info->extack); in nl80211_channel_switch()
10358 err = -ENOMEM; in nl80211_channel_switch()
10363 info->attrs[NL80211_ATTR_CSA_IES], in nl80211_channel_switch()
10364 nl80211_policy, info->extack); in nl80211_channel_switch()
10369 info->extack); in nl80211_channel_switch()
10374 err = -EINVAL; in nl80211_channel_switch()
10401 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &params.chandef, in nl80211_channel_switch()
10402 wdev->iftype)) { in nl80211_channel_switch()
10403 err = -EINVAL; in nl80211_channel_switch()
10407 err = cfg80211_chandef_dfs_required(wdev->wiphy, in nl80211_channel_switch()
10409 wdev->iftype); in nl80211_channel_switch()
10416 !nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS])) { in nl80211_channel_switch()
10417 err = -EINVAL; in nl80211_channel_switch()
10422 if (info->attrs[NL80211_ATTR_CH_SWITCH_BLOCK_TX]) in nl80211_channel_switch()
10443 struct cfg80211_bss *res = &intbss->pub; in nl80211_send_bss()
10449 lockdep_assert_wiphy(wdev->wiphy); in nl80211_send_bss()
10451 hdr = nl80211hdr_put(msg, NETLINK_CB(cb->skb).portid, seq, flags, in nl80211_send_bss()
10454 return -1; in nl80211_send_bss()
10458 if (nla_put_u32(msg, NL80211_ATTR_GENERATION, rdev->bss_generation)) in nl80211_send_bss()
10460 if (wdev->netdev && in nl80211_send_bss()
10461 nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex)) in nl80211_send_bss()
10470 if ((!is_zero_ether_addr(res->bssid) && in nl80211_send_bss()
10471 nla_put(msg, NL80211_BSS_BSSID, ETH_ALEN, res->bssid))) in nl80211_send_bss()
10476 if (rcu_access_pointer(res->proberesp_ies) && in nl80211_send_bss()
10483 ies = rcu_dereference(res->ies); in nl80211_send_bss()
10485 if (nla_put_u64_64bit(msg, NL80211_BSS_TSF, ies->tsf, in nl80211_send_bss()
10488 if (ies->len && nla_put(msg, NL80211_BSS_INFORMATION_ELEMENTS, in nl80211_send_bss()
10489 ies->len, ies->data)) in nl80211_send_bss()
10494 ies = rcu_dereference(res->beacon_ies); in nl80211_send_bss()
10495 if (ies && ies->from_beacon) { in nl80211_send_bss()
10496 if (nla_put_u64_64bit(msg, NL80211_BSS_BEACON_TSF, ies->tsf, in nl80211_send_bss()
10499 if (ies->len && nla_put(msg, NL80211_BSS_BEACON_IES, in nl80211_send_bss()
10500 ies->len, ies->data)) in nl80211_send_bss()
10505 if (res->beacon_interval && in nl80211_send_bss()
10506 nla_put_u16(msg, NL80211_BSS_BEACON_INTERVAL, res->beacon_interval)) in nl80211_send_bss()
10508 if (nla_put_u16(msg, NL80211_BSS_CAPABILITY, res->capability) || in nl80211_send_bss()
10509 nla_put_u32(msg, NL80211_BSS_FREQUENCY, res->channel->center_freq) || in nl80211_send_bss()
10511 res->channel->freq_offset) || in nl80211_send_bss()
10513 jiffies_to_msecs(jiffies - intbss->ts))) in nl80211_send_bss()
10516 if (intbss->parent_tsf && in nl80211_send_bss()
10518 intbss->parent_tsf, NL80211_BSS_PAD) || in nl80211_send_bss()
10520 intbss->parent_bssid))) in nl80211_send_bss()
10523 if (intbss->ts_boottime && in nl80211_send_bss()
10525 intbss->ts_boottime, NL80211_BSS_PAD)) in nl80211_send_bss()
10528 if (!nl80211_put_signal(msg, intbss->pub.chains, in nl80211_send_bss()
10529 intbss->pub.chain_signal, in nl80211_send_bss()
10533 if (intbss->bss_source != BSS_SOURCE_STA_PROFILE) { in nl80211_send_bss()
10534 switch (rdev->wiphy.signal_type) { in nl80211_send_bss()
10537 res->signal)) in nl80211_send_bss()
10542 res->signal)) in nl80211_send_bss()
10550 switch (wdev->iftype) { in nl80211_send_bss()
10554 if (intbss == wdev->links[link_id].client.current_bss && in nl80211_send_bss()
10557 (wdev->valid_links && in nl80211_send_bss()
10561 wdev->u.client.connected_addr))))) in nl80211_send_bss()
10566 if (intbss == wdev->u.ibss.current_bss && in nl80211_send_bss()
10575 if (nla_put_u32(msg, NL80211_BSS_USE_FOR, res->use_for)) in nl80211_send_bss()
10578 if (res->cannot_use_reasons && in nl80211_send_bss()
10580 res->cannot_use_reasons, in nl80211_send_bss()
10593 return -EMSGSIZE; in nl80211_send_bss()
10602 int start = cb->args[2], idx = 0; in nl80211_dump_scan()
10608 return -ENOMEM; in nl80211_dump_scan()
10616 __acquire(&rdev->wiphy.mtx); in nl80211_dump_scan()
10622 spin_lock_bh(&rdev->bss_lock); in nl80211_dump_scan()
10626 * into multiple messages. It is unlikely that any more bss-es will be in nl80211_dump_scan()
10633 cb->seq = rdev->bss_generation; in nl80211_dump_scan()
10635 list_for_each_entry(scan, &rdev->bss_list, list) { in nl80211_dump_scan()
10639 !(scan->pub.use_for & NL80211_BSS_USE_FOR_NORMAL)) in nl80211_dump_scan()
10642 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_dump_scan()
10644 idx--; in nl80211_dump_scan()
10649 spin_unlock_bh(&rdev->bss_lock); in nl80211_dump_scan()
10651 cb->args[2] = idx; in nl80211_dump_scan()
10652 wiphy_unlock(&rdev->wiphy); in nl80211_dump_scan()
10654 return skb->len; in nl80211_dump_scan()
10666 if (!survey->channel && !allow_radio_stats) in nl80211_send_survey()
10672 return -ENOMEM; in nl80211_send_survey()
10674 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) in nl80211_send_survey()
10681 if (survey->channel && in nl80211_send_survey()
10683 survey->channel->center_freq)) in nl80211_send_survey()
10686 if (survey->channel && survey->channel->freq_offset && in nl80211_send_survey()
10688 survey->channel->freq_offset)) in nl80211_send_survey()
10691 if ((survey->filled & SURVEY_INFO_NOISE_DBM) && in nl80211_send_survey()
10692 nla_put_u8(msg, NL80211_SURVEY_INFO_NOISE, survey->noise)) in nl80211_send_survey()
10694 if ((survey->filled & SURVEY_INFO_IN_USE) && in nl80211_send_survey()
10697 if ((survey->filled & SURVEY_INFO_TIME) && in nl80211_send_survey()
10699 survey->time, NL80211_SURVEY_INFO_PAD)) in nl80211_send_survey()
10701 if ((survey->filled & SURVEY_INFO_TIME_BUSY) && in nl80211_send_survey()
10703 survey->time_busy, NL80211_SURVEY_INFO_PAD)) in nl80211_send_survey()
10705 if ((survey->filled & SURVEY_INFO_TIME_EXT_BUSY) && in nl80211_send_survey()
10707 survey->time_ext_busy, NL80211_SURVEY_INFO_PAD)) in nl80211_send_survey()
10709 if ((survey->filled & SURVEY_INFO_TIME_RX) && in nl80211_send_survey()
10711 survey->time_rx, NL80211_SURVEY_INFO_PAD)) in nl80211_send_survey()
10713 if ((survey->filled & SURVEY_INFO_TIME_TX) && in nl80211_send_survey()
10715 survey->time_tx, NL80211_SURVEY_INFO_PAD)) in nl80211_send_survey()
10717 if ((survey->filled & SURVEY_INFO_TIME_SCAN) && in nl80211_send_survey()
10719 survey->time_scan, NL80211_SURVEY_INFO_PAD)) in nl80211_send_survey()
10721 if ((survey->filled & SURVEY_INFO_TIME_BSS_RX) && in nl80211_send_survey()
10723 survey->time_bss_rx, NL80211_SURVEY_INFO_PAD)) in nl80211_send_survey()
10733 return -EMSGSIZE; in nl80211_send_survey()
10742 int survey_idx = cb->args[2]; in nl80211_dump_survey()
10748 return -ENOMEM; in nl80211_dump_survey()
10756 __acquire(&rdev->wiphy.mtx); in nl80211_dump_survey()
10761 if (!wdev->netdev) { in nl80211_dump_survey()
10762 res = -EINVAL; in nl80211_dump_survey()
10766 if (!rdev->ops->dump_survey) { in nl80211_dump_survey()
10767 res = -EOPNOTSUPP; in nl80211_dump_survey()
10772 res = rdev_dump_survey(rdev, wdev->netdev, survey_idx, &survey); in nl80211_dump_survey()
10773 if (res == -ENOENT) in nl80211_dump_survey()
10778 /* don't send disabled channels, but do send non-channel data */ in nl80211_dump_survey()
10780 survey.channel->flags & IEEE80211_CHAN_DISABLED) { in nl80211_dump_survey()
10786 NETLINK_CB(cb->skb).portid, in nl80211_dump_survey()
10787 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_dump_survey()
10788 wdev->netdev, radio_stats, &survey) < 0) in nl80211_dump_survey()
10794 cb->args[2] = survey_idx; in nl80211_dump_survey()
10795 res = skb->len; in nl80211_dump_survey()
10798 wiphy_unlock(&rdev->wiphy); in nl80211_dump_survey()
10804 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_authenticate()
10805 struct net_device *dev = info->user_ptr[1]; in nl80211_authenticate()
10815 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_authenticate()
10816 return -EINVAL; in nl80211_authenticate()
10818 if (!info->attrs[NL80211_ATTR_AUTH_TYPE]) in nl80211_authenticate()
10819 return -EINVAL; in nl80211_authenticate()
10821 if (!info->attrs[NL80211_ATTR_SSID]) in nl80211_authenticate()
10822 return -EINVAL; in nl80211_authenticate()
10824 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ]) in nl80211_authenticate()
10825 return -EINVAL; in nl80211_authenticate()
10832 if (key.type != -1 && key.type != NL80211_KEYTYPE_GROUP) in nl80211_authenticate()
10833 return -EINVAL; in nl80211_authenticate()
10835 return -EINVAL; in nl80211_authenticate()
10840 return -EINVAL; in nl80211_authenticate()
10842 return -EINVAL; in nl80211_authenticate()
10852 for (i = 0; i < rdev->wiphy.n_cipher_suites; i++) { in nl80211_authenticate()
10853 if (key.p.cipher == rdev->wiphy.cipher_suites[i]) { in nl80211_authenticate()
10859 return -EINVAL; in nl80211_authenticate()
10862 if (!rdev->ops->auth) in nl80211_authenticate()
10863 return -EOPNOTSUPP; in nl80211_authenticate()
10865 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_authenticate()
10866 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_authenticate()
10867 return -EOPNOTSUPP; in nl80211_authenticate()
10869 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_authenticate()
10870 freq = MHZ_TO_KHZ(nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ])); in nl80211_authenticate()
10871 if (info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]) in nl80211_authenticate()
10873 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]); in nl80211_authenticate()
10875 chan = nl80211_get_valid_chan(&rdev->wiphy, freq); in nl80211_authenticate()
10877 return -EINVAL; in nl80211_authenticate()
10879 ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); in nl80211_authenticate()
10880 ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); in nl80211_authenticate()
10882 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_authenticate()
10883 req.ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_authenticate()
10884 req.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_authenticate()
10887 if (info->attrs[NL80211_ATTR_SUPPORTED_SELECTORS]) { in nl80211_authenticate()
10889 nla_data(info->attrs[NL80211_ATTR_SUPPORTED_SELECTORS]); in nl80211_authenticate()
10891 nla_len(info->attrs[NL80211_ATTR_SUPPORTED_SELECTORS]); in nl80211_authenticate()
10894 auth_type = nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]); in nl80211_authenticate()
10896 return -EINVAL; in nl80211_authenticate()
10902 !info->attrs[NL80211_ATTR_AUTH_DATA]) in nl80211_authenticate()
10903 return -EINVAL; in nl80211_authenticate()
10905 if (info->attrs[NL80211_ATTR_AUTH_DATA]) { in nl80211_authenticate()
10910 return -EINVAL; in nl80211_authenticate()
10911 req.auth_data = nla_data(info->attrs[NL80211_ATTR_AUTH_DATA]); in nl80211_authenticate()
10912 req.auth_data_len = nla_len(info->attrs[NL80211_ATTR_AUTH_DATA]); in nl80211_authenticate()
10915 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; in nl80211_authenticate()
10928 req.link_id = nl80211_link_id_or_invalid(info->attrs); in nl80211_authenticate()
10930 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_MLO)) in nl80211_authenticate()
10931 return -EINVAL; in nl80211_authenticate()
10932 if (!info->attrs[NL80211_ATTR_MLD_ADDR]) in nl80211_authenticate()
10933 return -EINVAL; in nl80211_authenticate()
10934 req.ap_mld_addr = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]); in nl80211_authenticate()
10936 return -EINVAL; in nl80211_authenticate()
10939 req.bss = cfg80211_get_bss(&rdev->wiphy, chan, bssid, ssid, ssid_len, in nl80211_authenticate()
10943 return -ENOENT; in nl80211_authenticate()
10947 cfg80211_put_bss(&rdev->wiphy, req.bss); in nl80211_authenticate()
10955 if (!info->attrs[NL80211_ATTR_SOCKET_OWNER]) { in validate_pae_over_nl80211()
10957 return -EINVAL; in validate_pae_over_nl80211()
10960 if (!rdev->ops->tx_control_port || in validate_pae_over_nl80211()
10961 !wiphy_ext_feature_isset(&rdev->wiphy, in validate_pae_over_nl80211()
10963 return -EOPNOTSUPP; in validate_pae_over_nl80211()
10975 settings->control_port = info->attrs[NL80211_ATTR_CONTROL_PORT]; in nl80211_crypto_settings()
10977 if (info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]) { in nl80211_crypto_settings()
10981 info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]); in nl80211_crypto_settings()
10982 settings->control_port_ethertype = cpu_to_be16(proto); in nl80211_crypto_settings()
10983 if (!(rdev->wiphy.flags & WIPHY_FLAG_CONTROL_PORT_PROTOCOL) && in nl80211_crypto_settings()
10985 return -EINVAL; in nl80211_crypto_settings()
10986 if (info->attrs[NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT]) in nl80211_crypto_settings()
10987 settings->control_port_no_encrypt = true; in nl80211_crypto_settings()
10989 settings->control_port_ethertype = cpu_to_be16(ETH_P_PAE); in nl80211_crypto_settings()
10991 if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) { in nl80211_crypto_settings()
10997 settings->control_port_over_nl80211 = true; in nl80211_crypto_settings()
10999 if (info->attrs[NL80211_ATTR_CONTROL_PORT_NO_PREAUTH]) in nl80211_crypto_settings()
11000 settings->control_port_no_preauth = true; in nl80211_crypto_settings()
11003 if (info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]) { in nl80211_crypto_settings()
11007 data = nla_data(info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]); in nl80211_crypto_settings()
11008 len = nla_len(info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]); in nl80211_crypto_settings()
11009 settings->n_ciphers_pairwise = len / sizeof(u32); in nl80211_crypto_settings()
11012 return -EINVAL; in nl80211_crypto_settings()
11014 if (settings->n_ciphers_pairwise > cipher_limit) in nl80211_crypto_settings()
11015 return -EINVAL; in nl80211_crypto_settings()
11017 memcpy(settings->ciphers_pairwise, data, len); in nl80211_crypto_settings()
11019 for (i = 0; i < settings->n_ciphers_pairwise; i++) in nl80211_crypto_settings()
11021 &rdev->wiphy, in nl80211_crypto_settings()
11022 settings->ciphers_pairwise[i])) in nl80211_crypto_settings()
11023 return -EINVAL; in nl80211_crypto_settings()
11026 if (info->attrs[NL80211_ATTR_CIPHER_SUITE_GROUP]) { in nl80211_crypto_settings()
11027 settings->cipher_group = in nl80211_crypto_settings()
11028 nla_get_u32(info->attrs[NL80211_ATTR_CIPHER_SUITE_GROUP]); in nl80211_crypto_settings()
11029 if (!cfg80211_supported_cipher_suite(&rdev->wiphy, in nl80211_crypto_settings()
11030 settings->cipher_group)) in nl80211_crypto_settings()
11031 return -EINVAL; in nl80211_crypto_settings()
11034 if (info->attrs[NL80211_ATTR_WPA_VERSIONS]) in nl80211_crypto_settings()
11035 settings->wpa_versions = in nl80211_crypto_settings()
11036 nla_get_u32(info->attrs[NL80211_ATTR_WPA_VERSIONS]); in nl80211_crypto_settings()
11038 if (info->attrs[NL80211_ATTR_AKM_SUITES]) { in nl80211_crypto_settings()
11042 data = nla_data(info->attrs[NL80211_ATTR_AKM_SUITES]); in nl80211_crypto_settings()
11043 len = nla_len(info->attrs[NL80211_ATTR_AKM_SUITES]); in nl80211_crypto_settings()
11044 settings->n_akm_suites = len / sizeof(u32); in nl80211_crypto_settings()
11047 return -EINVAL; in nl80211_crypto_settings()
11049 if (settings->n_akm_suites > rdev->wiphy.max_num_akm_suites) in nl80211_crypto_settings()
11050 return -EINVAL; in nl80211_crypto_settings()
11052 memcpy(settings->akm_suites, data, len); in nl80211_crypto_settings()
11055 if (info->attrs[NL80211_ATTR_PMK]) { in nl80211_crypto_settings()
11056 if (nla_len(info->attrs[NL80211_ATTR_PMK]) != WLAN_PMK_LEN) in nl80211_crypto_settings()
11057 return -EINVAL; in nl80211_crypto_settings()
11058 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_crypto_settings()
11060 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_crypto_settings()
11062 return -EINVAL; in nl80211_crypto_settings()
11063 settings->psk = nla_data(info->attrs[NL80211_ATTR_PMK]); in nl80211_crypto_settings()
11066 if (info->attrs[NL80211_ATTR_SAE_PASSWORD]) { in nl80211_crypto_settings()
11067 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_crypto_settings()
11069 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_crypto_settings()
11071 return -EINVAL; in nl80211_crypto_settings()
11072 settings->sae_pwd = in nl80211_crypto_settings()
11073 nla_data(info->attrs[NL80211_ATTR_SAE_PASSWORD]); in nl80211_crypto_settings()
11074 settings->sae_pwd_len = in nl80211_crypto_settings()
11075 nla_len(info->attrs[NL80211_ATTR_SAE_PASSWORD]); in nl80211_crypto_settings()
11078 settings->sae_pwe = in nl80211_crypto_settings()
11079 nla_get_u8_default(info->attrs[NL80211_ATTR_SAE_PWE], in nl80211_crypto_settings()
11096 return ERR_PTR(-EINVAL); in nl80211_assoc_bss()
11104 chan = nl80211_get_valid_chan(&rdev->wiphy, freq); in nl80211_assoc_bss()
11106 return ERR_PTR(-EINVAL); in nl80211_assoc_bss()
11113 bss = __cfg80211_get_bss(&rdev->wiphy, chan, bssid, in nl80211_assoc_bss()
11119 return ERR_PTR(-ENOENT); in nl80211_assoc_bss()
11137 return -ENOMEM; in nl80211_process_links()
11139 nla_for_each_nested(link, info->attrs[NL80211_ATTR_MLO_LINKS], rem) { in nl80211_process_links()
11145 NL_SET_BAD_ATTR(info->extack, link); in nl80211_process_links()
11146 return -EINVAL; in nl80211_process_links()
11152 NL_SET_BAD_ATTR(info->extack, link); in nl80211_process_links()
11153 return -EINVAL; in nl80211_process_links()
11161 NL_SET_ERR_MSG_ATTR(info->extack, link, in nl80211_process_links()
11174 NL_SET_ERR_MSG_ATTR(info->extack, in nl80211_process_links()
11177 return -EINVAL; in nl80211_process_links()
11183 NL_SET_ERR_MSG_ATTR(info->extack, in nl80211_process_links()
11185 "cannot deal with non-inheritance"); in nl80211_process_links()
11186 return -EINVAL; in nl80211_process_links()
11199 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_associate()
11200 struct net_device *dev = info->user_ptr[1]; in nl80211_associate()
11206 if (dev->ieee80211_ptr->conn_owner_nlportid && in nl80211_associate()
11207 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) in nl80211_associate()
11208 return -EPERM; in nl80211_associate()
11210 if (!info->attrs[NL80211_ATTR_SSID]) in nl80211_associate()
11211 return -EINVAL; in nl80211_associate()
11213 if (!rdev->ops->assoc) in nl80211_associate()
11214 return -EOPNOTSUPP; in nl80211_associate()
11216 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_associate()
11217 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_associate()
11218 return -EOPNOTSUPP; in nl80211_associate()
11220 ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); in nl80211_associate()
11221 ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); in nl80211_associate()
11223 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_associate()
11224 req.ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_associate()
11225 req.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_associate()
11229 NL_SET_ERR_MSG_ATTR(info->extack, in nl80211_associate()
11230 info->attrs[NL80211_ATTR_IE], in nl80211_associate()
11231 "non-inheritance makes no sense"); in nl80211_associate()
11232 return -EINVAL; in nl80211_associate()
11236 if (info->attrs[NL80211_ATTR_USE_MFP]) { in nl80211_associate()
11238 nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]); in nl80211_associate()
11242 return -EINVAL; in nl80211_associate()
11245 if (info->attrs[NL80211_ATTR_PREV_BSSID]) in nl80211_associate()
11246 req.prev_bssid = nla_data(info->attrs[NL80211_ATTR_PREV_BSSID]); in nl80211_associate()
11248 if (info->attrs[NL80211_ATTR_SUPPORTED_SELECTORS]) { in nl80211_associate()
11250 nla_data(info->attrs[NL80211_ATTR_SUPPORTED_SELECTORS]); in nl80211_associate()
11252 nla_len(info->attrs[NL80211_ATTR_SUPPORTED_SELECTORS]); in nl80211_associate()
11255 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HT])) in nl80211_associate()
11258 if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) in nl80211_associate()
11260 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]), in nl80211_associate()
11263 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) { in nl80211_associate()
11264 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) in nl80211_associate()
11265 return -EINVAL; in nl80211_associate()
11267 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]), in nl80211_associate()
11271 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_VHT])) in nl80211_associate()
11274 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HE])) in nl80211_associate()
11277 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_EHT])) in nl80211_associate()
11280 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) in nl80211_associate()
11282 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]), in nl80211_associate()
11285 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) { in nl80211_associate()
11286 if (!info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) in nl80211_associate()
11287 return -EINVAL; in nl80211_associate()
11289 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]), in nl80211_associate()
11293 if (nla_get_flag(info->attrs[NL80211_ATTR_USE_RRM])) { in nl80211_associate()
11294 if (!((rdev->wiphy.features & in nl80211_associate()
11296 (rdev->wiphy.features & NL80211_FEATURE_QUIET)) && in nl80211_associate()
11297 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_associate()
11299 return -EINVAL; in nl80211_associate()
11303 if (info->attrs[NL80211_ATTR_FILS_KEK]) { in nl80211_associate()
11304 req.fils_kek = nla_data(info->attrs[NL80211_ATTR_FILS_KEK]); in nl80211_associate()
11305 req.fils_kek_len = nla_len(info->attrs[NL80211_ATTR_FILS_KEK]); in nl80211_associate()
11306 if (!info->attrs[NL80211_ATTR_FILS_NONCES]) in nl80211_associate()
11307 return -EINVAL; in nl80211_associate()
11309 nla_data(info->attrs[NL80211_ATTR_FILS_NONCES]); in nl80211_associate()
11312 if (info->attrs[NL80211_ATTR_S1G_CAPABILITY_MASK]) { in nl80211_associate()
11313 if (!info->attrs[NL80211_ATTR_S1G_CAPABILITY]) in nl80211_associate()
11314 return -EINVAL; in nl80211_associate()
11316 nla_data(info->attrs[NL80211_ATTR_S1G_CAPABILITY_MASK]), in nl80211_associate()
11320 if (info->attrs[NL80211_ATTR_S1G_CAPABILITY]) { in nl80211_associate()
11321 if (!info->attrs[NL80211_ATTR_S1G_CAPABILITY_MASK]) in nl80211_associate()
11322 return -EINVAL; in nl80211_associate()
11324 nla_data(info->attrs[NL80211_ATTR_S1G_CAPABILITY]), in nl80211_associate()
11328 if (nla_get_flag(info->attrs[NL80211_ATTR_ASSOC_SPP_AMSDU])) { in nl80211_associate()
11329 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_associate()
11331 GENL_SET_ERR_MSG(info, "SPP A-MSDUs not supported"); in nl80211_associate()
11332 return -EINVAL; in nl80211_associate()
11337 req.link_id = nl80211_link_id_or_invalid(info->attrs); in nl80211_associate()
11339 if (info->attrs[NL80211_ATTR_MLO_LINKS]) { in nl80211_associate()
11341 return -EINVAL; in nl80211_associate()
11343 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_MLO)) in nl80211_associate()
11344 return -EINVAL; in nl80211_associate()
11346 if (info->attrs[NL80211_ATTR_MAC] || in nl80211_associate()
11347 info->attrs[NL80211_ATTR_WIPHY_FREQ] || in nl80211_associate()
11348 !info->attrs[NL80211_ATTR_MLD_ADDR]) in nl80211_associate()
11349 return -EINVAL; in nl80211_associate()
11351 req.ap_mld_addr = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]); in nl80211_associate()
11360 err = -EINVAL; in nl80211_associate()
11366 "cannot have per-link elems on assoc link"); in nl80211_associate()
11367 err = -EINVAL; in nl80211_associate()
11374 err = -EINVAL; in nl80211_associate()
11379 return -EINVAL; in nl80211_associate()
11381 req.bss = nl80211_assoc_bss(rdev, ssid, ssid_len, info->attrs, in nl80211_associate()
11382 -1, -1); in nl80211_associate()
11385 ap_addr = req.bss->bssid; in nl80211_associate()
11394 info->extack); in nl80211_associate()
11396 if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) { in nl80211_associate()
11397 dev->ieee80211_ptr->conn_owner_nlportid = in nl80211_associate()
11398 info->snd_portid; in nl80211_associate()
11399 memcpy(dev->ieee80211_ptr->disconnect_bssid, in nl80211_associate()
11404 if (info->attrs[NL80211_ATTR_MLO_LINKS]) { in nl80211_associate()
11406 info->attrs[NL80211_ATTR_MLO_LINKS], in nl80211_associate()
11425 NL_SET_BAD_ATTR(info->extack, link); in nl80211_associate()
11434 cfg80211_put_bss(&rdev->wiphy, req.links[link_id].bss); in nl80211_associate()
11435 cfg80211_put_bss(&rdev->wiphy, req.bss); in nl80211_associate()
11442 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_deauthenticate()
11443 struct net_device *dev = info->user_ptr[1]; in nl80211_deauthenticate()
11449 if (dev->ieee80211_ptr->conn_owner_nlportid && in nl80211_deauthenticate()
11450 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) in nl80211_deauthenticate()
11451 return -EPERM; in nl80211_deauthenticate()
11453 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_deauthenticate()
11454 return -EINVAL; in nl80211_deauthenticate()
11456 if (!info->attrs[NL80211_ATTR_REASON_CODE]) in nl80211_deauthenticate()
11457 return -EINVAL; in nl80211_deauthenticate()
11459 if (!rdev->ops->deauth) in nl80211_deauthenticate()
11460 return -EOPNOTSUPP; in nl80211_deauthenticate()
11462 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_deauthenticate()
11463 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_deauthenticate()
11464 return -EOPNOTSUPP; in nl80211_deauthenticate()
11466 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_deauthenticate()
11468 reason_code = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); in nl80211_deauthenticate()
11471 return -EINVAL; in nl80211_deauthenticate()
11474 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_deauthenticate()
11475 ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_deauthenticate()
11476 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_deauthenticate()
11479 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; in nl80211_deauthenticate()
11487 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_disassociate()
11488 struct net_device *dev = info->user_ptr[1]; in nl80211_disassociate()
11494 if (dev->ieee80211_ptr->conn_owner_nlportid && in nl80211_disassociate()
11495 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) in nl80211_disassociate()
11496 return -EPERM; in nl80211_disassociate()
11498 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_disassociate()
11499 return -EINVAL; in nl80211_disassociate()
11501 if (!info->attrs[NL80211_ATTR_REASON_CODE]) in nl80211_disassociate()
11502 return -EINVAL; in nl80211_disassociate()
11504 if (!rdev->ops->disassoc) in nl80211_disassociate()
11505 return -EOPNOTSUPP; in nl80211_disassociate()
11507 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_disassociate()
11508 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_disassociate()
11509 return -EOPNOTSUPP; in nl80211_disassociate()
11511 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_disassociate()
11513 reason_code = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); in nl80211_disassociate()
11516 return -EINVAL; in nl80211_disassociate()
11519 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_disassociate()
11520 ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_disassociate()
11521 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_disassociate()
11524 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; in nl80211_disassociate()
11535 struct wiphy *wiphy = &rdev->wiphy; in nl80211_parse_mcast_rate()
11542 sband = wiphy->bands[band]; in nl80211_parse_mcast_rate()
11546 for (i = 0; i < sband->n_bitrates; i++) { in nl80211_parse_mcast_rate()
11547 if (sband->bitrates[i].bitrate == rateval) { in nl80211_parse_mcast_rate()
11560 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_join_ibss()
11561 struct net_device *dev = info->user_ptr[1]; in nl80211_join_ibss()
11569 if (!info->attrs[NL80211_ATTR_SSID] || in nl80211_join_ibss()
11570 !nla_len(info->attrs[NL80211_ATTR_SSID])) in nl80211_join_ibss()
11571 return -EINVAL; in nl80211_join_ibss()
11575 if (info->attrs[NL80211_ATTR_BEACON_INTERVAL]) in nl80211_join_ibss()
11577 nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]); in nl80211_join_ibss()
11584 if (!rdev->ops->join_ibss) in nl80211_join_ibss()
11585 return -EOPNOTSUPP; in nl80211_join_ibss()
11587 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC) in nl80211_join_ibss()
11588 return -EOPNOTSUPP; in nl80211_join_ibss()
11590 wiphy = &rdev->wiphy; in nl80211_join_ibss()
11592 if (info->attrs[NL80211_ATTR_MAC]) { in nl80211_join_ibss()
11593 ibss.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_join_ibss()
11596 return -EINVAL; in nl80211_join_ibss()
11598 ibss.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); in nl80211_join_ibss()
11599 ibss.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); in nl80211_join_ibss()
11601 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_join_ibss()
11602 ibss.ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_join_ibss()
11603 ibss.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_join_ibss()
11610 if (!cfg80211_reg_can_beacon(&rdev->wiphy, &ibss.chandef, in nl80211_join_ibss()
11612 return -EINVAL; in nl80211_join_ibss()
11621 if (!(rdev->wiphy.features & NL80211_FEATURE_HT_IBSS)) in nl80211_join_ibss()
11622 return -EINVAL; in nl80211_join_ibss()
11627 if (!(rdev->wiphy.features & NL80211_FEATURE_HT_IBSS)) in nl80211_join_ibss()
11628 return -EINVAL; in nl80211_join_ibss()
11629 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_join_ibss()
11631 return -EINVAL; in nl80211_join_ibss()
11634 return -EINVAL; in nl80211_join_ibss()
11636 return -EINVAL; in nl80211_join_ibss()
11639 ibss.channel_fixed = !!info->attrs[NL80211_ATTR_FREQ_FIXED]; in nl80211_join_ibss()
11640 ibss.privacy = !!info->attrs[NL80211_ATTR_PRIVACY]; in nl80211_join_ibss()
11642 if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) { in nl80211_join_ibss()
11644 nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); in nl80211_join_ibss()
11646 nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); in nl80211_join_ibss()
11648 wiphy->bands[ibss.chandef.chan->band]; in nl80211_join_ibss()
11656 if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) in nl80211_join_ibss()
11658 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]), in nl80211_join_ibss()
11661 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) { in nl80211_join_ibss()
11662 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) in nl80211_join_ibss()
11663 return -EINVAL; in nl80211_join_ibss()
11665 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]), in nl80211_join_ibss()
11669 if (info->attrs[NL80211_ATTR_MCAST_RATE] && in nl80211_join_ibss()
11671 nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]))) in nl80211_join_ibss()
11672 return -EINVAL; in nl80211_join_ibss()
11674 if (ibss.privacy && info->attrs[NL80211_ATTR_KEYS]) { in nl80211_join_ibss()
11684 return -EINVAL; in nl80211_join_ibss()
11689 nla_get_flag(info->attrs[NL80211_ATTR_CONTROL_PORT]); in nl80211_join_ibss()
11691 if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) { in nl80211_join_ibss()
11703 nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS]); in nl80211_join_ibss()
11708 else if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) in nl80211_join_ibss()
11709 dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid; in nl80211_join_ibss()
11716 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_leave_ibss()
11717 struct net_device *dev = info->user_ptr[1]; in nl80211_leave_ibss()
11719 if (!rdev->ops->leave_ibss) in nl80211_leave_ibss()
11720 return -EOPNOTSUPP; in nl80211_leave_ibss()
11722 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC) in nl80211_leave_ibss()
11723 return -EOPNOTSUPP; in nl80211_leave_ibss()
11730 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_mcast_rate()
11731 struct net_device *dev = info->user_ptr[1]; in nl80211_set_mcast_rate()
11735 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC && in nl80211_set_mcast_rate()
11736 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT && in nl80211_set_mcast_rate()
11737 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_OCB) in nl80211_set_mcast_rate()
11738 return -EOPNOTSUPP; in nl80211_set_mcast_rate()
11740 if (!rdev->ops->set_mcast_rate) in nl80211_set_mcast_rate()
11741 return -EOPNOTSUPP; in nl80211_set_mcast_rate()
11745 if (!info->attrs[NL80211_ATTR_MCAST_RATE]) in nl80211_set_mcast_rate()
11746 return -EINVAL; in nl80211_set_mcast_rate()
11748 nla_rate = nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]); in nl80211_set_mcast_rate()
11750 return -EINVAL; in nl80211_set_mcast_rate()
11777 if (nla_put_u32(skb, NL80211_ATTR_WIPHY, rdev->wiphy_idx)) in __cfg80211_alloc_vendor_skb()
11782 info->vendor_id)) in __cfg80211_alloc_vendor_skb()
11785 info->subcmd)) in __cfg80211_alloc_vendor_skb()
11793 if (wdev->netdev && in __cfg80211_alloc_vendor_skb()
11795 wdev->netdev->ifindex)) in __cfg80211_alloc_vendor_skb()
11803 ((void **)skb->cb)[0] = rdev; in __cfg80211_alloc_vendor_skb()
11804 ((void **)skb->cb)[1] = hdr; in __cfg80211_alloc_vendor_skb()
11805 ((void **)skb->cb)[2] = data; in __cfg80211_alloc_vendor_skb()
11827 if (WARN_ON(vendor_event_idx != -1)) in __cfg80211_alloc_event_skb()
11833 vendor_event_idx >= wiphy->n_vendor_events)) in __cfg80211_alloc_event_skb()
11835 info = &wiphy->vendor_events[vendor_event_idx]; in __cfg80211_alloc_event_skb()
11849 struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0]; in __cfg80211_send_event_skb()
11850 void *hdr = ((void **)skb->cb)[1]; in __cfg80211_send_event_skb()
11852 struct nlattr *data = ((void **)skb->cb)[2]; in __cfg80211_send_event_skb()
11856 memset(skb->cb, 0, sizeof(skb->cb)); in __cfg80211_send_event_skb()
11861 if (nlhdr->nlmsg_pid) { in __cfg80211_send_event_skb()
11862 genlmsg_unicast(wiphy_net(&rdev->wiphy), skb, in __cfg80211_send_event_skb()
11863 nlhdr->nlmsg_pid); in __cfg80211_send_event_skb()
11865 if (data->nla_type == NL80211_ATTR_VENDOR_DATA) in __cfg80211_send_event_skb()
11868 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), in __cfg80211_send_event_skb()
11877 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_testmode_do()
11881 lockdep_assert_held(&rdev->wiphy.mtx); in nl80211_testmode_do()
11884 info->attrs); in nl80211_testmode_do()
11886 if (!rdev->ops->testmode_cmd) in nl80211_testmode_do()
11887 return -EOPNOTSUPP; in nl80211_testmode_do()
11891 if (err != -EINVAL) in nl80211_testmode_do()
11894 } else if (wdev->wiphy != &rdev->wiphy) { in nl80211_testmode_do()
11895 return -EINVAL; in nl80211_testmode_do()
11898 if (!info->attrs[NL80211_ATTR_TESTDATA]) in nl80211_testmode_do()
11899 return -EINVAL; in nl80211_testmode_do()
11901 rdev->cur_cmd_info = info; in nl80211_testmode_do()
11903 nla_data(info->attrs[NL80211_ATTR_TESTDATA]), in nl80211_testmode_do()
11904 nla_len(info->attrs[NL80211_ATTR_TESTDATA])); in nl80211_testmode_do()
11905 rdev->cur_cmd_info = NULL; in nl80211_testmode_do()
11922 if (cb->args[0]) { in nl80211_testmode_dump()
11927 phy_idx = cb->args[0] - 1; in nl80211_testmode_dump()
11931 err = -ENOENT; in nl80211_testmode_dump()
11938 err = -ENOMEM; in nl80211_testmode_dump()
11942 err = nlmsg_parse_deprecated(cb->nlh, in nl80211_testmode_dump()
11949 rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk), attrbuf); in nl80211_testmode_dump()
11954 phy_idx = rdev->wiphy_idx; in nl80211_testmode_dump()
11957 cb->args[1] = (long)attrbuf[NL80211_ATTR_TESTDATA]; in nl80211_testmode_dump()
11960 if (cb->args[1]) { in nl80211_testmode_dump()
11961 data = nla_data((void *)cb->args[1]); in nl80211_testmode_dump()
11962 data_len = nla_len((void *)cb->args[1]); in nl80211_testmode_dump()
11965 if (!rdev->ops->testmode_dump) { in nl80211_testmode_dump()
11966 err = -EOPNOTSUPP; in nl80211_testmode_dump()
11971 void *hdr = nl80211hdr_put(skb, NETLINK_CB(cb->skb).portid, in nl80211_testmode_dump()
11972 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_testmode_dump()
11992 if (err == -ENOBUFS || err == -ENOENT) { in nl80211_testmode_dump()
12003 err = skb->len; in nl80211_testmode_dump()
12005 cb->args[0] = phy_idx + 1; in nl80211_testmode_dump()
12015 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_connect()
12016 struct net_device *dev = info->user_ptr[1]; in nl80211_connect()
12025 if (!info->attrs[NL80211_ATTR_SSID] || in nl80211_connect()
12026 !nla_len(info->attrs[NL80211_ATTR_SSID])) in nl80211_connect()
12027 return -EINVAL; in nl80211_connect()
12029 if (info->attrs[NL80211_ATTR_AUTH_TYPE]) { in nl80211_connect()
12031 nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]); in nl80211_connect()
12034 return -EINVAL; in nl80211_connect()
12038 connect.privacy = info->attrs[NL80211_ATTR_PRIVACY]; in nl80211_connect()
12040 if (info->attrs[NL80211_ATTR_WANT_1X_4WAY_HS] && in nl80211_connect()
12041 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_connect()
12043 return -EINVAL; in nl80211_connect()
12044 connect.want_1x = info->attrs[NL80211_ATTR_WANT_1X_4WAY_HS]; in nl80211_connect()
12051 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_connect()
12052 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_connect()
12053 return -EOPNOTSUPP; in nl80211_connect()
12055 wiphy = &rdev->wiphy; in nl80211_connect()
12057 connect.bg_scan_period = -1; in nl80211_connect()
12058 if (info->attrs[NL80211_ATTR_BG_SCAN_PERIOD] && in nl80211_connect()
12059 (wiphy->flags & WIPHY_FLAG_SUPPORTS_FW_ROAM)) { in nl80211_connect()
12061 nla_get_u16(info->attrs[NL80211_ATTR_BG_SCAN_PERIOD]); in nl80211_connect()
12064 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_connect()
12065 connect.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_connect()
12066 else if (info->attrs[NL80211_ATTR_MAC_HINT]) in nl80211_connect()
12068 nla_data(info->attrs[NL80211_ATTR_MAC_HINT]); in nl80211_connect()
12069 connect.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); in nl80211_connect()
12070 connect.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); in nl80211_connect()
12072 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_connect()
12073 connect.ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_connect()
12074 connect.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_connect()
12077 if (info->attrs[NL80211_ATTR_USE_MFP]) { in nl80211_connect()
12078 connect.mfp = nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]); in nl80211_connect()
12080 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_connect()
12082 return -EOPNOTSUPP; in nl80211_connect()
12087 if (info->attrs[NL80211_ATTR_PREV_BSSID]) in nl80211_connect()
12089 nla_data(info->attrs[NL80211_ATTR_PREV_BSSID]); in nl80211_connect()
12091 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) in nl80211_connect()
12093 info->attrs[NL80211_ATTR_WIPHY_FREQ])); in nl80211_connect()
12094 if (info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]) in nl80211_connect()
12096 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]); in nl80211_connect()
12101 return -EINVAL; in nl80211_connect()
12102 } else if (info->attrs[NL80211_ATTR_WIPHY_FREQ_HINT]) { in nl80211_connect()
12103 freq = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_HINT]); in nl80211_connect()
12107 return -EINVAL; in nl80211_connect()
12110 if (info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]) { in nl80211_connect()
12112 nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]); in nl80211_connect()
12114 if (info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]) in nl80211_connect()
12116 nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]); in nl80211_connect()
12119 if (connect.privacy && info->attrs[NL80211_ATTR_KEYS]) { in nl80211_connect()
12125 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HT])) in nl80211_connect()
12128 if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) in nl80211_connect()
12130 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]), in nl80211_connect()
12133 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) { in nl80211_connect()
12134 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) { in nl80211_connect()
12136 return -EINVAL; in nl80211_connect()
12139 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]), in nl80211_connect()
12143 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_VHT])) in nl80211_connect()
12146 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HE])) in nl80211_connect()
12149 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_EHT])) in nl80211_connect()
12152 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) in nl80211_connect()
12154 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]), in nl80211_connect()
12157 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) { in nl80211_connect()
12158 if (!info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) { in nl80211_connect()
12160 return -EINVAL; in nl80211_connect()
12163 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]), in nl80211_connect()
12167 if (nla_get_flag(info->attrs[NL80211_ATTR_USE_RRM])) { in nl80211_connect()
12168 if (!((rdev->wiphy.features & in nl80211_connect()
12170 (rdev->wiphy.features & NL80211_FEATURE_QUIET)) && in nl80211_connect()
12171 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_connect()
12174 return -EINVAL; in nl80211_connect()
12179 connect.pbss = nla_get_flag(info->attrs[NL80211_ATTR_PBSS]); in nl80211_connect()
12180 if (connect.pbss && !rdev->wiphy.bands[NL80211_BAND_60GHZ]) { in nl80211_connect()
12182 return -EOPNOTSUPP; in nl80211_connect()
12185 if (info->attrs[NL80211_ATTR_BSS_SELECT]) { in nl80211_connect()
12189 return -EINVAL; in nl80211_connect()
12192 err = parse_bss_select(info->attrs[NL80211_ATTR_BSS_SELECT], in nl80211_connect()
12200 if (wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_connect()
12202 info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] && in nl80211_connect()
12203 info->attrs[NL80211_ATTR_FILS_ERP_REALM] && in nl80211_connect()
12204 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] && in nl80211_connect()
12205 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { in nl80211_connect()
12207 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); in nl80211_connect()
12209 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); in nl80211_connect()
12211 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); in nl80211_connect()
12213 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); in nl80211_connect()
12216 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM]); in nl80211_connect()
12218 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); in nl80211_connect()
12220 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); in nl80211_connect()
12221 } else if (info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] || in nl80211_connect()
12222 info->attrs[NL80211_ATTR_FILS_ERP_REALM] || in nl80211_connect()
12223 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] || in nl80211_connect()
12224 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { in nl80211_connect()
12226 return -EINVAL; in nl80211_connect()
12229 if (nla_get_flag(info->attrs[NL80211_ATTR_EXTERNAL_AUTH_SUPPORT])) { in nl80211_connect()
12230 if (!info->attrs[NL80211_ATTR_SOCKET_OWNER]) { in nl80211_connect()
12234 return -EINVAL; in nl80211_connect()
12239 if (nla_get_flag(info->attrs[NL80211_ATTR_MLO_SUPPORT])) in nl80211_connect()
12247 if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) { in nl80211_connect()
12248 dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid; in nl80211_connect()
12250 memcpy(dev->ieee80211_ptr->disconnect_bssid, in nl80211_connect()
12253 eth_zero_addr(dev->ieee80211_ptr->disconnect_bssid); in nl80211_connect()
12263 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_update_connect_params()
12264 struct net_device *dev = info->user_ptr[1]; in nl80211_update_connect_params()
12265 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_update_connect_params()
12270 if (!rdev->ops->update_connect_params) in nl80211_update_connect_params()
12271 return -EOPNOTSUPP; in nl80211_update_connect_params()
12273 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_update_connect_params()
12274 connect.ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_update_connect_params()
12275 connect.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_update_connect_params()
12279 fils_sk_offload = wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_update_connect_params()
12283 * when driver supports fils-sk offload all attributes must be in nl80211_update_connect_params()
12284 * provided. So the else covers "fils-sk-not-all" and in nl80211_update_connect_params()
12285 * "no-fils-sk-any". in nl80211_update_connect_params()
12288 info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] && in nl80211_update_connect_params()
12289 info->attrs[NL80211_ATTR_FILS_ERP_REALM] && in nl80211_update_connect_params()
12290 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] && in nl80211_update_connect_params()
12291 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { in nl80211_update_connect_params()
12293 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); in nl80211_update_connect_params()
12295 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); in nl80211_update_connect_params()
12297 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); in nl80211_update_connect_params()
12299 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); in nl80211_update_connect_params()
12302 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM]); in nl80211_update_connect_params()
12304 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); in nl80211_update_connect_params()
12306 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); in nl80211_update_connect_params()
12308 } else if (info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] || in nl80211_update_connect_params()
12309 info->attrs[NL80211_ATTR_FILS_ERP_REALM] || in nl80211_update_connect_params()
12310 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] || in nl80211_update_connect_params()
12311 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { in nl80211_update_connect_params()
12312 return -EINVAL; in nl80211_update_connect_params()
12315 if (info->attrs[NL80211_ATTR_AUTH_TYPE]) { in nl80211_update_connect_params()
12316 auth_type = nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]); in nl80211_update_connect_params()
12319 return -EINVAL; in nl80211_update_connect_params()
12323 return -EINVAL; in nl80211_update_connect_params()
12329 if (!wdev->connected) in nl80211_update_connect_params()
12330 return -ENOLINK; in nl80211_update_connect_params()
12337 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_disconnect()
12338 struct net_device *dev = info->user_ptr[1]; in nl80211_disconnect()
12341 if (dev->ieee80211_ptr->conn_owner_nlportid && in nl80211_disconnect()
12342 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) in nl80211_disconnect()
12343 return -EPERM; in nl80211_disconnect()
12345 reason = nla_get_u16_default(info->attrs[NL80211_ATTR_REASON_CODE], in nl80211_disconnect()
12349 return -EINVAL; in nl80211_disconnect()
12351 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_disconnect()
12352 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_disconnect()
12353 return -EOPNOTSUPP; in nl80211_disconnect()
12360 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_wiphy_netns()
12364 if (info->attrs[NL80211_ATTR_PID]) { in nl80211_wiphy_netns()
12365 u32 pid = nla_get_u32(info->attrs[NL80211_ATTR_PID]); in nl80211_wiphy_netns()
12368 } else if (info->attrs[NL80211_ATTR_NETNS_FD]) { in nl80211_wiphy_netns()
12369 u32 fd = nla_get_u32(info->attrs[NL80211_ATTR_NETNS_FD]); in nl80211_wiphy_netns()
12373 return -EINVAL; in nl80211_wiphy_netns()
12382 if (!net_eq(wiphy_net(&rdev->wiphy), net)) in nl80211_wiphy_netns()
12391 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_pmksa()
12392 struct net_device *dev = info->user_ptr[1]; in nl80211_set_pmksa()
12398 ap_pmksa_caching_support = wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_set_pmksa()
12401 if (!info->attrs[NL80211_ATTR_PMKID]) in nl80211_set_pmksa()
12402 return -EINVAL; in nl80211_set_pmksa()
12404 pmksa.pmkid = nla_data(info->attrs[NL80211_ATTR_PMKID]); in nl80211_set_pmksa()
12406 if (info->attrs[NL80211_ATTR_MAC]) { in nl80211_set_pmksa()
12407 pmksa.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_set_pmksa()
12408 } else if (info->attrs[NL80211_ATTR_SSID] && in nl80211_set_pmksa()
12409 info->attrs[NL80211_ATTR_FILS_CACHE_ID] && in nl80211_set_pmksa()
12410 info->attrs[NL80211_ATTR_PMK]) { in nl80211_set_pmksa()
12411 pmksa.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); in nl80211_set_pmksa()
12412 pmksa.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); in nl80211_set_pmksa()
12413 pmksa.cache_id = nla_data(info->attrs[NL80211_ATTR_FILS_CACHE_ID]); in nl80211_set_pmksa()
12415 return -EINVAL; in nl80211_set_pmksa()
12418 if (info->attrs[NL80211_ATTR_PMK]) { in nl80211_set_pmksa()
12419 pmksa.pmk = nla_data(info->attrs[NL80211_ATTR_PMK]); in nl80211_set_pmksa()
12420 pmksa.pmk_len = nla_len(info->attrs[NL80211_ATTR_PMK]); in nl80211_set_pmksa()
12423 if (info->attrs[NL80211_ATTR_PMK_LIFETIME]) in nl80211_set_pmksa()
12425 nla_get_u32(info->attrs[NL80211_ATTR_PMK_LIFETIME]); in nl80211_set_pmksa()
12427 if (info->attrs[NL80211_ATTR_PMK_REAUTH_THRESHOLD]) in nl80211_set_pmksa()
12429 nla_get_u8(info->attrs[NL80211_ATTR_PMK_REAUTH_THRESHOLD]); in nl80211_set_pmksa()
12431 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_set_pmksa()
12432 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT && in nl80211_set_pmksa()
12433 !((dev->ieee80211_ptr->iftype == NL80211_IFTYPE_AP || in nl80211_set_pmksa()
12434 dev->ieee80211_ptr->iftype == NL80211_IFTYPE_P2P_GO) && in nl80211_set_pmksa()
12436 return -EOPNOTSUPP; in nl80211_set_pmksa()
12438 if (!rdev->ops->set_pmksa) in nl80211_set_pmksa()
12439 return -EOPNOTSUPP; in nl80211_set_pmksa()
12446 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_del_pmksa()
12447 struct net_device *dev = info->user_ptr[1]; in nl80211_del_pmksa()
12455 sae_offload_support = wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_del_pmksa()
12457 owe_offload_support = wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_del_pmksa()
12459 ap_pmksa_caching_support = wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_del_pmksa()
12462 if (info->attrs[NL80211_ATTR_PMKID]) in nl80211_del_pmksa()
12463 pmksa.pmkid = nla_data(info->attrs[NL80211_ATTR_PMKID]); in nl80211_del_pmksa()
12465 if (info->attrs[NL80211_ATTR_MAC]) { in nl80211_del_pmksa()
12466 pmksa.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_del_pmksa()
12467 } else if (info->attrs[NL80211_ATTR_SSID]) { in nl80211_del_pmksa()
12471 if (info->attrs[NL80211_ATTR_FILS_CACHE_ID] && in nl80211_del_pmksa()
12472 info->attrs[NL80211_ATTR_PMK]) { in nl80211_del_pmksa()
12473 pmksa.cache_id = nla_data(info->attrs[NL80211_ATTR_FILS_CACHE_ID]); in nl80211_del_pmksa()
12475 return -EINVAL; in nl80211_del_pmksa()
12477 pmksa.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); in nl80211_del_pmksa()
12478 pmksa.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); in nl80211_del_pmksa()
12480 return -EINVAL; in nl80211_del_pmksa()
12483 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_del_pmksa()
12484 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT && in nl80211_del_pmksa()
12485 !((dev->ieee80211_ptr->iftype == NL80211_IFTYPE_AP || in nl80211_del_pmksa()
12486 dev->ieee80211_ptr->iftype == NL80211_IFTYPE_P2P_GO) && in nl80211_del_pmksa()
12488 return -EOPNOTSUPP; in nl80211_del_pmksa()
12490 if (!rdev->ops->del_pmksa) in nl80211_del_pmksa()
12491 return -EOPNOTSUPP; in nl80211_del_pmksa()
12498 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_flush_pmksa()
12499 struct net_device *dev = info->user_ptr[1]; in nl80211_flush_pmksa()
12501 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_flush_pmksa()
12502 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_flush_pmksa()
12503 return -EOPNOTSUPP; in nl80211_flush_pmksa()
12505 if (!rdev->ops->flush_pmksa) in nl80211_flush_pmksa()
12506 return -EOPNOTSUPP; in nl80211_flush_pmksa()
12513 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_tdls_mgmt()
12514 struct net_device *dev = info->user_ptr[1]; in nl80211_tdls_mgmt()
12522 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) || in nl80211_tdls_mgmt()
12523 !rdev->ops->tdls_mgmt) in nl80211_tdls_mgmt()
12524 return -EOPNOTSUPP; in nl80211_tdls_mgmt()
12526 if (!info->attrs[NL80211_ATTR_TDLS_ACTION] || in nl80211_tdls_mgmt()
12527 !info->attrs[NL80211_ATTR_STATUS_CODE] || in nl80211_tdls_mgmt()
12528 !info->attrs[NL80211_ATTR_TDLS_DIALOG_TOKEN] || in nl80211_tdls_mgmt()
12529 !info->attrs[NL80211_ATTR_IE] || in nl80211_tdls_mgmt()
12530 !info->attrs[NL80211_ATTR_MAC]) in nl80211_tdls_mgmt()
12531 return -EINVAL; in nl80211_tdls_mgmt()
12533 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_tdls_mgmt()
12534 action_code = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_ACTION]); in nl80211_tdls_mgmt()
12535 status_code = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]); in nl80211_tdls_mgmt()
12536 dialog_token = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_DIALOG_TOKEN]); in nl80211_tdls_mgmt()
12537 initiator = nla_get_flag(info->attrs[NL80211_ATTR_TDLS_INITIATOR]); in nl80211_tdls_mgmt()
12538 if (info->attrs[NL80211_ATTR_TDLS_PEER_CAPABILITY]) in nl80211_tdls_mgmt()
12540 nla_get_u32(info->attrs[NL80211_ATTR_TDLS_PEER_CAPABILITY]); in nl80211_tdls_mgmt()
12541 link_id = nl80211_link_id_or_invalid(info->attrs); in nl80211_tdls_mgmt()
12546 nla_data(info->attrs[NL80211_ATTR_IE]), in nl80211_tdls_mgmt()
12547 nla_len(info->attrs[NL80211_ATTR_IE])); in nl80211_tdls_mgmt()
12552 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_tdls_oper()
12553 struct net_device *dev = info->user_ptr[1]; in nl80211_tdls_oper()
12557 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) || in nl80211_tdls_oper()
12558 !rdev->ops->tdls_oper) in nl80211_tdls_oper()
12559 return -EOPNOTSUPP; in nl80211_tdls_oper()
12561 if (!info->attrs[NL80211_ATTR_TDLS_OPERATION] || in nl80211_tdls_oper()
12562 !info->attrs[NL80211_ATTR_MAC]) in nl80211_tdls_oper()
12563 return -EINVAL; in nl80211_tdls_oper()
12565 operation = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_OPERATION]); in nl80211_tdls_oper()
12566 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_tdls_oper()
12574 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_remain_on_channel()
12575 unsigned int link_id = nl80211_link_id(info->attrs); in nl80211_remain_on_channel()
12576 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_remain_on_channel()
12584 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ] || in nl80211_remain_on_channel()
12585 !info->attrs[NL80211_ATTR_DURATION]) in nl80211_remain_on_channel()
12586 return -EINVAL; in nl80211_remain_on_channel()
12588 duration = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]); in nl80211_remain_on_channel()
12590 if (!rdev->ops->remain_on_channel || in nl80211_remain_on_channel()
12591 !(rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL)) in nl80211_remain_on_channel()
12592 return -EOPNOTSUPP; in nl80211_remain_on_channel()
12599 duration > rdev->wiphy.max_remain_on_channel_duration) in nl80211_remain_on_channel()
12600 return -EINVAL; in nl80211_remain_on_channel()
12614 return -EBUSY; in nl80211_remain_on_channel()
12622 return -EBUSY; in nl80211_remain_on_channel()
12627 return -ENOMEM; in nl80211_remain_on_channel()
12629 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_remain_on_channel()
12632 err = -ENOBUFS; in nl80211_remain_on_channel()
12651 err = -ENOBUFS; in nl80211_remain_on_channel()
12660 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_cancel_remain_on_channel()
12661 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_cancel_remain_on_channel()
12664 if (!info->attrs[NL80211_ATTR_COOKIE]) in nl80211_cancel_remain_on_channel()
12665 return -EINVAL; in nl80211_cancel_remain_on_channel()
12667 if (!rdev->ops->cancel_remain_on_channel) in nl80211_cancel_remain_on_channel()
12668 return -EOPNOTSUPP; in nl80211_cancel_remain_on_channel()
12670 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); in nl80211_cancel_remain_on_channel()
12679 unsigned int link_id = nl80211_link_id(info->attrs); in nl80211_set_tx_bitrate_mask()
12680 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_tx_bitrate_mask()
12681 struct net_device *dev = info->user_ptr[1]; in nl80211_set_tx_bitrate_mask()
12684 if (!rdev->ops->set_bitrate_mask) in nl80211_set_tx_bitrate_mask()
12685 return -EOPNOTSUPP; in nl80211_set_tx_bitrate_mask()
12687 err = nl80211_parse_tx_bitrate_mask(info, info->attrs, in nl80211_set_tx_bitrate_mask()
12698 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_register_mgmt()
12699 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_register_mgmt()
12702 if (!info->attrs[NL80211_ATTR_FRAME_MATCH]) in nl80211_register_mgmt()
12703 return -EINVAL; in nl80211_register_mgmt()
12705 if (info->attrs[NL80211_ATTR_FRAME_TYPE]) in nl80211_register_mgmt()
12706 frame_type = nla_get_u16(info->attrs[NL80211_ATTR_FRAME_TYPE]); in nl80211_register_mgmt()
12708 switch (wdev->iftype) { in nl80211_register_mgmt()
12719 if (!wiphy_ext_feature_isset(wdev->wiphy, in nl80211_register_mgmt()
12721 return -EOPNOTSUPP; in nl80211_register_mgmt()
12724 return -EOPNOTSUPP; in nl80211_register_mgmt()
12728 if (!rdev->ops->mgmt_tx) in nl80211_register_mgmt()
12729 return -EOPNOTSUPP; in nl80211_register_mgmt()
12731 if (info->attrs[NL80211_ATTR_RECEIVE_MULTICAST] && in nl80211_register_mgmt()
12732 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_register_mgmt()
12736 return -EOPNOTSUPP; in nl80211_register_mgmt()
12739 return cfg80211_mlme_register_mgmt(wdev, info->snd_portid, frame_type, in nl80211_register_mgmt()
12740 nla_data(info->attrs[NL80211_ATTR_FRAME_MATCH]), in nl80211_register_mgmt()
12741 nla_len(info->attrs[NL80211_ATTR_FRAME_MATCH]), in nl80211_register_mgmt()
12742 info->attrs[NL80211_ATTR_RECEIVE_MULTICAST], in nl80211_register_mgmt()
12743 info->extack); in nl80211_register_mgmt()
12748 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_tx_mgmt()
12749 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_tx_mgmt()
12757 info->attrs[NL80211_ATTR_DONT_WAIT_FOR_ACK], in nl80211_tx_mgmt()
12760 if (!info->attrs[NL80211_ATTR_FRAME]) in nl80211_tx_mgmt()
12761 return -EINVAL; in nl80211_tx_mgmt()
12763 if (!rdev->ops->mgmt_tx) in nl80211_tx_mgmt()
12764 return -EOPNOTSUPP; in nl80211_tx_mgmt()
12766 switch (wdev->iftype) { in nl80211_tx_mgmt()
12768 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ]) in nl80211_tx_mgmt()
12769 return -EINVAL; in nl80211_tx_mgmt()
12780 if (!wiphy_ext_feature_isset(wdev->wiphy, in nl80211_tx_mgmt()
12782 return -EOPNOTSUPP; in nl80211_tx_mgmt()
12785 return -EOPNOTSUPP; in nl80211_tx_mgmt()
12788 if (info->attrs[NL80211_ATTR_DURATION]) { in nl80211_tx_mgmt()
12789 if (!(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX)) in nl80211_tx_mgmt()
12790 return -EINVAL; in nl80211_tx_mgmt()
12791 params.wait = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]); in nl80211_tx_mgmt()
12798 params.wait > rdev->wiphy.max_remain_on_channel_duration) in nl80211_tx_mgmt()
12799 return -EINVAL; in nl80211_tx_mgmt()
12802 params.offchan = info->attrs[NL80211_ATTR_OFFCHANNEL_TX_OK]; in nl80211_tx_mgmt()
12804 if (params.offchan && !(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX)) in nl80211_tx_mgmt()
12805 return -EINVAL; in nl80211_tx_mgmt()
12807 params.no_cck = nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]); in nl80211_tx_mgmt()
12813 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { in nl80211_tx_mgmt()
12820 return -EINVAL; in nl80211_tx_mgmt()
12824 return -EBUSY; in nl80211_tx_mgmt()
12826 params.link_id = nl80211_link_id_or_invalid(info->attrs); in nl80211_tx_mgmt()
12833 !(wdev->valid_links & BIT(params.link_id))) in nl80211_tx_mgmt()
12834 return -EINVAL; in nl80211_tx_mgmt()
12836 params.buf = nla_data(info->attrs[NL80211_ATTR_FRAME]); in nl80211_tx_mgmt()
12837 params.len = nla_len(info->attrs[NL80211_ATTR_FRAME]); in nl80211_tx_mgmt()
12839 err = nl80211_parse_counter_offsets(rdev, NULL, params.len, -1, in nl80211_tx_mgmt()
12840 info->attrs[NL80211_ATTR_CSA_C_OFFSETS_TX], in nl80211_tx_mgmt()
12849 return -ENOMEM; in nl80211_tx_mgmt()
12851 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_tx_mgmt()
12854 err = -ENOBUFS; in nl80211_tx_mgmt()
12876 err = -ENOBUFS; in nl80211_tx_mgmt()
12884 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_tx_mgmt_cancel_wait()
12885 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_tx_mgmt_cancel_wait()
12888 if (!info->attrs[NL80211_ATTR_COOKIE]) in nl80211_tx_mgmt_cancel_wait()
12889 return -EINVAL; in nl80211_tx_mgmt_cancel_wait()
12891 if (!rdev->ops->mgmt_tx_cancel_wait) in nl80211_tx_mgmt_cancel_wait()
12892 return -EOPNOTSUPP; in nl80211_tx_mgmt_cancel_wait()
12894 switch (wdev->iftype) { in nl80211_tx_mgmt_cancel_wait()
12904 if (!wiphy_ext_feature_isset(wdev->wiphy, in nl80211_tx_mgmt_cancel_wait()
12906 return -EOPNOTSUPP; in nl80211_tx_mgmt_cancel_wait()
12909 return -EOPNOTSUPP; in nl80211_tx_mgmt_cancel_wait()
12912 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); in nl80211_tx_mgmt_cancel_wait()
12919 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_power_save()
12921 struct net_device *dev = info->user_ptr[1]; in nl80211_set_power_save()
12926 if (!info->attrs[NL80211_ATTR_PS_STATE]) in nl80211_set_power_save()
12927 return -EINVAL; in nl80211_set_power_save()
12929 ps_state = nla_get_u32(info->attrs[NL80211_ATTR_PS_STATE]); in nl80211_set_power_save()
12931 wdev = dev->ieee80211_ptr; in nl80211_set_power_save()
12933 if (!rdev->ops->set_power_mgmt) in nl80211_set_power_save()
12934 return -EOPNOTSUPP; in nl80211_set_power_save()
12938 if (state == wdev->ps) in nl80211_set_power_save()
12941 err = rdev_set_power_mgmt(rdev, dev, state, wdev->ps_timeout); in nl80211_set_power_save()
12943 wdev->ps = state; in nl80211_set_power_save()
12949 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_power_save()
12952 struct net_device *dev = info->user_ptr[1]; in nl80211_get_power_save()
12957 wdev = dev->ieee80211_ptr; in nl80211_get_power_save()
12959 if (!rdev->ops->set_power_mgmt) in nl80211_get_power_save()
12960 return -EOPNOTSUPP; in nl80211_get_power_save()
12964 return -ENOMEM; in nl80211_get_power_save()
12966 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_power_save()
12969 err = -ENOBUFS; in nl80211_get_power_save()
12973 if (wdev->ps) in nl80211_get_power_save()
12985 err = -ENOBUFS; in nl80211_get_power_save()
13005 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_cqm_txe()
13006 struct net_device *dev = info->user_ptr[1]; in nl80211_set_cqm_txe()
13007 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_cqm_txe()
13010 return -EINVAL; in nl80211_set_cqm_txe()
13012 if (!rdev->ops->set_cqm_txe_config) in nl80211_set_cqm_txe()
13013 return -EOPNOTSUPP; in nl80211_set_cqm_txe()
13015 if (wdev->iftype != NL80211_IFTYPE_STATION && in nl80211_set_cqm_txe()
13016 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_set_cqm_txe()
13017 return -EOPNOTSUPP; in nl80211_set_cqm_txe()
13026 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_cqm_rssi_update()
13038 if (!cqm_config->last_rssi_event_value && in cfg80211_cqm_rssi_update()
13039 wdev->links[0].client.current_bss && in cfg80211_cqm_rssi_update()
13040 rdev->ops->get_station) { in cfg80211_cqm_rssi_update()
13044 mac_addr = wdev->links[0].client.current_bss->pub.bssid; in cfg80211_cqm_rssi_update()
13052 cqm_config->last_rssi_event_value = in cfg80211_cqm_rssi_update()
13056 last = cqm_config->last_rssi_event_value; in cfg80211_cqm_rssi_update()
13057 hyst = cqm_config->rssi_hyst; in cfg80211_cqm_rssi_update()
13058 n = cqm_config->n_rssi_thresholds; in cfg80211_cqm_rssi_update()
13062 if (last < cqm_config->rssi_thresholds[i]) in cfg80211_cqm_rssi_update()
13066 low_index = i - 1; in cfg80211_cqm_rssi_update()
13069 low = cqm_config->rssi_thresholds[low_index] - hyst; in cfg80211_cqm_rssi_update()
13075 high = cqm_config->rssi_thresholds[i] + hyst - 1; in cfg80211_cqm_rssi_update()
13087 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_cqm_rssi()
13089 struct net_device *dev = info->user_ptr[1]; in nl80211_set_cqm_rssi()
13090 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_cqm_rssi()
13097 return -EINVAL; in nl80211_set_cqm_rssi()
13102 if (wdev->iftype != NL80211_IFTYPE_STATION && in nl80211_set_cqm_rssi()
13103 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_set_cqm_rssi()
13104 return -EOPNOTSUPP; in nl80211_set_cqm_rssi()
13109 old = wiphy_dereference(wdev->wiphy, wdev->cqm_config); in nl80211_set_cqm_rssi()
13116 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_set_cqm_rssi()
13118 !rdev->ops->set_cqm_rssi_range_config) in nl80211_set_cqm_rssi()
13119 return -EOPNOTSUPP; in nl80211_set_cqm_rssi()
13121 if (!rdev->ops->set_cqm_rssi_config) in nl80211_set_cqm_rssi()
13122 return -EOPNOTSUPP; in nl80211_set_cqm_rssi()
13130 return -ENOMEM; in nl80211_set_cqm_rssi()
13132 cqm_config->rssi_hyst = hysteresis; in nl80211_set_cqm_rssi()
13133 cqm_config->n_rssi_thresholds = n_thresholds; in nl80211_set_cqm_rssi()
13134 memcpy(cqm_config->rssi_thresholds, thresholds, in nl80211_set_cqm_rssi()
13137 cqm_config->use_range_api = n_thresholds > 1 || in nl80211_set_cqm_rssi()
13138 !rdev->ops->set_cqm_rssi_config; in nl80211_set_cqm_rssi()
13140 rcu_assign_pointer(wdev->cqm_config, cqm_config); in nl80211_set_cqm_rssi()
13142 if (cqm_config->use_range_api) in nl80211_set_cqm_rssi()
13149 RCU_INIT_POINTER(wdev->cqm_config, NULL); in nl80211_set_cqm_rssi()
13151 if (old->use_range_api) in nl80211_set_cqm_rssi()
13158 rcu_assign_pointer(wdev->cqm_config, old); in nl80211_set_cqm_rssi()
13173 cqm = info->attrs[NL80211_ATTR_CQM]; in nl80211_set_cqm()
13175 return -EINVAL; in nl80211_set_cqm()
13179 info->extack); in nl80211_set_cqm()
13191 return -EINVAL; in nl80211_set_cqm()
13207 return -EINVAL; in nl80211_set_cqm()
13212 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_join_ocb()
13213 struct net_device *dev = info->user_ptr[1]; in nl80211_join_ocb()
13226 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_leave_ocb()
13227 struct net_device *dev = info->user_ptr[1]; in nl80211_leave_ocb()
13234 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_join_mesh()
13235 struct net_device *dev = info->user_ptr[1]; in nl80211_join_mesh()
13244 if (info->attrs[NL80211_ATTR_MESH_CONFIG]) { in nl80211_join_mesh()
13251 if (!info->attrs[NL80211_ATTR_MESH_ID] || in nl80211_join_mesh()
13252 !nla_len(info->attrs[NL80211_ATTR_MESH_ID])) in nl80211_join_mesh()
13253 return -EINVAL; in nl80211_join_mesh()
13255 setup.mesh_id = nla_data(info->attrs[NL80211_ATTR_MESH_ID]); in nl80211_join_mesh()
13256 setup.mesh_id_len = nla_len(info->attrs[NL80211_ATTR_MESH_ID]); in nl80211_join_mesh()
13258 if (info->attrs[NL80211_ATTR_MCAST_RATE] && in nl80211_join_mesh()
13260 nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]))) in nl80211_join_mesh()
13261 return -EINVAL; in nl80211_join_mesh()
13263 if (info->attrs[NL80211_ATTR_BEACON_INTERVAL]) { in nl80211_join_mesh()
13265 nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]); in nl80211_join_mesh()
13274 if (info->attrs[NL80211_ATTR_DTIM_PERIOD]) { in nl80211_join_mesh()
13276 nla_get_u32(info->attrs[NL80211_ATTR_DTIM_PERIOD]); in nl80211_join_mesh()
13278 return -EINVAL; in nl80211_join_mesh()
13281 if (info->attrs[NL80211_ATTR_MESH_SETUP]) { in nl80211_join_mesh()
13291 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { in nl80211_join_mesh()
13300 if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) { in nl80211_join_mesh()
13301 u8 *rates = nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); in nl80211_join_mesh()
13303 nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); in nl80211_join_mesh()
13307 return -EINVAL; in nl80211_join_mesh()
13309 sband = rdev->wiphy.bands[setup.chandef.chan->band]; in nl80211_join_mesh()
13317 if (info->attrs[NL80211_ATTR_TX_RATES]) { in nl80211_join_mesh()
13318 err = nl80211_parse_tx_bitrate_mask(info, info->attrs, in nl80211_join_mesh()
13326 return -EINVAL; in nl80211_join_mesh()
13328 err = validate_beacon_tx_rate(rdev, setup.chandef.chan->band, in nl80211_join_mesh()
13335 nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS]); in nl80211_join_mesh()
13337 if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) { in nl80211_join_mesh()
13347 if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) in nl80211_join_mesh()
13348 dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid; in nl80211_join_mesh()
13355 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_leave_mesh()
13356 struct net_device *dev = info->user_ptr[1]; in nl80211_leave_mesh()
13365 struct cfg80211_wowlan *wowlan = rdev->wiphy.wowlan_config; in nl80211_send_wowlan_patterns()
13369 if (!wowlan->n_patterns) in nl80211_send_wowlan_patterns()
13374 return -ENOBUFS; in nl80211_send_wowlan_patterns()
13376 for (i = 0; i < wowlan->n_patterns; i++) { in nl80211_send_wowlan_patterns()
13379 return -ENOBUFS; in nl80211_send_wowlan_patterns()
13380 pat_len = wowlan->patterns[i].pattern_len; in nl80211_send_wowlan_patterns()
13382 wowlan->patterns[i].mask) || in nl80211_send_wowlan_patterns()
13384 wowlan->patterns[i].pattern) || in nl80211_send_wowlan_patterns()
13386 wowlan->patterns[i].pkt_offset)) in nl80211_send_wowlan_patterns()
13387 return -ENOBUFS; in nl80211_send_wowlan_patterns()
13406 return -ENOBUFS; in nl80211_send_wowlan_tcp()
13408 if (nla_put_in_addr(msg, NL80211_WOWLAN_TCP_SRC_IPV4, tcp->src) || in nl80211_send_wowlan_tcp()
13409 nla_put_in_addr(msg, NL80211_WOWLAN_TCP_DST_IPV4, tcp->dst) || in nl80211_send_wowlan_tcp()
13410 nla_put(msg, NL80211_WOWLAN_TCP_DST_MAC, ETH_ALEN, tcp->dst_mac) || in nl80211_send_wowlan_tcp()
13411 nla_put_u16(msg, NL80211_WOWLAN_TCP_SRC_PORT, tcp->src_port) || in nl80211_send_wowlan_tcp()
13412 nla_put_u16(msg, NL80211_WOWLAN_TCP_DST_PORT, tcp->dst_port) || in nl80211_send_wowlan_tcp()
13414 tcp->payload_len, tcp->payload) || in nl80211_send_wowlan_tcp()
13416 tcp->data_interval) || in nl80211_send_wowlan_tcp()
13418 tcp->wake_len, tcp->wake_data) || in nl80211_send_wowlan_tcp()
13420 DIV_ROUND_UP(tcp->wake_len, 8), tcp->wake_mask)) in nl80211_send_wowlan_tcp()
13421 return -ENOBUFS; in nl80211_send_wowlan_tcp()
13423 if (tcp->payload_seq.len && in nl80211_send_wowlan_tcp()
13425 sizeof(tcp->payload_seq), &tcp->payload_seq)) in nl80211_send_wowlan_tcp()
13426 return -ENOBUFS; in nl80211_send_wowlan_tcp()
13428 if (tcp->payload_tok.len && in nl80211_send_wowlan_tcp()
13430 sizeof(tcp->payload_tok) + tcp->tokens_size, in nl80211_send_wowlan_tcp()
13431 &tcp->payload_tok)) in nl80211_send_wowlan_tcp()
13432 return -ENOBUFS; in nl80211_send_wowlan_tcp()
13450 return -ENOBUFS; in nl80211_send_wowlan_nd()
13452 if (req->n_scan_plans == 1 && in nl80211_send_wowlan_nd()
13454 req->scan_plans[0].interval * 1000)) in nl80211_send_wowlan_nd()
13455 return -ENOBUFS; in nl80211_send_wowlan_nd()
13457 if (nla_put_u32(msg, NL80211_ATTR_SCHED_SCAN_DELAY, req->delay)) in nl80211_send_wowlan_nd()
13458 return -ENOBUFS; in nl80211_send_wowlan_nd()
13460 if (req->relative_rssi_set) { in nl80211_send_wowlan_nd()
13464 req->relative_rssi)) in nl80211_send_wowlan_nd()
13465 return -ENOBUFS; in nl80211_send_wowlan_nd()
13467 rssi_adjust.band = req->rssi_adjust.band; in nl80211_send_wowlan_nd()
13468 rssi_adjust.delta = req->rssi_adjust.delta; in nl80211_send_wowlan_nd()
13471 return -ENOBUFS; in nl80211_send_wowlan_nd()
13476 return -ENOBUFS; in nl80211_send_wowlan_nd()
13478 for (i = 0; i < req->n_channels; i++) { in nl80211_send_wowlan_nd()
13479 if (nla_put_u32(msg, i, req->channels[i]->center_freq)) in nl80211_send_wowlan_nd()
13480 return -ENOBUFS; in nl80211_send_wowlan_nd()
13485 if (req->n_match_sets) { in nl80211_send_wowlan_nd()
13489 return -ENOBUFS; in nl80211_send_wowlan_nd()
13491 for (i = 0; i < req->n_match_sets; i++) { in nl80211_send_wowlan_nd()
13494 return -ENOBUFS; in nl80211_send_wowlan_nd()
13497 req->match_sets[i].ssid.ssid_len, in nl80211_send_wowlan_nd()
13498 req->match_sets[i].ssid.ssid)) in nl80211_send_wowlan_nd()
13499 return -ENOBUFS; in nl80211_send_wowlan_nd()
13507 return -ENOBUFS; in nl80211_send_wowlan_nd()
13509 for (i = 0; i < req->n_scan_plans; i++) { in nl80211_send_wowlan_nd()
13512 return -ENOBUFS; in nl80211_send_wowlan_nd()
13515 req->scan_plans[i].interval) || in nl80211_send_wowlan_nd()
13516 (req->scan_plans[i].iterations && in nl80211_send_wowlan_nd()
13518 req->scan_plans[i].iterations))) in nl80211_send_wowlan_nd()
13519 return -ENOBUFS; in nl80211_send_wowlan_nd()
13531 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_wowlan()
13536 if (!rdev->wiphy.wowlan) in nl80211_get_wowlan()
13537 return -EOPNOTSUPP; in nl80211_get_wowlan()
13539 if (rdev->wiphy.wowlan_config && rdev->wiphy.wowlan_config->tcp) { in nl80211_get_wowlan()
13541 size += rdev->wiphy.wowlan_config->tcp->tokens_size + in nl80211_get_wowlan()
13542 rdev->wiphy.wowlan_config->tcp->payload_len + in nl80211_get_wowlan()
13543 rdev->wiphy.wowlan_config->tcp->wake_len + in nl80211_get_wowlan()
13544 rdev->wiphy.wowlan_config->tcp->wake_len / 8; in nl80211_get_wowlan()
13549 return -ENOMEM; in nl80211_get_wowlan()
13551 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_wowlan()
13556 if (rdev->wiphy.wowlan_config) { in nl80211_get_wowlan()
13564 if ((rdev->wiphy.wowlan_config->any && in nl80211_get_wowlan()
13566 (rdev->wiphy.wowlan_config->disconnect && in nl80211_get_wowlan()
13568 (rdev->wiphy.wowlan_config->magic_pkt && in nl80211_get_wowlan()
13570 (rdev->wiphy.wowlan_config->gtk_rekey_failure && in nl80211_get_wowlan()
13572 (rdev->wiphy.wowlan_config->eap_identity_req && in nl80211_get_wowlan()
13574 (rdev->wiphy.wowlan_config->four_way_handshake && in nl80211_get_wowlan()
13576 (rdev->wiphy.wowlan_config->rfkill_release && in nl80211_get_wowlan()
13584 rdev->wiphy.wowlan_config->tcp)) in nl80211_get_wowlan()
13589 rdev->wiphy.wowlan_config->nd_config)) in nl80211_get_wowlan()
13600 return -ENOBUFS; in nl80211_get_wowlan()
13615 if (!rdev->wiphy.wowlan->tcp) in nl80211_parse_wowlan_tcp()
13616 return -EINVAL; in nl80211_parse_wowlan_tcp()
13631 return -EINVAL; in nl80211_parse_wowlan_tcp()
13634 if (data_size > rdev->wiphy.wowlan->tcp->data_payload_max) in nl80211_parse_wowlan_tcp()
13635 return -EINVAL; in nl80211_parse_wowlan_tcp()
13638 rdev->wiphy.wowlan->tcp->data_interval_max || in nl80211_parse_wowlan_tcp()
13640 return -EINVAL; in nl80211_parse_wowlan_tcp()
13643 if (wake_size > rdev->wiphy.wowlan->tcp->wake_payload_max) in nl80211_parse_wowlan_tcp()
13644 return -EINVAL; in nl80211_parse_wowlan_tcp()
13648 return -EINVAL; in nl80211_parse_wowlan_tcp()
13654 tokens_size = tokln - sizeof(*tok); in nl80211_parse_wowlan_tcp()
13656 if (!tok->len || tokens_size % tok->len) in nl80211_parse_wowlan_tcp()
13657 return -EINVAL; in nl80211_parse_wowlan_tcp()
13658 if (!rdev->wiphy.wowlan->tcp->tok) in nl80211_parse_wowlan_tcp()
13659 return -EINVAL; in nl80211_parse_wowlan_tcp()
13660 if (tok->len > rdev->wiphy.wowlan->tcp->tok->max_len) in nl80211_parse_wowlan_tcp()
13661 return -EINVAL; in nl80211_parse_wowlan_tcp()
13662 if (tok->len < rdev->wiphy.wowlan->tcp->tok->min_len) in nl80211_parse_wowlan_tcp()
13663 return -EINVAL; in nl80211_parse_wowlan_tcp()
13664 if (tokens_size > rdev->wiphy.wowlan->tcp->tok->bufsize) in nl80211_parse_wowlan_tcp()
13665 return -EINVAL; in nl80211_parse_wowlan_tcp()
13666 if (tok->offset + tok->len > data_size) in nl80211_parse_wowlan_tcp()
13667 return -EINVAL; in nl80211_parse_wowlan_tcp()
13672 if (!rdev->wiphy.wowlan->tcp->seq) in nl80211_parse_wowlan_tcp()
13673 return -EINVAL; in nl80211_parse_wowlan_tcp()
13674 if (seq->len == 0 || seq->len > 4) in nl80211_parse_wowlan_tcp()
13675 return -EINVAL; in nl80211_parse_wowlan_tcp()
13676 if (seq->len + seq->offset > data_size) in nl80211_parse_wowlan_tcp()
13677 return -EINVAL; in nl80211_parse_wowlan_tcp()
13687 return -ENOMEM; in nl80211_parse_wowlan_tcp()
13688 cfg->src = nla_get_in_addr(tb[NL80211_WOWLAN_TCP_SRC_IPV4]); in nl80211_parse_wowlan_tcp()
13689 cfg->dst = nla_get_in_addr(tb[NL80211_WOWLAN_TCP_DST_IPV4]); in nl80211_parse_wowlan_tcp()
13690 memcpy(cfg->dst_mac, nla_data(tb[NL80211_WOWLAN_TCP_DST_MAC]), in nl80211_parse_wowlan_tcp()
13695 err = __sock_create(wiphy_net(&rdev->wiphy), PF_INET, SOCK_STREAM, in nl80211_parse_wowlan_tcp()
13696 IPPROTO_TCP, &cfg->sock, 1); in nl80211_parse_wowlan_tcp()
13701 if (inet_csk_get_port(cfg->sock->sk, port)) { in nl80211_parse_wowlan_tcp()
13702 sock_release(cfg->sock); in nl80211_parse_wowlan_tcp()
13704 return -EADDRINUSE; in nl80211_parse_wowlan_tcp()
13706 cfg->src_port = inet_sk(cfg->sock->sk)->inet_num; in nl80211_parse_wowlan_tcp()
13710 return -EINVAL; in nl80211_parse_wowlan_tcp()
13712 cfg->src_port = port; in nl80211_parse_wowlan_tcp()
13715 cfg->dst_port = nla_get_u16(tb[NL80211_WOWLAN_TCP_DST_PORT]); in nl80211_parse_wowlan_tcp()
13716 cfg->payload_len = data_size; in nl80211_parse_wowlan_tcp()
13717 cfg->payload = (u8 *)cfg + sizeof(*cfg) + tokens_size; in nl80211_parse_wowlan_tcp()
13718 memcpy((void *)cfg->payload, in nl80211_parse_wowlan_tcp()
13722 cfg->payload_seq = *seq; in nl80211_parse_wowlan_tcp()
13723 cfg->data_interval = nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]); in nl80211_parse_wowlan_tcp()
13724 cfg->wake_len = wake_size; in nl80211_parse_wowlan_tcp()
13725 cfg->wake_data = (u8 *)cfg + sizeof(*cfg) + tokens_size + data_size; in nl80211_parse_wowlan_tcp()
13726 memcpy((void *)cfg->wake_data, in nl80211_parse_wowlan_tcp()
13729 cfg->wake_mask = (u8 *)cfg + sizeof(*cfg) + tokens_size + in nl80211_parse_wowlan_tcp()
13731 memcpy((void *)cfg->wake_mask, in nl80211_parse_wowlan_tcp()
13735 cfg->tokens_size = tokens_size; in nl80211_parse_wowlan_tcp()
13736 cfg->payload_tok = *tok; in nl80211_parse_wowlan_tcp()
13737 memcpy(cfg->payload_tok.token_stream, tok->token_stream, in nl80211_parse_wowlan_tcp()
13741 trig->tcp = cfg; in nl80211_parse_wowlan_tcp()
13756 return -ENOMEM; in nl80211_parse_wowlan_nd()
13758 if (!(wowlan->flags & WIPHY_WOWLAN_NET_DETECT)) { in nl80211_parse_wowlan_nd()
13759 err = -EOPNOTSUPP; in nl80211_parse_wowlan_nd()
13768 trig->nd_config = nl80211_parse_sched_scan(&rdev->wiphy, NULL, tb, in nl80211_parse_wowlan_nd()
13769 wowlan->max_nd_match_sets); in nl80211_parse_wowlan_nd()
13770 err = PTR_ERR_OR_ZERO(trig->nd_config); in nl80211_parse_wowlan_nd()
13772 trig->nd_config = NULL; in nl80211_parse_wowlan_nd()
13781 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_wowlan()
13785 const struct wiphy_wowlan_support *wowlan = rdev->wiphy.wowlan; in nl80211_set_wowlan()
13787 bool prev_enabled = rdev->wiphy.wowlan_config; in nl80211_set_wowlan()
13791 return -EOPNOTSUPP; in nl80211_set_wowlan()
13793 if (!info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS]) { in nl80211_set_wowlan()
13795 rdev->wiphy.wowlan_config = NULL; in nl80211_set_wowlan()
13800 info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS], in nl80211_set_wowlan()
13801 nl80211_wowlan_policy, info->extack); in nl80211_set_wowlan()
13806 if (!(wowlan->flags & WIPHY_WOWLAN_ANY)) in nl80211_set_wowlan()
13807 return -EINVAL; in nl80211_set_wowlan()
13812 if (!(wowlan->flags & WIPHY_WOWLAN_DISCONNECT)) in nl80211_set_wowlan()
13813 return -EINVAL; in nl80211_set_wowlan()
13819 if (!(wowlan->flags & WIPHY_WOWLAN_MAGIC_PKT)) in nl80211_set_wowlan()
13820 return -EINVAL; in nl80211_set_wowlan()
13826 return -EINVAL; in nl80211_set_wowlan()
13829 if (!(wowlan->flags & WIPHY_WOWLAN_GTK_REKEY_FAILURE)) in nl80211_set_wowlan()
13830 return -EINVAL; in nl80211_set_wowlan()
13836 if (!(wowlan->flags & WIPHY_WOWLAN_EAP_IDENTITY_REQ)) in nl80211_set_wowlan()
13837 return -EINVAL; in nl80211_set_wowlan()
13843 if (!(wowlan->flags & WIPHY_WOWLAN_4WAY_HANDSHAKE)) in nl80211_set_wowlan()
13844 return -EINVAL; in nl80211_set_wowlan()
13850 if (!(wowlan->flags & WIPHY_WOWLAN_RFKILL_RELEASE)) in nl80211_set_wowlan()
13851 return -EINVAL; in nl80211_set_wowlan()
13867 if (n_patterns > wowlan->n_patterns) in nl80211_set_wowlan()
13868 return -EINVAL; in nl80211_set_wowlan()
13874 return -ENOMEM; in nl80211_set_wowlan()
13887 info->extack); in nl80211_set_wowlan()
13891 err = -EINVAL; in nl80211_set_wowlan()
13899 if (pat_len > wowlan->pattern_max_len || in nl80211_set_wowlan()
13900 pat_len < wowlan->pattern_min_len) in nl80211_set_wowlan()
13906 if (pkt_offset > wowlan->max_pkt_offset) in nl80211_set_wowlan()
13912 err = -ENOMEM; in nl80211_set_wowlan()
13953 err = -EINVAL; in nl80211_set_wowlan()
13959 err = -ENOMEM; in nl80211_set_wowlan()
13963 rdev->wiphy.wowlan_config = ntrig; in nl80211_set_wowlan()
13966 if (rdev->ops->set_wakeup && in nl80211_set_wowlan()
13967 prev_enabled != !!rdev->wiphy.wowlan_config) in nl80211_set_wowlan()
13968 rdev_set_wakeup(rdev, rdev->wiphy.wowlan_config); in nl80211_set_wowlan()
13975 if (new_triggers.tcp && new_triggers.tcp->sock) in nl80211_set_wowlan()
13976 sock_release(new_triggers.tcp->sock); in nl80211_set_wowlan()
13990 if (!rdev->coalesce->n_rules) in nl80211_send_coalesce_rules()
13995 return -ENOBUFS; in nl80211_send_coalesce_rules()
13997 for (i = 0; i < rdev->coalesce->n_rules; i++) { in nl80211_send_coalesce_rules()
14000 return -ENOBUFS; in nl80211_send_coalesce_rules()
14002 rule = &rdev->coalesce->rules[i]; in nl80211_send_coalesce_rules()
14004 rule->delay)) in nl80211_send_coalesce_rules()
14005 return -ENOBUFS; in nl80211_send_coalesce_rules()
14008 rule->condition)) in nl80211_send_coalesce_rules()
14009 return -ENOBUFS; in nl80211_send_coalesce_rules()
14014 return -ENOBUFS; in nl80211_send_coalesce_rules()
14016 for (j = 0; j < rule->n_patterns; j++) { in nl80211_send_coalesce_rules()
14019 return -ENOBUFS; in nl80211_send_coalesce_rules()
14020 pat_len = rule->patterns[j].pattern_len; in nl80211_send_coalesce_rules()
14023 rule->patterns[j].mask) || in nl80211_send_coalesce_rules()
14025 rule->patterns[j].pattern) || in nl80211_send_coalesce_rules()
14027 rule->patterns[j].pkt_offset)) in nl80211_send_coalesce_rules()
14028 return -ENOBUFS; in nl80211_send_coalesce_rules()
14041 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_coalesce()
14045 if (!rdev->wiphy.coalesce) in nl80211_get_coalesce()
14046 return -EOPNOTSUPP; in nl80211_get_coalesce()
14050 return -ENOMEM; in nl80211_get_coalesce()
14052 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_coalesce()
14057 if (rdev->coalesce && nl80211_send_coalesce_rules(msg, rdev)) in nl80211_get_coalesce()
14065 return -ENOBUFS; in nl80211_get_coalesce()
14076 for (i = 0; i < coalesce->n_rules; i++) { in cfg80211_free_coalesce()
14077 rule = &coalesce->rules[i]; in cfg80211_free_coalesce()
14078 for (j = 0; j < rule->n_patterns; j++) in cfg80211_free_coalesce()
14079 kfree(rule->patterns[j].mask); in cfg80211_free_coalesce()
14080 kfree(rule->patterns); in cfg80211_free_coalesce()
14090 const struct wiphy_coalesce_support *coalesce = rdev->wiphy.coalesce; in nl80211_parse_coalesce_rule()
14101 new_rule->delay = in nl80211_parse_coalesce_rule()
14103 if (new_rule->delay > coalesce->max_delay) in nl80211_parse_coalesce_rule()
14104 return -EINVAL; in nl80211_parse_coalesce_rule()
14107 new_rule->condition = in nl80211_parse_coalesce_rule()
14111 return -EINVAL; in nl80211_parse_coalesce_rule()
14116 if (n_patterns > coalesce->n_patterns) in nl80211_parse_coalesce_rule()
14117 return -EINVAL; in nl80211_parse_coalesce_rule()
14119 new_rule->patterns = kcalloc(n_patterns, sizeof(new_rule->patterns[0]), in nl80211_parse_coalesce_rule()
14121 if (!new_rule->patterns) in nl80211_parse_coalesce_rule()
14122 return -ENOMEM; in nl80211_parse_coalesce_rule()
14124 new_rule->n_patterns = n_patterns; in nl80211_parse_coalesce_rule()
14140 return -EINVAL; in nl80211_parse_coalesce_rule()
14144 return -EINVAL; in nl80211_parse_coalesce_rule()
14145 if (pat_len > coalesce->pattern_max_len || in nl80211_parse_coalesce_rule()
14146 pat_len < coalesce->pattern_min_len) in nl80211_parse_coalesce_rule()
14147 return -EINVAL; in nl80211_parse_coalesce_rule()
14151 if (pkt_offset > coalesce->max_pkt_offset) in nl80211_parse_coalesce_rule()
14152 return -EINVAL; in nl80211_parse_coalesce_rule()
14153 new_rule->patterns[i].pkt_offset = pkt_offset; in nl80211_parse_coalesce_rule()
14157 return -ENOMEM; in nl80211_parse_coalesce_rule()
14159 new_rule->patterns[i].mask = mask_pat; in nl80211_parse_coalesce_rule()
14164 new_rule->patterns[i].pattern = mask_pat; in nl80211_parse_coalesce_rule()
14165 new_rule->patterns[i].pattern_len = pat_len; in nl80211_parse_coalesce_rule()
14176 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_coalesce()
14177 const struct wiphy_coalesce_support *coalesce = rdev->wiphy.coalesce; in nl80211_set_coalesce()
14182 if (!rdev->wiphy.coalesce || !rdev->ops->set_coalesce) in nl80211_set_coalesce()
14183 return -EOPNOTSUPP; in nl80211_set_coalesce()
14185 if (!info->attrs[NL80211_ATTR_COALESCE_RULE]) { in nl80211_set_coalesce()
14186 cfg80211_free_coalesce(rdev->coalesce); in nl80211_set_coalesce()
14187 rdev->coalesce = NULL; in nl80211_set_coalesce()
14192 nla_for_each_nested(rule, info->attrs[NL80211_ATTR_COALESCE_RULE], in nl80211_set_coalesce()
14195 if (n_rules > coalesce->n_rules) in nl80211_set_coalesce()
14196 return -EINVAL; in nl80211_set_coalesce()
14201 return -ENOMEM; in nl80211_set_coalesce()
14203 new_coalesce->n_rules = n_rules; in nl80211_set_coalesce()
14206 nla_for_each_nested(rule, info->attrs[NL80211_ATTR_COALESCE_RULE], in nl80211_set_coalesce()
14209 &new_coalesce->rules[i]); in nl80211_set_coalesce()
14220 cfg80211_free_coalesce(rdev->coalesce); in nl80211_set_coalesce()
14221 rdev->coalesce = new_coalesce; in nl80211_set_coalesce()
14232 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_rekey_data()
14233 struct net_device *dev = info->user_ptr[1]; in nl80211_set_rekey_data()
14234 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_rekey_data()
14239 if (!info->attrs[NL80211_ATTR_REKEY_DATA]) in nl80211_set_rekey_data()
14240 return -EINVAL; in nl80211_set_rekey_data()
14243 info->attrs[NL80211_ATTR_REKEY_DATA], in nl80211_set_rekey_data()
14244 nl80211_rekey_policy, info->extack); in nl80211_set_rekey_data()
14250 return -EINVAL; in nl80211_set_rekey_data()
14252 !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_EXT_KEK_KCK && in nl80211_set_rekey_data()
14254 return -ERANGE; in nl80211_set_rekey_data()
14256 !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_EXT_KEK_KCK && in nl80211_set_rekey_data()
14258 !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_EXT_KCK_32 && in nl80211_set_rekey_data()
14260 return -ERANGE; in nl80211_set_rekey_data()
14270 if (!wdev->connected) in nl80211_set_rekey_data()
14271 return -ENOTCONN; in nl80211_set_rekey_data()
14273 if (!rdev->ops->set_rekey_data) in nl80211_set_rekey_data()
14274 return -EOPNOTSUPP; in nl80211_set_rekey_data()
14282 struct net_device *dev = info->user_ptr[1]; in nl80211_register_unexpected_frame()
14283 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_register_unexpected_frame()
14285 if (wdev->iftype != NL80211_IFTYPE_AP && in nl80211_register_unexpected_frame()
14286 wdev->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_register_unexpected_frame()
14287 return -EINVAL; in nl80211_register_unexpected_frame()
14289 if (wdev->ap_unexpected_nlportid) in nl80211_register_unexpected_frame()
14290 return -EBUSY; in nl80211_register_unexpected_frame()
14292 wdev->ap_unexpected_nlportid = info->snd_portid; in nl80211_register_unexpected_frame()
14299 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_probe_client()
14300 struct net_device *dev = info->user_ptr[1]; in nl80211_probe_client()
14301 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_probe_client()
14308 if (wdev->iftype != NL80211_IFTYPE_AP && in nl80211_probe_client()
14309 wdev->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_probe_client()
14310 return -EOPNOTSUPP; in nl80211_probe_client()
14312 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_probe_client()
14313 return -EINVAL; in nl80211_probe_client()
14315 if (!rdev->ops->probe_client) in nl80211_probe_client()
14316 return -EOPNOTSUPP; in nl80211_probe_client()
14320 return -ENOMEM; in nl80211_probe_client()
14322 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_probe_client()
14325 err = -ENOBUFS; in nl80211_probe_client()
14329 addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_probe_client()
14344 err = -ENOBUFS; in nl80211_probe_client()
14352 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_register_beacons()
14356 if (!(rdev->wiphy.flags & WIPHY_FLAG_REPORTS_OBSS)) in nl80211_register_beacons()
14357 return -EOPNOTSUPP; in nl80211_register_beacons()
14361 return -ENOMEM; in nl80211_register_beacons()
14364 spin_lock_bh(&rdev->beacon_registrations_lock); in nl80211_register_beacons()
14365 list_for_each_entry(reg, &rdev->beacon_registrations, list) { in nl80211_register_beacons()
14366 if (reg->nlportid == info->snd_portid) { in nl80211_register_beacons()
14367 rv = -EALREADY; in nl80211_register_beacons()
14372 nreg->nlportid = info->snd_portid; in nl80211_register_beacons()
14373 list_add(&nreg->list, &rdev->beacon_registrations); in nl80211_register_beacons()
14375 spin_unlock_bh(&rdev->beacon_registrations_lock); in nl80211_register_beacons()
14379 spin_unlock_bh(&rdev->beacon_registrations_lock); in nl80211_register_beacons()
14386 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_start_p2p_device()
14387 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_start_p2p_device()
14390 if (!rdev->ops->start_p2p_device) in nl80211_start_p2p_device()
14391 return -EOPNOTSUPP; in nl80211_start_p2p_device()
14393 if (wdev->iftype != NL80211_IFTYPE_P2P_DEVICE) in nl80211_start_p2p_device()
14394 return -EOPNOTSUPP; in nl80211_start_p2p_device()
14399 if (rfkill_blocked(rdev->wiphy.rfkill)) in nl80211_start_p2p_device()
14400 return -ERFKILL; in nl80211_start_p2p_device()
14406 wdev->is_running = true; in nl80211_start_p2p_device()
14407 rdev->opencount++; in nl80211_start_p2p_device()
14414 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_stop_p2p_device()
14415 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_stop_p2p_device()
14417 if (wdev->iftype != NL80211_IFTYPE_P2P_DEVICE) in nl80211_stop_p2p_device()
14418 return -EOPNOTSUPP; in nl80211_stop_p2p_device()
14420 if (!rdev->ops->stop_p2p_device) in nl80211_stop_p2p_device()
14421 return -EOPNOTSUPP; in nl80211_stop_p2p_device()
14430 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_start_nan()
14431 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_start_nan()
14435 if (wdev->iftype != NL80211_IFTYPE_NAN) in nl80211_start_nan()
14436 return -EOPNOTSUPP; in nl80211_start_nan()
14439 return -EEXIST; in nl80211_start_nan()
14441 if (rfkill_blocked(rdev->wiphy.rfkill)) in nl80211_start_nan()
14442 return -ERFKILL; in nl80211_start_nan()
14444 if (!info->attrs[NL80211_ATTR_NAN_MASTER_PREF]) in nl80211_start_nan()
14445 return -EINVAL; in nl80211_start_nan()
14448 nla_get_u8(info->attrs[NL80211_ATTR_NAN_MASTER_PREF]); in nl80211_start_nan()
14450 if (info->attrs[NL80211_ATTR_BANDS]) { in nl80211_start_nan()
14451 u32 bands = nla_get_u32(info->attrs[NL80211_ATTR_BANDS]); in nl80211_start_nan()
14453 if (bands & ~(u32)wdev->wiphy->nan_supported_bands) in nl80211_start_nan()
14454 return -EOPNOTSUPP; in nl80211_start_nan()
14457 return -EINVAL; in nl80211_start_nan()
14466 wdev->is_running = true; in nl80211_start_nan()
14467 rdev->opencount++; in nl80211_start_nan()
14474 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_stop_nan()
14475 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_stop_nan()
14477 if (wdev->iftype != NL80211_IFTYPE_NAN) in nl80211_stop_nan()
14478 return -EOPNOTSUPP; in nl80211_stop_nan()
14496 return -EINVAL; in validate_nan_filter()
14513 BUILD_BUG_ON(sizeof(*func->rx_filters) != sizeof(*func->tx_filters)); in handle_nan_filter()
14515 filter = kcalloc(n_entries, sizeof(*func->rx_filters), GFP_KERNEL); in handle_nan_filter()
14517 return -ENOMEM; in handle_nan_filter()
14529 func->num_tx_filters = n_entries; in handle_nan_filter()
14530 func->tx_filters = filter; in handle_nan_filter()
14532 func->num_rx_filters = n_entries; in handle_nan_filter()
14533 func->rx_filters = filter; in handle_nan_filter()
14545 return -ENOMEM; in handle_nan_filter()
14551 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_nan_add_func()
14552 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_nan_add_func()
14559 if (wdev->iftype != NL80211_IFTYPE_NAN) in nl80211_nan_add_func()
14560 return -EOPNOTSUPP; in nl80211_nan_add_func()
14563 return -ENOTCONN; in nl80211_nan_add_func()
14565 if (!info->attrs[NL80211_ATTR_NAN_FUNC]) in nl80211_nan_add_func()
14566 return -EINVAL; in nl80211_nan_add_func()
14569 info->attrs[NL80211_ATTR_NAN_FUNC], in nl80211_nan_add_func()
14571 info->extack); in nl80211_nan_add_func()
14577 return -ENOMEM; in nl80211_nan_add_func()
14579 func->cookie = cfg80211_assign_cookie(rdev); in nl80211_nan_add_func()
14582 err = -EINVAL; in nl80211_nan_add_func()
14587 func->type = nla_get_u8(tb[NL80211_NAN_FUNC_TYPE]); in nl80211_nan_add_func()
14590 err = -EINVAL; in nl80211_nan_add_func()
14594 memcpy(func->service_id, nla_data(tb[NL80211_NAN_FUNC_SERVICE_ID]), in nl80211_nan_add_func()
14595 sizeof(func->service_id)); in nl80211_nan_add_func()
14597 func->close_range = in nl80211_nan_add_func()
14601 func->serv_spec_info_len = in nl80211_nan_add_func()
14603 func->serv_spec_info = in nl80211_nan_add_func()
14605 func->serv_spec_info_len, in nl80211_nan_add_func()
14607 if (!func->serv_spec_info) { in nl80211_nan_add_func()
14608 err = -ENOMEM; in nl80211_nan_add_func()
14614 func->ttl = nla_get_u32(tb[NL80211_NAN_FUNC_TTL]); in nl80211_nan_add_func()
14616 switch (func->type) { in nl80211_nan_add_func()
14619 err = -EINVAL; in nl80211_nan_add_func()
14623 func->publish_type = in nl80211_nan_add_func()
14625 func->publish_bcast = in nl80211_nan_add_func()
14628 if ((!(func->publish_type & NL80211_NAN_SOLICITED_PUBLISH)) && in nl80211_nan_add_func()
14629 func->publish_bcast) { in nl80211_nan_add_func()
14630 err = -EINVAL; in nl80211_nan_add_func()
14635 func->subscribe_active = in nl80211_nan_add_func()
14642 err = -EINVAL; in nl80211_nan_add_func()
14646 func->followup_id = in nl80211_nan_add_func()
14648 func->followup_reqid = in nl80211_nan_add_func()
14650 memcpy(func->followup_dest.addr, in nl80211_nan_add_func()
14652 sizeof(func->followup_dest.addr)); in nl80211_nan_add_func()
14653 if (func->ttl) { in nl80211_nan_add_func()
14654 err = -EINVAL; in nl80211_nan_add_func()
14659 err = -EINVAL; in nl80211_nan_add_func()
14670 info->extack); in nl80211_nan_add_func()
14674 func->srf_include = in nl80211_nan_add_func()
14680 err = -EINVAL; in nl80211_nan_add_func()
14684 func->srf_bf_len = in nl80211_nan_add_func()
14686 func->srf_bf = in nl80211_nan_add_func()
14688 func->srf_bf_len, GFP_KERNEL); in nl80211_nan_add_func()
14689 if (!func->srf_bf) { in nl80211_nan_add_func()
14690 err = -ENOMEM; in nl80211_nan_add_func()
14694 func->srf_bf_idx = in nl80211_nan_add_func()
14702 err = -EINVAL; in nl80211_nan_add_func()
14708 err = -EINVAL; in nl80211_nan_add_func()
14712 func->srf_num_macs = n_entries; in nl80211_nan_add_func()
14713 func->srf_macs = in nl80211_nan_add_func()
14714 kcalloc(n_entries, sizeof(*func->srf_macs), in nl80211_nan_add_func()
14716 if (!func->srf_macs) { in nl80211_nan_add_func()
14717 err = -ENOMEM; in nl80211_nan_add_func()
14722 memcpy(func->srf_macs[i++].addr, nla_data(attr), in nl80211_nan_add_func()
14723 sizeof(*func->srf_macs)); in nl80211_nan_add_func()
14743 err = -ENOMEM; in nl80211_nan_add_func()
14747 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_nan_add_func()
14749 /* This can't really happen - we just allocated 4KB */ in nl80211_nan_add_func()
14751 err = -ENOMEM; in nl80211_nan_add_func()
14764 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, func->cookie, in nl80211_nan_add_func()
14773 func->instance_id)) in nl80211_nan_add_func()
14783 return -ENOBUFS; in nl80211_nan_add_func()
14789 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_nan_del_func()
14790 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_nan_del_func()
14793 if (wdev->iftype != NL80211_IFTYPE_NAN) in nl80211_nan_del_func()
14794 return -EOPNOTSUPP; in nl80211_nan_del_func()
14797 return -ENOTCONN; in nl80211_nan_del_func()
14799 if (!info->attrs[NL80211_ATTR_COOKIE]) in nl80211_nan_del_func()
14800 return -EINVAL; in nl80211_nan_del_func()
14802 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); in nl80211_nan_del_func()
14812 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_nan_change_config()
14813 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_nan_change_config()
14817 if (wdev->iftype != NL80211_IFTYPE_NAN) in nl80211_nan_change_config()
14818 return -EOPNOTSUPP; in nl80211_nan_change_config()
14821 return -ENOTCONN; in nl80211_nan_change_config()
14823 if (info->attrs[NL80211_ATTR_NAN_MASTER_PREF]) { in nl80211_nan_change_config()
14825 nla_get_u8(info->attrs[NL80211_ATTR_NAN_MASTER_PREF]); in nl80211_nan_change_config()
14827 return -EINVAL; in nl80211_nan_change_config()
14832 if (info->attrs[NL80211_ATTR_BANDS]) { in nl80211_nan_change_config()
14833 u32 bands = nla_get_u32(info->attrs[NL80211_ATTR_BANDS]); in nl80211_nan_change_config()
14835 if (bands & ~(u32)wdev->wiphy->nan_supported_bands) in nl80211_nan_change_config()
14836 return -EOPNOTSUPP; in nl80211_nan_change_config()
14839 return -EINVAL; in nl80211_nan_change_config()
14846 return -EINVAL; in nl80211_nan_change_config()
14854 struct wiphy *wiphy = wdev->wiphy; in cfg80211_nan_match()
14860 if (WARN_ON(!match->inst_id || !match->peer_inst_id || !match->addr)) in cfg80211_nan_match()
14873 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_nan_match()
14874 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, in cfg80211_nan_match()
14875 wdev->netdev->ifindex)) || in cfg80211_nan_match()
14880 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, match->cookie, in cfg80211_nan_match()
14882 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, match->addr)) in cfg80211_nan_match()
14894 if (nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, match->inst_id)) in cfg80211_nan_match()
14904 if (nla_put_u8(msg, NL80211_NAN_FUNC_TYPE, match->type) || in cfg80211_nan_match()
14905 nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, match->peer_inst_id)) in cfg80211_nan_match()
14908 if (match->info && match->info_len && in cfg80211_nan_match()
14909 nla_put(msg, NL80211_NAN_FUNC_SERVICE_INFO, match->info_len, in cfg80211_nan_match()
14910 match->info)) in cfg80211_nan_match()
14917 if (!wdev->owner_nlportid) in cfg80211_nan_match()
14918 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), in cfg80211_nan_match()
14921 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, in cfg80211_nan_match()
14922 wdev->owner_nlportid); in cfg80211_nan_match()
14936 struct wiphy *wiphy = wdev->wiphy; in cfg80211_nan_func_terminated()
14955 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_nan_func_terminated()
14956 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, in cfg80211_nan_func_terminated()
14957 wdev->netdev->ifindex)) || in cfg80211_nan_func_terminated()
14977 if (!wdev->owner_nlportid) in cfg80211_nan_func_terminated()
14978 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), in cfg80211_nan_func_terminated()
14981 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, in cfg80211_nan_func_terminated()
14982 wdev->owner_nlportid); in cfg80211_nan_func_terminated()
14999 return -ENOMEM; in nl80211_get_protocol_features()
15001 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_protocol_features()
15015 return -ENOBUFS; in nl80211_get_protocol_features()
15020 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_update_ft_ies()
15022 struct net_device *dev = info->user_ptr[1]; in nl80211_update_ft_ies()
15024 if (!rdev->ops->update_ft_ies) in nl80211_update_ft_ies()
15025 return -EOPNOTSUPP; in nl80211_update_ft_ies()
15027 if (!info->attrs[NL80211_ATTR_MDID] || in nl80211_update_ft_ies()
15028 !info->attrs[NL80211_ATTR_IE]) in nl80211_update_ft_ies()
15029 return -EINVAL; in nl80211_update_ft_ies()
15032 ft_params.md = nla_get_u16(info->attrs[NL80211_ATTR_MDID]); in nl80211_update_ft_ies()
15033 ft_params.ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_update_ft_ies()
15034 ft_params.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_update_ft_ies()
15042 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_crit_protocol_start()
15043 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_crit_protocol_start()
15048 if (!rdev->ops->crit_proto_start) in nl80211_crit_protocol_start()
15049 return -EOPNOTSUPP; in nl80211_crit_protocol_start()
15051 if (WARN_ON(!rdev->ops->crit_proto_stop)) in nl80211_crit_protocol_start()
15052 return -EINVAL; in nl80211_crit_protocol_start()
15054 if (rdev->crit_proto_nlportid) in nl80211_crit_protocol_start()
15055 return -EBUSY; in nl80211_crit_protocol_start()
15058 if (info->attrs[NL80211_ATTR_CRIT_PROT_ID]) in nl80211_crit_protocol_start()
15059 proto = nla_get_u16(info->attrs[NL80211_ATTR_CRIT_PROT_ID]); in nl80211_crit_protocol_start()
15062 return -EINVAL; in nl80211_crit_protocol_start()
15065 if (!info->attrs[NL80211_ATTR_MAX_CRIT_PROT_DURATION]) in nl80211_crit_protocol_start()
15066 return -EINVAL; in nl80211_crit_protocol_start()
15069 nla_get_u16(info->attrs[NL80211_ATTR_MAX_CRIT_PROT_DURATION]); in nl80211_crit_protocol_start()
15073 rdev->crit_proto_nlportid = info->snd_portid; in nl80211_crit_protocol_start()
15081 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_crit_protocol_stop()
15082 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_crit_protocol_stop()
15084 if (!rdev->ops->crit_proto_stop) in nl80211_crit_protocol_stop()
15085 return -EOPNOTSUPP; in nl80211_crit_protocol_stop()
15087 if (rdev->crit_proto_nlportid) { in nl80211_crit_protocol_stop()
15088 rdev->crit_proto_nlportid = 0; in nl80211_crit_protocol_stop()
15098 if (vcmd->policy == VENDOR_CMD_RAW_DATA) { in nl80211_vendor_check_policy()
15099 if (attr->nla_type & NLA_F_NESTED) { in nl80211_vendor_check_policy()
15102 return -EINVAL; in nl80211_vendor_check_policy()
15108 if (!(attr->nla_type & NLA_F_NESTED)) { in nl80211_vendor_check_policy()
15110 return -EINVAL; in nl80211_vendor_check_policy()
15113 return nla_validate_nested(attr, vcmd->maxattr, vcmd->policy, extack); in nl80211_vendor_check_policy()
15118 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_vendor_cmd()
15121 info->attrs); in nl80211_vendor_cmd()
15125 if (!rdev->wiphy.vendor_commands) in nl80211_vendor_cmd()
15126 return -EOPNOTSUPP; in nl80211_vendor_cmd()
15130 if (err != -EINVAL) in nl80211_vendor_cmd()
15133 } else if (wdev->wiphy != &rdev->wiphy) { in nl80211_vendor_cmd()
15134 return -EINVAL; in nl80211_vendor_cmd()
15137 if (!info->attrs[NL80211_ATTR_VENDOR_ID] || in nl80211_vendor_cmd()
15138 !info->attrs[NL80211_ATTR_VENDOR_SUBCMD]) in nl80211_vendor_cmd()
15139 return -EINVAL; in nl80211_vendor_cmd()
15141 vid = nla_get_u32(info->attrs[NL80211_ATTR_VENDOR_ID]); in nl80211_vendor_cmd()
15142 subcmd = nla_get_u32(info->attrs[NL80211_ATTR_VENDOR_SUBCMD]); in nl80211_vendor_cmd()
15143 for (i = 0; i < rdev->wiphy.n_vendor_commands; i++) { in nl80211_vendor_cmd()
15148 vcmd = &rdev->wiphy.vendor_commands[i]; in nl80211_vendor_cmd()
15150 if (vcmd->info.vendor_id != vid || vcmd->info.subcmd != subcmd) in nl80211_vendor_cmd()
15153 if (vcmd->flags & (WIPHY_VENDOR_CMD_NEED_WDEV | in nl80211_vendor_cmd()
15156 return -EINVAL; in nl80211_vendor_cmd()
15157 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_NETDEV && in nl80211_vendor_cmd()
15158 !wdev->netdev) in nl80211_vendor_cmd()
15159 return -EINVAL; in nl80211_vendor_cmd()
15161 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_RUNNING) { in nl80211_vendor_cmd()
15163 return -ENETDOWN; in nl80211_vendor_cmd()
15169 if (!vcmd->doit) in nl80211_vendor_cmd()
15170 return -EOPNOTSUPP; in nl80211_vendor_cmd()
15172 if (info->attrs[NL80211_ATTR_VENDOR_DATA]) { in nl80211_vendor_cmd()
15173 data = nla_data(info->attrs[NL80211_ATTR_VENDOR_DATA]); in nl80211_vendor_cmd()
15174 len = nla_len(info->attrs[NL80211_ATTR_VENDOR_DATA]); in nl80211_vendor_cmd()
15177 info->attrs[NL80211_ATTR_VENDOR_DATA], in nl80211_vendor_cmd()
15178 info->extack); in nl80211_vendor_cmd()
15183 rdev->cur_cmd_info = info; in nl80211_vendor_cmd()
15184 err = vcmd->doit(&rdev->wiphy, wdev, data, len); in nl80211_vendor_cmd()
15185 rdev->cur_cmd_info = NULL; in nl80211_vendor_cmd()
15189 return -EOPNOTSUPP; in nl80211_vendor_cmd()
15200 int vcmd_idx = -1; in nl80211_prepare_vendor_dump()
15205 if (cb->args[0]) { in nl80211_prepare_vendor_dump()
15207 struct wiphy *wiphy = wiphy_idx_to_wiphy(cb->args[0] - 1); in nl80211_prepare_vendor_dump()
15211 return -ENODEV; in nl80211_prepare_vendor_dump()
15215 if (cb->args[1]) { in nl80211_prepare_vendor_dump()
15216 list_for_each_entry(tmp, &wiphy->wdev_list, list) { in nl80211_prepare_vendor_dump()
15217 if (tmp->identifier == cb->args[1] - 1) { in nl80211_prepare_vendor_dump()
15230 return -ENOMEM; in nl80211_prepare_vendor_dump()
15232 err = nlmsg_parse_deprecated(cb->nlh, in nl80211_prepare_vendor_dump()
15241 err = -EINVAL; in nl80211_prepare_vendor_dump()
15245 *wdev = __cfg80211_wdev_from_attrs(NULL, sock_net(skb->sk), attrbuf); in nl80211_prepare_vendor_dump()
15249 *rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk), attrbuf); in nl80211_prepare_vendor_dump()
15258 for (i = 0; i < (*rdev)->wiphy.n_vendor_commands; i++) { in nl80211_prepare_vendor_dump()
15261 vcmd = &(*rdev)->wiphy.vendor_commands[i]; in nl80211_prepare_vendor_dump()
15263 if (vcmd->info.vendor_id != vid || vcmd->info.subcmd != subcmd) in nl80211_prepare_vendor_dump()
15266 if (!vcmd->dumpit) { in nl80211_prepare_vendor_dump()
15267 err = -EOPNOTSUPP; in nl80211_prepare_vendor_dump()
15276 err = -EOPNOTSUPP; in nl80211_prepare_vendor_dump()
15285 &(*rdev)->wiphy.vendor_commands[vcmd_idx], in nl80211_prepare_vendor_dump()
15287 cb->extack); in nl80211_prepare_vendor_dump()
15292 /* 0 is the first index - add 1 to parse only once */ in nl80211_prepare_vendor_dump()
15293 cb->args[0] = (*rdev)->wiphy_idx + 1; in nl80211_prepare_vendor_dump()
15295 cb->args[1] = *wdev ? (*wdev)->identifier + 1 : 0; in nl80211_prepare_vendor_dump()
15296 cb->args[2] = vcmd_idx; in nl80211_prepare_vendor_dump()
15297 cb->args[3] = (unsigned long)data; in nl80211_prepare_vendor_dump()
15298 cb->args[4] = data_len; in nl80211_prepare_vendor_dump()
15324 vcmd_idx = cb->args[2]; in nl80211_vendor_cmd_dump()
15325 data = (void *)cb->args[3]; in nl80211_vendor_cmd_dump()
15326 data_len = cb->args[4]; in nl80211_vendor_cmd_dump()
15327 vcmd = &rdev->wiphy.vendor_commands[vcmd_idx]; in nl80211_vendor_cmd_dump()
15329 if (vcmd->flags & (WIPHY_VENDOR_CMD_NEED_WDEV | in nl80211_vendor_cmd_dump()
15332 err = -EINVAL; in nl80211_vendor_cmd_dump()
15335 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_NETDEV && in nl80211_vendor_cmd_dump()
15336 !wdev->netdev) { in nl80211_vendor_cmd_dump()
15337 err = -EINVAL; in nl80211_vendor_cmd_dump()
15341 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_RUNNING) { in nl80211_vendor_cmd_dump()
15343 err = -ENETDOWN; in nl80211_vendor_cmd_dump()
15350 void *hdr = nl80211hdr_put(skb, NETLINK_CB(cb->skb).portid, in nl80211_vendor_cmd_dump()
15351 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_vendor_cmd_dump()
15356 if (nla_put_u32(skb, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_vendor_cmd_dump()
15371 err = vcmd->dumpit(&rdev->wiphy, wdev, skb, data, data_len, in nl80211_vendor_cmd_dump()
15372 (unsigned long *)&cb->args[5]); in nl80211_vendor_cmd_dump()
15375 if (err == -ENOBUFS || err == -ENOENT) { in nl80211_vendor_cmd_dump()
15386 err = skb->len; in nl80211_vendor_cmd_dump()
15399 if (WARN_ON(!rdev->cur_cmd_info)) in __cfg80211_alloc_reply_skb()
15403 rdev->cur_cmd_info->snd_portid, in __cfg80211_alloc_reply_skb()
15404 rdev->cur_cmd_info->snd_seq, in __cfg80211_alloc_reply_skb()
15411 struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0]; in cfg80211_vendor_cmd_reply()
15412 void *hdr = ((void **)skb->cb)[1]; in cfg80211_vendor_cmd_reply()
15413 struct nlattr *data = ((void **)skb->cb)[2]; in cfg80211_vendor_cmd_reply()
15416 memset(skb->cb, 0, sizeof(skb->cb)); in cfg80211_vendor_cmd_reply()
15418 if (WARN_ON(!rdev->cur_cmd_info)) { in cfg80211_vendor_cmd_reply()
15420 return -EINVAL; in cfg80211_vendor_cmd_reply()
15425 return genlmsg_reply(skb, rdev->cur_cmd_info); in cfg80211_vendor_cmd_reply()
15433 if (WARN_ON(!rdev->cur_cmd_info)) in cfg80211_vendor_cmd_get_sender()
15436 return rdev->cur_cmd_info->snd_portid; in cfg80211_vendor_cmd_get_sender()
15443 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_qos_map()
15445 struct net_device *dev = info->user_ptr[1]; in nl80211_set_qos_map()
15449 if (!rdev->ops->set_qos_map) in nl80211_set_qos_map()
15450 return -EOPNOTSUPP; in nl80211_set_qos_map()
15452 if (info->attrs[NL80211_ATTR_QOS_MAP]) { in nl80211_set_qos_map()
15453 pos = nla_data(info->attrs[NL80211_ATTR_QOS_MAP]); in nl80211_set_qos_map()
15454 len = nla_len(info->attrs[NL80211_ATTR_QOS_MAP]); in nl80211_set_qos_map()
15457 return -EINVAL; in nl80211_set_qos_map()
15461 return -ENOMEM; in nl80211_set_qos_map()
15463 num_des = (len - IEEE80211_QOS_MAP_LEN_MIN) >> 1; in nl80211_set_qos_map()
15467 memcpy(qos_map->dscp_exception, pos, des_len); in nl80211_set_qos_map()
15468 qos_map->num_des = num_des; in nl80211_set_qos_map()
15470 if (qos_map->dscp_exception[des].up > 7) { in nl80211_set_qos_map()
15472 return -EINVAL; in nl80211_set_qos_map()
15477 memcpy(qos_map->up, pos, IEEE80211_QOS_MAP_LEN_MIN); in nl80211_set_qos_map()
15480 ret = nl80211_key_allowed(dev->ieee80211_ptr); in nl80211_set_qos_map()
15490 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_add_tx_ts()
15491 struct net_device *dev = info->user_ptr[1]; in nl80211_add_tx_ts()
15492 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_add_tx_ts()
15497 if (!(rdev->wiphy.features & NL80211_FEATURE_SUPPORTS_WMM_ADMISSION)) in nl80211_add_tx_ts()
15498 return -EOPNOTSUPP; in nl80211_add_tx_ts()
15500 if (!info->attrs[NL80211_ATTR_TSID] || !info->attrs[NL80211_ATTR_MAC] || in nl80211_add_tx_ts()
15501 !info->attrs[NL80211_ATTR_USER_PRIO]) in nl80211_add_tx_ts()
15502 return -EINVAL; in nl80211_add_tx_ts()
15504 tsid = nla_get_u8(info->attrs[NL80211_ATTR_TSID]); in nl80211_add_tx_ts()
15505 up = nla_get_u8(info->attrs[NL80211_ATTR_USER_PRIO]); in nl80211_add_tx_ts()
15507 /* WMM uses TIDs 0-7 even for TSPEC */ in nl80211_add_tx_ts()
15513 return -EINVAL; in nl80211_add_tx_ts()
15516 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_add_tx_ts()
15518 if (info->attrs[NL80211_ATTR_ADMITTED_TIME]) { in nl80211_add_tx_ts()
15520 nla_get_u16(info->attrs[NL80211_ATTR_ADMITTED_TIME]); in nl80211_add_tx_ts()
15522 return -EINVAL; in nl80211_add_tx_ts()
15525 switch (wdev->iftype) { in nl80211_add_tx_ts()
15528 if (wdev->connected) in nl80211_add_tx_ts()
15530 return -ENOTCONN; in nl80211_add_tx_ts()
15532 return -EOPNOTSUPP; in nl80211_add_tx_ts()
15540 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_del_tx_ts()
15541 struct net_device *dev = info->user_ptr[1]; in nl80211_del_tx_ts()
15545 if (!info->attrs[NL80211_ATTR_TSID] || !info->attrs[NL80211_ATTR_MAC]) in nl80211_del_tx_ts()
15546 return -EINVAL; in nl80211_del_tx_ts()
15548 tsid = nla_get_u8(info->attrs[NL80211_ATTR_TSID]); in nl80211_del_tx_ts()
15549 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_del_tx_ts()
15557 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_tdls_channel_switch()
15558 struct net_device *dev = info->user_ptr[1]; in nl80211_tdls_channel_switch()
15559 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_tdls_channel_switch()
15565 if (!rdev->ops->tdls_channel_switch || in nl80211_tdls_channel_switch()
15566 !(rdev->wiphy.features & NL80211_FEATURE_TDLS_CHANNEL_SWITCH)) in nl80211_tdls_channel_switch()
15567 return -EOPNOTSUPP; in nl80211_tdls_channel_switch()
15569 switch (dev->ieee80211_ptr->iftype) { in nl80211_tdls_channel_switch()
15574 return -EOPNOTSUPP; in nl80211_tdls_channel_switch()
15577 if (!info->attrs[NL80211_ATTR_MAC] || in nl80211_tdls_channel_switch()
15578 !info->attrs[NL80211_ATTR_OPER_CLASS]) in nl80211_tdls_channel_switch()
15579 return -EINVAL; in nl80211_tdls_channel_switch()
15586 * Don't allow wide channels on the 2.4Ghz band, as per IEEE802.11-2012 in nl80211_tdls_channel_switch()
15590 if (chandef.chan->band == NL80211_BAND_2GHZ && in nl80211_tdls_channel_switch()
15593 return -EINVAL; in nl80211_tdls_channel_switch()
15596 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &chandef, in nl80211_tdls_channel_switch()
15597 wdev->iftype)) in nl80211_tdls_channel_switch()
15598 return -EINVAL; in nl80211_tdls_channel_switch()
15601 if (cfg80211_chandef_dfs_required(wdev->wiphy, &chandef, wdev->iftype)) in nl80211_tdls_channel_switch()
15602 return -EINVAL; in nl80211_tdls_channel_switch()
15604 addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_tdls_channel_switch()
15605 oper_class = nla_get_u8(info->attrs[NL80211_ATTR_OPER_CLASS]); in nl80211_tdls_channel_switch()
15613 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_tdls_cancel_channel_switch()
15614 struct net_device *dev = info->user_ptr[1]; in nl80211_tdls_cancel_channel_switch()
15617 if (!rdev->ops->tdls_channel_switch || in nl80211_tdls_cancel_channel_switch()
15618 !rdev->ops->tdls_cancel_channel_switch || in nl80211_tdls_cancel_channel_switch()
15619 !(rdev->wiphy.features & NL80211_FEATURE_TDLS_CHANNEL_SWITCH)) in nl80211_tdls_cancel_channel_switch()
15620 return -EOPNOTSUPP; in nl80211_tdls_cancel_channel_switch()
15622 switch (dev->ieee80211_ptr->iftype) { in nl80211_tdls_cancel_channel_switch()
15627 return -EOPNOTSUPP; in nl80211_tdls_cancel_channel_switch()
15630 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_tdls_cancel_channel_switch()
15631 return -EINVAL; in nl80211_tdls_cancel_channel_switch()
15633 addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_tdls_cancel_channel_switch()
15643 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_multicast_to_unicast()
15644 struct net_device *dev = info->user_ptr[1]; in nl80211_set_multicast_to_unicast()
15645 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_multicast_to_unicast()
15649 if (!rdev->ops->set_multicast_to_unicast) in nl80211_set_multicast_to_unicast()
15650 return -EOPNOTSUPP; in nl80211_set_multicast_to_unicast()
15652 if (wdev->iftype != NL80211_IFTYPE_AP && in nl80211_set_multicast_to_unicast()
15653 wdev->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_set_multicast_to_unicast()
15654 return -EOPNOTSUPP; in nl80211_set_multicast_to_unicast()
15656 nla = info->attrs[NL80211_ATTR_MULTICAST_TO_UNICAST_ENABLED]; in nl80211_set_multicast_to_unicast()
15664 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_pmk()
15665 struct net_device *dev = info->user_ptr[1]; in nl80211_set_pmk()
15666 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_pmk()
15669 if (wdev->iftype != NL80211_IFTYPE_STATION && in nl80211_set_pmk()
15670 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_set_pmk()
15671 return -EOPNOTSUPP; in nl80211_set_pmk()
15673 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_set_pmk()
15675 return -EOPNOTSUPP; in nl80211_set_pmk()
15677 if (!info->attrs[NL80211_ATTR_MAC] || !info->attrs[NL80211_ATTR_PMK]) in nl80211_set_pmk()
15678 return -EINVAL; in nl80211_set_pmk()
15680 if (!wdev->connected) in nl80211_set_pmk()
15681 return -ENOTCONN; in nl80211_set_pmk()
15683 pmk_conf.aa = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_set_pmk()
15684 if (memcmp(pmk_conf.aa, wdev->u.client.connected_addr, ETH_ALEN)) in nl80211_set_pmk()
15685 return -EINVAL; in nl80211_set_pmk()
15687 pmk_conf.pmk = nla_data(info->attrs[NL80211_ATTR_PMK]); in nl80211_set_pmk()
15688 pmk_conf.pmk_len = nla_len(info->attrs[NL80211_ATTR_PMK]); in nl80211_set_pmk()
15691 return -EINVAL; in nl80211_set_pmk()
15693 if (info->attrs[NL80211_ATTR_PMKR0_NAME]) in nl80211_set_pmk()
15695 nla_data(info->attrs[NL80211_ATTR_PMKR0_NAME]); in nl80211_set_pmk()
15702 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_del_pmk()
15703 struct net_device *dev = info->user_ptr[1]; in nl80211_del_pmk()
15704 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_del_pmk()
15707 if (wdev->iftype != NL80211_IFTYPE_STATION && in nl80211_del_pmk()
15708 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_del_pmk()
15709 return -EOPNOTSUPP; in nl80211_del_pmk()
15711 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_del_pmk()
15713 return -EOPNOTSUPP; in nl80211_del_pmk()
15715 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_del_pmk()
15716 return -EINVAL; in nl80211_del_pmk()
15718 aa = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_del_pmk()
15724 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_external_auth()
15725 struct net_device *dev = info->user_ptr[1]; in nl80211_external_auth()
15728 if (!rdev->ops->external_auth) in nl80211_external_auth()
15729 return -EOPNOTSUPP; in nl80211_external_auth()
15731 if (!info->attrs[NL80211_ATTR_SSID] && in nl80211_external_auth()
15732 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && in nl80211_external_auth()
15733 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_external_auth()
15734 return -EINVAL; in nl80211_external_auth()
15736 if (!info->attrs[NL80211_ATTR_BSSID]) in nl80211_external_auth()
15737 return -EINVAL; in nl80211_external_auth()
15739 if (!info->attrs[NL80211_ATTR_STATUS_CODE]) in nl80211_external_auth()
15740 return -EINVAL; in nl80211_external_auth()
15744 if (info->attrs[NL80211_ATTR_SSID]) { in nl80211_external_auth()
15745 params.ssid.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); in nl80211_external_auth()
15747 return -EINVAL; in nl80211_external_auth()
15749 nla_data(info->attrs[NL80211_ATTR_SSID]), in nl80211_external_auth()
15753 memcpy(params.bssid, nla_data(info->attrs[NL80211_ATTR_BSSID]), in nl80211_external_auth()
15756 params.status = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]); in nl80211_external_auth()
15758 if (info->attrs[NL80211_ATTR_PMKID]) in nl80211_external_auth()
15759 params.pmkid = nla_data(info->attrs[NL80211_ATTR_PMKID]); in nl80211_external_auth()
15766 bool dont_wait_for_ack = info->attrs[NL80211_ATTR_DONT_WAIT_FOR_ACK]; in nl80211_tx_control_port()
15767 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_tx_control_port()
15768 struct net_device *dev = info->user_ptr[1]; in nl80211_tx_control_port()
15769 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_tx_control_port()
15779 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_tx_control_port()
15781 return -EOPNOTSUPP; in nl80211_tx_control_port()
15783 if (!rdev->ops->tx_control_port) in nl80211_tx_control_port()
15784 return -EOPNOTSUPP; in nl80211_tx_control_port()
15786 if (!info->attrs[NL80211_ATTR_FRAME] || in nl80211_tx_control_port()
15787 !info->attrs[NL80211_ATTR_MAC] || in nl80211_tx_control_port()
15788 !info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]) { in nl80211_tx_control_port()
15790 return -EINVAL; in nl80211_tx_control_port()
15793 switch (wdev->iftype) { in nl80211_tx_control_port()
15799 if (wdev->u.ibss.current_bss) in nl80211_tx_control_port()
15801 return -ENOTCONN; in nl80211_tx_control_port()
15804 if (wdev->connected) in nl80211_tx_control_port()
15806 return -ENOTCONN; in nl80211_tx_control_port()
15808 return -EOPNOTSUPP; in nl80211_tx_control_port()
15811 buf = nla_data(info->attrs[NL80211_ATTR_FRAME]); in nl80211_tx_control_port()
15812 len = nla_len(info->attrs[NL80211_ATTR_FRAME]); in nl80211_tx_control_port()
15813 dest = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_tx_control_port()
15814 proto = nla_get_u16(info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]); in nl80211_tx_control_port()
15816 nla_get_flag(info->attrs[NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT]); in nl80211_tx_control_port()
15818 link_id = nl80211_link_id_or_invalid(info->attrs); in nl80211_tx_control_port()
15824 nl_set_extack_cookie_u64(info->extack, cookie); in nl80211_tx_control_port()
15831 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_ftm_responder_stats()
15832 struct net_device *dev = info->user_ptr[1]; in nl80211_get_ftm_responder_stats()
15833 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_get_ftm_responder_stats()
15835 unsigned int link_id = nl80211_link_id(info->attrs); in nl80211_get_ftm_responder_stats()
15841 if (wdev->iftype != NL80211_IFTYPE_AP || in nl80211_get_ftm_responder_stats()
15842 !wdev->links[link_id].ap.beacon_interval) in nl80211_get_ftm_responder_stats()
15843 return -EOPNOTSUPP; in nl80211_get_ftm_responder_stats()
15850 return -ENODATA; in nl80211_get_ftm_responder_stats()
15854 return -ENOMEM; in nl80211_get_ftm_responder_stats()
15856 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_ftm_responder_stats()
15861 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) in nl80211_get_ftm_responder_stats()
15898 return -ENOBUFS; in nl80211_get_ftm_responder_stats()
15903 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_update_owe_info()
15905 struct net_device *dev = info->user_ptr[1]; in nl80211_update_owe_info()
15907 if (!rdev->ops->update_owe_info) in nl80211_update_owe_info()
15908 return -EOPNOTSUPP; in nl80211_update_owe_info()
15910 if (!info->attrs[NL80211_ATTR_STATUS_CODE] || in nl80211_update_owe_info()
15911 !info->attrs[NL80211_ATTR_MAC]) in nl80211_update_owe_info()
15912 return -EINVAL; in nl80211_update_owe_info()
15915 owe_info.status = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]); in nl80211_update_owe_info()
15916 nla_memcpy(owe_info.peer, info->attrs[NL80211_ATTR_MAC], ETH_ALEN); in nl80211_update_owe_info()
15918 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_update_owe_info()
15919 owe_info.ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_update_owe_info()
15920 owe_info.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_update_owe_info()
15928 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_probe_mesh_link()
15929 struct net_device *dev = info->user_ptr[1]; in nl80211_probe_mesh_link()
15930 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_probe_mesh_link()
15937 if (!rdev->ops->probe_mesh_link || !rdev->ops->get_station) in nl80211_probe_mesh_link()
15938 return -EOPNOTSUPP; in nl80211_probe_mesh_link()
15940 if (!info->attrs[NL80211_ATTR_MAC] || in nl80211_probe_mesh_link()
15941 !info->attrs[NL80211_ATTR_FRAME]) { in nl80211_probe_mesh_link()
15943 return -EINVAL; in nl80211_probe_mesh_link()
15946 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_probe_mesh_link()
15947 return -EOPNOTSUPP; in nl80211_probe_mesh_link()
15949 dest = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_probe_mesh_link()
15950 buf = nla_data(info->attrs[NL80211_ATTR_FRAME]); in nl80211_probe_mesh_link()
15951 len = nla_len(info->attrs[NL80211_ATTR_FRAME]); in nl80211_probe_mesh_link()
15954 return -EINVAL; in nl80211_probe_mesh_link()
15957 !ether_addr_equal(buf + ETH_ALEN, dev->dev_addr)) in nl80211_probe_mesh_link()
15958 return -EINVAL; in nl80211_probe_mesh_link()
15975 struct netlink_ext_ack *extack = info->extack; in parse_tid_conf()
15980 return -EINVAL; in parse_tid_conf()
15982 tid_conf->config_override = in parse_tid_conf()
15984 tid_conf->tids = nla_get_u16(attrs[NL80211_TID_CONFIG_ATTR_TIDS]); in parse_tid_conf()
15986 if (tid_conf->config_override) { in parse_tid_conf()
15987 if (rdev->ops->reset_tid_config) { in parse_tid_conf()
15989 tid_conf->tids); in parse_tid_conf()
15993 return -EINVAL; in parse_tid_conf()
15998 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_NOACK); in parse_tid_conf()
15999 tid_conf->noack = in parse_tid_conf()
16004 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_RETRY_SHORT); in parse_tid_conf()
16005 tid_conf->retry_short = in parse_tid_conf()
16008 if (tid_conf->retry_short > rdev->wiphy.max_data_retry_count) in parse_tid_conf()
16009 return -EINVAL; in parse_tid_conf()
16013 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_RETRY_LONG); in parse_tid_conf()
16014 tid_conf->retry_long = in parse_tid_conf()
16017 if (tid_conf->retry_long > rdev->wiphy.max_data_retry_count) in parse_tid_conf()
16018 return -EINVAL; in parse_tid_conf()
16022 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_AMPDU_CTRL); in parse_tid_conf()
16023 tid_conf->ampdu = in parse_tid_conf()
16028 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL); in parse_tid_conf()
16029 tid_conf->rtscts = in parse_tid_conf()
16034 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_AMSDU_CTRL); in parse_tid_conf()
16035 tid_conf->amsdu = in parse_tid_conf()
16042 tid_conf->txrate_type = nla_get_u8(attrs[idx]); in parse_tid_conf()
16044 if (tid_conf->txrate_type != NL80211_TX_RATE_AUTOMATIC) { in parse_tid_conf()
16047 &tid_conf->txrate_mask, dev, in parse_tid_conf()
16052 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_TX_RATE); in parse_tid_conf()
16054 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE); in parse_tid_conf()
16058 mask = rdev->wiphy.tid_config_support.peer; in parse_tid_conf()
16060 mask = rdev->wiphy.tid_config_support.vif; in parse_tid_conf()
16062 if (tid_conf->mask & ~mask) { in parse_tid_conf()
16064 return -EOPNOTSUPP; in parse_tid_conf()
16073 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_tid_config()
16075 unsigned int link_id = nl80211_link_id(info->attrs); in nl80211_set_tid_config()
16076 struct net_device *dev = info->user_ptr[1]; in nl80211_set_tid_config()
16080 int ret = -EINVAL; in nl80211_set_tid_config()
16083 if (!info->attrs[NL80211_ATTR_TID_CONFIG]) in nl80211_set_tid_config()
16084 return -EINVAL; in nl80211_set_tid_config()
16086 if (!rdev->ops->set_tid_config) in nl80211_set_tid_config()
16087 return -EOPNOTSUPP; in nl80211_set_tid_config()
16089 nla_for_each_nested(tid, info->attrs[NL80211_ATTR_TID_CONFIG], in nl80211_set_tid_config()
16096 return -ENOMEM; in nl80211_set_tid_config()
16098 tid_config->n_tid_conf = num_conf; in nl80211_set_tid_config()
16100 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_set_tid_config()
16101 tid_config->peer = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_set_tid_config()
16103 nla_for_each_nested(tid, info->attrs[NL80211_ATTR_TID_CONFIG], in nl80211_set_tid_config()
16112 &tid_config->tid_conf[conf_idx], in nl80211_set_tid_config()
16113 info, tid_config->peer, link_id); in nl80211_set_tid_config()
16129 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_color_change()
16131 struct net_device *dev = info->user_ptr[1]; in nl80211_color_change()
16132 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_color_change()
16137 if (!rdev->ops->color_change) in nl80211_color_change()
16138 return -EOPNOTSUPP; in nl80211_color_change()
16140 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_color_change()
16142 return -EOPNOTSUPP; in nl80211_color_change()
16144 if (wdev->iftype != NL80211_IFTYPE_AP) in nl80211_color_change()
16145 return -EOPNOTSUPP; in nl80211_color_change()
16147 if (!info->attrs[NL80211_ATTR_COLOR_CHANGE_COUNT] || in nl80211_color_change()
16148 !info->attrs[NL80211_ATTR_COLOR_CHANGE_COLOR] || in nl80211_color_change()
16149 !info->attrs[NL80211_ATTR_COLOR_CHANGE_ELEMS]) in nl80211_color_change()
16150 return -EINVAL; in nl80211_color_change()
16152 params.count = nla_get_u8(info->attrs[NL80211_ATTR_COLOR_CHANGE_COUNT]); in nl80211_color_change()
16153 params.color = nla_get_u8(info->attrs[NL80211_ATTR_COLOR_CHANGE_COLOR]); in nl80211_color_change()
16155 err = nl80211_parse_beacon(rdev, info->attrs, &params.beacon_next, in nl80211_color_change()
16156 info->extack); in nl80211_color_change()
16162 return -ENOMEM; in nl80211_color_change()
16165 info->attrs[NL80211_ATTR_COLOR_CHANGE_ELEMS], in nl80211_color_change()
16166 nl80211_policy, info->extack); in nl80211_color_change()
16171 info->extack); in nl80211_color_change()
16176 err = -EINVAL; in nl80211_color_change()
16181 err = -EINVAL; in nl80211_color_change()
16187 err = -EINVAL; in nl80211_color_change()
16192 err = -EINVAL; in nl80211_color_change()
16201 err = -EINVAL; in nl80211_color_change()
16207 err = -EINVAL; in nl80211_color_change()
16213 err = -EINVAL; in nl80211_color_change()
16220 params.link_id = nl80211_link_id(info->attrs); in nl80211_color_change()
16235 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_fils_aad()
16236 struct net_device *dev = info->user_ptr[1]; in nl80211_set_fils_aad()
16240 if (!info->attrs[NL80211_ATTR_MAC] || in nl80211_set_fils_aad()
16241 !info->attrs[NL80211_ATTR_FILS_KEK] || in nl80211_set_fils_aad()
16242 !info->attrs[NL80211_ATTR_FILS_NONCES]) in nl80211_set_fils_aad()
16243 return -EINVAL; in nl80211_set_fils_aad()
16245 fils_aad.macaddr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_set_fils_aad()
16246 fils_aad.kek_len = nla_len(info->attrs[NL80211_ATTR_FILS_KEK]); in nl80211_set_fils_aad()
16247 fils_aad.kek = nla_data(info->attrs[NL80211_ATTR_FILS_KEK]); in nl80211_set_fils_aad()
16248 nonces = nla_data(info->attrs[NL80211_ATTR_FILS_NONCES]); in nl80211_set_fils_aad()
16257 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_add_link()
16258 unsigned int link_id = nl80211_link_id(info->attrs); in nl80211_add_link()
16259 struct net_device *dev = info->user_ptr[1]; in nl80211_add_link()
16260 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_add_link()
16263 if (!(wdev->wiphy->flags & WIPHY_FLAG_SUPPORTS_MLO)) in nl80211_add_link()
16264 return -EINVAL; in nl80211_add_link()
16266 switch (wdev->iftype) { in nl80211_add_link()
16270 return -EINVAL; in nl80211_add_link()
16273 if (!info->attrs[NL80211_ATTR_MAC] || in nl80211_add_link()
16274 !is_valid_ether_addr(nla_data(info->attrs[NL80211_ATTR_MAC]))) in nl80211_add_link()
16275 return -EINVAL; in nl80211_add_link()
16277 wdev->valid_links |= BIT(link_id); in nl80211_add_link()
16278 ether_addr_copy(wdev->links[link_id].addr, in nl80211_add_link()
16279 nla_data(info->attrs[NL80211_ATTR_MAC])); in nl80211_add_link()
16283 wdev->valid_links &= ~BIT(link_id); in nl80211_add_link()
16284 eth_zero_addr(wdev->links[link_id].addr); in nl80211_add_link()
16292 unsigned int link_id = nl80211_link_id(info->attrs); in nl80211_remove_link()
16293 struct net_device *dev = info->user_ptr[1]; in nl80211_remove_link()
16294 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_remove_link()
16297 if (!info->attrs[NL80211_ATTR_MLO_LINK_ID]) in nl80211_remove_link()
16298 return -EINVAL; in nl80211_remove_link()
16300 switch (wdev->iftype) { in nl80211_remove_link()
16304 return -EINVAL; in nl80211_remove_link()
16317 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_add_mod_link_station()
16318 struct net_device *dev = info->user_ptr[1]; in nl80211_add_mod_link_station()
16321 if ((add && !rdev->ops->add_link_station) || in nl80211_add_mod_link_station()
16322 (!add && !rdev->ops->mod_link_station)) in nl80211_add_mod_link_station()
16323 return -EOPNOTSUPP; in nl80211_add_mod_link_station()
16325 if (add && !info->attrs[NL80211_ATTR_MAC]) in nl80211_add_mod_link_station()
16326 return -EINVAL; in nl80211_add_mod_link_station()
16328 if (!info->attrs[NL80211_ATTR_MLD_ADDR]) in nl80211_add_mod_link_station()
16329 return -EINVAL; in nl80211_add_mod_link_station()
16331 if (add && !info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) in nl80211_add_mod_link_station()
16332 return -EINVAL; in nl80211_add_mod_link_station()
16334 params.mld_mac = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]); in nl80211_add_mod_link_station()
16336 if (info->attrs[NL80211_ATTR_MAC]) { in nl80211_add_mod_link_station()
16337 params.link_mac = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_add_mod_link_station()
16339 return -EINVAL; in nl80211_add_mod_link_station()
16342 if (!info->attrs[NL80211_ATTR_MLO_LINK_ID]) in nl80211_add_mod_link_station()
16343 return -EINVAL; in nl80211_add_mod_link_station()
16345 params.link_id = nla_get_u8(info->attrs[NL80211_ATTR_MLO_LINK_ID]); in nl80211_add_mod_link_station()
16347 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) { in nl80211_add_mod_link_station()
16349 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); in nl80211_add_mod_link_station()
16351 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); in nl80211_add_mod_link_station()
16354 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) in nl80211_add_mod_link_station()
16356 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]); in nl80211_add_mod_link_station()
16358 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) in nl80211_add_mod_link_station()
16360 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]); in nl80211_add_mod_link_station()
16362 if (info->attrs[NL80211_ATTR_HE_CAPABILITY]) { in nl80211_add_mod_link_station()
16364 nla_data(info->attrs[NL80211_ATTR_HE_CAPABILITY]); in nl80211_add_mod_link_station()
16366 nla_len(info->attrs[NL80211_ATTR_HE_CAPABILITY]); in nl80211_add_mod_link_station()
16368 if (info->attrs[NL80211_ATTR_EHT_CAPABILITY]) { in nl80211_add_mod_link_station()
16370 nla_data(info->attrs[NL80211_ATTR_EHT_CAPABILITY]); in nl80211_add_mod_link_station()
16372 nla_len(info->attrs[NL80211_ATTR_EHT_CAPABILITY]); in nl80211_add_mod_link_station()
16378 return -EINVAL; in nl80211_add_mod_link_station()
16382 if (info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]) in nl80211_add_mod_link_station()
16384 nla_data(info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]); in nl80211_add_mod_link_station()
16386 if (info->attrs[NL80211_ATTR_OPMODE_NOTIF]) { in nl80211_add_mod_link_station()
16389 nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]); in nl80211_add_mod_link_station()
16419 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_remove_link_station()
16420 struct net_device *dev = info->user_ptr[1]; in nl80211_remove_link_station()
16422 if (!rdev->ops->del_link_station) in nl80211_remove_link_station()
16423 return -EOPNOTSUPP; in nl80211_remove_link_station()
16425 if (!info->attrs[NL80211_ATTR_MLD_ADDR] || in nl80211_remove_link_station()
16426 !info->attrs[NL80211_ATTR_MLO_LINK_ID]) in nl80211_remove_link_station()
16427 return -EINVAL; in nl80211_remove_link_station()
16429 params.mld_mac = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]); in nl80211_remove_link_station()
16430 params.link_id = nla_get_u8(info->attrs[NL80211_ATTR_MLO_LINK_ID]); in nl80211_remove_link_station()
16438 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_hw_timestamp()
16439 struct net_device *dev = info->user_ptr[1]; in nl80211_set_hw_timestamp()
16442 if (!rdev->wiphy.hw_timestamp_max_peers) in nl80211_set_hw_timestamp()
16443 return -EOPNOTSUPP; in nl80211_set_hw_timestamp()
16445 if (!info->attrs[NL80211_ATTR_MAC] && in nl80211_set_hw_timestamp()
16446 rdev->wiphy.hw_timestamp_max_peers != CFG80211_HW_TIMESTAMP_ALL_PEERS) in nl80211_set_hw_timestamp()
16447 return -EOPNOTSUPP; in nl80211_set_hw_timestamp()
16449 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_set_hw_timestamp()
16450 hwts.macaddr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_set_hw_timestamp()
16453 nla_get_flag(info->attrs[NL80211_ATTR_HW_TIMESTAMP_ENABLED]); in nl80211_set_hw_timestamp()
16462 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_ttlm()
16463 struct net_device *dev = info->user_ptr[1]; in nl80211_set_ttlm()
16464 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_ttlm()
16466 if (wdev->iftype != NL80211_IFTYPE_STATION && in nl80211_set_ttlm()
16467 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_set_ttlm()
16468 return -EOPNOTSUPP; in nl80211_set_ttlm()
16470 if (!wdev->connected) in nl80211_set_ttlm()
16471 return -ENOLINK; in nl80211_set_ttlm()
16473 if (!info->attrs[NL80211_ATTR_MLO_TTLM_DLINK] || in nl80211_set_ttlm()
16474 !info->attrs[NL80211_ATTR_MLO_TTLM_ULINK]) in nl80211_set_ttlm()
16475 return -EINVAL; in nl80211_set_ttlm()
16478 info->attrs[NL80211_ATTR_MLO_TTLM_DLINK], in nl80211_set_ttlm()
16481 info->attrs[NL80211_ATTR_MLO_TTLM_ULINK], in nl80211_set_ttlm()
16489 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_assoc_ml_reconf()
16490 struct net_device *dev = info->user_ptr[1]; in nl80211_assoc_ml_reconf()
16491 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_assoc_ml_reconf()
16497 if (!wdev->valid_links) in nl80211_assoc_ml_reconf()
16498 return -EINVAL; in nl80211_assoc_ml_reconf()
16500 if (dev->ieee80211_ptr->conn_owner_nlportid && in nl80211_assoc_ml_reconf()
16501 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) in nl80211_assoc_ml_reconf()
16502 return -EPERM; in nl80211_assoc_ml_reconf()
16504 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_assoc_ml_reconf()
16505 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_assoc_ml_reconf()
16506 return -EOPNOTSUPP; in nl80211_assoc_ml_reconf()
16509 if (info->attrs[NL80211_ATTR_MLO_LINKS]) { in nl80211_assoc_ml_reconf()
16525 if (info->attrs[NL80211_ATTR_MLO_RECONF_REM_LINKS]) in nl80211_assoc_ml_reconf()
16527 nla_get_u16(info->attrs[NL80211_ATTR_MLO_RECONF_REM_LINKS]); in nl80211_assoc_ml_reconf()
16535 (wdev->valid_links & add_links) || in nl80211_assoc_ml_reconf()
16536 ((wdev->valid_links & rem_links) != rem_links)) { in nl80211_assoc_ml_reconf()
16537 err = -EINVAL; in nl80211_assoc_ml_reconf()
16541 err = -EOPNOTSUPP; in nl80211_assoc_ml_reconf()
16545 cfg80211_put_bss(&rdev->wiphy, links[link_id].bss); in nl80211_assoc_ml_reconf()
16553 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_epcs_cfg()
16554 struct net_device *dev = info->user_ptr[1]; in nl80211_epcs_cfg()
16555 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_epcs_cfg()
16558 if (wdev->iftype != NL80211_IFTYPE_STATION && in nl80211_epcs_cfg()
16559 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_epcs_cfg()
16560 return -EOPNOTSUPP; in nl80211_epcs_cfg()
16562 if (!wdev->connected) in nl80211_epcs_cfg()
16563 return -ENOLINK; in nl80211_epcs_cfg()
16565 val = nla_get_flag(info->attrs[NL80211_ATTR_EPCS]); in nl80211_epcs_cfg()
16668 if (WARN_ON(ops->internal_flags >= ARRAY_SIZE(nl80211_internal_flags))) in nl80211_pre_doit()
16669 return -EINVAL; in nl80211_pre_doit()
16671 internal_flags = nl80211_internal_flags[ops->internal_flags]; in nl80211_pre_doit()
16680 info->user_ptr[0] = rdev; in nl80211_pre_doit()
16684 info->attrs); in nl80211_pre_doit()
16690 dev = wdev->netdev; in nl80211_pre_doit()
16692 rdev = wiphy_to_rdev(wdev->wiphy); in nl80211_pre_doit()
16696 err = -EINVAL; in nl80211_pre_doit()
16700 info->user_ptr[1] = dev; in nl80211_pre_doit()
16702 info->user_ptr[1] = wdev; in nl80211_pre_doit()
16707 err = -ENETDOWN; in nl80211_pre_doit()
16711 info->user_ptr[0] = rdev; in nl80211_pre_doit()
16715 struct nlattr *link_id = info->attrs[NL80211_ATTR_MLO_LINK_ID]; in nl80211_pre_doit()
16718 err = -EINVAL; in nl80211_pre_doit()
16722 /* MLO -> require valid link ID */ in nl80211_pre_doit()
16723 if (wdev->valid_links && in nl80211_pre_doit()
16725 !(wdev->valid_links & BIT(nla_get_u8(link_id))))) { in nl80211_pre_doit()
16726 err = -EINVAL; in nl80211_pre_doit()
16730 /* non-MLO -> no link ID attribute accepted */ in nl80211_pre_doit()
16731 if (!wdev->valid_links && link_id) { in nl80211_pre_doit()
16732 err = -EINVAL; in nl80211_pre_doit()
16738 if (info->attrs[NL80211_ATTR_MLO_LINK_ID] || in nl80211_pre_doit()
16739 (wdev && wdev->valid_links)) { in nl80211_pre_doit()
16740 err = -EINVAL; in nl80211_pre_doit()
16746 wiphy_lock(&rdev->wiphy); in nl80211_pre_doit()
16748 __release(&rdev->wiphy.mtx); in nl80211_pre_doit()
16764 u32 internal_flags = nl80211_internal_flags[ops->internal_flags]; in nl80211_post_doit()
16766 if (info->user_ptr[1]) { in nl80211_post_doit()
16768 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_post_doit()
16770 dev_put(wdev->netdev); in nl80211_post_doit()
16772 dev_put(info->user_ptr[1]); in nl80211_post_doit()
16776 if (info->user_ptr[0] && in nl80211_post_doit()
16778 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_post_doit()
16781 __acquire(&rdev->wiphy.mtx); in nl80211_post_doit()
16782 wiphy_unlock(&rdev->wiphy); in nl80211_post_doit()
16807 return -EINVAL; in nl80211_set_sar_sub_specs()
16811 return -EINVAL; in nl80211_set_sar_sub_specs()
16816 if (range_index >= rdev->wiphy.sar_capa->num_freq_ranges) in nl80211_set_sar_sub_specs()
16817 return -EINVAL; in nl80211_set_sar_sub_specs()
16821 if (sar_specs->sub_specs[i].freq_range_index == range_index) in nl80211_set_sar_sub_specs()
16822 return -EINVAL; in nl80211_set_sar_sub_specs()
16825 sar_specs->sub_specs[index].power = in nl80211_set_sar_sub_specs()
16828 sar_specs->sub_specs[index].freq_range_index = range_index; in nl80211_set_sar_sub_specs()
16835 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_sar_specs()
16844 if (!rdev->wiphy.sar_capa || !rdev->ops->set_sar_specs) in nl80211_set_sar_specs()
16845 return -EOPNOTSUPP; in nl80211_set_sar_specs()
16847 if (!info->attrs[NL80211_ATTR_SAR_SPEC]) in nl80211_set_sar_specs()
16848 return -EINVAL; in nl80211_set_sar_specs()
16851 info->attrs[NL80211_ATTR_SAR_SPEC], in nl80211_set_sar_specs()
16855 return -EINVAL; in nl80211_set_sar_specs()
16858 if (type != rdev->wiphy.sar_capa->type) in nl80211_set_sar_specs()
16859 return -EINVAL; in nl80211_set_sar_specs()
16865 if (specs > rdev->wiphy.sar_capa->num_freq_ranges) in nl80211_set_sar_specs()
16866 return -EINVAL; in nl80211_set_sar_specs()
16870 return -ENOMEM; in nl80211_set_sar_specs()
16872 sar_spec->type = type; in nl80211_set_sar_specs()
16882 err = -EINVAL; in nl80211_set_sar_specs()
16887 err = -EINVAL; in nl80211_set_sar_specs()
16893 sar_spec->num_sub_specs = specs; in nl80211_set_sar_specs()
16895 rdev->cur_cmd_info = info; in nl80211_set_sar_specs()
16897 rdev->cur_cmd_info = NULL; in nl80211_set_sar_specs()
17816 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_notify_wiphy()
17835 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_notify_iface()
17842 struct cfg80211_scan_request *req = rdev->scan_req; in nl80211_add_scan_req()
17853 for (i = 0; i < req->n_ssids; i++) { in nl80211_add_scan_req()
17854 if (nla_put(msg, i, req->ssids[i].ssid_len, req->ssids[i].ssid)) in nl80211_add_scan_req()
17859 if (req->flags & NL80211_SCAN_FLAG_FREQ_KHZ) { in nl80211_add_scan_req()
17863 for (i = 0; i < req->n_channels; i++) { in nl80211_add_scan_req()
17865 ieee80211_channel_to_khz(req->channels[i]))) in nl80211_add_scan_req()
17874 for (i = 0; i < req->n_channels; i++) { in nl80211_add_scan_req()
17875 if (nla_put_u32(msg, i, req->channels[i]->center_freq)) in nl80211_add_scan_req()
17881 if (req->ie && in nl80211_add_scan_req()
17882 nla_put(msg, NL80211_ATTR_IE, req->ie_len, req->ie)) in nl80211_add_scan_req()
17885 if (req->flags && in nl80211_add_scan_req()
17886 nla_put_u32(msg, NL80211_ATTR_SCAN_FLAGS, req->flags)) in nl80211_add_scan_req()
17889 info = rdev->int_scan_req ? &rdev->int_scan_req->info : in nl80211_add_scan_req()
17890 &rdev->scan_req->info; in nl80211_add_scan_req()
17891 if (info->scan_start_tsf && in nl80211_add_scan_req()
17893 info->scan_start_tsf, NL80211_BSS_PAD) || in nl80211_add_scan_req()
17895 info->tsf_bssid))) in nl80211_add_scan_req()
17900 return -ENOBUFS; in nl80211_add_scan_req()
17913 return -1; in nl80211_prep_scan_msg()
17915 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_prep_scan_msg()
17916 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, in nl80211_prep_scan_msg()
17917 wdev->netdev->ifindex)) || in nl80211_prep_scan_msg()
17930 return -EMSGSIZE; in nl80211_prep_scan_msg()
17941 return -1; in nl80211_prep_sched_scan_msg()
17944 wiphy_to_rdev(req->wiphy)->wiphy_idx) || in nl80211_prep_sched_scan_msg()
17945 nla_put_u32(msg, NL80211_ATTR_IFINDEX, req->dev->ifindex) || in nl80211_prep_sched_scan_msg()
17946 nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, req->reqid, in nl80211_prep_sched_scan_msg()
17955 return -EMSGSIZE; in nl80211_prep_sched_scan_msg()
17973 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_scan_start()
18003 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_scan_msg()
18020 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(req->wiphy), msg, 0, in nl80211_send_sched_scan()
18028 if (nla_put_u8(msg, NL80211_ATTR_REG_INITIATOR, request->initiator)) in nl80211_reg_change_event_fill()
18031 if (request->alpha2[0] == '0' && request->alpha2[1] == '0') { in nl80211_reg_change_event_fill()
18035 } else if (request->alpha2[0] == '9' && request->alpha2[1] == '9') { in nl80211_reg_change_event_fill()
18039 } else if ((request->alpha2[0] == '9' && request->alpha2[1] == '8') || in nl80211_reg_change_event_fill()
18040 request->intersect) { in nl80211_reg_change_event_fill()
18048 request->alpha2)) in nl80211_reg_change_event_fill()
18052 if (request->wiphy_idx != WIPHY_IDX_INVALID) { in nl80211_reg_change_event_fill()
18053 struct wiphy *wiphy = wiphy_idx_to_wiphy(request->wiphy_idx); in nl80211_reg_change_event_fill()
18056 nla_put_u32(msg, NL80211_ATTR_WIPHY, request->wiphy_idx)) in nl80211_reg_change_event_fill()
18060 wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED && in nl80211_reg_change_event_fill()
18121 msg = nlmsg_new(100 + event->buf_len + event->req_ies_len, gfp); in nl80211_send_mlme_event()
18125 hdr = nl80211hdr_put(msg, 0, 0, 0, event->cmd); in nl80211_send_mlme_event()
18131 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_mlme_event()
18132 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_send_mlme_event()
18133 nla_put(msg, NL80211_ATTR_FRAME, event->buf_len, event->buf) || in nl80211_send_mlme_event()
18134 (event->req_ies && in nl80211_send_mlme_event()
18135 nla_put(msg, NL80211_ATTR_REQ_IE, event->req_ies_len, in nl80211_send_mlme_event()
18136 event->req_ies))) in nl80211_send_mlme_event()
18139 if (event->reconnect && in nl80211_send_mlme_event()
18143 if (event->uapsd_queues >= 0) { in nl80211_send_mlme_event()
18150 event->uapsd_queues)) in nl80211_send_mlme_event()
18158 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_mlme_event()
18174 .uapsd_queues = -1, in nl80211_send_rx_auth()
18186 .buf = data->buf, in nl80211_send_rx_assoc()
18187 .buf_len = data->len, in nl80211_send_rx_assoc()
18188 .uapsd_queues = data->uapsd_queues, in nl80211_send_rx_assoc()
18189 .req_ies = data->req_ies, in nl80211_send_rx_assoc()
18190 .req_ies_len = data->req_ies_len, in nl80211_send_rx_assoc()
18205 .uapsd_queues = -1, in nl80211_send_deauth()
18220 .uapsd_queues = -1, in nl80211_send_disassoc()
18229 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_rx_unprot_mlme_mgmt()
18230 struct wiphy *wiphy = wdev->wiphy; in cfg80211_rx_unprot_mlme_mgmt()
18236 .uapsd_queues = -1, in cfg80211_rx_unprot_mlme_mgmt()
18242 if (ieee80211_is_deauth(mgmt->frame_control)) { in cfg80211_rx_unprot_mlme_mgmt()
18244 } else if (ieee80211_is_disassoc(mgmt->frame_control)) { in cfg80211_rx_unprot_mlme_mgmt()
18246 } else if (ieee80211_is_beacon(mgmt->frame_control)) { in cfg80211_rx_unprot_mlme_mgmt()
18247 if (wdev->unprot_beacon_reported && in cfg80211_rx_unprot_mlme_mgmt()
18248 elapsed_jiffies_msecs(wdev->unprot_beacon_reported) < 10000) in cfg80211_rx_unprot_mlme_mgmt()
18251 wdev->unprot_beacon_reported = jiffies; in cfg80211_rx_unprot_mlme_mgmt()
18278 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_mlme_timeout()
18279 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_send_mlme_timeout()
18286 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_mlme_timeout()
18319 const u8 *connected_addr = cr->valid_links ? in nl80211_send_connect_result()
18320 cr->ap_mld_addr : cr->links[0].bssid; in nl80211_send_connect_result()
18322 if (cr->valid_links) { in nl80211_send_connect_result()
18328 link_info_size += cr->links[link].addr ? in nl80211_send_connect_result()
18330 link_info_size += (cr->links[link].bssid || in nl80211_send_connect_result()
18331 cr->links[link].bss) ? in nl80211_send_connect_result()
18337 msg = nlmsg_new(100 + cr->req_ie_len + cr->resp_ie_len + in nl80211_send_connect_result()
18338 cr->fils.kek_len + cr->fils.pmk_len + in nl80211_send_connect_result()
18339 (cr->fils.pmkid ? WLAN_PMKID_LEN : 0) + link_info_size, in nl80211_send_connect_result()
18350 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_connect_result()
18351 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_send_connect_result()
18355 cr->status < 0 ? WLAN_STATUS_UNSPECIFIED_FAILURE : in nl80211_send_connect_result()
18356 cr->status) || in nl80211_send_connect_result()
18357 (cr->status < 0 && in nl80211_send_connect_result()
18360 cr->timeout_reason))) || in nl80211_send_connect_result()
18361 (cr->req_ie && in nl80211_send_connect_result()
18362 nla_put(msg, NL80211_ATTR_REQ_IE, cr->req_ie_len, cr->req_ie)) || in nl80211_send_connect_result()
18363 (cr->resp_ie && in nl80211_send_connect_result()
18364 nla_put(msg, NL80211_ATTR_RESP_IE, cr->resp_ie_len, in nl80211_send_connect_result()
18365 cr->resp_ie)) || in nl80211_send_connect_result()
18366 (cr->fils.update_erp_next_seq_num && in nl80211_send_connect_result()
18368 cr->fils.erp_next_seq_num)) || in nl80211_send_connect_result()
18369 (cr->status == WLAN_STATUS_SUCCESS && in nl80211_send_connect_result()
18370 ((cr->fils.kek && in nl80211_send_connect_result()
18371 nla_put(msg, NL80211_ATTR_FILS_KEK, cr->fils.kek_len, in nl80211_send_connect_result()
18372 cr->fils.kek)) || in nl80211_send_connect_result()
18373 (cr->fils.pmk && in nl80211_send_connect_result()
18374 nla_put(msg, NL80211_ATTR_PMK, cr->fils.pmk_len, cr->fils.pmk)) || in nl80211_send_connect_result()
18375 (cr->fils.pmkid && in nl80211_send_connect_result()
18376 nla_put(msg, NL80211_ATTR_PMKID, WLAN_PMKID_LEN, cr->fils.pmkid))))) in nl80211_send_connect_result()
18379 if (cr->valid_links) { in nl80211_send_connect_result()
18389 const u8 *bssid = cr->links[link].bss ? in nl80211_send_connect_result()
18390 cr->links[link].bss->bssid : in nl80211_send_connect_result()
18391 cr->links[link].bssid; in nl80211_send_connect_result()
18400 (cr->links[link].addr && in nl80211_send_connect_result()
18402 cr->links[link].addr)) || in nl80211_send_connect_result()
18404 cr->links[link].status)) in nl80211_send_connect_result()
18415 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_connect_result()
18431 const u8 *connected_addr = info->ap_mld_addr ? in nl80211_send_roamed()
18432 info->ap_mld_addr : in nl80211_send_roamed()
18433 (info->links[0].bss ? in nl80211_send_roamed()
18434 info->links[0].bss->bssid : in nl80211_send_roamed()
18435 info->links[0].bssid); in nl80211_send_roamed()
18437 if (info->valid_links) { in nl80211_send_roamed()
18443 link_info_size += info->links[link].addr ? in nl80211_send_roamed()
18445 link_info_size += (info->links[link].bssid || in nl80211_send_roamed()
18446 info->links[link].bss) ? in nl80211_send_roamed()
18451 msg = nlmsg_new(100 + info->req_ie_len + info->resp_ie_len + in nl80211_send_roamed()
18452 info->fils.kek_len + info->fils.pmk_len + in nl80211_send_roamed()
18453 (info->fils.pmkid ? WLAN_PMKID_LEN : 0) + in nl80211_send_roamed()
18464 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_roamed()
18465 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_send_roamed()
18467 (info->req_ie && in nl80211_send_roamed()
18468 nla_put(msg, NL80211_ATTR_REQ_IE, info->req_ie_len, in nl80211_send_roamed()
18469 info->req_ie)) || in nl80211_send_roamed()
18470 (info->resp_ie && in nl80211_send_roamed()
18471 nla_put(msg, NL80211_ATTR_RESP_IE, info->resp_ie_len, in nl80211_send_roamed()
18472 info->resp_ie)) || in nl80211_send_roamed()
18473 (info->fils.update_erp_next_seq_num && in nl80211_send_roamed()
18475 info->fils.erp_next_seq_num)) || in nl80211_send_roamed()
18476 (info->fils.kek && in nl80211_send_roamed()
18477 nla_put(msg, NL80211_ATTR_FILS_KEK, info->fils.kek_len, in nl80211_send_roamed()
18478 info->fils.kek)) || in nl80211_send_roamed()
18479 (info->fils.pmk && in nl80211_send_roamed()
18480 nla_put(msg, NL80211_ATTR_PMK, info->fils.pmk_len, info->fils.pmk)) || in nl80211_send_roamed()
18481 (info->fils.pmkid && in nl80211_send_roamed()
18482 nla_put(msg, NL80211_ATTR_PMKID, WLAN_PMKID_LEN, info->fils.pmkid))) in nl80211_send_roamed()
18485 if (info->valid_links) { in nl80211_send_roamed()
18495 const u8 *bssid = info->links[link].bss ? in nl80211_send_roamed()
18496 info->links[link].bss->bssid : in nl80211_send_roamed()
18497 info->links[link].bssid; in nl80211_send_roamed()
18506 (info->links[link].addr && in nl80211_send_roamed()
18508 info->links[link].addr))) in nl80211_send_roamed()
18519 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_roamed()
18544 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_port_authorized()
18545 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_send_port_authorized()
18555 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_port_authorized()
18580 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_disconnected()
18581 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_send_disconnected()
18591 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_disconnected()
18601 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_links_removed()
18602 struct wiphy *wiphy = wdev->wiphy; in cfg80211_links_removed()
18608 lockdep_assert_wiphy(wdev->wiphy); in cfg80211_links_removed()
18611 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_STATION && in cfg80211_links_removed()
18612 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT)) in cfg80211_links_removed()
18615 if (WARN_ON(!wdev->valid_links || !link_mask || in cfg80211_links_removed()
18616 (wdev->valid_links & link_mask) != link_mask || in cfg80211_links_removed()
18617 wdev->valid_links == link_mask)) in cfg80211_links_removed()
18621 wdev->valid_links &= ~link_mask; in cfg80211_links_removed()
18633 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_links_removed()
18634 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) in cfg80211_links_removed()
18660 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_links_removed()
18672 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_mlo_reconf_add_done()
18673 struct wiphy *wiphy = wdev->wiphy; in nl80211_mlo_reconf_add_done()
18677 .buf = data->buf, in nl80211_mlo_reconf_add_done()
18678 .buf_len = data->len, in nl80211_mlo_reconf_add_done()
18679 .uapsd_queues = -1, in nl80211_mlo_reconf_add_done()
18703 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_ibss_bssid()
18704 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_send_ibss_bssid()
18710 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_ibss_bssid()
18722 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_notify_new_peer_candidate()
18723 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_notify_new_peer_candidate()
18727 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_MESH_POINT)) in cfg80211_notify_new_peer_candidate()
18742 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_notify_new_peer_candidate()
18743 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in cfg80211_notify_new_peer_candidate()
18753 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_notify_new_peer_candidate()
18780 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_michael_mic_failure()
18781 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_michael_mic_failure()
18784 (key_id != -1 && in nl80211_michael_mic_failure()
18791 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_michael_mic_failure()
18872 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_remain_on_chan_event()
18873 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, in nl80211_send_remain_on_chan_event()
18874 wdev->netdev->ifindex)) || in nl80211_send_remain_on_chan_event()
18877 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, chan->center_freq) || in nl80211_send_remain_on_chan_event()
18890 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_remain_on_chan_event()
18901 struct wireless_dev *wdev = netdev->ieee80211_ptr; in cfg80211_assoc_comeback()
18902 struct wiphy *wiphy = wdev->wiphy; in cfg80211_assoc_comeback()
18919 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_assoc_comeback()
18920 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in cfg80211_assoc_comeback()
18927 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_assoc_comeback()
18940 struct wiphy *wiphy = wdev->wiphy; in cfg80211_ready_on_channel()
18954 struct wiphy *wiphy = wdev->wiphy; in cfg80211_remain_on_channel_expired()
18967 struct wiphy *wiphy = wdev->wiphy; in cfg80211_tx_mgmt_expired()
18979 struct wiphy *wiphy = dev->ieee80211_ptr->wiphy; in cfg80211_new_sta()
18995 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_new_sta()
19003 struct wiphy *wiphy = dev->ieee80211_ptr->wiphy; in cfg80211_del_sta_sinfo()
19025 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_del_sta_sinfo()
19034 struct wiphy *wiphy = dev->ieee80211_ptr->wiphy; in cfg80211_conn_failed()
19049 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in cfg80211_conn_failed()
19056 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_conn_failed()
19068 struct wireless_dev *wdev = dev->ieee80211_ptr; in __nl80211_unexpected_frame()
19069 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in __nl80211_unexpected_frame()
19072 u32 nlportid = READ_ONCE(wdev->ap_unexpected_nlportid); in __nl80211_unexpected_frame()
19087 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in __nl80211_unexpected_frame()
19088 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in __nl80211_unexpected_frame()
19093 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); in __nl80211_unexpected_frame()
19104 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_rx_spurious_frame()
19109 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP && in cfg80211_rx_spurious_frame()
19110 wdev->iftype != NL80211_IFTYPE_P2P_GO)) { in cfg80211_rx_spurious_frame()
19124 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_rx_unexpected_4addr_frame()
19129 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP && in cfg80211_rx_unexpected_4addr_frame()
19130 wdev->iftype != NL80211_IFTYPE_P2P_GO && in cfg80211_rx_unexpected_4addr_frame()
19131 wdev->iftype != NL80211_IFTYPE_AP_VLAN)) { in cfg80211_rx_unexpected_4addr_frame()
19147 struct net_device *netdev = wdev->netdev; in nl80211_send_mgmt()
19151 msg = nlmsg_new(100 + info->len, gfp); in nl80211_send_mgmt()
19153 return -ENOMEM; in nl80211_send_mgmt()
19158 return -ENOMEM; in nl80211_send_mgmt()
19161 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_mgmt()
19163 netdev->ifindex)) || in nl80211_send_mgmt()
19166 (info->have_link_id && in nl80211_send_mgmt()
19167 nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, info->link_id)) || in nl80211_send_mgmt()
19168 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, KHZ_TO_MHZ(info->freq)) || in nl80211_send_mgmt()
19169 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ_OFFSET, info->freq % 1000) || in nl80211_send_mgmt()
19170 (info->sig_dbm && in nl80211_send_mgmt()
19171 nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, info->sig_dbm)) || in nl80211_send_mgmt()
19172 nla_put(msg, NL80211_ATTR_FRAME, info->len, info->buf) || in nl80211_send_mgmt()
19173 (info->flags && in nl80211_send_mgmt()
19174 nla_put_u32(msg, NL80211_ATTR_RXMGMT_FLAGS, info->flags)) || in nl80211_send_mgmt()
19175 (info->rx_tstamp && nla_put_u64_64bit(msg, in nl80211_send_mgmt()
19177 info->rx_tstamp, in nl80211_send_mgmt()
19179 (info->ack_tstamp && nla_put_u64_64bit(msg, in nl80211_send_mgmt()
19181 info->ack_tstamp, in nl80211_send_mgmt()
19187 return genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); in nl80211_send_mgmt()
19191 return -ENOBUFS; in nl80211_send_mgmt()
19198 struct wiphy *wiphy = wdev->wiphy; in nl80211_frame_tx_status()
19200 struct net_device *netdev = wdev->netdev; in nl80211_frame_tx_status()
19205 trace_cfg80211_mgmt_tx_status(wdev, status->cookie, in nl80211_frame_tx_status()
19206 status->ack); in nl80211_frame_tx_status()
19208 trace_cfg80211_control_port_tx_status(wdev, status->cookie, in nl80211_frame_tx_status()
19209 status->ack); in nl80211_frame_tx_status()
19211 msg = nlmsg_new(100 + status->len, gfp); in nl80211_frame_tx_status()
19221 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_frame_tx_status()
19223 netdev->ifindex)) || in nl80211_frame_tx_status()
19226 nla_put(msg, NL80211_ATTR_FRAME, status->len, status->buf) || in nl80211_frame_tx_status()
19227 nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, status->cookie, in nl80211_frame_tx_status()
19229 (status->ack && nla_put_flag(msg, NL80211_ATTR_ACK)) || in nl80211_frame_tx_status()
19230 (status->tx_tstamp && in nl80211_frame_tx_status()
19232 status->tx_tstamp, NL80211_ATTR_PAD)) || in nl80211_frame_tx_status()
19233 (status->ack_tstamp && in nl80211_frame_tx_status()
19235 status->ack_tstamp, NL80211_ATTR_PAD))) in nl80211_frame_tx_status()
19240 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_frame_tx_status()
19277 struct wireless_dev *wdev = dev->ieee80211_ptr; in __nl80211_rx_control_port()
19278 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in __nl80211_rx_control_port()
19280 const u8 *addr = ehdr->h_source; in __nl80211_rx_control_port()
19281 u16 proto = be16_to_cpu(skb->protocol); in __nl80211_rx_control_port()
19286 u32 nlportid = READ_ONCE(wdev->conn_owner_nlportid); in __nl80211_rx_control_port()
19289 return -ENOENT; in __nl80211_rx_control_port()
19291 msg = nlmsg_new(100 + skb->len, gfp); in __nl80211_rx_control_port()
19293 return -ENOMEM; in __nl80211_rx_control_port()
19298 return -ENOBUFS; in __nl80211_rx_control_port()
19301 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in __nl80211_rx_control_port()
19302 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in __nl80211_rx_control_port()
19313 frame = nla_reserve(msg, NL80211_ATTR_FRAME, skb->len); in __nl80211_rx_control_port()
19317 skb_copy_bits(skb, 0, nla_data(frame), skb->len); in __nl80211_rx_control_port()
19320 return genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); in __nl80211_rx_control_port()
19324 return -ENOBUFS; in __nl80211_rx_control_port()
19343 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_prepare_cqm()
19344 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_prepare_cqm()
19351 cb = (void **)msg->cb; in cfg80211_prepare_cqm()
19359 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_prepare_cqm()
19360 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) in cfg80211_prepare_cqm()
19380 void **cb = (void **)msg->cb; in cfg80211_send_cqm()
19386 memset(msg->cb, 0, sizeof(msg->cb)); in cfg80211_send_cqm()
19388 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_send_cqm()
19396 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_cqm_rssi_notify()
19406 cqm_config = rcu_dereference(wdev->cqm_config); in cfg80211_cqm_rssi_notify()
19408 cqm_config->last_rssi_event_value = rssi_level; in cfg80211_cqm_rssi_notify()
19409 cqm_config->last_rssi_event_type = rssi_event; in cfg80211_cqm_rssi_notify()
19410 wiphy_work_queue(wdev->wiphy, &wdev->cqm_rssi_work); in cfg80211_cqm_rssi_notify()
19426 cqm_config = wiphy_dereference(wdev->wiphy, wdev->cqm_config); in cfg80211_cqm_rssi_notify_work()
19430 if (cqm_config->use_range_api) in cfg80211_cqm_rssi_notify_work()
19431 cfg80211_cqm_rssi_update(rdev, wdev->netdev, cqm_config); in cfg80211_cqm_rssi_notify_work()
19433 rssi_level = cqm_config->last_rssi_event_value; in cfg80211_cqm_rssi_notify_work()
19434 rssi_event = cqm_config->last_rssi_event_type; in cfg80211_cqm_rssi_notify_work()
19436 msg = cfg80211_prepare_cqm(wdev->netdev, NULL, GFP_KERNEL); in cfg80211_cqm_rssi_notify_work()
19542 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_gtk_rekey_notify()
19543 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_gtk_rekey_notify()
19559 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_gtk_rekey_notify()
19570 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_gtk_rekey_notify()
19571 struct wiphy *wiphy = wdev->wiphy; in cfg80211_gtk_rekey_notify()
19598 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_pmksa_candidate_notify()
19599 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex)) in nl80211_pmksa_candidate_notify()
19616 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_pmksa_candidate_notify()
19627 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_pmksa_candidate_notify()
19628 struct wiphy *wiphy = wdev->wiphy; in cfg80211_pmksa_candidate_notify()
19644 struct wireless_dev *wdev = netdev->ieee80211_ptr; in nl80211_ch_switch_notify()
19658 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex)) in nl80211_ch_switch_notify()
19661 if (wdev->valid_links && in nl80211_ch_switch_notify()
19678 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_ch_switch_notify()
19690 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_ch_switch_notify()
19691 struct wiphy *wiphy = wdev->wiphy; in cfg80211_ch_switch_notify()
19694 lockdep_assert_wiphy(wdev->wiphy); in cfg80211_ch_switch_notify()
19699 switch (wdev->iftype) { in cfg80211_ch_switch_notify()
19702 if (!WARN_ON(!wdev->links[link_id].client.current_bss)) in cfg80211_ch_switch_notify()
19704 chandef->chan); in cfg80211_ch_switch_notify()
19707 wdev->u.mesh.chandef = *chandef; in cfg80211_ch_switch_notify()
19708 wdev->u.mesh.preset_chandef = *chandef; in cfg80211_ch_switch_notify()
19712 wdev->links[link_id].ap.chandef = *chandef; in cfg80211_ch_switch_notify()
19715 wdev->u.ibss.chandef = *chandef; in cfg80211_ch_switch_notify()
19735 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_ch_switch_started_notify()
19736 struct wiphy *wiphy = wdev->wiphy; in cfg80211_ch_switch_started_notify()
19739 lockdep_assert_wiphy(wdev->wiphy); in cfg80211_ch_switch_started_notify()
19755 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_bss_color_notify()
19756 struct wiphy *wiphy = wdev->wiphy; in cfg80211_bss_color_notify()
19761 lockdep_assert_wiphy(wdev->wiphy); in cfg80211_bss_color_notify()
19767 return -ENOMEM; in cfg80211_bss_color_notify()
19773 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) in cfg80211_bss_color_notify()
19776 if (wdev->valid_links && in cfg80211_bss_color_notify()
19791 return genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), in cfg80211_bss_color_notify()
19796 return -EINVAL; in cfg80211_bss_color_notify()
19819 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx)) in nl80211_radar_notify()
19824 struct wireless_dev *wdev = netdev->ieee80211_ptr; in nl80211_radar_notify()
19826 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_radar_notify()
19840 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_radar_notify()
19853 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_sta_opmode_change_notify()
19854 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_sta_opmode_change_notify()
19870 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx)) in cfg80211_sta_opmode_change_notify()
19873 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) in cfg80211_sta_opmode_change_notify()
19879 if ((sta_opmode->changed & STA_OPMODE_SMPS_MODE_CHANGED) && in cfg80211_sta_opmode_change_notify()
19880 nla_put_u8(msg, NL80211_ATTR_SMPS_MODE, sta_opmode->smps_mode)) in cfg80211_sta_opmode_change_notify()
19883 if ((sta_opmode->changed & STA_OPMODE_MAX_BW_CHANGED) && in cfg80211_sta_opmode_change_notify()
19884 nla_put_u32(msg, NL80211_ATTR_CHANNEL_WIDTH, sta_opmode->bw)) in cfg80211_sta_opmode_change_notify()
19887 if ((sta_opmode->changed & STA_OPMODE_N_SS_CHANGED) && in cfg80211_sta_opmode_change_notify()
19888 nla_put_u8(msg, NL80211_ATTR_NSS, sta_opmode->rx_nss)) in cfg80211_sta_opmode_change_notify()
19893 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_sta_opmode_change_notify()
19907 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_probe_status()
19908 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_probe_status()
19925 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_probe_status()
19926 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in cfg80211_probe_status()
19937 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_probe_status()
19956 spin_lock_bh(&rdev->beacon_registrations_lock); in cfg80211_report_obss_beacon_khz()
19957 list_for_each_entry(reg, &rdev->beacon_registrations, list) { in cfg80211_report_obss_beacon_khz()
19960 spin_unlock_bh(&rdev->beacon_registrations_lock); in cfg80211_report_obss_beacon_khz()
19968 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_report_obss_beacon_khz()
19981 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, reg->nlportid); in cfg80211_report_obss_beacon_khz()
19983 spin_unlock_bh(&rdev->beacon_registrations_lock); in cfg80211_report_obss_beacon_khz()
19987 spin_unlock_bh(&rdev->beacon_registrations_lock); in cfg80211_report_obss_beacon_khz()
19996 struct cfg80211_wowlan_nd_info *nd = wakeup->net_detect; in cfg80211_net_detect_results()
20003 return -EMSGSIZE; in cfg80211_net_detect_results()
20005 for (i = 0; i < nd->n_matches; i++) { in cfg80211_net_detect_results()
20006 struct cfg80211_wowlan_nd_match *match = nd->matches[i]; in cfg80211_net_detect_results()
20019 if (nla_put(msg, NL80211_ATTR_SSID, match->ssid.ssid_len, in cfg80211_net_detect_results()
20020 match->ssid.ssid)) { in cfg80211_net_detect_results()
20025 if (match->n_channels) { in cfg80211_net_detect_results()
20033 for (j = 0; j < match->n_channels; j++) { in cfg80211_net_detect_results()
20034 if (nla_put_u32(msg, j, match->channels[j])) { in cfg80211_net_detect_results()
20056 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_report_wowlan_wakeup()
20061 trace_cfg80211_report_wowlan_wakeup(wdev->wiphy, wdev, wakeup); in cfg80211_report_wowlan_wakeup()
20064 size += wakeup->packet_present_len; in cfg80211_report_wowlan_wakeup()
20074 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_report_wowlan_wakeup()
20079 if (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, in cfg80211_report_wowlan_wakeup()
20080 wdev->netdev->ifindex)) in cfg80211_report_wowlan_wakeup()
20091 if (wakeup->disconnect && in cfg80211_report_wowlan_wakeup()
20094 if (wakeup->magic_pkt && in cfg80211_report_wowlan_wakeup()
20097 if (wakeup->gtk_rekey_failure && in cfg80211_report_wowlan_wakeup()
20100 if (wakeup->eap_identity_req && in cfg80211_report_wowlan_wakeup()
20103 if (wakeup->four_way_handshake && in cfg80211_report_wowlan_wakeup()
20106 if (wakeup->rfkill_release && in cfg80211_report_wowlan_wakeup()
20110 if (wakeup->pattern_idx >= 0 && in cfg80211_report_wowlan_wakeup()
20112 wakeup->pattern_idx)) in cfg80211_report_wowlan_wakeup()
20115 if (wakeup->tcp_match && in cfg80211_report_wowlan_wakeup()
20119 if (wakeup->tcp_connlost && in cfg80211_report_wowlan_wakeup()
20123 if (wakeup->tcp_nomoretokens && in cfg80211_report_wowlan_wakeup()
20128 if (wakeup->unprot_deauth_disassoc && in cfg80211_report_wowlan_wakeup()
20133 if (wakeup->packet) { in cfg80211_report_wowlan_wakeup()
20137 if (!wakeup->packet_80211) { in cfg80211_report_wowlan_wakeup()
20144 if (wakeup->packet_len && in cfg80211_report_wowlan_wakeup()
20145 nla_put_u32(msg, len_attr, wakeup->packet_len)) in cfg80211_report_wowlan_wakeup()
20148 if (nla_put(msg, pkt_attr, wakeup->packet_present_len, in cfg80211_report_wowlan_wakeup()
20149 wakeup->packet)) in cfg80211_report_wowlan_wakeup()
20153 if (wakeup->net_detect && in cfg80211_report_wowlan_wakeup()
20162 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_report_wowlan_wakeup()
20176 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_tdls_oper_request()
20177 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_tdls_oper_request()
20181 trace_cfg80211_tdls_oper_request(wdev->wiphy, dev, peer, oper, in cfg80211_tdls_oper_request()
20194 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_tdls_oper_request()
20195 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in cfg80211_tdls_oper_request()
20204 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_tdls_oper_request()
20222 if (state != NETLINK_URELEASE || notify->protocol != NETLINK_GENERIC) in nl80211_netlink_notify()
20231 &rdev->sched_scan_req_list, in nl80211_netlink_notify()
20233 if (sched_scan_req->owner_nlportid == notify->portid) { in nl80211_netlink_notify()
20234 sched_scan_req->nl_owner_dead = true; in nl80211_netlink_notify()
20235 wiphy_work_queue(&rdev->wiphy, in nl80211_netlink_notify()
20236 &rdev->sched_scan_stop_wk); in nl80211_netlink_notify()
20240 list_for_each_entry_rcu(wdev, &rdev->wiphy.wdev_list, list) { in nl80211_netlink_notify()
20241 cfg80211_mlme_unregister_socket(wdev, notify->portid); in nl80211_netlink_notify()
20243 if (wdev->owner_nlportid == notify->portid) { in nl80211_netlink_notify()
20244 wdev->nl_owner_dead = true; in nl80211_netlink_notify()
20245 schedule_work(&rdev->destroy_work); in nl80211_netlink_notify()
20246 } else if (wdev->conn_owner_nlportid == notify->portid) { in nl80211_netlink_notify()
20247 schedule_work(&wdev->disconnect_wk); in nl80211_netlink_notify()
20250 cfg80211_release_pmsr(wdev, notify->portid); in nl80211_netlink_notify()
20253 spin_lock_bh(&rdev->beacon_registrations_lock); in nl80211_netlink_notify()
20254 list_for_each_entry_safe(reg, tmp, &rdev->beacon_registrations, in nl80211_netlink_notify()
20256 if (reg->nlportid == notify->portid) { in nl80211_netlink_notify()
20257 list_del(&reg->list); in nl80211_netlink_notify()
20262 spin_unlock_bh(&rdev->beacon_registrations_lock); in nl80211_netlink_notify()
20271 regulatory_netlink_notify(notify->portid); in nl80211_netlink_notify()
20282 struct wiphy *wiphy = netdev->ieee80211_ptr->wiphy; in cfg80211_ft_event()
20289 if (!ft_event->target_ap) in cfg80211_ft_event()
20292 msg = nlmsg_new(100 + ft_event->ies_len + ft_event->ric_ies_len, in cfg80211_ft_event()
20301 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_ft_event()
20302 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in cfg80211_ft_event()
20303 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, ft_event->target_ap)) in cfg80211_ft_event()
20306 if (ft_event->ies && in cfg80211_ft_event()
20307 nla_put(msg, NL80211_ATTR_IE, ft_event->ies_len, ft_event->ies)) in cfg80211_ft_event()
20309 if (ft_event->ric_ies && in cfg80211_ft_event()
20310 nla_put(msg, NL80211_ATTR_IE_RIC, ft_event->ric_ies_len, in cfg80211_ft_event()
20311 ft_event->ric_ies)) in cfg80211_ft_event()
20316 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_ft_event()
20331 rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_crit_proto_stopped()
20332 if (!rdev->crit_proto_nlportid) in cfg80211_crit_proto_stopped()
20335 nlportid = rdev->crit_proto_nlportid; in cfg80211_crit_proto_stopped()
20336 rdev->crit_proto_nlportid = 0; in cfg80211_crit_proto_stopped()
20346 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_crit_proto_stopped()
20353 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); in cfg80211_crit_proto_stopped()
20363 struct wiphy *wiphy = wdev->wiphy; in nl80211_send_ap_stopped()
20376 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_ap_stopped()
20377 nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex) || in nl80211_send_ap_stopped()
20380 (wdev->valid_links && in nl80211_send_ap_stopped()
20397 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_external_auth_request()
20398 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_external_auth_request()
20402 if (!wdev->conn_owner_nlportid) in cfg80211_external_auth_request()
20403 return -EINVAL; in cfg80211_external_auth_request()
20407 return -ENOMEM; in cfg80211_external_auth_request()
20413 /* Some historical mistakes in drivers <-> userspace interface (notably in cfg80211_external_auth_request()
20414 * between drivers and wpa_supplicant) led to a big-endian conversion in cfg80211_external_auth_request()
20418 * in big-endian. Note that newer wpa_supplicant will also detect this in cfg80211_external_auth_request()
20421 if (params->key_mgmt_suite == WLAN_AKM_SUITE_SAE) { in cfg80211_external_auth_request()
20427 params->key_mgmt_suite)) in cfg80211_external_auth_request()
20431 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_external_auth_request()
20432 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in cfg80211_external_auth_request()
20434 params->action) || in cfg80211_external_auth_request()
20435 nla_put(msg, NL80211_ATTR_BSSID, ETH_ALEN, params->bssid) || in cfg80211_external_auth_request()
20436 nla_put(msg, NL80211_ATTR_SSID, params->ssid.ssid_len, in cfg80211_external_auth_request()
20437 params->ssid.ssid) || in cfg80211_external_auth_request()
20438 (!is_zero_ether_addr(params->mld_addr) && in cfg80211_external_auth_request()
20439 nla_put(msg, NL80211_ATTR_MLD_ADDR, ETH_ALEN, params->mld_addr))) in cfg80211_external_auth_request()
20443 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, in cfg80211_external_auth_request()
20444 wdev->conn_owner_nlportid); in cfg80211_external_auth_request()
20449 return -ENOBUFS; in cfg80211_external_auth_request()
20457 struct wiphy *wiphy = netdev->ieee80211_ptr->wiphy; in cfg80211_update_owe_info_event()
20472 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_update_owe_info_event()
20473 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in cfg80211_update_owe_info_event()
20474 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, owe_info->peer)) in cfg80211_update_owe_info_event()
20477 if (!owe_info->ie_len || in cfg80211_update_owe_info_event()
20478 nla_put(msg, NL80211_ATTR_IE, owe_info->ie_len, owe_info->ie)) in cfg80211_update_owe_info_event()
20481 if (owe_info->assoc_link_id != -1) { in cfg80211_update_owe_info_event()
20483 owe_info->assoc_link_id)) in cfg80211_update_owe_info_event()
20486 if (!is_zero_ether_addr(owe_info->peer_mld_addr) && in cfg80211_update_owe_info_event()
20488 owe_info->peer_mld_addr)) in cfg80211_update_owe_info_event()
20494 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_update_owe_info_event()
20506 struct wiphy *wiphy = wdev->wiphy; in cfg80211_schedule_channels_check()
20509 if (wdev->iftype == NL80211_IFTYPE_STATION && in cfg80211_schedule_channels_check()
20513 wiphy->regulatory_flags & REGULATORY_ENABLE_RELAX_NO_IR))) in cfg80211_schedule_channels_check()
20520 struct wireless_dev *wdev = netdev->ieee80211_ptr; in cfg80211_epcs_changed()
20521 struct wiphy *wiphy = wdev->wiphy; in cfg80211_epcs_changed()
20542 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_epcs_changed()