Lines Matching +full:tx +full:- +full:level +full:- +full:trig
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-2025 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),
864 [NL80211_KEY_TYPE] = NLA_POLICY_MAX(NLA_U32, NUM_NL80211_KEYTYPES - 1),
1010 if (!cb->args[0]) { in nl80211_prepare_wdev_dump()
1017 return -ENOMEM; in nl80211_prepare_wdev_dump()
1021 err = nlmsg_parse_deprecated(cb->nlh, in nl80211_prepare_wdev_dump()
1031 *wdev = __cfg80211_wdev_from_attrs(NULL, sock_net(cb->skb->sk), in nl80211_prepare_wdev_dump()
1038 *rdev = wiphy_to_rdev((*wdev)->wiphy); in nl80211_prepare_wdev_dump()
1039 mutex_lock(&(*rdev)->wiphy.mtx); in nl80211_prepare_wdev_dump()
1041 /* 0 is the first index - add 1 to parse only once */ in nl80211_prepare_wdev_dump()
1042 cb->args[0] = (*rdev)->wiphy_idx + 1; in nl80211_prepare_wdev_dump()
1043 cb->args[1] = (*wdev)->identifier; in nl80211_prepare_wdev_dump()
1050 wiphy = wiphy_idx_to_wiphy(cb->args[0] - 1); in nl80211_prepare_wdev_dump()
1053 return -ENODEV; in nl80211_prepare_wdev_dump()
1058 list_for_each_entry(tmp, &(*rdev)->wiphy.wdev_list, list) { in nl80211_prepare_wdev_dump()
1059 if (tmp->identifier == cb->args[1]) { in nl80211_prepare_wdev_dump()
1067 return -ENODEV; in nl80211_prepare_wdev_dump()
1069 mutex_lock(&(*rdev)->wiphy.mtx); in nl80211_prepare_wdev_dump()
1101 rule->wmm_rule.client[j].cw_min) || in nl80211_msg_put_wmm_rules()
1103 rule->wmm_rule.client[j].cw_max) || in nl80211_msg_put_wmm_rules()
1105 rule->wmm_rule.client[j].aifsn) || in nl80211_msg_put_wmm_rules()
1107 rule->wmm_rule.client[j].cot)) in nl80211_msg_put_wmm_rules()
1117 return -ENOBUFS; in nl80211_msg_put_wmm_rules()
1125 * list to protect old user-space tools from breaking in nl80211_msg_put_channel()
1127 if (!large && chan->flags & in nl80211_msg_put_channel()
1130 if (!large && chan->freq_offset) in nl80211_msg_put_channel()
1134 chan->center_freq)) in nl80211_msg_put_channel()
1137 if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_OFFSET, chan->freq_offset)) in nl80211_msg_put_channel()
1140 if ((chan->flags & IEEE80211_CHAN_PSD) && in nl80211_msg_put_channel()
1141 nla_put_s8(msg, NL80211_FREQUENCY_ATTR_PSD, chan->psd)) in nl80211_msg_put_channel()
1144 if ((chan->flags & IEEE80211_CHAN_DISABLED) && in nl80211_msg_put_channel()
1147 if (chan->flags & IEEE80211_CHAN_NO_IR) { in nl80211_msg_put_channel()
1153 if (chan->flags & IEEE80211_CHAN_RADAR) { in nl80211_msg_put_channel()
1159 time = elapsed_jiffies_msecs(chan->dfs_state_entered); in nl80211_msg_put_channel()
1162 chan->dfs_state)) in nl80211_msg_put_channel()
1169 chan->dfs_cac_ms)) in nl80211_msg_put_channel()
1175 if ((chan->flags & IEEE80211_CHAN_NO_HT40MINUS) && in nl80211_msg_put_channel()
1178 if ((chan->flags & IEEE80211_CHAN_NO_HT40PLUS) && in nl80211_msg_put_channel()
1181 if ((chan->flags & IEEE80211_CHAN_NO_80MHZ) && in nl80211_msg_put_channel()
1184 if ((chan->flags & IEEE80211_CHAN_NO_160MHZ) && in nl80211_msg_put_channel()
1187 if ((chan->flags & IEEE80211_CHAN_INDOOR_ONLY) && in nl80211_msg_put_channel()
1190 if ((chan->flags & IEEE80211_CHAN_IR_CONCURRENT) && in nl80211_msg_put_channel()
1193 if ((chan->flags & IEEE80211_CHAN_NO_20MHZ) && in nl80211_msg_put_channel()
1196 if ((chan->flags & IEEE80211_CHAN_NO_10MHZ) && in nl80211_msg_put_channel()
1199 if ((chan->flags & IEEE80211_CHAN_NO_HE) && in nl80211_msg_put_channel()
1202 if ((chan->flags & IEEE80211_CHAN_1MHZ) && in nl80211_msg_put_channel()
1205 if ((chan->flags & IEEE80211_CHAN_2MHZ) && in nl80211_msg_put_channel()
1208 if ((chan->flags & IEEE80211_CHAN_4MHZ) && in nl80211_msg_put_channel()
1211 if ((chan->flags & IEEE80211_CHAN_8MHZ) && in nl80211_msg_put_channel()
1214 if ((chan->flags & IEEE80211_CHAN_16MHZ) && in nl80211_msg_put_channel()
1217 if ((chan->flags & IEEE80211_CHAN_NO_320MHZ) && in nl80211_msg_put_channel()
1220 if ((chan->flags & IEEE80211_CHAN_NO_EHT) && in nl80211_msg_put_channel()
1223 if ((chan->flags & IEEE80211_CHAN_DFS_CONCURRENT) && in nl80211_msg_put_channel()
1226 if ((chan->flags & IEEE80211_CHAN_NO_6GHZ_VLP_CLIENT) && in nl80211_msg_put_channel()
1229 if ((chan->flags & IEEE80211_CHAN_NO_6GHZ_AFC_CLIENT) && in nl80211_msg_put_channel()
1232 if ((chan->flags & IEEE80211_CHAN_CAN_MONITOR) && in nl80211_msg_put_channel()
1235 if ((chan->flags & IEEE80211_CHAN_ALLOW_6GHZ_VLP_AP) && in nl80211_msg_put_channel()
1238 if ((chan->flags & IEEE80211_CHAN_ALLOW_20MHZ_ACTIVITY) && in nl80211_msg_put_channel()
1245 DBM_TO_MBM(chan->max_power))) in nl80211_msg_put_channel()
1250 freq_reg_info(wiphy, MHZ_TO_KHZ(chan->center_freq)); in nl80211_msg_put_channel()
1252 if (!IS_ERR_OR_NULL(rule) && rule->has_wmm) { in nl80211_msg_put_channel()
1261 return -ENOBUFS; in nl80211_msg_put_channel()
1271 if (txqstats->filled & BIT(NL80211_TXQ_STATS_ ## attr) && \ in nl80211_put_txq_stats()
1272 nla_put_u32(msg, NL80211_TXQ_STATS_ ## attr, txqstats->memb)) \ in nl80211_put_txq_stats()
1300 * nl80211_link_id - return link ID
1322 return -1; in nl80211_link_id_or_invalid()
1341 info->extack); in nl80211_parse_key_new()
1345 k->def = !!tb[NL80211_KEY_DEFAULT]; in nl80211_parse_key_new()
1346 k->defmgmt = !!tb[NL80211_KEY_DEFAULT_MGMT]; in nl80211_parse_key_new()
1347 k->defbeacon = !!tb[NL80211_KEY_DEFAULT_BEACON]; in nl80211_parse_key_new()
1349 if (k->def) { in nl80211_parse_key_new()
1350 k->def_uni = true; in nl80211_parse_key_new()
1351 k->def_multi = true; in nl80211_parse_key_new()
1353 if (k->defmgmt || k->defbeacon) in nl80211_parse_key_new()
1354 k->def_multi = true; in nl80211_parse_key_new()
1357 k->idx = nla_get_u8(tb[NL80211_KEY_IDX]); in nl80211_parse_key_new()
1360 k->p.key = nla_data(tb[NL80211_KEY_DATA]); in nl80211_parse_key_new()
1361 k->p.key_len = nla_len(tb[NL80211_KEY_DATA]); in nl80211_parse_key_new()
1365 k->p.seq = nla_data(tb[NL80211_KEY_SEQ]); in nl80211_parse_key_new()
1366 k->p.seq_len = nla_len(tb[NL80211_KEY_SEQ]); in nl80211_parse_key_new()
1370 k->p.cipher = nla_get_u32(tb[NL80211_KEY_CIPHER]); in nl80211_parse_key_new()
1373 k->type = nla_get_u32(tb[NL80211_KEY_TYPE]); in nl80211_parse_key_new()
1379 NUM_NL80211_KEY_DEFAULT_TYPES - 1, in nl80211_parse_key_new()
1382 info->extack); in nl80211_parse_key_new()
1386 k->def_uni = kdt[NL80211_KEY_DEFAULT_TYPE_UNICAST]; in nl80211_parse_key_new()
1387 k->def_multi = kdt[NL80211_KEY_DEFAULT_TYPE_MULTICAST]; in nl80211_parse_key_new()
1391 k->p.mode = nla_get_u8(tb[NL80211_KEY_MODE]); in nl80211_parse_key_new()
1398 if (info->attrs[NL80211_ATTR_KEY_DATA]) { in nl80211_parse_key_old()
1399 k->p.key = nla_data(info->attrs[NL80211_ATTR_KEY_DATA]); in nl80211_parse_key_old()
1400 k->p.key_len = nla_len(info->attrs[NL80211_ATTR_KEY_DATA]); in nl80211_parse_key_old()
1403 if (info->attrs[NL80211_ATTR_KEY_SEQ]) { in nl80211_parse_key_old()
1404 k->p.seq = nla_data(info->attrs[NL80211_ATTR_KEY_SEQ]); in nl80211_parse_key_old()
1405 k->p.seq_len = nla_len(info->attrs[NL80211_ATTR_KEY_SEQ]); in nl80211_parse_key_old()
1408 if (info->attrs[NL80211_ATTR_KEY_IDX]) in nl80211_parse_key_old()
1409 k->idx = nla_get_u8(info->attrs[NL80211_ATTR_KEY_IDX]); in nl80211_parse_key_old()
1411 if (info->attrs[NL80211_ATTR_KEY_CIPHER]) in nl80211_parse_key_old()
1412 k->p.cipher = nla_get_u32(info->attrs[NL80211_ATTR_KEY_CIPHER]); in nl80211_parse_key_old()
1414 k->def = !!info->attrs[NL80211_ATTR_KEY_DEFAULT]; in nl80211_parse_key_old()
1415 k->defmgmt = !!info->attrs[NL80211_ATTR_KEY_DEFAULT_MGMT]; in nl80211_parse_key_old()
1417 if (k->def) { in nl80211_parse_key_old()
1418 k->def_uni = true; in nl80211_parse_key_old()
1419 k->def_multi = true; in nl80211_parse_key_old()
1421 if (k->defmgmt) in nl80211_parse_key_old()
1422 k->def_multi = true; in nl80211_parse_key_old()
1424 if (info->attrs[NL80211_ATTR_KEY_TYPE]) in nl80211_parse_key_old()
1425 k->type = nla_get_u32(info->attrs[NL80211_ATTR_KEY_TYPE]); in nl80211_parse_key_old()
1427 if (info->attrs[NL80211_ATTR_KEY_DEFAULT_TYPES]) { in nl80211_parse_key_old()
1430 NUM_NL80211_KEY_DEFAULT_TYPES - 1, in nl80211_parse_key_old()
1431 info->attrs[NL80211_ATTR_KEY_DEFAULT_TYPES], in nl80211_parse_key_old()
1433 info->extack); in nl80211_parse_key_old()
1437 k->def_uni = kdt[NL80211_KEY_DEFAULT_TYPE_UNICAST]; in nl80211_parse_key_old()
1438 k->def_multi = kdt[NL80211_KEY_DEFAULT_TYPE_MULTICAST]; in nl80211_parse_key_old()
1449 k->idx = -1; in nl80211_parse_key()
1450 k->type = -1; in nl80211_parse_key()
1452 if (info->attrs[NL80211_ATTR_KEY]) in nl80211_parse_key()
1453 err = nl80211_parse_key_new(info, info->attrs[NL80211_ATTR_KEY], k); in nl80211_parse_key()
1460 if ((k->def ? 1 : 0) + (k->defmgmt ? 1 : 0) + in nl80211_parse_key()
1461 (k->defbeacon ? 1 : 0) > 1) { in nl80211_parse_key()
1464 return -EINVAL; in nl80211_parse_key()
1467 if (k->defmgmt || k->defbeacon) { in nl80211_parse_key()
1468 if (k->def_uni || !k->def_multi) { in nl80211_parse_key()
1471 return -EINVAL; in nl80211_parse_key()
1475 if (k->idx != -1) { in nl80211_parse_key()
1476 if (k->defmgmt) { in nl80211_parse_key()
1477 if (k->idx < 4 || k->idx > 5) { in nl80211_parse_key()
1480 return -EINVAL; in nl80211_parse_key()
1482 } else if (k->defbeacon) { in nl80211_parse_key()
1483 if (k->idx < 6 || k->idx > 7) { in nl80211_parse_key()
1486 return -EINVAL; in nl80211_parse_key()
1488 } else if (k->def) { in nl80211_parse_key()
1489 if (k->idx < 0 || k->idx > 3) { in nl80211_parse_key()
1490 GENL_SET_ERR_MSG(info, "def key idx not 0-3"); in nl80211_parse_key()
1491 return -EINVAL; in nl80211_parse_key()
1494 if (k->idx < 0 || k->idx > 7) { in nl80211_parse_key()
1495 GENL_SET_ERR_MSG(info, "key idx not 0-7"); in nl80211_parse_key()
1496 return -EINVAL; in nl80211_parse_key()
1508 struct nlattr *keys = info->attrs[NL80211_ATTR_KEYS]; in nl80211_parse_connkeys()
1525 return ERR_PTR(-ENOMEM); in nl80211_parse_connkeys()
1527 result->def = -1; in nl80211_parse_connkeys()
1531 parse.idx = -1; in nl80211_parse_connkeys()
1536 err = -EINVAL; in nl80211_parse_connkeys()
1540 GENL_SET_ERR_MSG(info, "key index out of range [0-3]"); in nl80211_parse_connkeys()
1550 result->def = parse.idx; in nl80211_parse_connkeys()
1562 err = -EINVAL; in nl80211_parse_connkeys()
1565 result->params[parse.idx].cipher = parse.p.cipher; in nl80211_parse_connkeys()
1566 result->params[parse.idx].key_len = parse.p.key_len; in nl80211_parse_connkeys()
1567 result->params[parse.idx].key = result->data[parse.idx]; in nl80211_parse_connkeys()
1568 memcpy(result->data[parse.idx], parse.p.key, parse.p.key_len); in nl80211_parse_connkeys()
1575 if (result->def < 0) { in nl80211_parse_connkeys()
1576 err = -EINVAL; in nl80211_parse_connkeys()
1577 GENL_SET_ERR_MSG(info, "need a default/TX key"); in nl80211_parse_connkeys()
1589 lockdep_assert_wiphy(wdev->wiphy); in nl80211_key_allowed()
1591 switch (wdev->iftype) { in nl80211_key_allowed()
1598 if (wdev->u.ibss.current_bss) in nl80211_key_allowed()
1600 return -ENOLINK; in nl80211_key_allowed()
1603 if (wdev->connected) in nl80211_key_allowed()
1605 return -ENOLINK; in nl80211_key_allowed()
1607 if (wiphy_ext_feature_isset(wdev->wiphy, in nl80211_key_allowed()
1610 return -EINVAL; in nl80211_key_allowed()
1617 return -EINVAL; in nl80211_key_allowed()
1629 if (!chan || chan->flags & IEEE80211_CHAN_DISABLED) in nl80211_get_valid_chan()
1654 return -ENOBUFS; in nl80211_put_iftypes()
1673 for (i = 0; i < c->n_limits; i++) { in nl80211_put_ifcomb_data()
1679 if (nla_put_u32(msg, NL80211_IFACE_LIMIT_MAX, c->limits[i].max)) in nl80211_put_ifcomb_data()
1682 c->limits[i].types)) in nl80211_put_ifcomb_data()
1689 if (c->beacon_int_infra_match && in nl80211_put_ifcomb_data()
1693 c->num_different_channels) || in nl80211_put_ifcomb_data()
1695 c->max_interfaces)) in nl80211_put_ifcomb_data()
1699 c->radar_detect_widths) || in nl80211_put_ifcomb_data()
1701 c->radar_detect_regions))) in nl80211_put_ifcomb_data()
1703 if (c->beacon_int_min_gcd && in nl80211_put_ifcomb_data()
1705 c->beacon_int_min_gcd)) in nl80211_put_ifcomb_data()
1712 return -ENOBUFS; in nl80211_put_ifcomb_data()
1729 c = wiphy->radio[0].iface_combinations; in nl80211_put_iface_combinations()
1730 n = wiphy->radio[0].n_iface_combinations; in nl80211_put_iface_combinations()
1732 c = wiphy->iface_combinations; in nl80211_put_iface_combinations()
1733 n = wiphy->n_iface_combinations; in nl80211_put_iface_combinations()
1743 return -ENOBUFS; in nl80211_put_iface_combinations()
1750 const struct wiphy_wowlan_tcp_support *tcp = rdev->wiphy.wowlan->tcp; in nl80211_send_wowlan_tcp_caps()
1759 return -ENOBUFS; in nl80211_send_wowlan_tcp_caps()
1762 tcp->data_payload_max)) in nl80211_send_wowlan_tcp_caps()
1763 return -ENOBUFS; in nl80211_send_wowlan_tcp_caps()
1766 tcp->data_payload_max)) in nl80211_send_wowlan_tcp_caps()
1767 return -ENOBUFS; in nl80211_send_wowlan_tcp_caps()
1769 if (tcp->seq && nla_put_flag(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ)) in nl80211_send_wowlan_tcp_caps()
1770 return -ENOBUFS; in nl80211_send_wowlan_tcp_caps()
1772 if (tcp->tok && nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN, in nl80211_send_wowlan_tcp_caps()
1773 sizeof(*tcp->tok), tcp->tok)) in nl80211_send_wowlan_tcp_caps()
1774 return -ENOBUFS; in nl80211_send_wowlan_tcp_caps()
1777 tcp->data_interval_max)) in nl80211_send_wowlan_tcp_caps()
1778 return -ENOBUFS; in nl80211_send_wowlan_tcp_caps()
1781 tcp->wake_payload_max)) in nl80211_send_wowlan_tcp_caps()
1782 return -ENOBUFS; in nl80211_send_wowlan_tcp_caps()
1794 if (!rdev->wiphy.wowlan) in nl80211_send_wowlan()
1800 return -ENOBUFS; in nl80211_send_wowlan()
1802 if (((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_ANY) && in nl80211_send_wowlan()
1804 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_DISCONNECT) && in nl80211_send_wowlan()
1806 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_MAGIC_PKT) && in nl80211_send_wowlan()
1808 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_SUPPORTS_GTK_REKEY) && in nl80211_send_wowlan()
1810 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_GTK_REKEY_FAILURE) && in nl80211_send_wowlan()
1812 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_EAP_IDENTITY_REQ) && in nl80211_send_wowlan()
1814 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_4WAY_HANDSHAKE) && in nl80211_send_wowlan()
1816 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_RFKILL_RELEASE) && in nl80211_send_wowlan()
1818 return -ENOBUFS; in nl80211_send_wowlan()
1820 if (rdev->wiphy.wowlan->n_patterns) { in nl80211_send_wowlan()
1822 .max_patterns = rdev->wiphy.wowlan->n_patterns, in nl80211_send_wowlan()
1823 .min_pattern_len = rdev->wiphy.wowlan->pattern_min_len, in nl80211_send_wowlan()
1824 .max_pattern_len = rdev->wiphy.wowlan->pattern_max_len, in nl80211_send_wowlan()
1825 .max_pkt_offset = rdev->wiphy.wowlan->max_pkt_offset, in nl80211_send_wowlan()
1830 return -ENOBUFS; in nl80211_send_wowlan()
1833 if ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_NET_DETECT) && in nl80211_send_wowlan()
1835 rdev->wiphy.wowlan->max_nd_match_sets)) in nl80211_send_wowlan()
1836 return -ENOBUFS; in nl80211_send_wowlan()
1839 return -ENOBUFS; in nl80211_send_wowlan()
1852 if (!rdev->wiphy.coalesce) in nl80211_send_coalesce()
1855 rule.max_rules = rdev->wiphy.coalesce->n_rules; in nl80211_send_coalesce()
1856 rule.max_delay = rdev->wiphy.coalesce->max_delay; in nl80211_send_coalesce()
1857 rule.pat.max_patterns = rdev->wiphy.coalesce->n_patterns; in nl80211_send_coalesce()
1858 rule.pat.min_pattern_len = rdev->wiphy.coalesce->pattern_min_len; in nl80211_send_coalesce()
1859 rule.pat.max_pattern_len = rdev->wiphy.coalesce->pattern_max_len; in nl80211_send_coalesce()
1860 rule.pat.max_pkt_offset = rdev->wiphy.coalesce->max_pkt_offset; in nl80211_send_coalesce()
1863 return -ENOBUFS; in nl80211_send_coalesce()
1873 const struct ieee80211_sta_he_cap *he_cap = &iftdata->he_cap; in nl80211_send_iftype_data()
1874 const struct ieee80211_sta_eht_cap *eht_cap = &iftdata->eht_cap; in nl80211_send_iftype_data()
1877 iftdata->types_mask)) in nl80211_send_iftype_data()
1878 return -ENOBUFS; in nl80211_send_iftype_data()
1880 if (he_cap->has_he) { in nl80211_send_iftype_data()
1882 sizeof(he_cap->he_cap_elem.mac_cap_info), in nl80211_send_iftype_data()
1883 he_cap->he_cap_elem.mac_cap_info) || in nl80211_send_iftype_data()
1885 sizeof(he_cap->he_cap_elem.phy_cap_info), in nl80211_send_iftype_data()
1886 he_cap->he_cap_elem.phy_cap_info) || in nl80211_send_iftype_data()
1888 sizeof(he_cap->he_mcs_nss_supp), in nl80211_send_iftype_data()
1889 &he_cap->he_mcs_nss_supp) || in nl80211_send_iftype_data()
1891 sizeof(he_cap->ppe_thres), he_cap->ppe_thres)) in nl80211_send_iftype_data()
1892 return -ENOBUFS; in nl80211_send_iftype_data()
1895 if (eht_cap->has_eht && he_cap->has_he) { in nl80211_send_iftype_data()
1900 is_ap = iftdata->types_mask & BIT(NL80211_IFTYPE_AP) || in nl80211_send_iftype_data()
1901 iftdata->types_mask & BIT(NL80211_IFTYPE_P2P_GO); in nl80211_send_iftype_data()
1904 ieee80211_eht_mcs_nss_size(&he_cap->he_cap_elem, in nl80211_send_iftype_data()
1905 &eht_cap->eht_cap_elem, in nl80211_send_iftype_data()
1908 ppe_thres_hdr = get_unaligned_le16(&eht_cap->eht_ppe_thres[0]); in nl80211_send_iftype_data()
1911 eht_cap->eht_cap_elem.phy_cap_info); in nl80211_send_iftype_data()
1914 sizeof(eht_cap->eht_cap_elem.mac_cap_info), in nl80211_send_iftype_data()
1915 eht_cap->eht_cap_elem.mac_cap_info) || in nl80211_send_iftype_data()
1917 sizeof(eht_cap->eht_cap_elem.phy_cap_info), in nl80211_send_iftype_data()
1918 eht_cap->eht_cap_elem.phy_cap_info) || in nl80211_send_iftype_data()
1920 mcs_nss_size, &eht_cap->eht_mcs_nss_supp) || in nl80211_send_iftype_data()
1922 ppe_thresh_size, eht_cap->eht_ppe_thres)) in nl80211_send_iftype_data()
1923 return -ENOBUFS; in nl80211_send_iftype_data()
1926 if (sband->band == NL80211_BAND_6GHZ && in nl80211_send_iftype_data()
1928 sizeof(iftdata->he_6ghz_capa), in nl80211_send_iftype_data()
1929 &iftdata->he_6ghz_capa)) in nl80211_send_iftype_data()
1930 return -ENOBUFS; in nl80211_send_iftype_data()
1932 if (iftdata->vendor_elems.data && iftdata->vendor_elems.len && in nl80211_send_iftype_data()
1934 iftdata->vendor_elems.len, iftdata->vendor_elems.data)) in nl80211_send_iftype_data()
1935 return -ENOBUFS; in nl80211_send_iftype_data()
1949 if (sband->ht_cap.ht_supported && in nl80211_send_band_rateinfo()
1951 sizeof(sband->ht_cap.mcs), in nl80211_send_band_rateinfo()
1952 &sband->ht_cap.mcs) || in nl80211_send_band_rateinfo()
1954 sband->ht_cap.cap) || in nl80211_send_band_rateinfo()
1956 sband->ht_cap.ampdu_factor) || in nl80211_send_band_rateinfo()
1958 sband->ht_cap.ampdu_density))) in nl80211_send_band_rateinfo()
1959 return -ENOBUFS; in nl80211_send_band_rateinfo()
1962 if (sband->vht_cap.vht_supported && in nl80211_send_band_rateinfo()
1964 sizeof(sband->vht_cap.vht_mcs), in nl80211_send_band_rateinfo()
1965 &sband->vht_cap.vht_mcs) || in nl80211_send_band_rateinfo()
1967 sband->vht_cap.cap))) in nl80211_send_band_rateinfo()
1968 return -ENOBUFS; in nl80211_send_band_rateinfo()
1970 if (large && sband->n_iftype_data) { in nl80211_send_band_rateinfo()
1978 return -ENOBUFS; in nl80211_send_band_rateinfo()
1985 return -ENOBUFS; in nl80211_send_band_rateinfo()
1998 if (large && sband->edmg_cap.channels && in nl80211_send_band_rateinfo()
2000 sband->edmg_cap.channels) || in nl80211_send_band_rateinfo()
2002 sband->edmg_cap.bw_config))) in nl80211_send_band_rateinfo()
2004 return -ENOBUFS; in nl80211_send_band_rateinfo()
2009 return -ENOBUFS; in nl80211_send_band_rateinfo()
2011 for (i = 0; i < sband->n_bitrates; i++) { in nl80211_send_band_rateinfo()
2014 return -ENOBUFS; in nl80211_send_band_rateinfo()
2016 rate = &sband->bitrates[i]; in nl80211_send_band_rateinfo()
2018 rate->bitrate)) in nl80211_send_band_rateinfo()
2019 return -ENOBUFS; in nl80211_send_band_rateinfo()
2020 if ((rate->flags & IEEE80211_RATE_SHORT_PREAMBLE) && in nl80211_send_band_rateinfo()
2023 return -ENOBUFS; in nl80211_send_band_rateinfo()
2031 if (sband->band == NL80211_BAND_S1GHZ && sband->s1g_cap.s1g && in nl80211_send_band_rateinfo()
2033 sizeof(sband->s1g_cap.cap), in nl80211_send_band_rateinfo()
2034 sband->s1g_cap.cap) || in nl80211_send_band_rateinfo()
2036 sizeof(sband->s1g_cap.nss_mcs), in nl80211_send_band_rateinfo()
2037 sband->s1g_cap.nss_mcs))) in nl80211_send_band_rateinfo()
2038 return -ENOBUFS; in nl80211_send_band_rateinfo()
2057 return -ENOBUFS; in nl80211_send_mgmt_stypes()
2062 return -ENOBUFS; in nl80211_send_mgmt_stypes()
2064 stypes = mgmt_stypes[ift].tx; in nl80211_send_mgmt_stypes()
2069 return -ENOBUFS; in nl80211_send_mgmt_stypes()
2080 return -ENOBUFS; in nl80211_send_mgmt_stypes()
2085 return -ENOBUFS; in nl80211_send_mgmt_stypes()
2092 return -ENOBUFS; in nl80211_send_mgmt_stypes()
2105 if (rdev->ops->op) { \
2139 if (rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL) in nl80211_add_commands_unsplit()
2144 if (rdev->wiphy.flags & WIPHY_FLAG_NETNS_OK) { in nl80211_add_commands_unsplit()
2149 if (rdev->ops->set_monitor_channel || rdev->ops->start_ap || in nl80211_add_commands_unsplit()
2150 rdev->ops->join_mesh) { in nl80211_add_commands_unsplit()
2155 if (rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) { in nl80211_add_commands_unsplit()
2159 if (rdev->wiphy.max_sched_scan_reqs) in nl80211_add_commands_unsplit()
2163 if (rdev->wiphy.flags & WIPHY_FLAG_REPORTS_OBSS) { in nl80211_add_commands_unsplit()
2174 if (rdev->ops->connect || rdev->ops->auth) { in nl80211_add_commands_unsplit()
2180 if (rdev->ops->disconnect || rdev->ops->deauth) { in nl80211_add_commands_unsplit()
2188 return -ENOBUFS; in nl80211_add_commands_unsplit()
2197 if (!cap->ftm.supported) in nl80211_send_pmsr_ftm_capa()
2202 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
2204 if (cap->ftm.asap && nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_ASAP)) in nl80211_send_pmsr_ftm_capa()
2205 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
2206 if (cap->ftm.non_asap && in nl80211_send_pmsr_ftm_capa()
2208 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
2209 if (cap->ftm.request_lci && in nl80211_send_pmsr_ftm_capa()
2211 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
2212 if (cap->ftm.request_civicloc && in nl80211_send_pmsr_ftm_capa()
2214 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
2216 cap->ftm.preambles)) in nl80211_send_pmsr_ftm_capa()
2217 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
2219 cap->ftm.bandwidths)) in nl80211_send_pmsr_ftm_capa()
2220 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
2221 if (cap->ftm.max_bursts_exponent >= 0 && in nl80211_send_pmsr_ftm_capa()
2223 cap->ftm.max_bursts_exponent)) in nl80211_send_pmsr_ftm_capa()
2224 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
2225 if (cap->ftm.max_ftms_per_burst && in nl80211_send_pmsr_ftm_capa()
2227 cap->ftm.max_ftms_per_burst)) in nl80211_send_pmsr_ftm_capa()
2228 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
2229 if (cap->ftm.trigger_based && in nl80211_send_pmsr_ftm_capa()
2231 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
2232 if (cap->ftm.non_trigger_based && in nl80211_send_pmsr_ftm_capa()
2234 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
2243 const struct cfg80211_pmsr_capabilities *cap = rdev->wiphy.pmsr_capa; in nl80211_send_pmsr_capa()
2256 return -ENOBUFS; in nl80211_send_pmsr_capa()
2258 if (nla_put_u32(msg, NL80211_PMSR_ATTR_MAX_PEERS, cap->max_peers)) in nl80211_send_pmsr_capa()
2259 return -ENOBUFS; in nl80211_send_pmsr_capa()
2261 if (cap->report_ap_tsf && in nl80211_send_pmsr_capa()
2263 return -ENOBUFS; in nl80211_send_pmsr_capa()
2265 if (cap->randomize_mac_addr && in nl80211_send_pmsr_capa()
2267 return -ENOBUFS; in nl80211_send_pmsr_capa()
2271 return -ENOBUFS; in nl80211_send_pmsr_capa()
2274 return -ENOBUFS; in nl80211_send_pmsr_capa()
2290 if (!rdev->wiphy.num_iftype_akm_suites || in nl80211_put_iftype_akm_suites()
2291 !rdev->wiphy.iftype_akm_suites) in nl80211_put_iftype_akm_suites()
2296 return -ENOBUFS; in nl80211_put_iftype_akm_suites()
2298 for (i = 0; i < rdev->wiphy.num_iftype_akm_suites; i++) { in nl80211_put_iftype_akm_suites()
2301 return -ENOBUFS; in nl80211_put_iftype_akm_suites()
2303 iftype_akms = &rdev->wiphy.iftype_akm_suites[i]; in nl80211_put_iftype_akm_suites()
2306 iftype_akms->iftypes_mask)) in nl80211_put_iftype_akm_suites()
2307 return -ENOBUFS; in nl80211_put_iftype_akm_suites()
2310 sizeof(u32) * iftype_akms->n_akm_suites, in nl80211_put_iftype_akm_suites()
2311 iftype_akms->akm_suites)) { in nl80211_put_iftype_akm_suites()
2312 return -ENOBUFS; in nl80211_put_iftype_akm_suites()
2328 if (!rdev->wiphy.tid_config_support.vif && in nl80211_put_tid_config_support()
2329 !rdev->wiphy.tid_config_support.peer) in nl80211_put_tid_config_support()
2334 return -ENOSPC; in nl80211_put_tid_config_support()
2336 if (rdev->wiphy.tid_config_support.vif && in nl80211_put_tid_config_support()
2338 rdev->wiphy.tid_config_support.vif, in nl80211_put_tid_config_support()
2342 if (rdev->wiphy.tid_config_support.peer && in nl80211_put_tid_config_support()
2344 rdev->wiphy.tid_config_support.peer, in nl80211_put_tid_config_support()
2350 rdev->wiphy.tid_config_support.max_retry)) in nl80211_put_tid_config_support()
2353 rdev->wiphy.tid_config_support.max_retry)) in nl80211_put_tid_config_support()
2361 return -ENOBUFS; in nl80211_put_tid_config_support()
2372 if (!rdev->wiphy.sar_capa) in nl80211_put_sar_specs()
2375 num_freq_ranges = rdev->wiphy.sar_capa->num_freq_ranges; in nl80211_put_sar_specs()
2379 return -ENOSPC; in nl80211_put_sar_specs()
2381 if (nla_put_u32(msg, NL80211_SAR_ATTR_TYPE, rdev->wiphy.sar_capa->type)) in nl80211_put_sar_specs()
2395 rdev->wiphy.sar_capa->freq_ranges[i].start_freq)) in nl80211_put_sar_specs()
2399 rdev->wiphy.sar_capa->freq_ranges[i].end_freq)) in nl80211_put_sar_specs()
2411 return -ENOBUFS; in nl80211_put_sar_specs()
2418 if (!wiphy->mbssid_max_interfaces) in nl80211_put_mbssid_support()
2423 return -ENOBUFS; in nl80211_put_mbssid_support()
2426 wiphy->mbssid_max_interfaces)) in nl80211_put_mbssid_support()
2429 if (wiphy->ema_max_profile_periodicity && in nl80211_put_mbssid_support()
2432 wiphy->ema_max_profile_periodicity)) in nl80211_put_mbssid_support()
2440 return -ENOBUFS; in nl80211_put_mbssid_support()
2445 const struct wiphy_radio *r = &wiphy->radio[idx]; in nl80211_put_radio()
2451 return -ENOBUFS; in nl80211_put_radio()
2456 if (r->antenna_mask && in nl80211_put_radio()
2458 r->antenna_mask)) in nl80211_put_radio()
2461 for (i = 0; i < r->n_freq_range; i++) { in nl80211_put_radio()
2462 const struct wiphy_radio_freq_range *range = &r->freq_range[i]; in nl80211_put_radio()
2469 range->start_freq) || in nl80211_put_radio()
2471 range->end_freq)) in nl80211_put_radio()
2477 for (i = 0; i < r->n_iface_combinations; i++) in nl80211_put_radio()
2480 &r->iface_combinations[i], in nl80211_put_radio()
2489 return -ENOBUFS; in nl80211_put_radio()
2497 if (!wiphy->n_radio) in nl80211_put_radios()
2502 return -ENOBUFS; in nl80211_put_radios()
2504 for (i = 0; i < wiphy->n_radio; i++) in nl80211_put_radios()
2512 -1, true, NLA_F_NESTED)) in nl80211_put_radios()
2513 return -ENOBUFS; in nl80211_put_radios()
2519 return -ENOBUFS; in nl80211_put_radios()
2542 rdev->wiphy.mgmt_stypes; in nl80211_send_wiphy()
2547 return -ENOBUFS; in nl80211_send_wiphy()
2550 return -EINVAL; in nl80211_send_wiphy()
2552 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_wiphy()
2554 wiphy_name(&rdev->wiphy)) || in nl80211_send_wiphy()
2562 switch (state->split_start) { in nl80211_send_wiphy()
2565 rdev->wiphy.retry_short) || in nl80211_send_wiphy()
2567 rdev->wiphy.retry_long) || in nl80211_send_wiphy()
2569 rdev->wiphy.frag_threshold) || in nl80211_send_wiphy()
2571 rdev->wiphy.rts_threshold) || in nl80211_send_wiphy()
2573 rdev->wiphy.coverage_class) || in nl80211_send_wiphy()
2575 rdev->wiphy.max_scan_ssids) || in nl80211_send_wiphy()
2577 rdev->wiphy.max_sched_scan_ssids) || in nl80211_send_wiphy()
2579 rdev->wiphy.max_scan_ie_len) || in nl80211_send_wiphy()
2581 rdev->wiphy.max_sched_scan_ie_len) || in nl80211_send_wiphy()
2583 rdev->wiphy.max_match_sets)) in nl80211_send_wiphy()
2586 if ((rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN) && in nl80211_send_wiphy()
2589 if ((rdev->wiphy.flags & WIPHY_FLAG_MESH_AUTH) && in nl80211_send_wiphy()
2592 if ((rdev->wiphy.flags & WIPHY_FLAG_AP_UAPSD) && in nl80211_send_wiphy()
2595 if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_FW_ROAM) && in nl80211_send_wiphy()
2598 if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) && in nl80211_send_wiphy()
2601 if ((rdev->wiphy.flags & WIPHY_FLAG_TDLS_EXTERNAL_SETUP) && in nl80211_send_wiphy()
2604 state->split_start++; in nl80211_send_wiphy()
2605 if (state->split) in nl80211_send_wiphy()
2610 sizeof(u32) * rdev->wiphy.n_cipher_suites, in nl80211_send_wiphy()
2611 rdev->wiphy.cipher_suites)) in nl80211_send_wiphy()
2615 rdev->wiphy.max_num_pmkids)) in nl80211_send_wiphy()
2618 if ((rdev->wiphy.flags & WIPHY_FLAG_CONTROL_PORT_PROTOCOL) && in nl80211_send_wiphy()
2623 rdev->wiphy.available_antennas_tx) || in nl80211_send_wiphy()
2625 rdev->wiphy.available_antennas_rx)) in nl80211_send_wiphy()
2628 if ((rdev->wiphy.flags & WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD) && in nl80211_send_wiphy()
2630 rdev->wiphy.probe_resp_offload)) in nl80211_send_wiphy()
2633 if ((rdev->wiphy.available_antennas_tx || in nl80211_send_wiphy()
2634 rdev->wiphy.available_antennas_rx) && in nl80211_send_wiphy()
2635 rdev->ops->get_antenna) { in nl80211_send_wiphy()
2651 state->split_start++; in nl80211_send_wiphy()
2652 if (state->split) in nl80211_send_wiphy()
2657 rdev->wiphy.interface_modes)) in nl80211_send_wiphy()
2659 state->split_start++; in nl80211_send_wiphy()
2660 if (state->split) in nl80211_send_wiphy()
2669 for (band = state->band_start; in nl80211_send_wiphy()
2670 band < (state->split ? in nl80211_send_wiphy()
2677 if (band > NL80211_BAND_5GHZ && !state->split) in nl80211_send_wiphy()
2680 sband = rdev->wiphy.bands[band]; in nl80211_send_wiphy()
2689 switch (state->chan_start) { in nl80211_send_wiphy()
2692 state->split)) in nl80211_send_wiphy()
2694 state->chan_start++; in nl80211_send_wiphy()
2695 if (state->split) in nl80211_send_wiphy()
2705 for (i = state->chan_start - 1; in nl80211_send_wiphy()
2706 i < sband->n_channels; in nl80211_send_wiphy()
2713 chan = &sband->channels[i]; in nl80211_send_wiphy()
2716 msg, &rdev->wiphy, chan, in nl80211_send_wiphy()
2717 state->split)) in nl80211_send_wiphy()
2721 if (state->split) in nl80211_send_wiphy()
2724 if (i < sband->n_channels) in nl80211_send_wiphy()
2725 state->chan_start = i + 2; in nl80211_send_wiphy()
2727 state->chan_start = 0; in nl80211_send_wiphy()
2733 if (state->split) { in nl80211_send_wiphy()
2735 if (state->chan_start) in nl80211_send_wiphy()
2736 band--; in nl80211_send_wiphy()
2743 state->band_start = band + 1; in nl80211_send_wiphy()
2745 state->band_start = 0; in nl80211_send_wiphy()
2748 if (state->band_start == 0 && state->chan_start == 0) in nl80211_send_wiphy()
2749 state->split_start++; in nl80211_send_wiphy()
2750 if (state->split) in nl80211_send_wiphy()
2762 if (state->split) { in nl80211_send_wiphy()
2765 if (rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH) in nl80211_send_wiphy()
2768 if (rdev->wiphy.features & in nl80211_send_wiphy()
2774 if (rdev->wiphy.sar_capa) in nl80211_send_wiphy()
2781 state->split_start++; in nl80211_send_wiphy()
2782 if (state->split) in nl80211_send_wiphy()
2786 if (rdev->ops->remain_on_channel && in nl80211_send_wiphy()
2787 (rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL) && in nl80211_send_wiphy()
2790 rdev->wiphy.max_remain_on_channel_duration)) in nl80211_send_wiphy()
2793 if ((rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX) && in nl80211_send_wiphy()
2797 state->split_start++; in nl80211_send_wiphy()
2798 if (state->split) in nl80211_send_wiphy()
2803 if (nl80211_send_wowlan(msg, rdev, state->split)) in nl80211_send_wiphy()
2805 state->split_start++; in nl80211_send_wiphy()
2806 if (state->split) in nl80211_send_wiphy()
2809 state->split_start++; in nl80211_send_wiphy()
2814 rdev->wiphy.software_iftypes)) in nl80211_send_wiphy()
2817 if (nl80211_put_iface_combinations(&rdev->wiphy, msg, in nl80211_send_wiphy()
2819 rdev->wiphy.n_radio ? 0 : -1, in nl80211_send_wiphy()
2820 state->split, 0)) in nl80211_send_wiphy()
2823 state->split_start++; in nl80211_send_wiphy()
2824 if (state->split) in nl80211_send_wiphy()
2828 if ((rdev->wiphy.flags & WIPHY_FLAG_HAVE_AP_SME) && in nl80211_send_wiphy()
2830 rdev->wiphy.ap_sme_capa)) in nl80211_send_wiphy()
2833 features = rdev->wiphy.features; in nl80211_send_wiphy()
2835 * We can only add the per-channel limit information if the in nl80211_send_wiphy()
2839 if (state->split) in nl80211_send_wiphy()
2844 if (rdev->wiphy.ht_capa_mod_mask && in nl80211_send_wiphy()
2846 sizeof(*rdev->wiphy.ht_capa_mod_mask), in nl80211_send_wiphy()
2847 rdev->wiphy.ht_capa_mod_mask)) in nl80211_send_wiphy()
2850 if (rdev->wiphy.flags & WIPHY_FLAG_HAVE_AP_SME && in nl80211_send_wiphy()
2851 rdev->wiphy.max_acl_mac_addrs && in nl80211_send_wiphy()
2853 rdev->wiphy.max_acl_mac_addrs)) in nl80211_send_wiphy()
2866 if (state->split) in nl80211_send_wiphy()
2867 state->split_start++; in nl80211_send_wiphy()
2869 state->split_start = 0; in nl80211_send_wiphy()
2876 rdev->wiphy.max_sched_scan_plans) || in nl80211_send_wiphy()
2878 rdev->wiphy.max_sched_scan_plan_interval) || in nl80211_send_wiphy()
2880 rdev->wiphy.max_sched_scan_plan_iterations)) in nl80211_send_wiphy()
2883 if (rdev->wiphy.extended_capabilities && in nl80211_send_wiphy()
2885 rdev->wiphy.extended_capabilities_len, in nl80211_send_wiphy()
2886 rdev->wiphy.extended_capabilities) || in nl80211_send_wiphy()
2888 rdev->wiphy.extended_capabilities_len, in nl80211_send_wiphy()
2889 rdev->wiphy.extended_capabilities_mask))) in nl80211_send_wiphy()
2892 if (rdev->wiphy.vht_capa_mod_mask && in nl80211_send_wiphy()
2894 sizeof(*rdev->wiphy.vht_capa_mod_mask), in nl80211_send_wiphy()
2895 rdev->wiphy.vht_capa_mod_mask)) in nl80211_send_wiphy()
2899 rdev->wiphy.perm_addr)) in nl80211_send_wiphy()
2902 if (!is_zero_ether_addr(rdev->wiphy.addr_mask) && in nl80211_send_wiphy()
2904 rdev->wiphy.addr_mask)) in nl80211_send_wiphy()
2907 if (rdev->wiphy.n_addresses > 1) { in nl80211_send_wiphy()
2914 for (i = 0; i < rdev->wiphy.n_addresses; i++) in nl80211_send_wiphy()
2916 rdev->wiphy.addresses[i].addr)) in nl80211_send_wiphy()
2922 state->split_start++; in nl80211_send_wiphy()
2928 if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_5_10_MHZ) && in nl80211_send_wiphy()
2933 if (rdev->wiphy.max_ap_assoc_sta && in nl80211_send_wiphy()
2935 rdev->wiphy.max_ap_assoc_sta)) in nl80211_send_wiphy()
2938 state->split_start++; in nl80211_send_wiphy()
2941 if (rdev->wiphy.n_vendor_commands) { in nl80211_send_wiphy()
2950 for (i = 0; i < rdev->wiphy.n_vendor_commands; i++) { in nl80211_send_wiphy()
2951 info = &rdev->wiphy.vendor_commands[i].info; in nl80211_send_wiphy()
2958 if (rdev->wiphy.n_vendor_events) { in nl80211_send_wiphy()
2967 for (i = 0; i < rdev->wiphy.n_vendor_events; i++) { in nl80211_send_wiphy()
2968 info = &rdev->wiphy.vendor_events[i]; in nl80211_send_wiphy()
2974 state->split_start++; in nl80211_send_wiphy()
2977 if (rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH && in nl80211_send_wiphy()
2979 rdev->wiphy.max_num_csa_counters)) in nl80211_send_wiphy()
2982 if (rdev->wiphy.regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED && in nl80211_send_wiphy()
2986 if (rdev->wiphy.max_sched_scan_reqs && in nl80211_send_wiphy()
2988 rdev->wiphy.max_sched_scan_reqs)) in nl80211_send_wiphy()
2992 sizeof(rdev->wiphy.ext_features), in nl80211_send_wiphy()
2993 rdev->wiphy.ext_features)) in nl80211_send_wiphy()
2996 if (rdev->wiphy.bss_select_support) { in nl80211_send_wiphy()
2998 u32 bss_select_support = rdev->wiphy.bss_select_support; in nl80211_send_wiphy()
3016 state->split_start++; in nl80211_send_wiphy()
3019 if (rdev->wiphy.num_iftype_ext_capab && in nl80211_send_wiphy()
3020 rdev->wiphy.iftype_ext_capab) { in nl80211_send_wiphy()
3028 for (i = state->capa_start; in nl80211_send_wiphy()
3029 i < rdev->wiphy.num_iftype_ext_capab; i++) { in nl80211_send_wiphy()
3032 capab = &rdev->wiphy.iftype_ext_capab[i]; in nl80211_send_wiphy()
3038 capab->iftype) || in nl80211_send_wiphy()
3040 capab->extended_capabilities_len, in nl80211_send_wiphy()
3041 capab->extended_capabilities) || in nl80211_send_wiphy()
3043 capab->extended_capabilities_len, in nl80211_send_wiphy()
3044 capab->extended_capabilities_mask)) in nl80211_send_wiphy()
3047 if (rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_MLO && in nl80211_send_wiphy()
3050 capab->eml_capabilities) || in nl80211_send_wiphy()
3053 capab->mld_capa_and_ops))) in nl80211_send_wiphy()
3057 if (state->split) in nl80211_send_wiphy()
3061 if (i < rdev->wiphy.num_iftype_ext_capab) { in nl80211_send_wiphy()
3062 state->capa_start = i + 1; in nl80211_send_wiphy()
3068 rdev->wiphy.nan_supported_bands)) in nl80211_send_wiphy()
3071 if (wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_send_wiphy()
3083 rdev->wiphy.txq_limit)) in nl80211_send_wiphy()
3086 rdev->wiphy.txq_memory_limit)) in nl80211_send_wiphy()
3089 rdev->wiphy.txq_quantum)) in nl80211_send_wiphy()
3093 state->split_start++; in nl80211_send_wiphy()
3099 state->split_start++; in nl80211_send_wiphy()
3102 if (rdev->wiphy.akm_suites && in nl80211_send_wiphy()
3104 sizeof(u32) * rdev->wiphy.n_akm_suites, in nl80211_send_wiphy()
3105 rdev->wiphy.akm_suites)) in nl80211_send_wiphy()
3113 state->split_start++; in nl80211_send_wiphy()
3119 if (nl80211_put_mbssid_support(&rdev->wiphy, msg)) in nl80211_send_wiphy()
3123 rdev->wiphy.max_num_akm_suites)) in nl80211_send_wiphy()
3126 if (rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_MLO) in nl80211_send_wiphy()
3129 if (rdev->wiphy.hw_timestamp_max_peers && in nl80211_send_wiphy()
3131 rdev->wiphy.hw_timestamp_max_peers)) in nl80211_send_wiphy()
3134 state->split_start++; in nl80211_send_wiphy()
3137 if (nl80211_put_radios(&rdev->wiphy, msg)) in nl80211_send_wiphy()
3141 state->split_start = 0; in nl80211_send_wiphy()
3150 return -EMSGSIZE; in nl80211_send_wiphy()
3161 return -ENOMEM; in nl80211_dump_wiphy_parse()
3163 ret = nlmsg_parse_deprecated(cb->nlh, in nl80211_dump_wiphy_parse()
3173 state->split = tb[NL80211_ATTR_SPLIT_WIPHY_DUMP]; in nl80211_dump_wiphy_parse()
3175 state->filter_wiphy = nla_get_u32(tb[NL80211_ATTR_WIPHY]); in nl80211_dump_wiphy_parse()
3177 state->filter_wiphy = nla_get_u64(tb[NL80211_ATTR_WDEV]) >> 32; in nl80211_dump_wiphy_parse()
3183 netdev = __dev_get_by_index(sock_net(skb->sk), ifidx); in nl80211_dump_wiphy_parse()
3185 ret = -ENODEV; in nl80211_dump_wiphy_parse()
3188 if (netdev->ieee80211_ptr) { in nl80211_dump_wiphy_parse()
3190 netdev->ieee80211_ptr->wiphy); in nl80211_dump_wiphy_parse()
3191 state->filter_wiphy = rdev->wiphy_idx; in nl80211_dump_wiphy_parse()
3204 struct nl80211_dump_wiphy_state *state = (void *)cb->args[0]; in nl80211_dump_wiphy()
3212 return -ENOMEM; in nl80211_dump_wiphy()
3214 state->filter_wiphy = -1; in nl80211_dump_wiphy()
3221 cb->args[0] = (long)state; in nl80211_dump_wiphy()
3225 if (!net_eq(wiphy_net(&rdev->wiphy), sock_net(skb->sk))) in nl80211_dump_wiphy()
3227 if (++idx <= state->start) in nl80211_dump_wiphy()
3229 if (state->filter_wiphy != -1 && in nl80211_dump_wiphy()
3230 state->filter_wiphy != rdev->wiphy_idx) in nl80211_dump_wiphy()
3232 wiphy_lock(&rdev->wiphy); in nl80211_dump_wiphy()
3237 NETLINK_CB(cb->skb).portid, in nl80211_dump_wiphy()
3238 cb->nlh->nlmsg_seq, in nl80211_dump_wiphy()
3254 if ((ret == -ENOBUFS || ret == -EMSGSIZE) && in nl80211_dump_wiphy()
3255 !skb->len && !state->split && in nl80211_dump_wiphy()
3256 cb->min_dump_alloc < 4096) { in nl80211_dump_wiphy()
3257 cb->min_dump_alloc = 4096; in nl80211_dump_wiphy()
3258 state->split_start = 0; in nl80211_dump_wiphy()
3259 wiphy_unlock(&rdev->wiphy); in nl80211_dump_wiphy()
3263 idx--; in nl80211_dump_wiphy()
3266 } while (state->split_start > 0); in nl80211_dump_wiphy()
3267 wiphy_unlock(&rdev->wiphy); in nl80211_dump_wiphy()
3272 state->start = idx; in nl80211_dump_wiphy()
3274 return skb->len; in nl80211_dump_wiphy()
3279 kfree((void *)cb->args[0]); in nl80211_dump_wiphy_done()
3286 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_wiphy()
3291 return -ENOMEM; in nl80211_get_wiphy()
3294 info->snd_portid, info->snd_seq, 0, in nl80211_get_wiphy()
3297 return -ENOBUFS; in nl80211_get_wiphy()
3319 return -EINVAL; in parse_txq_params()
3322 txq_params->txop = nla_get_u16(tb[NL80211_TXQ_ATTR_TXOP]); in parse_txq_params()
3323 txq_params->cwmin = nla_get_u16(tb[NL80211_TXQ_ATTR_CWMIN]); in parse_txq_params()
3324 txq_params->cwmax = nla_get_u16(tb[NL80211_TXQ_ATTR_CWMAX]); in parse_txq_params()
3325 txq_params->aifs = nla_get_u8(tb[NL80211_TXQ_ATTR_AIFS]); in parse_txq_params()
3328 return -EINVAL; in parse_txq_params()
3329 txq_params->ac = array_index_nospec(ac, NL80211_NUM_ACS); in parse_txq_params()
3342 * low-level driver when the AP starts or the mesh is joined. in nl80211_can_set_dev_channel()
3344 * the channel in the start-ap or join-mesh commands instead. in nl80211_can_set_dev_channel()
3351 wdev->iftype == NL80211_IFTYPE_AP || in nl80211_can_set_dev_channel()
3352 wdev->iftype == NL80211_IFTYPE_MESH_POINT || in nl80211_can_set_dev_channel()
3353 wdev->iftype == NL80211_IFTYPE_MONITOR || in nl80211_can_set_dev_channel()
3354 wdev->iftype == NL80211_IFTYPE_P2P_GO; in nl80211_can_set_dev_channel()
3361 struct netlink_ext_ack *extack = info->extack; in _nl80211_parse_chandef()
3362 struct nlattr **attrs = info->attrs; in _nl80211_parse_chandef()
3368 return -EINVAL; in _nl80211_parse_chandef()
3372 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ])); in _nl80211_parse_chandef()
3373 if (info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]) in _nl80211_parse_chandef()
3375 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]); in _nl80211_parse_chandef()
3378 chandef->chan = ieee80211_get_channel_khz(&rdev->wiphy, control_freq); in _nl80211_parse_chandef()
3379 chandef->width = NL80211_CHAN_WIDTH_20_NOHT; in _nl80211_parse_chandef()
3380 chandef->center_freq1 = KHZ_TO_MHZ(control_freq); in _nl80211_parse_chandef()
3381 chandef->freq1_offset = control_freq % 1000; in _nl80211_parse_chandef()
3382 chandef->center_freq2 = 0; in _nl80211_parse_chandef()
3384 if (!chandef->chan) { in _nl80211_parse_chandef()
3387 return -EINVAL; in _nl80211_parse_chandef()
3400 cfg80211_chandef_create(chandef, chandef->chan, in _nl80211_parse_chandef()
3404 chandef->center_freq1 != nla_get_u32(attrs[NL80211_ATTR_CENTER_FREQ1])) { in _nl80211_parse_chandef()
3408 return -EINVAL; in _nl80211_parse_chandef()
3416 return -EINVAL; in _nl80211_parse_chandef()
3423 return -EINVAL; in _nl80211_parse_chandef()
3426 chandef->width = in _nl80211_parse_chandef()
3428 if (chandef->chan->band == NL80211_BAND_S1GHZ) { in _nl80211_parse_chandef()
3430 if (chandef->width != ieee80211_s1g_channel_width(chandef->chan)) { in _nl80211_parse_chandef()
3434 return -EINVAL; in _nl80211_parse_chandef()
3438 chandef->center_freq1 = in _nl80211_parse_chandef()
3440 chandef->freq1_offset = in _nl80211_parse_chandef()
3445 chandef->center_freq2 = in _nl80211_parse_chandef()
3449 if (info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]) { in _nl80211_parse_chandef()
3450 chandef->edmg.channels = in _nl80211_parse_chandef()
3451 nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]); in _nl80211_parse_chandef()
3453 if (info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]) in _nl80211_parse_chandef()
3454 chandef->edmg.bw_config = in _nl80211_parse_chandef()
3455 nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]); in _nl80211_parse_chandef()
3457 chandef->edmg.bw_config = 0; in _nl80211_parse_chandef()
3458 chandef->edmg.channels = 0; in _nl80211_parse_chandef()
3461 if (info->attrs[NL80211_ATTR_PUNCT_BITMAP]) { in _nl80211_parse_chandef()
3462 chandef->punctured = in _nl80211_parse_chandef()
3463 nla_get_u32(info->attrs[NL80211_ATTR_PUNCT_BITMAP]); in _nl80211_parse_chandef()
3465 if (chandef->punctured && in _nl80211_parse_chandef()
3466 !wiphy_ext_feature_isset(&rdev->wiphy, in _nl80211_parse_chandef()
3470 return -EINVAL; in _nl80211_parse_chandef()
3476 return -EINVAL; in _nl80211_parse_chandef()
3479 if (!_cfg80211_chandef_usable(&rdev->wiphy, chandef, in _nl80211_parse_chandef()
3483 return -EINVAL; in _nl80211_parse_chandef()
3486 if ((chandef->width == NL80211_CHAN_WIDTH_5 || in _nl80211_parse_chandef()
3487 chandef->width == NL80211_CHAN_WIDTH_10) && in _nl80211_parse_chandef()
3488 !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_5_10_MHZ)) { in _nl80211_parse_chandef()
3490 return -EINVAL; in _nl80211_parse_chandef()
3515 wdev = dev->ieee80211_ptr; in __nl80211_set_channel()
3517 return -EOPNOTSUPP; in __nl80211_set_channel()
3519 iftype = wdev->iftype; in __nl80211_set_channel()
3522 if (wdev && wdev->valid_links) in __nl80211_set_channel()
3523 return -EINVAL; in __nl80211_set_channel()
3536 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &chandef, in __nl80211_set_channel()
3538 return -EINVAL; in __nl80211_set_channel()
3539 if (wdev->links[link_id].ap.beacon_interval) { in __nl80211_set_channel()
3542 if (!dev || !rdev->ops->set_ap_chanwidth || in __nl80211_set_channel()
3543 !(rdev->wiphy.features & in __nl80211_set_channel()
3545 return -EBUSY; in __nl80211_set_channel()
3548 cur_chan = wdev->links[link_id].ap.chandef.chan; in __nl80211_set_channel()
3550 return -EBUSY; in __nl80211_set_channel()
3553 switch (wdev->links[link_id].ap.chandef.width) { in __nl80211_set_channel()
3563 return -EINVAL; in __nl80211_set_channel()
3576 return -EINVAL; in __nl80211_set_channel()
3583 wdev->links[link_id].ap.chandef = chandef; in __nl80211_set_channel()
3585 wdev->u.ap.preset_chandef = chandef; in __nl80211_set_channel()
3596 return -EINVAL; in __nl80211_set_channel()
3601 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_channel()
3602 int link_id = nl80211_link_id_or_invalid(info->attrs); in nl80211_set_channel()
3603 struct net_device *netdev = info->user_ptr[1]; in nl80211_set_channel()
3625 * done for backward compatibility -- previously in nl80211_set_wiphy()
3632 if (info->attrs[NL80211_ATTR_IFINDEX]) { in nl80211_set_wiphy()
3633 int ifindex = nla_get_u32(info->attrs[NL80211_ATTR_IFINDEX]); in nl80211_set_wiphy()
3636 if (netdev && netdev->ieee80211_ptr) in nl80211_set_wiphy()
3637 rdev = wiphy_to_rdev(netdev->ieee80211_ptr->wiphy); in nl80211_set_wiphy()
3644 info->attrs); in nl80211_set_wiphy()
3653 wdev = netdev->ieee80211_ptr; in nl80211_set_wiphy()
3655 guard(wiphy)(&rdev->wiphy); in nl80211_set_wiphy()
3662 if (info->attrs[NL80211_ATTR_WIPHY_NAME]) in nl80211_set_wiphy()
3664 rdev, nla_data(info->attrs[NL80211_ATTR_WIPHY_NAME])); in nl80211_set_wiphy()
3670 if (info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS]) { in nl80211_set_wiphy()
3674 if (!rdev->ops->set_txq_params) in nl80211_set_wiphy()
3675 return -EOPNOTSUPP; in nl80211_set_wiphy()
3678 return -EINVAL; in nl80211_set_wiphy()
3680 if (netdev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && in nl80211_set_wiphy()
3681 netdev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_set_wiphy()
3682 return -EINVAL; in nl80211_set_wiphy()
3685 return -ENETDOWN; in nl80211_set_wiphy()
3688 info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS], in nl80211_set_wiphy()
3694 info->extack); in nl80211_set_wiphy()
3703 nl80211_link_id_or_invalid(info->attrs); in nl80211_set_wiphy()
3706 !(netdev->ieee80211_ptr->valid_links & in nl80211_set_wiphy()
3708 result = -ENOLINK; in nl80211_set_wiphy()
3710 !netdev->ieee80211_ptr->valid_links) in nl80211_set_wiphy()
3711 result = -EINVAL; in nl80211_set_wiphy()
3720 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { in nl80211_set_wiphy()
3721 int link_id = nl80211_link_id_or_invalid(info->attrs); in nl80211_set_wiphy()
3736 if (info->attrs[NL80211_ATTR_WIPHY_TX_POWER_SETTING]) { in nl80211_set_wiphy()
3741 if (!(rdev->wiphy.features & NL80211_FEATURE_VIF_TXPOWER)) in nl80211_set_wiphy()
3744 if (!rdev->ops->set_tx_power) in nl80211_set_wiphy()
3745 return -EOPNOTSUPP; in nl80211_set_wiphy()
3748 type = nla_get_u32(info->attrs[idx]); in nl80211_set_wiphy()
3750 if (!info->attrs[NL80211_ATTR_WIPHY_TX_POWER_LEVEL] && in nl80211_set_wiphy()
3752 return -EINVAL; in nl80211_set_wiphy()
3756 mbm = nla_get_u32(info->attrs[idx]); in nl80211_set_wiphy()
3764 if (info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX] && in nl80211_set_wiphy()
3765 info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]) { in nl80211_set_wiphy()
3768 if ((!rdev->wiphy.available_antennas_tx && in nl80211_set_wiphy()
3769 !rdev->wiphy.available_antennas_rx) || in nl80211_set_wiphy()
3770 !rdev->ops->set_antenna) in nl80211_set_wiphy()
3771 return -EOPNOTSUPP; in nl80211_set_wiphy()
3773 tx_ant = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX]); in nl80211_set_wiphy()
3774 rx_ant = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]); in nl80211_set_wiphy()
3778 if ((~tx_ant && (tx_ant & ~rdev->wiphy.available_antennas_tx)) || in nl80211_set_wiphy()
3779 (~rx_ant && (rx_ant & ~rdev->wiphy.available_antennas_rx))) in nl80211_set_wiphy()
3780 return -EINVAL; in nl80211_set_wiphy()
3782 tx_ant = tx_ant & rdev->wiphy.available_antennas_tx; in nl80211_set_wiphy()
3783 rx_ant = rx_ant & rdev->wiphy.available_antennas_rx; in nl80211_set_wiphy()
3792 if (info->attrs[NL80211_ATTR_WIPHY_RETRY_SHORT]) { in nl80211_set_wiphy()
3794 info->attrs[NL80211_ATTR_WIPHY_RETRY_SHORT]); in nl80211_set_wiphy()
3799 if (info->attrs[NL80211_ATTR_WIPHY_RETRY_LONG]) { in nl80211_set_wiphy()
3801 info->attrs[NL80211_ATTR_WIPHY_RETRY_LONG]); in nl80211_set_wiphy()
3806 if (info->attrs[NL80211_ATTR_WIPHY_FRAG_THRESHOLD]) { in nl80211_set_wiphy()
3808 info->attrs[NL80211_ATTR_WIPHY_FRAG_THRESHOLD]); in nl80211_set_wiphy()
3810 return -EINVAL; in nl80211_set_wiphy()
3812 if (frag_threshold != (u32) -1) { in nl80211_set_wiphy()
3824 if (info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]) { in nl80211_set_wiphy()
3826 info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]); in nl80211_set_wiphy()
3830 if (info->attrs[NL80211_ATTR_WIPHY_COVERAGE_CLASS]) { in nl80211_set_wiphy()
3831 if (info->attrs[NL80211_ATTR_WIPHY_DYN_ACK]) in nl80211_set_wiphy()
3832 return -EINVAL; in nl80211_set_wiphy()
3835 info->attrs[NL80211_ATTR_WIPHY_COVERAGE_CLASS]); in nl80211_set_wiphy()
3839 if (info->attrs[NL80211_ATTR_WIPHY_DYN_ACK]) { in nl80211_set_wiphy()
3840 if (!(rdev->wiphy.features & NL80211_FEATURE_ACKTO_ESTIMATION)) in nl80211_set_wiphy()
3841 return -EOPNOTSUPP; in nl80211_set_wiphy()
3846 if (info->attrs[NL80211_ATTR_TXQ_LIMIT]) { in nl80211_set_wiphy()
3847 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_set_wiphy()
3849 return -EOPNOTSUPP; in nl80211_set_wiphy()
3852 info->attrs[NL80211_ATTR_TXQ_LIMIT]); in nl80211_set_wiphy()
3856 if (info->attrs[NL80211_ATTR_TXQ_MEMORY_LIMIT]) { in nl80211_set_wiphy()
3857 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_set_wiphy()
3859 return -EOPNOTSUPP; in nl80211_set_wiphy()
3862 info->attrs[NL80211_ATTR_TXQ_MEMORY_LIMIT]); in nl80211_set_wiphy()
3866 if (info->attrs[NL80211_ATTR_TXQ_QUANTUM]) { in nl80211_set_wiphy()
3867 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_set_wiphy()
3869 return -EOPNOTSUPP; in nl80211_set_wiphy()
3872 info->attrs[NL80211_ATTR_TXQ_QUANTUM]); in nl80211_set_wiphy()
3882 if (!rdev->ops->set_wiphy_params) in nl80211_set_wiphy()
3883 return -EOPNOTSUPP; in nl80211_set_wiphy()
3885 old_retry_short = rdev->wiphy.retry_short; in nl80211_set_wiphy()
3886 old_retry_long = rdev->wiphy.retry_long; in nl80211_set_wiphy()
3887 old_frag_threshold = rdev->wiphy.frag_threshold; in nl80211_set_wiphy()
3888 old_rts_threshold = rdev->wiphy.rts_threshold; in nl80211_set_wiphy()
3889 old_coverage_class = rdev->wiphy.coverage_class; in nl80211_set_wiphy()
3890 old_txq_limit = rdev->wiphy.txq_limit; in nl80211_set_wiphy()
3891 old_txq_memory_limit = rdev->wiphy.txq_memory_limit; in nl80211_set_wiphy()
3892 old_txq_quantum = rdev->wiphy.txq_quantum; in nl80211_set_wiphy()
3895 rdev->wiphy.retry_short = retry_short; in nl80211_set_wiphy()
3897 rdev->wiphy.retry_long = retry_long; in nl80211_set_wiphy()
3899 rdev->wiphy.frag_threshold = frag_threshold; in nl80211_set_wiphy()
3901 rdev->wiphy.rts_threshold = rts_threshold; in nl80211_set_wiphy()
3903 rdev->wiphy.coverage_class = coverage_class; in nl80211_set_wiphy()
3905 rdev->wiphy.txq_limit = txq_limit; in nl80211_set_wiphy()
3907 rdev->wiphy.txq_memory_limit = txq_memory_limit; in nl80211_set_wiphy()
3909 rdev->wiphy.txq_quantum = txq_quantum; in nl80211_set_wiphy()
3913 rdev->wiphy.retry_short = old_retry_short; in nl80211_set_wiphy()
3914 rdev->wiphy.retry_long = old_retry_long; in nl80211_set_wiphy()
3915 rdev->wiphy.frag_threshold = old_frag_threshold; in nl80211_set_wiphy()
3916 rdev->wiphy.rts_threshold = old_rts_threshold; in nl80211_set_wiphy()
3917 rdev->wiphy.coverage_class = old_coverage_class; in nl80211_set_wiphy()
3918 rdev->wiphy.txq_limit = old_txq_limit; in nl80211_set_wiphy()
3919 rdev->wiphy.txq_memory_limit = old_txq_memory_limit; in nl80211_set_wiphy()
3920 rdev->wiphy.txq_quantum = old_txq_quantum; in nl80211_set_wiphy()
3931 return -EINVAL; in nl80211_send_chandef()
3934 chandef->chan->center_freq)) in nl80211_send_chandef()
3935 return -ENOBUFS; in nl80211_send_chandef()
3937 chandef->chan->freq_offset)) in nl80211_send_chandef()
3938 return -ENOBUFS; in nl80211_send_chandef()
3939 switch (chandef->width) { in nl80211_send_chandef()
3945 return -ENOBUFS; in nl80211_send_chandef()
3950 if (nla_put_u32(msg, NL80211_ATTR_CHANNEL_WIDTH, chandef->width)) in nl80211_send_chandef()
3951 return -ENOBUFS; in nl80211_send_chandef()
3952 if (nla_put_u32(msg, NL80211_ATTR_CENTER_FREQ1, chandef->center_freq1)) in nl80211_send_chandef()
3953 return -ENOBUFS; in nl80211_send_chandef()
3954 if (chandef->center_freq2 && in nl80211_send_chandef()
3955 nla_put_u32(msg, NL80211_ATTR_CENTER_FREQ2, chandef->center_freq2)) in nl80211_send_chandef()
3956 return -ENOBUFS; in nl80211_send_chandef()
3957 if (chandef->punctured && in nl80211_send_chandef()
3958 nla_put_u32(msg, NL80211_ATTR_PUNCT_BITMAP, chandef->punctured)) in nl80211_send_chandef()
3959 return -ENOBUFS; in nl80211_send_chandef()
3970 struct net_device *dev = wdev->netdev; in nl80211_send_iface()
3973 lockdep_assert_wiphy(&rdev->wiphy); in nl80211_send_iface()
3981 return -1; in nl80211_send_iface()
3984 (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in nl80211_send_iface()
3985 nla_put_string(msg, NL80211_ATTR_IFNAME, dev->name))) in nl80211_send_iface()
3988 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_iface()
3989 nla_put_u32(msg, NL80211_ATTR_IFTYPE, wdev->iftype) || in nl80211_send_iface()
3994 rdev->devlist_generation ^ in nl80211_send_iface()
3996 nla_put_u8(msg, NL80211_ATTR_4ADDR, wdev->use_4addr) || in nl80211_send_iface()
3997 nla_put_u32(msg, NL80211_ATTR_VIF_RADIO_MASK, wdev->radio_mask)) in nl80211_send_iface()
4000 if (rdev->ops->get_channel && !wdev->valid_links) { in nl80211_send_iface()
4009 if (rdev->ops->get_tx_power && !wdev->valid_links) { in nl80211_send_iface()
4019 switch (wdev->iftype) { in nl80211_send_iface()
4022 if (wdev->u.ap.ssid_len && in nl80211_send_iface()
4023 nla_put(msg, NL80211_ATTR_SSID, wdev->u.ap.ssid_len, in nl80211_send_iface()
4024 wdev->u.ap.ssid)) in nl80211_send_iface()
4029 if (wdev->u.client.ssid_len && in nl80211_send_iface()
4030 nla_put(msg, NL80211_ATTR_SSID, wdev->u.client.ssid_len, in nl80211_send_iface()
4031 wdev->u.client.ssid)) in nl80211_send_iface()
4035 if (wdev->u.ibss.ssid_len && in nl80211_send_iface()
4036 nla_put(msg, NL80211_ATTR_SSID, wdev->u.ibss.ssid_len, in nl80211_send_iface()
4037 wdev->u.ibss.ssid)) in nl80211_send_iface()
4045 if (rdev->ops->get_txq_stats) { in nl80211_send_iface()
4055 if (wdev->valid_links) { in nl80211_send_iface()
4074 wdev->links[link_id].addr)) in nl80211_send_iface()
4081 if (rdev->ops->get_tx_power) { in nl80211_send_iface()
4101 return -EMSGSIZE; in nl80211_send_iface()
4108 int wp_start = cb->args[0]; in nl80211_dump_interface()
4109 int if_start = cb->args[1]; in nl80211_dump_interface()
4110 int filter_wiphy = -1; in nl80211_dump_interface()
4116 if (!cb->args[2]) { in nl80211_dump_interface()
4118 .filter_wiphy = -1, in nl80211_dump_interface()
4128 * if filtering, set cb->args[2] to +1 since 0 is the default in nl80211_dump_interface()
4132 cb->args[2] = filter_wiphy + 1; in nl80211_dump_interface()
4134 cb->args[2] = -1; in nl80211_dump_interface()
4135 } else if (cb->args[2] > 0) { in nl80211_dump_interface()
4136 filter_wiphy = cb->args[2] - 1; in nl80211_dump_interface()
4140 if (!net_eq(wiphy_net(&rdev->wiphy), sock_net(skb->sk))) in nl80211_dump_interface()
4147 if (filter_wiphy >= 0 && filter_wiphy != rdev->wiphy_idx) in nl80211_dump_interface()
4152 guard(wiphy)(&rdev->wiphy); in nl80211_dump_interface()
4154 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) { in nl80211_dump_interface()
4160 if (nl80211_send_iface(skb, NETLINK_CB(cb->skb).portid, in nl80211_dump_interface()
4161 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_dump_interface()
4173 cb->args[0] = wp_idx; in nl80211_dump_interface()
4174 cb->args[1] = if_idx; in nl80211_dump_interface()
4176 ret = skb->len; in nl80211_dump_interface()
4186 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_interface()
4187 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_get_interface()
4191 return -ENOMEM; in nl80211_get_interface()
4193 if (nl80211_send_iface(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_interface()
4196 return -ENOBUFS; in nl80211_get_interface()
4220 return -EINVAL; in parse_monitor_flags()
4223 return -EINVAL; in parse_monitor_flags()
4232 return -EOPNOTSUPP; in parse_monitor_flags()
4247 if (info->attrs[NL80211_ATTR_MNTR_FLAGS]) { in nl80211_parse_mon_options()
4249 return -EINVAL; in nl80211_parse_mon_options()
4251 err = parse_monitor_flags(info->attrs[NL80211_ATTR_MNTR_FLAGS], in nl80211_parse_mon_options()
4252 ¶ms->flags); in nl80211_parse_mon_options()
4260 if (params->flags & MONITOR_FLAG_COOK_FRAMES) in nl80211_parse_mon_options()
4261 return -EOPNOTSUPP; in nl80211_parse_mon_options()
4263 if (params->flags & MONITOR_FLAG_ACTIVE && in nl80211_parse_mon_options()
4264 !(rdev->wiphy.features & NL80211_FEATURE_ACTIVE_MONITOR)) in nl80211_parse_mon_options()
4265 return -EOPNOTSUPP; in nl80211_parse_mon_options()
4267 if (info->attrs[NL80211_ATTR_MU_MIMO_GROUP_DATA]) { in nl80211_parse_mon_options()
4272 return -EINVAL; in nl80211_parse_mon_options()
4274 if (!wiphy_ext_feature_isset(&rdev->wiphy, cap_flag)) in nl80211_parse_mon_options()
4275 return -EOPNOTSUPP; in nl80211_parse_mon_options()
4278 nla_data(info->attrs[NL80211_ATTR_MU_MIMO_GROUP_DATA]); in nl80211_parse_mon_options()
4282 (mumimo_groups[VHT_MUMIMO_GROUPS_DATA_LEN - 1] & BIT(7))) in nl80211_parse_mon_options()
4283 return -EINVAL; in nl80211_parse_mon_options()
4285 params->vht_mumimo_groups = mumimo_groups; in nl80211_parse_mon_options()
4289 if (info->attrs[NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR]) { in nl80211_parse_mon_options()
4293 return -EINVAL; in nl80211_parse_mon_options()
4295 if (!wiphy_ext_feature_isset(&rdev->wiphy, cap_flag)) in nl80211_parse_mon_options()
4296 return -EOPNOTSUPP; in nl80211_parse_mon_options()
4298 params->vht_mumimo_follow_addr = in nl80211_parse_mon_options()
4299 nla_data(info->attrs[NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR]); in nl80211_parse_mon_options()
4312 return -EBUSY; in nl80211_valid_4addr()
4318 if (rdev->wiphy.flags & WIPHY_FLAG_4ADDR_AP) in nl80211_valid_4addr()
4322 if (rdev->wiphy.flags & WIPHY_FLAG_4ADDR_STATION) in nl80211_valid_4addr()
4329 return -EOPNOTSUPP; in nl80211_valid_4addr()
4335 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_parse_vif_radio_mask()
4336 struct nlattr *attr = info->attrs[NL80211_ATTR_VIF_RADIO_MASK]; in nl80211_parse_vif_radio_mask()
4344 allowed = BIT(rdev->wiphy.n_radio) - 1; in nl80211_parse_vif_radio_mask()
4347 return -EINVAL; in nl80211_parse_vif_radio_mask()
4357 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_interface()
4361 struct net_device *dev = info->user_ptr[1]; in nl80211_set_interface()
4362 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_interface()
4368 otype = ntype = dev->ieee80211_ptr->iftype; in nl80211_set_interface()
4370 if (info->attrs[NL80211_ATTR_IFTYPE]) { in nl80211_set_interface()
4371 ntype = nla_get_u32(info->attrs[NL80211_ATTR_IFTYPE]); in nl80211_set_interface()
4376 if (info->attrs[NL80211_ATTR_MESH_ID]) { in nl80211_set_interface()
4378 return -EINVAL; in nl80211_set_interface()
4380 return -EINVAL; in nl80211_set_interface()
4382 return -EBUSY; in nl80211_set_interface()
4384 wdev->u.mesh.id_up_len = in nl80211_set_interface()
4385 nla_len(info->attrs[NL80211_ATTR_MESH_ID]); in nl80211_set_interface()
4386 memcpy(wdev->u.mesh.id, in nl80211_set_interface()
4387 nla_data(info->attrs[NL80211_ATTR_MESH_ID]), in nl80211_set_interface()
4388 wdev->u.mesh.id_up_len); in nl80211_set_interface()
4391 if (info->attrs[NL80211_ATTR_4ADDR]) { in nl80211_set_interface()
4392 params.use_4addr = !!nla_get_u8(info->attrs[NL80211_ATTR_4ADDR]); in nl80211_set_interface()
4398 params.use_4addr = -1; in nl80211_set_interface()
4411 return -EBUSY; in nl80211_set_interface()
4418 if (!err && params.use_4addr != -1) in nl80211_set_interface()
4419 dev->ieee80211_ptr->use_4addr = params.use_4addr; in nl80211_set_interface()
4422 wdev->radio_mask = radio_mask; in nl80211_set_interface()
4432 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in _nl80211_new_interface()
4442 if (!info->attrs[NL80211_ATTR_IFNAME]) in _nl80211_new_interface()
4443 return -EINVAL; in _nl80211_new_interface()
4445 if (info->attrs[NL80211_ATTR_IFTYPE]) in _nl80211_new_interface()
4446 type = nla_get_u32(info->attrs[NL80211_ATTR_IFTYPE]); in _nl80211_new_interface()
4448 if (!rdev->ops->add_virtual_intf) in _nl80211_new_interface()
4449 return -EOPNOTSUPP; in _nl80211_new_interface()
4452 rdev->wiphy.features & NL80211_FEATURE_MAC_ON_CREATE) && in _nl80211_new_interface()
4453 info->attrs[NL80211_ATTR_MAC]) { in _nl80211_new_interface()
4454 nla_memcpy(params.macaddr, info->attrs[NL80211_ATTR_MAC], in _nl80211_new_interface()
4457 return -EADDRNOTAVAIL; in _nl80211_new_interface()
4460 if (info->attrs[NL80211_ATTR_4ADDR]) { in _nl80211_new_interface()
4461 params.use_4addr = !!nla_get_u8(info->attrs[NL80211_ATTR_4ADDR]); in _nl80211_new_interface()
4467 if (!cfg80211_iftype_allowed(&rdev->wiphy, type, params.use_4addr, 0)) in _nl80211_new_interface()
4468 return -EOPNOTSUPP; in _nl80211_new_interface()
4480 return -ENOMEM; in _nl80211_new_interface()
4483 nla_data(info->attrs[NL80211_ATTR_IFNAME]), in _nl80211_new_interface()
4487 return -EPROTO; in _nl80211_new_interface()
4493 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) in _nl80211_new_interface()
4494 wdev->owner_nlportid = info->snd_portid; in _nl80211_new_interface()
4498 if (!info->attrs[NL80211_ATTR_MESH_ID]) in _nl80211_new_interface()
4500 wdev->u.mesh.id_up_len = in _nl80211_new_interface()
4501 nla_len(info->attrs[NL80211_ATTR_MESH_ID]); in _nl80211_new_interface()
4502 memcpy(wdev->u.mesh.id, in _nl80211_new_interface()
4503 nla_data(info->attrs[NL80211_ATTR_MESH_ID]), in _nl80211_new_interface()
4504 wdev->u.mesh.id_up_len); in _nl80211_new_interface()
4520 wdev->radio_mask = radio_mask; in _nl80211_new_interface()
4522 if (nl80211_send_iface(msg, info->snd_portid, info->snd_seq, 0, in _nl80211_new_interface()
4525 return -ENOBUFS; in _nl80211_new_interface()
4533 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_new_interface()
4538 guard(wiphy)(&rdev->wiphy); in nl80211_new_interface()
4545 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_del_interface()
4546 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_del_interface()
4548 if (!rdev->ops->del_virtual_intf) in nl80211_del_interface()
4549 return -EOPNOTSUPP; in nl80211_del_interface()
4560 mutex_unlock(&rdev->wiphy.mtx); in nl80211_del_interface()
4569 if (!wdev->netdev) in nl80211_del_interface()
4570 info->user_ptr[1] = NULL; in nl80211_del_interface()
4572 dev_close(wdev->netdev); in nl80211_del_interface()
4574 mutex_lock(&rdev->wiphy.mtx); in nl80211_del_interface()
4581 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_noack_map()
4582 struct net_device *dev = info->user_ptr[1]; in nl80211_set_noack_map()
4585 if (!info->attrs[NL80211_ATTR_NOACK_MAP]) in nl80211_set_noack_map()
4586 return -EINVAL; in nl80211_set_noack_map()
4588 if (!rdev->ops->set_noack_map) in nl80211_set_noack_map()
4589 return -EOPNOTSUPP; in nl80211_set_noack_map()
4591 noack_map = nla_get_u16(info->attrs[NL80211_ATTR_NOACK_MAP]); in nl80211_set_noack_map()
4601 if (link_id != -1) { in nl80211_validate_key_link_id()
4604 return -EINVAL; in nl80211_validate_key_link_id()
4610 if (wdev->valid_links) { in nl80211_validate_key_link_id()
4611 if (link_id == -1) { in nl80211_validate_key_link_id()
4614 return -EINVAL; in nl80211_validate_key_link_id()
4616 if (!(wdev->valid_links & BIT(link_id))) { in nl80211_validate_key_link_id()
4618 return -EINVAL; in nl80211_validate_key_link_id()
4620 } else if (link_id != -1) { in nl80211_validate_key_link_id()
4621 GENL_SET_ERR_MSG(info, "link ID not allowed for non-MLO group key"); in nl80211_validate_key_link_id()
4622 return -EINVAL; in nl80211_validate_key_link_id()
4639 if ((params->seq && in get_key_callback()
4640 nla_put(cookie->msg, NL80211_ATTR_KEY_SEQ, in get_key_callback()
4641 params->seq_len, params->seq)) || in get_key_callback()
4642 (params->cipher && in get_key_callback()
4643 nla_put_u32(cookie->msg, NL80211_ATTR_KEY_CIPHER, in get_key_callback()
4644 params->cipher))) in get_key_callback()
4647 key = nla_nest_start_noflag(cookie->msg, NL80211_ATTR_KEY); in get_key_callback()
4651 if ((params->seq && in get_key_callback()
4652 nla_put(cookie->msg, NL80211_KEY_SEQ, in get_key_callback()
4653 params->seq_len, params->seq)) || in get_key_callback()
4654 (params->cipher && in get_key_callback()
4655 nla_put_u32(cookie->msg, NL80211_KEY_CIPHER, in get_key_callback()
4656 params->cipher))) in get_key_callback()
4659 if (nla_put_u8(cookie->msg, NL80211_KEY_IDX, cookie->idx)) in get_key_callback()
4662 nla_nest_end(cookie->msg, key); in get_key_callback()
4666 cookie->error = 1; in get_key_callback()
4671 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_key()
4673 struct net_device *dev = info->user_ptr[1]; in nl80211_get_key()
4683 int link_id = nl80211_link_id_or_invalid(info->attrs); in nl80211_get_key()
4684 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_get_key()
4686 if (wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_get_key()
4690 if ((wdev->iftype == NL80211_IFTYPE_STATION || in nl80211_get_key()
4691 wdev->iftype == NL80211_IFTYPE_P2P_CLIENT) && in nl80211_get_key()
4692 wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_get_key()
4696 if (info->attrs[NL80211_ATTR_KEY_IDX]) { in nl80211_get_key()
4697 key_idx = nla_get_u8(info->attrs[NL80211_ATTR_KEY_IDX]); in nl80211_get_key()
4701 return -EINVAL; in nl80211_get_key()
4705 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_get_key()
4706 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_get_key()
4709 if (info->attrs[NL80211_ATTR_KEY_TYPE]) { in nl80211_get_key()
4710 u32 kt = nla_get_u32(info->attrs[NL80211_ATTR_KEY_TYPE]); in nl80211_get_key()
4714 return -EINVAL; in nl80211_get_key()
4718 if (!rdev->ops->get_key) in nl80211_get_key()
4719 return -EOPNOTSUPP; in nl80211_get_key()
4721 if (!pairwise && mac_addr && !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN)) in nl80211_get_key()
4722 return -ENOENT; in nl80211_get_key()
4726 return -ENOMEM; in nl80211_get_key()
4728 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_key()
4736 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in nl80211_get_key()
4760 err = -ENOBUFS; in nl80211_get_key()
4768 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_key()
4771 struct net_device *dev = info->user_ptr[1]; in nl80211_set_key()
4772 int link_id = nl80211_link_id_or_invalid(info->attrs); in nl80211_set_key()
4773 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_key()
4780 return -EINVAL; in nl80211_set_key()
4787 return -EINVAL; in nl80211_set_key()
4790 if (!rdev->ops->set_default_key) in nl80211_set_key()
4791 return -EOPNOTSUPP; in nl80211_set_key()
4808 wdev->wext.default_key = key.idx; in nl80211_set_key()
4813 return -EINVAL; in nl80211_set_key()
4815 if (!rdev->ops->set_default_mgmt_key) in nl80211_set_key()
4816 return -EOPNOTSUPP; in nl80211_set_key()
4831 wdev->wext.default_mgmt_key = key.idx; in nl80211_set_key()
4836 return -EINVAL; in nl80211_set_key()
4838 if (!rdev->ops->set_default_beacon_key) in nl80211_set_key()
4839 return -EOPNOTSUPP; in nl80211_set_key()
4851 wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_set_key()
4855 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_set_key()
4856 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_set_key()
4859 return -EINVAL; in nl80211_set_key()
4870 return -EINVAL; in nl80211_set_key()
4875 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_new_key()
4877 struct net_device *dev = info->user_ptr[1]; in nl80211_new_key()
4880 int link_id = nl80211_link_id_or_invalid(info->attrs); in nl80211_new_key()
4881 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_new_key()
4889 return -EINVAL; in nl80211_new_key()
4892 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_new_key()
4893 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_new_key()
4895 if (key.type == -1) { in nl80211_new_key()
4906 return -EINVAL; in nl80211_new_key()
4910 info->attrs[NL80211_ATTR_VLAN_ID]) in nl80211_new_key()
4911 key.p.vlan_id = nla_get_u16(info->attrs[NL80211_ATTR_VLAN_ID]); in nl80211_new_key()
4913 if (!rdev->ops->add_key) in nl80211_new_key()
4914 return -EOPNOTSUPP; in nl80211_new_key()
4920 return -EINVAL; in nl80211_new_key()
4944 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_del_key()
4946 struct net_device *dev = info->user_ptr[1]; in nl80211_del_key()
4949 int link_id = nl80211_link_id_or_invalid(info->attrs); in nl80211_del_key()
4950 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_del_key()
4956 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_del_key()
4957 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_del_key()
4959 if (key.type == -1) { in nl80211_del_key()
4969 return -EINVAL; in nl80211_del_key()
4973 return -EINVAL; in nl80211_del_key()
4975 if (!rdev->ops->del_key) in nl80211_del_key()
4976 return -EOPNOTSUPP; in nl80211_del_key()
4981 !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN)) in nl80211_del_key()
4982 err = -ENOENT; in nl80211_del_key()
4995 if (key.idx == wdev->wext.default_key) in nl80211_del_key()
4996 wdev->wext.default_key = -1; in nl80211_del_key()
4997 else if (key.idx == wdev->wext.default_mgmt_key) in nl80211_del_key()
4998 wdev->wext.default_mgmt_key = -1; in nl80211_del_key()
5013 return -EINVAL; in validate_acl_mac_addrs()
5034 if (!wiphy->max_acl_mac_addrs) in parse_acl_data()
5035 return ERR_PTR(-EOPNOTSUPP); in parse_acl_data()
5037 if (!info->attrs[NL80211_ATTR_ACL_POLICY]) in parse_acl_data()
5038 return ERR_PTR(-EINVAL); in parse_acl_data()
5040 acl_policy = nla_get_u32(info->attrs[NL80211_ATTR_ACL_POLICY]); in parse_acl_data()
5043 return ERR_PTR(-EINVAL); in parse_acl_data()
5045 if (!info->attrs[NL80211_ATTR_MAC_ADDRS]) in parse_acl_data()
5046 return ERR_PTR(-EINVAL); in parse_acl_data()
5048 n_entries = validate_acl_mac_addrs(info->attrs[NL80211_ATTR_MAC_ADDRS]); in parse_acl_data()
5052 if (n_entries > wiphy->max_acl_mac_addrs) in parse_acl_data()
5053 return ERR_PTR(-EOPNOTSUPP); in parse_acl_data()
5057 return ERR_PTR(-ENOMEM); in parse_acl_data()
5058 acl->n_acl_entries = n_entries; in parse_acl_data()
5060 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_MAC_ADDRS], tmp) { in parse_acl_data()
5061 memcpy(acl->mac_addrs[i].addr, nla_data(attr), ETH_ALEN); in parse_acl_data()
5064 acl->acl_policy = acl_policy; in parse_acl_data()
5071 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_mac_acl()
5072 struct net_device *dev = info->user_ptr[1]; in nl80211_set_mac_acl()
5076 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && in nl80211_set_mac_acl()
5077 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_set_mac_acl()
5078 return -EOPNOTSUPP; in nl80211_set_mac_acl()
5080 if (!dev->ieee80211_ptr->links[0].ap.beacon_interval) in nl80211_set_mac_acl()
5081 return -EINVAL; in nl80211_set_mac_acl()
5083 acl = parse_acl_data(&rdev->wiphy, info); in nl80211_set_mac_acl()
5104 for (ridx = 0; ridx < sband->n_bitrates; ridx++) { in rateset_to_mask()
5106 &sband->bitrates[ridx]; in rateset_to_mask()
5107 if (rate == srate->bitrate) { in rateset_to_mask()
5112 if (ridx == sband->n_bitrates) in rateset_to_mask()
5139 if (sband->ht_cap.mcs.rx_mask[ridx] & rbit) in ht_rateset_to_mask()
5186 u16 tx_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map); in vht_set_mcs_mask()
5190 if (!sband->vht_cap.vht_supported) in vht_set_mcs_mask()
5199 if ((tx_mcs_mask[i] & txrate->mcs[i]) == txrate->mcs[i]) in vht_set_mcs_mask()
5200 mcs[i] = txrate->mcs[i]; in vht_set_mcs_mask()
5239 struct net_device *dev = info->user_ptr[1]; in he_get_txmcsmap()
5240 struct wireless_dev *wdev = dev->ieee80211_ptr; in he_get_txmcsmap()
5250 return le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_80); in he_get_txmcsmap()
5253 switch (chandef->width) { in he_get_txmcsmap()
5255 tx_mcs = he_cap->he_mcs_nss_supp.tx_mcs_80p80; in he_get_txmcsmap()
5258 tx_mcs = he_cap->he_mcs_nss_supp.tx_mcs_160; in he_get_txmcsmap()
5261 tx_mcs = he_cap->he_mcs_nss_supp.tx_mcs_80; in he_get_txmcsmap()
5280 he_cap = ieee80211_get_he_iftype_cap(sband, wdev->iftype); in he_set_mcs_mask()
5292 if ((tx_mcs_mask[i] & txrate->mcs[i]) == txrate->mcs[i]) in he_set_mcs_mask()
5293 mcs[i] = txrate->mcs[i]; in he_set_mcs_mask()
5310 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_parse_tx_bitrate_mask()
5311 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_parse_tx_bitrate_mask()
5325 sband = rdev->wiphy.bands[i]; in nl80211_parse_tx_bitrate_mask()
5330 mask->control[i].legacy = (1 << sband->n_bitrates) - 1; in nl80211_parse_tx_bitrate_mask()
5331 memcpy(mask->control[i].ht_mcs, in nl80211_parse_tx_bitrate_mask()
5332 sband->ht_cap.mcs.rx_mask, in nl80211_parse_tx_bitrate_mask()
5333 sizeof(mask->control[i].ht_mcs)); in nl80211_parse_tx_bitrate_mask()
5335 if (sband->vht_cap.vht_supported) { in nl80211_parse_tx_bitrate_mask()
5336 vht_tx_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map); in nl80211_parse_tx_bitrate_mask()
5337 vht_build_mcs_mask(vht_tx_mcs_map, mask->control[i].vht_mcs); in nl80211_parse_tx_bitrate_mask()
5340 he_cap = ieee80211_get_he_iftype_cap(sband, wdev->iftype); in nl80211_parse_tx_bitrate_mask()
5345 he_build_mcs_mask(he_tx_mcs_map, mask->control[i].he_mcs); in nl80211_parse_tx_bitrate_mask()
5347 mask->control[i].he_gi = 0xFF; in nl80211_parse_tx_bitrate_mask()
5348 mask->control[i].he_ltf = 0xFF; in nl80211_parse_tx_bitrate_mask()
5364 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
5365 sband = rdev->wiphy.bands[band]; in nl80211_parse_tx_bitrate_mask()
5367 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
5371 info->extack); in nl80211_parse_tx_bitrate_mask()
5375 mask->control[band].legacy = rateset_to_mask( in nl80211_parse_tx_bitrate_mask()
5379 if ((mask->control[band].legacy == 0) && in nl80211_parse_tx_bitrate_mask()
5381 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
5388 mask->control[band].ht_mcs)) in nl80211_parse_tx_bitrate_mask()
5389 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
5396 mask->control[band].vht_mcs)) in nl80211_parse_tx_bitrate_mask()
5397 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
5401 mask->control[band].gi = in nl80211_parse_tx_bitrate_mask()
5403 if (mask->control[band].gi > NL80211_TXRATE_FORCE_LGI) in nl80211_parse_tx_bitrate_mask()
5404 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
5409 mask->control[band].he_mcs, in nl80211_parse_tx_bitrate_mask()
5411 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
5414 mask->control[band].he_gi = in nl80211_parse_tx_bitrate_mask()
5417 mask->control[band].he_ltf = in nl80211_parse_tx_bitrate_mask()
5420 if (mask->control[band].legacy == 0) { in nl80211_parse_tx_bitrate_mask()
5424 if (!(rdev->wiphy.bands[band]->ht_cap.ht_supported || in nl80211_parse_tx_bitrate_mask()
5425 rdev->wiphy.bands[band]->vht_cap.vht_supported || in nl80211_parse_tx_bitrate_mask()
5426 ieee80211_get_he_iftype_cap(sband, wdev->iftype))) in nl80211_parse_tx_bitrate_mask()
5427 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
5430 if (mask->control[band].ht_mcs[i]) in nl80211_parse_tx_bitrate_mask()
5434 if (mask->control[band].vht_mcs[i]) in nl80211_parse_tx_bitrate_mask()
5438 if (mask->control[band].he_mcs[i]) in nl80211_parse_tx_bitrate_mask()
5442 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
5455 u32 rate = beacon_rate->control[band].legacy; in validate_beacon_tx_rate()
5459 return -EINVAL; in validate_beacon_tx_rate()
5463 if (hweight8(beacon_rate->control[band].ht_mcs[i]) > 1) { in validate_beacon_tx_rate()
5464 return -EINVAL; in validate_beacon_tx_rate()
5465 } else if (beacon_rate->control[band].ht_mcs[i]) { in validate_beacon_tx_rate()
5468 return -EINVAL; in validate_beacon_tx_rate()
5471 return -EINVAL; in validate_beacon_tx_rate()
5476 if (hweight16(beacon_rate->control[band].vht_mcs[i]) > 1) { in validate_beacon_tx_rate()
5477 return -EINVAL; in validate_beacon_tx_rate()
5478 } else if (beacon_rate->control[band].vht_mcs[i]) { in validate_beacon_tx_rate()
5481 return -EINVAL; in validate_beacon_tx_rate()
5484 return -EINVAL; in validate_beacon_tx_rate()
5489 if (hweight16(beacon_rate->control[band].he_mcs[i]) > 1) { in validate_beacon_tx_rate()
5490 return -EINVAL; in validate_beacon_tx_rate()
5491 } else if (beacon_rate->control[band].he_mcs[i]) { in validate_beacon_tx_rate()
5494 return -EINVAL; in validate_beacon_tx_rate()
5497 return -EINVAL; in validate_beacon_tx_rate()
5502 return -EINVAL; in validate_beacon_tx_rate()
5505 !wiphy_ext_feature_isset(&rdev->wiphy, in validate_beacon_tx_rate()
5507 return -EINVAL; in validate_beacon_tx_rate()
5509 !wiphy_ext_feature_isset(&rdev->wiphy, in validate_beacon_tx_rate()
5511 return -EINVAL; in validate_beacon_tx_rate()
5513 !wiphy_ext_feature_isset(&rdev->wiphy, in validate_beacon_tx_rate()
5515 return -EINVAL; in validate_beacon_tx_rate()
5517 !wiphy_ext_feature_isset(&rdev->wiphy, in validate_beacon_tx_rate()
5519 return -EINVAL; in validate_beacon_tx_rate()
5532 if (!wiphy->mbssid_max_interfaces) in nl80211_parse_mbssid_config()
5533 return -EOPNOTSUPP; in nl80211_parse_mbssid_config()
5538 return -EINVAL; in nl80211_parse_mbssid_config()
5540 config->ema = nla_get_flag(tb[NL80211_MBSSID_CONFIG_ATTR_EMA]); in nl80211_parse_mbssid_config()
5541 if (config->ema) { in nl80211_parse_mbssid_config()
5542 if (!wiphy->ema_max_profile_periodicity) in nl80211_parse_mbssid_config()
5543 return -EOPNOTSUPP; in nl80211_parse_mbssid_config()
5545 if (num_elems > wiphy->ema_max_profile_periodicity) in nl80211_parse_mbssid_config()
5546 return -EINVAL; in nl80211_parse_mbssid_config()
5549 config->index = nla_get_u8(tb[NL80211_MBSSID_CONFIG_ATTR_INDEX]); in nl80211_parse_mbssid_config()
5550 if (config->index >= wiphy->mbssid_max_interfaces || in nl80211_parse_mbssid_config()
5551 (!config->index && !num_elems)) in nl80211_parse_mbssid_config()
5552 return -EINVAL; in nl80211_parse_mbssid_config()
5558 if ((!config->index && tx_ifindex != dev->ifindex) || in nl80211_parse_mbssid_config()
5559 (config->index && tx_ifindex == dev->ifindex)) in nl80211_parse_mbssid_config()
5560 return -EINVAL; in nl80211_parse_mbssid_config()
5562 if (tx_ifindex != dev->ifindex) { in nl80211_parse_mbssid_config()
5566 if (!tx_netdev || !tx_netdev->ieee80211_ptr || in nl80211_parse_mbssid_config()
5567 tx_netdev->ieee80211_ptr->wiphy != wiphy || in nl80211_parse_mbssid_config()
5568 tx_netdev->ieee80211_ptr->iftype != in nl80211_parse_mbssid_config()
5571 return -EINVAL; in nl80211_parse_mbssid_config()
5574 config->tx_wdev = tx_netdev->ieee80211_ptr; in nl80211_parse_mbssid_config()
5576 config->tx_wdev = dev->ieee80211_ptr; in nl80211_parse_mbssid_config()
5578 } else if (!config->index) { in nl80211_parse_mbssid_config()
5579 config->tx_wdev = dev->ieee80211_ptr; in nl80211_parse_mbssid_config()
5581 return -EINVAL; in nl80211_parse_mbssid_config()
5595 if (!wiphy->mbssid_max_interfaces) in nl80211_parse_mbssid_elems()
5596 return ERR_PTR(-EINVAL); in nl80211_parse_mbssid_elems()
5600 return ERR_PTR(-EINVAL); in nl80211_parse_mbssid_elems()
5606 return ERR_PTR(-ENOMEM); in nl80211_parse_mbssid_elems()
5607 elems->cnt = num_elems; in nl80211_parse_mbssid_elems()
5610 elems->elem[i].data = nla_data(nl_elems); in nl80211_parse_mbssid_elems()
5611 elems->elem[i].len = nla_len(nl_elems); in nl80211_parse_mbssid_elems()
5638 return ERR_PTR(-ENOMEM); in nl80211_parse_rnr_elems()
5639 elems->cnt = num_elems; in nl80211_parse_rnr_elems()
5642 elems->elem[i].data = nla_data(nl_elems); in nl80211_parse_rnr_elems()
5643 elems->elem[i].len = nla_len(nl_elems); in nl80211_parse_rnr_elems()
5661 return -EINVAL; in nl80211_parse_he_bss_color()
5663 he_bss_color->color = in nl80211_parse_he_bss_color()
5665 he_bss_color->enabled = in nl80211_parse_he_bss_color()
5667 he_bss_color->partial = in nl80211_parse_he_bss_color()
5683 bcn->link_id = nl80211_link_id(attrs); in nl80211_parse_beacon()
5686 bcn->head = nla_data(attrs[NL80211_ATTR_BEACON_HEAD]); in nl80211_parse_beacon()
5687 bcn->head_len = nla_len(attrs[NL80211_ATTR_BEACON_HEAD]); in nl80211_parse_beacon()
5688 if (!bcn->head_len) in nl80211_parse_beacon()
5689 return -EINVAL; in nl80211_parse_beacon()
5694 bcn->tail = nla_data(attrs[NL80211_ATTR_BEACON_TAIL]); in nl80211_parse_beacon()
5695 bcn->tail_len = nla_len(attrs[NL80211_ATTR_BEACON_TAIL]); in nl80211_parse_beacon()
5700 return -EINVAL; in nl80211_parse_beacon()
5703 bcn->beacon_ies = nla_data(attrs[NL80211_ATTR_IE]); in nl80211_parse_beacon()
5704 bcn->beacon_ies_len = nla_len(attrs[NL80211_ATTR_IE]); in nl80211_parse_beacon()
5708 bcn->proberesp_ies = in nl80211_parse_beacon()
5710 bcn->proberesp_ies_len = in nl80211_parse_beacon()
5715 bcn->assocresp_ies = in nl80211_parse_beacon()
5717 bcn->assocresp_ies_len = in nl80211_parse_beacon()
5722 bcn->probe_resp = nla_data(attrs[NL80211_ATTR_PROBE_RESP]); in nl80211_parse_beacon()
5723 bcn->probe_resp_len = nla_len(attrs[NL80211_ATTR_PROBE_RESP]); in nl80211_parse_beacon()
5737 wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_parse_beacon()
5739 bcn->ftm_responder = 1; in nl80211_parse_beacon()
5741 return -EOPNOTSUPP; in nl80211_parse_beacon()
5744 bcn->lci = nla_data(tb[NL80211_FTM_RESP_ATTR_LCI]); in nl80211_parse_beacon()
5745 bcn->lci_len = nla_len(tb[NL80211_FTM_RESP_ATTR_LCI]); in nl80211_parse_beacon()
5749 bcn->civicloc = nla_data(tb[NL80211_FTM_RESP_ATTR_CIVICLOC]); in nl80211_parse_beacon()
5750 bcn->civicloc_len = nla_len(tb[NL80211_FTM_RESP_ATTR_CIVICLOC]); in nl80211_parse_beacon()
5753 bcn->ftm_responder = -1; in nl80211_parse_beacon()
5758 &bcn->he_bss_color); in nl80211_parse_beacon()
5761 bcn->he_bss_color_valid = true; in nl80211_parse_beacon()
5766 nl80211_parse_mbssid_elems(&rdev->wiphy, in nl80211_parse_beacon()
5772 bcn->mbssid_ies = mbssid; in nl80211_parse_beacon()
5774 if (bcn->mbssid_ies && attrs[NL80211_ATTR_EMA_RNR_ELEMS]) { in nl80211_parse_beacon()
5776 nl80211_parse_rnr_elems(&rdev->wiphy, in nl80211_parse_beacon()
5783 if (rnr && rnr->cnt < bcn->mbssid_ies->cnt) in nl80211_parse_beacon()
5784 return -EINVAL; in nl80211_parse_beacon()
5786 bcn->rnr_ies = rnr; in nl80211_parse_beacon()
5805 return -EINVAL; in nl80211_parse_he_obss_pd()
5807 he_obss_pd->sr_ctrl = nla_get_u8(tb[NL80211_HE_OBSS_PD_ATTR_SR_CTRL]); in nl80211_parse_he_obss_pd()
5810 he_obss_pd->min_offset = in nl80211_parse_he_obss_pd()
5813 he_obss_pd->max_offset = in nl80211_parse_he_obss_pd()
5816 he_obss_pd->non_srg_max_offset = in nl80211_parse_he_obss_pd()
5819 if (he_obss_pd->min_offset > he_obss_pd->max_offset) in nl80211_parse_he_obss_pd()
5820 return -EINVAL; in nl80211_parse_he_obss_pd()
5823 memcpy(he_obss_pd->bss_color_bitmap, in nl80211_parse_he_obss_pd()
5825 sizeof(he_obss_pd->bss_color_bitmap)); in nl80211_parse_he_obss_pd()
5828 memcpy(he_obss_pd->partial_bssid_bitmap, in nl80211_parse_he_obss_pd()
5830 sizeof(he_obss_pd->partial_bssid_bitmap)); in nl80211_parse_he_obss_pd()
5832 he_obss_pd->enable = true; in nl80211_parse_he_obss_pd()
5844 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_parse_fils_discovery()
5846 return -EINVAL; in nl80211_parse_fils_discovery()
5856 fd->update = true; in nl80211_parse_fils_discovery()
5863 return -EINVAL; in nl80211_parse_fils_discovery()
5865 fd->tmpl_len = nla_len(tb[NL80211_FILS_DISCOVERY_ATTR_TMPL]); in nl80211_parse_fils_discovery()
5866 fd->tmpl = nla_data(tb[NL80211_FILS_DISCOVERY_ATTR_TMPL]); in nl80211_parse_fils_discovery()
5867 fd->min_interval = nla_get_u32(tb[NL80211_FILS_DISCOVERY_ATTR_INT_MIN]); in nl80211_parse_fils_discovery()
5868 fd->max_interval = nla_get_u32(tb[NL80211_FILS_DISCOVERY_ATTR_INT_MAX]); in nl80211_parse_fils_discovery()
5869 fd->update = true; in nl80211_parse_fils_discovery()
5881 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_parse_unsol_bcast_probe_resp()
5883 return -EINVAL; in nl80211_parse_unsol_bcast_probe_resp()
5892 presp->update = true; in nl80211_parse_unsol_bcast_probe_resp()
5898 return -EINVAL; in nl80211_parse_unsol_bcast_probe_resp()
5900 presp->tmpl = nla_data(tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_TMPL]); in nl80211_parse_unsol_bcast_probe_resp()
5901 presp->tmpl_len = nla_len(tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_TMPL]); in nl80211_parse_unsol_bcast_probe_resp()
5902 presp->interval = nla_get_u32(tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_INT]); in nl80211_parse_unsol_bcast_probe_resp()
5903 presp->update = true; in nl80211_parse_unsol_bcast_probe_resp()
5915 for (i = 0; i < rates->datalen; i++) { in nl80211_check_ap_rate_selectors()
5916 if (rates->data[i] == BSS_MEMBERSHIP_SELECTOR_HT_PHY) in nl80211_check_ap_rate_selectors()
5917 params->ht_required = true; in nl80211_check_ap_rate_selectors()
5918 if (rates->data[i] == BSS_MEMBERSHIP_SELECTOR_VHT_PHY) in nl80211_check_ap_rate_selectors()
5919 params->vht_required = true; in nl80211_check_ap_rate_selectors()
5920 if (rates->data[i] == BSS_MEMBERSHIP_SELECTOR_HE_PHY) in nl80211_check_ap_rate_selectors()
5921 params->he_required = true; in nl80211_check_ap_rate_selectors()
5922 if (rates->data[i] == BSS_MEMBERSHIP_SELECTOR_SAE_H2E) in nl80211_check_ap_rate_selectors()
5923 params->sae_h2e_required = true; in nl80211_check_ap_rate_selectors()
5934 const struct cfg80211_beacon_data *bcn = ¶ms->beacon; in nl80211_calculate_ap_params()
5935 size_t ies_len = bcn->tail_len; in nl80211_calculate_ap_params()
5936 const u8 *ies = bcn->tail; in nl80211_calculate_ap_params()
5947 if (cap && cap->datalen >= sizeof(*params->ht_cap)) in nl80211_calculate_ap_params()
5948 params->ht_cap = (void *)cap->data; in nl80211_calculate_ap_params()
5950 if (cap && cap->datalen >= sizeof(*params->vht_cap)) in nl80211_calculate_ap_params()
5951 params->vht_cap = (void *)cap->data; in nl80211_calculate_ap_params()
5953 if (cap && cap->datalen >= sizeof(*params->he_cap) + 1) in nl80211_calculate_ap_params()
5954 params->he_cap = (void *)(cap->data + 1); in nl80211_calculate_ap_params()
5956 if (cap && cap->datalen >= sizeof(*params->he_oper) + 1) in nl80211_calculate_ap_params()
5957 params->he_oper = (void *)(cap->data + 1); 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_cap = (void *)(cap->data + 1); in nl80211_calculate_ap_params()
5963 if (!ieee80211_eht_capa_size_ok((const u8 *)params->he_cap, in nl80211_calculate_ap_params()
5964 (const u8 *)params->eht_cap, in nl80211_calculate_ap_params()
5965 cap->datalen - 1, true)) in nl80211_calculate_ap_params()
5966 return -EINVAL; in nl80211_calculate_ap_params()
5970 if (!cap->datalen) in nl80211_calculate_ap_params()
5971 return -EINVAL; in nl80211_calculate_ap_params()
5972 params->eht_oper = (void *)(cap->data + 1); in nl80211_calculate_ap_params()
5973 if (!ieee80211_eht_oper_size_ok((const u8 *)params->eht_oper, in nl80211_calculate_ap_params()
5974 cap->datalen - 1)) in nl80211_calculate_ap_params()
5975 return -EINVAL; in nl80211_calculate_ap_params()
5985 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) { in nl80211_get_ap_channel()
5986 if (wdev->iftype != NL80211_IFTYPE_AP && in nl80211_get_ap_channel()
5987 wdev->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_get_ap_channel()
5990 if (!wdev->u.ap.preset_chandef.chan) in nl80211_get_ap_channel()
5993 params->chandef = wdev->u.ap.preset_chandef; in nl80211_get_ap_channel()
6009 if (!(rdev->wiphy.features & NL80211_FEATURE_SAE) && in nl80211_valid_auth_type()
6012 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_valid_auth_type()
6020 if (!(rdev->wiphy.features & NL80211_FEATURE_SAE) && in nl80211_valid_auth_type()
6021 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_valid_auth_type()
6031 &rdev->wiphy, in nl80211_valid_auth_type()
6037 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_valid_auth_type()
6055 struct wiphy *wiphy = wdev->wiphy; in nl80211_send_ap_started()
6068 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_ap_started()
6069 nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex) || in nl80211_send_ap_started()
6072 (wdev->u.ap.ssid_len && in nl80211_send_ap_started()
6073 nla_put(msg, NL80211_ATTR_SSID, wdev->u.ap.ssid_len, in nl80211_send_ap_started()
6074 wdev->u.ap.ssid)) || in nl80211_send_ap_started()
6075 (wdev->valid_links && in nl80211_send_ap_started()
6090 struct ieee80211_channel *channel = params->chandef.chan; in nl80211_validate_ap_phy_operation()
6092 if ((params->he_cap || params->he_oper) && in nl80211_validate_ap_phy_operation()
6093 (channel->flags & IEEE80211_CHAN_NO_HE)) in nl80211_validate_ap_phy_operation()
6094 return -EOPNOTSUPP; in nl80211_validate_ap_phy_operation()
6096 if ((params->eht_cap || params->eht_oper) && in nl80211_validate_ap_phy_operation()
6097 (channel->flags & IEEE80211_CHAN_NO_EHT)) in nl80211_validate_ap_phy_operation()
6098 return -EOPNOTSUPP; in nl80211_validate_ap_phy_operation()
6105 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_start_ap()
6107 unsigned int link_id = nl80211_link_id(info->attrs); in nl80211_start_ap()
6108 struct net_device *dev = info->user_ptr[1]; in nl80211_start_ap()
6109 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_start_ap()
6113 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && in nl80211_start_ap()
6114 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_start_ap()
6115 return -EOPNOTSUPP; in nl80211_start_ap()
6117 if (!rdev->ops->start_ap) in nl80211_start_ap()
6118 return -EOPNOTSUPP; in nl80211_start_ap()
6120 if (wdev->links[link_id].cac_started) in nl80211_start_ap()
6121 return -EBUSY; in nl80211_start_ap()
6123 if (wdev->links[link_id].ap.beacon_interval) in nl80211_start_ap()
6124 return -EALREADY; in nl80211_start_ap()
6127 if (!info->attrs[NL80211_ATTR_BEACON_INTERVAL] || in nl80211_start_ap()
6128 !info->attrs[NL80211_ATTR_DTIM_PERIOD] || in nl80211_start_ap()
6129 !info->attrs[NL80211_ATTR_BEACON_HEAD]) in nl80211_start_ap()
6130 return -EINVAL; in nl80211_start_ap()
6132 if (info->attrs[NL80211_ATTR_SMPS_MODE] && in nl80211_start_ap()
6133 nla_get_u8(info->attrs[NL80211_ATTR_SMPS_MODE]) != NL80211_SMPS_OFF) in nl80211_start_ap()
6134 return -EOPNOTSUPP; in nl80211_start_ap()
6138 return -ENOMEM; in nl80211_start_ap()
6140 err = nl80211_parse_beacon(rdev, info->attrs, ¶ms->beacon, in nl80211_start_ap()
6141 info->extack); in nl80211_start_ap()
6145 params->beacon_interval = in nl80211_start_ap()
6146 nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]); in nl80211_start_ap()
6147 params->dtim_period = in nl80211_start_ap()
6148 nla_get_u32(info->attrs[NL80211_ATTR_DTIM_PERIOD]); in nl80211_start_ap()
6150 err = cfg80211_validate_beacon_int(rdev, dev->ieee80211_ptr->iftype, in nl80211_start_ap()
6151 params->beacon_interval); in nl80211_start_ap()
6160 * additional information -- drivers must check! in nl80211_start_ap()
6162 if (info->attrs[NL80211_ATTR_SSID]) { in nl80211_start_ap()
6163 params->ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); in nl80211_start_ap()
6164 params->ssid_len = in nl80211_start_ap()
6165 nla_len(info->attrs[NL80211_ATTR_SSID]); in nl80211_start_ap()
6166 if (params->ssid_len == 0) { in nl80211_start_ap()
6167 err = -EINVAL; in nl80211_start_ap()
6171 if (wdev->u.ap.ssid_len && in nl80211_start_ap()
6172 (wdev->u.ap.ssid_len != params->ssid_len || in nl80211_start_ap()
6173 memcmp(wdev->u.ap.ssid, params->ssid, params->ssid_len))) { in nl80211_start_ap()
6175 err = -EINVAL; in nl80211_start_ap()
6178 } else if (wdev->valid_links) { in nl80211_start_ap()
6180 err = -EINVAL; in nl80211_start_ap()
6184 if (info->attrs[NL80211_ATTR_HIDDEN_SSID]) in nl80211_start_ap()
6185 params->hidden_ssid = nla_get_u32( in nl80211_start_ap()
6186 info->attrs[NL80211_ATTR_HIDDEN_SSID]); in nl80211_start_ap()
6188 params->privacy = !!info->attrs[NL80211_ATTR_PRIVACY]; in nl80211_start_ap()
6190 if (info->attrs[NL80211_ATTR_AUTH_TYPE]) { in nl80211_start_ap()
6191 params->auth_type = nla_get_u32( in nl80211_start_ap()
6192 info->attrs[NL80211_ATTR_AUTH_TYPE]); in nl80211_start_ap()
6193 if (!nl80211_valid_auth_type(rdev, params->auth_type, in nl80211_start_ap()
6195 err = -EINVAL; in nl80211_start_ap()
6199 params->auth_type = NL80211_AUTHTYPE_AUTOMATIC; in nl80211_start_ap()
6201 err = nl80211_crypto_settings(rdev, info, ¶ms->crypto, in nl80211_start_ap()
6206 if (info->attrs[NL80211_ATTR_INACTIVITY_TIMEOUT]) { in nl80211_start_ap()
6207 if (!(rdev->wiphy.features & NL80211_FEATURE_INACTIVITY_TIMER)) { in nl80211_start_ap()
6208 err = -EOPNOTSUPP; in nl80211_start_ap()
6211 params->inactivity_timeout = nla_get_u16( in nl80211_start_ap()
6212 info->attrs[NL80211_ATTR_INACTIVITY_TIMEOUT]); in nl80211_start_ap()
6215 if (info->attrs[NL80211_ATTR_P2P_CTWINDOW]) { in nl80211_start_ap()
6216 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) { in nl80211_start_ap()
6217 err = -EINVAL; in nl80211_start_ap()
6220 params->p2p_ctwindow = in nl80211_start_ap()
6221 nla_get_u8(info->attrs[NL80211_ATTR_P2P_CTWINDOW]); in nl80211_start_ap()
6222 if (params->p2p_ctwindow != 0 && in nl80211_start_ap()
6223 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_CTWIN)) { in nl80211_start_ap()
6224 err = -EINVAL; in nl80211_start_ap()
6229 if (info->attrs[NL80211_ATTR_P2P_OPPPS]) { in nl80211_start_ap()
6232 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) { in nl80211_start_ap()
6233 err = -EINVAL; in nl80211_start_ap()
6236 tmp = nla_get_u8(info->attrs[NL80211_ATTR_P2P_OPPPS]); in nl80211_start_ap()
6237 params->p2p_opp_ps = tmp; in nl80211_start_ap()
6238 if (params->p2p_opp_ps != 0 && in nl80211_start_ap()
6239 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_OPPPS)) { in nl80211_start_ap()
6240 err = -EINVAL; in nl80211_start_ap()
6245 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { in nl80211_start_ap()
6246 err = nl80211_parse_chandef(rdev, info, ¶ms->chandef); in nl80211_start_ap()
6249 } else if (wdev->valid_links) { in nl80211_start_ap()
6251 err = -EINVAL; in nl80211_start_ap()
6253 } else if (wdev->u.ap.preset_chandef.chan) { in nl80211_start_ap()
6254 params->chandef = wdev->u.ap.preset_chandef; in nl80211_start_ap()
6256 err = -EINVAL; in nl80211_start_ap()
6260 beacon_check.iftype = wdev->iftype; in nl80211_start_ap()
6263 cfg80211_get_6ghz_power_type(params->beacon.tail, in nl80211_start_ap()
6264 params->beacon.tail_len); in nl80211_start_ap()
6265 if (!cfg80211_reg_check_beaconing(&rdev->wiphy, ¶ms->chandef, in nl80211_start_ap()
6267 err = -EINVAL; in nl80211_start_ap()
6271 if (info->attrs[NL80211_ATTR_TX_RATES]) { in nl80211_start_ap()
6272 err = nl80211_parse_tx_bitrate_mask(info, info->attrs, in nl80211_start_ap()
6274 ¶ms->beacon_rate, in nl80211_start_ap()
6279 err = validate_beacon_tx_rate(rdev, params->chandef.chan->band, in nl80211_start_ap()
6280 ¶ms->beacon_rate); in nl80211_start_ap()
6285 params->pbss = nla_get_flag(info->attrs[NL80211_ATTR_PBSS]); in nl80211_start_ap()
6286 if (params->pbss && !rdev->wiphy.bands[NL80211_BAND_60GHZ]) { in nl80211_start_ap()
6287 err = -EOPNOTSUPP; in nl80211_start_ap()
6291 if (info->attrs[NL80211_ATTR_ACL_POLICY]) { in nl80211_start_ap()
6292 params->acl = parse_acl_data(&rdev->wiphy, info); in nl80211_start_ap()
6293 if (IS_ERR(params->acl)) { in nl80211_start_ap()
6294 err = PTR_ERR(params->acl); in nl80211_start_ap()
6295 params->acl = NULL; in nl80211_start_ap()
6300 params->twt_responder = in nl80211_start_ap()
6301 nla_get_flag(info->attrs[NL80211_ATTR_TWT_RESPONDER]); in nl80211_start_ap()
6303 if (info->attrs[NL80211_ATTR_HE_OBSS_PD]) { in nl80211_start_ap()
6305 info->attrs[NL80211_ATTR_HE_OBSS_PD], in nl80211_start_ap()
6306 ¶ms->he_obss_pd); in nl80211_start_ap()
6311 if (info->attrs[NL80211_ATTR_FILS_DISCOVERY]) { in nl80211_start_ap()
6313 info->attrs[NL80211_ATTR_FILS_DISCOVERY], in nl80211_start_ap()
6314 ¶ms->fils_discovery); in nl80211_start_ap()
6319 if (info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP]) { in nl80211_start_ap()
6321 rdev, info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP], in nl80211_start_ap()
6322 ¶ms->unsol_bcast_probe_resp); in nl80211_start_ap()
6327 if (info->attrs[NL80211_ATTR_MBSSID_CONFIG]) { in nl80211_start_ap()
6328 err = nl80211_parse_mbssid_config(&rdev->wiphy, dev, in nl80211_start_ap()
6329 info->attrs[NL80211_ATTR_MBSSID_CONFIG], in nl80211_start_ap()
6330 ¶ms->mbssid_config, in nl80211_start_ap()
6331 params->beacon.mbssid_ies ? in nl80211_start_ap()
6332 params->beacon.mbssid_ies->cnt : in nl80211_start_ap()
6338 if (!params->mbssid_config.ema && params->beacon.rnr_ies) { in nl80211_start_ap()
6339 err = -EINVAL; in nl80211_start_ap()
6351 if (info->attrs[NL80211_ATTR_AP_SETTINGS_FLAGS]) in nl80211_start_ap()
6352 params->flags = nla_get_u32( in nl80211_start_ap()
6353 info->attrs[NL80211_ATTR_AP_SETTINGS_FLAGS]); in nl80211_start_ap()
6354 else if (info->attrs[NL80211_ATTR_EXTERNAL_AUTH_SUPPORT]) in nl80211_start_ap()
6355 params->flags |= NL80211_AP_SETTINGS_EXTERNAL_AUTH_SUPPORT; in nl80211_start_ap()
6357 if (wdev->conn_owner_nlportid && in nl80211_start_ap()
6358 info->attrs[NL80211_ATTR_SOCKET_OWNER] && in nl80211_start_ap()
6359 wdev->conn_owner_nlportid != info->snd_portid) { in nl80211_start_ap()
6360 err = -EINVAL; in nl80211_start_ap()
6364 /* FIXME: validate MLO/link-id against driver capabilities */ in nl80211_start_ap()
6368 wdev->links[link_id].ap.beacon_interval = params->beacon_interval; in nl80211_start_ap()
6369 wdev->links[link_id].ap.chandef = params->chandef; in nl80211_start_ap()
6370 wdev->u.ap.ssid_len = params->ssid_len; in nl80211_start_ap()
6371 memcpy(wdev->u.ap.ssid, params->ssid, in nl80211_start_ap()
6372 params->ssid_len); in nl80211_start_ap()
6374 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) in nl80211_start_ap()
6375 wdev->conn_owner_nlportid = info->snd_portid; in nl80211_start_ap()
6380 kfree(params->acl); in nl80211_start_ap()
6381 kfree(params->beacon.mbssid_ies); in nl80211_start_ap()
6382 if (params->mbssid_config.tx_wdev && in nl80211_start_ap()
6383 params->mbssid_config.tx_wdev->netdev && in nl80211_start_ap()
6384 params->mbssid_config.tx_wdev->netdev != dev) in nl80211_start_ap()
6385 dev_put(params->mbssid_config.tx_wdev->netdev); in nl80211_start_ap()
6386 kfree(params->beacon.rnr_ies); in nl80211_start_ap()
6394 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_beacon()
6396 unsigned int link_id = nl80211_link_id(info->attrs); in nl80211_set_beacon()
6397 struct net_device *dev = info->user_ptr[1]; in nl80211_set_beacon()
6398 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_beacon()
6403 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && in nl80211_set_beacon()
6404 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_set_beacon()
6405 return -EOPNOTSUPP; in nl80211_set_beacon()
6407 if (!rdev->ops->change_beacon) in nl80211_set_beacon()
6408 return -EOPNOTSUPP; in nl80211_set_beacon()
6410 if (!wdev->links[link_id].ap.beacon_interval) in nl80211_set_beacon()
6411 return -EINVAL; in nl80211_set_beacon()
6415 return -ENOMEM; in nl80211_set_beacon()
6417 err = nl80211_parse_beacon(rdev, info->attrs, ¶ms->beacon, in nl80211_set_beacon()
6418 info->extack); in nl80211_set_beacon()
6423 beacon_check.iftype = wdev->iftype; in nl80211_set_beacon()
6426 cfg80211_get_6ghz_power_type(params->beacon.tail, in nl80211_set_beacon()
6427 params->beacon.tail_len); in nl80211_set_beacon()
6428 if (!cfg80211_reg_check_beaconing(&rdev->wiphy, in nl80211_set_beacon()
6429 &wdev->links[link_id].ap.chandef, in nl80211_set_beacon()
6431 err = -EINVAL; in nl80211_set_beacon()
6435 attr = info->attrs[NL80211_ATTR_FILS_DISCOVERY]; in nl80211_set_beacon()
6438 ¶ms->fils_discovery); in nl80211_set_beacon()
6443 attr = info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP]; in nl80211_set_beacon()
6446 ¶ms->unsol_bcast_probe_resp); in nl80211_set_beacon()
6454 kfree(params->beacon.mbssid_ies); in nl80211_set_beacon()
6455 kfree(params->beacon.rnr_ies); in nl80211_set_beacon()
6462 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_stop_ap()
6463 unsigned int link_id = nl80211_link_id(info->attrs); in nl80211_stop_ap()
6464 struct net_device *dev = info->user_ptr[1]; in nl80211_stop_ap()
6490 nla = info->attrs[NL80211_ATTR_STA_FLAGS2]; in parse_station_flags()
6495 params->sta_flags_mask = sta_flags->mask; in parse_station_flags()
6496 params->sta_flags_set = sta_flags->set; in parse_station_flags()
6497 params->sta_flags_set &= params->sta_flags_mask; in parse_station_flags()
6498 if ((params->sta_flags_mask | in parse_station_flags()
6499 params->sta_flags_set) & BIT(__NL80211_STA_FLAG_INVALID)) in parse_station_flags()
6500 return -EINVAL; in parse_station_flags()
6506 nla = info->attrs[NL80211_ATTR_STA_FLAGS]; in parse_station_flags()
6510 if (nla_parse_nested_deprecated(flags, NL80211_STA_FLAG_MAX, nla, sta_flags_policy, info->extack)) in parse_station_flags()
6511 return -EINVAL; in parse_station_flags()
6523 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHORIZED) | in parse_station_flags()
6530 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHORIZED) | in parse_station_flags()
6534 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHENTICATED) | in parse_station_flags()
6539 return -EINVAL; in parse_station_flags()
6544 params->sta_flags_set |= (1<<flag); in parse_station_flags()
6548 return -EINVAL; in parse_station_flags()
6568 /* report 16-bit bitrate only if we can */ in nl80211_put_sta_rate()
6577 switch (info->bw) { in nl80211_put_sta_rate()
6616 WARN_ON(!(info->flags & RATE_INFO_FLAGS_HE_MCS)); in nl80211_put_sta_rate()
6623 WARN_ON(!(info->flags & RATE_INFO_FLAGS_EHT_MCS)); in nl80211_put_sta_rate()
6630 if (info->flags & RATE_INFO_FLAGS_MCS) { in nl80211_put_sta_rate()
6631 if (nla_put_u8(msg, NL80211_RATE_INFO_MCS, info->mcs)) in nl80211_put_sta_rate()
6633 if (info->flags & RATE_INFO_FLAGS_SHORT_GI && in nl80211_put_sta_rate()
6636 } else if (info->flags & RATE_INFO_FLAGS_VHT_MCS) { in nl80211_put_sta_rate()
6637 if (nla_put_u8(msg, NL80211_RATE_INFO_VHT_MCS, info->mcs)) in nl80211_put_sta_rate()
6639 if (nla_put_u8(msg, NL80211_RATE_INFO_VHT_NSS, info->nss)) in nl80211_put_sta_rate()
6641 if (info->flags & RATE_INFO_FLAGS_SHORT_GI && in nl80211_put_sta_rate()
6644 } else if (info->flags & RATE_INFO_FLAGS_HE_MCS) { in nl80211_put_sta_rate()
6645 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_MCS, info->mcs)) in nl80211_put_sta_rate()
6647 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_NSS, info->nss)) in nl80211_put_sta_rate()
6649 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_GI, info->he_gi)) in nl80211_put_sta_rate()
6651 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_DCM, info->he_dcm)) in nl80211_put_sta_rate()
6653 if (info->bw == RATE_INFO_BW_HE_RU && in nl80211_put_sta_rate()
6655 info->he_ru_alloc)) in nl80211_put_sta_rate()
6657 } else if (info->flags & RATE_INFO_FLAGS_S1G_MCS) { in nl80211_put_sta_rate()
6658 if (nla_put_u8(msg, NL80211_RATE_INFO_S1G_MCS, info->mcs)) in nl80211_put_sta_rate()
6660 if (nla_put_u8(msg, NL80211_RATE_INFO_S1G_NSS, info->nss)) in nl80211_put_sta_rate()
6662 if (info->flags & RATE_INFO_FLAGS_SHORT_GI && in nl80211_put_sta_rate()
6665 } else if (info->flags & RATE_INFO_FLAGS_EHT_MCS) { in nl80211_put_sta_rate()
6666 if (nla_put_u8(msg, NL80211_RATE_INFO_EHT_MCS, info->mcs)) in nl80211_put_sta_rate()
6668 if (nla_put_u8(msg, NL80211_RATE_INFO_EHT_NSS, info->nss)) in nl80211_put_sta_rate()
6670 if (nla_put_u8(msg, NL80211_RATE_INFO_EHT_GI, info->eht_gi)) in nl80211_put_sta_rate()
6672 if (info->bw == RATE_INFO_BW_EHT_RU && in nl80211_put_sta_rate()
6674 info->eht_ru_alloc)) in nl80211_put_sta_rate()
6720 return -1; in nl80211_send_station()
6723 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in nl80211_send_station()
6725 nla_put_u32(msg, NL80211_ATTR_GENERATION, sinfo->generation)) in nl80211_send_station()
6734 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_ ## attr) && \ in nl80211_send_station()
6736 sinfo->memb)) \ in nl80211_send_station()
6740 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_ ## attr) && \ in nl80211_send_station()
6742 sinfo->memb, NL80211_STA_INFO_PAD)) \ in nl80211_send_station()
6750 if (sinfo->filled & (BIT_ULL(NL80211_STA_INFO_RX_BYTES) | in nl80211_send_station()
6753 (u32)sinfo->rx_bytes)) in nl80211_send_station()
6756 if (sinfo->filled & (BIT_ULL(NL80211_STA_INFO_TX_BYTES) | in nl80211_send_station()
6759 (u32)sinfo->tx_bytes)) in nl80211_send_station()
6767 if (wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_send_station()
6771 switch (rdev->wiphy.signal_type) { in nl80211_send_station()
6779 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL)) { in nl80211_send_station()
6780 if (!nl80211_put_signal(msg, sinfo->chains, in nl80211_send_station()
6781 sinfo->chain_signal, in nl80211_send_station()
6785 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL_AVG)) { in nl80211_send_station()
6786 if (!nl80211_put_signal(msg, sinfo->chains, in nl80211_send_station()
6787 sinfo->chain_signal_avg, in nl80211_send_station()
6791 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_TX_BITRATE)) { in nl80211_send_station()
6792 if (!nl80211_put_sta_rate(msg, &sinfo->txrate, in nl80211_send_station()
6796 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_RX_BITRATE)) { in nl80211_send_station()
6797 if (!nl80211_put_sta_rate(msg, &sinfo->rxrate, in nl80211_send_station()
6820 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_BSS_PARAM)) { in nl80211_send_station()
6826 if (((sinfo->bss_param.flags & BSS_PARAM_FLAGS_CTS_PROT) && in nl80211_send_station()
6828 ((sinfo->bss_param.flags & BSS_PARAM_FLAGS_SHORT_PREAMBLE) && in nl80211_send_station()
6830 ((sinfo->bss_param.flags & BSS_PARAM_FLAGS_SHORT_SLOT_TIME) && in nl80211_send_station()
6833 sinfo->bss_param.dtim_period) || in nl80211_send_station()
6835 sinfo->bss_param.beacon_interval)) in nl80211_send_station()
6840 if ((sinfo->filled & BIT_ULL(NL80211_STA_INFO_STA_FLAGS)) && in nl80211_send_station()
6843 &sinfo->sta_flags)) in nl80211_send_station()
6851 if (wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_send_station()
6860 if (sinfo->pertid) { in nl80211_send_station()
6873 tidstats = &sinfo->pertid[tid]; in nl80211_send_station()
6875 if (!tidstats->filled) in nl80211_send_station()
6883 if (tidstats->filled & BIT(NL80211_TID_STATS_ ## attr) && \ in nl80211_send_station()
6885 tidstats->memb, NL80211_TID_STATS_PAD)) \ in nl80211_send_station()
6895 if ((tidstats->filled & in nl80211_send_station()
6897 !nl80211_put_txq_stats(msg, &tidstats->txq_stats, in nl80211_send_station()
6909 if (sinfo->assoc_req_ies_len && in nl80211_send_station()
6910 nla_put(msg, NL80211_ATTR_IE, sinfo->assoc_req_ies_len, in nl80211_send_station()
6911 sinfo->assoc_req_ies)) in nl80211_send_station()
6914 if (sinfo->assoc_resp_ies_len && in nl80211_send_station()
6915 nla_put(msg, NL80211_ATTR_RESP_IE, sinfo->assoc_resp_ies_len, in nl80211_send_station()
6916 sinfo->assoc_resp_ies)) in nl80211_send_station()
6919 if (sinfo->mlo_params_valid) { in nl80211_send_station()
6921 sinfo->assoc_link_id)) in nl80211_send_station()
6924 if (!is_zero_ether_addr(sinfo->mld_addr) && in nl80211_send_station()
6926 sinfo->mld_addr)) in nl80211_send_station()
6937 return -EMSGSIZE; in nl80211_send_station()
6947 int sta_idx = cb->args[2]; in nl80211_dump_station()
6954 __acquire(&rdev->wiphy.mtx); in nl80211_dump_station()
6956 if (!wdev->netdev) { in nl80211_dump_station()
6957 err = -EINVAL; in nl80211_dump_station()
6961 if (!rdev->ops->dump_station) { in nl80211_dump_station()
6962 err = -EOPNOTSUPP; in nl80211_dump_station()
6968 err = rdev_dump_station(rdev, wdev->netdev, sta_idx, in nl80211_dump_station()
6970 if (err == -ENOENT) in nl80211_dump_station()
6976 NETLINK_CB(cb->skb).portid, in nl80211_dump_station()
6977 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_dump_station()
6978 rdev, wdev->netdev, mac_addr, in nl80211_dump_station()
6986 cb->args[2] = sta_idx; in nl80211_dump_station()
6987 err = skb->len; in nl80211_dump_station()
6989 wiphy_unlock(&rdev->wiphy); in nl80211_dump_station()
6996 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_station()
6997 struct net_device *dev = info->user_ptr[1]; in nl80211_get_station()
7005 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_get_station()
7006 return -EINVAL; in nl80211_get_station()
7008 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_get_station()
7010 if (!rdev->ops->get_station) in nl80211_get_station()
7011 return -EOPNOTSUPP; in nl80211_get_station()
7020 return -ENOMEM; in nl80211_get_station()
7024 info->snd_portid, info->snd_seq, 0, in nl80211_get_station()
7027 return -ENOBUFS; in nl80211_get_station()
7037 if (params->listen_interval != -1 && in cfg80211_check_station_change()
7039 return -EINVAL; in cfg80211_check_station_change()
7041 if (params->support_p2p_ps != -1 && in cfg80211_check_station_change()
7043 return -EINVAL; in cfg80211_check_station_change()
7045 if (params->aid && in cfg80211_check_station_change()
7046 !(params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) && in cfg80211_check_station_change()
7048 return -EINVAL; in cfg80211_check_station_change()
7057 * No ignoring the TDLS flag here -- the userspace mesh in cfg80211_check_station_change()
7061 if (params->sta_flags_mask & in cfg80211_check_station_change()
7065 return -EINVAL; in cfg80211_check_station_change()
7069 if (!(params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER))) in cfg80211_check_station_change()
7070 return -EINVAL; in cfg80211_check_station_change()
7072 params->sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER); in cfg80211_check_station_change()
7075 /* disallow mesh-specific things */ in cfg80211_check_station_change()
7076 if (params->plink_action != NL80211_PLINK_ACTION_NO_ACTION) in cfg80211_check_station_change()
7077 return -EINVAL; in cfg80211_check_station_change()
7078 if (params->local_pm) in cfg80211_check_station_change()
7079 return -EINVAL; in cfg80211_check_station_change()
7080 if (params->sta_modify_mask & STATION_PARAM_APPLY_PLINK_STATE) in cfg80211_check_station_change()
7081 return -EINVAL; in cfg80211_check_station_change()
7087 if (params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) in cfg80211_check_station_change()
7088 return -EINVAL; in cfg80211_check_station_change()
7091 * a hostapd/wpa_supplicant issue -- it always includes the in cfg80211_check_station_change()
7094 params->sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER); in cfg80211_check_station_change()
7100 if (params->sta_modify_mask & STATION_PARAM_APPLY_UAPSD) in cfg80211_check_station_change()
7101 return -EINVAL; in cfg80211_check_station_change()
7102 if (params->sta_modify_mask & STATION_PARAM_APPLY_CAPABILITY) in cfg80211_check_station_change()
7103 return -EINVAL; in cfg80211_check_station_change()
7104 if (params->link_sta_params.supported_rates) in cfg80211_check_station_change()
7105 return -EINVAL; in cfg80211_check_station_change()
7106 if (params->ext_capab || params->link_sta_params.ht_capa || in cfg80211_check_station_change()
7107 params->link_sta_params.vht_capa || in cfg80211_check_station_change()
7108 params->link_sta_params.he_capa || in cfg80211_check_station_change()
7109 params->link_sta_params.eht_capa) in cfg80211_check_station_change()
7110 return -EINVAL; in cfg80211_check_station_change()
7111 if (params->sta_flags_mask & BIT(NL80211_STA_FLAG_SPP_AMSDU)) in cfg80211_check_station_change()
7112 return -EINVAL; in cfg80211_check_station_change()
7117 if (params->vlan) in cfg80211_check_station_change()
7118 return -EINVAL; in cfg80211_check_station_change()
7124 if (!(params->sta_flags_mask & BIT(NL80211_STA_FLAG_AUTHORIZED))) in cfg80211_check_station_change()
7125 return -EOPNOTSUPP; in cfg80211_check_station_change()
7130 if (params->sta_flags_mask & in cfg80211_check_station_change()
7138 return -EINVAL; in cfg80211_check_station_change()
7141 if (!(wiphy->features & NL80211_FEATURE_FULL_AP_CLIENT_STATE) && in cfg80211_check_station_change()
7142 params->sta_flags_mask & in cfg80211_check_station_change()
7145 return -EINVAL; in cfg80211_check_station_change()
7150 if (params->sta_flags_mask & ~BIT(NL80211_STA_FLAG_AUTHORIZED)) in cfg80211_check_station_change()
7151 return -EINVAL; in cfg80211_check_station_change()
7155 if (params->sta_flags_mask & ~(BIT(NL80211_STA_FLAG_AUTHORIZED) | in cfg80211_check_station_change()
7157 return -EINVAL; in cfg80211_check_station_change()
7159 if (params->sta_flags_set & BIT(NL80211_STA_FLAG_AUTHORIZED) && in cfg80211_check_station_change()
7160 !params->link_sta_params.supported_rates) in cfg80211_check_station_change()
7161 return -EINVAL; in cfg80211_check_station_change()
7165 return -EINVAL; in cfg80211_check_station_change()
7167 if (params->sta_modify_mask & STATION_PARAM_APPLY_PLINK_STATE) in cfg80211_check_station_change()
7168 return -EINVAL; in cfg80211_check_station_change()
7171 if (params->plink_action != NL80211_PLINK_ACTION_NO_ACTION && in cfg80211_check_station_change()
7172 params->plink_action != NL80211_PLINK_ACTION_BLOCK) in cfg80211_check_station_change()
7173 return -EINVAL; in cfg80211_check_station_change()
7184 params->link_sta_params.opmode_notif_used = false; in cfg80211_check_station_change()
7196 struct nlattr *vlanattr = info->attrs[NL80211_ATTR_STA_VLAN]; in get_vlan()
7205 return ERR_PTR(-ENODEV); in get_vlan()
7207 if (!v->ieee80211_ptr || v->ieee80211_ptr->wiphy != &rdev->wiphy) { in get_vlan()
7208 ret = -EINVAL; in get_vlan()
7212 if (v->ieee80211_ptr->iftype != NL80211_IFTYPE_AP_VLAN && in get_vlan()
7213 v->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && in get_vlan()
7214 v->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) { in get_vlan()
7215 ret = -EINVAL; in get_vlan()
7220 ret = -ENETDOWN; in get_vlan()
7238 if (!info->attrs[NL80211_ATTR_STA_WME]) in nl80211_parse_sta_wme()
7241 nla = info->attrs[NL80211_ATTR_STA_WME]; in nl80211_parse_sta_wme()
7244 info->extack); in nl80211_parse_sta_wme()
7249 params->uapsd_queues = nla_get_u8( in nl80211_parse_sta_wme()
7251 if (params->uapsd_queues & ~IEEE80211_WMM_IE_STA_QOSINFO_AC_MASK) in nl80211_parse_sta_wme()
7252 return -EINVAL; in nl80211_parse_sta_wme()
7255 params->max_sp = nla_get_u8(tb[NL80211_STA_WME_MAX_SP]); in nl80211_parse_sta_wme()
7257 if (params->max_sp & ~IEEE80211_WMM_IE_STA_QOSINFO_SP_MASK) in nl80211_parse_sta_wme()
7258 return -EINVAL; in nl80211_parse_sta_wme()
7260 params->sta_modify_mask |= STATION_PARAM_APPLY_UAPSD; in nl80211_parse_sta_wme()
7268 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]) { in nl80211_parse_sta_channel_info()
7269 params->supported_channels = in nl80211_parse_sta_channel_info()
7270 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]); in nl80211_parse_sta_channel_info()
7271 params->supported_channels_len = in nl80211_parse_sta_channel_info()
7272 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]); in nl80211_parse_sta_channel_info()
7278 if (params->supported_channels_len % 2) in nl80211_parse_sta_channel_info()
7279 return -EINVAL; in nl80211_parse_sta_channel_info()
7282 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]) { in nl80211_parse_sta_channel_info()
7283 params->supported_oper_classes = in nl80211_parse_sta_channel_info()
7284 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]); in nl80211_parse_sta_channel_info()
7285 params->supported_oper_classes_len = in nl80211_parse_sta_channel_info()
7286 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]); in nl80211_parse_sta_channel_info()
7296 if (info->attrs[NL80211_ATTR_PEER_AID]) in nl80211_set_station_tdls()
7297 params->aid = nla_get_u16(info->attrs[NL80211_ATTR_PEER_AID]); in nl80211_set_station_tdls()
7298 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) in nl80211_set_station_tdls()
7299 params->link_sta_params.ht_capa = in nl80211_set_station_tdls()
7300 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]); in nl80211_set_station_tdls()
7301 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) in nl80211_set_station_tdls()
7302 params->link_sta_params.vht_capa = in nl80211_set_station_tdls()
7303 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]); in nl80211_set_station_tdls()
7304 if (info->attrs[NL80211_ATTR_HE_CAPABILITY]) { in nl80211_set_station_tdls()
7305 params->link_sta_params.he_capa = in nl80211_set_station_tdls()
7306 nla_data(info->attrs[NL80211_ATTR_HE_CAPABILITY]); in nl80211_set_station_tdls()
7307 params->link_sta_params.he_capa_len = in nl80211_set_station_tdls()
7308 nla_len(info->attrs[NL80211_ATTR_HE_CAPABILITY]); in nl80211_set_station_tdls()
7310 if (info->attrs[NL80211_ATTR_EHT_CAPABILITY]) { in nl80211_set_station_tdls()
7311 params->link_sta_params.eht_capa = in nl80211_set_station_tdls()
7312 nla_data(info->attrs[NL80211_ATTR_EHT_CAPABILITY]); in nl80211_set_station_tdls()
7313 params->link_sta_params.eht_capa_len = in nl80211_set_station_tdls()
7314 nla_len(info->attrs[NL80211_ATTR_EHT_CAPABILITY]); in nl80211_set_station_tdls()
7316 if (!ieee80211_eht_capa_size_ok((const u8 *)params->link_sta_params.he_capa, in nl80211_set_station_tdls()
7317 (const u8 *)params->link_sta_params.eht_capa, in nl80211_set_station_tdls()
7318 params->link_sta_params.eht_capa_len, in nl80211_set_station_tdls()
7320 return -EINVAL; in nl80211_set_station_tdls()
7335 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_parse_sta_txpower_setting()
7338 if (info->attrs[NL80211_ATTR_STA_TX_POWER_SETTING]) { in nl80211_parse_sta_txpower_setting()
7339 if (!rdev->ops->set_tx_power || in nl80211_parse_sta_txpower_setting()
7340 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_parse_sta_txpower_setting()
7342 return -EOPNOTSUPP; in nl80211_parse_sta_txpower_setting()
7345 txpwr->type = nla_get_u8(info->attrs[idx]); in nl80211_parse_sta_txpower_setting()
7347 if (txpwr->type == NL80211_TX_POWER_LIMITED) { in nl80211_parse_sta_txpower_setting()
7350 if (info->attrs[idx]) in nl80211_parse_sta_txpower_setting()
7351 txpwr->power = nla_get_s16(info->attrs[idx]); in nl80211_parse_sta_txpower_setting()
7353 return -EINVAL; in nl80211_parse_sta_txpower_setting()
7366 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_station()
7367 struct net_device *dev = info->user_ptr[1]; in nl80211_set_station()
7374 if (!rdev->ops->change_station) in nl80211_set_station()
7375 return -EOPNOTSUPP; in nl80211_set_station()
7382 if (info->attrs[NL80211_ATTR_STA_AID]) in nl80211_set_station()
7383 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_STA_AID]); in nl80211_set_station()
7385 if (info->attrs[NL80211_ATTR_VLAN_ID]) in nl80211_set_station()
7386 params.vlan_id = nla_get_u16(info->attrs[NL80211_ATTR_VLAN_ID]); in nl80211_set_station()
7388 if (info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]) in nl80211_set_station()
7390 nla_get_u16(info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]); in nl80211_set_station()
7392 params.listen_interval = -1; in nl80211_set_station()
7394 if (info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]) in nl80211_set_station()
7396 nla_get_u8(info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]); in nl80211_set_station()
7398 params.support_p2p_ps = -1; in nl80211_set_station()
7400 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_set_station()
7401 return -EINVAL; in nl80211_set_station()
7404 nl80211_link_id_or_invalid(info->attrs); in nl80211_set_station()
7406 if (info->attrs[NL80211_ATTR_MLD_ADDR]) { in nl80211_set_station()
7413 return -EINVAL; in nl80211_set_station()
7415 mac_addr = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]); in nl80211_set_station()
7418 nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_set_station()
7420 return -EINVAL; in nl80211_set_station()
7422 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_set_station()
7426 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) { in nl80211_set_station()
7428 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); in nl80211_set_station()
7430 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); in nl80211_set_station()
7433 if (info->attrs[NL80211_ATTR_STA_CAPABILITY]) { in nl80211_set_station()
7435 nla_get_u16(info->attrs[NL80211_ATTR_STA_CAPABILITY]); in nl80211_set_station()
7439 if (info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]) { in nl80211_set_station()
7441 nla_data(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); in nl80211_set_station()
7443 nla_len(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); in nl80211_set_station()
7446 if (parse_station_flags(info, dev->ieee80211_ptr->iftype, ¶ms)) in nl80211_set_station()
7447 return -EINVAL; in nl80211_set_station()
7449 if (info->attrs[NL80211_ATTR_STA_PLINK_ACTION]) in nl80211_set_station()
7451 nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_ACTION]); in nl80211_set_station()
7453 if (info->attrs[NL80211_ATTR_STA_PLINK_STATE]) { in nl80211_set_station()
7455 nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_STATE]); in nl80211_set_station()
7456 if (info->attrs[NL80211_ATTR_MESH_PEER_AID]) in nl80211_set_station()
7458 info->attrs[NL80211_ATTR_MESH_PEER_AID]); in nl80211_set_station()
7462 if (info->attrs[NL80211_ATTR_LOCAL_MESH_POWER_MODE]) in nl80211_set_station()
7464 info->attrs[NL80211_ATTR_LOCAL_MESH_POWER_MODE]); in nl80211_set_station()
7466 if (info->attrs[NL80211_ATTR_OPMODE_NOTIF]) { in nl80211_set_station()
7469 nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]); in nl80211_set_station()
7472 if (info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]) in nl80211_set_station()
7474 nla_data(info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]); in nl80211_set_station()
7476 if (info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]) in nl80211_set_station()
7478 nla_get_u16(info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]); in nl80211_set_station()
7481 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_set_station()
7483 return -EOPNOTSUPP; in nl80211_set_station()
7500 switch (dev->ieee80211_ptr->iftype) { in nl80211_set_station()
7510 err = -EOPNOTSUPP; in nl80211_set_station()
7525 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_new_station()
7527 struct net_device *dev = info->user_ptr[1]; in nl80211_new_station()
7528 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_new_station()
7536 if (!rdev->ops->add_station) in nl80211_new_station()
7537 return -EOPNOTSUPP; in nl80211_new_station()
7539 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_new_station()
7540 return -EINVAL; in nl80211_new_station()
7542 if (!info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]) in nl80211_new_station()
7543 return -EINVAL; in nl80211_new_station()
7545 if (!info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) in nl80211_new_station()
7546 return -EINVAL; in nl80211_new_station()
7548 if (!info->attrs[NL80211_ATTR_STA_AID] && in nl80211_new_station()
7549 !info->attrs[NL80211_ATTR_PEER_AID]) in nl80211_new_station()
7550 return -EINVAL; in nl80211_new_station()
7553 nl80211_link_id_or_invalid(info->attrs); in nl80211_new_station()
7555 if (info->attrs[NL80211_ATTR_MLD_ADDR]) { in nl80211_new_station()
7556 mac_addr = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]); in nl80211_new_station()
7559 nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_new_station()
7561 return -EINVAL; in nl80211_new_station()
7563 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_new_station()
7567 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); in nl80211_new_station()
7569 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); in nl80211_new_station()
7571 nla_get_u16(info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]); in nl80211_new_station()
7573 if (info->attrs[NL80211_ATTR_VLAN_ID]) in nl80211_new_station()
7574 params.vlan_id = nla_get_u16(info->attrs[NL80211_ATTR_VLAN_ID]); in nl80211_new_station()
7576 if (info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]) { in nl80211_new_station()
7578 nla_get_u8(info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]); in nl80211_new_station()
7585 dev->ieee80211_ptr->iftype == NL80211_IFTYPE_P2P_GO; in nl80211_new_station()
7588 if (info->attrs[NL80211_ATTR_PEER_AID]) in nl80211_new_station()
7589 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_PEER_AID]); in nl80211_new_station()
7591 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_STA_AID]); in nl80211_new_station()
7593 if (info->attrs[NL80211_ATTR_STA_CAPABILITY]) { in nl80211_new_station()
7595 nla_get_u16(info->attrs[NL80211_ATTR_STA_CAPABILITY]); in nl80211_new_station()
7599 if (info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]) { in nl80211_new_station()
7601 nla_data(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); in nl80211_new_station()
7603 nla_len(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); in nl80211_new_station()
7606 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) in nl80211_new_station()
7608 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]); in nl80211_new_station()
7610 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) in nl80211_new_station()
7612 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]); in nl80211_new_station()
7614 if (info->attrs[NL80211_ATTR_HE_CAPABILITY]) { in nl80211_new_station()
7616 nla_data(info->attrs[NL80211_ATTR_HE_CAPABILITY]); in nl80211_new_station()
7618 nla_len(info->attrs[NL80211_ATTR_HE_CAPABILITY]); in nl80211_new_station()
7620 if (info->attrs[NL80211_ATTR_EHT_CAPABILITY]) { in nl80211_new_station()
7622 nla_data(info->attrs[NL80211_ATTR_EHT_CAPABILITY]); in nl80211_new_station()
7624 nla_len(info->attrs[NL80211_ATTR_EHT_CAPABILITY]); in nl80211_new_station()
7630 return -EINVAL; in nl80211_new_station()
7634 if (info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]) in nl80211_new_station()
7636 nla_data(info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]); in nl80211_new_station()
7638 if (info->attrs[NL80211_ATTR_OPMODE_NOTIF]) { in nl80211_new_station()
7641 nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]); in nl80211_new_station()
7644 if (info->attrs[NL80211_ATTR_STA_PLINK_ACTION]) in nl80211_new_station()
7646 nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_ACTION]); in nl80211_new_station()
7648 if (info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]) in nl80211_new_station()
7650 nla_get_u16(info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]); in nl80211_new_station()
7653 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_new_station()
7655 return -EOPNOTSUPP; in nl80211_new_station()
7671 if (parse_station_flags(info, dev->ieee80211_ptr->iftype, ¶ms)) in nl80211_new_station()
7672 return -EINVAL; in nl80211_new_station()
7687 return -EINVAL; in nl80211_new_station()
7693 return -EINVAL; in nl80211_new_station()
7698 switch (dev->ieee80211_ptr->iftype) { in nl80211_new_station()
7703 if (!(rdev->wiphy.flags & WIPHY_FLAG_AP_UAPSD) || in nl80211_new_station()
7709 info->attrs[NL80211_ATTR_PEER_AID]) in nl80211_new_station()
7710 return -EINVAL; in nl80211_new_station()
7715 if (!(rdev->wiphy.features & in nl80211_new_station()
7718 return -EINVAL; in nl80211_new_station()
7720 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_new_station()
7723 return -EINVAL; in nl80211_new_station()
7751 return -EINVAL; in nl80211_new_station()
7754 info->attrs[NL80211_ATTR_PEER_AID]) in nl80211_new_station()
7755 return -EINVAL; in nl80211_new_station()
7766 return -EINVAL; in nl80211_new_station()
7769 return -EINVAL; in nl80211_new_station()
7771 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS)) in nl80211_new_station()
7772 return -EOPNOTSUPP; in nl80211_new_station()
7774 if (!(rdev->wiphy.flags & WIPHY_FLAG_TDLS_EXTERNAL_SETUP)) in nl80211_new_station()
7775 return -EOPNOTSUPP; in nl80211_new_station()
7783 return -EOPNOTSUPP; in nl80211_new_station()
7788 if (wdev->valid_links) { in nl80211_new_station()
7790 err = -EINVAL; in nl80211_new_station()
7793 if (!(wdev->valid_links & BIT(params.link_sta_params.link_id))) { in nl80211_new_station()
7794 err = -ENOLINK; in nl80211_new_station()
7799 err = -EINVAL; in nl80211_new_station()
7811 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_del_station()
7812 struct net_device *dev = info->user_ptr[1]; in nl80211_del_station()
7813 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_del_station()
7815 int link_id = nl80211_link_id_or_invalid(info->attrs); in nl80211_del_station()
7819 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_del_station()
7820 params.mac = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_del_station()
7822 switch (wdev->iftype) { in nl80211_del_station()
7831 if (wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_del_station()
7834 return -EINVAL; in nl80211_del_station()
7836 return -EINVAL; in nl80211_del_station()
7839 if (!rdev->ops->del_station) in nl80211_del_station()
7840 return -EOPNOTSUPP; in nl80211_del_station()
7842 if (info->attrs[NL80211_ATTR_MGMT_SUBTYPE]) { in nl80211_del_station()
7844 nla_get_u8(info->attrs[NL80211_ATTR_MGMT_SUBTYPE]); in nl80211_del_station()
7847 return -EINVAL; in nl80211_del_station()
7853 if (info->attrs[NL80211_ATTR_REASON_CODE]) { in nl80211_del_station()
7855 nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); in nl80211_del_station()
7857 return -EINVAL; /* 0 is reserved */ in nl80211_del_station()
7863 /* Link ID not expected in case of non-ML operation */ in nl80211_del_station()
7864 if (!wdev->valid_links && link_id != -1) in nl80211_del_station()
7865 return -EINVAL; in nl80211_del_station()
7868 if (wdev->valid_links && link_id >= 0 && in nl80211_del_station()
7869 !(wdev->valid_links & BIT(link_id))) in nl80211_del_station()
7870 return -EINVAL; in nl80211_del_station()
7887 return -1; in nl80211_send_mpath()
7889 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in nl80211_send_mpath()
7892 nla_put_u32(msg, NL80211_ATTR_GENERATION, pinfo->generation)) in nl80211_send_mpath()
7898 if ((pinfo->filled & MPATH_INFO_FRAME_QLEN) && in nl80211_send_mpath()
7900 pinfo->frame_qlen)) in nl80211_send_mpath()
7902 if (((pinfo->filled & MPATH_INFO_SN) && in nl80211_send_mpath()
7903 nla_put_u32(msg, NL80211_MPATH_INFO_SN, pinfo->sn)) || in nl80211_send_mpath()
7904 ((pinfo->filled & MPATH_INFO_METRIC) && in nl80211_send_mpath()
7906 pinfo->metric)) || in nl80211_send_mpath()
7907 ((pinfo->filled & MPATH_INFO_EXPTIME) && in nl80211_send_mpath()
7909 pinfo->exptime)) || in nl80211_send_mpath()
7910 ((pinfo->filled & MPATH_INFO_FLAGS) && in nl80211_send_mpath()
7912 pinfo->flags)) || in nl80211_send_mpath()
7913 ((pinfo->filled & MPATH_INFO_DISCOVERY_TIMEOUT) && in nl80211_send_mpath()
7915 pinfo->discovery_timeout)) || in nl80211_send_mpath()
7916 ((pinfo->filled & MPATH_INFO_DISCOVERY_RETRIES) && in nl80211_send_mpath()
7918 pinfo->discovery_retries)) || in nl80211_send_mpath()
7919 ((pinfo->filled & MPATH_INFO_HOP_COUNT) && in nl80211_send_mpath()
7921 pinfo->hop_count)) || in nl80211_send_mpath()
7922 ((pinfo->filled & MPATH_INFO_PATH_CHANGE) && in nl80211_send_mpath()
7924 pinfo->path_change_count))) in nl80211_send_mpath()
7934 return -EMSGSIZE; in nl80211_send_mpath()
7945 int path_idx = cb->args[2]; in nl80211_dump_mpath()
7952 __acquire(&rdev->wiphy.mtx); in nl80211_dump_mpath()
7954 if (!rdev->ops->dump_mpath) { in nl80211_dump_mpath()
7955 err = -EOPNOTSUPP; in nl80211_dump_mpath()
7959 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) { in nl80211_dump_mpath()
7960 err = -EOPNOTSUPP; in nl80211_dump_mpath()
7965 err = rdev_dump_mpath(rdev, wdev->netdev, path_idx, dst, in nl80211_dump_mpath()
7967 if (err == -ENOENT) in nl80211_dump_mpath()
7972 if (nl80211_send_mpath(skb, NETLINK_CB(cb->skb).portid, in nl80211_dump_mpath()
7973 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_dump_mpath()
7974 wdev->netdev, dst, next_hop, in nl80211_dump_mpath()
7982 cb->args[2] = path_idx; in nl80211_dump_mpath()
7983 err = skb->len; in nl80211_dump_mpath()
7985 wiphy_unlock(&rdev->wiphy); in nl80211_dump_mpath()
7991 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_mpath()
7993 struct net_device *dev = info->user_ptr[1]; in nl80211_get_mpath()
8001 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_get_mpath()
8002 return -EINVAL; in nl80211_get_mpath()
8004 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_get_mpath()
8006 if (!rdev->ops->get_mpath) in nl80211_get_mpath()
8007 return -EOPNOTSUPP; in nl80211_get_mpath()
8009 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_get_mpath()
8010 return -EOPNOTSUPP; in nl80211_get_mpath()
8018 return -ENOMEM; in nl80211_get_mpath()
8020 if (nl80211_send_mpath(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_mpath()
8023 return -ENOBUFS; in nl80211_get_mpath()
8031 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_mpath()
8032 struct net_device *dev = info->user_ptr[1]; in nl80211_set_mpath()
8036 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_set_mpath()
8037 return -EINVAL; in nl80211_set_mpath()
8039 if (!info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]) in nl80211_set_mpath()
8040 return -EINVAL; in nl80211_set_mpath()
8042 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_set_mpath()
8043 next_hop = nla_data(info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]); in nl80211_set_mpath()
8045 if (!rdev->ops->change_mpath) in nl80211_set_mpath()
8046 return -EOPNOTSUPP; in nl80211_set_mpath()
8048 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_set_mpath()
8049 return -EOPNOTSUPP; in nl80211_set_mpath()
8056 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_new_mpath()
8057 struct net_device *dev = info->user_ptr[1]; in nl80211_new_mpath()
8061 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_new_mpath()
8062 return -EINVAL; in nl80211_new_mpath()
8064 if (!info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]) in nl80211_new_mpath()
8065 return -EINVAL; in nl80211_new_mpath()
8067 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_new_mpath()
8068 next_hop = nla_data(info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]); in nl80211_new_mpath()
8070 if (!rdev->ops->add_mpath) in nl80211_new_mpath()
8071 return -EOPNOTSUPP; in nl80211_new_mpath()
8073 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_new_mpath()
8074 return -EOPNOTSUPP; in nl80211_new_mpath()
8081 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_del_mpath()
8082 struct net_device *dev = info->user_ptr[1]; in nl80211_del_mpath()
8085 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_del_mpath()
8086 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_del_mpath()
8088 if (!rdev->ops->del_mpath) in nl80211_del_mpath()
8089 return -EOPNOTSUPP; in nl80211_del_mpath()
8091 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_del_mpath()
8092 return -EOPNOTSUPP; in nl80211_del_mpath()
8099 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_mpp()
8101 struct net_device *dev = info->user_ptr[1]; in nl80211_get_mpp()
8109 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_get_mpp()
8110 return -EINVAL; in nl80211_get_mpp()
8112 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_get_mpp()
8114 if (!rdev->ops->get_mpp) in nl80211_get_mpp()
8115 return -EOPNOTSUPP; in nl80211_get_mpp()
8117 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_get_mpp()
8118 return -EOPNOTSUPP; in nl80211_get_mpp()
8126 return -ENOMEM; in nl80211_get_mpp()
8128 if (nl80211_send_mpath(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_mpp()
8131 return -ENOBUFS; in nl80211_get_mpp()
8145 int path_idx = cb->args[2]; in nl80211_dump_mpp()
8152 __acquire(&rdev->wiphy.mtx); in nl80211_dump_mpp()
8154 if (!rdev->ops->dump_mpp) { in nl80211_dump_mpp()
8155 err = -EOPNOTSUPP; in nl80211_dump_mpp()
8159 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) { in nl80211_dump_mpp()
8160 err = -EOPNOTSUPP; in nl80211_dump_mpp()
8165 err = rdev_dump_mpp(rdev, wdev->netdev, path_idx, dst, in nl80211_dump_mpp()
8167 if (err == -ENOENT) in nl80211_dump_mpp()
8172 if (nl80211_send_mpath(skb, NETLINK_CB(cb->skb).portid, in nl80211_dump_mpp()
8173 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_dump_mpp()
8174 wdev->netdev, dst, mpp, in nl80211_dump_mpp()
8182 cb->args[2] = path_idx; in nl80211_dump_mpp()
8183 err = skb->len; in nl80211_dump_mpp()
8185 wiphy_unlock(&rdev->wiphy); in nl80211_dump_mpp()
8191 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_bss()
8192 struct net_device *dev = info->user_ptr[1]; in nl80211_set_bss()
8196 params.link_id = nl80211_link_id_or_invalid(info->attrs); in nl80211_set_bss()
8198 params.use_cts_prot = -1; in nl80211_set_bss()
8199 params.use_short_preamble = -1; in nl80211_set_bss()
8200 params.use_short_slot_time = -1; in nl80211_set_bss()
8201 params.ap_isolate = -1; in nl80211_set_bss()
8202 params.ht_opmode = -1; in nl80211_set_bss()
8203 params.p2p_ctwindow = -1; in nl80211_set_bss()
8204 params.p2p_opp_ps = -1; in nl80211_set_bss()
8206 if (info->attrs[NL80211_ATTR_BSS_CTS_PROT]) in nl80211_set_bss()
8208 nla_get_u8(info->attrs[NL80211_ATTR_BSS_CTS_PROT]); in nl80211_set_bss()
8209 if (info->attrs[NL80211_ATTR_BSS_SHORT_PREAMBLE]) in nl80211_set_bss()
8211 nla_get_u8(info->attrs[NL80211_ATTR_BSS_SHORT_PREAMBLE]); in nl80211_set_bss()
8212 if (info->attrs[NL80211_ATTR_BSS_SHORT_SLOT_TIME]) in nl80211_set_bss()
8214 nla_get_u8(info->attrs[NL80211_ATTR_BSS_SHORT_SLOT_TIME]); in nl80211_set_bss()
8215 if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) { in nl80211_set_bss()
8217 nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); in nl80211_set_bss()
8219 nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); in nl80211_set_bss()
8221 if (info->attrs[NL80211_ATTR_AP_ISOLATE]) in nl80211_set_bss()
8222 params.ap_isolate = !!nla_get_u8(info->attrs[NL80211_ATTR_AP_ISOLATE]); in nl80211_set_bss()
8223 if (info->attrs[NL80211_ATTR_BSS_HT_OPMODE]) in nl80211_set_bss()
8225 nla_get_u16(info->attrs[NL80211_ATTR_BSS_HT_OPMODE]); in nl80211_set_bss()
8227 if (info->attrs[NL80211_ATTR_P2P_CTWINDOW]) { in nl80211_set_bss()
8228 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_set_bss()
8229 return -EINVAL; in nl80211_set_bss()
8231 nla_get_u8(info->attrs[NL80211_ATTR_P2P_CTWINDOW]); in nl80211_set_bss()
8233 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_CTWIN)) in nl80211_set_bss()
8234 return -EINVAL; in nl80211_set_bss()
8237 if (info->attrs[NL80211_ATTR_P2P_OPPPS]) { in nl80211_set_bss()
8240 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_set_bss()
8241 return -EINVAL; in nl80211_set_bss()
8242 tmp = nla_get_u8(info->attrs[NL80211_ATTR_P2P_OPPPS]); in nl80211_set_bss()
8245 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_OPPPS)) in nl80211_set_bss()
8246 return -EINVAL; in nl80211_set_bss()
8249 if (!rdev->ops->change_bss) in nl80211_set_bss()
8250 return -EOPNOTSUPP; in nl80211_set_bss()
8252 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && in nl80211_set_bss()
8253 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_set_bss()
8254 return -EOPNOTSUPP; in nl80211_set_bss()
8268 * completely when built-in to the kernel right between the time in nl80211_req_set_reg()
8273 return -EINPROGRESS; in nl80211_req_set_reg()
8276 nla_get_u32_default(info->attrs[NL80211_ATTR_USER_REG_HINT_TYPE], in nl80211_req_set_reg()
8282 if (!info->attrs[NL80211_ATTR_REG_ALPHA2]) in nl80211_req_set_reg()
8283 return -EINVAL; in nl80211_req_set_reg()
8285 data = nla_data(info->attrs[NL80211_ATTR_REG_ALPHA2]); in nl80211_req_set_reg()
8288 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) { in nl80211_req_set_reg()
8289 owner_nlportid = info->snd_portid; in nl80211_req_set_reg()
8290 is_indoor = !!info->attrs[NL80211_ATTR_REG_INDOOR]; in nl80211_req_set_reg()
8299 return -EINVAL; in nl80211_req_set_reg()
8311 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_mesh_config()
8312 struct net_device *dev = info->user_ptr[1]; in nl80211_get_mesh_config()
8313 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_get_mesh_config()
8320 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_get_mesh_config()
8321 return -EOPNOTSUPP; in nl80211_get_mesh_config()
8323 if (!rdev->ops->get_mesh_config) in nl80211_get_mesh_config()
8324 return -EOPNOTSUPP; in nl80211_get_mesh_config()
8327 if (!wdev->u.mesh.id_len) in nl80211_get_mesh_config()
8338 return -ENOMEM; in nl80211_get_mesh_config()
8339 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_mesh_config()
8346 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in nl80211_get_mesh_config()
8417 return -ENOBUFS; in nl80211_get_mesh_config()
8452 NLA_POLICY_RANGE(NLA_S32, -255, 0),
8495 cfg->param = fn(tb[attr]); \ in nl80211_parse_mesh_config()
8496 mask |= BIT((attr) - 1); \ in nl80211_parse_mesh_config()
8500 if (!info->attrs[NL80211_ATTR_MESH_CONFIG]) in nl80211_parse_mesh_config()
8501 return -EINVAL; in nl80211_parse_mesh_config()
8502 …ated(tb, NL80211_MESHCONF_ATTR_MAX, info->attrs[NL80211_ATTR_MESH_CONFIG], nl80211_meshconf_params… in nl80211_parse_mesh_config()
8503 return -EINVAL; in nl80211_parse_mesh_config()
8541 (cfg->path_refresh_time < 1 || cfg->path_refresh_time > 65535)) in nl80211_parse_mesh_config()
8542 return -EINVAL; in nl80211_parse_mesh_config()
8551 (cfg->dot11MeshHWMPactivePathTimeout < 1 || in nl80211_parse_mesh_config()
8552 cfg->dot11MeshHWMPactivePathTimeout > 65535)) in nl80211_parse_mesh_config()
8553 return -EINVAL; in nl80211_parse_mesh_config()
8585 * IEEE 802.11-2016 9.4.2.57 HT Operation element. in nl80211_parse_mesh_config()
8593 return -EINVAL; in nl80211_parse_mesh_config()
8598 cfg->ht_opmode = ht_opmode; in nl80211_parse_mesh_config()
8599 mask |= (1 << (NL80211_MESHCONF_HT_OPMODE - 1)); in nl80211_parse_mesh_config()
8606 (cfg->dot11MeshHWMPactivePathToRootTimeout < 1 || in nl80211_parse_mesh_config()
8607 cfg->dot11MeshHWMPactivePathToRootTimeout > 65535)) in nl80211_parse_mesh_config()
8608 return -EINVAL; in nl80211_parse_mesh_config()
8635 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_parse_mesh_setup()
8638 if (!info->attrs[NL80211_ATTR_MESH_SETUP]) in nl80211_parse_mesh_setup()
8639 return -EINVAL; in nl80211_parse_mesh_setup()
8640 …ed(tb, NL80211_MESH_SETUP_ATTR_MAX, info->attrs[NL80211_ATTR_MESH_SETUP], nl80211_mesh_setup_param… in nl80211_parse_mesh_setup()
8641 return -EINVAL; in nl80211_parse_mesh_setup()
8644 setup->sync_method = in nl80211_parse_mesh_setup()
8650 setup->path_sel_proto = in nl80211_parse_mesh_setup()
8656 setup->path_metric = in nl80211_parse_mesh_setup()
8664 setup->ie = nla_data(ieattr); in nl80211_parse_mesh_setup()
8665 setup->ie_len = nla_len(ieattr); in nl80211_parse_mesh_setup()
8668 !(rdev->wiphy.features & NL80211_FEATURE_USERSPACE_MPM)) in nl80211_parse_mesh_setup()
8669 return -EINVAL; in nl80211_parse_mesh_setup()
8670 setup->user_mpm = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_MPM]); in nl80211_parse_mesh_setup()
8671 setup->is_authenticated = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_AUTH]); in nl80211_parse_mesh_setup()
8672 setup->is_secure = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_AMPE]); in nl80211_parse_mesh_setup()
8673 if (setup->is_secure) in nl80211_parse_mesh_setup()
8674 setup->user_mpm = true; in nl80211_parse_mesh_setup()
8677 if (!setup->user_mpm) in nl80211_parse_mesh_setup()
8678 return -EINVAL; in nl80211_parse_mesh_setup()
8679 setup->auth_id = in nl80211_parse_mesh_setup()
8689 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_update_mesh_config()
8690 struct net_device *dev = info->user_ptr[1]; in nl80211_update_mesh_config()
8691 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_update_mesh_config()
8696 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_update_mesh_config()
8697 return -EOPNOTSUPP; in nl80211_update_mesh_config()
8699 if (!rdev->ops->update_mesh_config) in nl80211_update_mesh_config()
8700 return -EOPNOTSUPP; in nl80211_update_mesh_config()
8706 if (!wdev->u.mesh.id_len) in nl80211_update_mesh_config()
8707 err = -ENOLINK; in nl80211_update_mesh_config()
8721 if (nla_put_string(msg, NL80211_ATTR_REG_ALPHA2, regdom->alpha2) || in nl80211_put_regdom()
8722 (regdom->dfs_region && in nl80211_put_regdom()
8723 nla_put_u8(msg, NL80211_ATTR_DFS_REGION, regdom->dfs_region))) in nl80211_put_regdom()
8730 for (i = 0; i < regdom->n_reg_rules; i++) { in nl80211_put_regdom()
8737 reg_rule = ®dom->reg_rules[i]; in nl80211_put_regdom()
8738 freq_range = ®_rule->freq_range; in nl80211_put_regdom()
8739 power_rule = ®_rule->power_rule; in nl80211_put_regdom()
8745 max_bandwidth_khz = freq_range->max_bandwidth_khz; in nl80211_put_regdom()
8751 reg_rule->flags) || in nl80211_put_regdom()
8753 freq_range->start_freq_khz) || in nl80211_put_regdom()
8755 freq_range->end_freq_khz) || in nl80211_put_regdom()
8759 power_rule->max_antenna_gain) || in nl80211_put_regdom()
8761 power_rule->max_eirp) || in nl80211_put_regdom()
8763 reg_rule->dfs_cac_ms)) in nl80211_put_regdom()
8766 if ((reg_rule->flags & NL80211_RRF_PSD) && in nl80211_put_regdom()
8768 reg_rule->psd)) in nl80211_put_regdom()
8778 return -EMSGSIZE; in nl80211_put_regdom()
8787 int err = -EMSGSIZE; in nl80211_get_reg_do()
8792 return -ENOBUFS; in nl80211_get_reg_do()
8794 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_reg_do()
8801 if (info->attrs[NL80211_ATTR_WIPHY]) { in nl80211_get_reg_do()
8810 wiphy = &rdev->wiphy; in nl80211_get_reg_do()
8811 self_managed = wiphy->regulatory_flags & in nl80211_get_reg_do()
8818 /* a self-managed-reg device must have a private regdom */ in nl80211_get_reg_do()
8820 err = -EINVAL; in nl80211_get_reg_do()
8861 void *hdr = nl80211hdr_put(msg, NETLINK_CB(cb->skb).portid, seq, flags, in nl80211_send_regdom()
8865 return -1; in nl80211_send_regdom()
8881 if (wiphy && wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED && in nl80211_send_regdom()
8890 return -EMSGSIZE; in nl80211_send_regdom()
8898 int err, reg_idx, start = cb->args[2]; in nl80211_get_reg_dump()
8903 err = nl80211_send_regdom(skb, cb, cb->nlh->nlmsg_seq, in nl80211_get_reg_dump()
8913 regdom = get_wiphy_regdom(&rdev->wiphy); in nl80211_get_reg_dump()
8920 err = nl80211_send_regdom(skb, cb, cb->nlh->nlmsg_seq, in nl80211_get_reg_dump()
8921 NLM_F_MULTI, &rdev->wiphy, regdom); in nl80211_get_reg_dump()
8923 reg_idx--; in nl80211_get_reg_dump()
8928 cb->args[2] = reg_idx; in nl80211_get_reg_dump()
8929 err = skb->len; in nl80211_get_reg_dump()
8949 struct ieee80211_freq_range *freq_range = ®_rule->freq_range; in parse_reg_rule()
8950 struct ieee80211_power_rule *power_rule = ®_rule->power_rule; in parse_reg_rule()
8953 return -EINVAL; in parse_reg_rule()
8955 return -EINVAL; in parse_reg_rule()
8957 return -EINVAL; in parse_reg_rule()
8959 return -EINVAL; in parse_reg_rule()
8961 return -EINVAL; in parse_reg_rule()
8963 reg_rule->flags = nla_get_u32(tb[NL80211_ATTR_REG_RULE_FLAGS]); in parse_reg_rule()
8965 freq_range->start_freq_khz = in parse_reg_rule()
8967 freq_range->end_freq_khz = in parse_reg_rule()
8969 freq_range->max_bandwidth_khz = in parse_reg_rule()
8972 power_rule->max_eirp = in parse_reg_rule()
8976 power_rule->max_antenna_gain = in parse_reg_rule()
8980 reg_rule->dfs_cac_ms = in parse_reg_rule()
8996 if (!info->attrs[NL80211_ATTR_REG_ALPHA2]) in nl80211_set_reg()
8997 return -EINVAL; in nl80211_set_reg()
8999 if (!info->attrs[NL80211_ATTR_REG_RULES]) in nl80211_set_reg()
9000 return -EINVAL; in nl80211_set_reg()
9002 alpha2 = nla_data(info->attrs[NL80211_ATTR_REG_ALPHA2]); in nl80211_set_reg()
9004 if (info->attrs[NL80211_ATTR_DFS_REGION]) in nl80211_set_reg()
9005 dfs_region = nla_get_u8(info->attrs[NL80211_ATTR_DFS_REGION]); in nl80211_set_reg()
9007 nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES], in nl80211_set_reg()
9011 return -EINVAL; in nl80211_set_reg()
9016 r = -EINVAL; in nl80211_set_reg()
9022 r = -ENOMEM; in nl80211_set_reg()
9026 rd->n_reg_rules = num_rules; in nl80211_set_reg()
9027 rd->alpha2[0] = alpha2[0]; in nl80211_set_reg()
9028 rd->alpha2[1] = alpha2[1]; in nl80211_set_reg()
9035 rd->dfs_region = dfs_region; in nl80211_set_reg()
9037 nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES], in nl80211_set_reg()
9041 info->extack); in nl80211_set_reg()
9044 r = parse_reg_rule(tb, &rd->reg_rules[rule_idx]); in nl80211_set_reg()
9051 r = -EINVAL; in nl80211_set_reg()
9098 return b < NUM_NL80211_BANDS && wiphy->bands[b]; in is_band_valid()
9113 return -EINVAL; in parse_bss_select()
9125 return -EINVAL; in parse_bss_select()
9130 bss_select->behaviour = __NL80211_BSS_SELECT_ATTR_INVALID; in parse_bss_select()
9133 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_RSSI; in parse_bss_select()
9136 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_BAND_PREF; in parse_bss_select()
9137 bss_select->param.band_pref = in parse_bss_select()
9139 if (!is_band_valid(wiphy, bss_select->param.band_pref)) in parse_bss_select()
9140 return -EINVAL; in parse_bss_select()
9147 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_RSSI_ADJUST; in parse_bss_select()
9148 bss_select->param.adjust.band = adj_param->band; in parse_bss_select()
9149 bss_select->param.adjust.delta = adj_param->delta; in parse_bss_select()
9150 if (!is_band_valid(wiphy, bss_select->param.adjust.band)) in parse_bss_select()
9151 return -EINVAL; in parse_bss_select()
9154 /* user-space did not provide behaviour attribute */ in parse_bss_select()
9155 if (bss_select->behaviour == __NL80211_BSS_SELECT_ATTR_INVALID) in parse_bss_select()
9156 return -EINVAL; in parse_bss_select()
9158 if (!(wiphy->bss_select_support & BIT(bss_select->behaviour))) in parse_bss_select()
9159 return -EINVAL; in parse_bss_select()
9180 return -EINVAL; in nl80211_parse_random_mac()
9188 return -EINVAL; in nl80211_parse_random_mac()
9207 lockdep_assert_wiphy(wdev->wiphy); in cfg80211_off_channel_oper_allowed()
9227 if (!chandef || !chandef->chan) in cfg80211_off_channel_oper_allowed()
9234 * the off-channel operation. in cfg80211_off_channel_oper_allowed()
9237 if (chandef->chan->flags & IEEE80211_CHAN_RADAR) in cfg80211_off_channel_oper_allowed()
9244 return regulatory_pre_cac_allowed(wdev->wiphy); in cfg80211_off_channel_oper_allowed()
9275 flags = &req->flags; in nl80211_check_scan_flags()
9276 mac_addr = req->mac_addr; in nl80211_check_scan_flags()
9277 mac_addr_mask = req->mac_addr_mask; in nl80211_check_scan_flags()
9282 flags = &req->flags; in nl80211_check_scan_flags()
9283 mac_addr = req->mac_addr; in nl80211_check_scan_flags()
9284 mac_addr_mask = req->mac_addr_mask; in nl80211_check_scan_flags()
9290 !(wiphy->features & NL80211_FEATURE_LOW_PRIORITY_SCAN)) || in nl80211_check_scan_flags()
9318 return -EOPNOTSUPP; in nl80211_check_scan_flags()
9323 if (!(wiphy->features & randomness_flag) || in nl80211_check_scan_flags()
9324 (wdev && wdev->connected)) in nl80211_check_scan_flags()
9325 return -EOPNOTSUPP; in nl80211_check_scan_flags()
9337 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_trigger_scan()
9338 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_trigger_scan()
9348 wiphy = &rdev->wiphy; in nl80211_trigger_scan()
9350 if (wdev->iftype == NL80211_IFTYPE_NAN) in nl80211_trigger_scan()
9351 return -EOPNOTSUPP; in nl80211_trigger_scan()
9353 if (!rdev->ops->scan) in nl80211_trigger_scan()
9354 return -EOPNOTSUPP; in nl80211_trigger_scan()
9356 if (rdev->scan_req || rdev->scan_msg) in nl80211_trigger_scan()
9357 return -EBUSY; in nl80211_trigger_scan()
9359 if (info->attrs[NL80211_ATTR_SCAN_FREQ_KHZ]) { in nl80211_trigger_scan()
9362 return -EOPNOTSUPP; in nl80211_trigger_scan()
9363 scan_freqs = info->attrs[NL80211_ATTR_SCAN_FREQ_KHZ]; in nl80211_trigger_scan()
9365 } else if (info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]) in nl80211_trigger_scan()
9366 scan_freqs = info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]; in nl80211_trigger_scan()
9371 return -EINVAL; in nl80211_trigger_scan()
9376 if (info->attrs[NL80211_ATTR_SCAN_SSIDS]) in nl80211_trigger_scan()
9377 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp) in nl80211_trigger_scan()
9380 if (n_ssids > wiphy->max_scan_ssids) in nl80211_trigger_scan()
9381 return -EINVAL; in nl80211_trigger_scan()
9383 if (info->attrs[NL80211_ATTR_IE]) in nl80211_trigger_scan()
9384 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_trigger_scan()
9388 if (ie_len > wiphy->max_scan_ie_len) in nl80211_trigger_scan()
9389 return -EINVAL; in nl80211_trigger_scan()
9393 size = size_add(size, array_size(sizeof(*request->ssids), n_ssids)); in nl80211_trigger_scan()
9398 return -ENOMEM; in nl80211_trigger_scan()
9399 request->n_channels = n_channels; in nl80211_trigger_scan()
9402 request->ssids = (void *)request + ssids_offset; in nl80211_trigger_scan()
9403 request->n_ssids = n_ssids; in nl80211_trigger_scan()
9405 request->ie = (void *)request + ie_offset; in nl80211_trigger_scan()
9419 err = -EINVAL; in nl80211_trigger_scan()
9424 if (chan->flags & IEEE80211_CHAN_DISABLED || in nl80211_trigger_scan()
9428 request->channels[i] = chan; in nl80211_trigger_scan()
9438 if (!wiphy->bands[band]) in nl80211_trigger_scan()
9440 for (j = 0; j < wiphy->bands[band]->n_channels; j++) { in nl80211_trigger_scan()
9443 chan = &wiphy->bands[band]->channels[j]; in nl80211_trigger_scan()
9445 if (chan->flags & IEEE80211_CHAN_DISABLED || in nl80211_trigger_scan()
9449 request->channels[i] = chan; in nl80211_trigger_scan()
9456 err = -EINVAL; in nl80211_trigger_scan()
9460 request->n_channels = i; in nl80211_trigger_scan()
9462 for (i = 0; i < request->n_channels; i++) { in nl80211_trigger_scan()
9463 struct ieee80211_channel *chan = request->channels[i]; in nl80211_trigger_scan()
9465 /* if we can go off-channel to the target channel we're good */ in nl80211_trigger_scan()
9470 err = -EBUSY; in nl80211_trigger_scan()
9477 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp) { in nl80211_trigger_scan()
9479 err = -EINVAL; in nl80211_trigger_scan()
9482 request->ssids[i].ssid_len = nla_len(attr); in nl80211_trigger_scan()
9483 memcpy(request->ssids[i].ssid, nla_data(attr), nla_len(attr)); in nl80211_trigger_scan()
9488 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_trigger_scan()
9489 request->ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_trigger_scan()
9490 memcpy((void *)request->ie, in nl80211_trigger_scan()
9491 nla_data(info->attrs[NL80211_ATTR_IE]), in nl80211_trigger_scan()
9492 request->ie_len); in nl80211_trigger_scan()
9496 if (wiphy->bands[i]) in nl80211_trigger_scan()
9497 request->rates[i] = in nl80211_trigger_scan()
9498 (1 << wiphy->bands[i]->n_bitrates) - 1; in nl80211_trigger_scan()
9500 if (info->attrs[NL80211_ATTR_SCAN_SUPP_RATES]) { in nl80211_trigger_scan()
9502 info->attrs[NL80211_ATTR_SCAN_SUPP_RATES], in nl80211_trigger_scan()
9507 err = -EINVAL; in nl80211_trigger_scan()
9511 if (!wiphy->bands[band]) in nl80211_trigger_scan()
9514 err = ieee80211_get_ratemask(wiphy->bands[band], in nl80211_trigger_scan()
9517 &request->rates[band]); in nl80211_trigger_scan()
9523 if (info->attrs[NL80211_ATTR_MEASUREMENT_DURATION]) { in nl80211_trigger_scan()
9524 request->duration = in nl80211_trigger_scan()
9525 nla_get_u16(info->attrs[NL80211_ATTR_MEASUREMENT_DURATION]); in nl80211_trigger_scan()
9526 request->duration_mandatory = in nl80211_trigger_scan()
9527 nla_get_flag(info->attrs[NL80211_ATTR_MEASUREMENT_DURATION_MANDATORY]); in nl80211_trigger_scan()
9530 err = nl80211_check_scan_flags(wiphy, wdev, request, info->attrs, in nl80211_trigger_scan()
9535 request->no_cck = in nl80211_trigger_scan()
9536 nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]); in nl80211_trigger_scan()
9547 if (info->attrs[NL80211_ATTR_BSSID]) in nl80211_trigger_scan()
9548 memcpy(request->bssid, in nl80211_trigger_scan()
9549 nla_data(info->attrs[NL80211_ATTR_BSSID]), ETH_ALEN); in nl80211_trigger_scan()
9550 else if (!(request->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) && in nl80211_trigger_scan()
9551 info->attrs[NL80211_ATTR_MAC]) in nl80211_trigger_scan()
9552 memcpy(request->bssid, nla_data(info->attrs[NL80211_ATTR_MAC]), in nl80211_trigger_scan()
9555 eth_broadcast_addr(request->bssid); in nl80211_trigger_scan()
9557 request->tsf_report_link_id = nl80211_link_id_or_invalid(info->attrs); in nl80211_trigger_scan()
9558 request->wdev = wdev; in nl80211_trigger_scan()
9559 request->wiphy = &rdev->wiphy; in nl80211_trigger_scan()
9560 request->scan_start = jiffies; in nl80211_trigger_scan()
9562 rdev->scan_req = request; in nl80211_trigger_scan()
9569 dev_hold(wdev->netdev); in nl80211_trigger_scan()
9574 rdev->scan_req = NULL; in nl80211_trigger_scan()
9582 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_abort_scan()
9583 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_abort_scan()
9585 if (!rdev->ops->abort_scan) in nl80211_abort_scan()
9586 return -EOPNOTSUPP; in nl80211_abort_scan()
9588 if (rdev->scan_msg) in nl80211_abort_scan()
9591 if (!rdev->scan_req) in nl80211_abort_scan()
9592 return -ENOENT; in nl80211_abort_scan()
9617 return -EINVAL; in nl80211_parse_sched_scan_plans()
9619 request->scan_plans[0].interval = in nl80211_parse_sched_scan_plans()
9621 if (!request->scan_plans[0].interval) in nl80211_parse_sched_scan_plans()
9622 return -EINVAL; in nl80211_parse_sched_scan_plans()
9624 if (request->scan_plans[0].interval > in nl80211_parse_sched_scan_plans()
9625 wiphy->max_sched_scan_plan_interval) in nl80211_parse_sched_scan_plans()
9626 request->scan_plans[0].interval = in nl80211_parse_sched_scan_plans()
9627 wiphy->max_sched_scan_plan_interval; in nl80211_parse_sched_scan_plans()
9636 return -EINVAL; in nl80211_parse_sched_scan_plans()
9646 return -EINVAL; in nl80211_parse_sched_scan_plans()
9648 request->scan_plans[i].interval = in nl80211_parse_sched_scan_plans()
9650 if (!request->scan_plans[i].interval || in nl80211_parse_sched_scan_plans()
9651 request->scan_plans[i].interval > in nl80211_parse_sched_scan_plans()
9652 wiphy->max_sched_scan_plan_interval) in nl80211_parse_sched_scan_plans()
9653 return -EINVAL; in nl80211_parse_sched_scan_plans()
9656 request->scan_plans[i].iterations = in nl80211_parse_sched_scan_plans()
9658 if (!request->scan_plans[i].iterations || in nl80211_parse_sched_scan_plans()
9659 (request->scan_plans[i].iterations > in nl80211_parse_sched_scan_plans()
9660 wiphy->max_sched_scan_plan_iterations)) in nl80211_parse_sched_scan_plans()
9661 return -EINVAL; in nl80211_parse_sched_scan_plans()
9662 } else if (i < n_plans - 1) { in nl80211_parse_sched_scan_plans()
9667 return -EINVAL; in nl80211_parse_sched_scan_plans()
9677 if (request->scan_plans[n_plans - 1].iterations) in nl80211_parse_sched_scan_plans()
9678 return -EINVAL; in nl80211_parse_sched_scan_plans()
9699 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
9709 if (n_ssids > wiphy->max_sched_scan_ssids) in nl80211_parse_sched_scan()
9710 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
9719 * global RSSI for all other matchsets - if there are other matchsets. in nl80211_parse_sched_scan()
9738 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
9757 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
9764 if (ie_len > wiphy->max_sched_scan_ie_len) in nl80211_parse_sched_scan()
9765 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
9773 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
9786 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
9791 if (!n_plans || n_plans > wiphy->max_sched_scan_plans) in nl80211_parse_sched_scan()
9792 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
9798 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
9801 size = size_add(size, array_size(sizeof(*request->ssids), n_ssids)); in nl80211_parse_sched_scan()
9802 size = size_add(size, array_size(sizeof(*request->match_sets), in nl80211_parse_sched_scan()
9804 size = size_add(size, array_size(sizeof(*request->scan_plans), in nl80211_parse_sched_scan()
9809 return ERR_PTR(-ENOMEM); in nl80211_parse_sched_scan()
9810 request->n_channels = n_channels; in nl80211_parse_sched_scan()
9813 request->ssids = (void *)request + in nl80211_parse_sched_scan()
9815 request->n_ssids = n_ssids; in nl80211_parse_sched_scan()
9818 request->ie = (void *)(request->ssids + n_ssids); in nl80211_parse_sched_scan()
9820 request->ie = (void *)(request->channels + n_channels); in nl80211_parse_sched_scan()
9824 if (request->ie) in nl80211_parse_sched_scan()
9825 request->match_sets = (void *)(request->ie + ie_len); in nl80211_parse_sched_scan()
9827 request->match_sets = in nl80211_parse_sched_scan()
9828 (void *)(request->ssids + n_ssids); in nl80211_parse_sched_scan()
9830 request->match_sets = in nl80211_parse_sched_scan()
9831 (void *)(request->channels + n_channels); in nl80211_parse_sched_scan()
9833 request->n_match_sets = n_match_sets; in nl80211_parse_sched_scan()
9836 request->scan_plans = (void *)(request->match_sets + in nl80211_parse_sched_scan()
9838 else if (request->ie) in nl80211_parse_sched_scan()
9839 request->scan_plans = (void *)(request->ie + ie_len); in nl80211_parse_sched_scan()
9841 request->scan_plans = (void *)(request->ssids + n_ssids); in nl80211_parse_sched_scan()
9843 request->scan_plans = (void *)(request->channels + n_channels); in nl80211_parse_sched_scan()
9845 request->n_scan_plans = n_plans; in nl80211_parse_sched_scan()
9858 err = -EINVAL; in nl80211_parse_sched_scan()
9863 if (chan->flags & IEEE80211_CHAN_DISABLED) in nl80211_parse_sched_scan()
9866 request->channels[i] = chan; in nl80211_parse_sched_scan()
9874 if (!wiphy->bands[band]) in nl80211_parse_sched_scan()
9876 for (j = 0; j < wiphy->bands[band]->n_channels; j++) { in nl80211_parse_sched_scan()
9879 chan = &wiphy->bands[band]->channels[j]; in nl80211_parse_sched_scan()
9881 if (chan->flags & IEEE80211_CHAN_DISABLED) in nl80211_parse_sched_scan()
9884 request->channels[i] = chan; in nl80211_parse_sched_scan()
9891 err = -EINVAL; in nl80211_parse_sched_scan()
9895 request->n_channels = i; in nl80211_parse_sched_scan()
9902 err = -EINVAL; in nl80211_parse_sched_scan()
9905 request->ssids[i].ssid_len = nla_len(attr); in nl80211_parse_sched_scan()
9906 memcpy(request->ssids[i].ssid, nla_data(attr), in nl80211_parse_sched_scan()
9939 err = -EINVAL; in nl80211_parse_sched_scan()
9944 memcpy(request->match_sets[i].ssid.ssid, in nl80211_parse_sched_scan()
9946 request->match_sets[i].ssid.ssid_len = in nl80211_parse_sched_scan()
9950 memcpy(request->match_sets[i].bssid, in nl80211_parse_sched_scan()
9953 /* special attribute - old implementation w/a */ in nl80211_parse_sched_scan()
9954 request->match_sets[i].rssi_thold = default_match_rssi; in nl80211_parse_sched_scan()
9957 request->match_sets[i].rssi_thold = in nl80211_parse_sched_scan()
9964 request->match_sets[0].rssi_thold = default_match_rssi; in nl80211_parse_sched_scan()
9966 request->min_rssi_thold = INT_MAX; in nl80211_parse_sched_scan()
9968 request->min_rssi_thold = in nl80211_parse_sched_scan()
9969 min(request->match_sets[i].rssi_thold, in nl80211_parse_sched_scan()
9970 request->min_rssi_thold); in nl80211_parse_sched_scan()
9972 request->min_rssi_thold = NL80211_SCAN_RSSI_THOLD_OFF; in nl80211_parse_sched_scan()
9976 request->ie_len = ie_len; in nl80211_parse_sched_scan()
9977 memcpy((void *)request->ie, in nl80211_parse_sched_scan()
9979 request->ie_len); in nl80211_parse_sched_scan()
9987 request->delay = in nl80211_parse_sched_scan()
9991 request->relative_rssi = nla_get_s8( in nl80211_parse_sched_scan()
9993 request->relative_rssi_set = true; in nl80211_parse_sched_scan()
9996 if (request->relative_rssi_set && in nl80211_parse_sched_scan()
10002 request->rssi_adjust.band = rssi_adjust->band; in nl80211_parse_sched_scan()
10003 request->rssi_adjust.delta = rssi_adjust->delta; in nl80211_parse_sched_scan()
10004 if (!is_band_valid(wiphy, request->rssi_adjust.band)) { in nl80211_parse_sched_scan()
10005 err = -EINVAL; in nl80211_parse_sched_scan()
10014 request->scan_start = jiffies; in nl80211_parse_sched_scan()
10026 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_start_sched_scan()
10027 struct net_device *dev = info->user_ptr[1]; in nl80211_start_sched_scan()
10028 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_start_sched_scan()
10033 if (!rdev->wiphy.max_sched_scan_reqs || !rdev->ops->sched_scan_start) in nl80211_start_sched_scan()
10034 return -EOPNOTSUPP; in nl80211_start_sched_scan()
10036 want_multi = info->attrs[NL80211_ATTR_SCHED_SCAN_MULTI]; in nl80211_start_sched_scan()
10041 sched_scan_req = nl80211_parse_sched_scan(&rdev->wiphy, wdev, in nl80211_start_sched_scan()
10042 info->attrs, in nl80211_start_sched_scan()
10043 rdev->wiphy.max_match_sets); in nl80211_start_sched_scan()
10050 * or if driver does not support multi-scheduled scan in nl80211_start_sched_scan()
10052 if (want_multi && rdev->wiphy.max_sched_scan_reqs > 1) in nl80211_start_sched_scan()
10053 sched_scan_req->reqid = cfg80211_assign_cookie(rdev); in nl80211_start_sched_scan()
10059 sched_scan_req->dev = dev; in nl80211_start_sched_scan()
10060 sched_scan_req->wiphy = &rdev->wiphy; in nl80211_start_sched_scan()
10062 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) in nl80211_start_sched_scan()
10063 sched_scan_req->owner_nlportid = info->snd_portid; in nl80211_start_sched_scan()
10080 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_stop_sched_scan()
10083 if (!rdev->wiphy.max_sched_scan_reqs || !rdev->ops->sched_scan_stop) in nl80211_stop_sched_scan()
10084 return -EOPNOTSUPP; in nl80211_stop_sched_scan()
10086 if (info->attrs[NL80211_ATTR_COOKIE]) { in nl80211_stop_sched_scan()
10087 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); in nl80211_stop_sched_scan()
10091 req = list_first_or_null_rcu(&rdev->sched_scan_req_list, in nl80211_stop_sched_scan()
10094 if (!req || req->reqid || in nl80211_stop_sched_scan()
10095 (req->owner_nlportid && in nl80211_stop_sched_scan()
10096 req->owner_nlportid != info->snd_portid)) in nl80211_stop_sched_scan()
10097 return -ENOENT; in nl80211_stop_sched_scan()
10105 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_start_radar_detection()
10106 struct net_device *dev = info->user_ptr[1]; in nl80211_start_radar_detection()
10107 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_start_radar_detection()
10108 int link_id = nl80211_link_id(info->attrs); in nl80211_start_radar_detection()
10109 struct wiphy *wiphy = wdev->wiphy; in nl80211_start_radar_detection()
10115 flush_delayed_work(&rdev->dfs_update_channels_wk); in nl80211_start_radar_detection()
10117 switch (wdev->iftype) { in nl80211_start_radar_detection()
10124 /* caution - see cfg80211_beaconing_iface_active() below */ in nl80211_start_radar_detection()
10125 return -EINVAL; in nl80211_start_radar_detection()
10132 return -EINVAL; in nl80211_start_radar_detection()
10138 err = cfg80211_chandef_dfs_required(wiphy, &chandef, wdev->iftype); in nl80211_start_radar_detection()
10143 return -EINVAL; in nl80211_start_radar_detection()
10146 return -EINVAL; in nl80211_start_radar_detection()
10148 if (nla_get_flag(info->attrs[NL80211_ATTR_RADAR_BACKGROUND])) in nl80211_start_radar_detection()
10156 if (wdev->valid_links && in nl80211_start_radar_detection()
10157 !wdev->links[link_id].ap.beacon_interval) { in nl80211_start_radar_detection()
10160 return -EBUSY; in nl80211_start_radar_detection()
10164 if (wdev->links[link_id].cac_started) in nl80211_start_radar_detection()
10165 return -EBUSY; in nl80211_start_radar_detection()
10169 return -EOPNOTSUPP; in nl80211_start_radar_detection()
10171 if (!rdev->ops->start_radar_detection) in nl80211_start_radar_detection()
10172 return -EOPNOTSUPP; in nl80211_start_radar_detection()
10174 cac_time_ms = cfg80211_chandef_dfs_cac_time(&rdev->wiphy, &chandef); in nl80211_start_radar_detection()
10183 switch (wdev->iftype) { in nl80211_start_radar_detection()
10186 wdev->links[link_id].ap.chandef = chandef; in nl80211_start_radar_detection()
10189 wdev->u.ibss.chandef = chandef; in nl80211_start_radar_detection()
10192 wdev->u.mesh.chandef = chandef; in nl80211_start_radar_detection()
10197 wdev->links[link_id].cac_started = true; in nl80211_start_radar_detection()
10198 wdev->links[link_id].cac_start_time = jiffies; in nl80211_start_radar_detection()
10199 wdev->links[link_id].cac_time_ms = cac_time_ms; in nl80211_start_radar_detection()
10207 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_notify_radar_detection()
10208 struct net_device *dev = info->user_ptr[1]; in nl80211_notify_radar_detection()
10209 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_notify_radar_detection()
10210 struct wiphy *wiphy = wdev->wiphy; in nl80211_notify_radar_detection()
10219 return -EINVAL; in nl80211_notify_radar_detection()
10228 err = cfg80211_chandef_dfs_required(wiphy, &chandef, wdev->iftype); in nl80211_notify_radar_detection()
10237 return -EINVAL; in nl80211_notify_radar_detection()
10243 if (chandef.chan->dfs_state == NL80211_DFS_UNAVAILABLE) in nl80211_notify_radar_detection()
10250 rdev->radar_chandef = chandef; in nl80211_notify_radar_detection()
10253 queue_work(cfg80211_wq, &rdev->propagate_radar_detect_wk); in nl80211_notify_radar_detection()
10271 return -EINVAL; in nl80211_parse_counter_offsets()
10274 if (rdev->wiphy.max_num_csa_counters && in nl80211_parse_counter_offsets()
10275 (*n_offsets > rdev->wiphy.max_num_csa_counters)) in nl80211_parse_counter_offsets()
10276 return -EINVAL; in nl80211_parse_counter_offsets()
10280 /* sanity checks - counters should fit and be the same */ in nl80211_parse_counter_offsets()
10285 return -EINVAL; in nl80211_parse_counter_offsets()
10287 if (first_count != -1 && data[offset] != first_count) in nl80211_parse_counter_offsets()
10288 return -EINVAL; in nl80211_parse_counter_offsets()
10296 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_channel_switch()
10297 unsigned int link_id = nl80211_link_id(info->attrs); in nl80211_channel_switch()
10298 struct net_device *dev = info->user_ptr[1]; in nl80211_channel_switch()
10299 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_channel_switch()
10307 if (!rdev->ops->channel_switch || in nl80211_channel_switch()
10308 !(rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH)) in nl80211_channel_switch()
10309 return -EOPNOTSUPP; in nl80211_channel_switch()
10311 switch (dev->ieee80211_ptr->iftype) { in nl80211_channel_switch()
10323 if (!wdev->links[link_id].ap.beacon_interval) in nl80211_channel_switch()
10324 return -ENOTCONN; in nl80211_channel_switch()
10327 if (!wdev->u.ibss.ssid_len) in nl80211_channel_switch()
10328 return -ENOTCONN; in nl80211_channel_switch()
10331 if (!wdev->u.mesh.id_len) in nl80211_channel_switch()
10332 return -ENOTCONN; in nl80211_channel_switch()
10335 return -EOPNOTSUPP; in nl80211_channel_switch()
10339 params.beacon_csa.ftm_responder = -1; in nl80211_channel_switch()
10341 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ] || in nl80211_channel_switch()
10342 !info->attrs[NL80211_ATTR_CH_SWITCH_COUNT]) in nl80211_channel_switch()
10343 return -EINVAL; in nl80211_channel_switch()
10346 if (need_new_beacon && !info->attrs[NL80211_ATTR_CSA_IES]) in nl80211_channel_switch()
10347 return -EINVAL; in nl80211_channel_switch()
10352 cs_count = nla_get_u32(info->attrs[NL80211_ATTR_CH_SWITCH_COUNT]); in nl80211_channel_switch()
10354 return -EINVAL; in nl80211_channel_switch()
10361 err = nl80211_parse_beacon(rdev, info->attrs, ¶ms.beacon_after, in nl80211_channel_switch()
10362 info->extack); in nl80211_channel_switch()
10369 err = -ENOMEM; in nl80211_channel_switch()
10374 info->attrs[NL80211_ATTR_CSA_IES], in nl80211_channel_switch()
10375 nl80211_policy, info->extack); in nl80211_channel_switch()
10380 info->extack); in nl80211_channel_switch()
10385 err = -EINVAL; in nl80211_channel_switch()
10412 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, ¶ms.chandef, in nl80211_channel_switch()
10413 wdev->iftype)) { in nl80211_channel_switch()
10414 err = -EINVAL; in nl80211_channel_switch()
10418 err = cfg80211_chandef_dfs_required(wdev->wiphy, in nl80211_channel_switch()
10420 wdev->iftype); in nl80211_channel_switch()
10427 !nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS])) { in nl80211_channel_switch()
10428 err = -EINVAL; in nl80211_channel_switch()
10433 if (info->attrs[NL80211_ATTR_CH_SWITCH_BLOCK_TX]) in nl80211_channel_switch()
10454 struct cfg80211_bss *res = &intbss->pub; in nl80211_send_bss()
10460 lockdep_assert_wiphy(wdev->wiphy); in nl80211_send_bss()
10462 hdr = nl80211hdr_put(msg, NETLINK_CB(cb->skb).portid, seq, flags, in nl80211_send_bss()
10465 return -1; in nl80211_send_bss()
10469 if (nla_put_u32(msg, NL80211_ATTR_GENERATION, rdev->bss_generation)) in nl80211_send_bss()
10471 if (wdev->netdev && in nl80211_send_bss()
10472 nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex)) in nl80211_send_bss()
10481 if ((!is_zero_ether_addr(res->bssid) && in nl80211_send_bss()
10482 nla_put(msg, NL80211_BSS_BSSID, ETH_ALEN, res->bssid))) in nl80211_send_bss()
10487 if (rcu_access_pointer(res->proberesp_ies) && in nl80211_send_bss()
10494 ies = rcu_dereference(res->ies); in nl80211_send_bss()
10496 if (nla_put_u64_64bit(msg, NL80211_BSS_TSF, ies->tsf, in nl80211_send_bss()
10499 if (ies->len && nla_put(msg, NL80211_BSS_INFORMATION_ELEMENTS, in nl80211_send_bss()
10500 ies->len, ies->data)) in nl80211_send_bss()
10505 ies = rcu_dereference(res->beacon_ies); in nl80211_send_bss()
10506 if (ies && ies->from_beacon) { in nl80211_send_bss()
10507 if (nla_put_u64_64bit(msg, NL80211_BSS_BEACON_TSF, ies->tsf, in nl80211_send_bss()
10510 if (ies->len && nla_put(msg, NL80211_BSS_BEACON_IES, in nl80211_send_bss()
10511 ies->len, ies->data)) in nl80211_send_bss()
10516 if (res->beacon_interval && in nl80211_send_bss()
10517 nla_put_u16(msg, NL80211_BSS_BEACON_INTERVAL, res->beacon_interval)) in nl80211_send_bss()
10519 if (nla_put_u16(msg, NL80211_BSS_CAPABILITY, res->capability) || in nl80211_send_bss()
10520 nla_put_u32(msg, NL80211_BSS_FREQUENCY, res->channel->center_freq) || in nl80211_send_bss()
10522 res->channel->freq_offset) || in nl80211_send_bss()
10524 jiffies_to_msecs(jiffies - intbss->ts))) in nl80211_send_bss()
10527 if (intbss->parent_tsf && in nl80211_send_bss()
10529 intbss->parent_tsf, NL80211_BSS_PAD) || in nl80211_send_bss()
10531 intbss->parent_bssid))) in nl80211_send_bss()
10534 if (res->ts_boottime && in nl80211_send_bss()
10536 res->ts_boottime, NL80211_BSS_PAD)) in nl80211_send_bss()
10539 if (!nl80211_put_signal(msg, intbss->pub.chains, in nl80211_send_bss()
10540 intbss->pub.chain_signal, in nl80211_send_bss()
10544 if (intbss->bss_source != BSS_SOURCE_STA_PROFILE) { in nl80211_send_bss()
10545 switch (rdev->wiphy.signal_type) { in nl80211_send_bss()
10548 res->signal)) in nl80211_send_bss()
10553 res->signal)) in nl80211_send_bss()
10561 switch (wdev->iftype) { in nl80211_send_bss()
10565 if (intbss == wdev->links[link_id].client.current_bss && in nl80211_send_bss()
10568 (wdev->valid_links && in nl80211_send_bss()
10572 wdev->u.client.connected_addr))))) in nl80211_send_bss()
10577 if (intbss == wdev->u.ibss.current_bss && in nl80211_send_bss()
10586 if (nla_put_u32(msg, NL80211_BSS_USE_FOR, res->use_for)) in nl80211_send_bss()
10589 if (res->cannot_use_reasons && in nl80211_send_bss()
10591 res->cannot_use_reasons, in nl80211_send_bss()
10604 return -EMSGSIZE; in nl80211_send_bss()
10613 int start = cb->args[2], idx = 0; in nl80211_dump_scan()
10619 return -ENOMEM; in nl80211_dump_scan()
10627 __acquire(&rdev->wiphy.mtx); in nl80211_dump_scan()
10633 spin_lock_bh(&rdev->bss_lock); in nl80211_dump_scan()
10637 * into multiple messages. It is unlikely that any more bss-es will be in nl80211_dump_scan()
10644 cb->seq = rdev->bss_generation; in nl80211_dump_scan()
10646 list_for_each_entry(scan, &rdev->bss_list, list) { in nl80211_dump_scan()
10650 !(scan->pub.use_for & NL80211_BSS_USE_FOR_NORMAL)) in nl80211_dump_scan()
10653 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_dump_scan()
10655 idx--; in nl80211_dump_scan()
10660 spin_unlock_bh(&rdev->bss_lock); in nl80211_dump_scan()
10662 cb->args[2] = idx; in nl80211_dump_scan()
10663 wiphy_unlock(&rdev->wiphy); in nl80211_dump_scan()
10665 return skb->len; in nl80211_dump_scan()
10677 if (!survey->channel && !allow_radio_stats) in nl80211_send_survey()
10683 return -ENOMEM; in nl80211_send_survey()
10685 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) in nl80211_send_survey()
10692 if (survey->channel && in nl80211_send_survey()
10694 survey->channel->center_freq)) in nl80211_send_survey()
10697 if (survey->channel && survey->channel->freq_offset && in nl80211_send_survey()
10699 survey->channel->freq_offset)) in nl80211_send_survey()
10702 if ((survey->filled & SURVEY_INFO_NOISE_DBM) && in nl80211_send_survey()
10703 nla_put_u8(msg, NL80211_SURVEY_INFO_NOISE, survey->noise)) in nl80211_send_survey()
10705 if ((survey->filled & SURVEY_INFO_IN_USE) && in nl80211_send_survey()
10708 if ((survey->filled & SURVEY_INFO_TIME) && in nl80211_send_survey()
10710 survey->time, NL80211_SURVEY_INFO_PAD)) in nl80211_send_survey()
10712 if ((survey->filled & SURVEY_INFO_TIME_BUSY) && in nl80211_send_survey()
10714 survey->time_busy, NL80211_SURVEY_INFO_PAD)) in nl80211_send_survey()
10716 if ((survey->filled & SURVEY_INFO_TIME_EXT_BUSY) && in nl80211_send_survey()
10718 survey->time_ext_busy, NL80211_SURVEY_INFO_PAD)) in nl80211_send_survey()
10720 if ((survey->filled & SURVEY_INFO_TIME_RX) && in nl80211_send_survey()
10722 survey->time_rx, NL80211_SURVEY_INFO_PAD)) in nl80211_send_survey()
10724 if ((survey->filled & SURVEY_INFO_TIME_TX) && in nl80211_send_survey()
10726 survey->time_tx, NL80211_SURVEY_INFO_PAD)) in nl80211_send_survey()
10728 if ((survey->filled & SURVEY_INFO_TIME_SCAN) && in nl80211_send_survey()
10730 survey->time_scan, NL80211_SURVEY_INFO_PAD)) in nl80211_send_survey()
10732 if ((survey->filled & SURVEY_INFO_TIME_BSS_RX) && in nl80211_send_survey()
10734 survey->time_bss_rx, NL80211_SURVEY_INFO_PAD)) in nl80211_send_survey()
10744 return -EMSGSIZE; in nl80211_send_survey()
10753 int survey_idx = cb->args[2]; in nl80211_dump_survey()
10759 return -ENOMEM; in nl80211_dump_survey()
10767 __acquire(&rdev->wiphy.mtx); in nl80211_dump_survey()
10772 if (!wdev->netdev) { in nl80211_dump_survey()
10773 res = -EINVAL; in nl80211_dump_survey()
10777 if (!rdev->ops->dump_survey) { in nl80211_dump_survey()
10778 res = -EOPNOTSUPP; in nl80211_dump_survey()
10783 res = rdev_dump_survey(rdev, wdev->netdev, survey_idx, &survey); in nl80211_dump_survey()
10784 if (res == -ENOENT) in nl80211_dump_survey()
10789 /* don't send disabled channels, but do send non-channel data */ in nl80211_dump_survey()
10791 survey.channel->flags & IEEE80211_CHAN_DISABLED) { in nl80211_dump_survey()
10797 NETLINK_CB(cb->skb).portid, in nl80211_dump_survey()
10798 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_dump_survey()
10799 wdev->netdev, radio_stats, &survey) < 0) in nl80211_dump_survey()
10805 cb->args[2] = survey_idx; in nl80211_dump_survey()
10806 res = skb->len; in nl80211_dump_survey()
10809 wiphy_unlock(&rdev->wiphy); in nl80211_dump_survey()
10815 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_authenticate()
10816 struct net_device *dev = info->user_ptr[1]; in nl80211_authenticate()
10826 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_authenticate()
10827 return -EINVAL; in nl80211_authenticate()
10829 if (!info->attrs[NL80211_ATTR_AUTH_TYPE]) in nl80211_authenticate()
10830 return -EINVAL; in nl80211_authenticate()
10832 if (!info->attrs[NL80211_ATTR_SSID]) in nl80211_authenticate()
10833 return -EINVAL; in nl80211_authenticate()
10835 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ]) in nl80211_authenticate()
10836 return -EINVAL; in nl80211_authenticate()
10843 if (key.type != -1 && key.type != NL80211_KEYTYPE_GROUP) in nl80211_authenticate()
10844 return -EINVAL; in nl80211_authenticate()
10846 return -EINVAL; in nl80211_authenticate()
10851 return -EINVAL; in nl80211_authenticate()
10853 return -EINVAL; in nl80211_authenticate()
10863 for (i = 0; i < rdev->wiphy.n_cipher_suites; i++) { in nl80211_authenticate()
10864 if (key.p.cipher == rdev->wiphy.cipher_suites[i]) { in nl80211_authenticate()
10870 return -EINVAL; in nl80211_authenticate()
10873 if (!rdev->ops->auth) in nl80211_authenticate()
10874 return -EOPNOTSUPP; in nl80211_authenticate()
10876 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_authenticate()
10877 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_authenticate()
10878 return -EOPNOTSUPP; in nl80211_authenticate()
10880 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_authenticate()
10881 freq = MHZ_TO_KHZ(nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ])); in nl80211_authenticate()
10882 if (info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]) in nl80211_authenticate()
10884 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]); in nl80211_authenticate()
10886 chan = nl80211_get_valid_chan(&rdev->wiphy, freq); in nl80211_authenticate()
10888 return -EINVAL; in nl80211_authenticate()
10890 ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); in nl80211_authenticate()
10891 ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); in nl80211_authenticate()
10893 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_authenticate()
10894 req.ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_authenticate()
10895 req.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_authenticate()
10898 if (info->attrs[NL80211_ATTR_SUPPORTED_SELECTORS]) { in nl80211_authenticate()
10900 nla_data(info->attrs[NL80211_ATTR_SUPPORTED_SELECTORS]); in nl80211_authenticate()
10902 nla_len(info->attrs[NL80211_ATTR_SUPPORTED_SELECTORS]); in nl80211_authenticate()
10905 auth_type = nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]); in nl80211_authenticate()
10907 return -EINVAL; in nl80211_authenticate()
10913 !info->attrs[NL80211_ATTR_AUTH_DATA]) in nl80211_authenticate()
10914 return -EINVAL; in nl80211_authenticate()
10916 if (info->attrs[NL80211_ATTR_AUTH_DATA]) { in nl80211_authenticate()
10921 return -EINVAL; in nl80211_authenticate()
10922 req.auth_data = nla_data(info->attrs[NL80211_ATTR_AUTH_DATA]); in nl80211_authenticate()
10923 req.auth_data_len = nla_len(info->attrs[NL80211_ATTR_AUTH_DATA]); in nl80211_authenticate()
10926 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; in nl80211_authenticate()
10939 req.link_id = nl80211_link_id_or_invalid(info->attrs); in nl80211_authenticate()
10941 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_MLO)) in nl80211_authenticate()
10942 return -EINVAL; in nl80211_authenticate()
10943 if (!info->attrs[NL80211_ATTR_MLD_ADDR]) in nl80211_authenticate()
10944 return -EINVAL; in nl80211_authenticate()
10945 req.ap_mld_addr = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]); in nl80211_authenticate()
10947 return -EINVAL; in nl80211_authenticate()
10950 req.bss = cfg80211_get_bss(&rdev->wiphy, chan, bssid, ssid, ssid_len, in nl80211_authenticate()
10954 return -ENOENT; in nl80211_authenticate()
10958 cfg80211_put_bss(&rdev->wiphy, req.bss); in nl80211_authenticate()
10966 if (!info->attrs[NL80211_ATTR_SOCKET_OWNER]) { in validate_pae_over_nl80211()
10968 return -EINVAL; in validate_pae_over_nl80211()
10971 if (!rdev->ops->tx_control_port || in validate_pae_over_nl80211()
10972 !wiphy_ext_feature_isset(&rdev->wiphy, in validate_pae_over_nl80211()
10974 return -EOPNOTSUPP; in validate_pae_over_nl80211()
10986 settings->control_port = info->attrs[NL80211_ATTR_CONTROL_PORT]; in nl80211_crypto_settings()
10988 if (info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]) { in nl80211_crypto_settings()
10992 info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]); in nl80211_crypto_settings()
10993 settings->control_port_ethertype = cpu_to_be16(proto); in nl80211_crypto_settings()
10994 if (!(rdev->wiphy.flags & WIPHY_FLAG_CONTROL_PORT_PROTOCOL) && in nl80211_crypto_settings()
10996 return -EINVAL; in nl80211_crypto_settings()
10997 if (info->attrs[NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT]) in nl80211_crypto_settings()
10998 settings->control_port_no_encrypt = true; in nl80211_crypto_settings()
11000 settings->control_port_ethertype = cpu_to_be16(ETH_P_PAE); in nl80211_crypto_settings()
11002 if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) { in nl80211_crypto_settings()
11008 settings->control_port_over_nl80211 = true; in nl80211_crypto_settings()
11010 if (info->attrs[NL80211_ATTR_CONTROL_PORT_NO_PREAUTH]) in nl80211_crypto_settings()
11011 settings->control_port_no_preauth = true; in nl80211_crypto_settings()
11014 if (info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]) { in nl80211_crypto_settings()
11018 data = nla_data(info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]); in nl80211_crypto_settings()
11019 len = nla_len(info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]); in nl80211_crypto_settings()
11020 settings->n_ciphers_pairwise = len / sizeof(u32); in nl80211_crypto_settings()
11023 return -EINVAL; in nl80211_crypto_settings()
11025 if (settings->n_ciphers_pairwise > cipher_limit) in nl80211_crypto_settings()
11026 return -EINVAL; in nl80211_crypto_settings()
11028 memcpy(settings->ciphers_pairwise, data, len); in nl80211_crypto_settings()
11030 for (i = 0; i < settings->n_ciphers_pairwise; i++) in nl80211_crypto_settings()
11032 &rdev->wiphy, in nl80211_crypto_settings()
11033 settings->ciphers_pairwise[i])) in nl80211_crypto_settings()
11034 return -EINVAL; in nl80211_crypto_settings()
11037 if (info->attrs[NL80211_ATTR_CIPHER_SUITE_GROUP]) { in nl80211_crypto_settings()
11038 settings->cipher_group = in nl80211_crypto_settings()
11039 nla_get_u32(info->attrs[NL80211_ATTR_CIPHER_SUITE_GROUP]); in nl80211_crypto_settings()
11040 if (!cfg80211_supported_cipher_suite(&rdev->wiphy, in nl80211_crypto_settings()
11041 settings->cipher_group)) in nl80211_crypto_settings()
11042 return -EINVAL; in nl80211_crypto_settings()
11045 if (info->attrs[NL80211_ATTR_WPA_VERSIONS]) in nl80211_crypto_settings()
11046 settings->wpa_versions = in nl80211_crypto_settings()
11047 nla_get_u32(info->attrs[NL80211_ATTR_WPA_VERSIONS]); in nl80211_crypto_settings()
11049 if (info->attrs[NL80211_ATTR_AKM_SUITES]) { in nl80211_crypto_settings()
11053 data = nla_data(info->attrs[NL80211_ATTR_AKM_SUITES]); in nl80211_crypto_settings()
11054 len = nla_len(info->attrs[NL80211_ATTR_AKM_SUITES]); in nl80211_crypto_settings()
11055 settings->n_akm_suites = len / sizeof(u32); in nl80211_crypto_settings()
11058 return -EINVAL; in nl80211_crypto_settings()
11060 if (settings->n_akm_suites > rdev->wiphy.max_num_akm_suites) in nl80211_crypto_settings()
11061 return -EINVAL; in nl80211_crypto_settings()
11063 memcpy(settings->akm_suites, data, len); in nl80211_crypto_settings()
11066 if (info->attrs[NL80211_ATTR_PMK]) { in nl80211_crypto_settings()
11067 if (nla_len(info->attrs[NL80211_ATTR_PMK]) != WLAN_PMK_LEN) in nl80211_crypto_settings()
11068 return -EINVAL; in nl80211_crypto_settings()
11069 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_crypto_settings()
11071 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_crypto_settings()
11073 return -EINVAL; in nl80211_crypto_settings()
11074 settings->psk = nla_data(info->attrs[NL80211_ATTR_PMK]); in nl80211_crypto_settings()
11077 if (info->attrs[NL80211_ATTR_SAE_PASSWORD]) { in nl80211_crypto_settings()
11078 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_crypto_settings()
11080 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_crypto_settings()
11082 return -EINVAL; in nl80211_crypto_settings()
11083 settings->sae_pwd = in nl80211_crypto_settings()
11084 nla_data(info->attrs[NL80211_ATTR_SAE_PASSWORD]); in nl80211_crypto_settings()
11085 settings->sae_pwd_len = in nl80211_crypto_settings()
11086 nla_len(info->attrs[NL80211_ATTR_SAE_PASSWORD]); in nl80211_crypto_settings()
11089 settings->sae_pwe = in nl80211_crypto_settings()
11090 nla_get_u8_default(info->attrs[NL80211_ATTR_SAE_PWE], in nl80211_crypto_settings()
11107 return ERR_PTR(-EINVAL); in nl80211_assoc_bss()
11115 chan = nl80211_get_valid_chan(&rdev->wiphy, freq); in nl80211_assoc_bss()
11117 return ERR_PTR(-EINVAL); in nl80211_assoc_bss()
11124 bss = __cfg80211_get_bss(&rdev->wiphy, chan, bssid, in nl80211_assoc_bss()
11130 return ERR_PTR(-ENOENT); in nl80211_assoc_bss()
11148 return -ENOMEM; in nl80211_process_links()
11150 nla_for_each_nested(link, info->attrs[NL80211_ATTR_MLO_LINKS], rem) { in nl80211_process_links()
11156 NL_SET_BAD_ATTR(info->extack, link); in nl80211_process_links()
11157 return -EINVAL; in nl80211_process_links()
11163 NL_SET_BAD_ATTR(info->extack, link); in nl80211_process_links()
11164 return -EINVAL; in nl80211_process_links()
11172 NL_SET_ERR_MSG_ATTR(info->extack, link, in nl80211_process_links()
11185 NL_SET_ERR_MSG_ATTR(info->extack, in nl80211_process_links()
11188 return -EINVAL; in nl80211_process_links()
11194 NL_SET_ERR_MSG_ATTR(info->extack, in nl80211_process_links()
11196 "cannot deal with non-inheritance"); in nl80211_process_links()
11197 return -EINVAL; in nl80211_process_links()
11210 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_associate()
11211 struct net_device *dev = info->user_ptr[1]; in nl80211_associate()
11217 if (dev->ieee80211_ptr->conn_owner_nlportid && in nl80211_associate()
11218 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) in nl80211_associate()
11219 return -EPERM; in nl80211_associate()
11221 if (!info->attrs[NL80211_ATTR_SSID]) in nl80211_associate()
11222 return -EINVAL; in nl80211_associate()
11224 if (!rdev->ops->assoc) in nl80211_associate()
11225 return -EOPNOTSUPP; in nl80211_associate()
11227 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_associate()
11228 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_associate()
11229 return -EOPNOTSUPP; in nl80211_associate()
11231 ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); in nl80211_associate()
11232 ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); in nl80211_associate()
11234 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_associate()
11235 req.ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_associate()
11236 req.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_associate()
11240 NL_SET_ERR_MSG_ATTR(info->extack, in nl80211_associate()
11241 info->attrs[NL80211_ATTR_IE], in nl80211_associate()
11242 "non-inheritance makes no sense"); in nl80211_associate()
11243 return -EINVAL; in nl80211_associate()
11247 if (info->attrs[NL80211_ATTR_USE_MFP]) { in nl80211_associate()
11249 nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]); in nl80211_associate()
11253 return -EINVAL; in nl80211_associate()
11256 if (info->attrs[NL80211_ATTR_PREV_BSSID]) in nl80211_associate()
11257 req.prev_bssid = nla_data(info->attrs[NL80211_ATTR_PREV_BSSID]); in nl80211_associate()
11259 if (info->attrs[NL80211_ATTR_SUPPORTED_SELECTORS]) { in nl80211_associate()
11261 nla_data(info->attrs[NL80211_ATTR_SUPPORTED_SELECTORS]); in nl80211_associate()
11263 nla_len(info->attrs[NL80211_ATTR_SUPPORTED_SELECTORS]); in nl80211_associate()
11266 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HT])) in nl80211_associate()
11269 if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) in nl80211_associate()
11271 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]), in nl80211_associate()
11274 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) { in nl80211_associate()
11275 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) in nl80211_associate()
11276 return -EINVAL; in nl80211_associate()
11278 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]), in nl80211_associate()
11282 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_VHT])) in nl80211_associate()
11285 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HE])) in nl80211_associate()
11288 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_EHT])) in nl80211_associate()
11291 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) in nl80211_associate()
11293 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]), in nl80211_associate()
11296 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) { in nl80211_associate()
11297 if (!info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) in nl80211_associate()
11298 return -EINVAL; in nl80211_associate()
11300 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]), in nl80211_associate()
11304 if (nla_get_flag(info->attrs[NL80211_ATTR_USE_RRM])) { in nl80211_associate()
11305 if (!((rdev->wiphy.features & in nl80211_associate()
11307 (rdev->wiphy.features & NL80211_FEATURE_QUIET)) && in nl80211_associate()
11308 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_associate()
11310 return -EINVAL; in nl80211_associate()
11314 if (info->attrs[NL80211_ATTR_FILS_KEK]) { in nl80211_associate()
11315 req.fils_kek = nla_data(info->attrs[NL80211_ATTR_FILS_KEK]); in nl80211_associate()
11316 req.fils_kek_len = nla_len(info->attrs[NL80211_ATTR_FILS_KEK]); in nl80211_associate()
11317 if (!info->attrs[NL80211_ATTR_FILS_NONCES]) in nl80211_associate()
11318 return -EINVAL; in nl80211_associate()
11320 nla_data(info->attrs[NL80211_ATTR_FILS_NONCES]); in nl80211_associate()
11323 if (info->attrs[NL80211_ATTR_S1G_CAPABILITY_MASK]) { in nl80211_associate()
11324 if (!info->attrs[NL80211_ATTR_S1G_CAPABILITY]) in nl80211_associate()
11325 return -EINVAL; in nl80211_associate()
11327 nla_data(info->attrs[NL80211_ATTR_S1G_CAPABILITY_MASK]), in nl80211_associate()
11331 if (info->attrs[NL80211_ATTR_S1G_CAPABILITY]) { in nl80211_associate()
11332 if (!info->attrs[NL80211_ATTR_S1G_CAPABILITY_MASK]) in nl80211_associate()
11333 return -EINVAL; in nl80211_associate()
11335 nla_data(info->attrs[NL80211_ATTR_S1G_CAPABILITY]), in nl80211_associate()
11339 if (nla_get_flag(info->attrs[NL80211_ATTR_ASSOC_SPP_AMSDU])) { in nl80211_associate()
11340 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_associate()
11342 GENL_SET_ERR_MSG(info, "SPP A-MSDUs not supported"); in nl80211_associate()
11343 return -EINVAL; in nl80211_associate()
11348 req.link_id = nl80211_link_id_or_invalid(info->attrs); in nl80211_associate()
11350 if (info->attrs[NL80211_ATTR_MLO_LINKS]) { in nl80211_associate()
11352 return -EINVAL; in nl80211_associate()
11354 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_MLO)) in nl80211_associate()
11355 return -EINVAL; in nl80211_associate()
11357 if (info->attrs[NL80211_ATTR_MAC] || in nl80211_associate()
11358 info->attrs[NL80211_ATTR_WIPHY_FREQ] || in nl80211_associate()
11359 !info->attrs[NL80211_ATTR_MLD_ADDR]) in nl80211_associate()
11360 return -EINVAL; in nl80211_associate()
11362 req.ap_mld_addr = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]); in nl80211_associate()
11371 err = -EINVAL; in nl80211_associate()
11377 "cannot have per-link elems on assoc link"); in nl80211_associate()
11378 err = -EINVAL; in nl80211_associate()
11385 err = -EINVAL; in nl80211_associate()
11389 if (info->attrs[NL80211_ATTR_ASSOC_MLD_EXT_CAPA_OPS]) in nl80211_associate()
11391 nla_get_u16(info->attrs[NL80211_ATTR_ASSOC_MLD_EXT_CAPA_OPS]); in nl80211_associate()
11394 return -EINVAL; in nl80211_associate()
11396 req.bss = nl80211_assoc_bss(rdev, ssid, ssid_len, info->attrs, in nl80211_associate()
11397 -1, -1); in nl80211_associate()
11400 ap_addr = req.bss->bssid; in nl80211_associate()
11402 if (info->attrs[NL80211_ATTR_ASSOC_MLD_EXT_CAPA_OPS]) in nl80211_associate()
11403 return -EINVAL; in nl80211_associate()
11412 info->extack); in nl80211_associate()
11414 if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) { in nl80211_associate()
11415 dev->ieee80211_ptr->conn_owner_nlportid = in nl80211_associate()
11416 info->snd_portid; in nl80211_associate()
11417 memcpy(dev->ieee80211_ptr->disconnect_bssid, in nl80211_associate()
11422 if (info->attrs[NL80211_ATTR_MLO_LINKS]) { in nl80211_associate()
11424 info->attrs[NL80211_ATTR_MLO_LINKS], in nl80211_associate()
11443 NL_SET_BAD_ATTR(info->extack, link); in nl80211_associate()
11452 cfg80211_put_bss(&rdev->wiphy, req.links[link_id].bss); in nl80211_associate()
11453 cfg80211_put_bss(&rdev->wiphy, req.bss); in nl80211_associate()
11460 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_deauthenticate()
11461 struct net_device *dev = info->user_ptr[1]; in nl80211_deauthenticate()
11467 if (dev->ieee80211_ptr->conn_owner_nlportid && in nl80211_deauthenticate()
11468 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) in nl80211_deauthenticate()
11469 return -EPERM; in nl80211_deauthenticate()
11471 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_deauthenticate()
11472 return -EINVAL; in nl80211_deauthenticate()
11474 if (!info->attrs[NL80211_ATTR_REASON_CODE]) in nl80211_deauthenticate()
11475 return -EINVAL; in nl80211_deauthenticate()
11477 if (!rdev->ops->deauth) in nl80211_deauthenticate()
11478 return -EOPNOTSUPP; in nl80211_deauthenticate()
11480 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_deauthenticate()
11481 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_deauthenticate()
11482 return -EOPNOTSUPP; in nl80211_deauthenticate()
11484 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_deauthenticate()
11486 reason_code = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); in nl80211_deauthenticate()
11489 return -EINVAL; in nl80211_deauthenticate()
11492 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_deauthenticate()
11493 ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_deauthenticate()
11494 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_deauthenticate()
11497 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; in nl80211_deauthenticate()
11505 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_disassociate()
11506 struct net_device *dev = info->user_ptr[1]; in nl80211_disassociate()
11512 if (dev->ieee80211_ptr->conn_owner_nlportid && in nl80211_disassociate()
11513 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) in nl80211_disassociate()
11514 return -EPERM; in nl80211_disassociate()
11516 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_disassociate()
11517 return -EINVAL; in nl80211_disassociate()
11519 if (!info->attrs[NL80211_ATTR_REASON_CODE]) in nl80211_disassociate()
11520 return -EINVAL; in nl80211_disassociate()
11522 if (!rdev->ops->disassoc) in nl80211_disassociate()
11523 return -EOPNOTSUPP; in nl80211_disassociate()
11525 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_disassociate()
11526 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_disassociate()
11527 return -EOPNOTSUPP; in nl80211_disassociate()
11529 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_disassociate()
11531 reason_code = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); in nl80211_disassociate()
11534 return -EINVAL; in nl80211_disassociate()
11537 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_disassociate()
11538 ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_disassociate()
11539 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_disassociate()
11542 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; in nl80211_disassociate()
11553 struct wiphy *wiphy = &rdev->wiphy; in nl80211_parse_mcast_rate()
11560 sband = wiphy->bands[band]; in nl80211_parse_mcast_rate()
11564 for (i = 0; i < sband->n_bitrates; i++) { in nl80211_parse_mcast_rate()
11565 if (sband->bitrates[i].bitrate == rateval) { in nl80211_parse_mcast_rate()
11578 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_join_ibss()
11579 struct net_device *dev = info->user_ptr[1]; in nl80211_join_ibss()
11587 if (!info->attrs[NL80211_ATTR_SSID] || in nl80211_join_ibss()
11588 !nla_len(info->attrs[NL80211_ATTR_SSID])) in nl80211_join_ibss()
11589 return -EINVAL; in nl80211_join_ibss()
11593 if (info->attrs[NL80211_ATTR_BEACON_INTERVAL]) in nl80211_join_ibss()
11595 nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]); in nl80211_join_ibss()
11602 if (!rdev->ops->join_ibss) in nl80211_join_ibss()
11603 return -EOPNOTSUPP; in nl80211_join_ibss()
11605 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC) in nl80211_join_ibss()
11606 return -EOPNOTSUPP; in nl80211_join_ibss()
11608 wiphy = &rdev->wiphy; in nl80211_join_ibss()
11610 if (info->attrs[NL80211_ATTR_MAC]) { in nl80211_join_ibss()
11611 ibss.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_join_ibss()
11614 return -EINVAL; in nl80211_join_ibss()
11616 ibss.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); in nl80211_join_ibss()
11617 ibss.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); in nl80211_join_ibss()
11619 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_join_ibss()
11620 ibss.ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_join_ibss()
11621 ibss.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_join_ibss()
11628 if (!cfg80211_reg_can_beacon(&rdev->wiphy, &ibss.chandef, in nl80211_join_ibss()
11630 return -EINVAL; in nl80211_join_ibss()
11639 if (!(rdev->wiphy.features & NL80211_FEATURE_HT_IBSS)) in nl80211_join_ibss()
11640 return -EINVAL; in nl80211_join_ibss()
11645 if (!(rdev->wiphy.features & NL80211_FEATURE_HT_IBSS)) in nl80211_join_ibss()
11646 return -EINVAL; in nl80211_join_ibss()
11647 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_join_ibss()
11649 return -EINVAL; in nl80211_join_ibss()
11652 return -EINVAL; in nl80211_join_ibss()
11654 return -EINVAL; in nl80211_join_ibss()
11657 ibss.channel_fixed = !!info->attrs[NL80211_ATTR_FREQ_FIXED]; in nl80211_join_ibss()
11658 ibss.privacy = !!info->attrs[NL80211_ATTR_PRIVACY]; in nl80211_join_ibss()
11660 if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) { in nl80211_join_ibss()
11662 nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); in nl80211_join_ibss()
11664 nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); in nl80211_join_ibss()
11666 wiphy->bands[ibss.chandef.chan->band]; in nl80211_join_ibss()
11674 if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) in nl80211_join_ibss()
11676 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]), in nl80211_join_ibss()
11679 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) { in nl80211_join_ibss()
11680 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) in nl80211_join_ibss()
11681 return -EINVAL; in nl80211_join_ibss()
11683 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]), in nl80211_join_ibss()
11687 if (info->attrs[NL80211_ATTR_MCAST_RATE] && in nl80211_join_ibss()
11689 nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]))) in nl80211_join_ibss()
11690 return -EINVAL; in nl80211_join_ibss()
11692 if (ibss.privacy && info->attrs[NL80211_ATTR_KEYS]) { in nl80211_join_ibss()
11702 return -EINVAL; in nl80211_join_ibss()
11707 nla_get_flag(info->attrs[NL80211_ATTR_CONTROL_PORT]); in nl80211_join_ibss()
11709 if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) { in nl80211_join_ibss()
11721 nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS]); in nl80211_join_ibss()
11726 else if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) in nl80211_join_ibss()
11727 dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid; in nl80211_join_ibss()
11734 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_leave_ibss()
11735 struct net_device *dev = info->user_ptr[1]; in nl80211_leave_ibss()
11737 if (!rdev->ops->leave_ibss) in nl80211_leave_ibss()
11738 return -EOPNOTSUPP; in nl80211_leave_ibss()
11740 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC) in nl80211_leave_ibss()
11741 return -EOPNOTSUPP; in nl80211_leave_ibss()
11748 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_mcast_rate()
11749 struct net_device *dev = info->user_ptr[1]; in nl80211_set_mcast_rate()
11753 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC && in nl80211_set_mcast_rate()
11754 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT && in nl80211_set_mcast_rate()
11755 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_OCB) in nl80211_set_mcast_rate()
11756 return -EOPNOTSUPP; in nl80211_set_mcast_rate()
11758 if (!rdev->ops->set_mcast_rate) in nl80211_set_mcast_rate()
11759 return -EOPNOTSUPP; in nl80211_set_mcast_rate()
11763 if (!info->attrs[NL80211_ATTR_MCAST_RATE]) in nl80211_set_mcast_rate()
11764 return -EINVAL; in nl80211_set_mcast_rate()
11766 nla_rate = nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]); in nl80211_set_mcast_rate()
11768 return -EINVAL; in nl80211_set_mcast_rate()
11795 if (nla_put_u32(skb, NL80211_ATTR_WIPHY, rdev->wiphy_idx)) in __cfg80211_alloc_vendor_skb()
11800 info->vendor_id)) in __cfg80211_alloc_vendor_skb()
11803 info->subcmd)) in __cfg80211_alloc_vendor_skb()
11811 if (wdev->netdev && in __cfg80211_alloc_vendor_skb()
11813 wdev->netdev->ifindex)) in __cfg80211_alloc_vendor_skb()
11821 ((void **)skb->cb)[0] = rdev; in __cfg80211_alloc_vendor_skb()
11822 ((void **)skb->cb)[1] = hdr; in __cfg80211_alloc_vendor_skb()
11823 ((void **)skb->cb)[2] = data; in __cfg80211_alloc_vendor_skb()
11845 if (WARN_ON(vendor_event_idx != -1)) in __cfg80211_alloc_event_skb()
11851 vendor_event_idx >= wiphy->n_vendor_events)) in __cfg80211_alloc_event_skb()
11853 info = &wiphy->vendor_events[vendor_event_idx]; in __cfg80211_alloc_event_skb()
11867 struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0]; in __cfg80211_send_event_skb()
11868 void *hdr = ((void **)skb->cb)[1]; in __cfg80211_send_event_skb()
11870 struct nlattr *data = ((void **)skb->cb)[2]; in __cfg80211_send_event_skb()
11874 memset(skb->cb, 0, sizeof(skb->cb)); in __cfg80211_send_event_skb()
11879 if (nlhdr->nlmsg_pid) { in __cfg80211_send_event_skb()
11880 genlmsg_unicast(wiphy_net(&rdev->wiphy), skb, in __cfg80211_send_event_skb()
11881 nlhdr->nlmsg_pid); in __cfg80211_send_event_skb()
11883 if (data->nla_type == NL80211_ATTR_VENDOR_DATA) in __cfg80211_send_event_skb()
11886 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), in __cfg80211_send_event_skb()
11895 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_testmode_do()
11899 lockdep_assert_held(&rdev->wiphy.mtx); in nl80211_testmode_do()
11902 info->attrs); in nl80211_testmode_do()
11904 if (!rdev->ops->testmode_cmd) in nl80211_testmode_do()
11905 return -EOPNOTSUPP; in nl80211_testmode_do()
11909 if (err != -EINVAL) in nl80211_testmode_do()
11912 } else if (wdev->wiphy != &rdev->wiphy) { in nl80211_testmode_do()
11913 return -EINVAL; in nl80211_testmode_do()
11916 if (!info->attrs[NL80211_ATTR_TESTDATA]) in nl80211_testmode_do()
11917 return -EINVAL; in nl80211_testmode_do()
11919 rdev->cur_cmd_info = info; in nl80211_testmode_do()
11921 nla_data(info->attrs[NL80211_ATTR_TESTDATA]), in nl80211_testmode_do()
11922 nla_len(info->attrs[NL80211_ATTR_TESTDATA])); in nl80211_testmode_do()
11923 rdev->cur_cmd_info = NULL; in nl80211_testmode_do()
11940 if (cb->args[0]) { in nl80211_testmode_dump()
11945 phy_idx = cb->args[0] - 1; in nl80211_testmode_dump()
11949 err = -ENOENT; in nl80211_testmode_dump()
11956 err = -ENOMEM; in nl80211_testmode_dump()
11960 err = nlmsg_parse_deprecated(cb->nlh, in nl80211_testmode_dump()
11967 rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk), attrbuf); in nl80211_testmode_dump()
11972 phy_idx = rdev->wiphy_idx; in nl80211_testmode_dump()
11975 cb->args[1] = (long)attrbuf[NL80211_ATTR_TESTDATA]; in nl80211_testmode_dump()
11978 if (cb->args[1]) { in nl80211_testmode_dump()
11979 data = nla_data((void *)cb->args[1]); in nl80211_testmode_dump()
11980 data_len = nla_len((void *)cb->args[1]); in nl80211_testmode_dump()
11983 if (!rdev->ops->testmode_dump) { in nl80211_testmode_dump()
11984 err = -EOPNOTSUPP; in nl80211_testmode_dump()
11989 void *hdr = nl80211hdr_put(skb, NETLINK_CB(cb->skb).portid, in nl80211_testmode_dump()
11990 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_testmode_dump()
12010 if (err == -ENOBUFS || err == -ENOENT) { in nl80211_testmode_dump()
12021 err = skb->len; in nl80211_testmode_dump()
12023 cb->args[0] = phy_idx + 1; in nl80211_testmode_dump()
12033 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_connect()
12034 struct net_device *dev = info->user_ptr[1]; in nl80211_connect()
12043 if (!info->attrs[NL80211_ATTR_SSID] || in nl80211_connect()
12044 !nla_len(info->attrs[NL80211_ATTR_SSID])) in nl80211_connect()
12045 return -EINVAL; in nl80211_connect()
12047 if (info->attrs[NL80211_ATTR_AUTH_TYPE]) { in nl80211_connect()
12049 nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]); in nl80211_connect()
12052 return -EINVAL; in nl80211_connect()
12056 connect.privacy = info->attrs[NL80211_ATTR_PRIVACY]; in nl80211_connect()
12058 if (info->attrs[NL80211_ATTR_WANT_1X_4WAY_HS] && in nl80211_connect()
12059 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_connect()
12061 return -EINVAL; in nl80211_connect()
12062 connect.want_1x = info->attrs[NL80211_ATTR_WANT_1X_4WAY_HS]; in nl80211_connect()
12069 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_connect()
12070 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_connect()
12071 return -EOPNOTSUPP; in nl80211_connect()
12073 wiphy = &rdev->wiphy; in nl80211_connect()
12075 connect.bg_scan_period = -1; in nl80211_connect()
12076 if (info->attrs[NL80211_ATTR_BG_SCAN_PERIOD] && in nl80211_connect()
12077 (wiphy->flags & WIPHY_FLAG_SUPPORTS_FW_ROAM)) { in nl80211_connect()
12079 nla_get_u16(info->attrs[NL80211_ATTR_BG_SCAN_PERIOD]); in nl80211_connect()
12082 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_connect()
12083 connect.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_connect()
12084 else if (info->attrs[NL80211_ATTR_MAC_HINT]) in nl80211_connect()
12086 nla_data(info->attrs[NL80211_ATTR_MAC_HINT]); in nl80211_connect()
12087 connect.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); in nl80211_connect()
12088 connect.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); in nl80211_connect()
12090 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_connect()
12091 connect.ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_connect()
12092 connect.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_connect()
12095 if (info->attrs[NL80211_ATTR_USE_MFP]) { in nl80211_connect()
12096 connect.mfp = nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]); in nl80211_connect()
12098 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_connect()
12100 return -EOPNOTSUPP; in nl80211_connect()
12105 if (info->attrs[NL80211_ATTR_PREV_BSSID]) in nl80211_connect()
12107 nla_data(info->attrs[NL80211_ATTR_PREV_BSSID]); in nl80211_connect()
12109 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) in nl80211_connect()
12111 info->attrs[NL80211_ATTR_WIPHY_FREQ])); in nl80211_connect()
12112 if (info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]) in nl80211_connect()
12114 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]); in nl80211_connect()
12119 return -EINVAL; in nl80211_connect()
12120 } else if (info->attrs[NL80211_ATTR_WIPHY_FREQ_HINT]) { in nl80211_connect()
12121 freq = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_HINT]); in nl80211_connect()
12125 return -EINVAL; in nl80211_connect()
12128 if (info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]) { in nl80211_connect()
12130 nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]); in nl80211_connect()
12132 if (info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]) in nl80211_connect()
12134 nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]); in nl80211_connect()
12137 if (connect.privacy && info->attrs[NL80211_ATTR_KEYS]) { in nl80211_connect()
12143 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HT])) in nl80211_connect()
12146 if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) in nl80211_connect()
12148 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]), in nl80211_connect()
12151 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) { in nl80211_connect()
12152 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) { in nl80211_connect()
12154 return -EINVAL; in nl80211_connect()
12157 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]), in nl80211_connect()
12161 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_VHT])) in nl80211_connect()
12164 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HE])) in nl80211_connect()
12167 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_EHT])) in nl80211_connect()
12170 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) in nl80211_connect()
12172 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]), in nl80211_connect()
12175 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) { in nl80211_connect()
12176 if (!info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) { in nl80211_connect()
12178 return -EINVAL; in nl80211_connect()
12181 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]), in nl80211_connect()
12185 if (nla_get_flag(info->attrs[NL80211_ATTR_USE_RRM])) { in nl80211_connect()
12186 if (!((rdev->wiphy.features & in nl80211_connect()
12188 (rdev->wiphy.features & NL80211_FEATURE_QUIET)) && in nl80211_connect()
12189 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_connect()
12192 return -EINVAL; in nl80211_connect()
12197 connect.pbss = nla_get_flag(info->attrs[NL80211_ATTR_PBSS]); in nl80211_connect()
12198 if (connect.pbss && !rdev->wiphy.bands[NL80211_BAND_60GHZ]) { in nl80211_connect()
12200 return -EOPNOTSUPP; in nl80211_connect()
12203 if (info->attrs[NL80211_ATTR_BSS_SELECT]) { in nl80211_connect()
12207 return -EINVAL; in nl80211_connect()
12210 err = parse_bss_select(info->attrs[NL80211_ATTR_BSS_SELECT], in nl80211_connect()
12218 if (wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_connect()
12220 info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] && in nl80211_connect()
12221 info->attrs[NL80211_ATTR_FILS_ERP_REALM] && in nl80211_connect()
12222 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] && in nl80211_connect()
12223 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { in nl80211_connect()
12225 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); in nl80211_connect()
12227 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); in nl80211_connect()
12229 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); in nl80211_connect()
12231 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); in nl80211_connect()
12234 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM]); in nl80211_connect()
12236 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); in nl80211_connect()
12238 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); in nl80211_connect()
12239 } else if (info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] || in nl80211_connect()
12240 info->attrs[NL80211_ATTR_FILS_ERP_REALM] || in nl80211_connect()
12241 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] || in nl80211_connect()
12242 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { in nl80211_connect()
12244 return -EINVAL; in nl80211_connect()
12247 if (nla_get_flag(info->attrs[NL80211_ATTR_EXTERNAL_AUTH_SUPPORT])) { in nl80211_connect()
12248 if (!info->attrs[NL80211_ATTR_SOCKET_OWNER]) { in nl80211_connect()
12252 return -EINVAL; in nl80211_connect()
12257 if (nla_get_flag(info->attrs[NL80211_ATTR_MLO_SUPPORT])) in nl80211_connect()
12265 if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) { in nl80211_connect()
12266 dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid; in nl80211_connect()
12268 memcpy(dev->ieee80211_ptr->disconnect_bssid, in nl80211_connect()
12271 eth_zero_addr(dev->ieee80211_ptr->disconnect_bssid); in nl80211_connect()
12281 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_update_connect_params()
12282 struct net_device *dev = info->user_ptr[1]; in nl80211_update_connect_params()
12283 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_update_connect_params()
12288 if (!rdev->ops->update_connect_params) in nl80211_update_connect_params()
12289 return -EOPNOTSUPP; in nl80211_update_connect_params()
12291 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_update_connect_params()
12292 connect.ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_update_connect_params()
12293 connect.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_update_connect_params()
12297 fils_sk_offload = wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_update_connect_params()
12301 * when driver supports fils-sk offload all attributes must be in nl80211_update_connect_params()
12302 * provided. So the else covers "fils-sk-not-all" and in nl80211_update_connect_params()
12303 * "no-fils-sk-any". in nl80211_update_connect_params()
12306 info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] && in nl80211_update_connect_params()
12307 info->attrs[NL80211_ATTR_FILS_ERP_REALM] && in nl80211_update_connect_params()
12308 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] && in nl80211_update_connect_params()
12309 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { in nl80211_update_connect_params()
12311 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); in nl80211_update_connect_params()
12313 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); in nl80211_update_connect_params()
12315 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); in nl80211_update_connect_params()
12317 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); in nl80211_update_connect_params()
12320 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM]); in nl80211_update_connect_params()
12322 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); in nl80211_update_connect_params()
12324 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); in nl80211_update_connect_params()
12326 } else if (info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] || in nl80211_update_connect_params()
12327 info->attrs[NL80211_ATTR_FILS_ERP_REALM] || in nl80211_update_connect_params()
12328 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] || in nl80211_update_connect_params()
12329 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { in nl80211_update_connect_params()
12330 return -EINVAL; in nl80211_update_connect_params()
12333 if (info->attrs[NL80211_ATTR_AUTH_TYPE]) { in nl80211_update_connect_params()
12334 auth_type = nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]); in nl80211_update_connect_params()
12337 return -EINVAL; in nl80211_update_connect_params()
12341 return -EINVAL; in nl80211_update_connect_params()
12347 if (!wdev->connected) in nl80211_update_connect_params()
12348 return -ENOLINK; in nl80211_update_connect_params()
12355 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_disconnect()
12356 struct net_device *dev = info->user_ptr[1]; in nl80211_disconnect()
12359 if (dev->ieee80211_ptr->conn_owner_nlportid && in nl80211_disconnect()
12360 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) in nl80211_disconnect()
12361 return -EPERM; in nl80211_disconnect()
12363 reason = nla_get_u16_default(info->attrs[NL80211_ATTR_REASON_CODE], in nl80211_disconnect()
12367 return -EINVAL; in nl80211_disconnect()
12369 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_disconnect()
12370 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_disconnect()
12371 return -EOPNOTSUPP; in nl80211_disconnect()
12378 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_wiphy_netns()
12382 if (info->attrs[NL80211_ATTR_PID]) { in nl80211_wiphy_netns()
12383 u32 pid = nla_get_u32(info->attrs[NL80211_ATTR_PID]); in nl80211_wiphy_netns()
12386 } else if (info->attrs[NL80211_ATTR_NETNS_FD]) { in nl80211_wiphy_netns()
12387 u32 fd = nla_get_u32(info->attrs[NL80211_ATTR_NETNS_FD]); in nl80211_wiphy_netns()
12391 return -EINVAL; in nl80211_wiphy_netns()
12400 if (!net_eq(wiphy_net(&rdev->wiphy), net)) in nl80211_wiphy_netns()
12409 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_pmksa()
12410 struct net_device *dev = info->user_ptr[1]; in nl80211_set_pmksa()
12416 ap_pmksa_caching_support = wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_set_pmksa()
12419 if (!info->attrs[NL80211_ATTR_PMKID]) in nl80211_set_pmksa()
12420 return -EINVAL; in nl80211_set_pmksa()
12422 pmksa.pmkid = nla_data(info->attrs[NL80211_ATTR_PMKID]); in nl80211_set_pmksa()
12424 if (info->attrs[NL80211_ATTR_MAC]) { in nl80211_set_pmksa()
12425 pmksa.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_set_pmksa()
12426 } else if (info->attrs[NL80211_ATTR_SSID] && in nl80211_set_pmksa()
12427 info->attrs[NL80211_ATTR_FILS_CACHE_ID] && in nl80211_set_pmksa()
12428 info->attrs[NL80211_ATTR_PMK]) { in nl80211_set_pmksa()
12429 pmksa.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); in nl80211_set_pmksa()
12430 pmksa.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); in nl80211_set_pmksa()
12431 pmksa.cache_id = nla_data(info->attrs[NL80211_ATTR_FILS_CACHE_ID]); in nl80211_set_pmksa()
12433 return -EINVAL; in nl80211_set_pmksa()
12436 if (info->attrs[NL80211_ATTR_PMK]) { in nl80211_set_pmksa()
12437 pmksa.pmk = nla_data(info->attrs[NL80211_ATTR_PMK]); in nl80211_set_pmksa()
12438 pmksa.pmk_len = nla_len(info->attrs[NL80211_ATTR_PMK]); in nl80211_set_pmksa()
12441 if (info->attrs[NL80211_ATTR_PMK_LIFETIME]) in nl80211_set_pmksa()
12443 nla_get_u32(info->attrs[NL80211_ATTR_PMK_LIFETIME]); in nl80211_set_pmksa()
12445 if (info->attrs[NL80211_ATTR_PMK_REAUTH_THRESHOLD]) in nl80211_set_pmksa()
12447 nla_get_u8(info->attrs[NL80211_ATTR_PMK_REAUTH_THRESHOLD]); in nl80211_set_pmksa()
12449 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_set_pmksa()
12450 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT && in nl80211_set_pmksa()
12451 !((dev->ieee80211_ptr->iftype == NL80211_IFTYPE_AP || in nl80211_set_pmksa()
12452 dev->ieee80211_ptr->iftype == NL80211_IFTYPE_P2P_GO) && in nl80211_set_pmksa()
12454 return -EOPNOTSUPP; in nl80211_set_pmksa()
12456 if (!rdev->ops->set_pmksa) in nl80211_set_pmksa()
12457 return -EOPNOTSUPP; in nl80211_set_pmksa()
12464 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_del_pmksa()
12465 struct net_device *dev = info->user_ptr[1]; in nl80211_del_pmksa()
12473 sae_offload_support = wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_del_pmksa()
12475 owe_offload_support = wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_del_pmksa()
12477 ap_pmksa_caching_support = wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_del_pmksa()
12480 if (info->attrs[NL80211_ATTR_PMKID]) in nl80211_del_pmksa()
12481 pmksa.pmkid = nla_data(info->attrs[NL80211_ATTR_PMKID]); in nl80211_del_pmksa()
12483 if (info->attrs[NL80211_ATTR_MAC]) { in nl80211_del_pmksa()
12484 pmksa.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_del_pmksa()
12485 } else if (info->attrs[NL80211_ATTR_SSID]) { in nl80211_del_pmksa()
12489 if (info->attrs[NL80211_ATTR_FILS_CACHE_ID] && in nl80211_del_pmksa()
12490 info->attrs[NL80211_ATTR_PMK]) { in nl80211_del_pmksa()
12491 pmksa.cache_id = nla_data(info->attrs[NL80211_ATTR_FILS_CACHE_ID]); in nl80211_del_pmksa()
12493 return -EINVAL; in nl80211_del_pmksa()
12495 pmksa.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); in nl80211_del_pmksa()
12496 pmksa.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); in nl80211_del_pmksa()
12498 return -EINVAL; in nl80211_del_pmksa()
12501 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_del_pmksa()
12502 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT && in nl80211_del_pmksa()
12503 !((dev->ieee80211_ptr->iftype == NL80211_IFTYPE_AP || in nl80211_del_pmksa()
12504 dev->ieee80211_ptr->iftype == NL80211_IFTYPE_P2P_GO) && in nl80211_del_pmksa()
12506 return -EOPNOTSUPP; in nl80211_del_pmksa()
12508 if (!rdev->ops->del_pmksa) in nl80211_del_pmksa()
12509 return -EOPNOTSUPP; in nl80211_del_pmksa()
12516 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_flush_pmksa()
12517 struct net_device *dev = info->user_ptr[1]; in nl80211_flush_pmksa()
12519 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_flush_pmksa()
12520 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_flush_pmksa()
12521 return -EOPNOTSUPP; in nl80211_flush_pmksa()
12523 if (!rdev->ops->flush_pmksa) in nl80211_flush_pmksa()
12524 return -EOPNOTSUPP; in nl80211_flush_pmksa()
12531 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_tdls_mgmt()
12532 struct net_device *dev = info->user_ptr[1]; in nl80211_tdls_mgmt()
12540 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) || in nl80211_tdls_mgmt()
12541 !rdev->ops->tdls_mgmt) in nl80211_tdls_mgmt()
12542 return -EOPNOTSUPP; in nl80211_tdls_mgmt()
12544 if (!info->attrs[NL80211_ATTR_TDLS_ACTION] || in nl80211_tdls_mgmt()
12545 !info->attrs[NL80211_ATTR_STATUS_CODE] || in nl80211_tdls_mgmt()
12546 !info->attrs[NL80211_ATTR_TDLS_DIALOG_TOKEN] || in nl80211_tdls_mgmt()
12547 !info->attrs[NL80211_ATTR_IE] || in nl80211_tdls_mgmt()
12548 !info->attrs[NL80211_ATTR_MAC]) in nl80211_tdls_mgmt()
12549 return -EINVAL; in nl80211_tdls_mgmt()
12551 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_tdls_mgmt()
12552 action_code = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_ACTION]); in nl80211_tdls_mgmt()
12553 status_code = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]); in nl80211_tdls_mgmt()
12554 dialog_token = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_DIALOG_TOKEN]); in nl80211_tdls_mgmt()
12555 initiator = nla_get_flag(info->attrs[NL80211_ATTR_TDLS_INITIATOR]); in nl80211_tdls_mgmt()
12556 if (info->attrs[NL80211_ATTR_TDLS_PEER_CAPABILITY]) in nl80211_tdls_mgmt()
12558 nla_get_u32(info->attrs[NL80211_ATTR_TDLS_PEER_CAPABILITY]); in nl80211_tdls_mgmt()
12559 link_id = nl80211_link_id_or_invalid(info->attrs); in nl80211_tdls_mgmt()
12564 nla_data(info->attrs[NL80211_ATTR_IE]), in nl80211_tdls_mgmt()
12565 nla_len(info->attrs[NL80211_ATTR_IE])); in nl80211_tdls_mgmt()
12570 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_tdls_oper()
12571 struct net_device *dev = info->user_ptr[1]; in nl80211_tdls_oper()
12575 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) || in nl80211_tdls_oper()
12576 !rdev->ops->tdls_oper) in nl80211_tdls_oper()
12577 return -EOPNOTSUPP; in nl80211_tdls_oper()
12579 if (!info->attrs[NL80211_ATTR_TDLS_OPERATION] || in nl80211_tdls_oper()
12580 !info->attrs[NL80211_ATTR_MAC]) in nl80211_tdls_oper()
12581 return -EINVAL; in nl80211_tdls_oper()
12583 operation = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_OPERATION]); in nl80211_tdls_oper()
12584 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_tdls_oper()
12592 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_remain_on_channel()
12593 unsigned int link_id = nl80211_link_id(info->attrs); in nl80211_remain_on_channel()
12594 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_remain_on_channel()
12602 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ] || in nl80211_remain_on_channel()
12603 !info->attrs[NL80211_ATTR_DURATION]) in nl80211_remain_on_channel()
12604 return -EINVAL; in nl80211_remain_on_channel()
12606 duration = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]); in nl80211_remain_on_channel()
12608 if (!rdev->ops->remain_on_channel || in nl80211_remain_on_channel()
12609 !(rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL)) in nl80211_remain_on_channel()
12610 return -EOPNOTSUPP; in nl80211_remain_on_channel()
12617 duration > rdev->wiphy.max_remain_on_channel_duration) in nl80211_remain_on_channel()
12618 return -EINVAL; in nl80211_remain_on_channel()
12632 return -EBUSY; in nl80211_remain_on_channel()
12640 return -EBUSY; in nl80211_remain_on_channel()
12645 return -ENOMEM; in nl80211_remain_on_channel()
12647 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_remain_on_channel()
12650 err = -ENOBUFS; in nl80211_remain_on_channel()
12669 err = -ENOBUFS; in nl80211_remain_on_channel()
12678 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_cancel_remain_on_channel()
12679 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_cancel_remain_on_channel()
12682 if (!info->attrs[NL80211_ATTR_COOKIE]) in nl80211_cancel_remain_on_channel()
12683 return -EINVAL; in nl80211_cancel_remain_on_channel()
12685 if (!rdev->ops->cancel_remain_on_channel) in nl80211_cancel_remain_on_channel()
12686 return -EOPNOTSUPP; in nl80211_cancel_remain_on_channel()
12688 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); in nl80211_cancel_remain_on_channel()
12697 unsigned int link_id = nl80211_link_id(info->attrs); in nl80211_set_tx_bitrate_mask()
12698 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_tx_bitrate_mask()
12699 struct net_device *dev = info->user_ptr[1]; in nl80211_set_tx_bitrate_mask()
12702 if (!rdev->ops->set_bitrate_mask) in nl80211_set_tx_bitrate_mask()
12703 return -EOPNOTSUPP; in nl80211_set_tx_bitrate_mask()
12705 err = nl80211_parse_tx_bitrate_mask(info, info->attrs, in nl80211_set_tx_bitrate_mask()
12716 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_register_mgmt()
12717 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_register_mgmt()
12720 if (!info->attrs[NL80211_ATTR_FRAME_MATCH]) in nl80211_register_mgmt()
12721 return -EINVAL; in nl80211_register_mgmt()
12723 if (info->attrs[NL80211_ATTR_FRAME_TYPE]) in nl80211_register_mgmt()
12724 frame_type = nla_get_u16(info->attrs[NL80211_ATTR_FRAME_TYPE]); in nl80211_register_mgmt()
12726 switch (wdev->iftype) { in nl80211_register_mgmt()
12737 if (!wiphy_ext_feature_isset(wdev->wiphy, in nl80211_register_mgmt()
12739 return -EOPNOTSUPP; in nl80211_register_mgmt()
12742 return -EOPNOTSUPP; in nl80211_register_mgmt()
12746 if (!rdev->ops->mgmt_tx) in nl80211_register_mgmt()
12747 return -EOPNOTSUPP; in nl80211_register_mgmt()
12749 if (info->attrs[NL80211_ATTR_RECEIVE_MULTICAST] && in nl80211_register_mgmt()
12750 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_register_mgmt()
12754 return -EOPNOTSUPP; in nl80211_register_mgmt()
12757 return cfg80211_mlme_register_mgmt(wdev, info->snd_portid, frame_type, in nl80211_register_mgmt()
12758 nla_data(info->attrs[NL80211_ATTR_FRAME_MATCH]), in nl80211_register_mgmt()
12759 nla_len(info->attrs[NL80211_ATTR_FRAME_MATCH]), in nl80211_register_mgmt()
12760 info->attrs[NL80211_ATTR_RECEIVE_MULTICAST], in nl80211_register_mgmt()
12761 info->extack); in nl80211_register_mgmt()
12766 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_tx_mgmt()
12767 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_tx_mgmt()
12775 info->attrs[NL80211_ATTR_DONT_WAIT_FOR_ACK], in nl80211_tx_mgmt()
12778 if (!info->attrs[NL80211_ATTR_FRAME]) in nl80211_tx_mgmt()
12779 return -EINVAL; in nl80211_tx_mgmt()
12781 if (!rdev->ops->mgmt_tx) in nl80211_tx_mgmt()
12782 return -EOPNOTSUPP; in nl80211_tx_mgmt()
12784 switch (wdev->iftype) { in nl80211_tx_mgmt()
12786 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ]) in nl80211_tx_mgmt()
12787 return -EINVAL; in nl80211_tx_mgmt()
12798 if (!wiphy_ext_feature_isset(wdev->wiphy, in nl80211_tx_mgmt()
12800 return -EOPNOTSUPP; in nl80211_tx_mgmt()
12803 return -EOPNOTSUPP; in nl80211_tx_mgmt()
12806 if (info->attrs[NL80211_ATTR_DURATION]) { in nl80211_tx_mgmt()
12807 if (!(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX)) in nl80211_tx_mgmt()
12808 return -EINVAL; in nl80211_tx_mgmt()
12809 params.wait = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]); in nl80211_tx_mgmt()
12816 params.wait > rdev->wiphy.max_remain_on_channel_duration) in nl80211_tx_mgmt()
12817 return -EINVAL; in nl80211_tx_mgmt()
12820 params.offchan = info->attrs[NL80211_ATTR_OFFCHANNEL_TX_OK]; in nl80211_tx_mgmt()
12822 if (params.offchan && !(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX)) in nl80211_tx_mgmt()
12823 return -EINVAL; in nl80211_tx_mgmt()
12825 params.no_cck = nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]); in nl80211_tx_mgmt()
12831 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { in nl80211_tx_mgmt()
12838 return -EINVAL; in nl80211_tx_mgmt()
12842 return -EBUSY; in nl80211_tx_mgmt()
12844 params.link_id = nl80211_link_id_or_invalid(info->attrs); in nl80211_tx_mgmt()
12851 !(wdev->valid_links & BIT(params.link_id))) in nl80211_tx_mgmt()
12852 return -EINVAL; in nl80211_tx_mgmt()
12854 params.buf = nla_data(info->attrs[NL80211_ATTR_FRAME]); in nl80211_tx_mgmt()
12855 params.len = nla_len(info->attrs[NL80211_ATTR_FRAME]); in nl80211_tx_mgmt()
12857 err = nl80211_parse_counter_offsets(rdev, NULL, params.len, -1, in nl80211_tx_mgmt()
12858 info->attrs[NL80211_ATTR_CSA_C_OFFSETS_TX], in nl80211_tx_mgmt()
12867 return -ENOMEM; in nl80211_tx_mgmt()
12869 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_tx_mgmt()
12872 err = -ENOBUFS; in nl80211_tx_mgmt()
12894 err = -ENOBUFS; in nl80211_tx_mgmt()
12902 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_tx_mgmt_cancel_wait()
12903 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_tx_mgmt_cancel_wait()
12906 if (!info->attrs[NL80211_ATTR_COOKIE]) in nl80211_tx_mgmt_cancel_wait()
12907 return -EINVAL; in nl80211_tx_mgmt_cancel_wait()
12909 if (!rdev->ops->mgmt_tx_cancel_wait) in nl80211_tx_mgmt_cancel_wait()
12910 return -EOPNOTSUPP; in nl80211_tx_mgmt_cancel_wait()
12912 switch (wdev->iftype) { in nl80211_tx_mgmt_cancel_wait()
12922 if (!wiphy_ext_feature_isset(wdev->wiphy, in nl80211_tx_mgmt_cancel_wait()
12924 return -EOPNOTSUPP; in nl80211_tx_mgmt_cancel_wait()
12927 return -EOPNOTSUPP; in nl80211_tx_mgmt_cancel_wait()
12930 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); in nl80211_tx_mgmt_cancel_wait()
12937 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_power_save()
12939 struct net_device *dev = info->user_ptr[1]; in nl80211_set_power_save()
12944 if (!info->attrs[NL80211_ATTR_PS_STATE]) in nl80211_set_power_save()
12945 return -EINVAL; in nl80211_set_power_save()
12947 ps_state = nla_get_u32(info->attrs[NL80211_ATTR_PS_STATE]); in nl80211_set_power_save()
12949 wdev = dev->ieee80211_ptr; in nl80211_set_power_save()
12951 if (!rdev->ops->set_power_mgmt) in nl80211_set_power_save()
12952 return -EOPNOTSUPP; in nl80211_set_power_save()
12956 if (state == wdev->ps) in nl80211_set_power_save()
12959 err = rdev_set_power_mgmt(rdev, dev, state, wdev->ps_timeout); in nl80211_set_power_save()
12961 wdev->ps = state; in nl80211_set_power_save()
12967 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_power_save()
12970 struct net_device *dev = info->user_ptr[1]; in nl80211_get_power_save()
12975 wdev = dev->ieee80211_ptr; in nl80211_get_power_save()
12977 if (!rdev->ops->set_power_mgmt) in nl80211_get_power_save()
12978 return -EOPNOTSUPP; in nl80211_get_power_save()
12982 return -ENOMEM; in nl80211_get_power_save()
12984 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_power_save()
12987 err = -ENOBUFS; in nl80211_get_power_save()
12991 if (wdev->ps) in nl80211_get_power_save()
13003 err = -ENOBUFS; in nl80211_get_power_save()
13023 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_cqm_txe()
13024 struct net_device *dev = info->user_ptr[1]; in nl80211_set_cqm_txe()
13025 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_cqm_txe()
13028 return -EINVAL; in nl80211_set_cqm_txe()
13030 if (!rdev->ops->set_cqm_txe_config) in nl80211_set_cqm_txe()
13031 return -EOPNOTSUPP; in nl80211_set_cqm_txe()
13033 if (wdev->iftype != NL80211_IFTYPE_STATION && in nl80211_set_cqm_txe()
13034 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_set_cqm_txe()
13035 return -EOPNOTSUPP; in nl80211_set_cqm_txe()
13044 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_cqm_rssi_update()
13056 if (!cqm_config->last_rssi_event_value && in cfg80211_cqm_rssi_update()
13057 wdev->links[0].client.current_bss && in cfg80211_cqm_rssi_update()
13058 rdev->ops->get_station) { in cfg80211_cqm_rssi_update()
13062 mac_addr = wdev->links[0].client.current_bss->pub.bssid; in cfg80211_cqm_rssi_update()
13070 cqm_config->last_rssi_event_value = in cfg80211_cqm_rssi_update()
13074 last = cqm_config->last_rssi_event_value; in cfg80211_cqm_rssi_update()
13075 hyst = cqm_config->rssi_hyst; in cfg80211_cqm_rssi_update()
13076 n = cqm_config->n_rssi_thresholds; in cfg80211_cqm_rssi_update()
13080 if (last < cqm_config->rssi_thresholds[i]) in cfg80211_cqm_rssi_update()
13084 low_index = i - 1; in cfg80211_cqm_rssi_update()
13087 low = cqm_config->rssi_thresholds[low_index] - hyst; in cfg80211_cqm_rssi_update()
13093 high = cqm_config->rssi_thresholds[i] + hyst - 1; in cfg80211_cqm_rssi_update()
13105 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_cqm_rssi()
13107 struct net_device *dev = info->user_ptr[1]; in nl80211_set_cqm_rssi()
13108 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_cqm_rssi()
13115 return -EINVAL; in nl80211_set_cqm_rssi()
13120 if (wdev->iftype != NL80211_IFTYPE_STATION && in nl80211_set_cqm_rssi()
13121 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_set_cqm_rssi()
13122 return -EOPNOTSUPP; in nl80211_set_cqm_rssi()
13127 old = wiphy_dereference(wdev->wiphy, wdev->cqm_config); in nl80211_set_cqm_rssi()
13134 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_set_cqm_rssi()
13136 !rdev->ops->set_cqm_rssi_range_config) in nl80211_set_cqm_rssi()
13137 return -EOPNOTSUPP; in nl80211_set_cqm_rssi()
13139 if (!rdev->ops->set_cqm_rssi_config) in nl80211_set_cqm_rssi()
13140 return -EOPNOTSUPP; in nl80211_set_cqm_rssi()
13148 return -ENOMEM; in nl80211_set_cqm_rssi()
13150 cqm_config->rssi_hyst = hysteresis; in nl80211_set_cqm_rssi()
13151 cqm_config->n_rssi_thresholds = n_thresholds; in nl80211_set_cqm_rssi()
13152 memcpy(cqm_config->rssi_thresholds, thresholds, in nl80211_set_cqm_rssi()
13155 cqm_config->use_range_api = n_thresholds > 1 || in nl80211_set_cqm_rssi()
13156 !rdev->ops->set_cqm_rssi_config; in nl80211_set_cqm_rssi()
13158 rcu_assign_pointer(wdev->cqm_config, cqm_config); in nl80211_set_cqm_rssi()
13160 if (cqm_config->use_range_api) in nl80211_set_cqm_rssi()
13167 RCU_INIT_POINTER(wdev->cqm_config, NULL); in nl80211_set_cqm_rssi()
13169 if (old->use_range_api) in nl80211_set_cqm_rssi()
13176 rcu_assign_pointer(wdev->cqm_config, old); in nl80211_set_cqm_rssi()
13191 cqm = info->attrs[NL80211_ATTR_CQM]; in nl80211_set_cqm()
13193 return -EINVAL; in nl80211_set_cqm()
13197 info->extack); in nl80211_set_cqm()
13209 return -EINVAL; in nl80211_set_cqm()
13225 return -EINVAL; in nl80211_set_cqm()
13230 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_join_ocb()
13231 struct net_device *dev = info->user_ptr[1]; in nl80211_join_ocb()
13244 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_leave_ocb()
13245 struct net_device *dev = info->user_ptr[1]; in nl80211_leave_ocb()
13252 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_join_mesh()
13253 struct net_device *dev = info->user_ptr[1]; in nl80211_join_mesh()
13262 if (info->attrs[NL80211_ATTR_MESH_CONFIG]) { in nl80211_join_mesh()
13269 if (!info->attrs[NL80211_ATTR_MESH_ID] || in nl80211_join_mesh()
13270 !nla_len(info->attrs[NL80211_ATTR_MESH_ID])) in nl80211_join_mesh()
13271 return -EINVAL; in nl80211_join_mesh()
13273 setup.mesh_id = nla_data(info->attrs[NL80211_ATTR_MESH_ID]); in nl80211_join_mesh()
13274 setup.mesh_id_len = nla_len(info->attrs[NL80211_ATTR_MESH_ID]); in nl80211_join_mesh()
13276 if (info->attrs[NL80211_ATTR_MCAST_RATE] && in nl80211_join_mesh()
13278 nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]))) in nl80211_join_mesh()
13279 return -EINVAL; in nl80211_join_mesh()
13281 if (info->attrs[NL80211_ATTR_BEACON_INTERVAL]) { in nl80211_join_mesh()
13283 nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]); in nl80211_join_mesh()
13292 if (info->attrs[NL80211_ATTR_DTIM_PERIOD]) { in nl80211_join_mesh()
13294 nla_get_u32(info->attrs[NL80211_ATTR_DTIM_PERIOD]); in nl80211_join_mesh()
13296 return -EINVAL; in nl80211_join_mesh()
13299 if (info->attrs[NL80211_ATTR_MESH_SETUP]) { in nl80211_join_mesh()
13309 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { in nl80211_join_mesh()
13318 if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) { in nl80211_join_mesh()
13319 u8 *rates = nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); in nl80211_join_mesh()
13321 nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); in nl80211_join_mesh()
13325 return -EINVAL; in nl80211_join_mesh()
13327 sband = rdev->wiphy.bands[setup.chandef.chan->band]; in nl80211_join_mesh()
13335 if (info->attrs[NL80211_ATTR_TX_RATES]) { in nl80211_join_mesh()
13336 err = nl80211_parse_tx_bitrate_mask(info, info->attrs, in nl80211_join_mesh()
13344 return -EINVAL; in nl80211_join_mesh()
13346 err = validate_beacon_tx_rate(rdev, setup.chandef.chan->band, in nl80211_join_mesh()
13353 nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS]); in nl80211_join_mesh()
13355 if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) { in nl80211_join_mesh()
13365 if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) in nl80211_join_mesh()
13366 dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid; in nl80211_join_mesh()
13373 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_leave_mesh()
13374 struct net_device *dev = info->user_ptr[1]; in nl80211_leave_mesh()
13383 struct cfg80211_wowlan *wowlan = rdev->wiphy.wowlan_config; in nl80211_send_wowlan_patterns()
13387 if (!wowlan->n_patterns) in nl80211_send_wowlan_patterns()
13392 return -ENOBUFS; in nl80211_send_wowlan_patterns()
13394 for (i = 0; i < wowlan->n_patterns; i++) { in nl80211_send_wowlan_patterns()
13397 return -ENOBUFS; in nl80211_send_wowlan_patterns()
13398 pat_len = wowlan->patterns[i].pattern_len; in nl80211_send_wowlan_patterns()
13400 wowlan->patterns[i].mask) || in nl80211_send_wowlan_patterns()
13402 wowlan->patterns[i].pattern) || in nl80211_send_wowlan_patterns()
13404 wowlan->patterns[i].pkt_offset)) in nl80211_send_wowlan_patterns()
13405 return -ENOBUFS; in nl80211_send_wowlan_patterns()
13424 return -ENOBUFS; in nl80211_send_wowlan_tcp()
13426 if (nla_put_in_addr(msg, NL80211_WOWLAN_TCP_SRC_IPV4, tcp->src) || in nl80211_send_wowlan_tcp()
13427 nla_put_in_addr(msg, NL80211_WOWLAN_TCP_DST_IPV4, tcp->dst) || in nl80211_send_wowlan_tcp()
13428 nla_put(msg, NL80211_WOWLAN_TCP_DST_MAC, ETH_ALEN, tcp->dst_mac) || in nl80211_send_wowlan_tcp()
13429 nla_put_u16(msg, NL80211_WOWLAN_TCP_SRC_PORT, tcp->src_port) || in nl80211_send_wowlan_tcp()
13430 nla_put_u16(msg, NL80211_WOWLAN_TCP_DST_PORT, tcp->dst_port) || in nl80211_send_wowlan_tcp()
13432 tcp->payload_len, tcp->payload) || in nl80211_send_wowlan_tcp()
13434 tcp->data_interval) || in nl80211_send_wowlan_tcp()
13436 tcp->wake_len, tcp->wake_data) || in nl80211_send_wowlan_tcp()
13438 DIV_ROUND_UP(tcp->wake_len, 8), tcp->wake_mask)) in nl80211_send_wowlan_tcp()
13439 return -ENOBUFS; in nl80211_send_wowlan_tcp()
13441 if (tcp->payload_seq.len && in nl80211_send_wowlan_tcp()
13443 sizeof(tcp->payload_seq), &tcp->payload_seq)) in nl80211_send_wowlan_tcp()
13444 return -ENOBUFS; in nl80211_send_wowlan_tcp()
13446 if (tcp->payload_tok.len && in nl80211_send_wowlan_tcp()
13448 sizeof(tcp->payload_tok) + tcp->tokens_size, in nl80211_send_wowlan_tcp()
13449 &tcp->payload_tok)) in nl80211_send_wowlan_tcp()
13450 return -ENOBUFS; in nl80211_send_wowlan_tcp()
13468 return -ENOBUFS; in nl80211_send_wowlan_nd()
13470 if (req->n_scan_plans == 1 && in nl80211_send_wowlan_nd()
13472 req->scan_plans[0].interval * 1000)) in nl80211_send_wowlan_nd()
13473 return -ENOBUFS; in nl80211_send_wowlan_nd()
13475 if (nla_put_u32(msg, NL80211_ATTR_SCHED_SCAN_DELAY, req->delay)) in nl80211_send_wowlan_nd()
13476 return -ENOBUFS; in nl80211_send_wowlan_nd()
13478 if (req->relative_rssi_set) { in nl80211_send_wowlan_nd()
13482 req->relative_rssi)) in nl80211_send_wowlan_nd()
13483 return -ENOBUFS; in nl80211_send_wowlan_nd()
13485 rssi_adjust.band = req->rssi_adjust.band; in nl80211_send_wowlan_nd()
13486 rssi_adjust.delta = req->rssi_adjust.delta; in nl80211_send_wowlan_nd()
13489 return -ENOBUFS; in nl80211_send_wowlan_nd()
13494 return -ENOBUFS; in nl80211_send_wowlan_nd()
13496 for (i = 0; i < req->n_channels; i++) { in nl80211_send_wowlan_nd()
13497 if (nla_put_u32(msg, i, req->channels[i]->center_freq)) in nl80211_send_wowlan_nd()
13498 return -ENOBUFS; in nl80211_send_wowlan_nd()
13503 if (req->n_match_sets) { in nl80211_send_wowlan_nd()
13507 return -ENOBUFS; in nl80211_send_wowlan_nd()
13509 for (i = 0; i < req->n_match_sets; i++) { in nl80211_send_wowlan_nd()
13512 return -ENOBUFS; in nl80211_send_wowlan_nd()
13515 req->match_sets[i].ssid.ssid_len, in nl80211_send_wowlan_nd()
13516 req->match_sets[i].ssid.ssid)) in nl80211_send_wowlan_nd()
13517 return -ENOBUFS; in nl80211_send_wowlan_nd()
13525 return -ENOBUFS; in nl80211_send_wowlan_nd()
13527 for (i = 0; i < req->n_scan_plans; i++) { in nl80211_send_wowlan_nd()
13530 return -ENOBUFS; in nl80211_send_wowlan_nd()
13533 req->scan_plans[i].interval) || in nl80211_send_wowlan_nd()
13534 (req->scan_plans[i].iterations && in nl80211_send_wowlan_nd()
13536 req->scan_plans[i].iterations))) in nl80211_send_wowlan_nd()
13537 return -ENOBUFS; in nl80211_send_wowlan_nd()
13549 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_wowlan()
13554 if (!rdev->wiphy.wowlan) in nl80211_get_wowlan()
13555 return -EOPNOTSUPP; in nl80211_get_wowlan()
13557 if (rdev->wiphy.wowlan_config && rdev->wiphy.wowlan_config->tcp) { in nl80211_get_wowlan()
13559 size += rdev->wiphy.wowlan_config->tcp->tokens_size + in nl80211_get_wowlan()
13560 rdev->wiphy.wowlan_config->tcp->payload_len + in nl80211_get_wowlan()
13561 rdev->wiphy.wowlan_config->tcp->wake_len + in nl80211_get_wowlan()
13562 rdev->wiphy.wowlan_config->tcp->wake_len / 8; in nl80211_get_wowlan()
13567 return -ENOMEM; in nl80211_get_wowlan()
13569 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_wowlan()
13574 if (rdev->wiphy.wowlan_config) { in nl80211_get_wowlan()
13582 if ((rdev->wiphy.wowlan_config->any && in nl80211_get_wowlan()
13584 (rdev->wiphy.wowlan_config->disconnect && in nl80211_get_wowlan()
13586 (rdev->wiphy.wowlan_config->magic_pkt && in nl80211_get_wowlan()
13588 (rdev->wiphy.wowlan_config->gtk_rekey_failure && in nl80211_get_wowlan()
13590 (rdev->wiphy.wowlan_config->eap_identity_req && in nl80211_get_wowlan()
13592 (rdev->wiphy.wowlan_config->four_way_handshake && in nl80211_get_wowlan()
13594 (rdev->wiphy.wowlan_config->rfkill_release && in nl80211_get_wowlan()
13602 rdev->wiphy.wowlan_config->tcp)) in nl80211_get_wowlan()
13607 rdev->wiphy.wowlan_config->nd_config)) in nl80211_get_wowlan()
13618 return -ENOBUFS; in nl80211_get_wowlan()
13623 struct cfg80211_wowlan *trig) in nl80211_parse_wowlan_tcp() argument
13633 if (!rdev->wiphy.wowlan->tcp) in nl80211_parse_wowlan_tcp()
13634 return -EINVAL; in nl80211_parse_wowlan_tcp()
13649 return -EINVAL; in nl80211_parse_wowlan_tcp()
13652 if (data_size > rdev->wiphy.wowlan->tcp->data_payload_max) in nl80211_parse_wowlan_tcp()
13653 return -EINVAL; in nl80211_parse_wowlan_tcp()
13656 rdev->wiphy.wowlan->tcp->data_interval_max || in nl80211_parse_wowlan_tcp()
13658 return -EINVAL; in nl80211_parse_wowlan_tcp()
13661 if (wake_size > rdev->wiphy.wowlan->tcp->wake_payload_max) in nl80211_parse_wowlan_tcp()
13662 return -EINVAL; in nl80211_parse_wowlan_tcp()
13666 return -EINVAL; in nl80211_parse_wowlan_tcp()
13672 tokens_size = tokln - sizeof(*tok); in nl80211_parse_wowlan_tcp()
13674 if (!tok->len || tokens_size % tok->len) in nl80211_parse_wowlan_tcp()
13675 return -EINVAL; in nl80211_parse_wowlan_tcp()
13676 if (!rdev->wiphy.wowlan->tcp->tok) in nl80211_parse_wowlan_tcp()
13677 return -EINVAL; in nl80211_parse_wowlan_tcp()
13678 if (tok->len > rdev->wiphy.wowlan->tcp->tok->max_len) in nl80211_parse_wowlan_tcp()
13679 return -EINVAL; in nl80211_parse_wowlan_tcp()
13680 if (tok->len < rdev->wiphy.wowlan->tcp->tok->min_len) in nl80211_parse_wowlan_tcp()
13681 return -EINVAL; in nl80211_parse_wowlan_tcp()
13682 if (tokens_size > rdev->wiphy.wowlan->tcp->tok->bufsize) in nl80211_parse_wowlan_tcp()
13683 return -EINVAL; in nl80211_parse_wowlan_tcp()
13684 if (tok->offset + tok->len > data_size) in nl80211_parse_wowlan_tcp()
13685 return -EINVAL; in nl80211_parse_wowlan_tcp()
13690 if (!rdev->wiphy.wowlan->tcp->seq) in nl80211_parse_wowlan_tcp()
13691 return -EINVAL; in nl80211_parse_wowlan_tcp()
13692 if (seq->len == 0 || seq->len > 4) in nl80211_parse_wowlan_tcp()
13693 return -EINVAL; in nl80211_parse_wowlan_tcp()
13694 if (seq->len + seq->offset > data_size) in nl80211_parse_wowlan_tcp()
13695 return -EINVAL; in nl80211_parse_wowlan_tcp()
13705 return -ENOMEM; in nl80211_parse_wowlan_tcp()
13706 cfg->src = nla_get_in_addr(tb[NL80211_WOWLAN_TCP_SRC_IPV4]); in nl80211_parse_wowlan_tcp()
13707 cfg->dst = nla_get_in_addr(tb[NL80211_WOWLAN_TCP_DST_IPV4]); in nl80211_parse_wowlan_tcp()
13708 memcpy(cfg->dst_mac, nla_data(tb[NL80211_WOWLAN_TCP_DST_MAC]), in nl80211_parse_wowlan_tcp()
13713 err = __sock_create(wiphy_net(&rdev->wiphy), PF_INET, SOCK_STREAM, in nl80211_parse_wowlan_tcp()
13714 IPPROTO_TCP, &cfg->sock, 1); in nl80211_parse_wowlan_tcp()
13719 if (inet_csk_get_port(cfg->sock->sk, port)) { in nl80211_parse_wowlan_tcp()
13720 sock_release(cfg->sock); in nl80211_parse_wowlan_tcp()
13722 return -EADDRINUSE; in nl80211_parse_wowlan_tcp()
13724 cfg->src_port = inet_sk(cfg->sock->sk)->inet_num; in nl80211_parse_wowlan_tcp()
13728 return -EINVAL; in nl80211_parse_wowlan_tcp()
13730 cfg->src_port = port; in nl80211_parse_wowlan_tcp()
13733 cfg->dst_port = nla_get_u16(tb[NL80211_WOWLAN_TCP_DST_PORT]); in nl80211_parse_wowlan_tcp()
13734 cfg->payload_len = data_size; in nl80211_parse_wowlan_tcp()
13735 cfg->payload = (u8 *)cfg + sizeof(*cfg) + tokens_size; in nl80211_parse_wowlan_tcp()
13736 memcpy((void *)cfg->payload, in nl80211_parse_wowlan_tcp()
13740 cfg->payload_seq = *seq; in nl80211_parse_wowlan_tcp()
13741 cfg->data_interval = nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]); in nl80211_parse_wowlan_tcp()
13742 cfg->wake_len = wake_size; in nl80211_parse_wowlan_tcp()
13743 cfg->wake_data = (u8 *)cfg + sizeof(*cfg) + tokens_size + data_size; in nl80211_parse_wowlan_tcp()
13744 memcpy((void *)cfg->wake_data, in nl80211_parse_wowlan_tcp()
13747 cfg->wake_mask = (u8 *)cfg + sizeof(*cfg) + tokens_size + in nl80211_parse_wowlan_tcp()
13749 memcpy((void *)cfg->wake_mask, in nl80211_parse_wowlan_tcp()
13753 cfg->tokens_size = tokens_size; in nl80211_parse_wowlan_tcp()
13754 cfg->payload_tok = *tok; in nl80211_parse_wowlan_tcp()
13755 memcpy(cfg->payload_tok.token_stream, tok->token_stream, in nl80211_parse_wowlan_tcp()
13759 trig->tcp = cfg; in nl80211_parse_wowlan_tcp()
13767 struct cfg80211_wowlan *trig) in nl80211_parse_wowlan_nd() argument
13774 return -ENOMEM; in nl80211_parse_wowlan_nd()
13776 if (!(wowlan->flags & WIPHY_WOWLAN_NET_DETECT)) { in nl80211_parse_wowlan_nd()
13777 err = -EOPNOTSUPP; in nl80211_parse_wowlan_nd()
13786 trig->nd_config = nl80211_parse_sched_scan(&rdev->wiphy, NULL, tb, in nl80211_parse_wowlan_nd()
13787 wowlan->max_nd_match_sets); in nl80211_parse_wowlan_nd()
13788 err = PTR_ERR_OR_ZERO(trig->nd_config); in nl80211_parse_wowlan_nd()
13790 trig->nd_config = NULL; in nl80211_parse_wowlan_nd()
13799 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_wowlan()
13803 const struct wiphy_wowlan_support *wowlan = rdev->wiphy.wowlan; in nl80211_set_wowlan()
13805 bool prev_enabled = rdev->wiphy.wowlan_config; in nl80211_set_wowlan()
13809 return -EOPNOTSUPP; in nl80211_set_wowlan()
13811 if (!info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS]) { in nl80211_set_wowlan()
13813 rdev->wiphy.wowlan_config = NULL; in nl80211_set_wowlan()
13818 info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS], in nl80211_set_wowlan()
13819 nl80211_wowlan_policy, info->extack); in nl80211_set_wowlan()
13824 if (!(wowlan->flags & WIPHY_WOWLAN_ANY)) in nl80211_set_wowlan()
13825 return -EINVAL; in nl80211_set_wowlan()
13830 if (!(wowlan->flags & WIPHY_WOWLAN_DISCONNECT)) in nl80211_set_wowlan()
13831 return -EINVAL; in nl80211_set_wowlan()
13837 if (!(wowlan->flags & WIPHY_WOWLAN_MAGIC_PKT)) in nl80211_set_wowlan()
13838 return -EINVAL; in nl80211_set_wowlan()
13844 return -EINVAL; in nl80211_set_wowlan()
13847 if (!(wowlan->flags & WIPHY_WOWLAN_GTK_REKEY_FAILURE)) in nl80211_set_wowlan()
13848 return -EINVAL; in nl80211_set_wowlan()
13854 if (!(wowlan->flags & WIPHY_WOWLAN_EAP_IDENTITY_REQ)) in nl80211_set_wowlan()
13855 return -EINVAL; in nl80211_set_wowlan()
13861 if (!(wowlan->flags & WIPHY_WOWLAN_4WAY_HANDSHAKE)) in nl80211_set_wowlan()
13862 return -EINVAL; in nl80211_set_wowlan()
13868 if (!(wowlan->flags & WIPHY_WOWLAN_RFKILL_RELEASE)) in nl80211_set_wowlan()
13869 return -EINVAL; in nl80211_set_wowlan()
13885 if (n_patterns > wowlan->n_patterns) in nl80211_set_wowlan()
13886 return -EINVAL; in nl80211_set_wowlan()
13892 return -ENOMEM; in nl80211_set_wowlan()
13905 info->extack); in nl80211_set_wowlan()
13909 err = -EINVAL; in nl80211_set_wowlan()
13917 if (pat_len > wowlan->pattern_max_len || in nl80211_set_wowlan()
13918 pat_len < wowlan->pattern_min_len) in nl80211_set_wowlan()
13924 if (pkt_offset > wowlan->max_pkt_offset) in nl80211_set_wowlan()
13930 err = -ENOMEM; in nl80211_set_wowlan()
13971 err = -EINVAL; in nl80211_set_wowlan()
13977 err = -ENOMEM; in nl80211_set_wowlan()
13981 rdev->wiphy.wowlan_config = ntrig; in nl80211_set_wowlan()
13984 if (rdev->ops->set_wakeup && in nl80211_set_wowlan()
13985 prev_enabled != !!rdev->wiphy.wowlan_config) in nl80211_set_wowlan()
13986 rdev_set_wakeup(rdev, rdev->wiphy.wowlan_config); in nl80211_set_wowlan()
13993 if (new_triggers.tcp && new_triggers.tcp->sock) in nl80211_set_wowlan()
13994 sock_release(new_triggers.tcp->sock); in nl80211_set_wowlan()
14008 if (!rdev->coalesce->n_rules) in nl80211_send_coalesce_rules()
14013 return -ENOBUFS; in nl80211_send_coalesce_rules()
14015 for (i = 0; i < rdev->coalesce->n_rules; i++) { in nl80211_send_coalesce_rules()
14018 return -ENOBUFS; in nl80211_send_coalesce_rules()
14020 rule = &rdev->coalesce->rules[i]; in nl80211_send_coalesce_rules()
14022 rule->delay)) in nl80211_send_coalesce_rules()
14023 return -ENOBUFS; in nl80211_send_coalesce_rules()
14026 rule->condition)) in nl80211_send_coalesce_rules()
14027 return -ENOBUFS; in nl80211_send_coalesce_rules()
14032 return -ENOBUFS; in nl80211_send_coalesce_rules()
14034 for (j = 0; j < rule->n_patterns; j++) { in nl80211_send_coalesce_rules()
14037 return -ENOBUFS; in nl80211_send_coalesce_rules()
14038 pat_len = rule->patterns[j].pattern_len; in nl80211_send_coalesce_rules()
14041 rule->patterns[j].mask) || in nl80211_send_coalesce_rules()
14043 rule->patterns[j].pattern) || in nl80211_send_coalesce_rules()
14045 rule->patterns[j].pkt_offset)) in nl80211_send_coalesce_rules()
14046 return -ENOBUFS; in nl80211_send_coalesce_rules()
14059 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_coalesce()
14063 if (!rdev->wiphy.coalesce) in nl80211_get_coalesce()
14064 return -EOPNOTSUPP; in nl80211_get_coalesce()
14068 return -ENOMEM; in nl80211_get_coalesce()
14070 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_coalesce()
14075 if (rdev->coalesce && nl80211_send_coalesce_rules(msg, rdev)) in nl80211_get_coalesce()
14083 return -ENOBUFS; in nl80211_get_coalesce()
14094 for (i = 0; i < coalesce->n_rules; i++) { in cfg80211_free_coalesce()
14095 rule = &coalesce->rules[i]; in cfg80211_free_coalesce()
14096 for (j = 0; j < rule->n_patterns; j++) in cfg80211_free_coalesce()
14097 kfree(rule->patterns[j].mask); in cfg80211_free_coalesce()
14098 kfree(rule->patterns); in cfg80211_free_coalesce()
14108 const struct wiphy_coalesce_support *coalesce = rdev->wiphy.coalesce; in nl80211_parse_coalesce_rule()
14119 new_rule->delay = in nl80211_parse_coalesce_rule()
14121 if (new_rule->delay > coalesce->max_delay) in nl80211_parse_coalesce_rule()
14122 return -EINVAL; in nl80211_parse_coalesce_rule()
14125 new_rule->condition = in nl80211_parse_coalesce_rule()
14129 return -EINVAL; in nl80211_parse_coalesce_rule()
14134 if (n_patterns > coalesce->n_patterns) in nl80211_parse_coalesce_rule()
14135 return -EINVAL; in nl80211_parse_coalesce_rule()
14137 new_rule->patterns = kcalloc(n_patterns, sizeof(new_rule->patterns[0]), in nl80211_parse_coalesce_rule()
14139 if (!new_rule->patterns) in nl80211_parse_coalesce_rule()
14140 return -ENOMEM; in nl80211_parse_coalesce_rule()
14142 new_rule->n_patterns = n_patterns; in nl80211_parse_coalesce_rule()
14158 return -EINVAL; in nl80211_parse_coalesce_rule()
14162 return -EINVAL; in nl80211_parse_coalesce_rule()
14163 if (pat_len > coalesce->pattern_max_len || in nl80211_parse_coalesce_rule()
14164 pat_len < coalesce->pattern_min_len) in nl80211_parse_coalesce_rule()
14165 return -EINVAL; in nl80211_parse_coalesce_rule()
14169 if (pkt_offset > coalesce->max_pkt_offset) in nl80211_parse_coalesce_rule()
14170 return -EINVAL; in nl80211_parse_coalesce_rule()
14171 new_rule->patterns[i].pkt_offset = pkt_offset; in nl80211_parse_coalesce_rule()
14175 return -ENOMEM; in nl80211_parse_coalesce_rule()
14177 new_rule->patterns[i].mask = mask_pat; in nl80211_parse_coalesce_rule()
14182 new_rule->patterns[i].pattern = mask_pat; in nl80211_parse_coalesce_rule()
14183 new_rule->patterns[i].pattern_len = pat_len; in nl80211_parse_coalesce_rule()
14194 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_coalesce()
14195 const struct wiphy_coalesce_support *coalesce = rdev->wiphy.coalesce; in nl80211_set_coalesce()
14200 if (!rdev->wiphy.coalesce || !rdev->ops->set_coalesce) in nl80211_set_coalesce()
14201 return -EOPNOTSUPP; in nl80211_set_coalesce()
14203 if (!info->attrs[NL80211_ATTR_COALESCE_RULE]) { in nl80211_set_coalesce()
14204 cfg80211_free_coalesce(rdev->coalesce); in nl80211_set_coalesce()
14205 rdev->coalesce = NULL; in nl80211_set_coalesce()
14210 nla_for_each_nested(rule, info->attrs[NL80211_ATTR_COALESCE_RULE], in nl80211_set_coalesce()
14213 if (n_rules > coalesce->n_rules) in nl80211_set_coalesce()
14214 return -EINVAL; in nl80211_set_coalesce()
14219 return -ENOMEM; in nl80211_set_coalesce()
14221 new_coalesce->n_rules = n_rules; in nl80211_set_coalesce()
14224 nla_for_each_nested(rule, info->attrs[NL80211_ATTR_COALESCE_RULE], in nl80211_set_coalesce()
14227 &new_coalesce->rules[i]); in nl80211_set_coalesce()
14238 cfg80211_free_coalesce(rdev->coalesce); in nl80211_set_coalesce()
14239 rdev->coalesce = new_coalesce; in nl80211_set_coalesce()
14250 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_rekey_data()
14251 struct net_device *dev = info->user_ptr[1]; in nl80211_set_rekey_data()
14252 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_rekey_data()
14257 if (!info->attrs[NL80211_ATTR_REKEY_DATA]) in nl80211_set_rekey_data()
14258 return -EINVAL; in nl80211_set_rekey_data()
14261 info->attrs[NL80211_ATTR_REKEY_DATA], in nl80211_set_rekey_data()
14262 nl80211_rekey_policy, info->extack); in nl80211_set_rekey_data()
14268 return -EINVAL; in nl80211_set_rekey_data()
14270 !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_EXT_KEK_KCK && in nl80211_set_rekey_data()
14272 return -ERANGE; in nl80211_set_rekey_data()
14274 !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_EXT_KEK_KCK && in nl80211_set_rekey_data()
14276 !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_EXT_KCK_32 && in nl80211_set_rekey_data()
14278 return -ERANGE; in nl80211_set_rekey_data()
14288 if (!wdev->connected) in nl80211_set_rekey_data()
14289 return -ENOTCONN; in nl80211_set_rekey_data()
14291 if (!rdev->ops->set_rekey_data) in nl80211_set_rekey_data()
14292 return -EOPNOTSUPP; in nl80211_set_rekey_data()
14300 struct net_device *dev = info->user_ptr[1]; in nl80211_register_unexpected_frame()
14301 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_register_unexpected_frame()
14303 if (wdev->iftype != NL80211_IFTYPE_AP && in nl80211_register_unexpected_frame()
14304 wdev->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_register_unexpected_frame()
14305 return -EINVAL; in nl80211_register_unexpected_frame()
14307 if (wdev->ap_unexpected_nlportid) in nl80211_register_unexpected_frame()
14308 return -EBUSY; in nl80211_register_unexpected_frame()
14310 wdev->ap_unexpected_nlportid = info->snd_portid; in nl80211_register_unexpected_frame()
14317 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_probe_client()
14318 struct net_device *dev = info->user_ptr[1]; in nl80211_probe_client()
14319 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_probe_client()
14326 if (wdev->iftype != NL80211_IFTYPE_AP && in nl80211_probe_client()
14327 wdev->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_probe_client()
14328 return -EOPNOTSUPP; in nl80211_probe_client()
14330 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_probe_client()
14331 return -EINVAL; in nl80211_probe_client()
14333 if (!rdev->ops->probe_client) in nl80211_probe_client()
14334 return -EOPNOTSUPP; in nl80211_probe_client()
14338 return -ENOMEM; in nl80211_probe_client()
14340 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_probe_client()
14343 err = -ENOBUFS; in nl80211_probe_client()
14347 addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_probe_client()
14362 err = -ENOBUFS; in nl80211_probe_client()
14370 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_register_beacons()
14374 if (!(rdev->wiphy.flags & WIPHY_FLAG_REPORTS_OBSS)) in nl80211_register_beacons()
14375 return -EOPNOTSUPP; in nl80211_register_beacons()
14379 return -ENOMEM; in nl80211_register_beacons()
14382 spin_lock_bh(&rdev->beacon_registrations_lock); in nl80211_register_beacons()
14383 list_for_each_entry(reg, &rdev->beacon_registrations, list) { in nl80211_register_beacons()
14384 if (reg->nlportid == info->snd_portid) { in nl80211_register_beacons()
14385 rv = -EALREADY; in nl80211_register_beacons()
14390 nreg->nlportid = info->snd_portid; in nl80211_register_beacons()
14391 list_add(&nreg->list, &rdev->beacon_registrations); in nl80211_register_beacons()
14393 spin_unlock_bh(&rdev->beacon_registrations_lock); in nl80211_register_beacons()
14397 spin_unlock_bh(&rdev->beacon_registrations_lock); in nl80211_register_beacons()
14404 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_start_p2p_device()
14405 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_start_p2p_device()
14408 if (!rdev->ops->start_p2p_device) in nl80211_start_p2p_device()
14409 return -EOPNOTSUPP; in nl80211_start_p2p_device()
14411 if (wdev->iftype != NL80211_IFTYPE_P2P_DEVICE) in nl80211_start_p2p_device()
14412 return -EOPNOTSUPP; in nl80211_start_p2p_device()
14417 if (rfkill_blocked(rdev->wiphy.rfkill)) in nl80211_start_p2p_device()
14418 return -ERFKILL; in nl80211_start_p2p_device()
14424 wdev->is_running = true; in nl80211_start_p2p_device()
14425 rdev->opencount++; in nl80211_start_p2p_device()
14432 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_stop_p2p_device()
14433 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_stop_p2p_device()
14435 if (wdev->iftype != NL80211_IFTYPE_P2P_DEVICE) in nl80211_stop_p2p_device()
14436 return -EOPNOTSUPP; in nl80211_stop_p2p_device()
14438 if (!rdev->ops->stop_p2p_device) in nl80211_stop_p2p_device()
14439 return -EOPNOTSUPP; in nl80211_stop_p2p_device()
14448 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_start_nan()
14449 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_start_nan()
14453 if (wdev->iftype != NL80211_IFTYPE_NAN) in nl80211_start_nan()
14454 return -EOPNOTSUPP; in nl80211_start_nan()
14457 return -EEXIST; in nl80211_start_nan()
14459 if (rfkill_blocked(rdev->wiphy.rfkill)) in nl80211_start_nan()
14460 return -ERFKILL; in nl80211_start_nan()
14462 if (!info->attrs[NL80211_ATTR_NAN_MASTER_PREF]) in nl80211_start_nan()
14463 return -EINVAL; in nl80211_start_nan()
14466 nla_get_u8(info->attrs[NL80211_ATTR_NAN_MASTER_PREF]); in nl80211_start_nan()
14468 if (info->attrs[NL80211_ATTR_BANDS]) { in nl80211_start_nan()
14469 u32 bands = nla_get_u32(info->attrs[NL80211_ATTR_BANDS]); in nl80211_start_nan()
14471 if (bands & ~(u32)wdev->wiphy->nan_supported_bands) in nl80211_start_nan()
14472 return -EOPNOTSUPP; in nl80211_start_nan()
14475 return -EINVAL; in nl80211_start_nan()
14484 wdev->is_running = true; in nl80211_start_nan()
14485 rdev->opencount++; in nl80211_start_nan()
14492 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_stop_nan()
14493 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_stop_nan()
14495 if (wdev->iftype != NL80211_IFTYPE_NAN) in nl80211_stop_nan()
14496 return -EOPNOTSUPP; in nl80211_stop_nan()
14514 return -EINVAL; in validate_nan_filter()
14521 bool tx) in handle_nan_filter() argument
14531 BUILD_BUG_ON(sizeof(*func->rx_filters) != sizeof(*func->tx_filters)); in handle_nan_filter()
14533 filter = kcalloc(n_entries, sizeof(*func->rx_filters), GFP_KERNEL); in handle_nan_filter()
14535 return -ENOMEM; in handle_nan_filter()
14546 if (tx) { in handle_nan_filter()
14547 func->num_tx_filters = n_entries; in handle_nan_filter()
14548 func->tx_filters = filter; in handle_nan_filter()
14550 func->num_rx_filters = n_entries; in handle_nan_filter()
14551 func->rx_filters = filter; in handle_nan_filter()
14563 return -ENOMEM; in handle_nan_filter()
14569 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_nan_add_func()
14570 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_nan_add_func()
14577 if (wdev->iftype != NL80211_IFTYPE_NAN) in nl80211_nan_add_func()
14578 return -EOPNOTSUPP; in nl80211_nan_add_func()
14581 return -ENOTCONN; in nl80211_nan_add_func()
14583 if (!info->attrs[NL80211_ATTR_NAN_FUNC]) in nl80211_nan_add_func()
14584 return -EINVAL; in nl80211_nan_add_func()
14587 info->attrs[NL80211_ATTR_NAN_FUNC], in nl80211_nan_add_func()
14589 info->extack); in nl80211_nan_add_func()
14595 return -ENOMEM; in nl80211_nan_add_func()
14597 func->cookie = cfg80211_assign_cookie(rdev); in nl80211_nan_add_func()
14600 err = -EINVAL; in nl80211_nan_add_func()
14605 func->type = nla_get_u8(tb[NL80211_NAN_FUNC_TYPE]); in nl80211_nan_add_func()
14608 err = -EINVAL; in nl80211_nan_add_func()
14612 memcpy(func->service_id, nla_data(tb[NL80211_NAN_FUNC_SERVICE_ID]), in nl80211_nan_add_func()
14613 sizeof(func->service_id)); in nl80211_nan_add_func()
14615 func->close_range = in nl80211_nan_add_func()
14619 func->serv_spec_info_len = in nl80211_nan_add_func()
14621 func->serv_spec_info = in nl80211_nan_add_func()
14623 func->serv_spec_info_len, in nl80211_nan_add_func()
14625 if (!func->serv_spec_info) { in nl80211_nan_add_func()
14626 err = -ENOMEM; in nl80211_nan_add_func()
14632 func->ttl = nla_get_u32(tb[NL80211_NAN_FUNC_TTL]); in nl80211_nan_add_func()
14634 switch (func->type) { in nl80211_nan_add_func()
14637 err = -EINVAL; in nl80211_nan_add_func()
14641 func->publish_type = in nl80211_nan_add_func()
14643 func->publish_bcast = in nl80211_nan_add_func()
14646 if ((!(func->publish_type & NL80211_NAN_SOLICITED_PUBLISH)) && in nl80211_nan_add_func()
14647 func->publish_bcast) { in nl80211_nan_add_func()
14648 err = -EINVAL; in nl80211_nan_add_func()
14653 func->subscribe_active = in nl80211_nan_add_func()
14660 err = -EINVAL; in nl80211_nan_add_func()
14664 func->followup_id = in nl80211_nan_add_func()
14666 func->followup_reqid = in nl80211_nan_add_func()
14668 memcpy(func->followup_dest.addr, in nl80211_nan_add_func()
14670 sizeof(func->followup_dest.addr)); in nl80211_nan_add_func()
14671 if (func->ttl) { in nl80211_nan_add_func()
14672 err = -EINVAL; in nl80211_nan_add_func()
14677 err = -EINVAL; in nl80211_nan_add_func()
14688 info->extack); in nl80211_nan_add_func()
14692 func->srf_include = in nl80211_nan_add_func()
14698 err = -EINVAL; in nl80211_nan_add_func()
14702 func->srf_bf_len = in nl80211_nan_add_func()
14704 func->srf_bf = in nl80211_nan_add_func()
14706 func->srf_bf_len, GFP_KERNEL); in nl80211_nan_add_func()
14707 if (!func->srf_bf) { in nl80211_nan_add_func()
14708 err = -ENOMEM; in nl80211_nan_add_func()
14712 func->srf_bf_idx = in nl80211_nan_add_func()
14720 err = -EINVAL; in nl80211_nan_add_func()
14726 err = -EINVAL; in nl80211_nan_add_func()
14730 func->srf_num_macs = n_entries; in nl80211_nan_add_func()
14731 func->srf_macs = in nl80211_nan_add_func()
14732 kcalloc(n_entries, sizeof(*func->srf_macs), in nl80211_nan_add_func()
14734 if (!func->srf_macs) { in nl80211_nan_add_func()
14735 err = -ENOMEM; in nl80211_nan_add_func()
14740 memcpy(func->srf_macs[i++].addr, nla_data(attr), in nl80211_nan_add_func()
14741 sizeof(*func->srf_macs)); in nl80211_nan_add_func()
14761 err = -ENOMEM; in nl80211_nan_add_func()
14765 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_nan_add_func()
14767 /* This can't really happen - we just allocated 4KB */ in nl80211_nan_add_func()
14769 err = -ENOMEM; in nl80211_nan_add_func()
14782 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, func->cookie, in nl80211_nan_add_func()
14791 func->instance_id)) in nl80211_nan_add_func()
14801 return -ENOBUFS; in nl80211_nan_add_func()
14807 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_nan_del_func()
14808 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_nan_del_func()
14811 if (wdev->iftype != NL80211_IFTYPE_NAN) in nl80211_nan_del_func()
14812 return -EOPNOTSUPP; in nl80211_nan_del_func()
14815 return -ENOTCONN; in nl80211_nan_del_func()
14817 if (!info->attrs[NL80211_ATTR_COOKIE]) in nl80211_nan_del_func()
14818 return -EINVAL; in nl80211_nan_del_func()
14820 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); in nl80211_nan_del_func()
14830 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_nan_change_config()
14831 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_nan_change_config()
14835 if (wdev->iftype != NL80211_IFTYPE_NAN) in nl80211_nan_change_config()
14836 return -EOPNOTSUPP; in nl80211_nan_change_config()
14839 return -ENOTCONN; in nl80211_nan_change_config()
14841 if (info->attrs[NL80211_ATTR_NAN_MASTER_PREF]) { in nl80211_nan_change_config()
14843 nla_get_u8(info->attrs[NL80211_ATTR_NAN_MASTER_PREF]); in nl80211_nan_change_config()
14845 return -EINVAL; in nl80211_nan_change_config()
14850 if (info->attrs[NL80211_ATTR_BANDS]) { in nl80211_nan_change_config()
14851 u32 bands = nla_get_u32(info->attrs[NL80211_ATTR_BANDS]); in nl80211_nan_change_config()
14853 if (bands & ~(u32)wdev->wiphy->nan_supported_bands) in nl80211_nan_change_config()
14854 return -EOPNOTSUPP; in nl80211_nan_change_config()
14857 return -EINVAL; in nl80211_nan_change_config()
14864 return -EINVAL; in nl80211_nan_change_config()
14872 struct wiphy *wiphy = wdev->wiphy; in cfg80211_nan_match()
14878 if (WARN_ON(!match->inst_id || !match->peer_inst_id || !match->addr)) in cfg80211_nan_match()
14891 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_nan_match()
14892 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, in cfg80211_nan_match()
14893 wdev->netdev->ifindex)) || in cfg80211_nan_match()
14898 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, match->cookie, in cfg80211_nan_match()
14900 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, match->addr)) in cfg80211_nan_match()
14912 if (nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, match->inst_id)) in cfg80211_nan_match()
14922 if (nla_put_u8(msg, NL80211_NAN_FUNC_TYPE, match->type) || in cfg80211_nan_match()
14923 nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, match->peer_inst_id)) in cfg80211_nan_match()
14926 if (match->info && match->info_len && in cfg80211_nan_match()
14927 nla_put(msg, NL80211_NAN_FUNC_SERVICE_INFO, match->info_len, in cfg80211_nan_match()
14928 match->info)) in cfg80211_nan_match()
14935 if (!wdev->owner_nlportid) in cfg80211_nan_match()
14936 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), in cfg80211_nan_match()
14939 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, in cfg80211_nan_match()
14940 wdev->owner_nlportid); in cfg80211_nan_match()
14954 struct wiphy *wiphy = wdev->wiphy; in cfg80211_nan_func_terminated()
14973 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_nan_func_terminated()
14974 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, in cfg80211_nan_func_terminated()
14975 wdev->netdev->ifindex)) || in cfg80211_nan_func_terminated()
14995 if (!wdev->owner_nlportid) in cfg80211_nan_func_terminated()
14996 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), in cfg80211_nan_func_terminated()
14999 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, in cfg80211_nan_func_terminated()
15000 wdev->owner_nlportid); in cfg80211_nan_func_terminated()
15017 return -ENOMEM; in nl80211_get_protocol_features()
15019 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_protocol_features()
15033 return -ENOBUFS; in nl80211_get_protocol_features()
15038 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_update_ft_ies()
15040 struct net_device *dev = info->user_ptr[1]; in nl80211_update_ft_ies()
15042 if (!rdev->ops->update_ft_ies) in nl80211_update_ft_ies()
15043 return -EOPNOTSUPP; in nl80211_update_ft_ies()
15045 if (!info->attrs[NL80211_ATTR_MDID] || in nl80211_update_ft_ies()
15046 !info->attrs[NL80211_ATTR_IE]) in nl80211_update_ft_ies()
15047 return -EINVAL; in nl80211_update_ft_ies()
15050 ft_params.md = nla_get_u16(info->attrs[NL80211_ATTR_MDID]); in nl80211_update_ft_ies()
15051 ft_params.ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_update_ft_ies()
15052 ft_params.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_update_ft_ies()
15060 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_crit_protocol_start()
15061 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_crit_protocol_start()
15066 if (!rdev->ops->crit_proto_start) in nl80211_crit_protocol_start()
15067 return -EOPNOTSUPP; in nl80211_crit_protocol_start()
15069 if (WARN_ON(!rdev->ops->crit_proto_stop)) in nl80211_crit_protocol_start()
15070 return -EINVAL; in nl80211_crit_protocol_start()
15072 if (rdev->crit_proto_nlportid) in nl80211_crit_protocol_start()
15073 return -EBUSY; in nl80211_crit_protocol_start()
15076 if (info->attrs[NL80211_ATTR_CRIT_PROT_ID]) in nl80211_crit_protocol_start()
15077 proto = nla_get_u16(info->attrs[NL80211_ATTR_CRIT_PROT_ID]); in nl80211_crit_protocol_start()
15080 return -EINVAL; in nl80211_crit_protocol_start()
15083 if (!info->attrs[NL80211_ATTR_MAX_CRIT_PROT_DURATION]) in nl80211_crit_protocol_start()
15084 return -EINVAL; in nl80211_crit_protocol_start()
15087 nla_get_u16(info->attrs[NL80211_ATTR_MAX_CRIT_PROT_DURATION]); in nl80211_crit_protocol_start()
15091 rdev->crit_proto_nlportid = info->snd_portid; in nl80211_crit_protocol_start()
15099 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_crit_protocol_stop()
15100 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_crit_protocol_stop()
15102 if (!rdev->ops->crit_proto_stop) in nl80211_crit_protocol_stop()
15103 return -EOPNOTSUPP; in nl80211_crit_protocol_stop()
15105 if (rdev->crit_proto_nlportid) { in nl80211_crit_protocol_stop()
15106 rdev->crit_proto_nlportid = 0; in nl80211_crit_protocol_stop()
15116 if (vcmd->policy == VENDOR_CMD_RAW_DATA) { in nl80211_vendor_check_policy()
15117 if (attr->nla_type & NLA_F_NESTED) { in nl80211_vendor_check_policy()
15120 return -EINVAL; in nl80211_vendor_check_policy()
15126 if (!(attr->nla_type & NLA_F_NESTED)) { in nl80211_vendor_check_policy()
15128 return -EINVAL; in nl80211_vendor_check_policy()
15131 return nla_validate_nested(attr, vcmd->maxattr, vcmd->policy, extack); in nl80211_vendor_check_policy()
15136 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_vendor_cmd()
15139 info->attrs); in nl80211_vendor_cmd()
15143 if (!rdev->wiphy.vendor_commands) in nl80211_vendor_cmd()
15144 return -EOPNOTSUPP; in nl80211_vendor_cmd()
15148 if (err != -EINVAL) in nl80211_vendor_cmd()
15151 } else if (wdev->wiphy != &rdev->wiphy) { in nl80211_vendor_cmd()
15152 return -EINVAL; in nl80211_vendor_cmd()
15155 if (!info->attrs[NL80211_ATTR_VENDOR_ID] || in nl80211_vendor_cmd()
15156 !info->attrs[NL80211_ATTR_VENDOR_SUBCMD]) in nl80211_vendor_cmd()
15157 return -EINVAL; in nl80211_vendor_cmd()
15159 vid = nla_get_u32(info->attrs[NL80211_ATTR_VENDOR_ID]); in nl80211_vendor_cmd()
15160 subcmd = nla_get_u32(info->attrs[NL80211_ATTR_VENDOR_SUBCMD]); in nl80211_vendor_cmd()
15161 for (i = 0; i < rdev->wiphy.n_vendor_commands; i++) { in nl80211_vendor_cmd()
15166 vcmd = &rdev->wiphy.vendor_commands[i]; in nl80211_vendor_cmd()
15168 if (vcmd->info.vendor_id != vid || vcmd->info.subcmd != subcmd) in nl80211_vendor_cmd()
15171 if (vcmd->flags & (WIPHY_VENDOR_CMD_NEED_WDEV | in nl80211_vendor_cmd()
15174 return -EINVAL; in nl80211_vendor_cmd()
15175 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_NETDEV && in nl80211_vendor_cmd()
15176 !wdev->netdev) in nl80211_vendor_cmd()
15177 return -EINVAL; in nl80211_vendor_cmd()
15179 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_RUNNING) { in nl80211_vendor_cmd()
15181 return -ENETDOWN; in nl80211_vendor_cmd()
15187 if (!vcmd->doit) in nl80211_vendor_cmd()
15188 return -EOPNOTSUPP; in nl80211_vendor_cmd()
15190 if (info->attrs[NL80211_ATTR_VENDOR_DATA]) { in nl80211_vendor_cmd()
15191 data = nla_data(info->attrs[NL80211_ATTR_VENDOR_DATA]); in nl80211_vendor_cmd()
15192 len = nla_len(info->attrs[NL80211_ATTR_VENDOR_DATA]); in nl80211_vendor_cmd()
15195 info->attrs[NL80211_ATTR_VENDOR_DATA], in nl80211_vendor_cmd()
15196 info->extack); in nl80211_vendor_cmd()
15201 rdev->cur_cmd_info = info; in nl80211_vendor_cmd()
15202 err = vcmd->doit(&rdev->wiphy, wdev, data, len); in nl80211_vendor_cmd()
15203 rdev->cur_cmd_info = NULL; in nl80211_vendor_cmd()
15207 return -EOPNOTSUPP; in nl80211_vendor_cmd()
15218 int vcmd_idx = -1; in nl80211_prepare_vendor_dump()
15223 if (cb->args[0]) { in nl80211_prepare_vendor_dump()
15225 struct wiphy *wiphy = wiphy_idx_to_wiphy(cb->args[0] - 1); in nl80211_prepare_vendor_dump()
15229 return -ENODEV; in nl80211_prepare_vendor_dump()
15233 if (cb->args[1]) { in nl80211_prepare_vendor_dump()
15234 list_for_each_entry(tmp, &wiphy->wdev_list, list) { in nl80211_prepare_vendor_dump()
15235 if (tmp->identifier == cb->args[1] - 1) { in nl80211_prepare_vendor_dump()
15248 return -ENOMEM; in nl80211_prepare_vendor_dump()
15250 err = nlmsg_parse_deprecated(cb->nlh, in nl80211_prepare_vendor_dump()
15259 err = -EINVAL; in nl80211_prepare_vendor_dump()
15263 *wdev = __cfg80211_wdev_from_attrs(NULL, sock_net(skb->sk), attrbuf); in nl80211_prepare_vendor_dump()
15267 *rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk), attrbuf); in nl80211_prepare_vendor_dump()
15276 for (i = 0; i < (*rdev)->wiphy.n_vendor_commands; i++) { in nl80211_prepare_vendor_dump()
15279 vcmd = &(*rdev)->wiphy.vendor_commands[i]; in nl80211_prepare_vendor_dump()
15281 if (vcmd->info.vendor_id != vid || vcmd->info.subcmd != subcmd) in nl80211_prepare_vendor_dump()
15284 if (!vcmd->dumpit) { in nl80211_prepare_vendor_dump()
15285 err = -EOPNOTSUPP; in nl80211_prepare_vendor_dump()
15294 err = -EOPNOTSUPP; in nl80211_prepare_vendor_dump()
15303 &(*rdev)->wiphy.vendor_commands[vcmd_idx], in nl80211_prepare_vendor_dump()
15305 cb->extack); in nl80211_prepare_vendor_dump()
15310 /* 0 is the first index - add 1 to parse only once */ in nl80211_prepare_vendor_dump()
15311 cb->args[0] = (*rdev)->wiphy_idx + 1; in nl80211_prepare_vendor_dump()
15313 cb->args[1] = *wdev ? (*wdev)->identifier + 1 : 0; in nl80211_prepare_vendor_dump()
15314 cb->args[2] = vcmd_idx; in nl80211_prepare_vendor_dump()
15315 cb->args[3] = (unsigned long)data; in nl80211_prepare_vendor_dump()
15316 cb->args[4] = data_len; in nl80211_prepare_vendor_dump()
15342 vcmd_idx = cb->args[2]; in nl80211_vendor_cmd_dump()
15343 data = (void *)cb->args[3]; in nl80211_vendor_cmd_dump()
15344 data_len = cb->args[4]; in nl80211_vendor_cmd_dump()
15345 vcmd = &rdev->wiphy.vendor_commands[vcmd_idx]; in nl80211_vendor_cmd_dump()
15347 if (vcmd->flags & (WIPHY_VENDOR_CMD_NEED_WDEV | in nl80211_vendor_cmd_dump()
15350 err = -EINVAL; in nl80211_vendor_cmd_dump()
15353 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_NETDEV && in nl80211_vendor_cmd_dump()
15354 !wdev->netdev) { in nl80211_vendor_cmd_dump()
15355 err = -EINVAL; in nl80211_vendor_cmd_dump()
15359 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_RUNNING) { in nl80211_vendor_cmd_dump()
15361 err = -ENETDOWN; in nl80211_vendor_cmd_dump()
15368 void *hdr = nl80211hdr_put(skb, NETLINK_CB(cb->skb).portid, in nl80211_vendor_cmd_dump()
15369 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_vendor_cmd_dump()
15374 if (nla_put_u32(skb, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_vendor_cmd_dump()
15389 err = vcmd->dumpit(&rdev->wiphy, wdev, skb, data, data_len, in nl80211_vendor_cmd_dump()
15390 (unsigned long *)&cb->args[5]); in nl80211_vendor_cmd_dump()
15393 if (err == -ENOBUFS || err == -ENOENT) { in nl80211_vendor_cmd_dump()
15404 err = skb->len; in nl80211_vendor_cmd_dump()
15417 if (WARN_ON(!rdev->cur_cmd_info)) in __cfg80211_alloc_reply_skb()
15421 rdev->cur_cmd_info->snd_portid, in __cfg80211_alloc_reply_skb()
15422 rdev->cur_cmd_info->snd_seq, in __cfg80211_alloc_reply_skb()
15429 struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0]; in cfg80211_vendor_cmd_reply()
15430 void *hdr = ((void **)skb->cb)[1]; in cfg80211_vendor_cmd_reply()
15431 struct nlattr *data = ((void **)skb->cb)[2]; in cfg80211_vendor_cmd_reply()
15434 memset(skb->cb, 0, sizeof(skb->cb)); in cfg80211_vendor_cmd_reply()
15436 if (WARN_ON(!rdev->cur_cmd_info)) { in cfg80211_vendor_cmd_reply()
15438 return -EINVAL; in cfg80211_vendor_cmd_reply()
15443 return genlmsg_reply(skb, rdev->cur_cmd_info); in cfg80211_vendor_cmd_reply()
15451 if (WARN_ON(!rdev->cur_cmd_info)) in cfg80211_vendor_cmd_get_sender()
15454 return rdev->cur_cmd_info->snd_portid; in cfg80211_vendor_cmd_get_sender()
15461 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_qos_map()
15463 struct net_device *dev = info->user_ptr[1]; in nl80211_set_qos_map()
15467 if (!rdev->ops->set_qos_map) in nl80211_set_qos_map()
15468 return -EOPNOTSUPP; in nl80211_set_qos_map()
15470 if (info->attrs[NL80211_ATTR_QOS_MAP]) { in nl80211_set_qos_map()
15471 pos = nla_data(info->attrs[NL80211_ATTR_QOS_MAP]); in nl80211_set_qos_map()
15472 len = nla_len(info->attrs[NL80211_ATTR_QOS_MAP]); in nl80211_set_qos_map()
15475 return -EINVAL; in nl80211_set_qos_map()
15479 return -ENOMEM; in nl80211_set_qos_map()
15481 num_des = (len - IEEE80211_QOS_MAP_LEN_MIN) >> 1; in nl80211_set_qos_map()
15485 memcpy(qos_map->dscp_exception, pos, des_len); in nl80211_set_qos_map()
15486 qos_map->num_des = num_des; in nl80211_set_qos_map()
15488 if (qos_map->dscp_exception[des].up > 7) { in nl80211_set_qos_map()
15490 return -EINVAL; in nl80211_set_qos_map()
15495 memcpy(qos_map->up, pos, IEEE80211_QOS_MAP_LEN_MIN); in nl80211_set_qos_map()
15498 ret = nl80211_key_allowed(dev->ieee80211_ptr); in nl80211_set_qos_map()
15508 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_add_tx_ts()
15509 struct net_device *dev = info->user_ptr[1]; in nl80211_add_tx_ts()
15510 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_add_tx_ts()
15515 if (!(rdev->wiphy.features & NL80211_FEATURE_SUPPORTS_WMM_ADMISSION)) in nl80211_add_tx_ts()
15516 return -EOPNOTSUPP; in nl80211_add_tx_ts()
15518 if (!info->attrs[NL80211_ATTR_TSID] || !info->attrs[NL80211_ATTR_MAC] || in nl80211_add_tx_ts()
15519 !info->attrs[NL80211_ATTR_USER_PRIO]) in nl80211_add_tx_ts()
15520 return -EINVAL; in nl80211_add_tx_ts()
15522 tsid = nla_get_u8(info->attrs[NL80211_ATTR_TSID]); in nl80211_add_tx_ts()
15523 up = nla_get_u8(info->attrs[NL80211_ATTR_USER_PRIO]); in nl80211_add_tx_ts()
15525 /* WMM uses TIDs 0-7 even for TSPEC */ in nl80211_add_tx_ts()
15531 return -EINVAL; in nl80211_add_tx_ts()
15534 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_add_tx_ts()
15536 if (info->attrs[NL80211_ATTR_ADMITTED_TIME]) { in nl80211_add_tx_ts()
15538 nla_get_u16(info->attrs[NL80211_ATTR_ADMITTED_TIME]); in nl80211_add_tx_ts()
15540 return -EINVAL; in nl80211_add_tx_ts()
15543 switch (wdev->iftype) { in nl80211_add_tx_ts()
15546 if (wdev->connected) in nl80211_add_tx_ts()
15548 return -ENOTCONN; in nl80211_add_tx_ts()
15550 return -EOPNOTSUPP; in nl80211_add_tx_ts()
15558 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_del_tx_ts()
15559 struct net_device *dev = info->user_ptr[1]; in nl80211_del_tx_ts()
15563 if (!info->attrs[NL80211_ATTR_TSID] || !info->attrs[NL80211_ATTR_MAC]) in nl80211_del_tx_ts()
15564 return -EINVAL; in nl80211_del_tx_ts()
15566 tsid = nla_get_u8(info->attrs[NL80211_ATTR_TSID]); in nl80211_del_tx_ts()
15567 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_del_tx_ts()
15575 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_tdls_channel_switch()
15576 struct net_device *dev = info->user_ptr[1]; in nl80211_tdls_channel_switch()
15577 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_tdls_channel_switch()
15583 if (!rdev->ops->tdls_channel_switch || in nl80211_tdls_channel_switch()
15584 !(rdev->wiphy.features & NL80211_FEATURE_TDLS_CHANNEL_SWITCH)) in nl80211_tdls_channel_switch()
15585 return -EOPNOTSUPP; in nl80211_tdls_channel_switch()
15587 switch (dev->ieee80211_ptr->iftype) { in nl80211_tdls_channel_switch()
15592 return -EOPNOTSUPP; in nl80211_tdls_channel_switch()
15595 if (!info->attrs[NL80211_ATTR_MAC] || in nl80211_tdls_channel_switch()
15596 !info->attrs[NL80211_ATTR_OPER_CLASS]) in nl80211_tdls_channel_switch()
15597 return -EINVAL; in nl80211_tdls_channel_switch()
15604 * Don't allow wide channels on the 2.4Ghz band, as per IEEE802.11-2012 in nl80211_tdls_channel_switch()
15608 if (chandef.chan->band == NL80211_BAND_2GHZ && in nl80211_tdls_channel_switch()
15611 return -EINVAL; in nl80211_tdls_channel_switch()
15614 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &chandef, in nl80211_tdls_channel_switch()
15615 wdev->iftype)) in nl80211_tdls_channel_switch()
15616 return -EINVAL; in nl80211_tdls_channel_switch()
15619 if (cfg80211_chandef_dfs_required(wdev->wiphy, &chandef, wdev->iftype)) in nl80211_tdls_channel_switch()
15620 return -EINVAL; in nl80211_tdls_channel_switch()
15622 addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_tdls_channel_switch()
15623 oper_class = nla_get_u8(info->attrs[NL80211_ATTR_OPER_CLASS]); in nl80211_tdls_channel_switch()
15631 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_tdls_cancel_channel_switch()
15632 struct net_device *dev = info->user_ptr[1]; in nl80211_tdls_cancel_channel_switch()
15635 if (!rdev->ops->tdls_channel_switch || in nl80211_tdls_cancel_channel_switch()
15636 !rdev->ops->tdls_cancel_channel_switch || in nl80211_tdls_cancel_channel_switch()
15637 !(rdev->wiphy.features & NL80211_FEATURE_TDLS_CHANNEL_SWITCH)) in nl80211_tdls_cancel_channel_switch()
15638 return -EOPNOTSUPP; in nl80211_tdls_cancel_channel_switch()
15640 switch (dev->ieee80211_ptr->iftype) { in nl80211_tdls_cancel_channel_switch()
15645 return -EOPNOTSUPP; in nl80211_tdls_cancel_channel_switch()
15648 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_tdls_cancel_channel_switch()
15649 return -EINVAL; in nl80211_tdls_cancel_channel_switch()
15651 addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_tdls_cancel_channel_switch()
15661 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_multicast_to_unicast()
15662 struct net_device *dev = info->user_ptr[1]; in nl80211_set_multicast_to_unicast()
15663 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_multicast_to_unicast()
15667 if (!rdev->ops->set_multicast_to_unicast) in nl80211_set_multicast_to_unicast()
15668 return -EOPNOTSUPP; in nl80211_set_multicast_to_unicast()
15670 if (wdev->iftype != NL80211_IFTYPE_AP && in nl80211_set_multicast_to_unicast()
15671 wdev->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_set_multicast_to_unicast()
15672 return -EOPNOTSUPP; in nl80211_set_multicast_to_unicast()
15674 nla = info->attrs[NL80211_ATTR_MULTICAST_TO_UNICAST_ENABLED]; in nl80211_set_multicast_to_unicast()
15682 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_pmk()
15683 struct net_device *dev = info->user_ptr[1]; in nl80211_set_pmk()
15684 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_pmk()
15687 if (wdev->iftype != NL80211_IFTYPE_STATION && in nl80211_set_pmk()
15688 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_set_pmk()
15689 return -EOPNOTSUPP; in nl80211_set_pmk()
15691 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_set_pmk()
15693 return -EOPNOTSUPP; in nl80211_set_pmk()
15695 if (!info->attrs[NL80211_ATTR_MAC] || !info->attrs[NL80211_ATTR_PMK]) in nl80211_set_pmk()
15696 return -EINVAL; in nl80211_set_pmk()
15698 if (!wdev->connected) in nl80211_set_pmk()
15699 return -ENOTCONN; in nl80211_set_pmk()
15701 pmk_conf.aa = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_set_pmk()
15702 if (memcmp(pmk_conf.aa, wdev->u.client.connected_addr, ETH_ALEN)) in nl80211_set_pmk()
15703 return -EINVAL; in nl80211_set_pmk()
15705 pmk_conf.pmk = nla_data(info->attrs[NL80211_ATTR_PMK]); in nl80211_set_pmk()
15706 pmk_conf.pmk_len = nla_len(info->attrs[NL80211_ATTR_PMK]); in nl80211_set_pmk()
15709 return -EINVAL; in nl80211_set_pmk()
15711 if (info->attrs[NL80211_ATTR_PMKR0_NAME]) in nl80211_set_pmk()
15713 nla_data(info->attrs[NL80211_ATTR_PMKR0_NAME]); in nl80211_set_pmk()
15720 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_del_pmk()
15721 struct net_device *dev = info->user_ptr[1]; in nl80211_del_pmk()
15722 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_del_pmk()
15725 if (wdev->iftype != NL80211_IFTYPE_STATION && in nl80211_del_pmk()
15726 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_del_pmk()
15727 return -EOPNOTSUPP; in nl80211_del_pmk()
15729 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_del_pmk()
15731 return -EOPNOTSUPP; in nl80211_del_pmk()
15733 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_del_pmk()
15734 return -EINVAL; in nl80211_del_pmk()
15736 aa = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_del_pmk()
15742 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_external_auth()
15743 struct net_device *dev = info->user_ptr[1]; in nl80211_external_auth()
15746 if (!rdev->ops->external_auth) in nl80211_external_auth()
15747 return -EOPNOTSUPP; in nl80211_external_auth()
15749 if (!info->attrs[NL80211_ATTR_SSID] && in nl80211_external_auth()
15750 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && in nl80211_external_auth()
15751 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_external_auth()
15752 return -EINVAL; in nl80211_external_auth()
15754 if (!info->attrs[NL80211_ATTR_BSSID]) in nl80211_external_auth()
15755 return -EINVAL; in nl80211_external_auth()
15757 if (!info->attrs[NL80211_ATTR_STATUS_CODE]) in nl80211_external_auth()
15758 return -EINVAL; in nl80211_external_auth()
15762 if (info->attrs[NL80211_ATTR_SSID]) { in nl80211_external_auth()
15763 params.ssid.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); in nl80211_external_auth()
15765 return -EINVAL; in nl80211_external_auth()
15767 nla_data(info->attrs[NL80211_ATTR_SSID]), in nl80211_external_auth()
15771 memcpy(params.bssid, nla_data(info->attrs[NL80211_ATTR_BSSID]), in nl80211_external_auth()
15774 params.status = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]); in nl80211_external_auth()
15776 if (info->attrs[NL80211_ATTR_PMKID]) in nl80211_external_auth()
15777 params.pmkid = nla_data(info->attrs[NL80211_ATTR_PMKID]); in nl80211_external_auth()
15784 bool dont_wait_for_ack = info->attrs[NL80211_ATTR_DONT_WAIT_FOR_ACK]; in nl80211_tx_control_port()
15785 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_tx_control_port()
15786 struct net_device *dev = info->user_ptr[1]; in nl80211_tx_control_port()
15787 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_tx_control_port()
15797 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_tx_control_port()
15799 return -EOPNOTSUPP; in nl80211_tx_control_port()
15801 if (!rdev->ops->tx_control_port) in nl80211_tx_control_port()
15802 return -EOPNOTSUPP; in nl80211_tx_control_port()
15804 if (!info->attrs[NL80211_ATTR_FRAME] || in nl80211_tx_control_port()
15805 !info->attrs[NL80211_ATTR_MAC] || in nl80211_tx_control_port()
15806 !info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]) { in nl80211_tx_control_port()
15808 return -EINVAL; in nl80211_tx_control_port()
15811 switch (wdev->iftype) { in nl80211_tx_control_port()
15817 if (wdev->u.ibss.current_bss) in nl80211_tx_control_port()
15819 return -ENOTCONN; in nl80211_tx_control_port()
15822 if (wdev->connected) in nl80211_tx_control_port()
15824 return -ENOTCONN; in nl80211_tx_control_port()
15826 return -EOPNOTSUPP; in nl80211_tx_control_port()
15829 buf = nla_data(info->attrs[NL80211_ATTR_FRAME]); in nl80211_tx_control_port()
15830 len = nla_len(info->attrs[NL80211_ATTR_FRAME]); in nl80211_tx_control_port()
15831 dest = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_tx_control_port()
15832 proto = nla_get_u16(info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]); in nl80211_tx_control_port()
15834 nla_get_flag(info->attrs[NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT]); in nl80211_tx_control_port()
15836 link_id = nl80211_link_id_or_invalid(info->attrs); in nl80211_tx_control_port()
15842 nl_set_extack_cookie_u64(info->extack, cookie); in nl80211_tx_control_port()
15849 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_ftm_responder_stats()
15850 struct net_device *dev = info->user_ptr[1]; in nl80211_get_ftm_responder_stats()
15851 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_get_ftm_responder_stats()
15853 unsigned int link_id = nl80211_link_id(info->attrs); in nl80211_get_ftm_responder_stats()
15859 if (wdev->iftype != NL80211_IFTYPE_AP || in nl80211_get_ftm_responder_stats()
15860 !wdev->links[link_id].ap.beacon_interval) in nl80211_get_ftm_responder_stats()
15861 return -EOPNOTSUPP; in nl80211_get_ftm_responder_stats()
15868 return -ENODATA; in nl80211_get_ftm_responder_stats()
15872 return -ENOMEM; in nl80211_get_ftm_responder_stats()
15874 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_ftm_responder_stats()
15879 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) in nl80211_get_ftm_responder_stats()
15916 return -ENOBUFS; in nl80211_get_ftm_responder_stats()
15921 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_update_owe_info()
15923 struct net_device *dev = info->user_ptr[1]; in nl80211_update_owe_info()
15925 if (!rdev->ops->update_owe_info) in nl80211_update_owe_info()
15926 return -EOPNOTSUPP; in nl80211_update_owe_info()
15928 if (!info->attrs[NL80211_ATTR_STATUS_CODE] || in nl80211_update_owe_info()
15929 !info->attrs[NL80211_ATTR_MAC]) in nl80211_update_owe_info()
15930 return -EINVAL; in nl80211_update_owe_info()
15933 owe_info.status = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]); in nl80211_update_owe_info()
15934 nla_memcpy(owe_info.peer, info->attrs[NL80211_ATTR_MAC], ETH_ALEN); in nl80211_update_owe_info()
15936 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_update_owe_info()
15937 owe_info.ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_update_owe_info()
15938 owe_info.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_update_owe_info()
15946 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_probe_mesh_link()
15947 struct net_device *dev = info->user_ptr[1]; in nl80211_probe_mesh_link()
15948 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_probe_mesh_link()
15955 if (!rdev->ops->probe_mesh_link || !rdev->ops->get_station) in nl80211_probe_mesh_link()
15956 return -EOPNOTSUPP; in nl80211_probe_mesh_link()
15958 if (!info->attrs[NL80211_ATTR_MAC] || in nl80211_probe_mesh_link()
15959 !info->attrs[NL80211_ATTR_FRAME]) { in nl80211_probe_mesh_link()
15961 return -EINVAL; in nl80211_probe_mesh_link()
15964 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_probe_mesh_link()
15965 return -EOPNOTSUPP; in nl80211_probe_mesh_link()
15967 dest = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_probe_mesh_link()
15968 buf = nla_data(info->attrs[NL80211_ATTR_FRAME]); in nl80211_probe_mesh_link()
15969 len = nla_len(info->attrs[NL80211_ATTR_FRAME]); in nl80211_probe_mesh_link()
15972 return -EINVAL; in nl80211_probe_mesh_link()
15975 !ether_addr_equal(buf + ETH_ALEN, dev->dev_addr)) in nl80211_probe_mesh_link()
15976 return -EINVAL; in nl80211_probe_mesh_link()
15993 struct netlink_ext_ack *extack = info->extack; in parse_tid_conf()
15998 return -EINVAL; in parse_tid_conf()
16000 tid_conf->config_override = in parse_tid_conf()
16002 tid_conf->tids = nla_get_u16(attrs[NL80211_TID_CONFIG_ATTR_TIDS]); in parse_tid_conf()
16004 if (tid_conf->config_override) { in parse_tid_conf()
16005 if (rdev->ops->reset_tid_config) { in parse_tid_conf()
16007 tid_conf->tids); in parse_tid_conf()
16011 return -EINVAL; in parse_tid_conf()
16016 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_NOACK); in parse_tid_conf()
16017 tid_conf->noack = in parse_tid_conf()
16022 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_RETRY_SHORT); in parse_tid_conf()
16023 tid_conf->retry_short = in parse_tid_conf()
16026 if (tid_conf->retry_short > rdev->wiphy.max_data_retry_count) in parse_tid_conf()
16027 return -EINVAL; in parse_tid_conf()
16031 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_RETRY_LONG); in parse_tid_conf()
16032 tid_conf->retry_long = in parse_tid_conf()
16035 if (tid_conf->retry_long > rdev->wiphy.max_data_retry_count) in parse_tid_conf()
16036 return -EINVAL; in parse_tid_conf()
16040 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_AMPDU_CTRL); in parse_tid_conf()
16041 tid_conf->ampdu = in parse_tid_conf()
16046 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL); in parse_tid_conf()
16047 tid_conf->rtscts = in parse_tid_conf()
16052 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_AMSDU_CTRL); in parse_tid_conf()
16053 tid_conf->amsdu = in parse_tid_conf()
16060 tid_conf->txrate_type = nla_get_u8(attrs[idx]); in parse_tid_conf()
16062 if (tid_conf->txrate_type != NL80211_TX_RATE_AUTOMATIC) { in parse_tid_conf()
16065 &tid_conf->txrate_mask, dev, in parse_tid_conf()
16070 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_TX_RATE); in parse_tid_conf()
16072 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE); in parse_tid_conf()
16076 mask = rdev->wiphy.tid_config_support.peer; in parse_tid_conf()
16078 mask = rdev->wiphy.tid_config_support.vif; in parse_tid_conf()
16080 if (tid_conf->mask & ~mask) { in parse_tid_conf()
16082 return -EOPNOTSUPP; in parse_tid_conf()
16091 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_tid_config()
16093 unsigned int link_id = nl80211_link_id(info->attrs); in nl80211_set_tid_config()
16094 struct net_device *dev = info->user_ptr[1]; in nl80211_set_tid_config()
16098 int ret = -EINVAL; in nl80211_set_tid_config()
16101 if (!info->attrs[NL80211_ATTR_TID_CONFIG]) in nl80211_set_tid_config()
16102 return -EINVAL; in nl80211_set_tid_config()
16104 if (!rdev->ops->set_tid_config) in nl80211_set_tid_config()
16105 return -EOPNOTSUPP; in nl80211_set_tid_config()
16107 nla_for_each_nested(tid, info->attrs[NL80211_ATTR_TID_CONFIG], in nl80211_set_tid_config()
16114 return -ENOMEM; in nl80211_set_tid_config()
16116 tid_config->n_tid_conf = num_conf; in nl80211_set_tid_config()
16118 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_set_tid_config()
16119 tid_config->peer = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_set_tid_config()
16121 nla_for_each_nested(tid, info->attrs[NL80211_ATTR_TID_CONFIG], in nl80211_set_tid_config()
16130 &tid_config->tid_conf[conf_idx], in nl80211_set_tid_config()
16131 info, tid_config->peer, link_id); in nl80211_set_tid_config()
16147 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_color_change()
16149 struct net_device *dev = info->user_ptr[1]; in nl80211_color_change()
16150 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_color_change()
16155 if (!rdev->ops->color_change) in nl80211_color_change()
16156 return -EOPNOTSUPP; in nl80211_color_change()
16158 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_color_change()
16160 return -EOPNOTSUPP; in nl80211_color_change()
16162 if (wdev->iftype != NL80211_IFTYPE_AP) in nl80211_color_change()
16163 return -EOPNOTSUPP; in nl80211_color_change()
16165 if (!info->attrs[NL80211_ATTR_COLOR_CHANGE_COUNT] || in nl80211_color_change()
16166 !info->attrs[NL80211_ATTR_COLOR_CHANGE_COLOR] || in nl80211_color_change()
16167 !info->attrs[NL80211_ATTR_COLOR_CHANGE_ELEMS]) in nl80211_color_change()
16168 return -EINVAL; in nl80211_color_change()
16170 params.count = nla_get_u8(info->attrs[NL80211_ATTR_COLOR_CHANGE_COUNT]); in nl80211_color_change()
16171 params.color = nla_get_u8(info->attrs[NL80211_ATTR_COLOR_CHANGE_COLOR]); in nl80211_color_change()
16173 err = nl80211_parse_beacon(rdev, info->attrs, ¶ms.beacon_next, in nl80211_color_change()
16174 info->extack); in nl80211_color_change()
16180 return -ENOMEM; in nl80211_color_change()
16183 info->attrs[NL80211_ATTR_COLOR_CHANGE_ELEMS], in nl80211_color_change()
16184 nl80211_policy, info->extack); in nl80211_color_change()
16189 info->extack); in nl80211_color_change()
16194 err = -EINVAL; in nl80211_color_change()
16199 err = -EINVAL; in nl80211_color_change()
16205 err = -EINVAL; in nl80211_color_change()
16210 err = -EINVAL; in nl80211_color_change()
16219 err = -EINVAL; in nl80211_color_change()
16225 err = -EINVAL; in nl80211_color_change()
16231 err = -EINVAL; in nl80211_color_change()
16238 params.link_id = nl80211_link_id(info->attrs); in nl80211_color_change()
16253 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_fils_aad()
16254 struct net_device *dev = info->user_ptr[1]; in nl80211_set_fils_aad()
16258 if (!info->attrs[NL80211_ATTR_MAC] || in nl80211_set_fils_aad()
16259 !info->attrs[NL80211_ATTR_FILS_KEK] || in nl80211_set_fils_aad()
16260 !info->attrs[NL80211_ATTR_FILS_NONCES]) in nl80211_set_fils_aad()
16261 return -EINVAL; in nl80211_set_fils_aad()
16263 fils_aad.macaddr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_set_fils_aad()
16264 fils_aad.kek_len = nla_len(info->attrs[NL80211_ATTR_FILS_KEK]); in nl80211_set_fils_aad()
16265 fils_aad.kek = nla_data(info->attrs[NL80211_ATTR_FILS_KEK]); in nl80211_set_fils_aad()
16266 nonces = nla_data(info->attrs[NL80211_ATTR_FILS_NONCES]); in nl80211_set_fils_aad()
16275 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_add_link()
16276 unsigned int link_id = nl80211_link_id(info->attrs); in nl80211_add_link()
16277 struct net_device *dev = info->user_ptr[1]; in nl80211_add_link()
16278 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_add_link()
16281 if (!(wdev->wiphy->flags & WIPHY_FLAG_SUPPORTS_MLO)) in nl80211_add_link()
16282 return -EINVAL; in nl80211_add_link()
16284 switch (wdev->iftype) { in nl80211_add_link()
16288 return -EINVAL; in nl80211_add_link()
16291 if (!info->attrs[NL80211_ATTR_MAC] || in nl80211_add_link()
16292 !is_valid_ether_addr(nla_data(info->attrs[NL80211_ATTR_MAC]))) in nl80211_add_link()
16293 return -EINVAL; in nl80211_add_link()
16295 wdev->valid_links |= BIT(link_id); in nl80211_add_link()
16296 ether_addr_copy(wdev->links[link_id].addr, in nl80211_add_link()
16297 nla_data(info->attrs[NL80211_ATTR_MAC])); in nl80211_add_link()
16301 wdev->valid_links &= ~BIT(link_id); in nl80211_add_link()
16302 eth_zero_addr(wdev->links[link_id].addr); in nl80211_add_link()
16310 unsigned int link_id = nl80211_link_id(info->attrs); in nl80211_remove_link()
16311 struct net_device *dev = info->user_ptr[1]; in nl80211_remove_link()
16312 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_remove_link()
16315 if (!info->attrs[NL80211_ATTR_MLO_LINK_ID]) in nl80211_remove_link()
16316 return -EINVAL; in nl80211_remove_link()
16318 switch (wdev->iftype) { in nl80211_remove_link()
16322 return -EINVAL; in nl80211_remove_link()
16335 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_add_mod_link_station()
16336 struct net_device *dev = info->user_ptr[1]; in nl80211_add_mod_link_station()
16339 if ((add && !rdev->ops->add_link_station) || in nl80211_add_mod_link_station()
16340 (!add && !rdev->ops->mod_link_station)) in nl80211_add_mod_link_station()
16341 return -EOPNOTSUPP; in nl80211_add_mod_link_station()
16343 if (add && !info->attrs[NL80211_ATTR_MAC]) in nl80211_add_mod_link_station()
16344 return -EINVAL; in nl80211_add_mod_link_station()
16346 if (!info->attrs[NL80211_ATTR_MLD_ADDR]) in nl80211_add_mod_link_station()
16347 return -EINVAL; in nl80211_add_mod_link_station()
16349 if (add && !info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) in nl80211_add_mod_link_station()
16350 return -EINVAL; in nl80211_add_mod_link_station()
16352 params.mld_mac = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]); in nl80211_add_mod_link_station()
16354 if (info->attrs[NL80211_ATTR_MAC]) { in nl80211_add_mod_link_station()
16355 params.link_mac = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_add_mod_link_station()
16357 return -EINVAL; in nl80211_add_mod_link_station()
16360 if (!info->attrs[NL80211_ATTR_MLO_LINK_ID]) in nl80211_add_mod_link_station()
16361 return -EINVAL; in nl80211_add_mod_link_station()
16363 params.link_id = nla_get_u8(info->attrs[NL80211_ATTR_MLO_LINK_ID]); in nl80211_add_mod_link_station()
16365 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) { in nl80211_add_mod_link_station()
16367 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); in nl80211_add_mod_link_station()
16369 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); in nl80211_add_mod_link_station()
16372 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) in nl80211_add_mod_link_station()
16374 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]); in nl80211_add_mod_link_station()
16376 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) in nl80211_add_mod_link_station()
16378 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]); in nl80211_add_mod_link_station()
16380 if (info->attrs[NL80211_ATTR_HE_CAPABILITY]) { in nl80211_add_mod_link_station()
16382 nla_data(info->attrs[NL80211_ATTR_HE_CAPABILITY]); in nl80211_add_mod_link_station()
16384 nla_len(info->attrs[NL80211_ATTR_HE_CAPABILITY]); in nl80211_add_mod_link_station()
16386 if (info->attrs[NL80211_ATTR_EHT_CAPABILITY]) { in nl80211_add_mod_link_station()
16388 nla_data(info->attrs[NL80211_ATTR_EHT_CAPABILITY]); in nl80211_add_mod_link_station()
16390 nla_len(info->attrs[NL80211_ATTR_EHT_CAPABILITY]); in nl80211_add_mod_link_station()
16396 return -EINVAL; in nl80211_add_mod_link_station()
16400 if (info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]) in nl80211_add_mod_link_station()
16402 nla_data(info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]); in nl80211_add_mod_link_station()
16404 if (info->attrs[NL80211_ATTR_OPMODE_NOTIF]) { in nl80211_add_mod_link_station()
16407 nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]); in nl80211_add_mod_link_station()
16437 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_remove_link_station()
16438 struct net_device *dev = info->user_ptr[1]; in nl80211_remove_link_station()
16440 if (!rdev->ops->del_link_station) in nl80211_remove_link_station()
16441 return -EOPNOTSUPP; in nl80211_remove_link_station()
16443 if (!info->attrs[NL80211_ATTR_MLD_ADDR] || in nl80211_remove_link_station()
16444 !info->attrs[NL80211_ATTR_MLO_LINK_ID]) in nl80211_remove_link_station()
16445 return -EINVAL; in nl80211_remove_link_station()
16447 params.mld_mac = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]); in nl80211_remove_link_station()
16448 params.link_id = nla_get_u8(info->attrs[NL80211_ATTR_MLO_LINK_ID]); in nl80211_remove_link_station()
16456 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_hw_timestamp()
16457 struct net_device *dev = info->user_ptr[1]; in nl80211_set_hw_timestamp()
16460 if (!rdev->wiphy.hw_timestamp_max_peers) in nl80211_set_hw_timestamp()
16461 return -EOPNOTSUPP; in nl80211_set_hw_timestamp()
16463 if (!info->attrs[NL80211_ATTR_MAC] && in nl80211_set_hw_timestamp()
16464 rdev->wiphy.hw_timestamp_max_peers != CFG80211_HW_TIMESTAMP_ALL_PEERS) in nl80211_set_hw_timestamp()
16465 return -EOPNOTSUPP; in nl80211_set_hw_timestamp()
16467 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_set_hw_timestamp()
16468 hwts.macaddr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_set_hw_timestamp()
16471 nla_get_flag(info->attrs[NL80211_ATTR_HW_TIMESTAMP_ENABLED]); in nl80211_set_hw_timestamp()
16480 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_ttlm()
16481 struct net_device *dev = info->user_ptr[1]; in nl80211_set_ttlm()
16482 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_ttlm()
16484 if (wdev->iftype != NL80211_IFTYPE_STATION && in nl80211_set_ttlm()
16485 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_set_ttlm()
16486 return -EOPNOTSUPP; in nl80211_set_ttlm()
16488 if (!wdev->connected) in nl80211_set_ttlm()
16489 return -ENOLINK; in nl80211_set_ttlm()
16491 if (!info->attrs[NL80211_ATTR_MLO_TTLM_DLINK] || in nl80211_set_ttlm()
16492 !info->attrs[NL80211_ATTR_MLO_TTLM_ULINK]) in nl80211_set_ttlm()
16493 return -EINVAL; in nl80211_set_ttlm()
16496 info->attrs[NL80211_ATTR_MLO_TTLM_DLINK], in nl80211_set_ttlm()
16499 info->attrs[NL80211_ATTR_MLO_TTLM_ULINK], in nl80211_set_ttlm()
16507 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_assoc_ml_reconf()
16508 struct net_device *dev = info->user_ptr[1]; in nl80211_assoc_ml_reconf()
16509 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_assoc_ml_reconf()
16515 if (!wdev->valid_links) in nl80211_assoc_ml_reconf()
16516 return -EINVAL; in nl80211_assoc_ml_reconf()
16518 if (dev->ieee80211_ptr->conn_owner_nlportid && in nl80211_assoc_ml_reconf()
16519 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) in nl80211_assoc_ml_reconf()
16520 return -EPERM; in nl80211_assoc_ml_reconf()
16522 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_assoc_ml_reconf()
16523 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_assoc_ml_reconf()
16524 return -EOPNOTSUPP; in nl80211_assoc_ml_reconf()
16527 if (info->attrs[NL80211_ATTR_MLO_LINKS]) { in nl80211_assoc_ml_reconf()
16543 if (info->attrs[NL80211_ATTR_MLO_RECONF_REM_LINKS]) in nl80211_assoc_ml_reconf()
16545 nla_get_u16(info->attrs[NL80211_ATTR_MLO_RECONF_REM_LINKS]); in nl80211_assoc_ml_reconf()
16551 (wdev->valid_links & add_links) || in nl80211_assoc_ml_reconf()
16552 ((wdev->valid_links & req.rem_links) != req.rem_links)) { in nl80211_assoc_ml_reconf()
16553 err = -EINVAL; in nl80211_assoc_ml_reconf()
16557 if (info->attrs[NL80211_ATTR_ASSOC_MLD_EXT_CAPA_OPS]) in nl80211_assoc_ml_reconf()
16559 nla_get_u16(info->attrs[NL80211_ATTR_ASSOC_MLD_EXT_CAPA_OPS]); in nl80211_assoc_ml_reconf()
16565 cfg80211_put_bss(&rdev->wiphy, req.add_links[link_id].bss); in nl80211_assoc_ml_reconf()
16573 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_epcs_cfg()
16574 struct net_device *dev = info->user_ptr[1]; in nl80211_epcs_cfg()
16575 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_epcs_cfg()
16578 if (wdev->iftype != NL80211_IFTYPE_STATION && in nl80211_epcs_cfg()
16579 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_epcs_cfg()
16580 return -EOPNOTSUPP; in nl80211_epcs_cfg()
16582 if (!wdev->connected) in nl80211_epcs_cfg()
16583 return -ENOLINK; in nl80211_epcs_cfg()
16585 val = nla_get_flag(info->attrs[NL80211_ATTR_EPCS]); in nl80211_epcs_cfg()
16688 if (WARN_ON(ops->internal_flags >= ARRAY_SIZE(nl80211_internal_flags))) in nl80211_pre_doit()
16689 return -EINVAL; in nl80211_pre_doit()
16691 internal_flags = nl80211_internal_flags[ops->internal_flags]; in nl80211_pre_doit()
16700 info->user_ptr[0] = rdev; in nl80211_pre_doit()
16704 info->attrs); in nl80211_pre_doit()
16710 dev = wdev->netdev; in nl80211_pre_doit()
16712 rdev = wiphy_to_rdev(wdev->wiphy); in nl80211_pre_doit()
16716 err = -EINVAL; in nl80211_pre_doit()
16720 info->user_ptr[1] = dev; in nl80211_pre_doit()
16722 info->user_ptr[1] = wdev; in nl80211_pre_doit()
16727 err = -ENETDOWN; in nl80211_pre_doit()
16731 info->user_ptr[0] = rdev; in nl80211_pre_doit()
16735 struct nlattr *link_id = info->attrs[NL80211_ATTR_MLO_LINK_ID]; in nl80211_pre_doit()
16738 err = -EINVAL; in nl80211_pre_doit()
16742 /* MLO -> require valid link ID */ in nl80211_pre_doit()
16743 if (wdev->valid_links && in nl80211_pre_doit()
16745 !(wdev->valid_links & BIT(nla_get_u8(link_id))))) { in nl80211_pre_doit()
16746 err = -EINVAL; in nl80211_pre_doit()
16750 /* non-MLO -> no link ID attribute accepted */ in nl80211_pre_doit()
16751 if (!wdev->valid_links && link_id) { in nl80211_pre_doit()
16752 err = -EINVAL; in nl80211_pre_doit()
16758 if (info->attrs[NL80211_ATTR_MLO_LINK_ID] || in nl80211_pre_doit()
16759 (wdev && wdev->valid_links)) { in nl80211_pre_doit()
16760 err = -EINVAL; in nl80211_pre_doit()
16766 wiphy_lock(&rdev->wiphy); in nl80211_pre_doit()
16768 __release(&rdev->wiphy.mtx); in nl80211_pre_doit()
16784 u32 internal_flags = nl80211_internal_flags[ops->internal_flags]; in nl80211_post_doit()
16786 if (info->user_ptr[1]) { in nl80211_post_doit()
16788 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_post_doit()
16790 dev_put(wdev->netdev); in nl80211_post_doit()
16792 dev_put(info->user_ptr[1]); in nl80211_post_doit()
16796 if (info->user_ptr[0] && in nl80211_post_doit()
16798 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_post_doit()
16801 __acquire(&rdev->wiphy.mtx); in nl80211_post_doit()
16802 wiphy_unlock(&rdev->wiphy); in nl80211_post_doit()
16827 return -EINVAL; in nl80211_set_sar_sub_specs()
16831 return -EINVAL; in nl80211_set_sar_sub_specs()
16836 if (range_index >= rdev->wiphy.sar_capa->num_freq_ranges) in nl80211_set_sar_sub_specs()
16837 return -EINVAL; in nl80211_set_sar_sub_specs()
16841 if (sar_specs->sub_specs[i].freq_range_index == range_index) in nl80211_set_sar_sub_specs()
16842 return -EINVAL; in nl80211_set_sar_sub_specs()
16845 sar_specs->sub_specs[index].power = in nl80211_set_sar_sub_specs()
16848 sar_specs->sub_specs[index].freq_range_index = range_index; in nl80211_set_sar_sub_specs()
16855 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_sar_specs()
16864 if (!rdev->wiphy.sar_capa || !rdev->ops->set_sar_specs) in nl80211_set_sar_specs()
16865 return -EOPNOTSUPP; in nl80211_set_sar_specs()
16867 if (!info->attrs[NL80211_ATTR_SAR_SPEC]) in nl80211_set_sar_specs()
16868 return -EINVAL; in nl80211_set_sar_specs()
16871 info->attrs[NL80211_ATTR_SAR_SPEC], in nl80211_set_sar_specs()
16875 return -EINVAL; in nl80211_set_sar_specs()
16878 if (type != rdev->wiphy.sar_capa->type) in nl80211_set_sar_specs()
16879 return -EINVAL; in nl80211_set_sar_specs()
16885 if (specs > rdev->wiphy.sar_capa->num_freq_ranges) in nl80211_set_sar_specs()
16886 return -EINVAL; in nl80211_set_sar_specs()
16890 return -ENOMEM; in nl80211_set_sar_specs()
16892 sar_spec->type = type; in nl80211_set_sar_specs()
16902 err = -EINVAL; in nl80211_set_sar_specs()
16907 err = -EINVAL; in nl80211_set_sar_specs()
16913 sar_spec->num_sub_specs = specs; in nl80211_set_sar_specs()
16915 rdev->cur_cmd_info = info; in nl80211_set_sar_specs()
16917 rdev->cur_cmd_info = NULL; in nl80211_set_sar_specs()
17836 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_notify_wiphy()
17855 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_notify_iface()
17862 struct cfg80211_scan_request *req = rdev->scan_req; in nl80211_add_scan_req()
17873 for (i = 0; i < req->n_ssids; i++) { in nl80211_add_scan_req()
17874 if (nla_put(msg, i, req->ssids[i].ssid_len, req->ssids[i].ssid)) in nl80211_add_scan_req()
17879 if (req->flags & NL80211_SCAN_FLAG_FREQ_KHZ) { in nl80211_add_scan_req()
17883 for (i = 0; i < req->n_channels; i++) { in nl80211_add_scan_req()
17885 ieee80211_channel_to_khz(req->channels[i]))) in nl80211_add_scan_req()
17894 for (i = 0; i < req->n_channels; i++) { in nl80211_add_scan_req()
17895 if (nla_put_u32(msg, i, req->channels[i]->center_freq)) in nl80211_add_scan_req()
17901 if (req->ie && in nl80211_add_scan_req()
17902 nla_put(msg, NL80211_ATTR_IE, req->ie_len, req->ie)) in nl80211_add_scan_req()
17905 if (req->flags && in nl80211_add_scan_req()
17906 nla_put_u32(msg, NL80211_ATTR_SCAN_FLAGS, req->flags)) in nl80211_add_scan_req()
17909 info = rdev->int_scan_req ? &rdev->int_scan_req->info : in nl80211_add_scan_req()
17910 &rdev->scan_req->info; in nl80211_add_scan_req()
17911 if (info->scan_start_tsf && in nl80211_add_scan_req()
17913 info->scan_start_tsf, NL80211_BSS_PAD) || in nl80211_add_scan_req()
17915 info->tsf_bssid))) in nl80211_add_scan_req()
17920 return -ENOBUFS; in nl80211_add_scan_req()
17933 return -1; in nl80211_prep_scan_msg()
17935 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_prep_scan_msg()
17936 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, in nl80211_prep_scan_msg()
17937 wdev->netdev->ifindex)) || in nl80211_prep_scan_msg()
17950 return -EMSGSIZE; in nl80211_prep_scan_msg()
17961 return -1; in nl80211_prep_sched_scan_msg()
17964 wiphy_to_rdev(req->wiphy)->wiphy_idx) || in nl80211_prep_sched_scan_msg()
17965 nla_put_u32(msg, NL80211_ATTR_IFINDEX, req->dev->ifindex) || in nl80211_prep_sched_scan_msg()
17966 nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, req->reqid, in nl80211_prep_sched_scan_msg()
17975 return -EMSGSIZE; in nl80211_prep_sched_scan_msg()
17993 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_scan_start()
18023 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_scan_msg()
18040 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(req->wiphy), msg, 0, in nl80211_send_sched_scan()
18048 if (nla_put_u8(msg, NL80211_ATTR_REG_INITIATOR, request->initiator)) in nl80211_reg_change_event_fill()
18051 if (request->alpha2[0] == '0' && request->alpha2[1] == '0') { in nl80211_reg_change_event_fill()
18055 } else if (request->alpha2[0] == '9' && request->alpha2[1] == '9') { in nl80211_reg_change_event_fill()
18059 } else if ((request->alpha2[0] == '9' && request->alpha2[1] == '8') || in nl80211_reg_change_event_fill()
18060 request->intersect) { in nl80211_reg_change_event_fill()
18068 request->alpha2)) in nl80211_reg_change_event_fill()
18072 if (request->wiphy_idx != WIPHY_IDX_INVALID) { in nl80211_reg_change_event_fill()
18073 struct wiphy *wiphy = wiphy_idx_to_wiphy(request->wiphy_idx); in nl80211_reg_change_event_fill()
18076 nla_put_u32(msg, NL80211_ATTR_WIPHY, request->wiphy_idx)) in nl80211_reg_change_event_fill()
18080 wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED && in nl80211_reg_change_event_fill()
18141 msg = nlmsg_new(100 + event->buf_len + event->req_ies_len, gfp); in nl80211_send_mlme_event()
18145 hdr = nl80211hdr_put(msg, 0, 0, 0, event->cmd); in nl80211_send_mlme_event()
18151 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_mlme_event()
18152 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_send_mlme_event()
18153 nla_put(msg, NL80211_ATTR_FRAME, event->buf_len, event->buf) || in nl80211_send_mlme_event()
18154 (event->req_ies && in nl80211_send_mlme_event()
18155 nla_put(msg, NL80211_ATTR_REQ_IE, event->req_ies_len, in nl80211_send_mlme_event()
18156 event->req_ies))) in nl80211_send_mlme_event()
18159 if (event->reconnect && in nl80211_send_mlme_event()
18163 if (event->uapsd_queues >= 0) { in nl80211_send_mlme_event()
18170 event->uapsd_queues)) in nl80211_send_mlme_event()
18178 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_mlme_event()
18194 .uapsd_queues = -1, in nl80211_send_rx_auth()
18206 .buf = data->buf, in nl80211_send_rx_assoc()
18207 .buf_len = data->len, in nl80211_send_rx_assoc()
18208 .uapsd_queues = data->uapsd_queues, in nl80211_send_rx_assoc()
18209 .req_ies = data->req_ies, in nl80211_send_rx_assoc()
18210 .req_ies_len = data->req_ies_len, in nl80211_send_rx_assoc()
18225 .uapsd_queues = -1, in nl80211_send_deauth()
18240 .uapsd_queues = -1, in nl80211_send_disassoc()
18249 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_rx_unprot_mlme_mgmt()
18250 struct wiphy *wiphy = wdev->wiphy; in cfg80211_rx_unprot_mlme_mgmt()
18256 .uapsd_queues = -1, in cfg80211_rx_unprot_mlme_mgmt()
18262 if (ieee80211_is_deauth(mgmt->frame_control)) { in cfg80211_rx_unprot_mlme_mgmt()
18264 } else if (ieee80211_is_disassoc(mgmt->frame_control)) { in cfg80211_rx_unprot_mlme_mgmt()
18266 } else if (ieee80211_is_beacon(mgmt->frame_control)) { in cfg80211_rx_unprot_mlme_mgmt()
18267 if (wdev->unprot_beacon_reported && in cfg80211_rx_unprot_mlme_mgmt()
18268 elapsed_jiffies_msecs(wdev->unprot_beacon_reported) < 10000) in cfg80211_rx_unprot_mlme_mgmt()
18271 wdev->unprot_beacon_reported = jiffies; in cfg80211_rx_unprot_mlme_mgmt()
18298 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_mlme_timeout()
18299 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_send_mlme_timeout()
18306 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_mlme_timeout()
18339 const u8 *connected_addr = cr->valid_links ? in nl80211_send_connect_result()
18340 cr->ap_mld_addr : cr->links[0].bssid; in nl80211_send_connect_result()
18342 if (cr->valid_links) { in nl80211_send_connect_result()
18348 link_info_size += cr->links[link].addr ? in nl80211_send_connect_result()
18350 link_info_size += (cr->links[link].bssid || in nl80211_send_connect_result()
18351 cr->links[link].bss) ? in nl80211_send_connect_result()
18357 msg = nlmsg_new(100 + cr->req_ie_len + cr->resp_ie_len + in nl80211_send_connect_result()
18358 cr->fils.kek_len + cr->fils.pmk_len + in nl80211_send_connect_result()
18359 (cr->fils.pmkid ? WLAN_PMKID_LEN : 0) + link_info_size, in nl80211_send_connect_result()
18370 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_connect_result()
18371 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_send_connect_result()
18375 cr->status < 0 ? WLAN_STATUS_UNSPECIFIED_FAILURE : in nl80211_send_connect_result()
18376 cr->status) || in nl80211_send_connect_result()
18377 (cr->status < 0 && in nl80211_send_connect_result()
18380 cr->timeout_reason))) || in nl80211_send_connect_result()
18381 (cr->req_ie && in nl80211_send_connect_result()
18382 nla_put(msg, NL80211_ATTR_REQ_IE, cr->req_ie_len, cr->req_ie)) || in nl80211_send_connect_result()
18383 (cr->resp_ie && in nl80211_send_connect_result()
18384 nla_put(msg, NL80211_ATTR_RESP_IE, cr->resp_ie_len, in nl80211_send_connect_result()
18385 cr->resp_ie)) || in nl80211_send_connect_result()
18386 (cr->fils.update_erp_next_seq_num && in nl80211_send_connect_result()
18388 cr->fils.erp_next_seq_num)) || in nl80211_send_connect_result()
18389 (cr->status == WLAN_STATUS_SUCCESS && in nl80211_send_connect_result()
18390 ((cr->fils.kek && in nl80211_send_connect_result()
18391 nla_put(msg, NL80211_ATTR_FILS_KEK, cr->fils.kek_len, in nl80211_send_connect_result()
18392 cr->fils.kek)) || in nl80211_send_connect_result()
18393 (cr->fils.pmk && in nl80211_send_connect_result()
18394 nla_put(msg, NL80211_ATTR_PMK, cr->fils.pmk_len, cr->fils.pmk)) || in nl80211_send_connect_result()
18395 (cr->fils.pmkid && in nl80211_send_connect_result()
18396 nla_put(msg, NL80211_ATTR_PMKID, WLAN_PMKID_LEN, cr->fils.pmkid))))) in nl80211_send_connect_result()
18399 if (cr->valid_links) { in nl80211_send_connect_result()
18409 const u8 *bssid = cr->links[link].bss ? in nl80211_send_connect_result()
18410 cr->links[link].bss->bssid : in nl80211_send_connect_result()
18411 cr->links[link].bssid; in nl80211_send_connect_result()
18420 (cr->links[link].addr && in nl80211_send_connect_result()
18422 cr->links[link].addr)) || in nl80211_send_connect_result()
18424 cr->links[link].status)) in nl80211_send_connect_result()
18435 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_connect_result()
18451 const u8 *connected_addr = info->ap_mld_addr ? in nl80211_send_roamed()
18452 info->ap_mld_addr : in nl80211_send_roamed()
18453 (info->links[0].bss ? in nl80211_send_roamed()
18454 info->links[0].bss->bssid : in nl80211_send_roamed()
18455 info->links[0].bssid); in nl80211_send_roamed()
18457 if (info->valid_links) { in nl80211_send_roamed()
18463 link_info_size += info->links[link].addr ? in nl80211_send_roamed()
18465 link_info_size += (info->links[link].bssid || in nl80211_send_roamed()
18466 info->links[link].bss) ? in nl80211_send_roamed()
18471 msg = nlmsg_new(100 + info->req_ie_len + info->resp_ie_len + in nl80211_send_roamed()
18472 info->fils.kek_len + info->fils.pmk_len + in nl80211_send_roamed()
18473 (info->fils.pmkid ? WLAN_PMKID_LEN : 0) + in nl80211_send_roamed()
18484 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_roamed()
18485 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_send_roamed()
18487 (info->req_ie && in nl80211_send_roamed()
18488 nla_put(msg, NL80211_ATTR_REQ_IE, info->req_ie_len, in nl80211_send_roamed()
18489 info->req_ie)) || in nl80211_send_roamed()
18490 (info->resp_ie && in nl80211_send_roamed()
18491 nla_put(msg, NL80211_ATTR_RESP_IE, info->resp_ie_len, in nl80211_send_roamed()
18492 info->resp_ie)) || in nl80211_send_roamed()
18493 (info->fils.update_erp_next_seq_num && in nl80211_send_roamed()
18495 info->fils.erp_next_seq_num)) || in nl80211_send_roamed()
18496 (info->fils.kek && in nl80211_send_roamed()
18497 nla_put(msg, NL80211_ATTR_FILS_KEK, info->fils.kek_len, in nl80211_send_roamed()
18498 info->fils.kek)) || in nl80211_send_roamed()
18499 (info->fils.pmk && in nl80211_send_roamed()
18500 nla_put(msg, NL80211_ATTR_PMK, info->fils.pmk_len, info->fils.pmk)) || in nl80211_send_roamed()
18501 (info->fils.pmkid && in nl80211_send_roamed()
18502 nla_put(msg, NL80211_ATTR_PMKID, WLAN_PMKID_LEN, info->fils.pmkid))) in nl80211_send_roamed()
18505 if (info->valid_links) { in nl80211_send_roamed()
18515 const u8 *bssid = info->links[link].bss ? in nl80211_send_roamed()
18516 info->links[link].bss->bssid : in nl80211_send_roamed()
18517 info->links[link].bssid; in nl80211_send_roamed()
18526 (info->links[link].addr && in nl80211_send_roamed()
18528 info->links[link].addr))) in nl80211_send_roamed()
18539 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_roamed()
18564 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_port_authorized()
18565 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_send_port_authorized()
18575 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_port_authorized()
18600 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_disconnected()
18601 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_send_disconnected()
18611 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_disconnected()
18621 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_links_removed()
18622 struct wiphy *wiphy = wdev->wiphy; in cfg80211_links_removed()
18628 lockdep_assert_wiphy(wdev->wiphy); in cfg80211_links_removed()
18631 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_STATION && in cfg80211_links_removed()
18632 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT)) in cfg80211_links_removed()
18635 if (WARN_ON(!wdev->valid_links || !link_mask || in cfg80211_links_removed()
18636 (wdev->valid_links & link_mask) != link_mask || in cfg80211_links_removed()
18637 wdev->valid_links == link_mask)) in cfg80211_links_removed()
18641 wdev->valid_links &= ~link_mask; in cfg80211_links_removed()
18653 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_links_removed()
18654 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) in cfg80211_links_removed()
18680 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_links_removed()
18692 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_mlo_reconf_add_done()
18693 struct wiphy *wiphy = wdev->wiphy; in nl80211_mlo_reconf_add_done()
18697 .buf = data->buf, in nl80211_mlo_reconf_add_done()
18698 .buf_len = data->len, in nl80211_mlo_reconf_add_done()
18699 .uapsd_queues = -1, in nl80211_mlo_reconf_add_done()
18723 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_ibss_bssid()
18724 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_send_ibss_bssid()
18730 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_ibss_bssid()
18742 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_notify_new_peer_candidate()
18743 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_notify_new_peer_candidate()
18747 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_MESH_POINT)) in cfg80211_notify_new_peer_candidate()
18762 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_notify_new_peer_candidate()
18763 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in cfg80211_notify_new_peer_candidate()
18773 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_notify_new_peer_candidate()
18800 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_michael_mic_failure()
18801 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_michael_mic_failure()
18804 (key_id != -1 && in nl80211_michael_mic_failure()
18811 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_michael_mic_failure()
18892 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_remain_on_chan_event()
18893 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, in nl80211_send_remain_on_chan_event()
18894 wdev->netdev->ifindex)) || in nl80211_send_remain_on_chan_event()
18897 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, chan->center_freq) || in nl80211_send_remain_on_chan_event()
18910 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_remain_on_chan_event()
18921 struct wireless_dev *wdev = netdev->ieee80211_ptr; in cfg80211_assoc_comeback()
18922 struct wiphy *wiphy = wdev->wiphy; in cfg80211_assoc_comeback()
18939 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_assoc_comeback()
18940 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in cfg80211_assoc_comeback()
18947 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_assoc_comeback()
18960 struct wiphy *wiphy = wdev->wiphy; in cfg80211_ready_on_channel()
18974 struct wiphy *wiphy = wdev->wiphy; in cfg80211_remain_on_channel_expired()
18987 struct wiphy *wiphy = wdev->wiphy; in cfg80211_tx_mgmt_expired()
18999 struct wiphy *wiphy = dev->ieee80211_ptr->wiphy; in cfg80211_new_sta()
19015 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_new_sta()
19023 struct wiphy *wiphy = dev->ieee80211_ptr->wiphy; in cfg80211_del_sta_sinfo()
19045 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_del_sta_sinfo()
19054 struct wiphy *wiphy = dev->ieee80211_ptr->wiphy; in cfg80211_conn_failed()
19069 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in cfg80211_conn_failed()
19076 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_conn_failed()
19088 struct wireless_dev *wdev = dev->ieee80211_ptr; in __nl80211_unexpected_frame()
19089 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in __nl80211_unexpected_frame()
19092 u32 nlportid = READ_ONCE(wdev->ap_unexpected_nlportid); in __nl80211_unexpected_frame()
19107 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in __nl80211_unexpected_frame()
19108 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in __nl80211_unexpected_frame()
19113 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); in __nl80211_unexpected_frame()
19124 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_rx_spurious_frame()
19129 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP && in cfg80211_rx_spurious_frame()
19130 wdev->iftype != NL80211_IFTYPE_P2P_GO)) { in cfg80211_rx_spurious_frame()
19144 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_rx_unexpected_4addr_frame()
19149 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP && in cfg80211_rx_unexpected_4addr_frame()
19150 wdev->iftype != NL80211_IFTYPE_P2P_GO && in cfg80211_rx_unexpected_4addr_frame()
19151 wdev->iftype != NL80211_IFTYPE_AP_VLAN)) { in cfg80211_rx_unexpected_4addr_frame()
19167 struct net_device *netdev = wdev->netdev; in nl80211_send_mgmt()
19171 msg = nlmsg_new(100 + info->len, gfp); in nl80211_send_mgmt()
19173 return -ENOMEM; in nl80211_send_mgmt()
19178 return -ENOMEM; in nl80211_send_mgmt()
19181 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_mgmt()
19183 netdev->ifindex)) || in nl80211_send_mgmt()
19186 (info->have_link_id && in nl80211_send_mgmt()
19187 nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, info->link_id)) || in nl80211_send_mgmt()
19188 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, KHZ_TO_MHZ(info->freq)) || in nl80211_send_mgmt()
19189 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ_OFFSET, info->freq % 1000) || in nl80211_send_mgmt()
19190 (info->sig_dbm && in nl80211_send_mgmt()
19191 nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, info->sig_dbm)) || in nl80211_send_mgmt()
19192 nla_put(msg, NL80211_ATTR_FRAME, info->len, info->buf) || in nl80211_send_mgmt()
19193 (info->flags && in nl80211_send_mgmt()
19194 nla_put_u32(msg, NL80211_ATTR_RXMGMT_FLAGS, info->flags)) || in nl80211_send_mgmt()
19195 (info->rx_tstamp && nla_put_u64_64bit(msg, in nl80211_send_mgmt()
19197 info->rx_tstamp, in nl80211_send_mgmt()
19199 (info->ack_tstamp && nla_put_u64_64bit(msg, in nl80211_send_mgmt()
19201 info->ack_tstamp, in nl80211_send_mgmt()
19207 return genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); in nl80211_send_mgmt()
19211 return -ENOBUFS; in nl80211_send_mgmt()
19218 struct wiphy *wiphy = wdev->wiphy; in nl80211_frame_tx_status()
19220 struct net_device *netdev = wdev->netdev; in nl80211_frame_tx_status()
19225 trace_cfg80211_mgmt_tx_status(wdev, status->cookie, in nl80211_frame_tx_status()
19226 status->ack); in nl80211_frame_tx_status()
19228 trace_cfg80211_control_port_tx_status(wdev, status->cookie, in nl80211_frame_tx_status()
19229 status->ack); in nl80211_frame_tx_status()
19231 msg = nlmsg_new(100 + status->len, gfp); in nl80211_frame_tx_status()
19241 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_frame_tx_status()
19243 netdev->ifindex)) || in nl80211_frame_tx_status()
19246 nla_put(msg, NL80211_ATTR_FRAME, status->len, status->buf) || in nl80211_frame_tx_status()
19247 nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, status->cookie, in nl80211_frame_tx_status()
19249 (status->ack && nla_put_flag(msg, NL80211_ATTR_ACK)) || in nl80211_frame_tx_status()
19250 (status->tx_tstamp && in nl80211_frame_tx_status()
19252 status->tx_tstamp, NL80211_ATTR_PAD)) || in nl80211_frame_tx_status()
19253 (status->ack_tstamp && in nl80211_frame_tx_status()
19255 status->ack_tstamp, NL80211_ATTR_PAD))) in nl80211_frame_tx_status()
19260 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_frame_tx_status()
19297 struct wireless_dev *wdev = dev->ieee80211_ptr; in __nl80211_rx_control_port()
19298 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in __nl80211_rx_control_port()
19300 const u8 *addr = ehdr->h_source; in __nl80211_rx_control_port()
19301 u16 proto = be16_to_cpu(skb->protocol); in __nl80211_rx_control_port()
19306 u32 nlportid = READ_ONCE(wdev->conn_owner_nlportid); in __nl80211_rx_control_port()
19309 return -ENOENT; in __nl80211_rx_control_port()
19311 msg = nlmsg_new(100 + skb->len, gfp); in __nl80211_rx_control_port()
19313 return -ENOMEM; in __nl80211_rx_control_port()
19318 return -ENOBUFS; in __nl80211_rx_control_port()
19321 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in __nl80211_rx_control_port()
19322 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in __nl80211_rx_control_port()
19333 frame = nla_reserve(msg, NL80211_ATTR_FRAME, skb->len); in __nl80211_rx_control_port()
19337 skb_copy_bits(skb, 0, nla_data(frame), skb->len); in __nl80211_rx_control_port()
19340 return genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); in __nl80211_rx_control_port()
19344 return -ENOBUFS; in __nl80211_rx_control_port()
19363 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_prepare_cqm()
19364 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_prepare_cqm()
19371 cb = (void **)msg->cb; in cfg80211_prepare_cqm()
19379 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_prepare_cqm()
19380 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) in cfg80211_prepare_cqm()
19400 void **cb = (void **)msg->cb; in cfg80211_send_cqm()
19406 memset(msg->cb, 0, sizeof(msg->cb)); in cfg80211_send_cqm()
19408 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_send_cqm()
19416 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_cqm_rssi_notify()
19426 cqm_config = rcu_dereference(wdev->cqm_config); in cfg80211_cqm_rssi_notify()
19428 cqm_config->last_rssi_event_value = rssi_level; in cfg80211_cqm_rssi_notify()
19429 cqm_config->last_rssi_event_type = rssi_event; in cfg80211_cqm_rssi_notify()
19430 wiphy_work_queue(wdev->wiphy, &wdev->cqm_rssi_work); in cfg80211_cqm_rssi_notify()
19446 cqm_config = wiphy_dereference(wdev->wiphy, wdev->cqm_config); in cfg80211_cqm_rssi_notify_work()
19450 if (cqm_config->use_range_api) in cfg80211_cqm_rssi_notify_work()
19451 cfg80211_cqm_rssi_update(rdev, wdev->netdev, cqm_config); in cfg80211_cqm_rssi_notify_work()
19453 rssi_level = cqm_config->last_rssi_event_value; in cfg80211_cqm_rssi_notify_work()
19454 rssi_event = cqm_config->last_rssi_event_type; in cfg80211_cqm_rssi_notify_work()
19456 msg = cfg80211_prepare_cqm(wdev->netdev, NULL, GFP_KERNEL); in cfg80211_cqm_rssi_notify_work()
19562 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_gtk_rekey_notify()
19563 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_gtk_rekey_notify()
19579 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_gtk_rekey_notify()
19590 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_gtk_rekey_notify()
19591 struct wiphy *wiphy = wdev->wiphy; in cfg80211_gtk_rekey_notify()
19618 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_pmksa_candidate_notify()
19619 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex)) in nl80211_pmksa_candidate_notify()
19636 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_pmksa_candidate_notify()
19647 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_pmksa_candidate_notify()
19648 struct wiphy *wiphy = wdev->wiphy; in cfg80211_pmksa_candidate_notify()
19664 struct wireless_dev *wdev = netdev->ieee80211_ptr; in nl80211_ch_switch_notify()
19678 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex)) in nl80211_ch_switch_notify()
19681 if (wdev->valid_links && in nl80211_ch_switch_notify()
19698 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_ch_switch_notify()
19710 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_ch_switch_notify()
19711 struct wiphy *wiphy = wdev->wiphy; in cfg80211_ch_switch_notify()
19714 lockdep_assert_wiphy(wdev->wiphy); in cfg80211_ch_switch_notify()
19719 switch (wdev->iftype) { in cfg80211_ch_switch_notify()
19722 if (!WARN_ON(!wdev->links[link_id].client.current_bss)) in cfg80211_ch_switch_notify()
19724 chandef->chan); in cfg80211_ch_switch_notify()
19727 wdev->u.mesh.chandef = *chandef; in cfg80211_ch_switch_notify()
19728 wdev->u.mesh.preset_chandef = *chandef; in cfg80211_ch_switch_notify()
19732 wdev->links[link_id].ap.chandef = *chandef; in cfg80211_ch_switch_notify()
19735 wdev->u.ibss.chandef = *chandef; in cfg80211_ch_switch_notify()
19755 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_ch_switch_started_notify()
19756 struct wiphy *wiphy = wdev->wiphy; in cfg80211_ch_switch_started_notify()
19759 lockdep_assert_wiphy(wdev->wiphy); in cfg80211_ch_switch_started_notify()
19775 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_bss_color_notify()
19776 struct wiphy *wiphy = wdev->wiphy; in cfg80211_bss_color_notify()
19781 lockdep_assert_wiphy(wdev->wiphy); in cfg80211_bss_color_notify()
19787 return -ENOMEM; in cfg80211_bss_color_notify()
19793 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) in cfg80211_bss_color_notify()
19796 if (wdev->valid_links && in cfg80211_bss_color_notify()
19811 return genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), in cfg80211_bss_color_notify()
19816 return -EINVAL; in cfg80211_bss_color_notify()
19839 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx)) in nl80211_radar_notify()
19844 struct wireless_dev *wdev = netdev->ieee80211_ptr; in nl80211_radar_notify()
19846 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_radar_notify()
19860 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_radar_notify()
19873 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_sta_opmode_change_notify()
19874 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_sta_opmode_change_notify()
19890 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx)) in cfg80211_sta_opmode_change_notify()
19893 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) in cfg80211_sta_opmode_change_notify()
19899 if ((sta_opmode->changed & STA_OPMODE_SMPS_MODE_CHANGED) && in cfg80211_sta_opmode_change_notify()
19900 nla_put_u8(msg, NL80211_ATTR_SMPS_MODE, sta_opmode->smps_mode)) in cfg80211_sta_opmode_change_notify()
19903 if ((sta_opmode->changed & STA_OPMODE_MAX_BW_CHANGED) && in cfg80211_sta_opmode_change_notify()
19904 nla_put_u32(msg, NL80211_ATTR_CHANNEL_WIDTH, sta_opmode->bw)) in cfg80211_sta_opmode_change_notify()
19907 if ((sta_opmode->changed & STA_OPMODE_N_SS_CHANGED) && in cfg80211_sta_opmode_change_notify()
19908 nla_put_u8(msg, NL80211_ATTR_NSS, sta_opmode->rx_nss)) in cfg80211_sta_opmode_change_notify()
19913 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_sta_opmode_change_notify()
19927 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_probe_status()
19928 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_probe_status()
19945 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_probe_status()
19946 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in cfg80211_probe_status()
19957 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_probe_status()
19976 spin_lock_bh(&rdev->beacon_registrations_lock); in cfg80211_report_obss_beacon_khz()
19977 list_for_each_entry(reg, &rdev->beacon_registrations, list) { in cfg80211_report_obss_beacon_khz()
19980 spin_unlock_bh(&rdev->beacon_registrations_lock); in cfg80211_report_obss_beacon_khz()
19988 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_report_obss_beacon_khz()
20001 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, reg->nlportid); in cfg80211_report_obss_beacon_khz()
20003 spin_unlock_bh(&rdev->beacon_registrations_lock); in cfg80211_report_obss_beacon_khz()
20007 spin_unlock_bh(&rdev->beacon_registrations_lock); in cfg80211_report_obss_beacon_khz()
20016 struct cfg80211_wowlan_nd_info *nd = wakeup->net_detect; in cfg80211_net_detect_results()
20023 return -EMSGSIZE; in cfg80211_net_detect_results()
20025 for (i = 0; i < nd->n_matches; i++) { in cfg80211_net_detect_results()
20026 struct cfg80211_wowlan_nd_match *match = nd->matches[i]; in cfg80211_net_detect_results()
20039 if (nla_put(msg, NL80211_ATTR_SSID, match->ssid.ssid_len, in cfg80211_net_detect_results()
20040 match->ssid.ssid)) { in cfg80211_net_detect_results()
20045 if (match->n_channels) { in cfg80211_net_detect_results()
20053 for (j = 0; j < match->n_channels; j++) { in cfg80211_net_detect_results()
20054 if (nla_put_u32(msg, j, match->channels[j])) { in cfg80211_net_detect_results()
20076 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_report_wowlan_wakeup()
20081 trace_cfg80211_report_wowlan_wakeup(wdev->wiphy, wdev, wakeup); in cfg80211_report_wowlan_wakeup()
20084 size += wakeup->packet_present_len; in cfg80211_report_wowlan_wakeup()
20094 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_report_wowlan_wakeup()
20099 if (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, in cfg80211_report_wowlan_wakeup()
20100 wdev->netdev->ifindex)) in cfg80211_report_wowlan_wakeup()
20111 if (wakeup->disconnect && in cfg80211_report_wowlan_wakeup()
20114 if (wakeup->magic_pkt && in cfg80211_report_wowlan_wakeup()
20117 if (wakeup->gtk_rekey_failure && in cfg80211_report_wowlan_wakeup()
20120 if (wakeup->eap_identity_req && in cfg80211_report_wowlan_wakeup()
20123 if (wakeup->four_way_handshake && in cfg80211_report_wowlan_wakeup()
20126 if (wakeup->rfkill_release && in cfg80211_report_wowlan_wakeup()
20130 if (wakeup->pattern_idx >= 0 && in cfg80211_report_wowlan_wakeup()
20132 wakeup->pattern_idx)) in cfg80211_report_wowlan_wakeup()
20135 if (wakeup->tcp_match && in cfg80211_report_wowlan_wakeup()
20139 if (wakeup->tcp_connlost && in cfg80211_report_wowlan_wakeup()
20143 if (wakeup->tcp_nomoretokens && in cfg80211_report_wowlan_wakeup()
20148 if (wakeup->unprot_deauth_disassoc && in cfg80211_report_wowlan_wakeup()
20153 if (wakeup->packet) { in cfg80211_report_wowlan_wakeup()
20157 if (!wakeup->packet_80211) { in cfg80211_report_wowlan_wakeup()
20164 if (wakeup->packet_len && in cfg80211_report_wowlan_wakeup()
20165 nla_put_u32(msg, len_attr, wakeup->packet_len)) in cfg80211_report_wowlan_wakeup()
20168 if (nla_put(msg, pkt_attr, wakeup->packet_present_len, in cfg80211_report_wowlan_wakeup()
20169 wakeup->packet)) in cfg80211_report_wowlan_wakeup()
20173 if (wakeup->net_detect && in cfg80211_report_wowlan_wakeup()
20182 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_report_wowlan_wakeup()
20196 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_tdls_oper_request()
20197 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_tdls_oper_request()
20201 trace_cfg80211_tdls_oper_request(wdev->wiphy, dev, peer, oper, in cfg80211_tdls_oper_request()
20214 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_tdls_oper_request()
20215 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in cfg80211_tdls_oper_request()
20224 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_tdls_oper_request()
20242 if (state != NETLINK_URELEASE || notify->protocol != NETLINK_GENERIC) in nl80211_netlink_notify()
20251 &rdev->sched_scan_req_list, in nl80211_netlink_notify()
20253 if (sched_scan_req->owner_nlportid == notify->portid) { in nl80211_netlink_notify()
20254 sched_scan_req->nl_owner_dead = true; in nl80211_netlink_notify()
20255 wiphy_work_queue(&rdev->wiphy, in nl80211_netlink_notify()
20256 &rdev->sched_scan_stop_wk); in nl80211_netlink_notify()
20260 list_for_each_entry_rcu(wdev, &rdev->wiphy.wdev_list, list) { in nl80211_netlink_notify()
20261 cfg80211_mlme_unregister_socket(wdev, notify->portid); in nl80211_netlink_notify()
20263 if (wdev->owner_nlportid == notify->portid) { in nl80211_netlink_notify()
20264 wdev->nl_owner_dead = true; in nl80211_netlink_notify()
20265 schedule_work(&rdev->destroy_work); in nl80211_netlink_notify()
20266 } else if (wdev->conn_owner_nlportid == notify->portid) { in nl80211_netlink_notify()
20267 schedule_work(&wdev->disconnect_wk); in nl80211_netlink_notify()
20270 cfg80211_release_pmsr(wdev, notify->portid); in nl80211_netlink_notify()
20273 spin_lock_bh(&rdev->beacon_registrations_lock); in nl80211_netlink_notify()
20274 list_for_each_entry_safe(reg, tmp, &rdev->beacon_registrations, in nl80211_netlink_notify()
20276 if (reg->nlportid == notify->portid) { in nl80211_netlink_notify()
20277 list_del(®->list); in nl80211_netlink_notify()
20282 spin_unlock_bh(&rdev->beacon_registrations_lock); in nl80211_netlink_notify()
20291 regulatory_netlink_notify(notify->portid); in nl80211_netlink_notify()
20302 struct wiphy *wiphy = netdev->ieee80211_ptr->wiphy; in cfg80211_ft_event()
20309 if (!ft_event->target_ap) in cfg80211_ft_event()
20312 msg = nlmsg_new(100 + ft_event->ies_len + ft_event->ric_ies_len, in cfg80211_ft_event()
20321 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_ft_event()
20322 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in cfg80211_ft_event()
20323 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, ft_event->target_ap)) in cfg80211_ft_event()
20326 if (ft_event->ies && in cfg80211_ft_event()
20327 nla_put(msg, NL80211_ATTR_IE, ft_event->ies_len, ft_event->ies)) in cfg80211_ft_event()
20329 if (ft_event->ric_ies && in cfg80211_ft_event()
20330 nla_put(msg, NL80211_ATTR_IE_RIC, ft_event->ric_ies_len, in cfg80211_ft_event()
20331 ft_event->ric_ies)) in cfg80211_ft_event()
20336 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_ft_event()
20351 rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_crit_proto_stopped()
20352 if (!rdev->crit_proto_nlportid) in cfg80211_crit_proto_stopped()
20355 nlportid = rdev->crit_proto_nlportid; in cfg80211_crit_proto_stopped()
20356 rdev->crit_proto_nlportid = 0; in cfg80211_crit_proto_stopped()
20366 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_crit_proto_stopped()
20373 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); in cfg80211_crit_proto_stopped()
20383 struct wiphy *wiphy = wdev->wiphy; in nl80211_send_ap_stopped()
20396 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_ap_stopped()
20397 nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex) || in nl80211_send_ap_stopped()
20400 (wdev->valid_links && in nl80211_send_ap_stopped()
20417 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_external_auth_request()
20418 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_external_auth_request()
20422 if (!wdev->conn_owner_nlportid) in cfg80211_external_auth_request()
20423 return -EINVAL; in cfg80211_external_auth_request()
20427 return -ENOMEM; in cfg80211_external_auth_request()
20433 /* Some historical mistakes in drivers <-> userspace interface (notably in cfg80211_external_auth_request()
20434 * between drivers and wpa_supplicant) led to a big-endian conversion in cfg80211_external_auth_request()
20438 * in big-endian. Note that newer wpa_supplicant will also detect this in cfg80211_external_auth_request()
20441 if (params->key_mgmt_suite == WLAN_AKM_SUITE_SAE) { in cfg80211_external_auth_request()
20447 params->key_mgmt_suite)) in cfg80211_external_auth_request()
20451 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_external_auth_request()
20452 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in cfg80211_external_auth_request()
20454 params->action) || in cfg80211_external_auth_request()
20455 nla_put(msg, NL80211_ATTR_BSSID, ETH_ALEN, params->bssid) || in cfg80211_external_auth_request()
20456 nla_put(msg, NL80211_ATTR_SSID, params->ssid.ssid_len, in cfg80211_external_auth_request()
20457 params->ssid.ssid) || in cfg80211_external_auth_request()
20458 (!is_zero_ether_addr(params->mld_addr) && in cfg80211_external_auth_request()
20459 nla_put(msg, NL80211_ATTR_MLD_ADDR, ETH_ALEN, params->mld_addr))) in cfg80211_external_auth_request()
20463 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, in cfg80211_external_auth_request()
20464 wdev->conn_owner_nlportid); in cfg80211_external_auth_request()
20469 return -ENOBUFS; in cfg80211_external_auth_request()
20477 struct wiphy *wiphy = netdev->ieee80211_ptr->wiphy; in cfg80211_update_owe_info_event()
20492 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_update_owe_info_event()
20493 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in cfg80211_update_owe_info_event()
20494 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, owe_info->peer)) in cfg80211_update_owe_info_event()
20497 if (!owe_info->ie_len || in cfg80211_update_owe_info_event()
20498 nla_put(msg, NL80211_ATTR_IE, owe_info->ie_len, owe_info->ie)) in cfg80211_update_owe_info_event()
20501 if (owe_info->assoc_link_id != -1) { in cfg80211_update_owe_info_event()
20503 owe_info->assoc_link_id)) in cfg80211_update_owe_info_event()
20506 if (!is_zero_ether_addr(owe_info->peer_mld_addr) && in cfg80211_update_owe_info_event()
20508 owe_info->peer_mld_addr)) in cfg80211_update_owe_info_event()
20514 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_update_owe_info_event()
20526 struct wiphy *wiphy = wdev->wiphy; in cfg80211_schedule_channels_check()
20529 if (wdev->iftype == NL80211_IFTYPE_STATION && in cfg80211_schedule_channels_check()
20533 wiphy->regulatory_flags & REGULATORY_ENABLE_RELAX_NO_IR))) in cfg80211_schedule_channels_check()
20540 struct wireless_dev *wdev = netdev->ieee80211_ptr; in cfg80211_epcs_changed()
20541 struct wiphy *wiphy = wdev->wiphy; in cfg80211_epcs_changed()
20562 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_epcs_changed()