Lines Matching +full:tx +full:- +full:termination +full:- +full:fix

1 // SPDX-License-Identifier: GPL-2.0-only
3 * This is the new netlink-based wireless configuration interface.
5 * Copyright 2006-2010 Johannes Berg <johannes@sipsolutions.net>
6 * Copyright 2013-2014 Intel Mobile Communications GmbH
7 * Copyright 2015-2017 Intel Deutschland GmbH
8 * Copyright (C) 2018-2024 Intel Corporation
32 #include "rdev-ops.h"
50 NL80211_MCGRP_TESTMODE /* keep last - ifdef! */
74 int wiphy_idx = -1; in __cfg80211_wdev_from_attrs()
75 int ifidx = -1; in __cfg80211_wdev_from_attrs()
78 return ERR_PTR(-EINVAL); in __cfg80211_wdev_from_attrs()
90 lockdep_assert_held(&rdev->wiphy.mtx); in __cfg80211_wdev_from_attrs()
92 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) { in __cfg80211_wdev_from_attrs()
93 if (have_ifidx && wdev->netdev && in __cfg80211_wdev_from_attrs()
94 wdev->netdev->ifindex == ifidx) { in __cfg80211_wdev_from_attrs()
98 if (have_wdev_id && wdev->identifier == (u32)wdev_id) { in __cfg80211_wdev_from_attrs()
104 return result ?: ERR_PTR(-ENODEV); in __cfg80211_wdev_from_attrs()
112 if (wiphy_net(&rdev->wiphy) != netns) in __cfg80211_wdev_from_attrs()
115 if (have_wdev_id && rdev->wiphy_idx != wiphy_idx) in __cfg80211_wdev_from_attrs()
118 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) { in __cfg80211_wdev_from_attrs()
119 if (have_ifidx && wdev->netdev && in __cfg80211_wdev_from_attrs()
120 wdev->netdev->ifindex == ifidx) { in __cfg80211_wdev_from_attrs()
124 if (have_wdev_id && wdev->identifier == (u32)wdev_id) { in __cfg80211_wdev_from_attrs()
136 return ERR_PTR(-ENODEV); in __cfg80211_wdev_from_attrs()
150 return ERR_PTR(-EINVAL); in __cfg80211_rdev_from_attrs()
164 list_for_each_entry(wdev, &tmp->wiphy.wdev_list, list) { in __cfg80211_rdev_from_attrs()
165 if (wdev->identifier != (u32)wdev_id) in __cfg80211_rdev_from_attrs()
175 return ERR_PTR(-EINVAL); in __cfg80211_rdev_from_attrs()
185 if (netdev->ieee80211_ptr) in __cfg80211_rdev_from_attrs()
187 netdev->ieee80211_ptr->wiphy); in __cfg80211_rdev_from_attrs()
191 /* not wireless device -- return error */ in __cfg80211_rdev_from_attrs()
193 return ERR_PTR(-EINVAL); in __cfg80211_rdev_from_attrs()
195 /* mismatch -- return error */ in __cfg80211_rdev_from_attrs()
197 return ERR_PTR(-EINVAL); in __cfg80211_rdev_from_attrs()
204 return ERR_PTR(-ENODEV); in __cfg80211_rdev_from_attrs()
206 if (netns != wiphy_net(&rdev->wiphy)) in __cfg80211_rdev_from_attrs()
207 return ERR_PTR(-ENODEV); in __cfg80211_rdev_from_attrs()
222 return __cfg80211_rdev_from_attrs(netns, info->attrs); in cfg80211_get_dev_from_info()
238 s1g_bcn = ieee80211_is_s1g_beacon(mgmt->frame_control); in validate_beacon_head()
252 if (ieee80211_hdrlen(mgmt->frame_control) != hdrlen) in validate_beacon_head()
256 len -= fixedlen; in validate_beacon_head()
267 return -EINVAL; in validate_beacon_head()
285 return -EINVAL; in validate_ie_attr()
292 return -EINVAL; in validate_he_capa()
478 .len = 20-1 },
504 [NL80211_ATTR_IFNAME] = { .type = NLA_NUL_STRING, .len = IFNAMSIZ-1 },
534 NLA_POLICY_MAX(NLA_U8, NUM_NL80211_PLINK_ACTIONS - 1),
546 /* allow 3 for NUL-termination, we used to declare this NLA_STRING */
617 NLA_POLICY_MAX(NLA_U8, NUM_NL80211_PLINK_STATES - 1),
713 [NL80211_ATTR_TSID] = NLA_POLICY_MAX(NLA_U8, IEEE80211_NUM_TIDS - 1),
715 NLA_POLICY_MAX(NLA_U8, IEEE80211_NUM_UPS - 1),
727 NLA_POLICY_MAX(NLA_U8, NUM_NL80211_P2P_PS_STATUS - 1),
774 [NL80211_ATTR_VLAN_ID] = NLA_POLICY_RANGE(NLA_U16, 1, VLAN_N_VID - 2),
842 [NL80211_KEY_TYPE] = NLA_POLICY_MAX(NLA_U32, NUM_NL80211_KEYTYPES - 1),
988 if (!cb->args[0]) { in nl80211_prepare_wdev_dump()
995 return -ENOMEM; in nl80211_prepare_wdev_dump()
999 err = nlmsg_parse_deprecated(cb->nlh, in nl80211_prepare_wdev_dump()
1009 *wdev = __cfg80211_wdev_from_attrs(NULL, sock_net(cb->skb->sk), in nl80211_prepare_wdev_dump()
1016 *rdev = wiphy_to_rdev((*wdev)->wiphy); in nl80211_prepare_wdev_dump()
1017 mutex_lock(&(*rdev)->wiphy.mtx); in nl80211_prepare_wdev_dump()
1019 /* 0 is the first index - add 1 to parse only once */ in nl80211_prepare_wdev_dump()
1020 cb->args[0] = (*rdev)->wiphy_idx + 1; in nl80211_prepare_wdev_dump()
1021 cb->args[1] = (*wdev)->identifier; in nl80211_prepare_wdev_dump()
1028 wiphy = wiphy_idx_to_wiphy(cb->args[0] - 1); in nl80211_prepare_wdev_dump()
1031 return -ENODEV; in nl80211_prepare_wdev_dump()
1036 list_for_each_entry(tmp, &(*rdev)->wiphy.wdev_list, list) { in nl80211_prepare_wdev_dump()
1037 if (tmp->identifier == cb->args[1]) { in nl80211_prepare_wdev_dump()
1045 return -ENODEV; in nl80211_prepare_wdev_dump()
1047 mutex_lock(&(*rdev)->wiphy.mtx); in nl80211_prepare_wdev_dump()
1079 rule->wmm_rule.client[j].cw_min) || in nl80211_msg_put_wmm_rules()
1081 rule->wmm_rule.client[j].cw_max) || in nl80211_msg_put_wmm_rules()
1083 rule->wmm_rule.client[j].aifsn) || in nl80211_msg_put_wmm_rules()
1085 rule->wmm_rule.client[j].cot)) in nl80211_msg_put_wmm_rules()
1095 return -ENOBUFS; in nl80211_msg_put_wmm_rules()
1103 * list to protect old user-space tools from breaking in nl80211_msg_put_channel()
1105 if (!large && chan->flags & in nl80211_msg_put_channel()
1108 if (!large && chan->freq_offset) in nl80211_msg_put_channel()
1112 chan->center_freq)) in nl80211_msg_put_channel()
1115 if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_OFFSET, chan->freq_offset)) in nl80211_msg_put_channel()
1118 if ((chan->flags & IEEE80211_CHAN_PSD) && in nl80211_msg_put_channel()
1119 nla_put_s8(msg, NL80211_FREQUENCY_ATTR_PSD, chan->psd)) in nl80211_msg_put_channel()
1122 if ((chan->flags & IEEE80211_CHAN_DISABLED) && in nl80211_msg_put_channel()
1125 if (chan->flags & IEEE80211_CHAN_NO_IR) { in nl80211_msg_put_channel()
1131 if (chan->flags & IEEE80211_CHAN_RADAR) { in nl80211_msg_put_channel()
1137 time = elapsed_jiffies_msecs(chan->dfs_state_entered); in nl80211_msg_put_channel()
1140 chan->dfs_state)) in nl80211_msg_put_channel()
1147 chan->dfs_cac_ms)) in nl80211_msg_put_channel()
1153 if ((chan->flags & IEEE80211_CHAN_NO_HT40MINUS) && in nl80211_msg_put_channel()
1156 if ((chan->flags & IEEE80211_CHAN_NO_HT40PLUS) && in nl80211_msg_put_channel()
1159 if ((chan->flags & IEEE80211_CHAN_NO_80MHZ) && in nl80211_msg_put_channel()
1162 if ((chan->flags & IEEE80211_CHAN_NO_160MHZ) && in nl80211_msg_put_channel()
1165 if ((chan->flags & IEEE80211_CHAN_INDOOR_ONLY) && in nl80211_msg_put_channel()
1168 if ((chan->flags & IEEE80211_CHAN_IR_CONCURRENT) && in nl80211_msg_put_channel()
1171 if ((chan->flags & IEEE80211_CHAN_NO_20MHZ) && in nl80211_msg_put_channel()
1174 if ((chan->flags & IEEE80211_CHAN_NO_10MHZ) && in nl80211_msg_put_channel()
1177 if ((chan->flags & IEEE80211_CHAN_NO_HE) && in nl80211_msg_put_channel()
1180 if ((chan->flags & IEEE80211_CHAN_1MHZ) && in nl80211_msg_put_channel()
1183 if ((chan->flags & IEEE80211_CHAN_2MHZ) && in nl80211_msg_put_channel()
1186 if ((chan->flags & IEEE80211_CHAN_4MHZ) && in nl80211_msg_put_channel()
1189 if ((chan->flags & IEEE80211_CHAN_8MHZ) && in nl80211_msg_put_channel()
1192 if ((chan->flags & IEEE80211_CHAN_16MHZ) && in nl80211_msg_put_channel()
1195 if ((chan->flags & IEEE80211_CHAN_NO_320MHZ) && in nl80211_msg_put_channel()
1198 if ((chan->flags & IEEE80211_CHAN_NO_EHT) && in nl80211_msg_put_channel()
1201 if ((chan->flags & IEEE80211_CHAN_DFS_CONCURRENT) && in nl80211_msg_put_channel()
1204 if ((chan->flags & IEEE80211_CHAN_NO_6GHZ_VLP_CLIENT) && in nl80211_msg_put_channel()
1207 if ((chan->flags & IEEE80211_CHAN_NO_6GHZ_AFC_CLIENT) && in nl80211_msg_put_channel()
1210 if ((chan->flags & IEEE80211_CHAN_CAN_MONITOR) && in nl80211_msg_put_channel()
1213 if ((chan->flags & IEEE80211_CHAN_ALLOW_6GHZ_VLP_AP) && in nl80211_msg_put_channel()
1219 DBM_TO_MBM(chan->max_power))) in nl80211_msg_put_channel()
1224 freq_reg_info(wiphy, MHZ_TO_KHZ(chan->center_freq)); in nl80211_msg_put_channel()
1226 if (!IS_ERR_OR_NULL(rule) && rule->has_wmm) { in nl80211_msg_put_channel()
1235 return -ENOBUFS; in nl80211_msg_put_channel()
1245 if (txqstats->filled & BIT(NL80211_TXQ_STATS_ ## attr) && \ in nl80211_put_txq_stats()
1246 nla_put_u32(msg, NL80211_TXQ_STATS_ ## attr, txqstats->memb)) \ in nl80211_put_txq_stats()
1274 * nl80211_link_id - return link ID
1299 return -1; in nl80211_link_id_or_invalid()
1318 info->extack); in nl80211_parse_key_new()
1322 k->def = !!tb[NL80211_KEY_DEFAULT]; in nl80211_parse_key_new()
1323 k->defmgmt = !!tb[NL80211_KEY_DEFAULT_MGMT]; in nl80211_parse_key_new()
1324 k->defbeacon = !!tb[NL80211_KEY_DEFAULT_BEACON]; in nl80211_parse_key_new()
1326 if (k->def) { in nl80211_parse_key_new()
1327 k->def_uni = true; in nl80211_parse_key_new()
1328 k->def_multi = true; in nl80211_parse_key_new()
1330 if (k->defmgmt || k->defbeacon) in nl80211_parse_key_new()
1331 k->def_multi = true; in nl80211_parse_key_new()
1334 k->idx = nla_get_u8(tb[NL80211_KEY_IDX]); in nl80211_parse_key_new()
1337 k->p.key = nla_data(tb[NL80211_KEY_DATA]); in nl80211_parse_key_new()
1338 k->p.key_len = nla_len(tb[NL80211_KEY_DATA]); in nl80211_parse_key_new()
1342 k->p.seq = nla_data(tb[NL80211_KEY_SEQ]); in nl80211_parse_key_new()
1343 k->p.seq_len = nla_len(tb[NL80211_KEY_SEQ]); in nl80211_parse_key_new()
1347 k->p.cipher = nla_get_u32(tb[NL80211_KEY_CIPHER]); in nl80211_parse_key_new()
1350 k->type = nla_get_u32(tb[NL80211_KEY_TYPE]); in nl80211_parse_key_new()
1356 NUM_NL80211_KEY_DEFAULT_TYPES - 1, in nl80211_parse_key_new()
1359 info->extack); in nl80211_parse_key_new()
1363 k->def_uni = kdt[NL80211_KEY_DEFAULT_TYPE_UNICAST]; in nl80211_parse_key_new()
1364 k->def_multi = kdt[NL80211_KEY_DEFAULT_TYPE_MULTICAST]; in nl80211_parse_key_new()
1368 k->p.mode = nla_get_u8(tb[NL80211_KEY_MODE]); in nl80211_parse_key_new()
1375 if (info->attrs[NL80211_ATTR_KEY_DATA]) { in nl80211_parse_key_old()
1376 k->p.key = nla_data(info->attrs[NL80211_ATTR_KEY_DATA]); in nl80211_parse_key_old()
1377 k->p.key_len = nla_len(info->attrs[NL80211_ATTR_KEY_DATA]); in nl80211_parse_key_old()
1380 if (info->attrs[NL80211_ATTR_KEY_SEQ]) { in nl80211_parse_key_old()
1381 k->p.seq = nla_data(info->attrs[NL80211_ATTR_KEY_SEQ]); in nl80211_parse_key_old()
1382 k->p.seq_len = nla_len(info->attrs[NL80211_ATTR_KEY_SEQ]); in nl80211_parse_key_old()
1385 if (info->attrs[NL80211_ATTR_KEY_IDX]) in nl80211_parse_key_old()
1386 k->idx = nla_get_u8(info->attrs[NL80211_ATTR_KEY_IDX]); in nl80211_parse_key_old()
1388 if (info->attrs[NL80211_ATTR_KEY_CIPHER]) in nl80211_parse_key_old()
1389 k->p.cipher = nla_get_u32(info->attrs[NL80211_ATTR_KEY_CIPHER]); in nl80211_parse_key_old()
1391 k->def = !!info->attrs[NL80211_ATTR_KEY_DEFAULT]; in nl80211_parse_key_old()
1392 k->defmgmt = !!info->attrs[NL80211_ATTR_KEY_DEFAULT_MGMT]; in nl80211_parse_key_old()
1394 if (k->def) { in nl80211_parse_key_old()
1395 k->def_uni = true; in nl80211_parse_key_old()
1396 k->def_multi = true; in nl80211_parse_key_old()
1398 if (k->defmgmt) in nl80211_parse_key_old()
1399 k->def_multi = true; in nl80211_parse_key_old()
1401 if (info->attrs[NL80211_ATTR_KEY_TYPE]) in nl80211_parse_key_old()
1402 k->type = nla_get_u32(info->attrs[NL80211_ATTR_KEY_TYPE]); in nl80211_parse_key_old()
1404 if (info->attrs[NL80211_ATTR_KEY_DEFAULT_TYPES]) { in nl80211_parse_key_old()
1407 NUM_NL80211_KEY_DEFAULT_TYPES - 1, in nl80211_parse_key_old()
1408 info->attrs[NL80211_ATTR_KEY_DEFAULT_TYPES], in nl80211_parse_key_old()
1410 info->extack); in nl80211_parse_key_old()
1414 k->def_uni = kdt[NL80211_KEY_DEFAULT_TYPE_UNICAST]; in nl80211_parse_key_old()
1415 k->def_multi = kdt[NL80211_KEY_DEFAULT_TYPE_MULTICAST]; in nl80211_parse_key_old()
1426 k->idx = -1; in nl80211_parse_key()
1427 k->type = -1; in nl80211_parse_key()
1429 if (info->attrs[NL80211_ATTR_KEY]) in nl80211_parse_key()
1430 err = nl80211_parse_key_new(info, info->attrs[NL80211_ATTR_KEY], k); in nl80211_parse_key()
1437 if ((k->def ? 1 : 0) + (k->defmgmt ? 1 : 0) + in nl80211_parse_key()
1438 (k->defbeacon ? 1 : 0) > 1) { in nl80211_parse_key()
1441 return -EINVAL; in nl80211_parse_key()
1444 if (k->defmgmt || k->defbeacon) { in nl80211_parse_key()
1445 if (k->def_uni || !k->def_multi) { in nl80211_parse_key()
1448 return -EINVAL; in nl80211_parse_key()
1452 if (k->idx != -1) { in nl80211_parse_key()
1453 if (k->defmgmt) { in nl80211_parse_key()
1454 if (k->idx < 4 || k->idx > 5) { in nl80211_parse_key()
1457 return -EINVAL; in nl80211_parse_key()
1459 } else if (k->defbeacon) { in nl80211_parse_key()
1460 if (k->idx < 6 || k->idx > 7) { in nl80211_parse_key()
1463 return -EINVAL; in nl80211_parse_key()
1465 } else if (k->def) { in nl80211_parse_key()
1466 if (k->idx < 0 || k->idx > 3) { in nl80211_parse_key()
1467 GENL_SET_ERR_MSG(info, "def key idx not 0-3"); in nl80211_parse_key()
1468 return -EINVAL; in nl80211_parse_key()
1471 if (k->idx < 0 || k->idx > 7) { in nl80211_parse_key()
1472 GENL_SET_ERR_MSG(info, "key idx not 0-7"); in nl80211_parse_key()
1473 return -EINVAL; in nl80211_parse_key()
1485 struct nlattr *keys = info->attrs[NL80211_ATTR_KEYS]; in nl80211_parse_connkeys()
1502 return ERR_PTR(-ENOMEM); in nl80211_parse_connkeys()
1504 result->def = -1; in nl80211_parse_connkeys()
1508 parse.idx = -1; in nl80211_parse_connkeys()
1513 err = -EINVAL; in nl80211_parse_connkeys()
1517 GENL_SET_ERR_MSG(info, "key index out of range [0-3]"); in nl80211_parse_connkeys()
1527 result->def = parse.idx; in nl80211_parse_connkeys()
1539 err = -EINVAL; in nl80211_parse_connkeys()
1542 result->params[parse.idx].cipher = parse.p.cipher; in nl80211_parse_connkeys()
1543 result->params[parse.idx].key_len = parse.p.key_len; in nl80211_parse_connkeys()
1544 result->params[parse.idx].key = result->data[parse.idx]; in nl80211_parse_connkeys()
1545 memcpy(result->data[parse.idx], parse.p.key, parse.p.key_len); in nl80211_parse_connkeys()
1552 if (result->def < 0) { in nl80211_parse_connkeys()
1553 err = -EINVAL; in nl80211_parse_connkeys()
1554 GENL_SET_ERR_MSG(info, "need a default/TX key"); in nl80211_parse_connkeys()
1566 lockdep_assert_wiphy(wdev->wiphy); in nl80211_key_allowed()
1568 switch (wdev->iftype) { in nl80211_key_allowed()
1575 if (wdev->u.ibss.current_bss) in nl80211_key_allowed()
1577 return -ENOLINK; in nl80211_key_allowed()
1580 if (wdev->connected) in nl80211_key_allowed()
1582 return -ENOLINK; in nl80211_key_allowed()
1584 if (wiphy_ext_feature_isset(wdev->wiphy, in nl80211_key_allowed()
1587 return -EINVAL; in nl80211_key_allowed()
1594 return -EINVAL; in nl80211_key_allowed()
1606 if (!chan || chan->flags & IEEE80211_CHAN_DISABLED) in nl80211_get_valid_chan()
1631 return -ENOBUFS; in nl80211_put_iftypes()
1650 for (i = 0; i < c->n_limits; i++) { in nl80211_put_ifcomb_data()
1656 if (nla_put_u32(msg, NL80211_IFACE_LIMIT_MAX, c->limits[i].max)) in nl80211_put_ifcomb_data()
1659 c->limits[i].types)) in nl80211_put_ifcomb_data()
1666 if (c->beacon_int_infra_match && in nl80211_put_ifcomb_data()
1670 c->num_different_channels) || in nl80211_put_ifcomb_data()
1672 c->max_interfaces)) in nl80211_put_ifcomb_data()
1676 c->radar_detect_widths) || in nl80211_put_ifcomb_data()
1678 c->radar_detect_regions))) in nl80211_put_ifcomb_data()
1680 if (c->beacon_int_min_gcd && in nl80211_put_ifcomb_data()
1682 c->beacon_int_min_gcd)) in nl80211_put_ifcomb_data()
1689 return -ENOBUFS; in nl80211_put_ifcomb_data()
1706 c = wiphy->radio[0].iface_combinations; in nl80211_put_iface_combinations()
1707 n = wiphy->radio[0].n_iface_combinations; in nl80211_put_iface_combinations()
1709 c = wiphy->iface_combinations; in nl80211_put_iface_combinations()
1710 n = wiphy->n_iface_combinations; in nl80211_put_iface_combinations()
1720 return -ENOBUFS; in nl80211_put_iface_combinations()
1727 const struct wiphy_wowlan_tcp_support *tcp = rdev->wiphy.wowlan->tcp; in nl80211_send_wowlan_tcp_caps()
1736 return -ENOBUFS; in nl80211_send_wowlan_tcp_caps()
1739 tcp->data_payload_max)) in nl80211_send_wowlan_tcp_caps()
1740 return -ENOBUFS; in nl80211_send_wowlan_tcp_caps()
1743 tcp->data_payload_max)) in nl80211_send_wowlan_tcp_caps()
1744 return -ENOBUFS; in nl80211_send_wowlan_tcp_caps()
1746 if (tcp->seq && nla_put_flag(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ)) in nl80211_send_wowlan_tcp_caps()
1747 return -ENOBUFS; in nl80211_send_wowlan_tcp_caps()
1749 if (tcp->tok && nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN, in nl80211_send_wowlan_tcp_caps()
1750 sizeof(*tcp->tok), tcp->tok)) in nl80211_send_wowlan_tcp_caps()
1751 return -ENOBUFS; in nl80211_send_wowlan_tcp_caps()
1754 tcp->data_interval_max)) in nl80211_send_wowlan_tcp_caps()
1755 return -ENOBUFS; in nl80211_send_wowlan_tcp_caps()
1758 tcp->wake_payload_max)) in nl80211_send_wowlan_tcp_caps()
1759 return -ENOBUFS; in nl80211_send_wowlan_tcp_caps()
1771 if (!rdev->wiphy.wowlan) in nl80211_send_wowlan()
1777 return -ENOBUFS; in nl80211_send_wowlan()
1779 if (((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_ANY) && in nl80211_send_wowlan()
1781 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_DISCONNECT) && in nl80211_send_wowlan()
1783 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_MAGIC_PKT) && in nl80211_send_wowlan()
1785 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_SUPPORTS_GTK_REKEY) && in nl80211_send_wowlan()
1787 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_GTK_REKEY_FAILURE) && in nl80211_send_wowlan()
1789 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_EAP_IDENTITY_REQ) && in nl80211_send_wowlan()
1791 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_4WAY_HANDSHAKE) && in nl80211_send_wowlan()
1793 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_RFKILL_RELEASE) && in nl80211_send_wowlan()
1795 return -ENOBUFS; in nl80211_send_wowlan()
1797 if (rdev->wiphy.wowlan->n_patterns) { in nl80211_send_wowlan()
1799 .max_patterns = rdev->wiphy.wowlan->n_patterns, in nl80211_send_wowlan()
1800 .min_pattern_len = rdev->wiphy.wowlan->pattern_min_len, in nl80211_send_wowlan()
1801 .max_pattern_len = rdev->wiphy.wowlan->pattern_max_len, in nl80211_send_wowlan()
1802 .max_pkt_offset = rdev->wiphy.wowlan->max_pkt_offset, in nl80211_send_wowlan()
1807 return -ENOBUFS; in nl80211_send_wowlan()
1810 if ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_NET_DETECT) && in nl80211_send_wowlan()
1812 rdev->wiphy.wowlan->max_nd_match_sets)) in nl80211_send_wowlan()
1813 return -ENOBUFS; in nl80211_send_wowlan()
1816 return -ENOBUFS; in nl80211_send_wowlan()
1829 if (!rdev->wiphy.coalesce) in nl80211_send_coalesce()
1832 rule.max_rules = rdev->wiphy.coalesce->n_rules; in nl80211_send_coalesce()
1833 rule.max_delay = rdev->wiphy.coalesce->max_delay; in nl80211_send_coalesce()
1834 rule.pat.max_patterns = rdev->wiphy.coalesce->n_patterns; in nl80211_send_coalesce()
1835 rule.pat.min_pattern_len = rdev->wiphy.coalesce->pattern_min_len; in nl80211_send_coalesce()
1836 rule.pat.max_pattern_len = rdev->wiphy.coalesce->pattern_max_len; in nl80211_send_coalesce()
1837 rule.pat.max_pkt_offset = rdev->wiphy.coalesce->max_pkt_offset; in nl80211_send_coalesce()
1840 return -ENOBUFS; in nl80211_send_coalesce()
1850 const struct ieee80211_sta_he_cap *he_cap = &iftdata->he_cap; in nl80211_send_iftype_data()
1851 const struct ieee80211_sta_eht_cap *eht_cap = &iftdata->eht_cap; in nl80211_send_iftype_data()
1854 iftdata->types_mask)) in nl80211_send_iftype_data()
1855 return -ENOBUFS; in nl80211_send_iftype_data()
1857 if (he_cap->has_he) { in nl80211_send_iftype_data()
1859 sizeof(he_cap->he_cap_elem.mac_cap_info), in nl80211_send_iftype_data()
1860 he_cap->he_cap_elem.mac_cap_info) || in nl80211_send_iftype_data()
1862 sizeof(he_cap->he_cap_elem.phy_cap_info), in nl80211_send_iftype_data()
1863 he_cap->he_cap_elem.phy_cap_info) || in nl80211_send_iftype_data()
1865 sizeof(he_cap->he_mcs_nss_supp), in nl80211_send_iftype_data()
1866 &he_cap->he_mcs_nss_supp) || in nl80211_send_iftype_data()
1868 sizeof(he_cap->ppe_thres), he_cap->ppe_thres)) in nl80211_send_iftype_data()
1869 return -ENOBUFS; in nl80211_send_iftype_data()
1872 if (eht_cap->has_eht && he_cap->has_he) { in nl80211_send_iftype_data()
1877 is_ap = iftdata->types_mask & BIT(NL80211_IFTYPE_AP) || in nl80211_send_iftype_data()
1878 iftdata->types_mask & BIT(NL80211_IFTYPE_P2P_GO); in nl80211_send_iftype_data()
1881 ieee80211_eht_mcs_nss_size(&he_cap->he_cap_elem, in nl80211_send_iftype_data()
1882 &eht_cap->eht_cap_elem, in nl80211_send_iftype_data()
1885 ppe_thres_hdr = get_unaligned_le16(&eht_cap->eht_ppe_thres[0]); in nl80211_send_iftype_data()
1888 eht_cap->eht_cap_elem.phy_cap_info); in nl80211_send_iftype_data()
1891 sizeof(eht_cap->eht_cap_elem.mac_cap_info), in nl80211_send_iftype_data()
1892 eht_cap->eht_cap_elem.mac_cap_info) || in nl80211_send_iftype_data()
1894 sizeof(eht_cap->eht_cap_elem.phy_cap_info), in nl80211_send_iftype_data()
1895 eht_cap->eht_cap_elem.phy_cap_info) || in nl80211_send_iftype_data()
1897 mcs_nss_size, &eht_cap->eht_mcs_nss_supp) || in nl80211_send_iftype_data()
1899 ppe_thresh_size, eht_cap->eht_ppe_thres)) in nl80211_send_iftype_data()
1900 return -ENOBUFS; in nl80211_send_iftype_data()
1903 if (sband->band == NL80211_BAND_6GHZ && in nl80211_send_iftype_data()
1905 sizeof(iftdata->he_6ghz_capa), in nl80211_send_iftype_data()
1906 &iftdata->he_6ghz_capa)) in nl80211_send_iftype_data()
1907 return -ENOBUFS; in nl80211_send_iftype_data()
1909 if (iftdata->vendor_elems.data && iftdata->vendor_elems.len && in nl80211_send_iftype_data()
1911 iftdata->vendor_elems.len, iftdata->vendor_elems.data)) in nl80211_send_iftype_data()
1912 return -ENOBUFS; in nl80211_send_iftype_data()
1926 if (sband->ht_cap.ht_supported && in nl80211_send_band_rateinfo()
1928 sizeof(sband->ht_cap.mcs), in nl80211_send_band_rateinfo()
1929 &sband->ht_cap.mcs) || in nl80211_send_band_rateinfo()
1931 sband->ht_cap.cap) || in nl80211_send_band_rateinfo()
1933 sband->ht_cap.ampdu_factor) || in nl80211_send_band_rateinfo()
1935 sband->ht_cap.ampdu_density))) in nl80211_send_band_rateinfo()
1936 return -ENOBUFS; in nl80211_send_band_rateinfo()
1939 if (sband->vht_cap.vht_supported && in nl80211_send_band_rateinfo()
1941 sizeof(sband->vht_cap.vht_mcs), in nl80211_send_band_rateinfo()
1942 &sband->vht_cap.vht_mcs) || in nl80211_send_band_rateinfo()
1944 sband->vht_cap.cap))) in nl80211_send_band_rateinfo()
1945 return -ENOBUFS; in nl80211_send_band_rateinfo()
1947 if (large && sband->n_iftype_data) { in nl80211_send_band_rateinfo()
1955 return -ENOBUFS; in nl80211_send_band_rateinfo()
1962 return -ENOBUFS; in nl80211_send_band_rateinfo()
1975 if (large && sband->edmg_cap.channels && in nl80211_send_band_rateinfo()
1977 sband->edmg_cap.channels) || in nl80211_send_band_rateinfo()
1979 sband->edmg_cap.bw_config))) in nl80211_send_band_rateinfo()
1981 return -ENOBUFS; in nl80211_send_band_rateinfo()
1986 return -ENOBUFS; in nl80211_send_band_rateinfo()
1988 for (i = 0; i < sband->n_bitrates; i++) { in nl80211_send_band_rateinfo()
1991 return -ENOBUFS; in nl80211_send_band_rateinfo()
1993 rate = &sband->bitrates[i]; in nl80211_send_band_rateinfo()
1995 rate->bitrate)) in nl80211_send_band_rateinfo()
1996 return -ENOBUFS; in nl80211_send_band_rateinfo()
1997 if ((rate->flags & IEEE80211_RATE_SHORT_PREAMBLE) && in nl80211_send_band_rateinfo()
2000 return -ENOBUFS; in nl80211_send_band_rateinfo()
2008 if (sband->band == NL80211_BAND_S1GHZ && sband->s1g_cap.s1g && in nl80211_send_band_rateinfo()
2010 sizeof(sband->s1g_cap.cap), in nl80211_send_band_rateinfo()
2011 sband->s1g_cap.cap) || in nl80211_send_band_rateinfo()
2013 sizeof(sband->s1g_cap.nss_mcs), in nl80211_send_band_rateinfo()
2014 sband->s1g_cap.nss_mcs))) in nl80211_send_band_rateinfo()
2015 return -ENOBUFS; in nl80211_send_band_rateinfo()
2034 return -ENOBUFS; in nl80211_send_mgmt_stypes()
2039 return -ENOBUFS; in nl80211_send_mgmt_stypes()
2041 stypes = mgmt_stypes[ift].tx; in nl80211_send_mgmt_stypes()
2046 return -ENOBUFS; in nl80211_send_mgmt_stypes()
2057 return -ENOBUFS; in nl80211_send_mgmt_stypes()
2062 return -ENOBUFS; in nl80211_send_mgmt_stypes()
2069 return -ENOBUFS; in nl80211_send_mgmt_stypes()
2082 if (rdev->ops->op) { \
2116 if (rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL) in nl80211_add_commands_unsplit()
2121 if (rdev->wiphy.flags & WIPHY_FLAG_NETNS_OK) { in nl80211_add_commands_unsplit()
2126 if (rdev->ops->set_monitor_channel || rdev->ops->start_ap || in nl80211_add_commands_unsplit()
2127 rdev->ops->join_mesh) { in nl80211_add_commands_unsplit()
2132 if (rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) { in nl80211_add_commands_unsplit()
2136 if (rdev->wiphy.max_sched_scan_reqs) in nl80211_add_commands_unsplit()
2140 if (rdev->wiphy.flags & WIPHY_FLAG_REPORTS_OBSS) { in nl80211_add_commands_unsplit()
2151 if (rdev->ops->connect || rdev->ops->auth) { in nl80211_add_commands_unsplit()
2157 if (rdev->ops->disconnect || rdev->ops->deauth) { in nl80211_add_commands_unsplit()
2165 return -ENOBUFS; in nl80211_add_commands_unsplit()
2174 if (!cap->ftm.supported) in nl80211_send_pmsr_ftm_capa()
2179 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
2181 if (cap->ftm.asap && nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_ASAP)) in nl80211_send_pmsr_ftm_capa()
2182 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
2183 if (cap->ftm.non_asap && in nl80211_send_pmsr_ftm_capa()
2185 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
2186 if (cap->ftm.request_lci && in nl80211_send_pmsr_ftm_capa()
2188 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
2189 if (cap->ftm.request_civicloc && in nl80211_send_pmsr_ftm_capa()
2191 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
2193 cap->ftm.preambles)) in nl80211_send_pmsr_ftm_capa()
2194 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
2196 cap->ftm.bandwidths)) in nl80211_send_pmsr_ftm_capa()
2197 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
2198 if (cap->ftm.max_bursts_exponent >= 0 && in nl80211_send_pmsr_ftm_capa()
2200 cap->ftm.max_bursts_exponent)) in nl80211_send_pmsr_ftm_capa()
2201 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
2202 if (cap->ftm.max_ftms_per_burst && in nl80211_send_pmsr_ftm_capa()
2204 cap->ftm.max_ftms_per_burst)) in nl80211_send_pmsr_ftm_capa()
2205 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
2206 if (cap->ftm.trigger_based && in nl80211_send_pmsr_ftm_capa()
2208 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
2209 if (cap->ftm.non_trigger_based && in nl80211_send_pmsr_ftm_capa()
2211 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
2220 const struct cfg80211_pmsr_capabilities *cap = rdev->wiphy.pmsr_capa; in nl80211_send_pmsr_capa()
2233 return -ENOBUFS; in nl80211_send_pmsr_capa()
2235 if (nla_put_u32(msg, NL80211_PMSR_ATTR_MAX_PEERS, cap->max_peers)) in nl80211_send_pmsr_capa()
2236 return -ENOBUFS; in nl80211_send_pmsr_capa()
2238 if (cap->report_ap_tsf && in nl80211_send_pmsr_capa()
2240 return -ENOBUFS; in nl80211_send_pmsr_capa()
2242 if (cap->randomize_mac_addr && in nl80211_send_pmsr_capa()
2244 return -ENOBUFS; in nl80211_send_pmsr_capa()
2248 return -ENOBUFS; in nl80211_send_pmsr_capa()
2251 return -ENOBUFS; in nl80211_send_pmsr_capa()
2267 if (!rdev->wiphy.num_iftype_akm_suites || in nl80211_put_iftype_akm_suites()
2268 !rdev->wiphy.iftype_akm_suites) in nl80211_put_iftype_akm_suites()
2273 return -ENOBUFS; in nl80211_put_iftype_akm_suites()
2275 for (i = 0; i < rdev->wiphy.num_iftype_akm_suites; i++) { in nl80211_put_iftype_akm_suites()
2278 return -ENOBUFS; in nl80211_put_iftype_akm_suites()
2280 iftype_akms = &rdev->wiphy.iftype_akm_suites[i]; in nl80211_put_iftype_akm_suites()
2283 iftype_akms->iftypes_mask)) in nl80211_put_iftype_akm_suites()
2284 return -ENOBUFS; in nl80211_put_iftype_akm_suites()
2287 sizeof(u32) * iftype_akms->n_akm_suites, in nl80211_put_iftype_akm_suites()
2288 iftype_akms->akm_suites)) { in nl80211_put_iftype_akm_suites()
2289 return -ENOBUFS; in nl80211_put_iftype_akm_suites()
2305 if (!rdev->wiphy.tid_config_support.vif && in nl80211_put_tid_config_support()
2306 !rdev->wiphy.tid_config_support.peer) in nl80211_put_tid_config_support()
2311 return -ENOSPC; in nl80211_put_tid_config_support()
2313 if (rdev->wiphy.tid_config_support.vif && in nl80211_put_tid_config_support()
2315 rdev->wiphy.tid_config_support.vif, in nl80211_put_tid_config_support()
2319 if (rdev->wiphy.tid_config_support.peer && in nl80211_put_tid_config_support()
2321 rdev->wiphy.tid_config_support.peer, in nl80211_put_tid_config_support()
2327 rdev->wiphy.tid_config_support.max_retry)) in nl80211_put_tid_config_support()
2330 rdev->wiphy.tid_config_support.max_retry)) in nl80211_put_tid_config_support()
2338 return -ENOBUFS; in nl80211_put_tid_config_support()
2349 if (!rdev->wiphy.sar_capa) in nl80211_put_sar_specs()
2352 num_freq_ranges = rdev->wiphy.sar_capa->num_freq_ranges; in nl80211_put_sar_specs()
2356 return -ENOSPC; in nl80211_put_sar_specs()
2358 if (nla_put_u32(msg, NL80211_SAR_ATTR_TYPE, rdev->wiphy.sar_capa->type)) in nl80211_put_sar_specs()
2372 rdev->wiphy.sar_capa->freq_ranges[i].start_freq)) in nl80211_put_sar_specs()
2376 rdev->wiphy.sar_capa->freq_ranges[i].end_freq)) in nl80211_put_sar_specs()
2388 return -ENOBUFS; in nl80211_put_sar_specs()
2395 if (!wiphy->mbssid_max_interfaces) in nl80211_put_mbssid_support()
2400 return -ENOBUFS; in nl80211_put_mbssid_support()
2403 wiphy->mbssid_max_interfaces)) in nl80211_put_mbssid_support()
2406 if (wiphy->ema_max_profile_periodicity && in nl80211_put_mbssid_support()
2409 wiphy->ema_max_profile_periodicity)) in nl80211_put_mbssid_support()
2417 return -ENOBUFS; in nl80211_put_mbssid_support()
2422 const struct wiphy_radio *r = &wiphy->radio[idx]; in nl80211_put_radio()
2428 return -ENOBUFS; in nl80211_put_radio()
2433 for (i = 0; i < r->n_freq_range; i++) { in nl80211_put_radio()
2434 const struct wiphy_radio_freq_range *range = &r->freq_range[i]; in nl80211_put_radio()
2441 range->start_freq) || in nl80211_put_radio()
2443 range->end_freq)) in nl80211_put_radio()
2449 for (i = 0; i < r->n_iface_combinations; i++) in nl80211_put_radio()
2452 &r->iface_combinations[i], in nl80211_put_radio()
2461 return -ENOBUFS; in nl80211_put_radio()
2469 if (!wiphy->n_radio) in nl80211_put_radios()
2474 return -ENOBUFS; in nl80211_put_radios()
2476 for (i = 0; i < wiphy->n_radio; i++) in nl80211_put_radios()
2484 -1, true, NLA_F_NESTED)) in nl80211_put_radios()
2485 return -ENOBUFS; in nl80211_put_radios()
2491 return -ENOBUFS; in nl80211_put_radios()
2514 rdev->wiphy.mgmt_stypes; in nl80211_send_wiphy()
2519 return -ENOBUFS; in nl80211_send_wiphy()
2522 return -EINVAL; in nl80211_send_wiphy()
2524 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_wiphy()
2526 wiphy_name(&rdev->wiphy)) || in nl80211_send_wiphy()
2534 switch (state->split_start) { in nl80211_send_wiphy()
2537 rdev->wiphy.retry_short) || in nl80211_send_wiphy()
2539 rdev->wiphy.retry_long) || in nl80211_send_wiphy()
2541 rdev->wiphy.frag_threshold) || in nl80211_send_wiphy()
2543 rdev->wiphy.rts_threshold) || in nl80211_send_wiphy()
2545 rdev->wiphy.coverage_class) || in nl80211_send_wiphy()
2547 rdev->wiphy.max_scan_ssids) || in nl80211_send_wiphy()
2549 rdev->wiphy.max_sched_scan_ssids) || in nl80211_send_wiphy()
2551 rdev->wiphy.max_scan_ie_len) || in nl80211_send_wiphy()
2553 rdev->wiphy.max_sched_scan_ie_len) || in nl80211_send_wiphy()
2555 rdev->wiphy.max_match_sets)) in nl80211_send_wiphy()
2558 if ((rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN) && in nl80211_send_wiphy()
2561 if ((rdev->wiphy.flags & WIPHY_FLAG_MESH_AUTH) && in nl80211_send_wiphy()
2564 if ((rdev->wiphy.flags & WIPHY_FLAG_AP_UAPSD) && in nl80211_send_wiphy()
2567 if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_FW_ROAM) && in nl80211_send_wiphy()
2570 if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) && in nl80211_send_wiphy()
2573 if ((rdev->wiphy.flags & WIPHY_FLAG_TDLS_EXTERNAL_SETUP) && in nl80211_send_wiphy()
2576 state->split_start++; in nl80211_send_wiphy()
2577 if (state->split) in nl80211_send_wiphy()
2582 sizeof(u32) * rdev->wiphy.n_cipher_suites, in nl80211_send_wiphy()
2583 rdev->wiphy.cipher_suites)) in nl80211_send_wiphy()
2587 rdev->wiphy.max_num_pmkids)) in nl80211_send_wiphy()
2590 if ((rdev->wiphy.flags & WIPHY_FLAG_CONTROL_PORT_PROTOCOL) && in nl80211_send_wiphy()
2595 rdev->wiphy.available_antennas_tx) || in nl80211_send_wiphy()
2597 rdev->wiphy.available_antennas_rx)) in nl80211_send_wiphy()
2600 if ((rdev->wiphy.flags & WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD) && in nl80211_send_wiphy()
2602 rdev->wiphy.probe_resp_offload)) in nl80211_send_wiphy()
2605 if ((rdev->wiphy.available_antennas_tx || in nl80211_send_wiphy()
2606 rdev->wiphy.available_antennas_rx) && in nl80211_send_wiphy()
2607 rdev->ops->get_antenna) { in nl80211_send_wiphy()
2623 state->split_start++; in nl80211_send_wiphy()
2624 if (state->split) in nl80211_send_wiphy()
2629 rdev->wiphy.interface_modes)) in nl80211_send_wiphy()
2631 state->split_start++; in nl80211_send_wiphy()
2632 if (state->split) in nl80211_send_wiphy()
2641 for (band = state->band_start; in nl80211_send_wiphy()
2642 band < (state->split ? in nl80211_send_wiphy()
2649 if (band > NL80211_BAND_5GHZ && !state->split) in nl80211_send_wiphy()
2652 sband = rdev->wiphy.bands[band]; in nl80211_send_wiphy()
2661 switch (state->chan_start) { in nl80211_send_wiphy()
2664 state->split)) in nl80211_send_wiphy()
2666 state->chan_start++; in nl80211_send_wiphy()
2667 if (state->split) in nl80211_send_wiphy()
2677 for (i = state->chan_start - 1; in nl80211_send_wiphy()
2678 i < sband->n_channels; in nl80211_send_wiphy()
2685 chan = &sband->channels[i]; in nl80211_send_wiphy()
2688 msg, &rdev->wiphy, chan, in nl80211_send_wiphy()
2689 state->split)) in nl80211_send_wiphy()
2693 if (state->split) in nl80211_send_wiphy()
2696 if (i < sband->n_channels) in nl80211_send_wiphy()
2697 state->chan_start = i + 2; in nl80211_send_wiphy()
2699 state->chan_start = 0; in nl80211_send_wiphy()
2705 if (state->split) { in nl80211_send_wiphy()
2707 if (state->chan_start) in nl80211_send_wiphy()
2708 band--; in nl80211_send_wiphy()
2715 state->band_start = band + 1; in nl80211_send_wiphy()
2717 state->band_start = 0; in nl80211_send_wiphy()
2720 if (state->band_start == 0 && state->chan_start == 0) in nl80211_send_wiphy()
2721 state->split_start++; in nl80211_send_wiphy()
2722 if (state->split) in nl80211_send_wiphy()
2734 if (state->split) { in nl80211_send_wiphy()
2737 if (rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH) in nl80211_send_wiphy()
2740 if (rdev->wiphy.features & in nl80211_send_wiphy()
2746 if (rdev->wiphy.sar_capa) in nl80211_send_wiphy()
2752 state->split_start++; in nl80211_send_wiphy()
2753 if (state->split) in nl80211_send_wiphy()
2757 if (rdev->ops->remain_on_channel && in nl80211_send_wiphy()
2758 (rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL) && in nl80211_send_wiphy()
2761 rdev->wiphy.max_remain_on_channel_duration)) in nl80211_send_wiphy()
2764 if ((rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX) && in nl80211_send_wiphy()
2768 state->split_start++; in nl80211_send_wiphy()
2769 if (state->split) in nl80211_send_wiphy()
2774 if (nl80211_send_wowlan(msg, rdev, state->split)) in nl80211_send_wiphy()
2776 state->split_start++; in nl80211_send_wiphy()
2777 if (state->split) in nl80211_send_wiphy()
2780 state->split_start++; in nl80211_send_wiphy()
2785 rdev->wiphy.software_iftypes)) in nl80211_send_wiphy()
2788 if (nl80211_put_iface_combinations(&rdev->wiphy, msg, in nl80211_send_wiphy()
2790 rdev->wiphy.n_radio ? 0 : -1, in nl80211_send_wiphy()
2791 state->split, 0)) in nl80211_send_wiphy()
2794 state->split_start++; in nl80211_send_wiphy()
2795 if (state->split) in nl80211_send_wiphy()
2799 if ((rdev->wiphy.flags & WIPHY_FLAG_HAVE_AP_SME) && in nl80211_send_wiphy()
2801 rdev->wiphy.ap_sme_capa)) in nl80211_send_wiphy()
2804 features = rdev->wiphy.features; in nl80211_send_wiphy()
2806 * We can only add the per-channel limit information if the in nl80211_send_wiphy()
2810 if (state->split) in nl80211_send_wiphy()
2815 if (rdev->wiphy.ht_capa_mod_mask && in nl80211_send_wiphy()
2817 sizeof(*rdev->wiphy.ht_capa_mod_mask), in nl80211_send_wiphy()
2818 rdev->wiphy.ht_capa_mod_mask)) in nl80211_send_wiphy()
2821 if (rdev->wiphy.flags & WIPHY_FLAG_HAVE_AP_SME && in nl80211_send_wiphy()
2822 rdev->wiphy.max_acl_mac_addrs && in nl80211_send_wiphy()
2824 rdev->wiphy.max_acl_mac_addrs)) in nl80211_send_wiphy()
2837 if (state->split) in nl80211_send_wiphy()
2838 state->split_start++; in nl80211_send_wiphy()
2840 state->split_start = 0; in nl80211_send_wiphy()
2847 rdev->wiphy.max_sched_scan_plans) || in nl80211_send_wiphy()
2849 rdev->wiphy.max_sched_scan_plan_interval) || in nl80211_send_wiphy()
2851 rdev->wiphy.max_sched_scan_plan_iterations)) in nl80211_send_wiphy()
2854 if (rdev->wiphy.extended_capabilities && in nl80211_send_wiphy()
2856 rdev->wiphy.extended_capabilities_len, in nl80211_send_wiphy()
2857 rdev->wiphy.extended_capabilities) || in nl80211_send_wiphy()
2859 rdev->wiphy.extended_capabilities_len, in nl80211_send_wiphy()
2860 rdev->wiphy.extended_capabilities_mask))) in nl80211_send_wiphy()
2863 if (rdev->wiphy.vht_capa_mod_mask && in nl80211_send_wiphy()
2865 sizeof(*rdev->wiphy.vht_capa_mod_mask), in nl80211_send_wiphy()
2866 rdev->wiphy.vht_capa_mod_mask)) in nl80211_send_wiphy()
2870 rdev->wiphy.perm_addr)) in nl80211_send_wiphy()
2873 if (!is_zero_ether_addr(rdev->wiphy.addr_mask) && in nl80211_send_wiphy()
2875 rdev->wiphy.addr_mask)) in nl80211_send_wiphy()
2878 if (rdev->wiphy.n_addresses > 1) { in nl80211_send_wiphy()
2885 for (i = 0; i < rdev->wiphy.n_addresses; i++) in nl80211_send_wiphy()
2887 rdev->wiphy.addresses[i].addr)) in nl80211_send_wiphy()
2893 state->split_start++; in nl80211_send_wiphy()
2899 if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_5_10_MHZ) && in nl80211_send_wiphy()
2904 if (rdev->wiphy.max_ap_assoc_sta && in nl80211_send_wiphy()
2906 rdev->wiphy.max_ap_assoc_sta)) in nl80211_send_wiphy()
2909 state->split_start++; in nl80211_send_wiphy()
2912 if (rdev->wiphy.n_vendor_commands) { in nl80211_send_wiphy()
2921 for (i = 0; i < rdev->wiphy.n_vendor_commands; i++) { in nl80211_send_wiphy()
2922 info = &rdev->wiphy.vendor_commands[i].info; in nl80211_send_wiphy()
2929 if (rdev->wiphy.n_vendor_events) { in nl80211_send_wiphy()
2938 for (i = 0; i < rdev->wiphy.n_vendor_events; i++) { in nl80211_send_wiphy()
2939 info = &rdev->wiphy.vendor_events[i]; in nl80211_send_wiphy()
2945 state->split_start++; in nl80211_send_wiphy()
2948 if (rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH && in nl80211_send_wiphy()
2950 rdev->wiphy.max_num_csa_counters)) in nl80211_send_wiphy()
2953 if (rdev->wiphy.regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED && in nl80211_send_wiphy()
2957 if (rdev->wiphy.max_sched_scan_reqs && in nl80211_send_wiphy()
2959 rdev->wiphy.max_sched_scan_reqs)) in nl80211_send_wiphy()
2963 sizeof(rdev->wiphy.ext_features), in nl80211_send_wiphy()
2964 rdev->wiphy.ext_features)) in nl80211_send_wiphy()
2967 if (rdev->wiphy.bss_select_support) { in nl80211_send_wiphy()
2969 u32 bss_select_support = rdev->wiphy.bss_select_support; in nl80211_send_wiphy()
2987 state->split_start++; in nl80211_send_wiphy()
2990 if (rdev->wiphy.num_iftype_ext_capab && in nl80211_send_wiphy()
2991 rdev->wiphy.iftype_ext_capab) { in nl80211_send_wiphy()
2999 for (i = state->capa_start; in nl80211_send_wiphy()
3000 i < rdev->wiphy.num_iftype_ext_capab; i++) { in nl80211_send_wiphy()
3003 capab = &rdev->wiphy.iftype_ext_capab[i]; in nl80211_send_wiphy()
3009 capab->iftype) || in nl80211_send_wiphy()
3011 capab->extended_capabilities_len, in nl80211_send_wiphy()
3012 capab->extended_capabilities) || in nl80211_send_wiphy()
3014 capab->extended_capabilities_len, in nl80211_send_wiphy()
3015 capab->extended_capabilities_mask)) in nl80211_send_wiphy()
3018 if (rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_MLO && in nl80211_send_wiphy()
3021 capab->eml_capabilities) || in nl80211_send_wiphy()
3024 capab->mld_capa_and_ops))) in nl80211_send_wiphy()
3028 if (state->split) in nl80211_send_wiphy()
3032 if (i < rdev->wiphy.num_iftype_ext_capab) { in nl80211_send_wiphy()
3033 state->capa_start = i + 1; in nl80211_send_wiphy()
3039 rdev->wiphy.nan_supported_bands)) in nl80211_send_wiphy()
3042 if (wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_send_wiphy()
3054 rdev->wiphy.txq_limit)) in nl80211_send_wiphy()
3057 rdev->wiphy.txq_memory_limit)) in nl80211_send_wiphy()
3060 rdev->wiphy.txq_quantum)) in nl80211_send_wiphy()
3064 state->split_start++; in nl80211_send_wiphy()
3070 state->split_start++; in nl80211_send_wiphy()
3073 if (rdev->wiphy.akm_suites && in nl80211_send_wiphy()
3075 sizeof(u32) * rdev->wiphy.n_akm_suites, in nl80211_send_wiphy()
3076 rdev->wiphy.akm_suites)) in nl80211_send_wiphy()
3084 state->split_start++; in nl80211_send_wiphy()
3090 if (nl80211_put_mbssid_support(&rdev->wiphy, msg)) in nl80211_send_wiphy()
3094 rdev->wiphy.max_num_akm_suites)) in nl80211_send_wiphy()
3097 if (rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_MLO) in nl80211_send_wiphy()
3100 if (rdev->wiphy.hw_timestamp_max_peers && in nl80211_send_wiphy()
3102 rdev->wiphy.hw_timestamp_max_peers)) in nl80211_send_wiphy()
3105 state->split_start++; in nl80211_send_wiphy()
3108 if (nl80211_put_radios(&rdev->wiphy, msg)) in nl80211_send_wiphy()
3112 state->split_start = 0; in nl80211_send_wiphy()
3121 return -EMSGSIZE; in nl80211_send_wiphy()
3132 return -ENOMEM; in nl80211_dump_wiphy_parse()
3134 ret = nlmsg_parse_deprecated(cb->nlh, in nl80211_dump_wiphy_parse()
3144 state->split = tb[NL80211_ATTR_SPLIT_WIPHY_DUMP]; in nl80211_dump_wiphy_parse()
3146 state->filter_wiphy = nla_get_u32(tb[NL80211_ATTR_WIPHY]); in nl80211_dump_wiphy_parse()
3148 state->filter_wiphy = nla_get_u64(tb[NL80211_ATTR_WDEV]) >> 32; in nl80211_dump_wiphy_parse()
3154 netdev = __dev_get_by_index(sock_net(skb->sk), ifidx); in nl80211_dump_wiphy_parse()
3156 ret = -ENODEV; in nl80211_dump_wiphy_parse()
3159 if (netdev->ieee80211_ptr) { in nl80211_dump_wiphy_parse()
3161 netdev->ieee80211_ptr->wiphy); in nl80211_dump_wiphy_parse()
3162 state->filter_wiphy = rdev->wiphy_idx; in nl80211_dump_wiphy_parse()
3175 struct nl80211_dump_wiphy_state *state = (void *)cb->args[0]; in nl80211_dump_wiphy()
3183 return -ENOMEM; in nl80211_dump_wiphy()
3185 state->filter_wiphy = -1; in nl80211_dump_wiphy()
3192 cb->args[0] = (long)state; in nl80211_dump_wiphy()
3196 if (!net_eq(wiphy_net(&rdev->wiphy), sock_net(skb->sk))) in nl80211_dump_wiphy()
3198 if (++idx <= state->start) in nl80211_dump_wiphy()
3200 if (state->filter_wiphy != -1 && in nl80211_dump_wiphy()
3201 state->filter_wiphy != rdev->wiphy_idx) in nl80211_dump_wiphy()
3203 wiphy_lock(&rdev->wiphy); in nl80211_dump_wiphy()
3208 NETLINK_CB(cb->skb).portid, in nl80211_dump_wiphy()
3209 cb->nlh->nlmsg_seq, in nl80211_dump_wiphy()
3225 if ((ret == -ENOBUFS || ret == -EMSGSIZE) && in nl80211_dump_wiphy()
3226 !skb->len && !state->split && in nl80211_dump_wiphy()
3227 cb->min_dump_alloc < 4096) { in nl80211_dump_wiphy()
3228 cb->min_dump_alloc = 4096; in nl80211_dump_wiphy()
3229 state->split_start = 0; in nl80211_dump_wiphy()
3230 wiphy_unlock(&rdev->wiphy); in nl80211_dump_wiphy()
3234 idx--; in nl80211_dump_wiphy()
3237 } while (state->split_start > 0); in nl80211_dump_wiphy()
3238 wiphy_unlock(&rdev->wiphy); in nl80211_dump_wiphy()
3243 state->start = idx; in nl80211_dump_wiphy()
3245 return skb->len; in nl80211_dump_wiphy()
3250 kfree((void *)cb->args[0]); in nl80211_dump_wiphy_done()
3257 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_wiphy()
3262 return -ENOMEM; in nl80211_get_wiphy()
3265 info->snd_portid, info->snd_seq, 0, in nl80211_get_wiphy()
3268 return -ENOBUFS; in nl80211_get_wiphy()
3290 return -EINVAL; in parse_txq_params()
3293 txq_params->txop = nla_get_u16(tb[NL80211_TXQ_ATTR_TXOP]); in parse_txq_params()
3294 txq_params->cwmin = nla_get_u16(tb[NL80211_TXQ_ATTR_CWMIN]); in parse_txq_params()
3295 txq_params->cwmax = nla_get_u16(tb[NL80211_TXQ_ATTR_CWMAX]); in parse_txq_params()
3296 txq_params->aifs = nla_get_u8(tb[NL80211_TXQ_ATTR_AIFS]); in parse_txq_params()
3299 return -EINVAL; in parse_txq_params()
3300 txq_params->ac = array_index_nospec(ac, NL80211_NUM_ACS); in parse_txq_params()
3313 * low-level driver when the AP starts or the mesh is joined. in nl80211_can_set_dev_channel()
3315 * the channel in the start-ap or join-mesh commands instead. in nl80211_can_set_dev_channel()
3322 wdev->iftype == NL80211_IFTYPE_AP || in nl80211_can_set_dev_channel()
3323 wdev->iftype == NL80211_IFTYPE_MESH_POINT || in nl80211_can_set_dev_channel()
3324 wdev->iftype == NL80211_IFTYPE_MONITOR || in nl80211_can_set_dev_channel()
3325 wdev->iftype == NL80211_IFTYPE_P2P_GO; in nl80211_can_set_dev_channel()
3332 struct netlink_ext_ack *extack = info->extack; in _nl80211_parse_chandef()
3333 struct nlattr **attrs = info->attrs; in _nl80211_parse_chandef()
3339 return -EINVAL; in _nl80211_parse_chandef()
3343 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ])); in _nl80211_parse_chandef()
3344 if (info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]) in _nl80211_parse_chandef()
3346 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]); in _nl80211_parse_chandef()
3349 chandef->chan = ieee80211_get_channel_khz(&rdev->wiphy, control_freq); in _nl80211_parse_chandef()
3350 chandef->width = NL80211_CHAN_WIDTH_20_NOHT; in _nl80211_parse_chandef()
3351 chandef->center_freq1 = KHZ_TO_MHZ(control_freq); in _nl80211_parse_chandef()
3352 chandef->freq1_offset = control_freq % 1000; in _nl80211_parse_chandef()
3353 chandef->center_freq2 = 0; in _nl80211_parse_chandef()
3355 if (!chandef->chan) { in _nl80211_parse_chandef()
3358 return -EINVAL; in _nl80211_parse_chandef()
3371 cfg80211_chandef_create(chandef, chandef->chan, in _nl80211_parse_chandef()
3375 chandef->center_freq1 != nla_get_u32(attrs[NL80211_ATTR_CENTER_FREQ1])) { in _nl80211_parse_chandef()
3379 return -EINVAL; in _nl80211_parse_chandef()
3387 return -EINVAL; in _nl80211_parse_chandef()
3394 return -EINVAL; in _nl80211_parse_chandef()
3397 chandef->width = in _nl80211_parse_chandef()
3399 if (chandef->chan->band == NL80211_BAND_S1GHZ) { in _nl80211_parse_chandef()
3401 if (chandef->width != ieee80211_s1g_channel_width(chandef->chan)) { in _nl80211_parse_chandef()
3405 return -EINVAL; in _nl80211_parse_chandef()
3409 chandef->center_freq1 = in _nl80211_parse_chandef()
3412 chandef->freq1_offset = nla_get_u32( in _nl80211_parse_chandef()
3415 chandef->freq1_offset = 0; in _nl80211_parse_chandef()
3418 chandef->center_freq2 = in _nl80211_parse_chandef()
3422 if (info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]) { in _nl80211_parse_chandef()
3423 chandef->edmg.channels = in _nl80211_parse_chandef()
3424 nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]); in _nl80211_parse_chandef()
3426 if (info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]) in _nl80211_parse_chandef()
3427 chandef->edmg.bw_config = in _nl80211_parse_chandef()
3428 nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]); in _nl80211_parse_chandef()
3430 chandef->edmg.bw_config = 0; in _nl80211_parse_chandef()
3431 chandef->edmg.channels = 0; in _nl80211_parse_chandef()
3434 if (info->attrs[NL80211_ATTR_PUNCT_BITMAP]) { in _nl80211_parse_chandef()
3435 chandef->punctured = in _nl80211_parse_chandef()
3436 nla_get_u32(info->attrs[NL80211_ATTR_PUNCT_BITMAP]); in _nl80211_parse_chandef()
3438 if (chandef->punctured && in _nl80211_parse_chandef()
3439 !wiphy_ext_feature_isset(&rdev->wiphy, in _nl80211_parse_chandef()
3443 return -EINVAL; in _nl80211_parse_chandef()
3449 return -EINVAL; in _nl80211_parse_chandef()
3452 if (!_cfg80211_chandef_usable(&rdev->wiphy, chandef, in _nl80211_parse_chandef()
3456 return -EINVAL; in _nl80211_parse_chandef()
3459 if ((chandef->width == NL80211_CHAN_WIDTH_5 || in _nl80211_parse_chandef()
3460 chandef->width == NL80211_CHAN_WIDTH_10) && in _nl80211_parse_chandef()
3461 !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_5_10_MHZ)) { in _nl80211_parse_chandef()
3463 return -EINVAL; in _nl80211_parse_chandef()
3488 wdev = dev->ieee80211_ptr; in __nl80211_set_channel()
3490 return -EOPNOTSUPP; in __nl80211_set_channel()
3492 iftype = wdev->iftype; in __nl80211_set_channel()
3495 if (wdev && wdev->valid_links) in __nl80211_set_channel()
3496 return -EINVAL; in __nl80211_set_channel()
3509 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &chandef, in __nl80211_set_channel()
3511 return -EINVAL; in __nl80211_set_channel()
3512 if (wdev->links[link_id].ap.beacon_interval) { in __nl80211_set_channel()
3515 if (!dev || !rdev->ops->set_ap_chanwidth || in __nl80211_set_channel()
3516 !(rdev->wiphy.features & in __nl80211_set_channel()
3518 return -EBUSY; in __nl80211_set_channel()
3521 cur_chan = wdev->links[link_id].ap.chandef.chan; in __nl80211_set_channel()
3523 return -EBUSY; in __nl80211_set_channel()
3526 switch (wdev->links[link_id].ap.chandef.width) { in __nl80211_set_channel()
3536 return -EINVAL; in __nl80211_set_channel()
3549 return -EINVAL; in __nl80211_set_channel()
3556 wdev->links[link_id].ap.chandef = chandef; in __nl80211_set_channel()
3558 wdev->u.ap.preset_chandef = chandef; in __nl80211_set_channel()
3569 return -EINVAL; in __nl80211_set_channel()
3574 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_channel()
3575 int link_id = nl80211_link_id_or_invalid(info->attrs); in nl80211_set_channel()
3576 struct net_device *netdev = info->user_ptr[1]; in nl80211_set_channel()
3598 * done for backward compatibility -- previously in nl80211_set_wiphy()
3605 if (info->attrs[NL80211_ATTR_IFINDEX]) { in nl80211_set_wiphy()
3606 int ifindex = nla_get_u32(info->attrs[NL80211_ATTR_IFINDEX]); in nl80211_set_wiphy()
3609 if (netdev && netdev->ieee80211_ptr) in nl80211_set_wiphy()
3610 rdev = wiphy_to_rdev(netdev->ieee80211_ptr->wiphy); in nl80211_set_wiphy()
3617 info->attrs); in nl80211_set_wiphy()
3626 wdev = netdev->ieee80211_ptr; in nl80211_set_wiphy()
3628 wiphy_lock(&rdev->wiphy); in nl80211_set_wiphy()
3635 if (info->attrs[NL80211_ATTR_WIPHY_NAME]) in nl80211_set_wiphy()
3637 rdev, nla_data(info->attrs[NL80211_ATTR_WIPHY_NAME])); in nl80211_set_wiphy()
3643 if (info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS]) { in nl80211_set_wiphy()
3647 if (!rdev->ops->set_txq_params) { in nl80211_set_wiphy()
3648 result = -EOPNOTSUPP; in nl80211_set_wiphy()
3653 result = -EINVAL; in nl80211_set_wiphy()
3657 if (netdev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && in nl80211_set_wiphy()
3658 netdev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) { in nl80211_set_wiphy()
3659 result = -EINVAL; in nl80211_set_wiphy()
3664 result = -ENETDOWN; in nl80211_set_wiphy()
3669 info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS], in nl80211_set_wiphy()
3675 info->extack); in nl80211_set_wiphy()
3683 nl80211_link_id_or_invalid(info->attrs); in nl80211_set_wiphy()
3686 !(netdev->ieee80211_ptr->valid_links & in nl80211_set_wiphy()
3688 result = -ENOLINK; in nl80211_set_wiphy()
3690 !netdev->ieee80211_ptr->valid_links) in nl80211_set_wiphy()
3691 result = -EINVAL; in nl80211_set_wiphy()
3700 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { in nl80211_set_wiphy()
3701 int link_id = nl80211_link_id_or_invalid(info->attrs); in nl80211_set_wiphy()
3716 if (info->attrs[NL80211_ATTR_WIPHY_TX_POWER_SETTING]) { in nl80211_set_wiphy()
3721 if (!(rdev->wiphy.features & NL80211_FEATURE_VIF_TXPOWER)) in nl80211_set_wiphy()
3724 if (!rdev->ops->set_tx_power) { in nl80211_set_wiphy()
3725 result = -EOPNOTSUPP; in nl80211_set_wiphy()
3730 type = nla_get_u32(info->attrs[idx]); in nl80211_set_wiphy()
3732 if (!info->attrs[NL80211_ATTR_WIPHY_TX_POWER_LEVEL] && in nl80211_set_wiphy()
3734 result = -EINVAL; in nl80211_set_wiphy()
3740 mbm = nla_get_u32(info->attrs[idx]); in nl80211_set_wiphy()
3748 if (info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX] && in nl80211_set_wiphy()
3749 info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]) { in nl80211_set_wiphy()
3752 if ((!rdev->wiphy.available_antennas_tx && in nl80211_set_wiphy()
3753 !rdev->wiphy.available_antennas_rx) || in nl80211_set_wiphy()
3754 !rdev->ops->set_antenna) { in nl80211_set_wiphy()
3755 result = -EOPNOTSUPP; in nl80211_set_wiphy()
3759 tx_ant = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX]); in nl80211_set_wiphy()
3760 rx_ant = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]); in nl80211_set_wiphy()
3764 if ((~tx_ant && (tx_ant & ~rdev->wiphy.available_antennas_tx)) || in nl80211_set_wiphy()
3765 (~rx_ant && (rx_ant & ~rdev->wiphy.available_antennas_rx))) { in nl80211_set_wiphy()
3766 result = -EINVAL; in nl80211_set_wiphy()
3770 tx_ant = tx_ant & rdev->wiphy.available_antennas_tx; in nl80211_set_wiphy()
3771 rx_ant = rx_ant & rdev->wiphy.available_antennas_rx; in nl80211_set_wiphy()
3780 if (info->attrs[NL80211_ATTR_WIPHY_RETRY_SHORT]) { in nl80211_set_wiphy()
3782 info->attrs[NL80211_ATTR_WIPHY_RETRY_SHORT]); in nl80211_set_wiphy()
3787 if (info->attrs[NL80211_ATTR_WIPHY_RETRY_LONG]) { in nl80211_set_wiphy()
3789 info->attrs[NL80211_ATTR_WIPHY_RETRY_LONG]); in nl80211_set_wiphy()
3794 if (info->attrs[NL80211_ATTR_WIPHY_FRAG_THRESHOLD]) { in nl80211_set_wiphy()
3796 info->attrs[NL80211_ATTR_WIPHY_FRAG_THRESHOLD]); in nl80211_set_wiphy()
3798 result = -EINVAL; in nl80211_set_wiphy()
3802 if (frag_threshold != (u32) -1) { in nl80211_set_wiphy()
3814 if (info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]) { in nl80211_set_wiphy()
3816 info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]); in nl80211_set_wiphy()
3820 if (info->attrs[NL80211_ATTR_WIPHY_COVERAGE_CLASS]) { in nl80211_set_wiphy()
3821 if (info->attrs[NL80211_ATTR_WIPHY_DYN_ACK]) { in nl80211_set_wiphy()
3822 result = -EINVAL; in nl80211_set_wiphy()
3827 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 if (!(rdev->wiphy.features & NL80211_FEATURE_ACKTO_ESTIMATION)) { in nl80211_set_wiphy()
3833 result = -EOPNOTSUPP; in nl80211_set_wiphy()
3840 if (info->attrs[NL80211_ATTR_TXQ_LIMIT]) { in nl80211_set_wiphy()
3841 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_set_wiphy()
3843 result = -EOPNOTSUPP; in nl80211_set_wiphy()
3847 info->attrs[NL80211_ATTR_TXQ_LIMIT]); in nl80211_set_wiphy()
3851 if (info->attrs[NL80211_ATTR_TXQ_MEMORY_LIMIT]) { in nl80211_set_wiphy()
3852 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_set_wiphy()
3854 result = -EOPNOTSUPP; in nl80211_set_wiphy()
3858 info->attrs[NL80211_ATTR_TXQ_MEMORY_LIMIT]); in nl80211_set_wiphy()
3862 if (info->attrs[NL80211_ATTR_TXQ_QUANTUM]) { in nl80211_set_wiphy()
3863 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_set_wiphy()
3865 result = -EOPNOTSUPP; in nl80211_set_wiphy()
3869 info->attrs[NL80211_ATTR_TXQ_QUANTUM]); in nl80211_set_wiphy()
3879 if (!rdev->ops->set_wiphy_params) { in nl80211_set_wiphy()
3880 result = -EOPNOTSUPP; in nl80211_set_wiphy()
3884 old_retry_short = rdev->wiphy.retry_short; in nl80211_set_wiphy()
3885 old_retry_long = rdev->wiphy.retry_long; in nl80211_set_wiphy()
3886 old_frag_threshold = rdev->wiphy.frag_threshold; in nl80211_set_wiphy()
3887 old_rts_threshold = rdev->wiphy.rts_threshold; in nl80211_set_wiphy()
3888 old_coverage_class = rdev->wiphy.coverage_class; in nl80211_set_wiphy()
3889 old_txq_limit = rdev->wiphy.txq_limit; in nl80211_set_wiphy()
3890 old_txq_memory_limit = rdev->wiphy.txq_memory_limit; in nl80211_set_wiphy()
3891 old_txq_quantum = rdev->wiphy.txq_quantum; in nl80211_set_wiphy()
3894 rdev->wiphy.retry_short = retry_short; in nl80211_set_wiphy()
3896 rdev->wiphy.retry_long = retry_long; in nl80211_set_wiphy()
3898 rdev->wiphy.frag_threshold = frag_threshold; in nl80211_set_wiphy()
3900 rdev->wiphy.rts_threshold = rts_threshold; in nl80211_set_wiphy()
3902 rdev->wiphy.coverage_class = coverage_class; in nl80211_set_wiphy()
3904 rdev->wiphy.txq_limit = txq_limit; in nl80211_set_wiphy()
3906 rdev->wiphy.txq_memory_limit = txq_memory_limit; in nl80211_set_wiphy()
3908 rdev->wiphy.txq_quantum = txq_quantum; in nl80211_set_wiphy()
3912 rdev->wiphy.retry_short = old_retry_short; in nl80211_set_wiphy()
3913 rdev->wiphy.retry_long = old_retry_long; in nl80211_set_wiphy()
3914 rdev->wiphy.frag_threshold = old_frag_threshold; in nl80211_set_wiphy()
3915 rdev->wiphy.rts_threshold = old_rts_threshold; in nl80211_set_wiphy()
3916 rdev->wiphy.coverage_class = old_coverage_class; in nl80211_set_wiphy()
3917 rdev->wiphy.txq_limit = old_txq_limit; in nl80211_set_wiphy()
3918 rdev->wiphy.txq_memory_limit = old_txq_memory_limit; in nl80211_set_wiphy()
3919 rdev->wiphy.txq_quantum = old_txq_quantum; in nl80211_set_wiphy()
3927 wiphy_unlock(&rdev->wiphy); in nl80211_set_wiphy()
3934 return -EINVAL; in nl80211_send_chandef()
3937 chandef->chan->center_freq)) in nl80211_send_chandef()
3938 return -ENOBUFS; in nl80211_send_chandef()
3940 chandef->chan->freq_offset)) in nl80211_send_chandef()
3941 return -ENOBUFS; in nl80211_send_chandef()
3942 switch (chandef->width) { in nl80211_send_chandef()
3948 return -ENOBUFS; in nl80211_send_chandef()
3953 if (nla_put_u32(msg, NL80211_ATTR_CHANNEL_WIDTH, chandef->width)) in nl80211_send_chandef()
3954 return -ENOBUFS; in nl80211_send_chandef()
3955 if (nla_put_u32(msg, NL80211_ATTR_CENTER_FREQ1, chandef->center_freq1)) in nl80211_send_chandef()
3956 return -ENOBUFS; in nl80211_send_chandef()
3957 if (chandef->center_freq2 && in nl80211_send_chandef()
3958 nla_put_u32(msg, NL80211_ATTR_CENTER_FREQ2, chandef->center_freq2)) in nl80211_send_chandef()
3959 return -ENOBUFS; in nl80211_send_chandef()
3960 if (chandef->punctured && in nl80211_send_chandef()
3961 nla_put_u32(msg, NL80211_ATTR_PUNCT_BITMAP, chandef->punctured)) in nl80211_send_chandef()
3962 return -ENOBUFS; in nl80211_send_chandef()
3973 struct net_device *dev = wdev->netdev; in nl80211_send_iface()
3976 lockdep_assert_wiphy(&rdev->wiphy); in nl80211_send_iface()
3984 return -1; in nl80211_send_iface()
3987 (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in nl80211_send_iface()
3988 nla_put_string(msg, NL80211_ATTR_IFNAME, dev->name))) in nl80211_send_iface()
3991 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_iface()
3992 nla_put_u32(msg, NL80211_ATTR_IFTYPE, wdev->iftype) || in nl80211_send_iface()
3997 rdev->devlist_generation ^ in nl80211_send_iface()
3999 nla_put_u8(msg, NL80211_ATTR_4ADDR, wdev->use_4addr)) in nl80211_send_iface()
4002 if (rdev->ops->get_channel && !wdev->valid_links) { in nl80211_send_iface()
4011 if (rdev->ops->get_tx_power) { in nl80211_send_iface()
4021 switch (wdev->iftype) { in nl80211_send_iface()
4024 if (wdev->u.ap.ssid_len && in nl80211_send_iface()
4025 nla_put(msg, NL80211_ATTR_SSID, wdev->u.ap.ssid_len, in nl80211_send_iface()
4026 wdev->u.ap.ssid)) in nl80211_send_iface()
4031 if (wdev->u.client.ssid_len && in nl80211_send_iface()
4032 nla_put(msg, NL80211_ATTR_SSID, wdev->u.client.ssid_len, in nl80211_send_iface()
4033 wdev->u.client.ssid)) in nl80211_send_iface()
4037 if (wdev->u.ibss.ssid_len && in nl80211_send_iface()
4038 nla_put(msg, NL80211_ATTR_SSID, wdev->u.ibss.ssid_len, in nl80211_send_iface()
4039 wdev->u.ibss.ssid)) in nl80211_send_iface()
4047 if (rdev->ops->get_txq_stats) { in nl80211_send_iface()
4057 if (wdev->valid_links) { in nl80211_send_iface()
4076 wdev->links[link_id].addr)) in nl80211_send_iface()
4094 return -EMSGSIZE; in nl80211_send_iface()
4101 int wp_start = cb->args[0]; in nl80211_dump_interface()
4102 int if_start = cb->args[1]; in nl80211_dump_interface()
4103 int filter_wiphy = -1; in nl80211_dump_interface()
4109 if (!cb->args[2]) { in nl80211_dump_interface()
4111 .filter_wiphy = -1, in nl80211_dump_interface()
4121 * if filtering, set cb->args[2] to +1 since 0 is the default in nl80211_dump_interface()
4125 cb->args[2] = filter_wiphy + 1; in nl80211_dump_interface()
4127 cb->args[2] = -1; in nl80211_dump_interface()
4128 } else if (cb->args[2] > 0) { in nl80211_dump_interface()
4129 filter_wiphy = cb->args[2] - 1; in nl80211_dump_interface()
4133 if (!net_eq(wiphy_net(&rdev->wiphy), sock_net(skb->sk))) in nl80211_dump_interface()
4140 if (filter_wiphy >= 0 && filter_wiphy != rdev->wiphy_idx) in nl80211_dump_interface()
4145 wiphy_lock(&rdev->wiphy); in nl80211_dump_interface()
4146 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) { in nl80211_dump_interface()
4151 if (nl80211_send_iface(skb, NETLINK_CB(cb->skb).portid, in nl80211_dump_interface()
4152 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_dump_interface()
4155 wiphy_unlock(&rdev->wiphy); in nl80211_dump_interface()
4160 wiphy_unlock(&rdev->wiphy); in nl80211_dump_interface()
4166 cb->args[0] = wp_idx; in nl80211_dump_interface()
4167 cb->args[1] = if_idx; in nl80211_dump_interface()
4169 ret = skb->len; in nl80211_dump_interface()
4179 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_interface()
4180 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_get_interface()
4184 return -ENOMEM; in nl80211_get_interface()
4186 if (nl80211_send_iface(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_interface()
4189 return -ENOBUFS; in nl80211_get_interface()
4212 return -EINVAL; in parse_monitor_flags()
4215 return -EINVAL; in parse_monitor_flags()
4234 if (info->attrs[NL80211_ATTR_MNTR_FLAGS]) { in nl80211_parse_mon_options()
4236 return -EINVAL; in nl80211_parse_mon_options()
4238 err = parse_monitor_flags(info->attrs[NL80211_ATTR_MNTR_FLAGS], in nl80211_parse_mon_options()
4239 &params->flags); in nl80211_parse_mon_options()
4246 if (params->flags & MONITOR_FLAG_ACTIVE && in nl80211_parse_mon_options()
4247 !(rdev->wiphy.features & NL80211_FEATURE_ACTIVE_MONITOR)) in nl80211_parse_mon_options()
4248 return -EOPNOTSUPP; in nl80211_parse_mon_options()
4250 if (info->attrs[NL80211_ATTR_MU_MIMO_GROUP_DATA]) { in nl80211_parse_mon_options()
4255 return -EINVAL; in nl80211_parse_mon_options()
4257 if (!wiphy_ext_feature_isset(&rdev->wiphy, cap_flag)) in nl80211_parse_mon_options()
4258 return -EOPNOTSUPP; in nl80211_parse_mon_options()
4261 nla_data(info->attrs[NL80211_ATTR_MU_MIMO_GROUP_DATA]); in nl80211_parse_mon_options()
4265 (mumimo_groups[VHT_MUMIMO_GROUPS_DATA_LEN - 1] & BIT(7))) in nl80211_parse_mon_options()
4266 return -EINVAL; in nl80211_parse_mon_options()
4268 params->vht_mumimo_groups = mumimo_groups; in nl80211_parse_mon_options()
4272 if (info->attrs[NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR]) { in nl80211_parse_mon_options()
4276 return -EINVAL; in nl80211_parse_mon_options()
4278 if (!wiphy_ext_feature_isset(&rdev->wiphy, cap_flag)) in nl80211_parse_mon_options()
4279 return -EOPNOTSUPP; in nl80211_parse_mon_options()
4281 params->vht_mumimo_follow_addr = in nl80211_parse_mon_options()
4282 nla_data(info->attrs[NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR]); in nl80211_parse_mon_options()
4295 return -EBUSY; in nl80211_valid_4addr()
4301 if (rdev->wiphy.flags & WIPHY_FLAG_4ADDR_AP) in nl80211_valid_4addr()
4305 if (rdev->wiphy.flags & WIPHY_FLAG_4ADDR_STATION) in nl80211_valid_4addr()
4312 return -EOPNOTSUPP; in nl80211_valid_4addr()
4317 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_interface()
4321 struct net_device *dev = info->user_ptr[1]; in nl80211_set_interface()
4326 otype = ntype = dev->ieee80211_ptr->iftype; in nl80211_set_interface()
4328 if (info->attrs[NL80211_ATTR_IFTYPE]) { in nl80211_set_interface()
4329 ntype = nla_get_u32(info->attrs[NL80211_ATTR_IFTYPE]); in nl80211_set_interface()
4334 if (info->attrs[NL80211_ATTR_MESH_ID]) { in nl80211_set_interface()
4335 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_interface()
4338 return -EINVAL; in nl80211_set_interface()
4340 return -EINVAL; in nl80211_set_interface()
4342 return -EBUSY; in nl80211_set_interface()
4344 wdev->u.mesh.id_up_len = in nl80211_set_interface()
4345 nla_len(info->attrs[NL80211_ATTR_MESH_ID]); in nl80211_set_interface()
4346 memcpy(wdev->u.mesh.id, in nl80211_set_interface()
4347 nla_data(info->attrs[NL80211_ATTR_MESH_ID]), in nl80211_set_interface()
4348 wdev->u.mesh.id_up_len); in nl80211_set_interface()
4351 if (info->attrs[NL80211_ATTR_4ADDR]) { in nl80211_set_interface()
4352 params.use_4addr = !!nla_get_u8(info->attrs[NL80211_ATTR_4ADDR]); in nl80211_set_interface()
4358 params.use_4addr = -1; in nl80211_set_interface()
4372 if (!err && params.use_4addr != -1) in nl80211_set_interface()
4373 dev->ieee80211_ptr->use_4addr = params.use_4addr; in nl80211_set_interface()
4376 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_interface()
4386 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in _nl80211_new_interface()
4395 if (!info->attrs[NL80211_ATTR_IFNAME]) in _nl80211_new_interface()
4396 return -EINVAL; in _nl80211_new_interface()
4398 if (info->attrs[NL80211_ATTR_IFTYPE]) in _nl80211_new_interface()
4399 type = nla_get_u32(info->attrs[NL80211_ATTR_IFTYPE]); in _nl80211_new_interface()
4401 if (!rdev->ops->add_virtual_intf) in _nl80211_new_interface()
4402 return -EOPNOTSUPP; in _nl80211_new_interface()
4405 rdev->wiphy.features & NL80211_FEATURE_MAC_ON_CREATE) && in _nl80211_new_interface()
4406 info->attrs[NL80211_ATTR_MAC]) { in _nl80211_new_interface()
4407 nla_memcpy(params.macaddr, info->attrs[NL80211_ATTR_MAC], in _nl80211_new_interface()
4410 return -EADDRNOTAVAIL; in _nl80211_new_interface()
4413 if (info->attrs[NL80211_ATTR_4ADDR]) { in _nl80211_new_interface()
4414 params.use_4addr = !!nla_get_u8(info->attrs[NL80211_ATTR_4ADDR]); in _nl80211_new_interface()
4420 if (!cfg80211_iftype_allowed(&rdev->wiphy, type, params.use_4addr, 0)) in _nl80211_new_interface()
4421 return -EOPNOTSUPP; in _nl80211_new_interface()
4429 return -ENOMEM; in _nl80211_new_interface()
4432 nla_data(info->attrs[NL80211_ATTR_IFNAME]), in _nl80211_new_interface()
4436 return -EPROTO; in _nl80211_new_interface()
4442 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) in _nl80211_new_interface()
4443 wdev->owner_nlportid = info->snd_portid; in _nl80211_new_interface()
4447 if (!info->attrs[NL80211_ATTR_MESH_ID]) in _nl80211_new_interface()
4449 wdev->u.mesh.id_up_len = in _nl80211_new_interface()
4450 nla_len(info->attrs[NL80211_ATTR_MESH_ID]); in _nl80211_new_interface()
4451 memcpy(wdev->u.mesh.id, in _nl80211_new_interface()
4452 nla_data(info->attrs[NL80211_ATTR_MESH_ID]), in _nl80211_new_interface()
4453 wdev->u.mesh.id_up_len); in _nl80211_new_interface()
4468 if (nl80211_send_iface(msg, info->snd_portid, info->snd_seq, 0, in _nl80211_new_interface()
4471 return -ENOBUFS; in _nl80211_new_interface()
4479 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_new_interface()
4485 wiphy_lock(&rdev->wiphy); in nl80211_new_interface()
4487 wiphy_unlock(&rdev->wiphy); in nl80211_new_interface()
4494 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_del_interface()
4495 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_del_interface()
4497 if (!rdev->ops->del_virtual_intf) in nl80211_del_interface()
4498 return -EOPNOTSUPP; in nl80211_del_interface()
4509 mutex_unlock(&rdev->wiphy.mtx); in nl80211_del_interface()
4518 if (!wdev->netdev) in nl80211_del_interface()
4519 info->user_ptr[1] = NULL; in nl80211_del_interface()
4521 dev_close(wdev->netdev); in nl80211_del_interface()
4523 mutex_lock(&rdev->wiphy.mtx); in nl80211_del_interface()
4530 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_noack_map()
4531 struct net_device *dev = info->user_ptr[1]; in nl80211_set_noack_map()
4534 if (!info->attrs[NL80211_ATTR_NOACK_MAP]) in nl80211_set_noack_map()
4535 return -EINVAL; in nl80211_set_noack_map()
4537 if (!rdev->ops->set_noack_map) in nl80211_set_noack_map()
4538 return -EOPNOTSUPP; in nl80211_set_noack_map()
4540 noack_map = nla_get_u16(info->attrs[NL80211_ATTR_NOACK_MAP]); in nl80211_set_noack_map()
4550 if (link_id != -1) { in nl80211_validate_key_link_id()
4553 return -EINVAL; in nl80211_validate_key_link_id()
4559 if (wdev->valid_links) { in nl80211_validate_key_link_id()
4560 if (link_id == -1) { in nl80211_validate_key_link_id()
4563 return -EINVAL; in nl80211_validate_key_link_id()
4565 if (!(wdev->valid_links & BIT(link_id))) { in nl80211_validate_key_link_id()
4567 return -EINVAL; in nl80211_validate_key_link_id()
4569 } else if (link_id != -1) { in nl80211_validate_key_link_id()
4570 GENL_SET_ERR_MSG(info, "link ID not allowed for non-MLO group key"); in nl80211_validate_key_link_id()
4571 return -EINVAL; in nl80211_validate_key_link_id()
4588 if ((params->seq && in get_key_callback()
4589 nla_put(cookie->msg, NL80211_ATTR_KEY_SEQ, in get_key_callback()
4590 params->seq_len, params->seq)) || in get_key_callback()
4591 (params->cipher && in get_key_callback()
4592 nla_put_u32(cookie->msg, NL80211_ATTR_KEY_CIPHER, in get_key_callback()
4593 params->cipher))) in get_key_callback()
4596 key = nla_nest_start_noflag(cookie->msg, NL80211_ATTR_KEY); in get_key_callback()
4600 if ((params->seq && in get_key_callback()
4601 nla_put(cookie->msg, NL80211_KEY_SEQ, in get_key_callback()
4602 params->seq_len, params->seq)) || in get_key_callback()
4603 (params->cipher && in get_key_callback()
4604 nla_put_u32(cookie->msg, NL80211_KEY_CIPHER, in get_key_callback()
4605 params->cipher))) in get_key_callback()
4608 if (nla_put_u8(cookie->msg, NL80211_KEY_IDX, cookie->idx)) in get_key_callback()
4611 nla_nest_end(cookie->msg, key); in get_key_callback()
4615 cookie->error = 1; in get_key_callback()
4620 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_key()
4622 struct net_device *dev = info->user_ptr[1]; in nl80211_get_key()
4632 int link_id = nl80211_link_id_or_invalid(info->attrs); in nl80211_get_key()
4633 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_get_key()
4635 if (wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_get_key()
4639 if ((wdev->iftype == NL80211_IFTYPE_STATION || in nl80211_get_key()
4640 wdev->iftype == NL80211_IFTYPE_P2P_CLIENT) && in nl80211_get_key()
4641 wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_get_key()
4645 if (info->attrs[NL80211_ATTR_KEY_IDX]) { in nl80211_get_key()
4646 key_idx = nla_get_u8(info->attrs[NL80211_ATTR_KEY_IDX]); in nl80211_get_key()
4650 return -EINVAL; in nl80211_get_key()
4654 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_get_key()
4655 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_get_key()
4658 if (info->attrs[NL80211_ATTR_KEY_TYPE]) { in nl80211_get_key()
4659 u32 kt = nla_get_u32(info->attrs[NL80211_ATTR_KEY_TYPE]); in nl80211_get_key()
4663 return -EINVAL; in nl80211_get_key()
4667 if (!rdev->ops->get_key) in nl80211_get_key()
4668 return -EOPNOTSUPP; in nl80211_get_key()
4670 if (!pairwise && mac_addr && !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN)) in nl80211_get_key()
4671 return -ENOENT; in nl80211_get_key()
4675 return -ENOMEM; in nl80211_get_key()
4677 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_key()
4685 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in nl80211_get_key()
4709 err = -ENOBUFS; in nl80211_get_key()
4717 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_key()
4720 struct net_device *dev = info->user_ptr[1]; in nl80211_set_key()
4721 int link_id = nl80211_link_id_or_invalid(info->attrs); in nl80211_set_key()
4722 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_key()
4729 return -EINVAL; in nl80211_set_key()
4736 return -EINVAL; in nl80211_set_key()
4739 if (!rdev->ops->set_default_key) in nl80211_set_key()
4740 return -EOPNOTSUPP; in nl80211_set_key()
4757 wdev->wext.default_key = key.idx; in nl80211_set_key()
4762 return -EINVAL; in nl80211_set_key()
4764 if (!rdev->ops->set_default_mgmt_key) in nl80211_set_key()
4765 return -EOPNOTSUPP; in nl80211_set_key()
4780 wdev->wext.default_mgmt_key = key.idx; in nl80211_set_key()
4785 return -EINVAL; in nl80211_set_key()
4787 if (!rdev->ops->set_default_beacon_key) in nl80211_set_key()
4788 return -EOPNOTSUPP; in nl80211_set_key()
4800 wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_set_key()
4804 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_set_key()
4805 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_set_key()
4808 return -EINVAL; in nl80211_set_key()
4819 return -EINVAL; in nl80211_set_key()
4824 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_new_key()
4826 struct net_device *dev = info->user_ptr[1]; in nl80211_new_key()
4829 int link_id = nl80211_link_id_or_invalid(info->attrs); in nl80211_new_key()
4830 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_new_key()
4838 return -EINVAL; in nl80211_new_key()
4841 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_new_key()
4842 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_new_key()
4844 if (key.type == -1) { in nl80211_new_key()
4855 return -EINVAL; in nl80211_new_key()
4859 info->attrs[NL80211_ATTR_VLAN_ID]) in nl80211_new_key()
4860 key.p.vlan_id = nla_get_u16(info->attrs[NL80211_ATTR_VLAN_ID]); in nl80211_new_key()
4862 if (!rdev->ops->add_key) in nl80211_new_key()
4863 return -EOPNOTSUPP; in nl80211_new_key()
4869 return -EINVAL; in nl80211_new_key()
4893 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_del_key()
4895 struct net_device *dev = info->user_ptr[1]; in nl80211_del_key()
4898 int link_id = nl80211_link_id_or_invalid(info->attrs); in nl80211_del_key()
4899 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_del_key()
4905 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_del_key()
4906 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_del_key()
4908 if (key.type == -1) { in nl80211_del_key()
4918 return -EINVAL; in nl80211_del_key()
4922 return -EINVAL; in nl80211_del_key()
4924 if (!rdev->ops->del_key) in nl80211_del_key()
4925 return -EOPNOTSUPP; in nl80211_del_key()
4930 !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN)) in nl80211_del_key()
4931 err = -ENOENT; in nl80211_del_key()
4944 if (key.idx == wdev->wext.default_key) in nl80211_del_key()
4945 wdev->wext.default_key = -1; in nl80211_del_key()
4946 else if (key.idx == wdev->wext.default_mgmt_key) in nl80211_del_key()
4947 wdev->wext.default_mgmt_key = -1; in nl80211_del_key()
4962 return -EINVAL; in validate_acl_mac_addrs()
4983 if (!wiphy->max_acl_mac_addrs) in parse_acl_data()
4984 return ERR_PTR(-EOPNOTSUPP); in parse_acl_data()
4986 if (!info->attrs[NL80211_ATTR_ACL_POLICY]) in parse_acl_data()
4987 return ERR_PTR(-EINVAL); in parse_acl_data()
4989 acl_policy = nla_get_u32(info->attrs[NL80211_ATTR_ACL_POLICY]); in parse_acl_data()
4992 return ERR_PTR(-EINVAL); in parse_acl_data()
4994 if (!info->attrs[NL80211_ATTR_MAC_ADDRS]) in parse_acl_data()
4995 return ERR_PTR(-EINVAL); in parse_acl_data()
4997 n_entries = validate_acl_mac_addrs(info->attrs[NL80211_ATTR_MAC_ADDRS]); in parse_acl_data()
5001 if (n_entries > wiphy->max_acl_mac_addrs) in parse_acl_data()
5002 return ERR_PTR(-EOPNOTSUPP); in parse_acl_data()
5006 return ERR_PTR(-ENOMEM); in parse_acl_data()
5007 acl->n_acl_entries = n_entries; in parse_acl_data()
5009 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_MAC_ADDRS], tmp) { in parse_acl_data()
5010 memcpy(acl->mac_addrs[i].addr, nla_data(attr), ETH_ALEN); in parse_acl_data()
5013 acl->acl_policy = acl_policy; in parse_acl_data()
5020 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_mac_acl()
5021 struct net_device *dev = info->user_ptr[1]; in nl80211_set_mac_acl()
5025 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && in nl80211_set_mac_acl()
5026 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_set_mac_acl()
5027 return -EOPNOTSUPP; in nl80211_set_mac_acl()
5029 if (!dev->ieee80211_ptr->links[0].ap.beacon_interval) in nl80211_set_mac_acl()
5030 return -EINVAL; in nl80211_set_mac_acl()
5032 acl = parse_acl_data(&rdev->wiphy, info); in nl80211_set_mac_acl()
5053 for (ridx = 0; ridx < sband->n_bitrates; ridx++) { in rateset_to_mask()
5055 &sband->bitrates[ridx]; in rateset_to_mask()
5056 if (rate == srate->bitrate) { in rateset_to_mask()
5061 if (ridx == sband->n_bitrates) in rateset_to_mask()
5088 if (sband->ht_cap.mcs.rx_mask[ridx] & rbit) in ht_rateset_to_mask()
5135 u16 tx_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map); in vht_set_mcs_mask()
5139 if (!sband->vht_cap.vht_supported) in vht_set_mcs_mask()
5148 if ((tx_mcs_mask[i] & txrate->mcs[i]) == txrate->mcs[i]) in vht_set_mcs_mask()
5149 mcs[i] = txrate->mcs[i]; in vht_set_mcs_mask()
5188 struct net_device *dev = info->user_ptr[1]; in he_get_txmcsmap()
5189 struct wireless_dev *wdev = dev->ieee80211_ptr; in he_get_txmcsmap()
5199 return le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_80); in he_get_txmcsmap()
5202 switch (chandef->width) { in he_get_txmcsmap()
5204 tx_mcs = he_cap->he_mcs_nss_supp.tx_mcs_80p80; in he_get_txmcsmap()
5207 tx_mcs = he_cap->he_mcs_nss_supp.tx_mcs_160; in he_get_txmcsmap()
5210 tx_mcs = he_cap->he_mcs_nss_supp.tx_mcs_80; in he_get_txmcsmap()
5229 he_cap = ieee80211_get_he_iftype_cap(sband, wdev->iftype); in he_set_mcs_mask()
5241 if ((tx_mcs_mask[i] & txrate->mcs[i]) == txrate->mcs[i]) in he_set_mcs_mask()
5242 mcs[i] = txrate->mcs[i]; in he_set_mcs_mask()
5259 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_parse_tx_bitrate_mask()
5260 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_parse_tx_bitrate_mask()
5274 sband = rdev->wiphy.bands[i]; in nl80211_parse_tx_bitrate_mask()
5279 mask->control[i].legacy = (1 << sband->n_bitrates) - 1; in nl80211_parse_tx_bitrate_mask()
5280 memcpy(mask->control[i].ht_mcs, in nl80211_parse_tx_bitrate_mask()
5281 sband->ht_cap.mcs.rx_mask, in nl80211_parse_tx_bitrate_mask()
5282 sizeof(mask->control[i].ht_mcs)); in nl80211_parse_tx_bitrate_mask()
5284 if (sband->vht_cap.vht_supported) { in nl80211_parse_tx_bitrate_mask()
5285 vht_tx_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map); in nl80211_parse_tx_bitrate_mask()
5286 vht_build_mcs_mask(vht_tx_mcs_map, mask->control[i].vht_mcs); in nl80211_parse_tx_bitrate_mask()
5289 he_cap = ieee80211_get_he_iftype_cap(sband, wdev->iftype); in nl80211_parse_tx_bitrate_mask()
5294 he_build_mcs_mask(he_tx_mcs_map, mask->control[i].he_mcs); in nl80211_parse_tx_bitrate_mask()
5296 mask->control[i].he_gi = 0xFF; in nl80211_parse_tx_bitrate_mask()
5297 mask->control[i].he_ltf = 0xFF; in nl80211_parse_tx_bitrate_mask()
5313 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
5314 sband = rdev->wiphy.bands[band]; in nl80211_parse_tx_bitrate_mask()
5316 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
5320 info->extack); in nl80211_parse_tx_bitrate_mask()
5324 mask->control[band].legacy = rateset_to_mask( in nl80211_parse_tx_bitrate_mask()
5328 if ((mask->control[band].legacy == 0) && in nl80211_parse_tx_bitrate_mask()
5330 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
5337 mask->control[band].ht_mcs)) in nl80211_parse_tx_bitrate_mask()
5338 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
5345 mask->control[band].vht_mcs)) in nl80211_parse_tx_bitrate_mask()
5346 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
5350 mask->control[band].gi = in nl80211_parse_tx_bitrate_mask()
5352 if (mask->control[band].gi > NL80211_TXRATE_FORCE_LGI) in nl80211_parse_tx_bitrate_mask()
5353 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
5358 mask->control[band].he_mcs, in nl80211_parse_tx_bitrate_mask()
5360 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
5363 mask->control[band].he_gi = in nl80211_parse_tx_bitrate_mask()
5366 mask->control[band].he_ltf = in nl80211_parse_tx_bitrate_mask()
5369 if (mask->control[band].legacy == 0) { in nl80211_parse_tx_bitrate_mask()
5373 if (!(rdev->wiphy.bands[band]->ht_cap.ht_supported || in nl80211_parse_tx_bitrate_mask()
5374 rdev->wiphy.bands[band]->vht_cap.vht_supported || in nl80211_parse_tx_bitrate_mask()
5375 ieee80211_get_he_iftype_cap(sband, wdev->iftype))) in nl80211_parse_tx_bitrate_mask()
5376 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
5379 if (mask->control[band].ht_mcs[i]) in nl80211_parse_tx_bitrate_mask()
5383 if (mask->control[band].vht_mcs[i]) in nl80211_parse_tx_bitrate_mask()
5387 if (mask->control[band].he_mcs[i]) in nl80211_parse_tx_bitrate_mask()
5391 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
5404 u32 rate = beacon_rate->control[band].legacy; in validate_beacon_tx_rate()
5408 return -EINVAL; in validate_beacon_tx_rate()
5412 if (hweight8(beacon_rate->control[band].ht_mcs[i]) > 1) { in validate_beacon_tx_rate()
5413 return -EINVAL; in validate_beacon_tx_rate()
5414 } else if (beacon_rate->control[band].ht_mcs[i]) { in validate_beacon_tx_rate()
5417 return -EINVAL; in validate_beacon_tx_rate()
5420 return -EINVAL; in validate_beacon_tx_rate()
5425 if (hweight16(beacon_rate->control[band].vht_mcs[i]) > 1) { in validate_beacon_tx_rate()
5426 return -EINVAL; in validate_beacon_tx_rate()
5427 } else if (beacon_rate->control[band].vht_mcs[i]) { in validate_beacon_tx_rate()
5430 return -EINVAL; in validate_beacon_tx_rate()
5433 return -EINVAL; in validate_beacon_tx_rate()
5438 if (hweight16(beacon_rate->control[band].he_mcs[i]) > 1) { in validate_beacon_tx_rate()
5439 return -EINVAL; in validate_beacon_tx_rate()
5440 } else if (beacon_rate->control[band].he_mcs[i]) { in validate_beacon_tx_rate()
5443 return -EINVAL; in validate_beacon_tx_rate()
5446 return -EINVAL; in validate_beacon_tx_rate()
5451 return -EINVAL; in validate_beacon_tx_rate()
5454 !wiphy_ext_feature_isset(&rdev->wiphy, in validate_beacon_tx_rate()
5456 return -EINVAL; in validate_beacon_tx_rate()
5458 !wiphy_ext_feature_isset(&rdev->wiphy, in validate_beacon_tx_rate()
5460 return -EINVAL; in validate_beacon_tx_rate()
5462 !wiphy_ext_feature_isset(&rdev->wiphy, in validate_beacon_tx_rate()
5464 return -EINVAL; in validate_beacon_tx_rate()
5466 !wiphy_ext_feature_isset(&rdev->wiphy, in validate_beacon_tx_rate()
5468 return -EINVAL; in validate_beacon_tx_rate()
5481 if (!wiphy->mbssid_max_interfaces) in nl80211_parse_mbssid_config()
5482 return -EOPNOTSUPP; in nl80211_parse_mbssid_config()
5487 return -EINVAL; in nl80211_parse_mbssid_config()
5489 config->ema = nla_get_flag(tb[NL80211_MBSSID_CONFIG_ATTR_EMA]); in nl80211_parse_mbssid_config()
5490 if (config->ema) { in nl80211_parse_mbssid_config()
5491 if (!wiphy->ema_max_profile_periodicity) in nl80211_parse_mbssid_config()
5492 return -EOPNOTSUPP; in nl80211_parse_mbssid_config()
5494 if (num_elems > wiphy->ema_max_profile_periodicity) in nl80211_parse_mbssid_config()
5495 return -EINVAL; in nl80211_parse_mbssid_config()
5498 config->index = nla_get_u8(tb[NL80211_MBSSID_CONFIG_ATTR_INDEX]); in nl80211_parse_mbssid_config()
5499 if (config->index >= wiphy->mbssid_max_interfaces || in nl80211_parse_mbssid_config()
5500 (!config->index && !num_elems)) in nl80211_parse_mbssid_config()
5501 return -EINVAL; in nl80211_parse_mbssid_config()
5507 if ((!config->index && tx_ifindex != dev->ifindex) || in nl80211_parse_mbssid_config()
5508 (config->index && tx_ifindex == dev->ifindex)) in nl80211_parse_mbssid_config()
5509 return -EINVAL; in nl80211_parse_mbssid_config()
5511 if (tx_ifindex != dev->ifindex) { in nl80211_parse_mbssid_config()
5515 if (!tx_netdev || !tx_netdev->ieee80211_ptr || in nl80211_parse_mbssid_config()
5516 tx_netdev->ieee80211_ptr->wiphy != wiphy || in nl80211_parse_mbssid_config()
5517 tx_netdev->ieee80211_ptr->iftype != in nl80211_parse_mbssid_config()
5520 return -EINVAL; in nl80211_parse_mbssid_config()
5523 config->tx_wdev = tx_netdev->ieee80211_ptr; in nl80211_parse_mbssid_config()
5525 config->tx_wdev = dev->ieee80211_ptr; in nl80211_parse_mbssid_config()
5527 } else if (!config->index) { in nl80211_parse_mbssid_config()
5528 config->tx_wdev = dev->ieee80211_ptr; in nl80211_parse_mbssid_config()
5530 return -EINVAL; in nl80211_parse_mbssid_config()
5544 if (!wiphy->mbssid_max_interfaces) in nl80211_parse_mbssid_elems()
5545 return ERR_PTR(-EINVAL); in nl80211_parse_mbssid_elems()
5549 return ERR_PTR(-EINVAL); in nl80211_parse_mbssid_elems()
5555 return ERR_PTR(-ENOMEM); in nl80211_parse_mbssid_elems()
5556 elems->cnt = num_elems; in nl80211_parse_mbssid_elems()
5559 elems->elem[i].data = nla_data(nl_elems); in nl80211_parse_mbssid_elems()
5560 elems->elem[i].len = nla_len(nl_elems); in nl80211_parse_mbssid_elems()
5587 return ERR_PTR(-ENOMEM); in nl80211_parse_rnr_elems()
5588 elems->cnt = num_elems; in nl80211_parse_rnr_elems()
5591 elems->elem[i].data = nla_data(nl_elems); in nl80211_parse_rnr_elems()
5592 elems->elem[i].len = nla_len(nl_elems); in nl80211_parse_rnr_elems()
5610 return -EINVAL; in nl80211_parse_he_bss_color()
5612 he_bss_color->color = in nl80211_parse_he_bss_color()
5614 he_bss_color->enabled = in nl80211_parse_he_bss_color()
5616 he_bss_color->partial = in nl80211_parse_he_bss_color()
5632 bcn->link_id = nl80211_link_id(attrs); in nl80211_parse_beacon()
5635 bcn->head = nla_data(attrs[NL80211_ATTR_BEACON_HEAD]); in nl80211_parse_beacon()
5636 bcn->head_len = nla_len(attrs[NL80211_ATTR_BEACON_HEAD]); in nl80211_parse_beacon()
5637 if (!bcn->head_len) in nl80211_parse_beacon()
5638 return -EINVAL; in nl80211_parse_beacon()
5643 bcn->tail = nla_data(attrs[NL80211_ATTR_BEACON_TAIL]); in nl80211_parse_beacon()
5644 bcn->tail_len = nla_len(attrs[NL80211_ATTR_BEACON_TAIL]); in nl80211_parse_beacon()
5649 return -EINVAL; in nl80211_parse_beacon()
5652 bcn->beacon_ies = nla_data(attrs[NL80211_ATTR_IE]); in nl80211_parse_beacon()
5653 bcn->beacon_ies_len = nla_len(attrs[NL80211_ATTR_IE]); in nl80211_parse_beacon()
5657 bcn->proberesp_ies = in nl80211_parse_beacon()
5659 bcn->proberesp_ies_len = in nl80211_parse_beacon()
5664 bcn->assocresp_ies = in nl80211_parse_beacon()
5666 bcn->assocresp_ies_len = in nl80211_parse_beacon()
5671 bcn->probe_resp = nla_data(attrs[NL80211_ATTR_PROBE_RESP]); in nl80211_parse_beacon()
5672 bcn->probe_resp_len = nla_len(attrs[NL80211_ATTR_PROBE_RESP]); in nl80211_parse_beacon()
5686 wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_parse_beacon()
5688 bcn->ftm_responder = 1; in nl80211_parse_beacon()
5690 return -EOPNOTSUPP; in nl80211_parse_beacon()
5693 bcn->lci = nla_data(tb[NL80211_FTM_RESP_ATTR_LCI]); in nl80211_parse_beacon()
5694 bcn->lci_len = nla_len(tb[NL80211_FTM_RESP_ATTR_LCI]); in nl80211_parse_beacon()
5698 bcn->civicloc = nla_data(tb[NL80211_FTM_RESP_ATTR_CIVICLOC]); in nl80211_parse_beacon()
5699 bcn->civicloc_len = nla_len(tb[NL80211_FTM_RESP_ATTR_CIVICLOC]); in nl80211_parse_beacon()
5702 bcn->ftm_responder = -1; in nl80211_parse_beacon()
5707 &bcn->he_bss_color); in nl80211_parse_beacon()
5710 bcn->he_bss_color_valid = true; in nl80211_parse_beacon()
5715 nl80211_parse_mbssid_elems(&rdev->wiphy, in nl80211_parse_beacon()
5721 bcn->mbssid_ies = mbssid; in nl80211_parse_beacon()
5723 if (bcn->mbssid_ies && attrs[NL80211_ATTR_EMA_RNR_ELEMS]) { in nl80211_parse_beacon()
5725 nl80211_parse_rnr_elems(&rdev->wiphy, in nl80211_parse_beacon()
5732 if (rnr && rnr->cnt < bcn->mbssid_ies->cnt) in nl80211_parse_beacon()
5733 return -EINVAL; in nl80211_parse_beacon()
5735 bcn->rnr_ies = rnr; in nl80211_parse_beacon()
5754 return -EINVAL; in nl80211_parse_he_obss_pd()
5756 he_obss_pd->sr_ctrl = nla_get_u8(tb[NL80211_HE_OBSS_PD_ATTR_SR_CTRL]); in nl80211_parse_he_obss_pd()
5759 he_obss_pd->min_offset = in nl80211_parse_he_obss_pd()
5762 he_obss_pd->max_offset = in nl80211_parse_he_obss_pd()
5765 he_obss_pd->non_srg_max_offset = in nl80211_parse_he_obss_pd()
5768 if (he_obss_pd->min_offset > he_obss_pd->max_offset) in nl80211_parse_he_obss_pd()
5769 return -EINVAL; in nl80211_parse_he_obss_pd()
5772 memcpy(he_obss_pd->bss_color_bitmap, in nl80211_parse_he_obss_pd()
5774 sizeof(he_obss_pd->bss_color_bitmap)); in nl80211_parse_he_obss_pd()
5777 memcpy(he_obss_pd->partial_bssid_bitmap, in nl80211_parse_he_obss_pd()
5779 sizeof(he_obss_pd->partial_bssid_bitmap)); in nl80211_parse_he_obss_pd()
5781 he_obss_pd->enable = true; in nl80211_parse_he_obss_pd()
5793 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_parse_fils_discovery()
5795 return -EINVAL; in nl80211_parse_fils_discovery()
5805 fd->update = true; in nl80211_parse_fils_discovery()
5812 return -EINVAL; in nl80211_parse_fils_discovery()
5814 fd->tmpl_len = nla_len(tb[NL80211_FILS_DISCOVERY_ATTR_TMPL]); in nl80211_parse_fils_discovery()
5815 fd->tmpl = nla_data(tb[NL80211_FILS_DISCOVERY_ATTR_TMPL]); in nl80211_parse_fils_discovery()
5816 fd->min_interval = nla_get_u32(tb[NL80211_FILS_DISCOVERY_ATTR_INT_MIN]); in nl80211_parse_fils_discovery()
5817 fd->max_interval = nla_get_u32(tb[NL80211_FILS_DISCOVERY_ATTR_INT_MAX]); in nl80211_parse_fils_discovery()
5818 fd->update = true; in nl80211_parse_fils_discovery()
5830 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_parse_unsol_bcast_probe_resp()
5832 return -EINVAL; in nl80211_parse_unsol_bcast_probe_resp()
5841 presp->update = true; in nl80211_parse_unsol_bcast_probe_resp()
5847 return -EINVAL; in nl80211_parse_unsol_bcast_probe_resp()
5849 presp->tmpl = nla_data(tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_TMPL]); in nl80211_parse_unsol_bcast_probe_resp()
5850 presp->tmpl_len = nla_len(tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_TMPL]); in nl80211_parse_unsol_bcast_probe_resp()
5851 presp->interval = nla_get_u32(tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_INT]); in nl80211_parse_unsol_bcast_probe_resp()
5852 presp->update = true; in nl80211_parse_unsol_bcast_probe_resp()
5864 for (i = 0; i < rates->datalen; i++) { in nl80211_check_ap_rate_selectors()
5865 if (rates->data[i] == BSS_MEMBERSHIP_SELECTOR_HT_PHY) in nl80211_check_ap_rate_selectors()
5866 params->ht_required = true; in nl80211_check_ap_rate_selectors()
5867 if (rates->data[i] == BSS_MEMBERSHIP_SELECTOR_VHT_PHY) in nl80211_check_ap_rate_selectors()
5868 params->vht_required = true; in nl80211_check_ap_rate_selectors()
5869 if (rates->data[i] == BSS_MEMBERSHIP_SELECTOR_HE_PHY) in nl80211_check_ap_rate_selectors()
5870 params->he_required = true; in nl80211_check_ap_rate_selectors()
5871 if (rates->data[i] == BSS_MEMBERSHIP_SELECTOR_SAE_H2E) in nl80211_check_ap_rate_selectors()
5872 params->sae_h2e_required = true; in nl80211_check_ap_rate_selectors()
5883 const struct cfg80211_beacon_data *bcn = &params->beacon; in nl80211_calculate_ap_params()
5884 size_t ies_len = bcn->tail_len; in nl80211_calculate_ap_params()
5885 const u8 *ies = bcn->tail; in nl80211_calculate_ap_params()
5896 if (cap && cap->datalen >= sizeof(*params->ht_cap)) in nl80211_calculate_ap_params()
5897 params->ht_cap = (void *)cap->data; in nl80211_calculate_ap_params()
5899 if (cap && cap->datalen >= sizeof(*params->vht_cap)) in nl80211_calculate_ap_params()
5900 params->vht_cap = (void *)cap->data; in nl80211_calculate_ap_params()
5902 if (cap && cap->datalen >= sizeof(*params->he_cap) + 1) in nl80211_calculate_ap_params()
5903 params->he_cap = (void *)(cap->data + 1); in nl80211_calculate_ap_params()
5905 if (cap && cap->datalen >= sizeof(*params->he_oper) + 1) in nl80211_calculate_ap_params()
5906 params->he_oper = (void *)(cap->data + 1); in nl80211_calculate_ap_params()
5909 if (!cap->datalen) in nl80211_calculate_ap_params()
5910 return -EINVAL; in nl80211_calculate_ap_params()
5911 params->eht_cap = (void *)(cap->data + 1); in nl80211_calculate_ap_params()
5912 if (!ieee80211_eht_capa_size_ok((const u8 *)params->he_cap, in nl80211_calculate_ap_params()
5913 (const u8 *)params->eht_cap, in nl80211_calculate_ap_params()
5914 cap->datalen - 1, true)) in nl80211_calculate_ap_params()
5915 return -EINVAL; in nl80211_calculate_ap_params()
5919 if (!cap->datalen) in nl80211_calculate_ap_params()
5920 return -EINVAL; in nl80211_calculate_ap_params()
5921 params->eht_oper = (void *)(cap->data + 1); in nl80211_calculate_ap_params()
5922 if (!ieee80211_eht_oper_size_ok((const u8 *)params->eht_oper, in nl80211_calculate_ap_params()
5923 cap->datalen - 1)) in nl80211_calculate_ap_params()
5924 return -EINVAL; in nl80211_calculate_ap_params()
5934 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) { in nl80211_get_ap_channel()
5935 if (wdev->iftype != NL80211_IFTYPE_AP && in nl80211_get_ap_channel()
5936 wdev->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_get_ap_channel()
5939 if (!wdev->u.ap.preset_chandef.chan) in nl80211_get_ap_channel()
5942 params->chandef = wdev->u.ap.preset_chandef; in nl80211_get_ap_channel()
5958 if (!(rdev->wiphy.features & NL80211_FEATURE_SAE) && in nl80211_valid_auth_type()
5961 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_valid_auth_type()
5969 if (!(rdev->wiphy.features & NL80211_FEATURE_SAE) && in nl80211_valid_auth_type()
5970 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_valid_auth_type()
5980 &rdev->wiphy, in nl80211_valid_auth_type()
5986 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_valid_auth_type()
6004 struct wiphy *wiphy = wdev->wiphy; in nl80211_send_ap_started()
6017 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_ap_started()
6018 nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex) || in nl80211_send_ap_started()
6021 (wdev->u.ap.ssid_len && in nl80211_send_ap_started()
6022 nla_put(msg, NL80211_ATTR_SSID, wdev->u.ap.ssid_len, in nl80211_send_ap_started()
6023 wdev->u.ap.ssid)) || in nl80211_send_ap_started()
6024 (wdev->valid_links && in nl80211_send_ap_started()
6039 struct ieee80211_channel *channel = params->chandef.chan; in nl80211_validate_ap_phy_operation()
6041 if ((params->he_cap || params->he_oper) && in nl80211_validate_ap_phy_operation()
6042 (channel->flags & IEEE80211_CHAN_NO_HE)) in nl80211_validate_ap_phy_operation()
6043 return -EOPNOTSUPP; in nl80211_validate_ap_phy_operation()
6045 if ((params->eht_cap || params->eht_oper) && in nl80211_validate_ap_phy_operation()
6046 (channel->flags & IEEE80211_CHAN_NO_EHT)) in nl80211_validate_ap_phy_operation()
6047 return -EOPNOTSUPP; in nl80211_validate_ap_phy_operation()
6054 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_start_ap()
6056 unsigned int link_id = nl80211_link_id(info->attrs); in nl80211_start_ap()
6057 struct net_device *dev = info->user_ptr[1]; in nl80211_start_ap()
6058 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_start_ap()
6062 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && in nl80211_start_ap()
6063 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_start_ap()
6064 return -EOPNOTSUPP; in nl80211_start_ap()
6066 if (!rdev->ops->start_ap) in nl80211_start_ap()
6067 return -EOPNOTSUPP; in nl80211_start_ap()
6069 if (wdev->links[link_id].cac_started) in nl80211_start_ap()
6070 return -EBUSY; in nl80211_start_ap()
6072 if (wdev->links[link_id].ap.beacon_interval) in nl80211_start_ap()
6073 return -EALREADY; in nl80211_start_ap()
6076 if (!info->attrs[NL80211_ATTR_BEACON_INTERVAL] || in nl80211_start_ap()
6077 !info->attrs[NL80211_ATTR_DTIM_PERIOD] || in nl80211_start_ap()
6078 !info->attrs[NL80211_ATTR_BEACON_HEAD]) in nl80211_start_ap()
6079 return -EINVAL; in nl80211_start_ap()
6083 return -ENOMEM; in nl80211_start_ap()
6085 err = nl80211_parse_beacon(rdev, info->attrs, &params->beacon, in nl80211_start_ap()
6086 info->extack); in nl80211_start_ap()
6090 params->beacon_interval = in nl80211_start_ap()
6091 nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]); in nl80211_start_ap()
6092 params->dtim_period = in nl80211_start_ap()
6093 nla_get_u32(info->attrs[NL80211_ATTR_DTIM_PERIOD]); in nl80211_start_ap()
6095 err = cfg80211_validate_beacon_int(rdev, dev->ieee80211_ptr->iftype, in nl80211_start_ap()
6096 params->beacon_interval); in nl80211_start_ap()
6105 * additional information -- drivers must check! in nl80211_start_ap()
6107 if (info->attrs[NL80211_ATTR_SSID]) { in nl80211_start_ap()
6108 params->ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); in nl80211_start_ap()
6109 params->ssid_len = in nl80211_start_ap()
6110 nla_len(info->attrs[NL80211_ATTR_SSID]); in nl80211_start_ap()
6111 if (params->ssid_len == 0) { in nl80211_start_ap()
6112 err = -EINVAL; in nl80211_start_ap()
6116 if (wdev->u.ap.ssid_len && in nl80211_start_ap()
6117 (wdev->u.ap.ssid_len != params->ssid_len || in nl80211_start_ap()
6118 memcmp(wdev->u.ap.ssid, params->ssid, params->ssid_len))) { in nl80211_start_ap()
6120 err = -EINVAL; in nl80211_start_ap()
6123 } else if (wdev->valid_links) { in nl80211_start_ap()
6125 err = -EINVAL; in nl80211_start_ap()
6129 if (info->attrs[NL80211_ATTR_HIDDEN_SSID]) in nl80211_start_ap()
6130 params->hidden_ssid = nla_get_u32( in nl80211_start_ap()
6131 info->attrs[NL80211_ATTR_HIDDEN_SSID]); in nl80211_start_ap()
6133 params->privacy = !!info->attrs[NL80211_ATTR_PRIVACY]; in nl80211_start_ap()
6135 if (info->attrs[NL80211_ATTR_AUTH_TYPE]) { in nl80211_start_ap()
6136 params->auth_type = nla_get_u32( in nl80211_start_ap()
6137 info->attrs[NL80211_ATTR_AUTH_TYPE]); in nl80211_start_ap()
6138 if (!nl80211_valid_auth_type(rdev, params->auth_type, in nl80211_start_ap()
6140 err = -EINVAL; in nl80211_start_ap()
6144 params->auth_type = NL80211_AUTHTYPE_AUTOMATIC; in nl80211_start_ap()
6146 err = nl80211_crypto_settings(rdev, info, &params->crypto, in nl80211_start_ap()
6151 if (info->attrs[NL80211_ATTR_INACTIVITY_TIMEOUT]) { in nl80211_start_ap()
6152 if (!(rdev->wiphy.features & NL80211_FEATURE_INACTIVITY_TIMER)) { in nl80211_start_ap()
6153 err = -EOPNOTSUPP; in nl80211_start_ap()
6156 params->inactivity_timeout = nla_get_u16( in nl80211_start_ap()
6157 info->attrs[NL80211_ATTR_INACTIVITY_TIMEOUT]); in nl80211_start_ap()
6160 if (info->attrs[NL80211_ATTR_P2P_CTWINDOW]) { in nl80211_start_ap()
6161 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) { in nl80211_start_ap()
6162 err = -EINVAL; in nl80211_start_ap()
6165 params->p2p_ctwindow = in nl80211_start_ap()
6166 nla_get_u8(info->attrs[NL80211_ATTR_P2P_CTWINDOW]); in nl80211_start_ap()
6167 if (params->p2p_ctwindow != 0 && in nl80211_start_ap()
6168 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_CTWIN)) { in nl80211_start_ap()
6169 err = -EINVAL; in nl80211_start_ap()
6174 if (info->attrs[NL80211_ATTR_P2P_OPPPS]) { in nl80211_start_ap()
6177 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) { in nl80211_start_ap()
6178 err = -EINVAL; in nl80211_start_ap()
6181 tmp = nla_get_u8(info->attrs[NL80211_ATTR_P2P_OPPPS]); in nl80211_start_ap()
6182 params->p2p_opp_ps = tmp; in nl80211_start_ap()
6183 if (params->p2p_opp_ps != 0 && in nl80211_start_ap()
6184 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_OPPPS)) { in nl80211_start_ap()
6185 err = -EINVAL; in nl80211_start_ap()
6190 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { in nl80211_start_ap()
6191 err = nl80211_parse_chandef(rdev, info, &params->chandef); in nl80211_start_ap()
6194 } else if (wdev->valid_links) { in nl80211_start_ap()
6196 err = -EINVAL; in nl80211_start_ap()
6198 } else if (wdev->u.ap.preset_chandef.chan) { in nl80211_start_ap()
6199 params->chandef = wdev->u.ap.preset_chandef; in nl80211_start_ap()
6201 err = -EINVAL; in nl80211_start_ap()
6205 beacon_check.iftype = wdev->iftype; in nl80211_start_ap()
6208 cfg80211_get_6ghz_power_type(params->beacon.tail, in nl80211_start_ap()
6209 params->beacon.tail_len); in nl80211_start_ap()
6210 if (!cfg80211_reg_check_beaconing(&rdev->wiphy, &params->chandef, in nl80211_start_ap()
6212 err = -EINVAL; in nl80211_start_ap()
6216 if (info->attrs[NL80211_ATTR_TX_RATES]) { in nl80211_start_ap()
6217 err = nl80211_parse_tx_bitrate_mask(info, info->attrs, in nl80211_start_ap()
6219 &params->beacon_rate, in nl80211_start_ap()
6224 err = validate_beacon_tx_rate(rdev, params->chandef.chan->band, in nl80211_start_ap()
6225 &params->beacon_rate); in nl80211_start_ap()
6230 if (info->attrs[NL80211_ATTR_SMPS_MODE]) { in nl80211_start_ap()
6231 params->smps_mode = in nl80211_start_ap()
6232 nla_get_u8(info->attrs[NL80211_ATTR_SMPS_MODE]); in nl80211_start_ap()
6233 switch (params->smps_mode) { in nl80211_start_ap()
6237 if (!(rdev->wiphy.features & in nl80211_start_ap()
6239 err = -EINVAL; in nl80211_start_ap()
6244 if (!(rdev->wiphy.features & in nl80211_start_ap()
6246 err = -EINVAL; in nl80211_start_ap()
6251 err = -EINVAL; in nl80211_start_ap()
6255 params->smps_mode = NL80211_SMPS_OFF; in nl80211_start_ap()
6258 params->pbss = nla_get_flag(info->attrs[NL80211_ATTR_PBSS]); in nl80211_start_ap()
6259 if (params->pbss && !rdev->wiphy.bands[NL80211_BAND_60GHZ]) { in nl80211_start_ap()
6260 err = -EOPNOTSUPP; in nl80211_start_ap()
6264 if (info->attrs[NL80211_ATTR_ACL_POLICY]) { in nl80211_start_ap()
6265 params->acl = parse_acl_data(&rdev->wiphy, info); in nl80211_start_ap()
6266 if (IS_ERR(params->acl)) { in nl80211_start_ap()
6267 err = PTR_ERR(params->acl); in nl80211_start_ap()
6268 params->acl = NULL; in nl80211_start_ap()
6273 params->twt_responder = in nl80211_start_ap()
6274 nla_get_flag(info->attrs[NL80211_ATTR_TWT_RESPONDER]); in nl80211_start_ap()
6276 if (info->attrs[NL80211_ATTR_HE_OBSS_PD]) { in nl80211_start_ap()
6278 info->attrs[NL80211_ATTR_HE_OBSS_PD], in nl80211_start_ap()
6279 &params->he_obss_pd); in nl80211_start_ap()
6284 if (info->attrs[NL80211_ATTR_FILS_DISCOVERY]) { in nl80211_start_ap()
6286 info->attrs[NL80211_ATTR_FILS_DISCOVERY], in nl80211_start_ap()
6287 &params->fils_discovery); in nl80211_start_ap()
6292 if (info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP]) { in nl80211_start_ap()
6294 rdev, info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP], in nl80211_start_ap()
6295 &params->unsol_bcast_probe_resp); in nl80211_start_ap()
6300 if (info->attrs[NL80211_ATTR_MBSSID_CONFIG]) { in nl80211_start_ap()
6301 err = nl80211_parse_mbssid_config(&rdev->wiphy, dev, in nl80211_start_ap()
6302 info->attrs[NL80211_ATTR_MBSSID_CONFIG], in nl80211_start_ap()
6303 &params->mbssid_config, in nl80211_start_ap()
6304 params->beacon.mbssid_ies ? in nl80211_start_ap()
6305 params->beacon.mbssid_ies->cnt : in nl80211_start_ap()
6311 if (!params->mbssid_config.ema && params->beacon.rnr_ies) { in nl80211_start_ap()
6312 err = -EINVAL; in nl80211_start_ap()
6324 if (info->attrs[NL80211_ATTR_AP_SETTINGS_FLAGS]) in nl80211_start_ap()
6325 params->flags = nla_get_u32( in nl80211_start_ap()
6326 info->attrs[NL80211_ATTR_AP_SETTINGS_FLAGS]); in nl80211_start_ap()
6327 else if (info->attrs[NL80211_ATTR_EXTERNAL_AUTH_SUPPORT]) in nl80211_start_ap()
6328 params->flags |= NL80211_AP_SETTINGS_EXTERNAL_AUTH_SUPPORT; in nl80211_start_ap()
6330 if (wdev->conn_owner_nlportid && in nl80211_start_ap()
6331 info->attrs[NL80211_ATTR_SOCKET_OWNER] && in nl80211_start_ap()
6332 wdev->conn_owner_nlportid != info->snd_portid) { in nl80211_start_ap()
6333 err = -EINVAL; in nl80211_start_ap()
6337 /* FIXME: validate MLO/link-id against driver capabilities */ in nl80211_start_ap()
6341 wdev->links[link_id].ap.beacon_interval = params->beacon_interval; in nl80211_start_ap()
6342 wdev->links[link_id].ap.chandef = params->chandef; in nl80211_start_ap()
6343 wdev->u.ap.ssid_len = params->ssid_len; in nl80211_start_ap()
6344 memcpy(wdev->u.ap.ssid, params->ssid, in nl80211_start_ap()
6345 params->ssid_len); in nl80211_start_ap()
6347 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) in nl80211_start_ap()
6348 wdev->conn_owner_nlportid = info->snd_portid; in nl80211_start_ap()
6353 kfree(params->acl); in nl80211_start_ap()
6354 kfree(params->beacon.mbssid_ies); in nl80211_start_ap()
6355 if (params->mbssid_config.tx_wdev && in nl80211_start_ap()
6356 params->mbssid_config.tx_wdev->netdev && in nl80211_start_ap()
6357 params->mbssid_config.tx_wdev->netdev != dev) in nl80211_start_ap()
6358 dev_put(params->mbssid_config.tx_wdev->netdev); in nl80211_start_ap()
6359 kfree(params->beacon.rnr_ies); in nl80211_start_ap()
6367 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_beacon()
6369 unsigned int link_id = nl80211_link_id(info->attrs); in nl80211_set_beacon()
6370 struct net_device *dev = info->user_ptr[1]; in nl80211_set_beacon()
6371 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_beacon()
6376 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && in nl80211_set_beacon()
6377 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_set_beacon()
6378 return -EOPNOTSUPP; in nl80211_set_beacon()
6380 if (!rdev->ops->change_beacon) in nl80211_set_beacon()
6381 return -EOPNOTSUPP; in nl80211_set_beacon()
6383 if (!wdev->links[link_id].ap.beacon_interval) in nl80211_set_beacon()
6384 return -EINVAL; in nl80211_set_beacon()
6388 return -ENOMEM; in nl80211_set_beacon()
6390 err = nl80211_parse_beacon(rdev, info->attrs, &params->beacon, in nl80211_set_beacon()
6391 info->extack); in nl80211_set_beacon()
6396 beacon_check.iftype = wdev->iftype; in nl80211_set_beacon()
6399 cfg80211_get_6ghz_power_type(params->beacon.tail, in nl80211_set_beacon()
6400 params->beacon.tail_len); in nl80211_set_beacon()
6401 if (!cfg80211_reg_check_beaconing(&rdev->wiphy, in nl80211_set_beacon()
6402 &wdev->links[link_id].ap.chandef, in nl80211_set_beacon()
6404 err = -EINVAL; in nl80211_set_beacon()
6408 attr = info->attrs[NL80211_ATTR_FILS_DISCOVERY]; in nl80211_set_beacon()
6411 &params->fils_discovery); in nl80211_set_beacon()
6416 attr = info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP]; in nl80211_set_beacon()
6419 &params->unsol_bcast_probe_resp); in nl80211_set_beacon()
6427 kfree(params->beacon.mbssid_ies); in nl80211_set_beacon()
6428 kfree(params->beacon.rnr_ies); in nl80211_set_beacon()
6435 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_stop_ap()
6436 unsigned int link_id = nl80211_link_id(info->attrs); in nl80211_stop_ap()
6437 struct net_device *dev = info->user_ptr[1]; in nl80211_stop_ap()
6463 nla = info->attrs[NL80211_ATTR_STA_FLAGS2]; in parse_station_flags()
6468 params->sta_flags_mask = sta_flags->mask; in parse_station_flags()
6469 params->sta_flags_set = sta_flags->set; in parse_station_flags()
6470 params->sta_flags_set &= params->sta_flags_mask; in parse_station_flags()
6471 if ((params->sta_flags_mask | in parse_station_flags()
6472 params->sta_flags_set) & BIT(__NL80211_STA_FLAG_INVALID)) in parse_station_flags()
6473 return -EINVAL; in parse_station_flags()
6479 nla = info->attrs[NL80211_ATTR_STA_FLAGS]; in parse_station_flags()
6483 if (nla_parse_nested_deprecated(flags, NL80211_STA_FLAG_MAX, nla, sta_flags_policy, info->extack)) in parse_station_flags()
6484 return -EINVAL; in parse_station_flags()
6496 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHORIZED) | in parse_station_flags()
6503 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHORIZED) | in parse_station_flags()
6507 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHENTICATED) | in parse_station_flags()
6512 return -EINVAL; in parse_station_flags()
6517 params->sta_flags_set |= (1<<flag); in parse_station_flags()
6521 return -EINVAL; in parse_station_flags()
6541 /* report 16-bit bitrate only if we can */ in nl80211_put_sta_rate()
6550 switch (info->bw) { in nl80211_put_sta_rate()
6589 WARN_ON(!(info->flags & RATE_INFO_FLAGS_HE_MCS)); in nl80211_put_sta_rate()
6596 WARN_ON(!(info->flags & RATE_INFO_FLAGS_EHT_MCS)); in nl80211_put_sta_rate()
6603 if (info->flags & RATE_INFO_FLAGS_MCS) { in nl80211_put_sta_rate()
6604 if (nla_put_u8(msg, NL80211_RATE_INFO_MCS, info->mcs)) in nl80211_put_sta_rate()
6606 if (info->flags & RATE_INFO_FLAGS_SHORT_GI && in nl80211_put_sta_rate()
6609 } else if (info->flags & RATE_INFO_FLAGS_VHT_MCS) { in nl80211_put_sta_rate()
6610 if (nla_put_u8(msg, NL80211_RATE_INFO_VHT_MCS, info->mcs)) in nl80211_put_sta_rate()
6612 if (nla_put_u8(msg, NL80211_RATE_INFO_VHT_NSS, info->nss)) in nl80211_put_sta_rate()
6614 if (info->flags & RATE_INFO_FLAGS_SHORT_GI && in nl80211_put_sta_rate()
6617 } else if (info->flags & RATE_INFO_FLAGS_HE_MCS) { in nl80211_put_sta_rate()
6618 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_MCS, info->mcs)) in nl80211_put_sta_rate()
6620 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_NSS, info->nss)) in nl80211_put_sta_rate()
6622 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_GI, info->he_gi)) in nl80211_put_sta_rate()
6624 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_DCM, info->he_dcm)) in nl80211_put_sta_rate()
6626 if (info->bw == RATE_INFO_BW_HE_RU && in nl80211_put_sta_rate()
6628 info->he_ru_alloc)) in nl80211_put_sta_rate()
6630 } else if (info->flags & RATE_INFO_FLAGS_S1G_MCS) { in nl80211_put_sta_rate()
6631 if (nla_put_u8(msg, NL80211_RATE_INFO_S1G_MCS, info->mcs)) in nl80211_put_sta_rate()
6633 if (nla_put_u8(msg, NL80211_RATE_INFO_S1G_NSS, info->nss)) in nl80211_put_sta_rate()
6635 if (info->flags & RATE_INFO_FLAGS_SHORT_GI && in nl80211_put_sta_rate()
6638 } else if (info->flags & RATE_INFO_FLAGS_EHT_MCS) { in nl80211_put_sta_rate()
6639 if (nla_put_u8(msg, NL80211_RATE_INFO_EHT_MCS, info->mcs)) in nl80211_put_sta_rate()
6641 if (nla_put_u8(msg, NL80211_RATE_INFO_EHT_NSS, info->nss)) in nl80211_put_sta_rate()
6643 if (nla_put_u8(msg, NL80211_RATE_INFO_EHT_GI, info->eht_gi)) in nl80211_put_sta_rate()
6645 if (info->bw == RATE_INFO_BW_EHT_RU && in nl80211_put_sta_rate()
6647 info->eht_ru_alloc)) in nl80211_put_sta_rate()
6693 return -1; in nl80211_send_station()
6696 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in nl80211_send_station()
6698 nla_put_u32(msg, NL80211_ATTR_GENERATION, sinfo->generation)) in nl80211_send_station()
6707 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_ ## attr) && \ in nl80211_send_station()
6709 sinfo->memb)) \ in nl80211_send_station()
6713 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_ ## attr) && \ in nl80211_send_station()
6715 sinfo->memb, NL80211_STA_INFO_PAD)) \ in nl80211_send_station()
6723 if (sinfo->filled & (BIT_ULL(NL80211_STA_INFO_RX_BYTES) | in nl80211_send_station()
6726 (u32)sinfo->rx_bytes)) in nl80211_send_station()
6729 if (sinfo->filled & (BIT_ULL(NL80211_STA_INFO_TX_BYTES) | in nl80211_send_station()
6732 (u32)sinfo->tx_bytes)) in nl80211_send_station()
6743 if (wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_send_station()
6747 switch (rdev->wiphy.signal_type) { in nl80211_send_station()
6755 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL)) { in nl80211_send_station()
6756 if (!nl80211_put_signal(msg, sinfo->chains, in nl80211_send_station()
6757 sinfo->chain_signal, in nl80211_send_station()
6761 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL_AVG)) { in nl80211_send_station()
6762 if (!nl80211_put_signal(msg, sinfo->chains, in nl80211_send_station()
6763 sinfo->chain_signal_avg, in nl80211_send_station()
6767 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_TX_BITRATE)) { in nl80211_send_station()
6768 if (!nl80211_put_sta_rate(msg, &sinfo->txrate, in nl80211_send_station()
6772 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_RX_BITRATE)) { in nl80211_send_station()
6773 if (!nl80211_put_sta_rate(msg, &sinfo->rxrate, in nl80211_send_station()
6791 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_BSS_PARAM)) { in nl80211_send_station()
6797 if (((sinfo->bss_param.flags & BSS_PARAM_FLAGS_CTS_PROT) && in nl80211_send_station()
6799 ((sinfo->bss_param.flags & BSS_PARAM_FLAGS_SHORT_PREAMBLE) && in nl80211_send_station()
6801 ((sinfo->bss_param.flags & BSS_PARAM_FLAGS_SHORT_SLOT_TIME) && in nl80211_send_station()
6804 sinfo->bss_param.dtim_period) || in nl80211_send_station()
6806 sinfo->bss_param.beacon_interval)) in nl80211_send_station()
6811 if ((sinfo->filled & BIT_ULL(NL80211_STA_INFO_STA_FLAGS)) && in nl80211_send_station()
6814 &sinfo->sta_flags)) in nl80211_send_station()
6823 if (wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_send_station()
6832 if (sinfo->pertid) { in nl80211_send_station()
6845 tidstats = &sinfo->pertid[tid]; in nl80211_send_station()
6847 if (!tidstats->filled) in nl80211_send_station()
6855 if (tidstats->filled & BIT(NL80211_TID_STATS_ ## attr) && \ in nl80211_send_station()
6857 tidstats->memb, NL80211_TID_STATS_PAD)) \ in nl80211_send_station()
6867 if ((tidstats->filled & in nl80211_send_station()
6869 !nl80211_put_txq_stats(msg, &tidstats->txq_stats, in nl80211_send_station()
6881 if (sinfo->assoc_req_ies_len && in nl80211_send_station()
6882 nla_put(msg, NL80211_ATTR_IE, sinfo->assoc_req_ies_len, in nl80211_send_station()
6883 sinfo->assoc_req_ies)) in nl80211_send_station()
6886 if (sinfo->assoc_resp_ies_len && in nl80211_send_station()
6887 nla_put(msg, NL80211_ATTR_RESP_IE, sinfo->assoc_resp_ies_len, in nl80211_send_station()
6888 sinfo->assoc_resp_ies)) in nl80211_send_station()
6891 if (sinfo->mlo_params_valid) { in nl80211_send_station()
6893 sinfo->assoc_link_id)) in nl80211_send_station()
6896 if (!is_zero_ether_addr(sinfo->mld_addr) && in nl80211_send_station()
6898 sinfo->mld_addr)) in nl80211_send_station()
6909 return -EMSGSIZE; in nl80211_send_station()
6919 int sta_idx = cb->args[2]; in nl80211_dump_station()
6926 __acquire(&rdev->wiphy.mtx); in nl80211_dump_station()
6928 if (!wdev->netdev) { in nl80211_dump_station()
6929 err = -EINVAL; in nl80211_dump_station()
6933 if (!rdev->ops->dump_station) { in nl80211_dump_station()
6934 err = -EOPNOTSUPP; in nl80211_dump_station()
6940 err = rdev_dump_station(rdev, wdev->netdev, sta_idx, in nl80211_dump_station()
6942 if (err == -ENOENT) in nl80211_dump_station()
6948 NETLINK_CB(cb->skb).portid, in nl80211_dump_station()
6949 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_dump_station()
6950 rdev, wdev->netdev, mac_addr, in nl80211_dump_station()
6958 cb->args[2] = sta_idx; in nl80211_dump_station()
6959 err = skb->len; in nl80211_dump_station()
6961 wiphy_unlock(&rdev->wiphy); in nl80211_dump_station()
6968 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_station()
6969 struct net_device *dev = info->user_ptr[1]; in nl80211_get_station()
6977 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_get_station()
6978 return -EINVAL; in nl80211_get_station()
6980 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_get_station()
6982 if (!rdev->ops->get_station) in nl80211_get_station()
6983 return -EOPNOTSUPP; in nl80211_get_station()
6992 return -ENOMEM; in nl80211_get_station()
6996 info->snd_portid, info->snd_seq, 0, in nl80211_get_station()
6999 return -ENOBUFS; in nl80211_get_station()
7009 if (params->listen_interval != -1 && in cfg80211_check_station_change()
7011 return -EINVAL; in cfg80211_check_station_change()
7013 if (params->support_p2p_ps != -1 && in cfg80211_check_station_change()
7015 return -EINVAL; in cfg80211_check_station_change()
7017 if (params->aid && in cfg80211_check_station_change()
7018 !(params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) && in cfg80211_check_station_change()
7020 return -EINVAL; in cfg80211_check_station_change()
7029 * No ignoring the TDLS flag here -- the userspace mesh in cfg80211_check_station_change()
7033 if (params->sta_flags_mask & in cfg80211_check_station_change()
7037 return -EINVAL; in cfg80211_check_station_change()
7041 if (!(params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER))) in cfg80211_check_station_change()
7042 return -EINVAL; in cfg80211_check_station_change()
7044 params->sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER); in cfg80211_check_station_change()
7047 /* disallow mesh-specific things */ in cfg80211_check_station_change()
7048 if (params->plink_action != NL80211_PLINK_ACTION_NO_ACTION) in cfg80211_check_station_change()
7049 return -EINVAL; in cfg80211_check_station_change()
7050 if (params->local_pm) in cfg80211_check_station_change()
7051 return -EINVAL; in cfg80211_check_station_change()
7052 if (params->sta_modify_mask & STATION_PARAM_APPLY_PLINK_STATE) in cfg80211_check_station_change()
7053 return -EINVAL; in cfg80211_check_station_change()
7059 if (params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) in cfg80211_check_station_change()
7060 return -EINVAL; in cfg80211_check_station_change()
7063 * a hostapd/wpa_supplicant issue -- it always includes the in cfg80211_check_station_change()
7066 params->sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER); in cfg80211_check_station_change()
7072 if (params->sta_modify_mask & STATION_PARAM_APPLY_UAPSD) in cfg80211_check_station_change()
7073 return -EINVAL; in cfg80211_check_station_change()
7074 if (params->sta_modify_mask & STATION_PARAM_APPLY_CAPABILITY) in cfg80211_check_station_change()
7075 return -EINVAL; in cfg80211_check_station_change()
7076 if (params->link_sta_params.supported_rates) in cfg80211_check_station_change()
7077 return -EINVAL; in cfg80211_check_station_change()
7078 if (params->ext_capab || params->link_sta_params.ht_capa || in cfg80211_check_station_change()
7079 params->link_sta_params.vht_capa || in cfg80211_check_station_change()
7080 params->link_sta_params.he_capa || in cfg80211_check_station_change()
7081 params->link_sta_params.eht_capa) in cfg80211_check_station_change()
7082 return -EINVAL; in cfg80211_check_station_change()
7083 if (params->sta_flags_mask & BIT(NL80211_STA_FLAG_SPP_AMSDU)) in cfg80211_check_station_change()
7084 return -EINVAL; in cfg80211_check_station_change()
7089 if (params->vlan) in cfg80211_check_station_change()
7090 return -EINVAL; in cfg80211_check_station_change()
7096 if (!(params->sta_flags_mask & BIT(NL80211_STA_FLAG_AUTHORIZED))) in cfg80211_check_station_change()
7097 return -EOPNOTSUPP; in cfg80211_check_station_change()
7102 if (params->sta_flags_mask & in cfg80211_check_station_change()
7110 return -EINVAL; in cfg80211_check_station_change()
7113 if (!(wiphy->features & NL80211_FEATURE_FULL_AP_CLIENT_STATE) && in cfg80211_check_station_change()
7114 params->sta_flags_mask & in cfg80211_check_station_change()
7117 return -EINVAL; in cfg80211_check_station_change()
7122 if (params->sta_flags_mask & ~BIT(NL80211_STA_FLAG_AUTHORIZED)) in cfg80211_check_station_change()
7123 return -EINVAL; in cfg80211_check_station_change()
7127 if (params->sta_flags_mask & ~(BIT(NL80211_STA_FLAG_AUTHORIZED) | in cfg80211_check_station_change()
7129 return -EINVAL; in cfg80211_check_station_change()
7131 if (params->sta_flags_set & BIT(NL80211_STA_FLAG_AUTHORIZED) && in cfg80211_check_station_change()
7132 !params->link_sta_params.supported_rates) in cfg80211_check_station_change()
7133 return -EINVAL; in cfg80211_check_station_change()
7137 return -EINVAL; in cfg80211_check_station_change()
7139 if (params->sta_modify_mask & STATION_PARAM_APPLY_PLINK_STATE) in cfg80211_check_station_change()
7140 return -EINVAL; in cfg80211_check_station_change()
7143 if (params->plink_action != NL80211_PLINK_ACTION_NO_ACTION && in cfg80211_check_station_change()
7144 params->plink_action != NL80211_PLINK_ACTION_BLOCK) in cfg80211_check_station_change()
7145 return -EINVAL; in cfg80211_check_station_change()
7156 params->link_sta_params.opmode_notif_used = false; in cfg80211_check_station_change()
7168 struct nlattr *vlanattr = info->attrs[NL80211_ATTR_STA_VLAN]; in get_vlan()
7177 return ERR_PTR(-ENODEV); in get_vlan()
7179 if (!v->ieee80211_ptr || v->ieee80211_ptr->wiphy != &rdev->wiphy) { in get_vlan()
7180 ret = -EINVAL; in get_vlan()
7184 if (v->ieee80211_ptr->iftype != NL80211_IFTYPE_AP_VLAN && in get_vlan()
7185 v->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && in get_vlan()
7186 v->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) { in get_vlan()
7187 ret = -EINVAL; in get_vlan()
7192 ret = -ENETDOWN; in get_vlan()
7210 if (!info->attrs[NL80211_ATTR_STA_WME]) in nl80211_parse_sta_wme()
7213 nla = info->attrs[NL80211_ATTR_STA_WME]; in nl80211_parse_sta_wme()
7216 info->extack); in nl80211_parse_sta_wme()
7221 params->uapsd_queues = nla_get_u8( in nl80211_parse_sta_wme()
7223 if (params->uapsd_queues & ~IEEE80211_WMM_IE_STA_QOSINFO_AC_MASK) in nl80211_parse_sta_wme()
7224 return -EINVAL; in nl80211_parse_sta_wme()
7227 params->max_sp = nla_get_u8(tb[NL80211_STA_WME_MAX_SP]); in nl80211_parse_sta_wme()
7229 if (params->max_sp & ~IEEE80211_WMM_IE_STA_QOSINFO_SP_MASK) in nl80211_parse_sta_wme()
7230 return -EINVAL; in nl80211_parse_sta_wme()
7232 params->sta_modify_mask |= STATION_PARAM_APPLY_UAPSD; in nl80211_parse_sta_wme()
7240 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]) { in nl80211_parse_sta_channel_info()
7241 params->supported_channels = in nl80211_parse_sta_channel_info()
7242 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]); in nl80211_parse_sta_channel_info()
7243 params->supported_channels_len = in nl80211_parse_sta_channel_info()
7244 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]); in nl80211_parse_sta_channel_info()
7250 if (params->supported_channels_len % 2) in nl80211_parse_sta_channel_info()
7251 return -EINVAL; in nl80211_parse_sta_channel_info()
7254 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]) { in nl80211_parse_sta_channel_info()
7255 params->supported_oper_classes = in nl80211_parse_sta_channel_info()
7256 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]); in nl80211_parse_sta_channel_info()
7257 params->supported_oper_classes_len = in nl80211_parse_sta_channel_info()
7258 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]); in nl80211_parse_sta_channel_info()
7268 if (info->attrs[NL80211_ATTR_PEER_AID]) in nl80211_set_station_tdls()
7269 params->aid = nla_get_u16(info->attrs[NL80211_ATTR_PEER_AID]); in nl80211_set_station_tdls()
7270 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) in nl80211_set_station_tdls()
7271 params->link_sta_params.ht_capa = in nl80211_set_station_tdls()
7272 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]); in nl80211_set_station_tdls()
7273 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) in nl80211_set_station_tdls()
7274 params->link_sta_params.vht_capa = in nl80211_set_station_tdls()
7275 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]); in nl80211_set_station_tdls()
7276 if (info->attrs[NL80211_ATTR_HE_CAPABILITY]) { in nl80211_set_station_tdls()
7277 params->link_sta_params.he_capa = in nl80211_set_station_tdls()
7278 nla_data(info->attrs[NL80211_ATTR_HE_CAPABILITY]); in nl80211_set_station_tdls()
7279 params->link_sta_params.he_capa_len = in nl80211_set_station_tdls()
7280 nla_len(info->attrs[NL80211_ATTR_HE_CAPABILITY]); in nl80211_set_station_tdls()
7282 if (info->attrs[NL80211_ATTR_EHT_CAPABILITY]) { in nl80211_set_station_tdls()
7283 params->link_sta_params.eht_capa = in nl80211_set_station_tdls()
7284 nla_data(info->attrs[NL80211_ATTR_EHT_CAPABILITY]); in nl80211_set_station_tdls()
7285 params->link_sta_params.eht_capa_len = in nl80211_set_station_tdls()
7286 nla_len(info->attrs[NL80211_ATTR_EHT_CAPABILITY]); in nl80211_set_station_tdls()
7288 if (!ieee80211_eht_capa_size_ok((const u8 *)params->link_sta_params.he_capa, in nl80211_set_station_tdls()
7289 (const u8 *)params->link_sta_params.eht_capa, in nl80211_set_station_tdls()
7290 params->link_sta_params.eht_capa_len, in nl80211_set_station_tdls()
7292 return -EINVAL; in nl80211_set_station_tdls()
7307 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_parse_sta_txpower_setting()
7310 if (info->attrs[NL80211_ATTR_STA_TX_POWER_SETTING]) { in nl80211_parse_sta_txpower_setting()
7311 if (!rdev->ops->set_tx_power || in nl80211_parse_sta_txpower_setting()
7312 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_parse_sta_txpower_setting()
7314 return -EOPNOTSUPP; in nl80211_parse_sta_txpower_setting()
7317 txpwr->type = nla_get_u8(info->attrs[idx]); in nl80211_parse_sta_txpower_setting()
7319 if (txpwr->type == NL80211_TX_POWER_LIMITED) { in nl80211_parse_sta_txpower_setting()
7322 if (info->attrs[idx]) in nl80211_parse_sta_txpower_setting()
7323 txpwr->power = nla_get_s16(info->attrs[idx]); in nl80211_parse_sta_txpower_setting()
7325 return -EINVAL; in nl80211_parse_sta_txpower_setting()
7338 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_station()
7339 struct net_device *dev = info->user_ptr[1]; in nl80211_set_station()
7346 if (!rdev->ops->change_station) in nl80211_set_station()
7347 return -EOPNOTSUPP; in nl80211_set_station()
7354 if (info->attrs[NL80211_ATTR_STA_AID]) in nl80211_set_station()
7355 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_STA_AID]); in nl80211_set_station()
7357 if (info->attrs[NL80211_ATTR_VLAN_ID]) in nl80211_set_station()
7358 params.vlan_id = nla_get_u16(info->attrs[NL80211_ATTR_VLAN_ID]); in nl80211_set_station()
7360 if (info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]) in nl80211_set_station()
7362 nla_get_u16(info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]); in nl80211_set_station()
7364 params.listen_interval = -1; in nl80211_set_station()
7366 if (info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]) in nl80211_set_station()
7368 nla_get_u8(info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]); in nl80211_set_station()
7370 params.support_p2p_ps = -1; in nl80211_set_station()
7372 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_set_station()
7373 return -EINVAL; in nl80211_set_station()
7376 nl80211_link_id_or_invalid(info->attrs); in nl80211_set_station()
7378 if (info->attrs[NL80211_ATTR_MLD_ADDR]) { in nl80211_set_station()
7385 return -EINVAL; in nl80211_set_station()
7387 mac_addr = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]); in nl80211_set_station()
7390 nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_set_station()
7392 return -EINVAL; in nl80211_set_station()
7394 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_set_station()
7398 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) { in nl80211_set_station()
7400 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); in nl80211_set_station()
7402 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); in nl80211_set_station()
7405 if (info->attrs[NL80211_ATTR_STA_CAPABILITY]) { in nl80211_set_station()
7407 nla_get_u16(info->attrs[NL80211_ATTR_STA_CAPABILITY]); in nl80211_set_station()
7411 if (info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]) { in nl80211_set_station()
7413 nla_data(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); in nl80211_set_station()
7415 nla_len(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); in nl80211_set_station()
7418 if (parse_station_flags(info, dev->ieee80211_ptr->iftype, &params)) in nl80211_set_station()
7419 return -EINVAL; in nl80211_set_station()
7421 if (info->attrs[NL80211_ATTR_STA_PLINK_ACTION]) in nl80211_set_station()
7423 nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_ACTION]); in nl80211_set_station()
7425 if (info->attrs[NL80211_ATTR_STA_PLINK_STATE]) { in nl80211_set_station()
7427 nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_STATE]); in nl80211_set_station()
7428 if (info->attrs[NL80211_ATTR_MESH_PEER_AID]) in nl80211_set_station()
7430 info->attrs[NL80211_ATTR_MESH_PEER_AID]); in nl80211_set_station()
7434 if (info->attrs[NL80211_ATTR_LOCAL_MESH_POWER_MODE]) in nl80211_set_station()
7436 info->attrs[NL80211_ATTR_LOCAL_MESH_POWER_MODE]); in nl80211_set_station()
7438 if (info->attrs[NL80211_ATTR_OPMODE_NOTIF]) { in nl80211_set_station()
7441 nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]); in nl80211_set_station()
7444 if (info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]) in nl80211_set_station()
7446 nla_data(info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]); in nl80211_set_station()
7448 if (info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]) in nl80211_set_station()
7450 nla_get_u16(info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]); in nl80211_set_station()
7453 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_set_station()
7455 return -EOPNOTSUPP; in nl80211_set_station()
7472 switch (dev->ieee80211_ptr->iftype) { in nl80211_set_station()
7482 err = -EOPNOTSUPP; in nl80211_set_station()
7497 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_new_station()
7499 struct net_device *dev = info->user_ptr[1]; in nl80211_new_station()
7500 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_new_station()
7508 if (!rdev->ops->add_station) in nl80211_new_station()
7509 return -EOPNOTSUPP; in nl80211_new_station()
7511 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_new_station()
7512 return -EINVAL; in nl80211_new_station()
7514 if (!info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]) in nl80211_new_station()
7515 return -EINVAL; in nl80211_new_station()
7517 if (!info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) in nl80211_new_station()
7518 return -EINVAL; in nl80211_new_station()
7520 if (!info->attrs[NL80211_ATTR_STA_AID] && in nl80211_new_station()
7521 !info->attrs[NL80211_ATTR_PEER_AID]) in nl80211_new_station()
7522 return -EINVAL; in nl80211_new_station()
7525 nl80211_link_id_or_invalid(info->attrs); in nl80211_new_station()
7527 if (info->attrs[NL80211_ATTR_MLD_ADDR]) { in nl80211_new_station()
7528 mac_addr = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]); in nl80211_new_station()
7531 nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_new_station()
7533 return -EINVAL; in nl80211_new_station()
7535 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_new_station()
7539 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); in nl80211_new_station()
7541 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); in nl80211_new_station()
7543 nla_get_u16(info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]); in nl80211_new_station()
7545 if (info->attrs[NL80211_ATTR_VLAN_ID]) in nl80211_new_station()
7546 params.vlan_id = nla_get_u16(info->attrs[NL80211_ATTR_VLAN_ID]); in nl80211_new_station()
7548 if (info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]) { in nl80211_new_station()
7550 nla_get_u8(info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]); in nl80211_new_station()
7557 dev->ieee80211_ptr->iftype == NL80211_IFTYPE_P2P_GO; in nl80211_new_station()
7560 if (info->attrs[NL80211_ATTR_PEER_AID]) in nl80211_new_station()
7561 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_PEER_AID]); in nl80211_new_station()
7563 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_STA_AID]); in nl80211_new_station()
7565 if (info->attrs[NL80211_ATTR_STA_CAPABILITY]) { in nl80211_new_station()
7567 nla_get_u16(info->attrs[NL80211_ATTR_STA_CAPABILITY]); in nl80211_new_station()
7571 if (info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]) { in nl80211_new_station()
7573 nla_data(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); in nl80211_new_station()
7575 nla_len(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); in nl80211_new_station()
7578 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) in nl80211_new_station()
7580 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]); in nl80211_new_station()
7582 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) in nl80211_new_station()
7584 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]); in nl80211_new_station()
7586 if (info->attrs[NL80211_ATTR_HE_CAPABILITY]) { in nl80211_new_station()
7588 nla_data(info->attrs[NL80211_ATTR_HE_CAPABILITY]); in nl80211_new_station()
7590 nla_len(info->attrs[NL80211_ATTR_HE_CAPABILITY]); in nl80211_new_station()
7592 if (info->attrs[NL80211_ATTR_EHT_CAPABILITY]) { in nl80211_new_station()
7594 nla_data(info->attrs[NL80211_ATTR_EHT_CAPABILITY]); in nl80211_new_station()
7596 nla_len(info->attrs[NL80211_ATTR_EHT_CAPABILITY]); in nl80211_new_station()
7602 return -EINVAL; in nl80211_new_station()
7606 if (info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]) in nl80211_new_station()
7608 nla_data(info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]); in nl80211_new_station()
7610 if (info->attrs[NL80211_ATTR_OPMODE_NOTIF]) { in nl80211_new_station()
7613 nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]); in nl80211_new_station()
7616 if (info->attrs[NL80211_ATTR_STA_PLINK_ACTION]) in nl80211_new_station()
7618 nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_ACTION]); in nl80211_new_station()
7620 if (info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]) in nl80211_new_station()
7622 nla_get_u16(info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]); in nl80211_new_station()
7625 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_new_station()
7627 return -EOPNOTSUPP; in nl80211_new_station()
7643 if (parse_station_flags(info, dev->ieee80211_ptr->iftype, &params)) in nl80211_new_station()
7644 return -EINVAL; in nl80211_new_station()
7659 return -EINVAL; in nl80211_new_station()
7665 return -EINVAL; in nl80211_new_station()
7670 switch (dev->ieee80211_ptr->iftype) { in nl80211_new_station()
7675 if (!(rdev->wiphy.flags & WIPHY_FLAG_AP_UAPSD) || in nl80211_new_station()
7681 info->attrs[NL80211_ATTR_PEER_AID]) in nl80211_new_station()
7682 return -EINVAL; in nl80211_new_station()
7687 if (!(rdev->wiphy.features & in nl80211_new_station()
7690 return -EINVAL; in nl80211_new_station()
7692 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_new_station()
7695 return -EINVAL; in nl80211_new_station()
7723 return -EINVAL; in nl80211_new_station()
7726 info->attrs[NL80211_ATTR_PEER_AID]) in nl80211_new_station()
7727 return -EINVAL; in nl80211_new_station()
7738 return -EINVAL; in nl80211_new_station()
7741 return -EINVAL; in nl80211_new_station()
7743 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS)) in nl80211_new_station()
7744 return -EOPNOTSUPP; in nl80211_new_station()
7746 if (!(rdev->wiphy.flags & WIPHY_FLAG_TDLS_EXTERNAL_SETUP)) in nl80211_new_station()
7747 return -EOPNOTSUPP; in nl80211_new_station()
7755 return -EOPNOTSUPP; in nl80211_new_station()
7760 if (wdev->valid_links) { in nl80211_new_station()
7762 err = -EINVAL; in nl80211_new_station()
7765 if (!(wdev->valid_links & BIT(params.link_sta_params.link_id))) { in nl80211_new_station()
7766 err = -ENOLINK; in nl80211_new_station()
7771 err = -EINVAL; in nl80211_new_station()
7783 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_del_station()
7784 struct net_device *dev = info->user_ptr[1]; in nl80211_del_station()
7785 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_del_station()
7787 int link_id = nl80211_link_id_or_invalid(info->attrs); in nl80211_del_station()
7791 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_del_station()
7792 params.mac = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_del_station()
7794 switch (wdev->iftype) { in nl80211_del_station()
7803 if (wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_del_station()
7806 return -EINVAL; in nl80211_del_station()
7808 return -EINVAL; in nl80211_del_station()
7811 if (!rdev->ops->del_station) in nl80211_del_station()
7812 return -EOPNOTSUPP; in nl80211_del_station()
7814 if (info->attrs[NL80211_ATTR_MGMT_SUBTYPE]) { in nl80211_del_station()
7816 nla_get_u8(info->attrs[NL80211_ATTR_MGMT_SUBTYPE]); in nl80211_del_station()
7819 return -EINVAL; in nl80211_del_station()
7825 if (info->attrs[NL80211_ATTR_REASON_CODE]) { in nl80211_del_station()
7827 nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); in nl80211_del_station()
7829 return -EINVAL; /* 0 is reserved */ in nl80211_del_station()
7835 /* Link ID not expected in case of non-ML operation */ in nl80211_del_station()
7836 if (!wdev->valid_links && link_id != -1) in nl80211_del_station()
7837 return -EINVAL; in nl80211_del_station()
7840 if (wdev->valid_links && link_id >= 0 && in nl80211_del_station()
7841 !(wdev->valid_links & BIT(link_id))) in nl80211_del_station()
7842 return -EINVAL; in nl80211_del_station()
7859 return -1; in nl80211_send_mpath()
7861 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in nl80211_send_mpath()
7864 nla_put_u32(msg, NL80211_ATTR_GENERATION, pinfo->generation)) in nl80211_send_mpath()
7870 if ((pinfo->filled & MPATH_INFO_FRAME_QLEN) && in nl80211_send_mpath()
7872 pinfo->frame_qlen)) in nl80211_send_mpath()
7874 if (((pinfo->filled & MPATH_INFO_SN) && in nl80211_send_mpath()
7875 nla_put_u32(msg, NL80211_MPATH_INFO_SN, pinfo->sn)) || in nl80211_send_mpath()
7876 ((pinfo->filled & MPATH_INFO_METRIC) && in nl80211_send_mpath()
7878 pinfo->metric)) || in nl80211_send_mpath()
7879 ((pinfo->filled & MPATH_INFO_EXPTIME) && in nl80211_send_mpath()
7881 pinfo->exptime)) || in nl80211_send_mpath()
7882 ((pinfo->filled & MPATH_INFO_FLAGS) && in nl80211_send_mpath()
7884 pinfo->flags)) || in nl80211_send_mpath()
7885 ((pinfo->filled & MPATH_INFO_DISCOVERY_TIMEOUT) && in nl80211_send_mpath()
7887 pinfo->discovery_timeout)) || in nl80211_send_mpath()
7888 ((pinfo->filled & MPATH_INFO_DISCOVERY_RETRIES) && in nl80211_send_mpath()
7890 pinfo->discovery_retries)) || in nl80211_send_mpath()
7891 ((pinfo->filled & MPATH_INFO_HOP_COUNT) && in nl80211_send_mpath()
7893 pinfo->hop_count)) || in nl80211_send_mpath()
7894 ((pinfo->filled & MPATH_INFO_PATH_CHANGE) && in nl80211_send_mpath()
7896 pinfo->path_change_count))) in nl80211_send_mpath()
7906 return -EMSGSIZE; in nl80211_send_mpath()
7917 int path_idx = cb->args[2]; in nl80211_dump_mpath()
7924 __acquire(&rdev->wiphy.mtx); in nl80211_dump_mpath()
7926 if (!rdev->ops->dump_mpath) { in nl80211_dump_mpath()
7927 err = -EOPNOTSUPP; in nl80211_dump_mpath()
7931 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) { in nl80211_dump_mpath()
7932 err = -EOPNOTSUPP; in nl80211_dump_mpath()
7937 err = rdev_dump_mpath(rdev, wdev->netdev, path_idx, dst, in nl80211_dump_mpath()
7939 if (err == -ENOENT) in nl80211_dump_mpath()
7944 if (nl80211_send_mpath(skb, NETLINK_CB(cb->skb).portid, in nl80211_dump_mpath()
7945 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_dump_mpath()
7946 wdev->netdev, dst, next_hop, in nl80211_dump_mpath()
7954 cb->args[2] = path_idx; in nl80211_dump_mpath()
7955 err = skb->len; in nl80211_dump_mpath()
7957 wiphy_unlock(&rdev->wiphy); in nl80211_dump_mpath()
7963 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_mpath()
7965 struct net_device *dev = info->user_ptr[1]; in nl80211_get_mpath()
7973 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_get_mpath()
7974 return -EINVAL; in nl80211_get_mpath()
7976 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_get_mpath()
7978 if (!rdev->ops->get_mpath) in nl80211_get_mpath()
7979 return -EOPNOTSUPP; in nl80211_get_mpath()
7981 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_get_mpath()
7982 return -EOPNOTSUPP; in nl80211_get_mpath()
7990 return -ENOMEM; in nl80211_get_mpath()
7992 if (nl80211_send_mpath(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_mpath()
7995 return -ENOBUFS; in nl80211_get_mpath()
8003 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_mpath()
8004 struct net_device *dev = info->user_ptr[1]; in nl80211_set_mpath()
8008 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_set_mpath()
8009 return -EINVAL; in nl80211_set_mpath()
8011 if (!info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]) in nl80211_set_mpath()
8012 return -EINVAL; in nl80211_set_mpath()
8014 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_set_mpath()
8015 next_hop = nla_data(info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]); in nl80211_set_mpath()
8017 if (!rdev->ops->change_mpath) in nl80211_set_mpath()
8018 return -EOPNOTSUPP; in nl80211_set_mpath()
8020 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_set_mpath()
8021 return -EOPNOTSUPP; in nl80211_set_mpath()
8028 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_new_mpath()
8029 struct net_device *dev = info->user_ptr[1]; in nl80211_new_mpath()
8033 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_new_mpath()
8034 return -EINVAL; in nl80211_new_mpath()
8036 if (!info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]) in nl80211_new_mpath()
8037 return -EINVAL; in nl80211_new_mpath()
8039 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_new_mpath()
8040 next_hop = nla_data(info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]); in nl80211_new_mpath()
8042 if (!rdev->ops->add_mpath) in nl80211_new_mpath()
8043 return -EOPNOTSUPP; in nl80211_new_mpath()
8045 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_new_mpath()
8046 return -EOPNOTSUPP; in nl80211_new_mpath()
8053 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_del_mpath()
8054 struct net_device *dev = info->user_ptr[1]; in nl80211_del_mpath()
8057 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_del_mpath()
8058 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_del_mpath()
8060 if (!rdev->ops->del_mpath) in nl80211_del_mpath()
8061 return -EOPNOTSUPP; in nl80211_del_mpath()
8063 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_del_mpath()
8064 return -EOPNOTSUPP; in nl80211_del_mpath()
8071 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_mpp()
8073 struct net_device *dev = info->user_ptr[1]; in nl80211_get_mpp()
8081 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_get_mpp()
8082 return -EINVAL; in nl80211_get_mpp()
8084 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_get_mpp()
8086 if (!rdev->ops->get_mpp) in nl80211_get_mpp()
8087 return -EOPNOTSUPP; in nl80211_get_mpp()
8089 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_get_mpp()
8090 return -EOPNOTSUPP; in nl80211_get_mpp()
8098 return -ENOMEM; in nl80211_get_mpp()
8100 if (nl80211_send_mpath(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_mpp()
8103 return -ENOBUFS; in nl80211_get_mpp()
8117 int path_idx = cb->args[2]; in nl80211_dump_mpp()
8124 __acquire(&rdev->wiphy.mtx); in nl80211_dump_mpp()
8126 if (!rdev->ops->dump_mpp) { in nl80211_dump_mpp()
8127 err = -EOPNOTSUPP; in nl80211_dump_mpp()
8131 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) { in nl80211_dump_mpp()
8132 err = -EOPNOTSUPP; in nl80211_dump_mpp()
8137 err = rdev_dump_mpp(rdev, wdev->netdev, path_idx, dst, in nl80211_dump_mpp()
8139 if (err == -ENOENT) in nl80211_dump_mpp()
8144 if (nl80211_send_mpath(skb, NETLINK_CB(cb->skb).portid, in nl80211_dump_mpp()
8145 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_dump_mpp()
8146 wdev->netdev, dst, mpp, in nl80211_dump_mpp()
8154 cb->args[2] = path_idx; in nl80211_dump_mpp()
8155 err = skb->len; in nl80211_dump_mpp()
8157 wiphy_unlock(&rdev->wiphy); in nl80211_dump_mpp()
8163 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_bss()
8164 struct net_device *dev = info->user_ptr[1]; in nl80211_set_bss()
8168 params.link_id = nl80211_link_id_or_invalid(info->attrs); in nl80211_set_bss()
8170 params.use_cts_prot = -1; in nl80211_set_bss()
8171 params.use_short_preamble = -1; in nl80211_set_bss()
8172 params.use_short_slot_time = -1; in nl80211_set_bss()
8173 params.ap_isolate = -1; in nl80211_set_bss()
8174 params.ht_opmode = -1; in nl80211_set_bss()
8175 params.p2p_ctwindow = -1; in nl80211_set_bss()
8176 params.p2p_opp_ps = -1; in nl80211_set_bss()
8178 if (info->attrs[NL80211_ATTR_BSS_CTS_PROT]) in nl80211_set_bss()
8180 nla_get_u8(info->attrs[NL80211_ATTR_BSS_CTS_PROT]); in nl80211_set_bss()
8181 if (info->attrs[NL80211_ATTR_BSS_SHORT_PREAMBLE]) in nl80211_set_bss()
8183 nla_get_u8(info->attrs[NL80211_ATTR_BSS_SHORT_PREAMBLE]); in nl80211_set_bss()
8184 if (info->attrs[NL80211_ATTR_BSS_SHORT_SLOT_TIME]) in nl80211_set_bss()
8186 nla_get_u8(info->attrs[NL80211_ATTR_BSS_SHORT_SLOT_TIME]); in nl80211_set_bss()
8187 if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) { in nl80211_set_bss()
8189 nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); in nl80211_set_bss()
8191 nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); in nl80211_set_bss()
8193 if (info->attrs[NL80211_ATTR_AP_ISOLATE]) in nl80211_set_bss()
8194 params.ap_isolate = !!nla_get_u8(info->attrs[NL80211_ATTR_AP_ISOLATE]); in nl80211_set_bss()
8195 if (info->attrs[NL80211_ATTR_BSS_HT_OPMODE]) in nl80211_set_bss()
8197 nla_get_u16(info->attrs[NL80211_ATTR_BSS_HT_OPMODE]); in nl80211_set_bss()
8199 if (info->attrs[NL80211_ATTR_P2P_CTWINDOW]) { in nl80211_set_bss()
8200 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_set_bss()
8201 return -EINVAL; in nl80211_set_bss()
8203 nla_get_u8(info->attrs[NL80211_ATTR_P2P_CTWINDOW]); in nl80211_set_bss()
8205 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_CTWIN)) in nl80211_set_bss()
8206 return -EINVAL; in nl80211_set_bss()
8209 if (info->attrs[NL80211_ATTR_P2P_OPPPS]) { in nl80211_set_bss()
8212 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_set_bss()
8213 return -EINVAL; in nl80211_set_bss()
8214 tmp = nla_get_u8(info->attrs[NL80211_ATTR_P2P_OPPPS]); in nl80211_set_bss()
8217 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_OPPPS)) in nl80211_set_bss()
8218 return -EINVAL; in nl80211_set_bss()
8221 if (!rdev->ops->change_bss) in nl80211_set_bss()
8222 return -EOPNOTSUPP; in nl80211_set_bss()
8224 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && in nl80211_set_bss()
8225 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_set_bss()
8226 return -EOPNOTSUPP; in nl80211_set_bss()
8240 * completely when built-in to the kernel right between the time in nl80211_req_set_reg()
8245 return -EINPROGRESS; in nl80211_req_set_reg()
8247 if (info->attrs[NL80211_ATTR_USER_REG_HINT_TYPE]) in nl80211_req_set_reg()
8249 nla_get_u32(info->attrs[NL80211_ATTR_USER_REG_HINT_TYPE]); in nl80211_req_set_reg()
8256 if (!info->attrs[NL80211_ATTR_REG_ALPHA2]) in nl80211_req_set_reg()
8257 return -EINVAL; in nl80211_req_set_reg()
8259 data = nla_data(info->attrs[NL80211_ATTR_REG_ALPHA2]); in nl80211_req_set_reg()
8262 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) { in nl80211_req_set_reg()
8263 owner_nlportid = info->snd_portid; in nl80211_req_set_reg()
8264 is_indoor = !!info->attrs[NL80211_ATTR_REG_INDOOR]; in nl80211_req_set_reg()
8273 return -EINVAL; in nl80211_req_set_reg()
8285 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_mesh_config()
8286 struct net_device *dev = info->user_ptr[1]; in nl80211_get_mesh_config()
8287 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_get_mesh_config()
8294 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_get_mesh_config()
8295 return -EOPNOTSUPP; in nl80211_get_mesh_config()
8297 if (!rdev->ops->get_mesh_config) in nl80211_get_mesh_config()
8298 return -EOPNOTSUPP; in nl80211_get_mesh_config()
8301 if (!wdev->u.mesh.id_len) in nl80211_get_mesh_config()
8312 return -ENOMEM; in nl80211_get_mesh_config()
8313 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_mesh_config()
8320 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in nl80211_get_mesh_config()
8391 return -ENOBUFS; in nl80211_get_mesh_config()
8426 NLA_POLICY_RANGE(NLA_S32, -255, 0),
8469 cfg->param = fn(tb[attr]); \ in nl80211_parse_mesh_config()
8470 mask |= BIT((attr) - 1); \ in nl80211_parse_mesh_config()
8474 if (!info->attrs[NL80211_ATTR_MESH_CONFIG]) in nl80211_parse_mesh_config()
8475 return -EINVAL; in nl80211_parse_mesh_config()
8476 …ated(tb, NL80211_MESHCONF_ATTR_MAX, info->attrs[NL80211_ATTR_MESH_CONFIG], nl80211_meshconf_params… in nl80211_parse_mesh_config()
8477 return -EINVAL; in nl80211_parse_mesh_config()
8515 (cfg->path_refresh_time < 1 || cfg->path_refresh_time > 65535)) in nl80211_parse_mesh_config()
8516 return -EINVAL; in nl80211_parse_mesh_config()
8525 (cfg->dot11MeshHWMPactivePathTimeout < 1 || in nl80211_parse_mesh_config()
8526 cfg->dot11MeshHWMPactivePathTimeout > 65535)) in nl80211_parse_mesh_config()
8527 return -EINVAL; in nl80211_parse_mesh_config()
8559 * IEEE 802.11-2016 9.4.2.57 HT Operation element. in nl80211_parse_mesh_config()
8567 return -EINVAL; in nl80211_parse_mesh_config()
8572 cfg->ht_opmode = ht_opmode; in nl80211_parse_mesh_config()
8573 mask |= (1 << (NL80211_MESHCONF_HT_OPMODE - 1)); in nl80211_parse_mesh_config()
8580 (cfg->dot11MeshHWMPactivePathToRootTimeout < 1 || in nl80211_parse_mesh_config()
8581 cfg->dot11MeshHWMPactivePathToRootTimeout > 65535)) in nl80211_parse_mesh_config()
8582 return -EINVAL; in nl80211_parse_mesh_config()
8609 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_parse_mesh_setup()
8612 if (!info->attrs[NL80211_ATTR_MESH_SETUP]) in nl80211_parse_mesh_setup()
8613 return -EINVAL; in nl80211_parse_mesh_setup()
8614 …ed(tb, NL80211_MESH_SETUP_ATTR_MAX, info->attrs[NL80211_ATTR_MESH_SETUP], nl80211_mesh_setup_param… in nl80211_parse_mesh_setup()
8615 return -EINVAL; in nl80211_parse_mesh_setup()
8618 setup->sync_method = in nl80211_parse_mesh_setup()
8624 setup->path_sel_proto = in nl80211_parse_mesh_setup()
8630 setup->path_metric = in nl80211_parse_mesh_setup()
8638 setup->ie = nla_data(ieattr); in nl80211_parse_mesh_setup()
8639 setup->ie_len = nla_len(ieattr); in nl80211_parse_mesh_setup()
8642 !(rdev->wiphy.features & NL80211_FEATURE_USERSPACE_MPM)) in nl80211_parse_mesh_setup()
8643 return -EINVAL; in nl80211_parse_mesh_setup()
8644 setup->user_mpm = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_MPM]); in nl80211_parse_mesh_setup()
8645 setup->is_authenticated = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_AUTH]); in nl80211_parse_mesh_setup()
8646 setup->is_secure = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_AMPE]); in nl80211_parse_mesh_setup()
8647 if (setup->is_secure) in nl80211_parse_mesh_setup()
8648 setup->user_mpm = true; in nl80211_parse_mesh_setup()
8651 if (!setup->user_mpm) in nl80211_parse_mesh_setup()
8652 return -EINVAL; in nl80211_parse_mesh_setup()
8653 setup->auth_id = in nl80211_parse_mesh_setup()
8663 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_update_mesh_config()
8664 struct net_device *dev = info->user_ptr[1]; in nl80211_update_mesh_config()
8665 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_update_mesh_config()
8670 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_update_mesh_config()
8671 return -EOPNOTSUPP; in nl80211_update_mesh_config()
8673 if (!rdev->ops->update_mesh_config) in nl80211_update_mesh_config()
8674 return -EOPNOTSUPP; in nl80211_update_mesh_config()
8680 if (!wdev->u.mesh.id_len) in nl80211_update_mesh_config()
8681 err = -ENOLINK; in nl80211_update_mesh_config()
8695 if (nla_put_string(msg, NL80211_ATTR_REG_ALPHA2, regdom->alpha2) || in nl80211_put_regdom()
8696 (regdom->dfs_region && in nl80211_put_regdom()
8697 nla_put_u8(msg, NL80211_ATTR_DFS_REGION, regdom->dfs_region))) in nl80211_put_regdom()
8704 for (i = 0; i < regdom->n_reg_rules; i++) { in nl80211_put_regdom()
8711 reg_rule = &regdom->reg_rules[i]; in nl80211_put_regdom()
8712 freq_range = &reg_rule->freq_range; in nl80211_put_regdom()
8713 power_rule = &reg_rule->power_rule; in nl80211_put_regdom()
8719 max_bandwidth_khz = freq_range->max_bandwidth_khz; in nl80211_put_regdom()
8725 reg_rule->flags) || in nl80211_put_regdom()
8727 freq_range->start_freq_khz) || in nl80211_put_regdom()
8729 freq_range->end_freq_khz) || in nl80211_put_regdom()
8733 power_rule->max_antenna_gain) || in nl80211_put_regdom()
8735 power_rule->max_eirp) || in nl80211_put_regdom()
8737 reg_rule->dfs_cac_ms)) in nl80211_put_regdom()
8740 if ((reg_rule->flags & NL80211_RRF_PSD) && in nl80211_put_regdom()
8742 reg_rule->psd)) in nl80211_put_regdom()
8752 return -EMSGSIZE; in nl80211_put_regdom()
8761 int err = -EMSGSIZE; in nl80211_get_reg_do()
8766 return -ENOBUFS; in nl80211_get_reg_do()
8768 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_reg_do()
8775 if (info->attrs[NL80211_ATTR_WIPHY]) { in nl80211_get_reg_do()
8784 wiphy = &rdev->wiphy; in nl80211_get_reg_do()
8785 self_managed = wiphy->regulatory_flags & in nl80211_get_reg_do()
8792 /* a self-managed-reg device must have a private regdom */ in nl80211_get_reg_do()
8794 err = -EINVAL; in nl80211_get_reg_do()
8835 void *hdr = nl80211hdr_put(msg, NETLINK_CB(cb->skb).portid, seq, flags, in nl80211_send_regdom()
8839 return -1; in nl80211_send_regdom()
8855 if (wiphy && wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED && in nl80211_send_regdom()
8864 return -EMSGSIZE; in nl80211_send_regdom()
8872 int err, reg_idx, start = cb->args[2]; in nl80211_get_reg_dump()
8877 err = nl80211_send_regdom(skb, cb, cb->nlh->nlmsg_seq, in nl80211_get_reg_dump()
8887 regdom = get_wiphy_regdom(&rdev->wiphy); in nl80211_get_reg_dump()
8894 err = nl80211_send_regdom(skb, cb, cb->nlh->nlmsg_seq, in nl80211_get_reg_dump()
8895 NLM_F_MULTI, &rdev->wiphy, regdom); in nl80211_get_reg_dump()
8897 reg_idx--; in nl80211_get_reg_dump()
8902 cb->args[2] = reg_idx; in nl80211_get_reg_dump()
8903 err = skb->len; in nl80211_get_reg_dump()
8923 struct ieee80211_freq_range *freq_range = &reg_rule->freq_range; in parse_reg_rule()
8924 struct ieee80211_power_rule *power_rule = &reg_rule->power_rule; in parse_reg_rule()
8927 return -EINVAL; in parse_reg_rule()
8929 return -EINVAL; in parse_reg_rule()
8931 return -EINVAL; in parse_reg_rule()
8933 return -EINVAL; in parse_reg_rule()
8935 return -EINVAL; in parse_reg_rule()
8937 reg_rule->flags = nla_get_u32(tb[NL80211_ATTR_REG_RULE_FLAGS]); in parse_reg_rule()
8939 freq_range->start_freq_khz = in parse_reg_rule()
8941 freq_range->end_freq_khz = in parse_reg_rule()
8943 freq_range->max_bandwidth_khz = in parse_reg_rule()
8946 power_rule->max_eirp = in parse_reg_rule()
8950 power_rule->max_antenna_gain = in parse_reg_rule()
8954 reg_rule->dfs_cac_ms = in parse_reg_rule()
8970 if (!info->attrs[NL80211_ATTR_REG_ALPHA2]) in nl80211_set_reg()
8971 return -EINVAL; in nl80211_set_reg()
8973 if (!info->attrs[NL80211_ATTR_REG_RULES]) in nl80211_set_reg()
8974 return -EINVAL; in nl80211_set_reg()
8976 alpha2 = nla_data(info->attrs[NL80211_ATTR_REG_ALPHA2]); in nl80211_set_reg()
8978 if (info->attrs[NL80211_ATTR_DFS_REGION]) in nl80211_set_reg()
8979 dfs_region = nla_get_u8(info->attrs[NL80211_ATTR_DFS_REGION]); in nl80211_set_reg()
8981 nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES], in nl80211_set_reg()
8985 return -EINVAL; in nl80211_set_reg()
8990 r = -EINVAL; in nl80211_set_reg()
8996 r = -ENOMEM; in nl80211_set_reg()
9000 rd->n_reg_rules = num_rules; in nl80211_set_reg()
9001 rd->alpha2[0] = alpha2[0]; in nl80211_set_reg()
9002 rd->alpha2[1] = alpha2[1]; in nl80211_set_reg()
9009 rd->dfs_region = dfs_region; in nl80211_set_reg()
9011 nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES], in nl80211_set_reg()
9015 info->extack); in nl80211_set_reg()
9018 r = parse_reg_rule(tb, &rd->reg_rules[rule_idx]); in nl80211_set_reg()
9025 r = -EINVAL; in nl80211_set_reg()
9072 return b < NUM_NL80211_BANDS && wiphy->bands[b]; in is_band_valid()
9087 return -EINVAL; in parse_bss_select()
9099 return -EINVAL; in parse_bss_select()
9104 bss_select->behaviour = __NL80211_BSS_SELECT_ATTR_INVALID; in parse_bss_select()
9107 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_RSSI; in parse_bss_select()
9110 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_BAND_PREF; in parse_bss_select()
9111 bss_select->param.band_pref = in parse_bss_select()
9113 if (!is_band_valid(wiphy, bss_select->param.band_pref)) in parse_bss_select()
9114 return -EINVAL; in parse_bss_select()
9121 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_RSSI_ADJUST; in parse_bss_select()
9122 bss_select->param.adjust.band = adj_param->band; in parse_bss_select()
9123 bss_select->param.adjust.delta = adj_param->delta; in parse_bss_select()
9124 if (!is_band_valid(wiphy, bss_select->param.adjust.band)) in parse_bss_select()
9125 return -EINVAL; in parse_bss_select()
9128 /* user-space did not provide behaviour attribute */ in parse_bss_select()
9129 if (bss_select->behaviour == __NL80211_BSS_SELECT_ATTR_INVALID) in parse_bss_select()
9130 return -EINVAL; in parse_bss_select()
9132 if (!(wiphy->bss_select_support & BIT(bss_select->behaviour))) in parse_bss_select()
9133 return -EINVAL; in parse_bss_select()
9154 return -EINVAL; in nl80211_parse_random_mac()
9162 return -EINVAL; in nl80211_parse_random_mac()
9181 lockdep_assert_wiphy(wdev->wiphy); in cfg80211_off_channel_oper_allowed()
9198 if (!chandef || !chandef->chan) in cfg80211_off_channel_oper_allowed()
9205 * the off-channel operation. in cfg80211_off_channel_oper_allowed()
9208 if (chandef->chan->flags & IEEE80211_CHAN_RADAR) in cfg80211_off_channel_oper_allowed()
9215 return regulatory_pre_cac_allowed(wdev->wiphy); in cfg80211_off_channel_oper_allowed()
9246 flags = &req->flags; in nl80211_check_scan_flags()
9247 mac_addr = req->mac_addr; in nl80211_check_scan_flags()
9248 mac_addr_mask = req->mac_addr_mask; in nl80211_check_scan_flags()
9253 flags = &req->flags; in nl80211_check_scan_flags()
9254 mac_addr = req->mac_addr; in nl80211_check_scan_flags()
9255 mac_addr_mask = req->mac_addr_mask; in nl80211_check_scan_flags()
9261 !(wiphy->features & NL80211_FEATURE_LOW_PRIORITY_SCAN)) || in nl80211_check_scan_flags()
9289 return -EOPNOTSUPP; in nl80211_check_scan_flags()
9294 if (!(wiphy->features & randomness_flag) || in nl80211_check_scan_flags()
9295 (wdev && wdev->connected)) in nl80211_check_scan_flags()
9296 return -EOPNOTSUPP; in nl80211_check_scan_flags()
9308 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_trigger_scan()
9309 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_trigger_scan()
9319 wiphy = &rdev->wiphy; in nl80211_trigger_scan()
9321 if (wdev->iftype == NL80211_IFTYPE_NAN) in nl80211_trigger_scan()
9322 return -EOPNOTSUPP; in nl80211_trigger_scan()
9324 if (!rdev->ops->scan) in nl80211_trigger_scan()
9325 return -EOPNOTSUPP; in nl80211_trigger_scan()
9327 if (rdev->scan_req || rdev->scan_msg) in nl80211_trigger_scan()
9328 return -EBUSY; in nl80211_trigger_scan()
9330 if (info->attrs[NL80211_ATTR_SCAN_FREQ_KHZ]) { in nl80211_trigger_scan()
9333 return -EOPNOTSUPP; in nl80211_trigger_scan()
9334 scan_freqs = info->attrs[NL80211_ATTR_SCAN_FREQ_KHZ]; in nl80211_trigger_scan()
9336 } else if (info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]) in nl80211_trigger_scan()
9337 scan_freqs = info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]; in nl80211_trigger_scan()
9342 return -EINVAL; in nl80211_trigger_scan()
9347 if (info->attrs[NL80211_ATTR_SCAN_SSIDS]) in nl80211_trigger_scan()
9348 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp) in nl80211_trigger_scan()
9351 if (n_ssids > wiphy->max_scan_ssids) in nl80211_trigger_scan()
9352 return -EINVAL; in nl80211_trigger_scan()
9354 if (info->attrs[NL80211_ATTR_IE]) in nl80211_trigger_scan()
9355 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_trigger_scan()
9359 if (ie_len > wiphy->max_scan_ie_len) in nl80211_trigger_scan()
9360 return -EINVAL; in nl80211_trigger_scan()
9364 size = size_add(size, array_size(sizeof(*request->ssids), n_ssids)); in nl80211_trigger_scan()
9369 return -ENOMEM; in nl80211_trigger_scan()
9370 request->n_channels = n_channels; in nl80211_trigger_scan()
9373 request->ssids = (void *)request + ssids_offset; in nl80211_trigger_scan()
9374 request->n_ssids = n_ssids; in nl80211_trigger_scan()
9376 request->ie = (void *)request + ie_offset; in nl80211_trigger_scan()
9390 err = -EINVAL; in nl80211_trigger_scan()
9395 if (chan->flags & IEEE80211_CHAN_DISABLED) in nl80211_trigger_scan()
9398 request->channels[i] = chan; in nl80211_trigger_scan()
9408 if (!wiphy->bands[band]) in nl80211_trigger_scan()
9410 for (j = 0; j < wiphy->bands[band]->n_channels; j++) { in nl80211_trigger_scan()
9413 chan = &wiphy->bands[band]->channels[j]; in nl80211_trigger_scan()
9415 if (chan->flags & IEEE80211_CHAN_DISABLED) in nl80211_trigger_scan()
9418 request->channels[i] = chan; in nl80211_trigger_scan()
9425 err = -EINVAL; in nl80211_trigger_scan()
9429 request->n_channels = i; in nl80211_trigger_scan()
9431 for (i = 0; i < request->n_channels; i++) { in nl80211_trigger_scan()
9432 struct ieee80211_channel *chan = request->channels[i]; in nl80211_trigger_scan()
9434 /* if we can go off-channel to the target channel we're good */ in nl80211_trigger_scan()
9439 err = -EBUSY; in nl80211_trigger_scan()
9446 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp) { in nl80211_trigger_scan()
9448 err = -EINVAL; in nl80211_trigger_scan()
9451 request->ssids[i].ssid_len = nla_len(attr); in nl80211_trigger_scan()
9452 memcpy(request->ssids[i].ssid, nla_data(attr), nla_len(attr)); in nl80211_trigger_scan()
9457 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_trigger_scan()
9458 request->ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_trigger_scan()
9459 memcpy((void *)request->ie, in nl80211_trigger_scan()
9460 nla_data(info->attrs[NL80211_ATTR_IE]), in nl80211_trigger_scan()
9461 request->ie_len); in nl80211_trigger_scan()
9465 if (wiphy->bands[i]) in nl80211_trigger_scan()
9466 request->rates[i] = in nl80211_trigger_scan()
9467 (1 << wiphy->bands[i]->n_bitrates) - 1; in nl80211_trigger_scan()
9469 if (info->attrs[NL80211_ATTR_SCAN_SUPP_RATES]) { in nl80211_trigger_scan()
9471 info->attrs[NL80211_ATTR_SCAN_SUPP_RATES], in nl80211_trigger_scan()
9476 err = -EINVAL; in nl80211_trigger_scan()
9480 if (!wiphy->bands[band]) in nl80211_trigger_scan()
9483 err = ieee80211_get_ratemask(wiphy->bands[band], in nl80211_trigger_scan()
9486 &request->rates[band]); in nl80211_trigger_scan()
9492 if (info->attrs[NL80211_ATTR_MEASUREMENT_DURATION]) { in nl80211_trigger_scan()
9493 request->duration = in nl80211_trigger_scan()
9494 nla_get_u16(info->attrs[NL80211_ATTR_MEASUREMENT_DURATION]); in nl80211_trigger_scan()
9495 request->duration_mandatory = in nl80211_trigger_scan()
9496 nla_get_flag(info->attrs[NL80211_ATTR_MEASUREMENT_DURATION_MANDATORY]); in nl80211_trigger_scan()
9499 err = nl80211_check_scan_flags(wiphy, wdev, request, info->attrs, in nl80211_trigger_scan()
9504 request->no_cck = in nl80211_trigger_scan()
9505 nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]); in nl80211_trigger_scan()
9510 * NL80211_ATTR_BSSID attribute was added to fix this. For backwards in nl80211_trigger_scan()
9516 if (info->attrs[NL80211_ATTR_BSSID]) in nl80211_trigger_scan()
9517 memcpy(request->bssid, in nl80211_trigger_scan()
9518 nla_data(info->attrs[NL80211_ATTR_BSSID]), ETH_ALEN); in nl80211_trigger_scan()
9519 else if (!(request->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) && in nl80211_trigger_scan()
9520 info->attrs[NL80211_ATTR_MAC]) in nl80211_trigger_scan()
9521 memcpy(request->bssid, nla_data(info->attrs[NL80211_ATTR_MAC]), in nl80211_trigger_scan()
9524 eth_broadcast_addr(request->bssid); in nl80211_trigger_scan()
9526 request->tsf_report_link_id = nl80211_link_id_or_invalid(info->attrs); in nl80211_trigger_scan()
9527 request->wdev = wdev; in nl80211_trigger_scan()
9528 request->wiphy = &rdev->wiphy; in nl80211_trigger_scan()
9529 request->scan_start = jiffies; in nl80211_trigger_scan()
9531 rdev->scan_req = request; in nl80211_trigger_scan()
9538 dev_hold(wdev->netdev); in nl80211_trigger_scan()
9543 rdev->scan_req = NULL; in nl80211_trigger_scan()
9551 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_abort_scan()
9552 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_abort_scan()
9554 if (!rdev->ops->abort_scan) in nl80211_abort_scan()
9555 return -EOPNOTSUPP; in nl80211_abort_scan()
9557 if (rdev->scan_msg) in nl80211_abort_scan()
9560 if (!rdev->scan_req) in nl80211_abort_scan()
9561 return -ENOENT; in nl80211_abort_scan()
9586 return -EINVAL; in nl80211_parse_sched_scan_plans()
9588 request->scan_plans[0].interval = in nl80211_parse_sched_scan_plans()
9590 if (!request->scan_plans[0].interval) in nl80211_parse_sched_scan_plans()
9591 return -EINVAL; in nl80211_parse_sched_scan_plans()
9593 if (request->scan_plans[0].interval > in nl80211_parse_sched_scan_plans()
9594 wiphy->max_sched_scan_plan_interval) in nl80211_parse_sched_scan_plans()
9595 request->scan_plans[0].interval = in nl80211_parse_sched_scan_plans()
9596 wiphy->max_sched_scan_plan_interval; in nl80211_parse_sched_scan_plans()
9605 return -EINVAL; in nl80211_parse_sched_scan_plans()
9615 return -EINVAL; in nl80211_parse_sched_scan_plans()
9617 request->scan_plans[i].interval = in nl80211_parse_sched_scan_plans()
9619 if (!request->scan_plans[i].interval || in nl80211_parse_sched_scan_plans()
9620 request->scan_plans[i].interval > in nl80211_parse_sched_scan_plans()
9621 wiphy->max_sched_scan_plan_interval) in nl80211_parse_sched_scan_plans()
9622 return -EINVAL; in nl80211_parse_sched_scan_plans()
9625 request->scan_plans[i].iterations = in nl80211_parse_sched_scan_plans()
9627 if (!request->scan_plans[i].iterations || in nl80211_parse_sched_scan_plans()
9628 (request->scan_plans[i].iterations > in nl80211_parse_sched_scan_plans()
9629 wiphy->max_sched_scan_plan_iterations)) in nl80211_parse_sched_scan_plans()
9630 return -EINVAL; in nl80211_parse_sched_scan_plans()
9631 } else if (i < n_plans - 1) { in nl80211_parse_sched_scan_plans()
9636 return -EINVAL; in nl80211_parse_sched_scan_plans()
9646 if (request->scan_plans[n_plans - 1].iterations) in nl80211_parse_sched_scan_plans()
9647 return -EINVAL; in nl80211_parse_sched_scan_plans()
9668 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
9678 if (n_ssids > wiphy->max_sched_scan_ssids) in nl80211_parse_sched_scan()
9679 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
9688 * global RSSI for all other matchsets - if there are other matchsets. in nl80211_parse_sched_scan()
9707 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
9726 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
9733 if (ie_len > wiphy->max_sched_scan_ie_len) in nl80211_parse_sched_scan()
9734 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
9742 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
9755 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
9760 if (!n_plans || n_plans > wiphy->max_sched_scan_plans) in nl80211_parse_sched_scan()
9761 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
9767 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
9770 size = size_add(size, array_size(sizeof(*request->ssids), n_ssids)); in nl80211_parse_sched_scan()
9771 size = size_add(size, array_size(sizeof(*request->match_sets), in nl80211_parse_sched_scan()
9773 size = size_add(size, array_size(sizeof(*request->scan_plans), in nl80211_parse_sched_scan()
9778 return ERR_PTR(-ENOMEM); in nl80211_parse_sched_scan()
9781 request->ssids = (void *)request + in nl80211_parse_sched_scan()
9783 request->n_ssids = n_ssids; in nl80211_parse_sched_scan()
9786 request->ie = (void *)(request->ssids + n_ssids); in nl80211_parse_sched_scan()
9788 request->ie = (void *)(request->channels + n_channels); in nl80211_parse_sched_scan()
9792 if (request->ie) in nl80211_parse_sched_scan()
9793 request->match_sets = (void *)(request->ie + ie_len); in nl80211_parse_sched_scan()
9795 request->match_sets = in nl80211_parse_sched_scan()
9796 (void *)(request->ssids + n_ssids); in nl80211_parse_sched_scan()
9798 request->match_sets = in nl80211_parse_sched_scan()
9799 (void *)(request->channels + n_channels); in nl80211_parse_sched_scan()
9801 request->n_match_sets = n_match_sets; in nl80211_parse_sched_scan()
9804 request->scan_plans = (void *)(request->match_sets + in nl80211_parse_sched_scan()
9806 else if (request->ie) in nl80211_parse_sched_scan()
9807 request->scan_plans = (void *)(request->ie + ie_len); in nl80211_parse_sched_scan()
9809 request->scan_plans = (void *)(request->ssids + n_ssids); in nl80211_parse_sched_scan()
9811 request->scan_plans = (void *)(request->channels + n_channels); in nl80211_parse_sched_scan()
9813 request->n_scan_plans = n_plans; in nl80211_parse_sched_scan()
9826 err = -EINVAL; in nl80211_parse_sched_scan()
9831 if (chan->flags & IEEE80211_CHAN_DISABLED) in nl80211_parse_sched_scan()
9834 request->channels[i] = chan; in nl80211_parse_sched_scan()
9842 if (!wiphy->bands[band]) in nl80211_parse_sched_scan()
9844 for (j = 0; j < wiphy->bands[band]->n_channels; j++) { in nl80211_parse_sched_scan()
9847 chan = &wiphy->bands[band]->channels[j]; in nl80211_parse_sched_scan()
9849 if (chan->flags & IEEE80211_CHAN_DISABLED) in nl80211_parse_sched_scan()
9852 request->channels[i] = chan; in nl80211_parse_sched_scan()
9859 err = -EINVAL; in nl80211_parse_sched_scan()
9863 request->n_channels = i; in nl80211_parse_sched_scan()
9870 err = -EINVAL; in nl80211_parse_sched_scan()
9873 request->ssids[i].ssid_len = nla_len(attr); in nl80211_parse_sched_scan()
9874 memcpy(request->ssids[i].ssid, nla_data(attr), in nl80211_parse_sched_scan()
9907 err = -EINVAL; in nl80211_parse_sched_scan()
9912 memcpy(request->match_sets[i].ssid.ssid, in nl80211_parse_sched_scan()
9914 request->match_sets[i].ssid.ssid_len = in nl80211_parse_sched_scan()
9918 memcpy(request->match_sets[i].bssid, in nl80211_parse_sched_scan()
9921 /* special attribute - old implementation w/a */ in nl80211_parse_sched_scan()
9922 request->match_sets[i].rssi_thold = default_match_rssi; in nl80211_parse_sched_scan()
9925 request->match_sets[i].rssi_thold = in nl80211_parse_sched_scan()
9932 request->match_sets[0].rssi_thold = default_match_rssi; in nl80211_parse_sched_scan()
9934 request->min_rssi_thold = INT_MAX; in nl80211_parse_sched_scan()
9936 request->min_rssi_thold = in nl80211_parse_sched_scan()
9937 min(request->match_sets[i].rssi_thold, in nl80211_parse_sched_scan()
9938 request->min_rssi_thold); in nl80211_parse_sched_scan()
9940 request->min_rssi_thold = NL80211_SCAN_RSSI_THOLD_OFF; in nl80211_parse_sched_scan()
9944 request->ie_len = ie_len; in nl80211_parse_sched_scan()
9945 memcpy((void *)request->ie, in nl80211_parse_sched_scan()
9947 request->ie_len); in nl80211_parse_sched_scan()
9955 request->delay = in nl80211_parse_sched_scan()
9959 request->relative_rssi = nla_get_s8( in nl80211_parse_sched_scan()
9961 request->relative_rssi_set = true; in nl80211_parse_sched_scan()
9964 if (request->relative_rssi_set && in nl80211_parse_sched_scan()
9970 request->rssi_adjust.band = rssi_adjust->band; in nl80211_parse_sched_scan()
9971 request->rssi_adjust.delta = rssi_adjust->delta; in nl80211_parse_sched_scan()
9972 if (!is_band_valid(wiphy, request->rssi_adjust.band)) { in nl80211_parse_sched_scan()
9973 err = -EINVAL; in nl80211_parse_sched_scan()
9982 request->scan_start = jiffies; in nl80211_parse_sched_scan()
9994 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_start_sched_scan()
9995 struct net_device *dev = info->user_ptr[1]; in nl80211_start_sched_scan()
9996 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_start_sched_scan()
10001 if (!rdev->wiphy.max_sched_scan_reqs || !rdev->ops->sched_scan_start) in nl80211_start_sched_scan()
10002 return -EOPNOTSUPP; in nl80211_start_sched_scan()
10004 want_multi = info->attrs[NL80211_ATTR_SCHED_SCAN_MULTI]; in nl80211_start_sched_scan()
10009 sched_scan_req = nl80211_parse_sched_scan(&rdev->wiphy, wdev, in nl80211_start_sched_scan()
10010 info->attrs, in nl80211_start_sched_scan()
10011 rdev->wiphy.max_match_sets); in nl80211_start_sched_scan()
10018 * or if driver does not support multi-scheduled scan in nl80211_start_sched_scan()
10020 if (want_multi && rdev->wiphy.max_sched_scan_reqs > 1) in nl80211_start_sched_scan()
10021 sched_scan_req->reqid = cfg80211_assign_cookie(rdev); in nl80211_start_sched_scan()
10027 sched_scan_req->dev = dev; in nl80211_start_sched_scan()
10028 sched_scan_req->wiphy = &rdev->wiphy; in nl80211_start_sched_scan()
10030 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) in nl80211_start_sched_scan()
10031 sched_scan_req->owner_nlportid = info->snd_portid; in nl80211_start_sched_scan()
10048 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_stop_sched_scan()
10051 if (!rdev->wiphy.max_sched_scan_reqs || !rdev->ops->sched_scan_stop) in nl80211_stop_sched_scan()
10052 return -EOPNOTSUPP; in nl80211_stop_sched_scan()
10054 if (info->attrs[NL80211_ATTR_COOKIE]) { in nl80211_stop_sched_scan()
10055 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); in nl80211_stop_sched_scan()
10059 req = list_first_or_null_rcu(&rdev->sched_scan_req_list, in nl80211_stop_sched_scan()
10062 if (!req || req->reqid || in nl80211_stop_sched_scan()
10063 (req->owner_nlportid && in nl80211_stop_sched_scan()
10064 req->owner_nlportid != info->snd_portid)) in nl80211_stop_sched_scan()
10065 return -ENOENT; in nl80211_stop_sched_scan()
10073 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_start_radar_detection()
10074 struct net_device *dev = info->user_ptr[1]; in nl80211_start_radar_detection()
10075 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_start_radar_detection()
10076 int link_id = nl80211_link_id(info->attrs); in nl80211_start_radar_detection()
10077 struct wiphy *wiphy = wdev->wiphy; in nl80211_start_radar_detection()
10081 int err = -EINVAL; in nl80211_start_radar_detection()
10083 flush_delayed_work(&rdev->dfs_update_channels_wk); in nl80211_start_radar_detection()
10085 switch (wdev->iftype) { in nl80211_start_radar_detection()
10092 /* caution - see cfg80211_beaconing_iface_active() below */ in nl80211_start_radar_detection()
10093 return -EINVAL; in nl80211_start_radar_detection()
10106 err = cfg80211_chandef_dfs_required(wiphy, &chandef, wdev->iftype); in nl80211_start_radar_detection()
10111 err = -EINVAL; in nl80211_start_radar_detection()
10116 err = -EINVAL; in nl80211_start_radar_detection()
10120 if (nla_get_flag(info->attrs[NL80211_ATTR_RADAR_BACKGROUND])) { in nl80211_start_radar_detection()
10130 if (wdev->valid_links && in nl80211_start_radar_detection()
10131 !wdev->links[link_id].ap.beacon_interval) { in nl80211_start_radar_detection()
10134 err = -EBUSY; in nl80211_start_radar_detection()
10139 if (wdev->links[link_id].cac_started) { in nl80211_start_radar_detection()
10140 err = -EBUSY; in nl80211_start_radar_detection()
10146 err = -EOPNOTSUPP; in nl80211_start_radar_detection()
10150 if (!rdev->ops->start_radar_detection) { in nl80211_start_radar_detection()
10151 err = -EOPNOTSUPP; in nl80211_start_radar_detection()
10155 cac_time_ms = cfg80211_chandef_dfs_cac_time(&rdev->wiphy, &chandef); in nl80211_start_radar_detection()
10162 switch (wdev->iftype) { in nl80211_start_radar_detection()
10165 wdev->links[0].ap.chandef = chandef; in nl80211_start_radar_detection()
10168 wdev->u.ibss.chandef = chandef; in nl80211_start_radar_detection()
10171 wdev->u.mesh.chandef = chandef; in nl80211_start_radar_detection()
10176 wdev->links[link_id].cac_started = true; in nl80211_start_radar_detection()
10177 wdev->links[link_id].cac_start_time = jiffies; in nl80211_start_radar_detection()
10178 wdev->links[link_id].cac_time_ms = cac_time_ms; in nl80211_start_radar_detection()
10189 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_notify_radar_detection()
10190 struct net_device *dev = info->user_ptr[1]; in nl80211_notify_radar_detection()
10191 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_notify_radar_detection()
10192 struct wiphy *wiphy = wdev->wiphy; in nl80211_notify_radar_detection()
10201 return -EINVAL; in nl80211_notify_radar_detection()
10210 err = cfg80211_chandef_dfs_required(wiphy, &chandef, wdev->iftype); in nl80211_notify_radar_detection()
10219 return -EINVAL; in nl80211_notify_radar_detection()
10225 if (chandef.chan->dfs_state == NL80211_DFS_UNAVAILABLE) in nl80211_notify_radar_detection()
10232 rdev->radar_chandef = chandef; in nl80211_notify_radar_detection()
10235 queue_work(cfg80211_wq, &rdev->propagate_radar_detect_wk); in nl80211_notify_radar_detection()
10253 return -EINVAL; in nl80211_parse_counter_offsets()
10256 if (rdev->wiphy.max_num_csa_counters && in nl80211_parse_counter_offsets()
10257 (*n_offsets > rdev->wiphy.max_num_csa_counters)) in nl80211_parse_counter_offsets()
10258 return -EINVAL; in nl80211_parse_counter_offsets()
10262 /* sanity checks - counters should fit and be the same */ in nl80211_parse_counter_offsets()
10267 return -EINVAL; in nl80211_parse_counter_offsets()
10269 if (first_count != -1 && data[offset] != first_count) in nl80211_parse_counter_offsets()
10270 return -EINVAL; in nl80211_parse_counter_offsets()
10278 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_channel_switch()
10279 unsigned int link_id = nl80211_link_id(info->attrs); in nl80211_channel_switch()
10280 struct net_device *dev = info->user_ptr[1]; in nl80211_channel_switch()
10281 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_channel_switch()
10289 if (!rdev->ops->channel_switch || in nl80211_channel_switch()
10290 !(rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH)) in nl80211_channel_switch()
10291 return -EOPNOTSUPP; in nl80211_channel_switch()
10293 switch (dev->ieee80211_ptr->iftype) { in nl80211_channel_switch()
10305 if (!wdev->links[link_id].ap.beacon_interval) in nl80211_channel_switch()
10306 return -ENOTCONN; in nl80211_channel_switch()
10309 if (!wdev->u.ibss.ssid_len) in nl80211_channel_switch()
10310 return -ENOTCONN; in nl80211_channel_switch()
10313 if (!wdev->u.mesh.id_len) in nl80211_channel_switch()
10314 return -ENOTCONN; in nl80211_channel_switch()
10317 return -EOPNOTSUPP; in nl80211_channel_switch()
10321 params.beacon_csa.ftm_responder = -1; in nl80211_channel_switch()
10323 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ] || in nl80211_channel_switch()
10324 !info->attrs[NL80211_ATTR_CH_SWITCH_COUNT]) in nl80211_channel_switch()
10325 return -EINVAL; in nl80211_channel_switch()
10328 if (need_new_beacon && !info->attrs[NL80211_ATTR_CSA_IES]) in nl80211_channel_switch()
10329 return -EINVAL; in nl80211_channel_switch()
10334 cs_count = nla_get_u32(info->attrs[NL80211_ATTR_CH_SWITCH_COUNT]); in nl80211_channel_switch()
10336 return -EINVAL; in nl80211_channel_switch()
10343 err = nl80211_parse_beacon(rdev, info->attrs, &params.beacon_after, in nl80211_channel_switch()
10344 info->extack); in nl80211_channel_switch()
10351 err = -ENOMEM; in nl80211_channel_switch()
10356 info->attrs[NL80211_ATTR_CSA_IES], in nl80211_channel_switch()
10357 nl80211_policy, info->extack); in nl80211_channel_switch()
10362 info->extack); in nl80211_channel_switch()
10367 err = -EINVAL; in nl80211_channel_switch()
10394 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &params.chandef, in nl80211_channel_switch()
10395 wdev->iftype)) { in nl80211_channel_switch()
10396 err = -EINVAL; in nl80211_channel_switch()
10400 err = cfg80211_chandef_dfs_required(wdev->wiphy, in nl80211_channel_switch()
10402 wdev->iftype); in nl80211_channel_switch()
10409 !nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS])) { in nl80211_channel_switch()
10410 err = -EINVAL; in nl80211_channel_switch()
10415 if (info->attrs[NL80211_ATTR_CH_SWITCH_BLOCK_TX]) in nl80211_channel_switch()
10436 struct cfg80211_bss *res = &intbss->pub; in nl80211_send_bss()
10442 lockdep_assert_wiphy(wdev->wiphy); in nl80211_send_bss()
10444 hdr = nl80211hdr_put(msg, NETLINK_CB(cb->skb).portid, seq, flags, in nl80211_send_bss()
10447 return -1; in nl80211_send_bss()
10451 if (nla_put_u32(msg, NL80211_ATTR_GENERATION, rdev->bss_generation)) in nl80211_send_bss()
10453 if (wdev->netdev && in nl80211_send_bss()
10454 nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex)) in nl80211_send_bss()
10463 if ((!is_zero_ether_addr(res->bssid) && in nl80211_send_bss()
10464 nla_put(msg, NL80211_BSS_BSSID, ETH_ALEN, res->bssid))) in nl80211_send_bss()
10469 if (rcu_access_pointer(res->proberesp_ies) && in nl80211_send_bss()
10476 ies = rcu_dereference(res->ies); in nl80211_send_bss()
10478 if (nla_put_u64_64bit(msg, NL80211_BSS_TSF, ies->tsf, in nl80211_send_bss()
10481 if (ies->len && nla_put(msg, NL80211_BSS_INFORMATION_ELEMENTS, in nl80211_send_bss()
10482 ies->len, ies->data)) in nl80211_send_bss()
10487 ies = rcu_dereference(res->beacon_ies); in nl80211_send_bss()
10488 if (ies && ies->from_beacon) { in nl80211_send_bss()
10489 if (nla_put_u64_64bit(msg, NL80211_BSS_BEACON_TSF, ies->tsf, in nl80211_send_bss()
10492 if (ies->len && nla_put(msg, NL80211_BSS_BEACON_IES, in nl80211_send_bss()
10493 ies->len, ies->data)) in nl80211_send_bss()
10498 if (res->beacon_interval && in nl80211_send_bss()
10499 nla_put_u16(msg, NL80211_BSS_BEACON_INTERVAL, res->beacon_interval)) in nl80211_send_bss()
10501 if (nla_put_u16(msg, NL80211_BSS_CAPABILITY, res->capability) || in nl80211_send_bss()
10502 nla_put_u32(msg, NL80211_BSS_FREQUENCY, res->channel->center_freq) || in nl80211_send_bss()
10504 res->channel->freq_offset) || in nl80211_send_bss()
10506 jiffies_to_msecs(jiffies - intbss->ts))) in nl80211_send_bss()
10509 if (intbss->parent_tsf && in nl80211_send_bss()
10511 intbss->parent_tsf, NL80211_BSS_PAD) || in nl80211_send_bss()
10513 intbss->parent_bssid))) in nl80211_send_bss()
10516 if (intbss->ts_boottime && in nl80211_send_bss()
10518 intbss->ts_boottime, NL80211_BSS_PAD)) in nl80211_send_bss()
10521 if (!nl80211_put_signal(msg, intbss->pub.chains, in nl80211_send_bss()
10522 intbss->pub.chain_signal, in nl80211_send_bss()
10526 if (intbss->bss_source != BSS_SOURCE_STA_PROFILE) { in nl80211_send_bss()
10527 switch (rdev->wiphy.signal_type) { in nl80211_send_bss()
10530 res->signal)) in nl80211_send_bss()
10535 res->signal)) in nl80211_send_bss()
10543 switch (wdev->iftype) { in nl80211_send_bss()
10547 if (intbss == wdev->links[link_id].client.current_bss && in nl80211_send_bss()
10550 (wdev->valid_links && in nl80211_send_bss()
10554 wdev->u.client.connected_addr))))) in nl80211_send_bss()
10559 if (intbss == wdev->u.ibss.current_bss && in nl80211_send_bss()
10568 if (nla_put_u32(msg, NL80211_BSS_USE_FOR, res->use_for)) in nl80211_send_bss()
10571 if (res->cannot_use_reasons && in nl80211_send_bss()
10573 res->cannot_use_reasons, in nl80211_send_bss()
10586 return -EMSGSIZE; in nl80211_send_bss()
10595 int start = cb->args[2], idx = 0; in nl80211_dump_scan()
10601 return -ENOMEM; in nl80211_dump_scan()
10609 __acquire(&rdev->wiphy.mtx); in nl80211_dump_scan()
10615 spin_lock_bh(&rdev->bss_lock); in nl80211_dump_scan()
10619 * into multiple messages. It is unlikely that any more bss-es will be in nl80211_dump_scan()
10626 cb->seq = rdev->bss_generation; in nl80211_dump_scan()
10628 list_for_each_entry(scan, &rdev->bss_list, list) { in nl80211_dump_scan()
10632 !(scan->pub.use_for & NL80211_BSS_USE_FOR_NORMAL)) in nl80211_dump_scan()
10635 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_dump_scan()
10637 idx--; in nl80211_dump_scan()
10642 spin_unlock_bh(&rdev->bss_lock); in nl80211_dump_scan()
10644 cb->args[2] = idx; in nl80211_dump_scan()
10645 wiphy_unlock(&rdev->wiphy); in nl80211_dump_scan()
10647 return skb->len; in nl80211_dump_scan()
10659 if (!survey->channel && !allow_radio_stats) in nl80211_send_survey()
10665 return -ENOMEM; in nl80211_send_survey()
10667 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) in nl80211_send_survey()
10674 if (survey->channel && in nl80211_send_survey()
10676 survey->channel->center_freq)) in nl80211_send_survey()
10679 if (survey->channel && survey->channel->freq_offset && in nl80211_send_survey()
10681 survey->channel->freq_offset)) in nl80211_send_survey()
10684 if ((survey->filled & SURVEY_INFO_NOISE_DBM) && in nl80211_send_survey()
10685 nla_put_u8(msg, NL80211_SURVEY_INFO_NOISE, survey->noise)) in nl80211_send_survey()
10687 if ((survey->filled & SURVEY_INFO_IN_USE) && in nl80211_send_survey()
10690 if ((survey->filled & SURVEY_INFO_TIME) && in nl80211_send_survey()
10692 survey->time, NL80211_SURVEY_INFO_PAD)) in nl80211_send_survey()
10694 if ((survey->filled & SURVEY_INFO_TIME_BUSY) && in nl80211_send_survey()
10696 survey->time_busy, NL80211_SURVEY_INFO_PAD)) in nl80211_send_survey()
10698 if ((survey->filled & SURVEY_INFO_TIME_EXT_BUSY) && in nl80211_send_survey()
10700 survey->time_ext_busy, NL80211_SURVEY_INFO_PAD)) in nl80211_send_survey()
10702 if ((survey->filled & SURVEY_INFO_TIME_RX) && in nl80211_send_survey()
10704 survey->time_rx, NL80211_SURVEY_INFO_PAD)) in nl80211_send_survey()
10706 if ((survey->filled & SURVEY_INFO_TIME_TX) && in nl80211_send_survey()
10708 survey->time_tx, NL80211_SURVEY_INFO_PAD)) in nl80211_send_survey()
10710 if ((survey->filled & SURVEY_INFO_TIME_SCAN) && in nl80211_send_survey()
10712 survey->time_scan, NL80211_SURVEY_INFO_PAD)) in nl80211_send_survey()
10714 if ((survey->filled & SURVEY_INFO_TIME_BSS_RX) && in nl80211_send_survey()
10716 survey->time_bss_rx, NL80211_SURVEY_INFO_PAD)) in nl80211_send_survey()
10726 return -EMSGSIZE; in nl80211_send_survey()
10735 int survey_idx = cb->args[2]; in nl80211_dump_survey()
10741 return -ENOMEM; in nl80211_dump_survey()
10749 __acquire(&rdev->wiphy.mtx); in nl80211_dump_survey()
10754 if (!wdev->netdev) { in nl80211_dump_survey()
10755 res = -EINVAL; in nl80211_dump_survey()
10759 if (!rdev->ops->dump_survey) { in nl80211_dump_survey()
10760 res = -EOPNOTSUPP; in nl80211_dump_survey()
10765 res = rdev_dump_survey(rdev, wdev->netdev, survey_idx, &survey); in nl80211_dump_survey()
10766 if (res == -ENOENT) in nl80211_dump_survey()
10771 /* don't send disabled channels, but do send non-channel data */ in nl80211_dump_survey()
10773 survey.channel->flags & IEEE80211_CHAN_DISABLED) { in nl80211_dump_survey()
10779 NETLINK_CB(cb->skb).portid, in nl80211_dump_survey()
10780 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_dump_survey()
10781 wdev->netdev, radio_stats, &survey) < 0) in nl80211_dump_survey()
10787 cb->args[2] = survey_idx; in nl80211_dump_survey()
10788 res = skb->len; in nl80211_dump_survey()
10791 wiphy_unlock(&rdev->wiphy); in nl80211_dump_survey()
10797 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_authenticate()
10798 struct net_device *dev = info->user_ptr[1]; in nl80211_authenticate()
10808 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_authenticate()
10809 return -EINVAL; in nl80211_authenticate()
10811 if (!info->attrs[NL80211_ATTR_AUTH_TYPE]) in nl80211_authenticate()
10812 return -EINVAL; in nl80211_authenticate()
10814 if (!info->attrs[NL80211_ATTR_SSID]) in nl80211_authenticate()
10815 return -EINVAL; in nl80211_authenticate()
10817 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ]) in nl80211_authenticate()
10818 return -EINVAL; in nl80211_authenticate()
10825 if (key.type != -1 && key.type != NL80211_KEYTYPE_GROUP) in nl80211_authenticate()
10826 return -EINVAL; in nl80211_authenticate()
10828 return -EINVAL; in nl80211_authenticate()
10833 return -EINVAL; in nl80211_authenticate()
10835 return -EINVAL; in nl80211_authenticate()
10845 for (i = 0; i < rdev->wiphy.n_cipher_suites; i++) { in nl80211_authenticate()
10846 if (key.p.cipher == rdev->wiphy.cipher_suites[i]) { in nl80211_authenticate()
10852 return -EINVAL; in nl80211_authenticate()
10855 if (!rdev->ops->auth) in nl80211_authenticate()
10856 return -EOPNOTSUPP; in nl80211_authenticate()
10858 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_authenticate()
10859 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_authenticate()
10860 return -EOPNOTSUPP; in nl80211_authenticate()
10862 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_authenticate()
10863 freq = MHZ_TO_KHZ(nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ])); in nl80211_authenticate()
10864 if (info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]) in nl80211_authenticate()
10866 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]); in nl80211_authenticate()
10868 chan = nl80211_get_valid_chan(&rdev->wiphy, freq); in nl80211_authenticate()
10870 return -EINVAL; in nl80211_authenticate()
10872 ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); in nl80211_authenticate()
10873 ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); in nl80211_authenticate()
10875 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_authenticate()
10876 req.ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_authenticate()
10877 req.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_authenticate()
10880 auth_type = nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]); in nl80211_authenticate()
10882 return -EINVAL; in nl80211_authenticate()
10888 !info->attrs[NL80211_ATTR_AUTH_DATA]) in nl80211_authenticate()
10889 return -EINVAL; in nl80211_authenticate()
10891 if (info->attrs[NL80211_ATTR_AUTH_DATA]) { in nl80211_authenticate()
10896 return -EINVAL; in nl80211_authenticate()
10897 req.auth_data = nla_data(info->attrs[NL80211_ATTR_AUTH_DATA]); in nl80211_authenticate()
10898 req.auth_data_len = nla_len(info->attrs[NL80211_ATTR_AUTH_DATA]); in nl80211_authenticate()
10901 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; in nl80211_authenticate()
10914 req.link_id = nl80211_link_id_or_invalid(info->attrs); in nl80211_authenticate()
10916 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_MLO)) in nl80211_authenticate()
10917 return -EINVAL; in nl80211_authenticate()
10918 if (!info->attrs[NL80211_ATTR_MLD_ADDR]) in nl80211_authenticate()
10919 return -EINVAL; in nl80211_authenticate()
10920 req.ap_mld_addr = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]); in nl80211_authenticate()
10922 return -EINVAL; in nl80211_authenticate()
10925 req.bss = cfg80211_get_bss(&rdev->wiphy, chan, bssid, ssid, ssid_len, in nl80211_authenticate()
10929 return -ENOENT; in nl80211_authenticate()
10933 cfg80211_put_bss(&rdev->wiphy, req.bss); in nl80211_authenticate()
10941 if (!info->attrs[NL80211_ATTR_SOCKET_OWNER]) { in validate_pae_over_nl80211()
10943 return -EINVAL; in validate_pae_over_nl80211()
10946 if (!rdev->ops->tx_control_port || in validate_pae_over_nl80211()
10947 !wiphy_ext_feature_isset(&rdev->wiphy, in validate_pae_over_nl80211()
10949 return -EOPNOTSUPP; in validate_pae_over_nl80211()
10961 settings->control_port = info->attrs[NL80211_ATTR_CONTROL_PORT]; in nl80211_crypto_settings()
10963 if (info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]) { in nl80211_crypto_settings()
10967 info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]); in nl80211_crypto_settings()
10968 settings->control_port_ethertype = cpu_to_be16(proto); in nl80211_crypto_settings()
10969 if (!(rdev->wiphy.flags & WIPHY_FLAG_CONTROL_PORT_PROTOCOL) && in nl80211_crypto_settings()
10971 return -EINVAL; in nl80211_crypto_settings()
10972 if (info->attrs[NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT]) in nl80211_crypto_settings()
10973 settings->control_port_no_encrypt = true; in nl80211_crypto_settings()
10975 settings->control_port_ethertype = cpu_to_be16(ETH_P_PAE); in nl80211_crypto_settings()
10977 if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) { in nl80211_crypto_settings()
10983 settings->control_port_over_nl80211 = true; in nl80211_crypto_settings()
10985 if (info->attrs[NL80211_ATTR_CONTROL_PORT_NO_PREAUTH]) in nl80211_crypto_settings()
10986 settings->control_port_no_preauth = true; in nl80211_crypto_settings()
10989 if (info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]) { in nl80211_crypto_settings()
10993 data = nla_data(info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]); in nl80211_crypto_settings()
10994 len = nla_len(info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]); in nl80211_crypto_settings()
10995 settings->n_ciphers_pairwise = len / sizeof(u32); in nl80211_crypto_settings()
10998 return -EINVAL; in nl80211_crypto_settings()
11000 if (settings->n_ciphers_pairwise > cipher_limit) in nl80211_crypto_settings()
11001 return -EINVAL; in nl80211_crypto_settings()
11003 memcpy(settings->ciphers_pairwise, data, len); in nl80211_crypto_settings()
11005 for (i = 0; i < settings->n_ciphers_pairwise; i++) in nl80211_crypto_settings()
11007 &rdev->wiphy, in nl80211_crypto_settings()
11008 settings->ciphers_pairwise[i])) in nl80211_crypto_settings()
11009 return -EINVAL; in nl80211_crypto_settings()
11012 if (info->attrs[NL80211_ATTR_CIPHER_SUITE_GROUP]) { in nl80211_crypto_settings()
11013 settings->cipher_group = in nl80211_crypto_settings()
11014 nla_get_u32(info->attrs[NL80211_ATTR_CIPHER_SUITE_GROUP]); in nl80211_crypto_settings()
11015 if (!cfg80211_supported_cipher_suite(&rdev->wiphy, in nl80211_crypto_settings()
11016 settings->cipher_group)) in nl80211_crypto_settings()
11017 return -EINVAL; in nl80211_crypto_settings()
11020 if (info->attrs[NL80211_ATTR_WPA_VERSIONS]) in nl80211_crypto_settings()
11021 settings->wpa_versions = in nl80211_crypto_settings()
11022 nla_get_u32(info->attrs[NL80211_ATTR_WPA_VERSIONS]); in nl80211_crypto_settings()
11024 if (info->attrs[NL80211_ATTR_AKM_SUITES]) { in nl80211_crypto_settings()
11028 data = nla_data(info->attrs[NL80211_ATTR_AKM_SUITES]); in nl80211_crypto_settings()
11029 len = nla_len(info->attrs[NL80211_ATTR_AKM_SUITES]); in nl80211_crypto_settings()
11030 settings->n_akm_suites = len / sizeof(u32); in nl80211_crypto_settings()
11033 return -EINVAL; in nl80211_crypto_settings()
11035 if (settings->n_akm_suites > rdev->wiphy.max_num_akm_suites) in nl80211_crypto_settings()
11036 return -EINVAL; in nl80211_crypto_settings()
11038 memcpy(settings->akm_suites, data, len); in nl80211_crypto_settings()
11041 if (info->attrs[NL80211_ATTR_PMK]) { in nl80211_crypto_settings()
11042 if (nla_len(info->attrs[NL80211_ATTR_PMK]) != WLAN_PMK_LEN) in nl80211_crypto_settings()
11043 return -EINVAL; in nl80211_crypto_settings()
11044 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_crypto_settings()
11046 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_crypto_settings()
11048 return -EINVAL; in nl80211_crypto_settings()
11049 settings->psk = nla_data(info->attrs[NL80211_ATTR_PMK]); in nl80211_crypto_settings()
11052 if (info->attrs[NL80211_ATTR_SAE_PASSWORD]) { in nl80211_crypto_settings()
11053 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_crypto_settings()
11055 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_crypto_settings()
11057 return -EINVAL; in nl80211_crypto_settings()
11058 settings->sae_pwd = in nl80211_crypto_settings()
11059 nla_data(info->attrs[NL80211_ATTR_SAE_PASSWORD]); in nl80211_crypto_settings()
11060 settings->sae_pwd_len = in nl80211_crypto_settings()
11061 nla_len(info->attrs[NL80211_ATTR_SAE_PASSWORD]); in nl80211_crypto_settings()
11064 if (info->attrs[NL80211_ATTR_SAE_PWE]) in nl80211_crypto_settings()
11065 settings->sae_pwe = in nl80211_crypto_settings()
11066 nla_get_u8(info->attrs[NL80211_ATTR_SAE_PWE]); in nl80211_crypto_settings()
11068 settings->sae_pwe = NL80211_SAE_PWE_UNSPECIFIED; in nl80211_crypto_settings()
11084 return ERR_PTR(-EINVAL); in nl80211_assoc_bss()
11092 chan = nl80211_get_valid_chan(&rdev->wiphy, freq); in nl80211_assoc_bss()
11094 return ERR_PTR(-EINVAL); in nl80211_assoc_bss()
11101 bss = __cfg80211_get_bss(&rdev->wiphy, chan, bssid, in nl80211_assoc_bss()
11107 return ERR_PTR(-ENOENT); in nl80211_assoc_bss()
11114 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_associate()
11115 struct net_device *dev = info->user_ptr[1]; in nl80211_associate()
11122 if (dev->ieee80211_ptr->conn_owner_nlportid && in nl80211_associate()
11123 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) in nl80211_associate()
11124 return -EPERM; in nl80211_associate()
11126 if (!info->attrs[NL80211_ATTR_SSID]) in nl80211_associate()
11127 return -EINVAL; in nl80211_associate()
11129 if (!rdev->ops->assoc) in nl80211_associate()
11130 return -EOPNOTSUPP; in nl80211_associate()
11132 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_associate()
11133 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_associate()
11134 return -EOPNOTSUPP; in nl80211_associate()
11136 ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); in nl80211_associate()
11137 ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); in nl80211_associate()
11139 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_associate()
11140 req.ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_associate()
11141 req.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_associate()
11145 NL_SET_ERR_MSG_ATTR(info->extack, in nl80211_associate()
11146 info->attrs[NL80211_ATTR_IE], in nl80211_associate()
11147 "non-inheritance makes no sense"); in nl80211_associate()
11148 return -EINVAL; in nl80211_associate()
11152 if (info->attrs[NL80211_ATTR_USE_MFP]) { in nl80211_associate()
11154 nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]); in nl80211_associate()
11158 return -EINVAL; in nl80211_associate()
11161 if (info->attrs[NL80211_ATTR_PREV_BSSID]) in nl80211_associate()
11162 req.prev_bssid = nla_data(info->attrs[NL80211_ATTR_PREV_BSSID]); in nl80211_associate()
11164 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HT])) in nl80211_associate()
11167 if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) in nl80211_associate()
11169 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]), in nl80211_associate()
11172 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) { in nl80211_associate()
11173 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) in nl80211_associate()
11174 return -EINVAL; in nl80211_associate()
11176 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]), in nl80211_associate()
11180 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_VHT])) in nl80211_associate()
11183 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HE])) in nl80211_associate()
11186 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_EHT])) in nl80211_associate()
11189 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) in nl80211_associate()
11191 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]), in nl80211_associate()
11194 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) { in nl80211_associate()
11195 if (!info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) in nl80211_associate()
11196 return -EINVAL; in nl80211_associate()
11198 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]), in nl80211_associate()
11202 if (nla_get_flag(info->attrs[NL80211_ATTR_USE_RRM])) { in nl80211_associate()
11203 if (!((rdev->wiphy.features & in nl80211_associate()
11205 (rdev->wiphy.features & NL80211_FEATURE_QUIET)) && in nl80211_associate()
11206 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_associate()
11208 return -EINVAL; in nl80211_associate()
11212 if (info->attrs[NL80211_ATTR_FILS_KEK]) { in nl80211_associate()
11213 req.fils_kek = nla_data(info->attrs[NL80211_ATTR_FILS_KEK]); in nl80211_associate()
11214 req.fils_kek_len = nla_len(info->attrs[NL80211_ATTR_FILS_KEK]); in nl80211_associate()
11215 if (!info->attrs[NL80211_ATTR_FILS_NONCES]) in nl80211_associate()
11216 return -EINVAL; in nl80211_associate()
11218 nla_data(info->attrs[NL80211_ATTR_FILS_NONCES]); in nl80211_associate()
11221 if (info->attrs[NL80211_ATTR_S1G_CAPABILITY_MASK]) { in nl80211_associate()
11222 if (!info->attrs[NL80211_ATTR_S1G_CAPABILITY]) in nl80211_associate()
11223 return -EINVAL; in nl80211_associate()
11225 nla_data(info->attrs[NL80211_ATTR_S1G_CAPABILITY_MASK]), in nl80211_associate()
11229 if (info->attrs[NL80211_ATTR_S1G_CAPABILITY]) { in nl80211_associate()
11230 if (!info->attrs[NL80211_ATTR_S1G_CAPABILITY_MASK]) in nl80211_associate()
11231 return -EINVAL; in nl80211_associate()
11233 nla_data(info->attrs[NL80211_ATTR_S1G_CAPABILITY]), in nl80211_associate()
11237 if (nla_get_flag(info->attrs[NL80211_ATTR_ASSOC_SPP_AMSDU])) { in nl80211_associate()
11238 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_associate()
11240 GENL_SET_ERR_MSG(info, "SPP A-MSDUs not supported"); in nl80211_associate()
11241 return -EINVAL; in nl80211_associate()
11246 req.link_id = nl80211_link_id_or_invalid(info->attrs); in nl80211_associate()
11248 if (info->attrs[NL80211_ATTR_MLO_LINKS]) { in nl80211_associate()
11254 return -EINVAL; in nl80211_associate()
11256 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_MLO)) in nl80211_associate()
11257 return -EINVAL; in nl80211_associate()
11259 if (info->attrs[NL80211_ATTR_MAC] || in nl80211_associate()
11260 info->attrs[NL80211_ATTR_WIPHY_FREQ] || in nl80211_associate()
11261 !info->attrs[NL80211_ATTR_MLD_ADDR]) in nl80211_associate()
11262 return -EINVAL; in nl80211_associate()
11264 req.ap_mld_addr = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]); in nl80211_associate()
11269 return -ENOMEM; in nl80211_associate()
11272 info->attrs[NL80211_ATTR_MLO_LINKS], in nl80211_associate()
11280 err = -EINVAL; in nl80211_associate()
11281 NL_SET_BAD_ATTR(info->extack, link); in nl80211_associate()
11288 err = -EINVAL; in nl80211_associate()
11289 NL_SET_BAD_ATTR(info->extack, link); in nl80211_associate()
11298 NL_SET_ERR_MSG_ATTR(info->extack, in nl80211_associate()
11312 NL_SET_ERR_MSG_ATTR(info->extack, in nl80211_associate()
11315 err = -EINVAL; in nl80211_associate()
11322 NL_SET_ERR_MSG_ATTR(info->extack, in nl80211_associate()
11324 "cannot deal with non-inheritance"); in nl80211_associate()
11325 err = -EINVAL; in nl80211_associate()
11335 err = -EINVAL; in nl80211_associate()
11341 "cannot have per-link elems on assoc link"); in nl80211_associate()
11342 err = -EINVAL; in nl80211_associate()
11349 err = -EINVAL; in nl80211_associate()
11357 return -EINVAL; in nl80211_associate()
11359 req.bss = nl80211_assoc_bss(rdev, ssid, ssid_len, info->attrs, in nl80211_associate()
11360 -1, -1); in nl80211_associate()
11363 ap_addr = req.bss->bssid; in nl80211_associate()
11372 info->extack); in nl80211_associate()
11374 if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) { in nl80211_associate()
11375 dev->ieee80211_ptr->conn_owner_nlportid = in nl80211_associate()
11376 info->snd_portid; in nl80211_associate()
11377 memcpy(dev->ieee80211_ptr->disconnect_bssid, in nl80211_associate()
11382 if (info->attrs[NL80211_ATTR_MLO_LINKS]) { in nl80211_associate()
11384 info->attrs[NL80211_ATTR_MLO_LINKS], in nl80211_associate()
11403 NL_SET_BAD_ATTR(info->extack, link); in nl80211_associate()
11412 cfg80211_put_bss(&rdev->wiphy, req.links[link_id].bss); in nl80211_associate()
11413 cfg80211_put_bss(&rdev->wiphy, req.bss); in nl80211_associate()
11421 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_deauthenticate()
11422 struct net_device *dev = info->user_ptr[1]; in nl80211_deauthenticate()
11428 if (dev->ieee80211_ptr->conn_owner_nlportid && in nl80211_deauthenticate()
11429 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) in nl80211_deauthenticate()
11430 return -EPERM; in nl80211_deauthenticate()
11432 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_deauthenticate()
11433 return -EINVAL; in nl80211_deauthenticate()
11435 if (!info->attrs[NL80211_ATTR_REASON_CODE]) in nl80211_deauthenticate()
11436 return -EINVAL; in nl80211_deauthenticate()
11438 if (!rdev->ops->deauth) in nl80211_deauthenticate()
11439 return -EOPNOTSUPP; in nl80211_deauthenticate()
11441 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_deauthenticate()
11442 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_deauthenticate()
11443 return -EOPNOTSUPP; in nl80211_deauthenticate()
11445 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_deauthenticate()
11447 reason_code = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); in nl80211_deauthenticate()
11450 return -EINVAL; in nl80211_deauthenticate()
11453 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_deauthenticate()
11454 ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_deauthenticate()
11455 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_deauthenticate()
11458 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; in nl80211_deauthenticate()
11466 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_disassociate()
11467 struct net_device *dev = info->user_ptr[1]; in nl80211_disassociate()
11473 if (dev->ieee80211_ptr->conn_owner_nlportid && in nl80211_disassociate()
11474 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) in nl80211_disassociate()
11475 return -EPERM; in nl80211_disassociate()
11477 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_disassociate()
11478 return -EINVAL; in nl80211_disassociate()
11480 if (!info->attrs[NL80211_ATTR_REASON_CODE]) in nl80211_disassociate()
11481 return -EINVAL; in nl80211_disassociate()
11483 if (!rdev->ops->disassoc) in nl80211_disassociate()
11484 return -EOPNOTSUPP; in nl80211_disassociate()
11486 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_disassociate()
11487 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_disassociate()
11488 return -EOPNOTSUPP; in nl80211_disassociate()
11490 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_disassociate()
11492 reason_code = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); in nl80211_disassociate()
11495 return -EINVAL; in nl80211_disassociate()
11498 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_disassociate()
11499 ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_disassociate()
11500 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_disassociate()
11503 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; in nl80211_disassociate()
11514 struct wiphy *wiphy = &rdev->wiphy; in nl80211_parse_mcast_rate()
11521 sband = wiphy->bands[band]; in nl80211_parse_mcast_rate()
11525 for (i = 0; i < sband->n_bitrates; i++) { in nl80211_parse_mcast_rate()
11526 if (sband->bitrates[i].bitrate == rateval) { in nl80211_parse_mcast_rate()
11539 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_join_ibss()
11540 struct net_device *dev = info->user_ptr[1]; in nl80211_join_ibss()
11548 if (!info->attrs[NL80211_ATTR_SSID] || in nl80211_join_ibss()
11549 !nla_len(info->attrs[NL80211_ATTR_SSID])) in nl80211_join_ibss()
11550 return -EINVAL; in nl80211_join_ibss()
11554 if (info->attrs[NL80211_ATTR_BEACON_INTERVAL]) in nl80211_join_ibss()
11556 nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]); in nl80211_join_ibss()
11563 if (!rdev->ops->join_ibss) in nl80211_join_ibss()
11564 return -EOPNOTSUPP; in nl80211_join_ibss()
11566 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC) in nl80211_join_ibss()
11567 return -EOPNOTSUPP; in nl80211_join_ibss()
11569 wiphy = &rdev->wiphy; in nl80211_join_ibss()
11571 if (info->attrs[NL80211_ATTR_MAC]) { in nl80211_join_ibss()
11572 ibss.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_join_ibss()
11575 return -EINVAL; in nl80211_join_ibss()
11577 ibss.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); in nl80211_join_ibss()
11578 ibss.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); in nl80211_join_ibss()
11580 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_join_ibss()
11581 ibss.ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_join_ibss()
11582 ibss.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_join_ibss()
11589 if (!cfg80211_reg_can_beacon(&rdev->wiphy, &ibss.chandef, in nl80211_join_ibss()
11591 return -EINVAL; in nl80211_join_ibss()
11600 if (!(rdev->wiphy.features & NL80211_FEATURE_HT_IBSS)) in nl80211_join_ibss()
11601 return -EINVAL; in nl80211_join_ibss()
11606 if (!(rdev->wiphy.features & NL80211_FEATURE_HT_IBSS)) in nl80211_join_ibss()
11607 return -EINVAL; in nl80211_join_ibss()
11608 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_join_ibss()
11610 return -EINVAL; in nl80211_join_ibss()
11613 return -EINVAL; in nl80211_join_ibss()
11615 return -EINVAL; in nl80211_join_ibss()
11618 ibss.channel_fixed = !!info->attrs[NL80211_ATTR_FREQ_FIXED]; in nl80211_join_ibss()
11619 ibss.privacy = !!info->attrs[NL80211_ATTR_PRIVACY]; in nl80211_join_ibss()
11621 if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) { in nl80211_join_ibss()
11623 nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); in nl80211_join_ibss()
11625 nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); in nl80211_join_ibss()
11627 wiphy->bands[ibss.chandef.chan->band]; in nl80211_join_ibss()
11635 if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) in nl80211_join_ibss()
11637 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]), in nl80211_join_ibss()
11640 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) { in nl80211_join_ibss()
11641 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) in nl80211_join_ibss()
11642 return -EINVAL; in nl80211_join_ibss()
11644 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]), in nl80211_join_ibss()
11648 if (info->attrs[NL80211_ATTR_MCAST_RATE] && in nl80211_join_ibss()
11650 nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]))) in nl80211_join_ibss()
11651 return -EINVAL; in nl80211_join_ibss()
11653 if (ibss.privacy && info->attrs[NL80211_ATTR_KEYS]) { in nl80211_join_ibss()
11663 return -EINVAL; in nl80211_join_ibss()
11668 nla_get_flag(info->attrs[NL80211_ATTR_CONTROL_PORT]); in nl80211_join_ibss()
11670 if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) { in nl80211_join_ibss()
11682 nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS]); in nl80211_join_ibss()
11687 else if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) in nl80211_join_ibss()
11688 dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid; in nl80211_join_ibss()
11695 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_leave_ibss()
11696 struct net_device *dev = info->user_ptr[1]; in nl80211_leave_ibss()
11698 if (!rdev->ops->leave_ibss) in nl80211_leave_ibss()
11699 return -EOPNOTSUPP; in nl80211_leave_ibss()
11701 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC) in nl80211_leave_ibss()
11702 return -EOPNOTSUPP; in nl80211_leave_ibss()
11709 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_mcast_rate()
11710 struct net_device *dev = info->user_ptr[1]; in nl80211_set_mcast_rate()
11714 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC && in nl80211_set_mcast_rate()
11715 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT && in nl80211_set_mcast_rate()
11716 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_OCB) in nl80211_set_mcast_rate()
11717 return -EOPNOTSUPP; in nl80211_set_mcast_rate()
11719 if (!rdev->ops->set_mcast_rate) in nl80211_set_mcast_rate()
11720 return -EOPNOTSUPP; in nl80211_set_mcast_rate()
11724 if (!info->attrs[NL80211_ATTR_MCAST_RATE]) in nl80211_set_mcast_rate()
11725 return -EINVAL; in nl80211_set_mcast_rate()
11727 nla_rate = nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]); in nl80211_set_mcast_rate()
11729 return -EINVAL; in nl80211_set_mcast_rate()
11756 if (nla_put_u32(skb, NL80211_ATTR_WIPHY, rdev->wiphy_idx)) in __cfg80211_alloc_vendor_skb()
11761 info->vendor_id)) in __cfg80211_alloc_vendor_skb()
11764 info->subcmd)) in __cfg80211_alloc_vendor_skb()
11772 if (wdev->netdev && in __cfg80211_alloc_vendor_skb()
11774 wdev->netdev->ifindex)) in __cfg80211_alloc_vendor_skb()
11782 ((void **)skb->cb)[0] = rdev; in __cfg80211_alloc_vendor_skb()
11783 ((void **)skb->cb)[1] = hdr; in __cfg80211_alloc_vendor_skb()
11784 ((void **)skb->cb)[2] = data; in __cfg80211_alloc_vendor_skb()
11806 if (WARN_ON(vendor_event_idx != -1)) in __cfg80211_alloc_event_skb()
11812 vendor_event_idx >= wiphy->n_vendor_events)) in __cfg80211_alloc_event_skb()
11814 info = &wiphy->vendor_events[vendor_event_idx]; in __cfg80211_alloc_event_skb()
11828 struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0]; in __cfg80211_send_event_skb()
11829 void *hdr = ((void **)skb->cb)[1]; in __cfg80211_send_event_skb()
11831 struct nlattr *data = ((void **)skb->cb)[2]; in __cfg80211_send_event_skb()
11835 memset(skb->cb, 0, sizeof(skb->cb)); in __cfg80211_send_event_skb()
11840 if (nlhdr->nlmsg_pid) { in __cfg80211_send_event_skb()
11841 genlmsg_unicast(wiphy_net(&rdev->wiphy), skb, in __cfg80211_send_event_skb()
11842 nlhdr->nlmsg_pid); in __cfg80211_send_event_skb()
11844 if (data->nla_type == NL80211_ATTR_VENDOR_DATA) in __cfg80211_send_event_skb()
11847 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), in __cfg80211_send_event_skb()
11856 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_testmode_do()
11860 lockdep_assert_held(&rdev->wiphy.mtx); in nl80211_testmode_do()
11863 info->attrs); in nl80211_testmode_do()
11865 if (!rdev->ops->testmode_cmd) in nl80211_testmode_do()
11866 return -EOPNOTSUPP; in nl80211_testmode_do()
11870 if (err != -EINVAL) in nl80211_testmode_do()
11873 } else if (wdev->wiphy != &rdev->wiphy) { in nl80211_testmode_do()
11874 return -EINVAL; in nl80211_testmode_do()
11877 if (!info->attrs[NL80211_ATTR_TESTDATA]) in nl80211_testmode_do()
11878 return -EINVAL; in nl80211_testmode_do()
11880 rdev->cur_cmd_info = info; in nl80211_testmode_do()
11882 nla_data(info->attrs[NL80211_ATTR_TESTDATA]), in nl80211_testmode_do()
11883 nla_len(info->attrs[NL80211_ATTR_TESTDATA])); in nl80211_testmode_do()
11884 rdev->cur_cmd_info = NULL; in nl80211_testmode_do()
11901 if (cb->args[0]) { in nl80211_testmode_dump()
11906 phy_idx = cb->args[0] - 1; in nl80211_testmode_dump()
11910 err = -ENOENT; in nl80211_testmode_dump()
11917 err = -ENOMEM; in nl80211_testmode_dump()
11921 err = nlmsg_parse_deprecated(cb->nlh, in nl80211_testmode_dump()
11928 rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk), attrbuf); in nl80211_testmode_dump()
11933 phy_idx = rdev->wiphy_idx; in nl80211_testmode_dump()
11936 cb->args[1] = (long)attrbuf[NL80211_ATTR_TESTDATA]; in nl80211_testmode_dump()
11939 if (cb->args[1]) { in nl80211_testmode_dump()
11940 data = nla_data((void *)cb->args[1]); in nl80211_testmode_dump()
11941 data_len = nla_len((void *)cb->args[1]); in nl80211_testmode_dump()
11944 if (!rdev->ops->testmode_dump) { in nl80211_testmode_dump()
11945 err = -EOPNOTSUPP; in nl80211_testmode_dump()
11950 void *hdr = nl80211hdr_put(skb, NETLINK_CB(cb->skb).portid, in nl80211_testmode_dump()
11951 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_testmode_dump()
11971 if (err == -ENOBUFS || err == -ENOENT) { in nl80211_testmode_dump()
11982 err = skb->len; in nl80211_testmode_dump()
11984 cb->args[0] = phy_idx + 1; in nl80211_testmode_dump()
11994 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_connect()
11995 struct net_device *dev = info->user_ptr[1]; in nl80211_connect()
12004 if (!info->attrs[NL80211_ATTR_SSID] || in nl80211_connect()
12005 !nla_len(info->attrs[NL80211_ATTR_SSID])) in nl80211_connect()
12006 return -EINVAL; in nl80211_connect()
12008 if (info->attrs[NL80211_ATTR_AUTH_TYPE]) { in nl80211_connect()
12010 nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]); in nl80211_connect()
12013 return -EINVAL; in nl80211_connect()
12017 connect.privacy = info->attrs[NL80211_ATTR_PRIVACY]; in nl80211_connect()
12019 if (info->attrs[NL80211_ATTR_WANT_1X_4WAY_HS] && in nl80211_connect()
12020 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_connect()
12022 return -EINVAL; in nl80211_connect()
12023 connect.want_1x = info->attrs[NL80211_ATTR_WANT_1X_4WAY_HS]; in nl80211_connect()
12030 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_connect()
12031 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_connect()
12032 return -EOPNOTSUPP; in nl80211_connect()
12034 wiphy = &rdev->wiphy; in nl80211_connect()
12036 connect.bg_scan_period = -1; in nl80211_connect()
12037 if (info->attrs[NL80211_ATTR_BG_SCAN_PERIOD] && in nl80211_connect()
12038 (wiphy->flags & WIPHY_FLAG_SUPPORTS_FW_ROAM)) { in nl80211_connect()
12040 nla_get_u16(info->attrs[NL80211_ATTR_BG_SCAN_PERIOD]); in nl80211_connect()
12043 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_connect()
12044 connect.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_connect()
12045 else if (info->attrs[NL80211_ATTR_MAC_HINT]) in nl80211_connect()
12047 nla_data(info->attrs[NL80211_ATTR_MAC_HINT]); in nl80211_connect()
12048 connect.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); in nl80211_connect()
12049 connect.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); in nl80211_connect()
12051 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_connect()
12052 connect.ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_connect()
12053 connect.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_connect()
12056 if (info->attrs[NL80211_ATTR_USE_MFP]) { in nl80211_connect()
12057 connect.mfp = nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]); in nl80211_connect()
12059 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_connect()
12061 return -EOPNOTSUPP; in nl80211_connect()
12066 if (info->attrs[NL80211_ATTR_PREV_BSSID]) in nl80211_connect()
12068 nla_data(info->attrs[NL80211_ATTR_PREV_BSSID]); in nl80211_connect()
12070 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) in nl80211_connect()
12072 info->attrs[NL80211_ATTR_WIPHY_FREQ])); in nl80211_connect()
12073 if (info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]) in nl80211_connect()
12075 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]); in nl80211_connect()
12080 return -EINVAL; in nl80211_connect()
12081 } else if (info->attrs[NL80211_ATTR_WIPHY_FREQ_HINT]) { in nl80211_connect()
12082 freq = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_HINT]); in nl80211_connect()
12086 return -EINVAL; in nl80211_connect()
12089 if (info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]) { in nl80211_connect()
12091 nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]); in nl80211_connect()
12093 if (info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]) in nl80211_connect()
12095 nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]); in nl80211_connect()
12098 if (connect.privacy && info->attrs[NL80211_ATTR_KEYS]) { in nl80211_connect()
12104 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HT])) in nl80211_connect()
12107 if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) in nl80211_connect()
12109 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]), in nl80211_connect()
12112 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) { in nl80211_connect()
12113 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) { in nl80211_connect()
12115 return -EINVAL; in nl80211_connect()
12118 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]), in nl80211_connect()
12122 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_VHT])) in nl80211_connect()
12125 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HE])) in nl80211_connect()
12128 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_EHT])) in nl80211_connect()
12131 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) in nl80211_connect()
12133 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]), in nl80211_connect()
12136 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) { in nl80211_connect()
12137 if (!info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) { in nl80211_connect()
12139 return -EINVAL; in nl80211_connect()
12142 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]), in nl80211_connect()
12146 if (nla_get_flag(info->attrs[NL80211_ATTR_USE_RRM])) { in nl80211_connect()
12147 if (!((rdev->wiphy.features & in nl80211_connect()
12149 (rdev->wiphy.features & NL80211_FEATURE_QUIET)) && in nl80211_connect()
12150 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_connect()
12153 return -EINVAL; in nl80211_connect()
12158 connect.pbss = nla_get_flag(info->attrs[NL80211_ATTR_PBSS]); in nl80211_connect()
12159 if (connect.pbss && !rdev->wiphy.bands[NL80211_BAND_60GHZ]) { in nl80211_connect()
12161 return -EOPNOTSUPP; in nl80211_connect()
12164 if (info->attrs[NL80211_ATTR_BSS_SELECT]) { in nl80211_connect()
12168 return -EINVAL; in nl80211_connect()
12171 err = parse_bss_select(info->attrs[NL80211_ATTR_BSS_SELECT], in nl80211_connect()
12179 if (wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_connect()
12181 info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] && in nl80211_connect()
12182 info->attrs[NL80211_ATTR_FILS_ERP_REALM] && in nl80211_connect()
12183 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] && in nl80211_connect()
12184 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { in nl80211_connect()
12186 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); in nl80211_connect()
12188 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); in nl80211_connect()
12190 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); in nl80211_connect()
12192 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); in nl80211_connect()
12195 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM]); in nl80211_connect()
12197 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); in nl80211_connect()
12199 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); in nl80211_connect()
12200 } else if (info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] || in nl80211_connect()
12201 info->attrs[NL80211_ATTR_FILS_ERP_REALM] || in nl80211_connect()
12202 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] || in nl80211_connect()
12203 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { in nl80211_connect()
12205 return -EINVAL; in nl80211_connect()
12208 if (nla_get_flag(info->attrs[NL80211_ATTR_EXTERNAL_AUTH_SUPPORT])) { in nl80211_connect()
12209 if (!info->attrs[NL80211_ATTR_SOCKET_OWNER]) { in nl80211_connect()
12213 return -EINVAL; in nl80211_connect()
12218 if (nla_get_flag(info->attrs[NL80211_ATTR_MLO_SUPPORT])) in nl80211_connect()
12226 if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) { in nl80211_connect()
12227 dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid; in nl80211_connect()
12229 memcpy(dev->ieee80211_ptr->disconnect_bssid, in nl80211_connect()
12232 eth_zero_addr(dev->ieee80211_ptr->disconnect_bssid); in nl80211_connect()
12242 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_update_connect_params()
12243 struct net_device *dev = info->user_ptr[1]; in nl80211_update_connect_params()
12244 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_update_connect_params()
12249 if (!rdev->ops->update_connect_params) in nl80211_update_connect_params()
12250 return -EOPNOTSUPP; in nl80211_update_connect_params()
12252 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_update_connect_params()
12253 connect.ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_update_connect_params()
12254 connect.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_update_connect_params()
12258 fils_sk_offload = wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_update_connect_params()
12262 * when driver supports fils-sk offload all attributes must be in nl80211_update_connect_params()
12263 * provided. So the else covers "fils-sk-not-all" and in nl80211_update_connect_params()
12264 * "no-fils-sk-any". in nl80211_update_connect_params()
12267 info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] && in nl80211_update_connect_params()
12268 info->attrs[NL80211_ATTR_FILS_ERP_REALM] && in nl80211_update_connect_params()
12269 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] && in nl80211_update_connect_params()
12270 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { in nl80211_update_connect_params()
12272 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); in nl80211_update_connect_params()
12274 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); in nl80211_update_connect_params()
12276 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); in nl80211_update_connect_params()
12278 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); in nl80211_update_connect_params()
12281 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM]); in nl80211_update_connect_params()
12283 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); in nl80211_update_connect_params()
12285 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); in nl80211_update_connect_params()
12287 } else if (info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] || in nl80211_update_connect_params()
12288 info->attrs[NL80211_ATTR_FILS_ERP_REALM] || in nl80211_update_connect_params()
12289 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] || in nl80211_update_connect_params()
12290 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { in nl80211_update_connect_params()
12291 return -EINVAL; in nl80211_update_connect_params()
12294 if (info->attrs[NL80211_ATTR_AUTH_TYPE]) { in nl80211_update_connect_params()
12295 auth_type = nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]); in nl80211_update_connect_params()
12298 return -EINVAL; in nl80211_update_connect_params()
12302 return -EINVAL; in nl80211_update_connect_params()
12308 if (!wdev->connected) in nl80211_update_connect_params()
12309 return -ENOLINK; in nl80211_update_connect_params()
12316 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_disconnect()
12317 struct net_device *dev = info->user_ptr[1]; in nl80211_disconnect()
12320 if (dev->ieee80211_ptr->conn_owner_nlportid && in nl80211_disconnect()
12321 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) in nl80211_disconnect()
12322 return -EPERM; in nl80211_disconnect()
12324 if (!info->attrs[NL80211_ATTR_REASON_CODE]) in nl80211_disconnect()
12327 reason = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); in nl80211_disconnect()
12330 return -EINVAL; in nl80211_disconnect()
12332 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_disconnect()
12333 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_disconnect()
12334 return -EOPNOTSUPP; in nl80211_disconnect()
12341 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_wiphy_netns()
12345 if (info->attrs[NL80211_ATTR_PID]) { in nl80211_wiphy_netns()
12346 u32 pid = nla_get_u32(info->attrs[NL80211_ATTR_PID]); in nl80211_wiphy_netns()
12349 } else if (info->attrs[NL80211_ATTR_NETNS_FD]) { in nl80211_wiphy_netns()
12350 u32 fd = nla_get_u32(info->attrs[NL80211_ATTR_NETNS_FD]); in nl80211_wiphy_netns()
12354 return -EINVAL; in nl80211_wiphy_netns()
12363 if (!net_eq(wiphy_net(&rdev->wiphy), net)) in nl80211_wiphy_netns()
12372 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_pmksa()
12373 struct net_device *dev = info->user_ptr[1]; in nl80211_set_pmksa()
12379 ap_pmksa_caching_support = wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_set_pmksa()
12382 if (!info->attrs[NL80211_ATTR_PMKID]) in nl80211_set_pmksa()
12383 return -EINVAL; in nl80211_set_pmksa()
12385 pmksa.pmkid = nla_data(info->attrs[NL80211_ATTR_PMKID]); in nl80211_set_pmksa()
12387 if (info->attrs[NL80211_ATTR_MAC]) { in nl80211_set_pmksa()
12388 pmksa.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_set_pmksa()
12389 } else if (info->attrs[NL80211_ATTR_SSID] && in nl80211_set_pmksa()
12390 info->attrs[NL80211_ATTR_FILS_CACHE_ID] && in nl80211_set_pmksa()
12391 info->attrs[NL80211_ATTR_PMK]) { in nl80211_set_pmksa()
12392 pmksa.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); in nl80211_set_pmksa()
12393 pmksa.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); in nl80211_set_pmksa()
12394 pmksa.cache_id = nla_data(info->attrs[NL80211_ATTR_FILS_CACHE_ID]); in nl80211_set_pmksa()
12396 return -EINVAL; in nl80211_set_pmksa()
12399 if (info->attrs[NL80211_ATTR_PMK]) { in nl80211_set_pmksa()
12400 pmksa.pmk = nla_data(info->attrs[NL80211_ATTR_PMK]); in nl80211_set_pmksa()
12401 pmksa.pmk_len = nla_len(info->attrs[NL80211_ATTR_PMK]); in nl80211_set_pmksa()
12404 if (info->attrs[NL80211_ATTR_PMK_LIFETIME]) in nl80211_set_pmksa()
12406 nla_get_u32(info->attrs[NL80211_ATTR_PMK_LIFETIME]); in nl80211_set_pmksa()
12408 if (info->attrs[NL80211_ATTR_PMK_REAUTH_THRESHOLD]) in nl80211_set_pmksa()
12410 nla_get_u8(info->attrs[NL80211_ATTR_PMK_REAUTH_THRESHOLD]); in nl80211_set_pmksa()
12412 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_set_pmksa()
12413 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT && in nl80211_set_pmksa()
12414 !((dev->ieee80211_ptr->iftype == NL80211_IFTYPE_AP || in nl80211_set_pmksa()
12415 dev->ieee80211_ptr->iftype == NL80211_IFTYPE_P2P_GO) && in nl80211_set_pmksa()
12417 return -EOPNOTSUPP; in nl80211_set_pmksa()
12419 if (!rdev->ops->set_pmksa) in nl80211_set_pmksa()
12420 return -EOPNOTSUPP; in nl80211_set_pmksa()
12427 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_del_pmksa()
12428 struct net_device *dev = info->user_ptr[1]; in nl80211_del_pmksa()
12436 sae_offload_support = wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_del_pmksa()
12438 owe_offload_support = wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_del_pmksa()
12440 ap_pmksa_caching_support = wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_del_pmksa()
12443 if (info->attrs[NL80211_ATTR_PMKID]) in nl80211_del_pmksa()
12444 pmksa.pmkid = nla_data(info->attrs[NL80211_ATTR_PMKID]); in nl80211_del_pmksa()
12446 if (info->attrs[NL80211_ATTR_MAC]) { in nl80211_del_pmksa()
12447 pmksa.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_del_pmksa()
12448 } else if (info->attrs[NL80211_ATTR_SSID]) { in nl80211_del_pmksa()
12452 if (info->attrs[NL80211_ATTR_FILS_CACHE_ID] && in nl80211_del_pmksa()
12453 info->attrs[NL80211_ATTR_PMK]) { in nl80211_del_pmksa()
12454 pmksa.cache_id = nla_data(info->attrs[NL80211_ATTR_FILS_CACHE_ID]); in nl80211_del_pmksa()
12456 return -EINVAL; in nl80211_del_pmksa()
12458 pmksa.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); in nl80211_del_pmksa()
12459 pmksa.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); in nl80211_del_pmksa()
12461 return -EINVAL; in nl80211_del_pmksa()
12464 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_del_pmksa()
12465 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT && in nl80211_del_pmksa()
12466 !((dev->ieee80211_ptr->iftype == NL80211_IFTYPE_AP || in nl80211_del_pmksa()
12467 dev->ieee80211_ptr->iftype == NL80211_IFTYPE_P2P_GO) && in nl80211_del_pmksa()
12469 return -EOPNOTSUPP; in nl80211_del_pmksa()
12471 if (!rdev->ops->del_pmksa) in nl80211_del_pmksa()
12472 return -EOPNOTSUPP; in nl80211_del_pmksa()
12479 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_flush_pmksa()
12480 struct net_device *dev = info->user_ptr[1]; in nl80211_flush_pmksa()
12482 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_flush_pmksa()
12483 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_flush_pmksa()
12484 return -EOPNOTSUPP; in nl80211_flush_pmksa()
12486 if (!rdev->ops->flush_pmksa) in nl80211_flush_pmksa()
12487 return -EOPNOTSUPP; in nl80211_flush_pmksa()
12494 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_tdls_mgmt()
12495 struct net_device *dev = info->user_ptr[1]; in nl80211_tdls_mgmt()
12503 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) || in nl80211_tdls_mgmt()
12504 !rdev->ops->tdls_mgmt) in nl80211_tdls_mgmt()
12505 return -EOPNOTSUPP; in nl80211_tdls_mgmt()
12507 if (!info->attrs[NL80211_ATTR_TDLS_ACTION] || in nl80211_tdls_mgmt()
12508 !info->attrs[NL80211_ATTR_STATUS_CODE] || in nl80211_tdls_mgmt()
12509 !info->attrs[NL80211_ATTR_TDLS_DIALOG_TOKEN] || in nl80211_tdls_mgmt()
12510 !info->attrs[NL80211_ATTR_IE] || in nl80211_tdls_mgmt()
12511 !info->attrs[NL80211_ATTR_MAC]) in nl80211_tdls_mgmt()
12512 return -EINVAL; in nl80211_tdls_mgmt()
12514 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_tdls_mgmt()
12515 action_code = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_ACTION]); in nl80211_tdls_mgmt()
12516 status_code = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]); in nl80211_tdls_mgmt()
12517 dialog_token = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_DIALOG_TOKEN]); in nl80211_tdls_mgmt()
12518 initiator = nla_get_flag(info->attrs[NL80211_ATTR_TDLS_INITIATOR]); in nl80211_tdls_mgmt()
12519 if (info->attrs[NL80211_ATTR_TDLS_PEER_CAPABILITY]) in nl80211_tdls_mgmt()
12521 nla_get_u32(info->attrs[NL80211_ATTR_TDLS_PEER_CAPABILITY]); in nl80211_tdls_mgmt()
12522 link_id = nl80211_link_id_or_invalid(info->attrs); in nl80211_tdls_mgmt()
12527 nla_data(info->attrs[NL80211_ATTR_IE]), in nl80211_tdls_mgmt()
12528 nla_len(info->attrs[NL80211_ATTR_IE])); in nl80211_tdls_mgmt()
12533 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_tdls_oper()
12534 struct net_device *dev = info->user_ptr[1]; in nl80211_tdls_oper()
12538 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) || in nl80211_tdls_oper()
12539 !rdev->ops->tdls_oper) in nl80211_tdls_oper()
12540 return -EOPNOTSUPP; in nl80211_tdls_oper()
12542 if (!info->attrs[NL80211_ATTR_TDLS_OPERATION] || in nl80211_tdls_oper()
12543 !info->attrs[NL80211_ATTR_MAC]) in nl80211_tdls_oper()
12544 return -EINVAL; in nl80211_tdls_oper()
12546 operation = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_OPERATION]); in nl80211_tdls_oper()
12547 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_tdls_oper()
12555 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_remain_on_channel()
12556 unsigned int link_id = nl80211_link_id(info->attrs); in nl80211_remain_on_channel()
12557 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_remain_on_channel()
12565 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ] || in nl80211_remain_on_channel()
12566 !info->attrs[NL80211_ATTR_DURATION]) in nl80211_remain_on_channel()
12567 return -EINVAL; in nl80211_remain_on_channel()
12569 duration = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]); in nl80211_remain_on_channel()
12571 if (!rdev->ops->remain_on_channel || in nl80211_remain_on_channel()
12572 !(rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL)) in nl80211_remain_on_channel()
12573 return -EOPNOTSUPP; in nl80211_remain_on_channel()
12580 duration > rdev->wiphy.max_remain_on_channel_duration) in nl80211_remain_on_channel()
12581 return -EINVAL; in nl80211_remain_on_channel()
12595 return -EBUSY; in nl80211_remain_on_channel()
12603 return -EBUSY; in nl80211_remain_on_channel()
12608 return -ENOMEM; in nl80211_remain_on_channel()
12610 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_remain_on_channel()
12613 err = -ENOBUFS; in nl80211_remain_on_channel()
12632 err = -ENOBUFS; in nl80211_remain_on_channel()
12641 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_cancel_remain_on_channel()
12642 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_cancel_remain_on_channel()
12645 if (!info->attrs[NL80211_ATTR_COOKIE]) in nl80211_cancel_remain_on_channel()
12646 return -EINVAL; in nl80211_cancel_remain_on_channel()
12648 if (!rdev->ops->cancel_remain_on_channel) in nl80211_cancel_remain_on_channel()
12649 return -EOPNOTSUPP; in nl80211_cancel_remain_on_channel()
12651 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); in nl80211_cancel_remain_on_channel()
12660 unsigned int link_id = nl80211_link_id(info->attrs); in nl80211_set_tx_bitrate_mask()
12661 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_tx_bitrate_mask()
12662 struct net_device *dev = info->user_ptr[1]; in nl80211_set_tx_bitrate_mask()
12665 if (!rdev->ops->set_bitrate_mask) in nl80211_set_tx_bitrate_mask()
12666 return -EOPNOTSUPP; in nl80211_set_tx_bitrate_mask()
12668 err = nl80211_parse_tx_bitrate_mask(info, info->attrs, in nl80211_set_tx_bitrate_mask()
12679 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_register_mgmt()
12680 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_register_mgmt()
12683 if (!info->attrs[NL80211_ATTR_FRAME_MATCH]) in nl80211_register_mgmt()
12684 return -EINVAL; in nl80211_register_mgmt()
12686 if (info->attrs[NL80211_ATTR_FRAME_TYPE]) in nl80211_register_mgmt()
12687 frame_type = nla_get_u16(info->attrs[NL80211_ATTR_FRAME_TYPE]); in nl80211_register_mgmt()
12689 switch (wdev->iftype) { in nl80211_register_mgmt()
12700 if (!wiphy_ext_feature_isset(wdev->wiphy, in nl80211_register_mgmt()
12702 return -EOPNOTSUPP; in nl80211_register_mgmt()
12705 return -EOPNOTSUPP; in nl80211_register_mgmt()
12709 if (!rdev->ops->mgmt_tx) in nl80211_register_mgmt()
12710 return -EOPNOTSUPP; in nl80211_register_mgmt()
12712 if (info->attrs[NL80211_ATTR_RECEIVE_MULTICAST] && in nl80211_register_mgmt()
12713 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_register_mgmt()
12717 return -EOPNOTSUPP; in nl80211_register_mgmt()
12720 return cfg80211_mlme_register_mgmt(wdev, info->snd_portid, frame_type, in nl80211_register_mgmt()
12721 nla_data(info->attrs[NL80211_ATTR_FRAME_MATCH]), in nl80211_register_mgmt()
12722 nla_len(info->attrs[NL80211_ATTR_FRAME_MATCH]), in nl80211_register_mgmt()
12723 info->attrs[NL80211_ATTR_RECEIVE_MULTICAST], in nl80211_register_mgmt()
12724 info->extack); in nl80211_register_mgmt()
12729 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_tx_mgmt()
12730 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_tx_mgmt()
12738 info->attrs[NL80211_ATTR_DONT_WAIT_FOR_ACK], in nl80211_tx_mgmt()
12741 if (!info->attrs[NL80211_ATTR_FRAME]) in nl80211_tx_mgmt()
12742 return -EINVAL; in nl80211_tx_mgmt()
12744 if (!rdev->ops->mgmt_tx) in nl80211_tx_mgmt()
12745 return -EOPNOTSUPP; in nl80211_tx_mgmt()
12747 switch (wdev->iftype) { in nl80211_tx_mgmt()
12749 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ]) in nl80211_tx_mgmt()
12750 return -EINVAL; in nl80211_tx_mgmt()
12761 if (!wiphy_ext_feature_isset(wdev->wiphy, in nl80211_tx_mgmt()
12763 return -EOPNOTSUPP; in nl80211_tx_mgmt()
12766 return -EOPNOTSUPP; in nl80211_tx_mgmt()
12769 if (info->attrs[NL80211_ATTR_DURATION]) { in nl80211_tx_mgmt()
12770 if (!(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX)) in nl80211_tx_mgmt()
12771 return -EINVAL; in nl80211_tx_mgmt()
12772 params.wait = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]); in nl80211_tx_mgmt()
12779 params.wait > rdev->wiphy.max_remain_on_channel_duration) in nl80211_tx_mgmt()
12780 return -EINVAL; in nl80211_tx_mgmt()
12783 params.offchan = info->attrs[NL80211_ATTR_OFFCHANNEL_TX_OK]; in nl80211_tx_mgmt()
12785 if (params.offchan && !(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX)) in nl80211_tx_mgmt()
12786 return -EINVAL; in nl80211_tx_mgmt()
12788 params.no_cck = nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]); in nl80211_tx_mgmt()
12794 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { in nl80211_tx_mgmt()
12801 return -EINVAL; in nl80211_tx_mgmt()
12805 return -EBUSY; in nl80211_tx_mgmt()
12807 params.link_id = nl80211_link_id_or_invalid(info->attrs); in nl80211_tx_mgmt()
12814 !(wdev->valid_links & BIT(params.link_id))) in nl80211_tx_mgmt()
12815 return -EINVAL; in nl80211_tx_mgmt()
12817 params.buf = nla_data(info->attrs[NL80211_ATTR_FRAME]); in nl80211_tx_mgmt()
12818 params.len = nla_len(info->attrs[NL80211_ATTR_FRAME]); in nl80211_tx_mgmt()
12820 err = nl80211_parse_counter_offsets(rdev, NULL, params.len, -1, in nl80211_tx_mgmt()
12821 info->attrs[NL80211_ATTR_CSA_C_OFFSETS_TX], in nl80211_tx_mgmt()
12830 return -ENOMEM; in nl80211_tx_mgmt()
12832 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_tx_mgmt()
12835 err = -ENOBUFS; in nl80211_tx_mgmt()
12857 err = -ENOBUFS; in nl80211_tx_mgmt()
12865 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_tx_mgmt_cancel_wait()
12866 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_tx_mgmt_cancel_wait()
12869 if (!info->attrs[NL80211_ATTR_COOKIE]) in nl80211_tx_mgmt_cancel_wait()
12870 return -EINVAL; in nl80211_tx_mgmt_cancel_wait()
12872 if (!rdev->ops->mgmt_tx_cancel_wait) in nl80211_tx_mgmt_cancel_wait()
12873 return -EOPNOTSUPP; in nl80211_tx_mgmt_cancel_wait()
12875 switch (wdev->iftype) { in nl80211_tx_mgmt_cancel_wait()
12885 if (!wiphy_ext_feature_isset(wdev->wiphy, in nl80211_tx_mgmt_cancel_wait()
12887 return -EOPNOTSUPP; in nl80211_tx_mgmt_cancel_wait()
12890 return -EOPNOTSUPP; in nl80211_tx_mgmt_cancel_wait()
12893 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); in nl80211_tx_mgmt_cancel_wait()
12900 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_power_save()
12902 struct net_device *dev = info->user_ptr[1]; in nl80211_set_power_save()
12907 if (!info->attrs[NL80211_ATTR_PS_STATE]) in nl80211_set_power_save()
12908 return -EINVAL; in nl80211_set_power_save()
12910 ps_state = nla_get_u32(info->attrs[NL80211_ATTR_PS_STATE]); in nl80211_set_power_save()
12912 wdev = dev->ieee80211_ptr; in nl80211_set_power_save()
12914 if (!rdev->ops->set_power_mgmt) in nl80211_set_power_save()
12915 return -EOPNOTSUPP; in nl80211_set_power_save()
12919 if (state == wdev->ps) in nl80211_set_power_save()
12922 err = rdev_set_power_mgmt(rdev, dev, state, wdev->ps_timeout); in nl80211_set_power_save()
12924 wdev->ps = state; in nl80211_set_power_save()
12930 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_power_save()
12933 struct net_device *dev = info->user_ptr[1]; in nl80211_get_power_save()
12938 wdev = dev->ieee80211_ptr; in nl80211_get_power_save()
12940 if (!rdev->ops->set_power_mgmt) in nl80211_get_power_save()
12941 return -EOPNOTSUPP; in nl80211_get_power_save()
12945 return -ENOMEM; in nl80211_get_power_save()
12947 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_power_save()
12950 err = -ENOBUFS; in nl80211_get_power_save()
12954 if (wdev->ps) in nl80211_get_power_save()
12966 err = -ENOBUFS; in nl80211_get_power_save()
12986 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_cqm_txe()
12987 struct net_device *dev = info->user_ptr[1]; in nl80211_set_cqm_txe()
12988 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_cqm_txe()
12991 return -EINVAL; in nl80211_set_cqm_txe()
12993 if (!rdev->ops->set_cqm_txe_config) in nl80211_set_cqm_txe()
12994 return -EOPNOTSUPP; in nl80211_set_cqm_txe()
12996 if (wdev->iftype != NL80211_IFTYPE_STATION && in nl80211_set_cqm_txe()
12997 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_set_cqm_txe()
12998 return -EOPNOTSUPP; in nl80211_set_cqm_txe()
13007 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_cqm_rssi_update()
13019 if (!cqm_config->last_rssi_event_value && in cfg80211_cqm_rssi_update()
13020 wdev->links[0].client.current_bss && in cfg80211_cqm_rssi_update()
13021 rdev->ops->get_station) { in cfg80211_cqm_rssi_update()
13025 mac_addr = wdev->links[0].client.current_bss->pub.bssid; in cfg80211_cqm_rssi_update()
13033 cqm_config->last_rssi_event_value = in cfg80211_cqm_rssi_update()
13037 last = cqm_config->last_rssi_event_value; in cfg80211_cqm_rssi_update()
13038 hyst = cqm_config->rssi_hyst; in cfg80211_cqm_rssi_update()
13039 n = cqm_config->n_rssi_thresholds; in cfg80211_cqm_rssi_update()
13043 if (last < cqm_config->rssi_thresholds[i]) in cfg80211_cqm_rssi_update()
13047 low_index = i - 1; in cfg80211_cqm_rssi_update()
13050 low = cqm_config->rssi_thresholds[low_index] - hyst; in cfg80211_cqm_rssi_update()
13056 high = cqm_config->rssi_thresholds[i] + hyst - 1; in cfg80211_cqm_rssi_update()
13068 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_cqm_rssi()
13070 struct net_device *dev = info->user_ptr[1]; in nl80211_set_cqm_rssi()
13071 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_cqm_rssi()
13078 return -EINVAL; in nl80211_set_cqm_rssi()
13083 if (wdev->iftype != NL80211_IFTYPE_STATION && in nl80211_set_cqm_rssi()
13084 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_set_cqm_rssi()
13085 return -EOPNOTSUPP; in nl80211_set_cqm_rssi()
13090 old = wiphy_dereference(wdev->wiphy, wdev->cqm_config); in nl80211_set_cqm_rssi()
13097 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_set_cqm_rssi()
13099 !rdev->ops->set_cqm_rssi_range_config) in nl80211_set_cqm_rssi()
13100 return -EOPNOTSUPP; in nl80211_set_cqm_rssi()
13102 if (!rdev->ops->set_cqm_rssi_config) in nl80211_set_cqm_rssi()
13103 return -EOPNOTSUPP; in nl80211_set_cqm_rssi()
13111 return -ENOMEM; in nl80211_set_cqm_rssi()
13113 cqm_config->rssi_hyst = hysteresis; in nl80211_set_cqm_rssi()
13114 cqm_config->n_rssi_thresholds = n_thresholds; in nl80211_set_cqm_rssi()
13115 memcpy(cqm_config->rssi_thresholds, thresholds, in nl80211_set_cqm_rssi()
13118 cqm_config->use_range_api = n_thresholds > 1 || in nl80211_set_cqm_rssi()
13119 !rdev->ops->set_cqm_rssi_config; in nl80211_set_cqm_rssi()
13121 rcu_assign_pointer(wdev->cqm_config, cqm_config); in nl80211_set_cqm_rssi()
13123 if (cqm_config->use_range_api) in nl80211_set_cqm_rssi()
13130 RCU_INIT_POINTER(wdev->cqm_config, NULL); in nl80211_set_cqm_rssi()
13132 if (old->use_range_api) in nl80211_set_cqm_rssi()
13139 rcu_assign_pointer(wdev->cqm_config, old); in nl80211_set_cqm_rssi()
13154 cqm = info->attrs[NL80211_ATTR_CQM]; in nl80211_set_cqm()
13156 return -EINVAL; in nl80211_set_cqm()
13160 info->extack); in nl80211_set_cqm()
13172 return -EINVAL; in nl80211_set_cqm()
13188 return -EINVAL; in nl80211_set_cqm()
13193 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_join_ocb()
13194 struct net_device *dev = info->user_ptr[1]; in nl80211_join_ocb()
13207 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_leave_ocb()
13208 struct net_device *dev = info->user_ptr[1]; in nl80211_leave_ocb()
13215 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_join_mesh()
13216 struct net_device *dev = info->user_ptr[1]; in nl80211_join_mesh()
13225 if (info->attrs[NL80211_ATTR_MESH_CONFIG]) { in nl80211_join_mesh()
13232 if (!info->attrs[NL80211_ATTR_MESH_ID] || in nl80211_join_mesh()
13233 !nla_len(info->attrs[NL80211_ATTR_MESH_ID])) in nl80211_join_mesh()
13234 return -EINVAL; in nl80211_join_mesh()
13236 setup.mesh_id = nla_data(info->attrs[NL80211_ATTR_MESH_ID]); in nl80211_join_mesh()
13237 setup.mesh_id_len = nla_len(info->attrs[NL80211_ATTR_MESH_ID]); in nl80211_join_mesh()
13239 if (info->attrs[NL80211_ATTR_MCAST_RATE] && in nl80211_join_mesh()
13241 nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]))) in nl80211_join_mesh()
13242 return -EINVAL; in nl80211_join_mesh()
13244 if (info->attrs[NL80211_ATTR_BEACON_INTERVAL]) { in nl80211_join_mesh()
13246 nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]); in nl80211_join_mesh()
13255 if (info->attrs[NL80211_ATTR_DTIM_PERIOD]) { in nl80211_join_mesh()
13257 nla_get_u32(info->attrs[NL80211_ATTR_DTIM_PERIOD]); in nl80211_join_mesh()
13259 return -EINVAL; in nl80211_join_mesh()
13262 if (info->attrs[NL80211_ATTR_MESH_SETUP]) { in nl80211_join_mesh()
13272 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { in nl80211_join_mesh()
13281 if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) { in nl80211_join_mesh()
13282 u8 *rates = nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); in nl80211_join_mesh()
13284 nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); in nl80211_join_mesh()
13288 return -EINVAL; in nl80211_join_mesh()
13290 sband = rdev->wiphy.bands[setup.chandef.chan->band]; in nl80211_join_mesh()
13298 if (info->attrs[NL80211_ATTR_TX_RATES]) { in nl80211_join_mesh()
13299 err = nl80211_parse_tx_bitrate_mask(info, info->attrs, in nl80211_join_mesh()
13307 return -EINVAL; in nl80211_join_mesh()
13309 err = validate_beacon_tx_rate(rdev, setup.chandef.chan->band, in nl80211_join_mesh()
13316 nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS]); in nl80211_join_mesh()
13318 if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) { in nl80211_join_mesh()
13328 if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) in nl80211_join_mesh()
13329 dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid; in nl80211_join_mesh()
13336 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_leave_mesh()
13337 struct net_device *dev = info->user_ptr[1]; in nl80211_leave_mesh()
13346 struct cfg80211_wowlan *wowlan = rdev->wiphy.wowlan_config; in nl80211_send_wowlan_patterns()
13350 if (!wowlan->n_patterns) in nl80211_send_wowlan_patterns()
13355 return -ENOBUFS; in nl80211_send_wowlan_patterns()
13357 for (i = 0; i < wowlan->n_patterns; i++) { in nl80211_send_wowlan_patterns()
13360 return -ENOBUFS; in nl80211_send_wowlan_patterns()
13361 pat_len = wowlan->patterns[i].pattern_len; in nl80211_send_wowlan_patterns()
13363 wowlan->patterns[i].mask) || in nl80211_send_wowlan_patterns()
13365 wowlan->patterns[i].pattern) || in nl80211_send_wowlan_patterns()
13367 wowlan->patterns[i].pkt_offset)) in nl80211_send_wowlan_patterns()
13368 return -ENOBUFS; in nl80211_send_wowlan_patterns()
13387 return -ENOBUFS; in nl80211_send_wowlan_tcp()
13389 if (nla_put_in_addr(msg, NL80211_WOWLAN_TCP_SRC_IPV4, tcp->src) || in nl80211_send_wowlan_tcp()
13390 nla_put_in_addr(msg, NL80211_WOWLAN_TCP_DST_IPV4, tcp->dst) || in nl80211_send_wowlan_tcp()
13391 nla_put(msg, NL80211_WOWLAN_TCP_DST_MAC, ETH_ALEN, tcp->dst_mac) || in nl80211_send_wowlan_tcp()
13392 nla_put_u16(msg, NL80211_WOWLAN_TCP_SRC_PORT, tcp->src_port) || in nl80211_send_wowlan_tcp()
13393 nla_put_u16(msg, NL80211_WOWLAN_TCP_DST_PORT, tcp->dst_port) || in nl80211_send_wowlan_tcp()
13395 tcp->payload_len, tcp->payload) || in nl80211_send_wowlan_tcp()
13397 tcp->data_interval) || in nl80211_send_wowlan_tcp()
13399 tcp->wake_len, tcp->wake_data) || in nl80211_send_wowlan_tcp()
13401 DIV_ROUND_UP(tcp->wake_len, 8), tcp->wake_mask)) in nl80211_send_wowlan_tcp()
13402 return -ENOBUFS; in nl80211_send_wowlan_tcp()
13404 if (tcp->payload_seq.len && in nl80211_send_wowlan_tcp()
13406 sizeof(tcp->payload_seq), &tcp->payload_seq)) in nl80211_send_wowlan_tcp()
13407 return -ENOBUFS; in nl80211_send_wowlan_tcp()
13409 if (tcp->payload_tok.len && in nl80211_send_wowlan_tcp()
13411 sizeof(tcp->payload_tok) + tcp->tokens_size, in nl80211_send_wowlan_tcp()
13412 &tcp->payload_tok)) in nl80211_send_wowlan_tcp()
13413 return -ENOBUFS; in nl80211_send_wowlan_tcp()
13431 return -ENOBUFS; in nl80211_send_wowlan_nd()
13433 if (req->n_scan_plans == 1 && in nl80211_send_wowlan_nd()
13435 req->scan_plans[0].interval * 1000)) in nl80211_send_wowlan_nd()
13436 return -ENOBUFS; in nl80211_send_wowlan_nd()
13438 if (nla_put_u32(msg, NL80211_ATTR_SCHED_SCAN_DELAY, req->delay)) in nl80211_send_wowlan_nd()
13439 return -ENOBUFS; in nl80211_send_wowlan_nd()
13441 if (req->relative_rssi_set) { in nl80211_send_wowlan_nd()
13445 req->relative_rssi)) in nl80211_send_wowlan_nd()
13446 return -ENOBUFS; in nl80211_send_wowlan_nd()
13448 rssi_adjust.band = req->rssi_adjust.band; in nl80211_send_wowlan_nd()
13449 rssi_adjust.delta = req->rssi_adjust.delta; in nl80211_send_wowlan_nd()
13452 return -ENOBUFS; in nl80211_send_wowlan_nd()
13457 return -ENOBUFS; in nl80211_send_wowlan_nd()
13459 for (i = 0; i < req->n_channels; i++) { in nl80211_send_wowlan_nd()
13460 if (nla_put_u32(msg, i, req->channels[i]->center_freq)) in nl80211_send_wowlan_nd()
13461 return -ENOBUFS; in nl80211_send_wowlan_nd()
13466 if (req->n_match_sets) { in nl80211_send_wowlan_nd()
13470 return -ENOBUFS; in nl80211_send_wowlan_nd()
13472 for (i = 0; i < req->n_match_sets; i++) { in nl80211_send_wowlan_nd()
13475 return -ENOBUFS; in nl80211_send_wowlan_nd()
13478 req->match_sets[i].ssid.ssid_len, in nl80211_send_wowlan_nd()
13479 req->match_sets[i].ssid.ssid)) in nl80211_send_wowlan_nd()
13480 return -ENOBUFS; in nl80211_send_wowlan_nd()
13488 return -ENOBUFS; in nl80211_send_wowlan_nd()
13490 for (i = 0; i < req->n_scan_plans; i++) { in nl80211_send_wowlan_nd()
13493 return -ENOBUFS; in nl80211_send_wowlan_nd()
13496 req->scan_plans[i].interval) || in nl80211_send_wowlan_nd()
13497 (req->scan_plans[i].iterations && in nl80211_send_wowlan_nd()
13499 req->scan_plans[i].iterations))) in nl80211_send_wowlan_nd()
13500 return -ENOBUFS; in nl80211_send_wowlan_nd()
13512 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_wowlan()
13517 if (!rdev->wiphy.wowlan) in nl80211_get_wowlan()
13518 return -EOPNOTSUPP; in nl80211_get_wowlan()
13520 if (rdev->wiphy.wowlan_config && rdev->wiphy.wowlan_config->tcp) { in nl80211_get_wowlan()
13522 size += rdev->wiphy.wowlan_config->tcp->tokens_size + in nl80211_get_wowlan()
13523 rdev->wiphy.wowlan_config->tcp->payload_len + in nl80211_get_wowlan()
13524 rdev->wiphy.wowlan_config->tcp->wake_len + in nl80211_get_wowlan()
13525 rdev->wiphy.wowlan_config->tcp->wake_len / 8; in nl80211_get_wowlan()
13530 return -ENOMEM; in nl80211_get_wowlan()
13532 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_wowlan()
13537 if (rdev->wiphy.wowlan_config) { in nl80211_get_wowlan()
13545 if ((rdev->wiphy.wowlan_config->any && in nl80211_get_wowlan()
13547 (rdev->wiphy.wowlan_config->disconnect && in nl80211_get_wowlan()
13549 (rdev->wiphy.wowlan_config->magic_pkt && in nl80211_get_wowlan()
13551 (rdev->wiphy.wowlan_config->gtk_rekey_failure && in nl80211_get_wowlan()
13553 (rdev->wiphy.wowlan_config->eap_identity_req && in nl80211_get_wowlan()
13555 (rdev->wiphy.wowlan_config->four_way_handshake && in nl80211_get_wowlan()
13557 (rdev->wiphy.wowlan_config->rfkill_release && in nl80211_get_wowlan()
13565 rdev->wiphy.wowlan_config->tcp)) in nl80211_get_wowlan()
13570 rdev->wiphy.wowlan_config->nd_config)) in nl80211_get_wowlan()
13581 return -ENOBUFS; in nl80211_get_wowlan()
13596 if (!rdev->wiphy.wowlan->tcp) in nl80211_parse_wowlan_tcp()
13597 return -EINVAL; in nl80211_parse_wowlan_tcp()
13612 return -EINVAL; in nl80211_parse_wowlan_tcp()
13615 if (data_size > rdev->wiphy.wowlan->tcp->data_payload_max) in nl80211_parse_wowlan_tcp()
13616 return -EINVAL; in nl80211_parse_wowlan_tcp()
13619 rdev->wiphy.wowlan->tcp->data_interval_max || in nl80211_parse_wowlan_tcp()
13621 return -EINVAL; in nl80211_parse_wowlan_tcp()
13624 if (wake_size > rdev->wiphy.wowlan->tcp->wake_payload_max) in nl80211_parse_wowlan_tcp()
13625 return -EINVAL; in nl80211_parse_wowlan_tcp()
13629 return -EINVAL; in nl80211_parse_wowlan_tcp()
13635 tokens_size = tokln - sizeof(*tok); in nl80211_parse_wowlan_tcp()
13637 if (!tok->len || tokens_size % tok->len) in nl80211_parse_wowlan_tcp()
13638 return -EINVAL; in nl80211_parse_wowlan_tcp()
13639 if (!rdev->wiphy.wowlan->tcp->tok) in nl80211_parse_wowlan_tcp()
13640 return -EINVAL; in nl80211_parse_wowlan_tcp()
13641 if (tok->len > rdev->wiphy.wowlan->tcp->tok->max_len) in nl80211_parse_wowlan_tcp()
13642 return -EINVAL; in nl80211_parse_wowlan_tcp()
13643 if (tok->len < rdev->wiphy.wowlan->tcp->tok->min_len) in nl80211_parse_wowlan_tcp()
13644 return -EINVAL; in nl80211_parse_wowlan_tcp()
13645 if (tokens_size > rdev->wiphy.wowlan->tcp->tok->bufsize) in nl80211_parse_wowlan_tcp()
13646 return -EINVAL; in nl80211_parse_wowlan_tcp()
13647 if (tok->offset + tok->len > data_size) in nl80211_parse_wowlan_tcp()
13648 return -EINVAL; in nl80211_parse_wowlan_tcp()
13653 if (!rdev->wiphy.wowlan->tcp->seq) in nl80211_parse_wowlan_tcp()
13654 return -EINVAL; in nl80211_parse_wowlan_tcp()
13655 if (seq->len == 0 || seq->len > 4) in nl80211_parse_wowlan_tcp()
13656 return -EINVAL; in nl80211_parse_wowlan_tcp()
13657 if (seq->len + seq->offset > data_size) in nl80211_parse_wowlan_tcp()
13658 return -EINVAL; in nl80211_parse_wowlan_tcp()
13668 return -ENOMEM; in nl80211_parse_wowlan_tcp()
13669 cfg->src = nla_get_in_addr(tb[NL80211_WOWLAN_TCP_SRC_IPV4]); in nl80211_parse_wowlan_tcp()
13670 cfg->dst = nla_get_in_addr(tb[NL80211_WOWLAN_TCP_DST_IPV4]); in nl80211_parse_wowlan_tcp()
13671 memcpy(cfg->dst_mac, nla_data(tb[NL80211_WOWLAN_TCP_DST_MAC]), in nl80211_parse_wowlan_tcp()
13679 err = __sock_create(wiphy_net(&rdev->wiphy), PF_INET, SOCK_STREAM, in nl80211_parse_wowlan_tcp()
13680 IPPROTO_TCP, &cfg->sock, 1); in nl80211_parse_wowlan_tcp()
13685 if (inet_csk_get_port(cfg->sock->sk, port)) { in nl80211_parse_wowlan_tcp()
13686 sock_release(cfg->sock); in nl80211_parse_wowlan_tcp()
13688 return -EADDRINUSE; in nl80211_parse_wowlan_tcp()
13690 cfg->src_port = inet_sk(cfg->sock->sk)->inet_num; in nl80211_parse_wowlan_tcp()
13694 return -EINVAL; in nl80211_parse_wowlan_tcp()
13696 cfg->src_port = port; in nl80211_parse_wowlan_tcp()
13699 cfg->dst_port = nla_get_u16(tb[NL80211_WOWLAN_TCP_DST_PORT]); in nl80211_parse_wowlan_tcp()
13700 cfg->payload_len = data_size; in nl80211_parse_wowlan_tcp()
13701 cfg->payload = (u8 *)cfg + sizeof(*cfg) + tokens_size; in nl80211_parse_wowlan_tcp()
13702 memcpy((void *)cfg->payload, in nl80211_parse_wowlan_tcp()
13706 cfg->payload_seq = *seq; in nl80211_parse_wowlan_tcp()
13707 cfg->data_interval = nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]); in nl80211_parse_wowlan_tcp()
13708 cfg->wake_len = wake_size; in nl80211_parse_wowlan_tcp()
13709 cfg->wake_data = (u8 *)cfg + sizeof(*cfg) + tokens_size + data_size; in nl80211_parse_wowlan_tcp()
13710 memcpy((void *)cfg->wake_data, in nl80211_parse_wowlan_tcp()
13713 cfg->wake_mask = (u8 *)cfg + sizeof(*cfg) + tokens_size + in nl80211_parse_wowlan_tcp()
13715 memcpy((void *)cfg->wake_mask, in nl80211_parse_wowlan_tcp()
13719 cfg->tokens_size = tokens_size; in nl80211_parse_wowlan_tcp()
13720 cfg->payload_tok = *tok; in nl80211_parse_wowlan_tcp()
13721 memcpy(cfg->payload_tok.token_stream, tok->token_stream, in nl80211_parse_wowlan_tcp()
13725 trig->tcp = cfg; in nl80211_parse_wowlan_tcp()
13740 return -ENOMEM; in nl80211_parse_wowlan_nd()
13742 if (!(wowlan->flags & WIPHY_WOWLAN_NET_DETECT)) { in nl80211_parse_wowlan_nd()
13743 err = -EOPNOTSUPP; in nl80211_parse_wowlan_nd()
13752 trig->nd_config = nl80211_parse_sched_scan(&rdev->wiphy, NULL, tb, in nl80211_parse_wowlan_nd()
13753 wowlan->max_nd_match_sets); in nl80211_parse_wowlan_nd()
13754 err = PTR_ERR_OR_ZERO(trig->nd_config); in nl80211_parse_wowlan_nd()
13756 trig->nd_config = NULL; in nl80211_parse_wowlan_nd()
13765 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_wowlan()
13769 const struct wiphy_wowlan_support *wowlan = rdev->wiphy.wowlan; in nl80211_set_wowlan()
13771 bool prev_enabled = rdev->wiphy.wowlan_config; in nl80211_set_wowlan()
13775 return -EOPNOTSUPP; in nl80211_set_wowlan()
13777 if (!info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS]) { in nl80211_set_wowlan()
13779 rdev->wiphy.wowlan_config = NULL; in nl80211_set_wowlan()
13784 info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS], in nl80211_set_wowlan()
13785 nl80211_wowlan_policy, info->extack); in nl80211_set_wowlan()
13790 if (!(wowlan->flags & WIPHY_WOWLAN_ANY)) in nl80211_set_wowlan()
13791 return -EINVAL; in nl80211_set_wowlan()
13796 if (!(wowlan->flags & WIPHY_WOWLAN_DISCONNECT)) in nl80211_set_wowlan()
13797 return -EINVAL; in nl80211_set_wowlan()
13803 if (!(wowlan->flags & WIPHY_WOWLAN_MAGIC_PKT)) in nl80211_set_wowlan()
13804 return -EINVAL; in nl80211_set_wowlan()
13810 return -EINVAL; in nl80211_set_wowlan()
13813 if (!(wowlan->flags & WIPHY_WOWLAN_GTK_REKEY_FAILURE)) in nl80211_set_wowlan()
13814 return -EINVAL; in nl80211_set_wowlan()
13820 if (!(wowlan->flags & WIPHY_WOWLAN_EAP_IDENTITY_REQ)) in nl80211_set_wowlan()
13821 return -EINVAL; in nl80211_set_wowlan()
13827 if (!(wowlan->flags & WIPHY_WOWLAN_4WAY_HANDSHAKE)) in nl80211_set_wowlan()
13828 return -EINVAL; in nl80211_set_wowlan()
13834 if (!(wowlan->flags & WIPHY_WOWLAN_RFKILL_RELEASE)) in nl80211_set_wowlan()
13835 return -EINVAL; in nl80211_set_wowlan()
13851 if (n_patterns > wowlan->n_patterns) in nl80211_set_wowlan()
13852 return -EINVAL; in nl80211_set_wowlan()
13858 return -ENOMEM; in nl80211_set_wowlan()
13871 info->extack); in nl80211_set_wowlan()
13875 err = -EINVAL; in nl80211_set_wowlan()
13883 if (pat_len > wowlan->pattern_max_len || in nl80211_set_wowlan()
13884 pat_len < wowlan->pattern_min_len) in nl80211_set_wowlan()
13892 if (pkt_offset > wowlan->max_pkt_offset) in nl80211_set_wowlan()
13898 err = -ENOMEM; in nl80211_set_wowlan()
13939 err = -EINVAL; in nl80211_set_wowlan()
13945 err = -ENOMEM; in nl80211_set_wowlan()
13949 rdev->wiphy.wowlan_config = ntrig; in nl80211_set_wowlan()
13952 if (rdev->ops->set_wakeup && in nl80211_set_wowlan()
13953 prev_enabled != !!rdev->wiphy.wowlan_config) in nl80211_set_wowlan()
13954 rdev_set_wakeup(rdev, rdev->wiphy.wowlan_config); in nl80211_set_wowlan()
13961 if (new_triggers.tcp && new_triggers.tcp->sock) in nl80211_set_wowlan()
13962 sock_release(new_triggers.tcp->sock); in nl80211_set_wowlan()
13976 if (!rdev->coalesce->n_rules) in nl80211_send_coalesce_rules()
13981 return -ENOBUFS; in nl80211_send_coalesce_rules()
13983 for (i = 0; i < rdev->coalesce->n_rules; i++) { in nl80211_send_coalesce_rules()
13986 return -ENOBUFS; in nl80211_send_coalesce_rules()
13988 rule = &rdev->coalesce->rules[i]; in nl80211_send_coalesce_rules()
13990 rule->delay)) in nl80211_send_coalesce_rules()
13991 return -ENOBUFS; in nl80211_send_coalesce_rules()
13994 rule->condition)) in nl80211_send_coalesce_rules()
13995 return -ENOBUFS; in nl80211_send_coalesce_rules()
14000 return -ENOBUFS; in nl80211_send_coalesce_rules()
14002 for (j = 0; j < rule->n_patterns; j++) { in nl80211_send_coalesce_rules()
14005 return -ENOBUFS; in nl80211_send_coalesce_rules()
14006 pat_len = rule->patterns[j].pattern_len; in nl80211_send_coalesce_rules()
14009 rule->patterns[j].mask) || in nl80211_send_coalesce_rules()
14011 rule->patterns[j].pattern) || in nl80211_send_coalesce_rules()
14013 rule->patterns[j].pkt_offset)) in nl80211_send_coalesce_rules()
14014 return -ENOBUFS; in nl80211_send_coalesce_rules()
14027 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_coalesce()
14031 if (!rdev->wiphy.coalesce) in nl80211_get_coalesce()
14032 return -EOPNOTSUPP; in nl80211_get_coalesce()
14036 return -ENOMEM; in nl80211_get_coalesce()
14038 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_coalesce()
14043 if (rdev->coalesce && nl80211_send_coalesce_rules(msg, rdev)) in nl80211_get_coalesce()
14051 return -ENOBUFS; in nl80211_get_coalesce()
14062 for (i = 0; i < coalesce->n_rules; i++) { in cfg80211_free_coalesce()
14063 rule = &coalesce->rules[i]; in cfg80211_free_coalesce()
14066 for (j = 0; j < rule->n_patterns; j++) in cfg80211_free_coalesce()
14067 kfree(rule->patterns[j].mask); in cfg80211_free_coalesce()
14068 kfree(rule->patterns); in cfg80211_free_coalesce()
14078 const struct wiphy_coalesce_support *coalesce = rdev->wiphy.coalesce; in nl80211_parse_coalesce_rule()
14089 new_rule->delay = in nl80211_parse_coalesce_rule()
14091 if (new_rule->delay > coalesce->max_delay) in nl80211_parse_coalesce_rule()
14092 return -EINVAL; in nl80211_parse_coalesce_rule()
14095 new_rule->condition = in nl80211_parse_coalesce_rule()
14099 return -EINVAL; in nl80211_parse_coalesce_rule()
14104 if (n_patterns > coalesce->n_patterns) in nl80211_parse_coalesce_rule()
14105 return -EINVAL; in nl80211_parse_coalesce_rule()
14107 new_rule->patterns = kcalloc(n_patterns, sizeof(new_rule->patterns[0]), in nl80211_parse_coalesce_rule()
14109 if (!new_rule->patterns) in nl80211_parse_coalesce_rule()
14110 return -ENOMEM; in nl80211_parse_coalesce_rule()
14112 new_rule->n_patterns = n_patterns; in nl80211_parse_coalesce_rule()
14128 return -EINVAL; in nl80211_parse_coalesce_rule()
14132 return -EINVAL; in nl80211_parse_coalesce_rule()
14133 if (pat_len > coalesce->pattern_max_len || in nl80211_parse_coalesce_rule()
14134 pat_len < coalesce->pattern_min_len) in nl80211_parse_coalesce_rule()
14135 return -EINVAL; in nl80211_parse_coalesce_rule()
14141 if (pkt_offset > coalesce->max_pkt_offset) in nl80211_parse_coalesce_rule()
14142 return -EINVAL; in nl80211_parse_coalesce_rule()
14143 new_rule->patterns[i].pkt_offset = pkt_offset; in nl80211_parse_coalesce_rule()
14147 return -ENOMEM; in nl80211_parse_coalesce_rule()
14149 new_rule->patterns[i].mask = mask_pat; in nl80211_parse_coalesce_rule()
14154 new_rule->patterns[i].pattern = mask_pat; in nl80211_parse_coalesce_rule()
14155 new_rule->patterns[i].pattern_len = pat_len; in nl80211_parse_coalesce_rule()
14166 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_coalesce()
14167 const struct wiphy_coalesce_support *coalesce = rdev->wiphy.coalesce; in nl80211_set_coalesce()
14172 if (!rdev->wiphy.coalesce || !rdev->ops->set_coalesce) in nl80211_set_coalesce()
14173 return -EOPNOTSUPP; in nl80211_set_coalesce()
14175 if (!info->attrs[NL80211_ATTR_COALESCE_RULE]) { in nl80211_set_coalesce()
14176 cfg80211_free_coalesce(rdev->coalesce); in nl80211_set_coalesce()
14177 rdev->coalesce = NULL; in nl80211_set_coalesce()
14182 nla_for_each_nested(rule, info->attrs[NL80211_ATTR_COALESCE_RULE], in nl80211_set_coalesce()
14185 if (n_rules > coalesce->n_rules) in nl80211_set_coalesce()
14186 return -EINVAL; in nl80211_set_coalesce()
14191 return -ENOMEM; in nl80211_set_coalesce()
14193 new_coalesce->n_rules = n_rules; in nl80211_set_coalesce()
14196 nla_for_each_nested(rule, info->attrs[NL80211_ATTR_COALESCE_RULE], in nl80211_set_coalesce()
14199 &new_coalesce->rules[i]); in nl80211_set_coalesce()
14210 cfg80211_free_coalesce(rdev->coalesce); in nl80211_set_coalesce()
14211 rdev->coalesce = new_coalesce; in nl80211_set_coalesce()
14222 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_rekey_data()
14223 struct net_device *dev = info->user_ptr[1]; in nl80211_set_rekey_data()
14224 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_rekey_data()
14229 if (!info->attrs[NL80211_ATTR_REKEY_DATA]) in nl80211_set_rekey_data()
14230 return -EINVAL; in nl80211_set_rekey_data()
14233 info->attrs[NL80211_ATTR_REKEY_DATA], in nl80211_set_rekey_data()
14234 nl80211_rekey_policy, info->extack); in nl80211_set_rekey_data()
14240 return -EINVAL; in nl80211_set_rekey_data()
14242 !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_EXT_KEK_KCK && in nl80211_set_rekey_data()
14244 return -ERANGE; in nl80211_set_rekey_data()
14246 !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_EXT_KEK_KCK && in nl80211_set_rekey_data()
14248 !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_EXT_KCK_32 && in nl80211_set_rekey_data()
14250 return -ERANGE; in nl80211_set_rekey_data()
14260 if (!wdev->connected) in nl80211_set_rekey_data()
14261 return -ENOTCONN; in nl80211_set_rekey_data()
14263 if (!rdev->ops->set_rekey_data) in nl80211_set_rekey_data()
14264 return -EOPNOTSUPP; in nl80211_set_rekey_data()
14272 struct net_device *dev = info->user_ptr[1]; in nl80211_register_unexpected_frame()
14273 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_register_unexpected_frame()
14275 if (wdev->iftype != NL80211_IFTYPE_AP && in nl80211_register_unexpected_frame()
14276 wdev->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_register_unexpected_frame()
14277 return -EINVAL; in nl80211_register_unexpected_frame()
14279 if (wdev->ap_unexpected_nlportid) in nl80211_register_unexpected_frame()
14280 return -EBUSY; in nl80211_register_unexpected_frame()
14282 wdev->ap_unexpected_nlportid = info->snd_portid; in nl80211_register_unexpected_frame()
14289 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_probe_client()
14290 struct net_device *dev = info->user_ptr[1]; in nl80211_probe_client()
14291 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_probe_client()
14298 if (wdev->iftype != NL80211_IFTYPE_AP && in nl80211_probe_client()
14299 wdev->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_probe_client()
14300 return -EOPNOTSUPP; in nl80211_probe_client()
14302 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_probe_client()
14303 return -EINVAL; in nl80211_probe_client()
14305 if (!rdev->ops->probe_client) in nl80211_probe_client()
14306 return -EOPNOTSUPP; in nl80211_probe_client()
14310 return -ENOMEM; in nl80211_probe_client()
14312 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_probe_client()
14315 err = -ENOBUFS; in nl80211_probe_client()
14319 addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_probe_client()
14334 err = -ENOBUFS; in nl80211_probe_client()
14342 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_register_beacons()
14346 if (!(rdev->wiphy.flags & WIPHY_FLAG_REPORTS_OBSS)) in nl80211_register_beacons()
14347 return -EOPNOTSUPP; in nl80211_register_beacons()
14351 return -ENOMEM; in nl80211_register_beacons()
14354 spin_lock_bh(&rdev->beacon_registrations_lock); in nl80211_register_beacons()
14355 list_for_each_entry(reg, &rdev->beacon_registrations, list) { in nl80211_register_beacons()
14356 if (reg->nlportid == info->snd_portid) { in nl80211_register_beacons()
14357 rv = -EALREADY; in nl80211_register_beacons()
14362 nreg->nlportid = info->snd_portid; in nl80211_register_beacons()
14363 list_add(&nreg->list, &rdev->beacon_registrations); in nl80211_register_beacons()
14365 spin_unlock_bh(&rdev->beacon_registrations_lock); in nl80211_register_beacons()
14369 spin_unlock_bh(&rdev->beacon_registrations_lock); in nl80211_register_beacons()
14376 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_start_p2p_device()
14377 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_start_p2p_device()
14380 if (!rdev->ops->start_p2p_device) in nl80211_start_p2p_device()
14381 return -EOPNOTSUPP; in nl80211_start_p2p_device()
14383 if (wdev->iftype != NL80211_IFTYPE_P2P_DEVICE) in nl80211_start_p2p_device()
14384 return -EOPNOTSUPP; in nl80211_start_p2p_device()
14389 if (rfkill_blocked(rdev->wiphy.rfkill)) in nl80211_start_p2p_device()
14390 return -ERFKILL; in nl80211_start_p2p_device()
14396 wdev->is_running = true; in nl80211_start_p2p_device()
14397 rdev->opencount++; in nl80211_start_p2p_device()
14404 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_stop_p2p_device()
14405 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_stop_p2p_device()
14407 if (wdev->iftype != NL80211_IFTYPE_P2P_DEVICE) in nl80211_stop_p2p_device()
14408 return -EOPNOTSUPP; in nl80211_stop_p2p_device()
14410 if (!rdev->ops->stop_p2p_device) in nl80211_stop_p2p_device()
14411 return -EOPNOTSUPP; in nl80211_stop_p2p_device()
14420 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_start_nan()
14421 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_start_nan()
14425 if (wdev->iftype != NL80211_IFTYPE_NAN) in nl80211_start_nan()
14426 return -EOPNOTSUPP; in nl80211_start_nan()
14429 return -EEXIST; in nl80211_start_nan()
14431 if (rfkill_blocked(rdev->wiphy.rfkill)) in nl80211_start_nan()
14432 return -ERFKILL; in nl80211_start_nan()
14434 if (!info->attrs[NL80211_ATTR_NAN_MASTER_PREF]) in nl80211_start_nan()
14435 return -EINVAL; in nl80211_start_nan()
14438 nla_get_u8(info->attrs[NL80211_ATTR_NAN_MASTER_PREF]); in nl80211_start_nan()
14440 if (info->attrs[NL80211_ATTR_BANDS]) { in nl80211_start_nan()
14441 u32 bands = nla_get_u32(info->attrs[NL80211_ATTR_BANDS]); in nl80211_start_nan()
14443 if (bands & ~(u32)wdev->wiphy->nan_supported_bands) in nl80211_start_nan()
14444 return -EOPNOTSUPP; in nl80211_start_nan()
14447 return -EINVAL; in nl80211_start_nan()
14456 wdev->is_running = true; in nl80211_start_nan()
14457 rdev->opencount++; in nl80211_start_nan()
14464 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_stop_nan()
14465 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_stop_nan()
14467 if (wdev->iftype != NL80211_IFTYPE_NAN) in nl80211_stop_nan()
14468 return -EOPNOTSUPP; in nl80211_stop_nan()
14486 return -EINVAL; in validate_nan_filter()
14493 bool tx) in handle_nan_filter() argument
14503 BUILD_BUG_ON(sizeof(*func->rx_filters) != sizeof(*func->tx_filters)); in handle_nan_filter()
14505 filter = kcalloc(n_entries, sizeof(*func->rx_filters), GFP_KERNEL); in handle_nan_filter()
14507 return -ENOMEM; in handle_nan_filter()
14518 if (tx) { in handle_nan_filter()
14519 func->num_tx_filters = n_entries; in handle_nan_filter()
14520 func->tx_filters = filter; in handle_nan_filter()
14522 func->num_rx_filters = n_entries; in handle_nan_filter()
14523 func->rx_filters = filter; in handle_nan_filter()
14535 return -ENOMEM; in handle_nan_filter()
14541 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_nan_add_func()
14542 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_nan_add_func()
14549 if (wdev->iftype != NL80211_IFTYPE_NAN) in nl80211_nan_add_func()
14550 return -EOPNOTSUPP; in nl80211_nan_add_func()
14553 return -ENOTCONN; in nl80211_nan_add_func()
14555 if (!info->attrs[NL80211_ATTR_NAN_FUNC]) in nl80211_nan_add_func()
14556 return -EINVAL; in nl80211_nan_add_func()
14559 info->attrs[NL80211_ATTR_NAN_FUNC], in nl80211_nan_add_func()
14561 info->extack); in nl80211_nan_add_func()
14567 return -ENOMEM; in nl80211_nan_add_func()
14569 func->cookie = cfg80211_assign_cookie(rdev); in nl80211_nan_add_func()
14572 err = -EINVAL; in nl80211_nan_add_func()
14577 func->type = nla_get_u8(tb[NL80211_NAN_FUNC_TYPE]); in nl80211_nan_add_func()
14580 err = -EINVAL; in nl80211_nan_add_func()
14584 memcpy(func->service_id, nla_data(tb[NL80211_NAN_FUNC_SERVICE_ID]), in nl80211_nan_add_func()
14585 sizeof(func->service_id)); in nl80211_nan_add_func()
14587 func->close_range = in nl80211_nan_add_func()
14591 func->serv_spec_info_len = in nl80211_nan_add_func()
14593 func->serv_spec_info = in nl80211_nan_add_func()
14595 func->serv_spec_info_len, in nl80211_nan_add_func()
14597 if (!func->serv_spec_info) { in nl80211_nan_add_func()
14598 err = -ENOMEM; in nl80211_nan_add_func()
14604 func->ttl = nla_get_u32(tb[NL80211_NAN_FUNC_TTL]); in nl80211_nan_add_func()
14606 switch (func->type) { in nl80211_nan_add_func()
14609 err = -EINVAL; in nl80211_nan_add_func()
14613 func->publish_type = in nl80211_nan_add_func()
14615 func->publish_bcast = in nl80211_nan_add_func()
14618 if ((!(func->publish_type & NL80211_NAN_SOLICITED_PUBLISH)) && in nl80211_nan_add_func()
14619 func->publish_bcast) { in nl80211_nan_add_func()
14620 err = -EINVAL; in nl80211_nan_add_func()
14625 func->subscribe_active = in nl80211_nan_add_func()
14632 err = -EINVAL; in nl80211_nan_add_func()
14636 func->followup_id = in nl80211_nan_add_func()
14638 func->followup_reqid = in nl80211_nan_add_func()
14640 memcpy(func->followup_dest.addr, in nl80211_nan_add_func()
14642 sizeof(func->followup_dest.addr)); in nl80211_nan_add_func()
14643 if (func->ttl) { in nl80211_nan_add_func()
14644 err = -EINVAL; in nl80211_nan_add_func()
14649 err = -EINVAL; in nl80211_nan_add_func()
14660 info->extack); in nl80211_nan_add_func()
14664 func->srf_include = in nl80211_nan_add_func()
14670 err = -EINVAL; in nl80211_nan_add_func()
14674 func->srf_bf_len = in nl80211_nan_add_func()
14676 func->srf_bf = in nl80211_nan_add_func()
14678 func->srf_bf_len, GFP_KERNEL); in nl80211_nan_add_func()
14679 if (!func->srf_bf) { in nl80211_nan_add_func()
14680 err = -ENOMEM; in nl80211_nan_add_func()
14684 func->srf_bf_idx = in nl80211_nan_add_func()
14692 err = -EINVAL; in nl80211_nan_add_func()
14698 err = -EINVAL; in nl80211_nan_add_func()
14702 func->srf_num_macs = n_entries; in nl80211_nan_add_func()
14703 func->srf_macs = in nl80211_nan_add_func()
14704 kcalloc(n_entries, sizeof(*func->srf_macs), in nl80211_nan_add_func()
14706 if (!func->srf_macs) { in nl80211_nan_add_func()
14707 err = -ENOMEM; in nl80211_nan_add_func()
14712 memcpy(func->srf_macs[i++].addr, nla_data(attr), in nl80211_nan_add_func()
14713 sizeof(*func->srf_macs)); in nl80211_nan_add_func()
14733 err = -ENOMEM; in nl80211_nan_add_func()
14737 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_nan_add_func()
14739 /* This can't really happen - we just allocated 4KB */ in nl80211_nan_add_func()
14741 err = -ENOMEM; in nl80211_nan_add_func()
14754 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, func->cookie, in nl80211_nan_add_func()
14763 func->instance_id)) in nl80211_nan_add_func()
14773 return -ENOBUFS; in nl80211_nan_add_func()
14779 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_nan_del_func()
14780 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_nan_del_func()
14783 if (wdev->iftype != NL80211_IFTYPE_NAN) in nl80211_nan_del_func()
14784 return -EOPNOTSUPP; in nl80211_nan_del_func()
14787 return -ENOTCONN; in nl80211_nan_del_func()
14789 if (!info->attrs[NL80211_ATTR_COOKIE]) in nl80211_nan_del_func()
14790 return -EINVAL; in nl80211_nan_del_func()
14792 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); in nl80211_nan_del_func()
14802 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_nan_change_config()
14803 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_nan_change_config()
14807 if (wdev->iftype != NL80211_IFTYPE_NAN) in nl80211_nan_change_config()
14808 return -EOPNOTSUPP; in nl80211_nan_change_config()
14811 return -ENOTCONN; in nl80211_nan_change_config()
14813 if (info->attrs[NL80211_ATTR_NAN_MASTER_PREF]) { in nl80211_nan_change_config()
14815 nla_get_u8(info->attrs[NL80211_ATTR_NAN_MASTER_PREF]); in nl80211_nan_change_config()
14817 return -EINVAL; in nl80211_nan_change_config()
14822 if (info->attrs[NL80211_ATTR_BANDS]) { in nl80211_nan_change_config()
14823 u32 bands = nla_get_u32(info->attrs[NL80211_ATTR_BANDS]); in nl80211_nan_change_config()
14825 if (bands & ~(u32)wdev->wiphy->nan_supported_bands) in nl80211_nan_change_config()
14826 return -EOPNOTSUPP; in nl80211_nan_change_config()
14829 return -EINVAL; in nl80211_nan_change_config()
14836 return -EINVAL; in nl80211_nan_change_config()
14844 struct wiphy *wiphy = wdev->wiphy; in cfg80211_nan_match()
14850 if (WARN_ON(!match->inst_id || !match->peer_inst_id || !match->addr)) in cfg80211_nan_match()
14863 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_nan_match()
14864 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, in cfg80211_nan_match()
14865 wdev->netdev->ifindex)) || in cfg80211_nan_match()
14870 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, match->cookie, in cfg80211_nan_match()
14872 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, match->addr)) in cfg80211_nan_match()
14884 if (nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, match->inst_id)) in cfg80211_nan_match()
14894 if (nla_put_u8(msg, NL80211_NAN_FUNC_TYPE, match->type) || in cfg80211_nan_match()
14895 nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, match->peer_inst_id)) in cfg80211_nan_match()
14898 if (match->info && match->info_len && in cfg80211_nan_match()
14899 nla_put(msg, NL80211_NAN_FUNC_SERVICE_INFO, match->info_len, in cfg80211_nan_match()
14900 match->info)) in cfg80211_nan_match()
14907 if (!wdev->owner_nlportid) in cfg80211_nan_match()
14908 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), in cfg80211_nan_match()
14911 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, in cfg80211_nan_match()
14912 wdev->owner_nlportid); in cfg80211_nan_match()
14926 struct wiphy *wiphy = wdev->wiphy; in cfg80211_nan_func_terminated()
14945 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_nan_func_terminated()
14946 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, in cfg80211_nan_func_terminated()
14947 wdev->netdev->ifindex)) || in cfg80211_nan_func_terminated()
14967 if (!wdev->owner_nlportid) in cfg80211_nan_func_terminated()
14968 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), in cfg80211_nan_func_terminated()
14971 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, in cfg80211_nan_func_terminated()
14972 wdev->owner_nlportid); in cfg80211_nan_func_terminated()
14989 return -ENOMEM; in nl80211_get_protocol_features()
14991 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_protocol_features()
15005 return -ENOBUFS; in nl80211_get_protocol_features()
15010 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_update_ft_ies()
15012 struct net_device *dev = info->user_ptr[1]; in nl80211_update_ft_ies()
15014 if (!rdev->ops->update_ft_ies) in nl80211_update_ft_ies()
15015 return -EOPNOTSUPP; in nl80211_update_ft_ies()
15017 if (!info->attrs[NL80211_ATTR_MDID] || in nl80211_update_ft_ies()
15018 !info->attrs[NL80211_ATTR_IE]) in nl80211_update_ft_ies()
15019 return -EINVAL; in nl80211_update_ft_ies()
15022 ft_params.md = nla_get_u16(info->attrs[NL80211_ATTR_MDID]); in nl80211_update_ft_ies()
15023 ft_params.ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_update_ft_ies()
15024 ft_params.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_update_ft_ies()
15032 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_crit_protocol_start()
15033 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_crit_protocol_start()
15038 if (!rdev->ops->crit_proto_start) in nl80211_crit_protocol_start()
15039 return -EOPNOTSUPP; in nl80211_crit_protocol_start()
15041 if (WARN_ON(!rdev->ops->crit_proto_stop)) in nl80211_crit_protocol_start()
15042 return -EINVAL; in nl80211_crit_protocol_start()
15044 if (rdev->crit_proto_nlportid) in nl80211_crit_protocol_start()
15045 return -EBUSY; in nl80211_crit_protocol_start()
15048 if (info->attrs[NL80211_ATTR_CRIT_PROT_ID]) in nl80211_crit_protocol_start()
15049 proto = nla_get_u16(info->attrs[NL80211_ATTR_CRIT_PROT_ID]); in nl80211_crit_protocol_start()
15052 return -EINVAL; in nl80211_crit_protocol_start()
15055 if (!info->attrs[NL80211_ATTR_MAX_CRIT_PROT_DURATION]) in nl80211_crit_protocol_start()
15056 return -EINVAL; in nl80211_crit_protocol_start()
15059 nla_get_u16(info->attrs[NL80211_ATTR_MAX_CRIT_PROT_DURATION]); in nl80211_crit_protocol_start()
15063 rdev->crit_proto_nlportid = info->snd_portid; in nl80211_crit_protocol_start()
15071 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_crit_protocol_stop()
15072 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_crit_protocol_stop()
15074 if (!rdev->ops->crit_proto_stop) in nl80211_crit_protocol_stop()
15075 return -EOPNOTSUPP; in nl80211_crit_protocol_stop()
15077 if (rdev->crit_proto_nlportid) { in nl80211_crit_protocol_stop()
15078 rdev->crit_proto_nlportid = 0; in nl80211_crit_protocol_stop()
15088 if (vcmd->policy == VENDOR_CMD_RAW_DATA) { in nl80211_vendor_check_policy()
15089 if (attr->nla_type & NLA_F_NESTED) { in nl80211_vendor_check_policy()
15092 return -EINVAL; in nl80211_vendor_check_policy()
15098 if (!(attr->nla_type & NLA_F_NESTED)) { in nl80211_vendor_check_policy()
15100 return -EINVAL; in nl80211_vendor_check_policy()
15103 return nla_validate_nested(attr, vcmd->maxattr, vcmd->policy, extack); in nl80211_vendor_check_policy()
15108 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_vendor_cmd()
15111 info->attrs); in nl80211_vendor_cmd()
15115 if (!rdev->wiphy.vendor_commands) in nl80211_vendor_cmd()
15116 return -EOPNOTSUPP; in nl80211_vendor_cmd()
15120 if (err != -EINVAL) in nl80211_vendor_cmd()
15123 } else if (wdev->wiphy != &rdev->wiphy) { in nl80211_vendor_cmd()
15124 return -EINVAL; in nl80211_vendor_cmd()
15127 if (!info->attrs[NL80211_ATTR_VENDOR_ID] || in nl80211_vendor_cmd()
15128 !info->attrs[NL80211_ATTR_VENDOR_SUBCMD]) in nl80211_vendor_cmd()
15129 return -EINVAL; in nl80211_vendor_cmd()
15131 vid = nla_get_u32(info->attrs[NL80211_ATTR_VENDOR_ID]); in nl80211_vendor_cmd()
15132 subcmd = nla_get_u32(info->attrs[NL80211_ATTR_VENDOR_SUBCMD]); in nl80211_vendor_cmd()
15133 for (i = 0; i < rdev->wiphy.n_vendor_commands; i++) { in nl80211_vendor_cmd()
15138 vcmd = &rdev->wiphy.vendor_commands[i]; in nl80211_vendor_cmd()
15140 if (vcmd->info.vendor_id != vid || vcmd->info.subcmd != subcmd) in nl80211_vendor_cmd()
15143 if (vcmd->flags & (WIPHY_VENDOR_CMD_NEED_WDEV | in nl80211_vendor_cmd()
15146 return -EINVAL; in nl80211_vendor_cmd()
15147 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_NETDEV && in nl80211_vendor_cmd()
15148 !wdev->netdev) in nl80211_vendor_cmd()
15149 return -EINVAL; in nl80211_vendor_cmd()
15151 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_RUNNING) { in nl80211_vendor_cmd()
15153 return -ENETDOWN; in nl80211_vendor_cmd()
15159 if (!vcmd->doit) in nl80211_vendor_cmd()
15160 return -EOPNOTSUPP; in nl80211_vendor_cmd()
15162 if (info->attrs[NL80211_ATTR_VENDOR_DATA]) { in nl80211_vendor_cmd()
15163 data = nla_data(info->attrs[NL80211_ATTR_VENDOR_DATA]); in nl80211_vendor_cmd()
15164 len = nla_len(info->attrs[NL80211_ATTR_VENDOR_DATA]); in nl80211_vendor_cmd()
15167 info->attrs[NL80211_ATTR_VENDOR_DATA], in nl80211_vendor_cmd()
15168 info->extack); in nl80211_vendor_cmd()
15173 rdev->cur_cmd_info = info; in nl80211_vendor_cmd()
15174 err = vcmd->doit(&rdev->wiphy, wdev, data, len); in nl80211_vendor_cmd()
15175 rdev->cur_cmd_info = NULL; in nl80211_vendor_cmd()
15179 return -EOPNOTSUPP; in nl80211_vendor_cmd()
15190 int vcmd_idx = -1; in nl80211_prepare_vendor_dump()
15195 if (cb->args[0]) { in nl80211_prepare_vendor_dump()
15197 struct wiphy *wiphy = wiphy_idx_to_wiphy(cb->args[0] - 1); in nl80211_prepare_vendor_dump()
15201 return -ENODEV; in nl80211_prepare_vendor_dump()
15205 if (cb->args[1]) { in nl80211_prepare_vendor_dump()
15206 list_for_each_entry(tmp, &wiphy->wdev_list, list) { in nl80211_prepare_vendor_dump()
15207 if (tmp->identifier == cb->args[1] - 1) { in nl80211_prepare_vendor_dump()
15220 return -ENOMEM; in nl80211_prepare_vendor_dump()
15222 err = nlmsg_parse_deprecated(cb->nlh, in nl80211_prepare_vendor_dump()
15231 err = -EINVAL; in nl80211_prepare_vendor_dump()
15235 *wdev = __cfg80211_wdev_from_attrs(NULL, sock_net(skb->sk), attrbuf); in nl80211_prepare_vendor_dump()
15239 *rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk), attrbuf); in nl80211_prepare_vendor_dump()
15248 for (i = 0; i < (*rdev)->wiphy.n_vendor_commands; i++) { in nl80211_prepare_vendor_dump()
15251 vcmd = &(*rdev)->wiphy.vendor_commands[i]; in nl80211_prepare_vendor_dump()
15253 if (vcmd->info.vendor_id != vid || vcmd->info.subcmd != subcmd) in nl80211_prepare_vendor_dump()
15256 if (!vcmd->dumpit) { in nl80211_prepare_vendor_dump()
15257 err = -EOPNOTSUPP; in nl80211_prepare_vendor_dump()
15266 err = -EOPNOTSUPP; in nl80211_prepare_vendor_dump()
15275 &(*rdev)->wiphy.vendor_commands[vcmd_idx], in nl80211_prepare_vendor_dump()
15277 cb->extack); in nl80211_prepare_vendor_dump()
15282 /* 0 is the first index - add 1 to parse only once */ in nl80211_prepare_vendor_dump()
15283 cb->args[0] = (*rdev)->wiphy_idx + 1; in nl80211_prepare_vendor_dump()
15285 cb->args[1] = *wdev ? (*wdev)->identifier + 1 : 0; in nl80211_prepare_vendor_dump()
15286 cb->args[2] = vcmd_idx; in nl80211_prepare_vendor_dump()
15287 cb->args[3] = (unsigned long)data; in nl80211_prepare_vendor_dump()
15288 cb->args[4] = data_len; in nl80211_prepare_vendor_dump()
15314 vcmd_idx = cb->args[2]; in nl80211_vendor_cmd_dump()
15315 data = (void *)cb->args[3]; in nl80211_vendor_cmd_dump()
15316 data_len = cb->args[4]; in nl80211_vendor_cmd_dump()
15317 vcmd = &rdev->wiphy.vendor_commands[vcmd_idx]; in nl80211_vendor_cmd_dump()
15319 if (vcmd->flags & (WIPHY_VENDOR_CMD_NEED_WDEV | in nl80211_vendor_cmd_dump()
15322 err = -EINVAL; in nl80211_vendor_cmd_dump()
15325 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_NETDEV && in nl80211_vendor_cmd_dump()
15326 !wdev->netdev) { in nl80211_vendor_cmd_dump()
15327 err = -EINVAL; in nl80211_vendor_cmd_dump()
15331 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_RUNNING) { in nl80211_vendor_cmd_dump()
15333 err = -ENETDOWN; in nl80211_vendor_cmd_dump()
15340 void *hdr = nl80211hdr_put(skb, NETLINK_CB(cb->skb).portid, in nl80211_vendor_cmd_dump()
15341 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_vendor_cmd_dump()
15346 if (nla_put_u32(skb, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_vendor_cmd_dump()
15361 err = vcmd->dumpit(&rdev->wiphy, wdev, skb, data, data_len, in nl80211_vendor_cmd_dump()
15362 (unsigned long *)&cb->args[5]); in nl80211_vendor_cmd_dump()
15365 if (err == -ENOBUFS || err == -ENOENT) { in nl80211_vendor_cmd_dump()
15376 err = skb->len; in nl80211_vendor_cmd_dump()
15389 if (WARN_ON(!rdev->cur_cmd_info)) in __cfg80211_alloc_reply_skb()
15393 rdev->cur_cmd_info->snd_portid, in __cfg80211_alloc_reply_skb()
15394 rdev->cur_cmd_info->snd_seq, in __cfg80211_alloc_reply_skb()
15401 struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0]; in cfg80211_vendor_cmd_reply()
15402 void *hdr = ((void **)skb->cb)[1]; in cfg80211_vendor_cmd_reply()
15403 struct nlattr *data = ((void **)skb->cb)[2]; in cfg80211_vendor_cmd_reply()
15406 memset(skb->cb, 0, sizeof(skb->cb)); in cfg80211_vendor_cmd_reply()
15408 if (WARN_ON(!rdev->cur_cmd_info)) { in cfg80211_vendor_cmd_reply()
15410 return -EINVAL; in cfg80211_vendor_cmd_reply()
15415 return genlmsg_reply(skb, rdev->cur_cmd_info); in cfg80211_vendor_cmd_reply()
15423 if (WARN_ON(!rdev->cur_cmd_info)) in cfg80211_vendor_cmd_get_sender()
15426 return rdev->cur_cmd_info->snd_portid; in cfg80211_vendor_cmd_get_sender()
15433 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_qos_map()
15435 struct net_device *dev = info->user_ptr[1]; in nl80211_set_qos_map()
15439 if (!rdev->ops->set_qos_map) in nl80211_set_qos_map()
15440 return -EOPNOTSUPP; in nl80211_set_qos_map()
15442 if (info->attrs[NL80211_ATTR_QOS_MAP]) { in nl80211_set_qos_map()
15443 pos = nla_data(info->attrs[NL80211_ATTR_QOS_MAP]); in nl80211_set_qos_map()
15444 len = nla_len(info->attrs[NL80211_ATTR_QOS_MAP]); in nl80211_set_qos_map()
15447 return -EINVAL; in nl80211_set_qos_map()
15451 return -ENOMEM; in nl80211_set_qos_map()
15453 num_des = (len - IEEE80211_QOS_MAP_LEN_MIN) >> 1; in nl80211_set_qos_map()
15457 memcpy(qos_map->dscp_exception, pos, des_len); in nl80211_set_qos_map()
15458 qos_map->num_des = num_des; in nl80211_set_qos_map()
15460 if (qos_map->dscp_exception[des].up > 7) { in nl80211_set_qos_map()
15462 return -EINVAL; in nl80211_set_qos_map()
15467 memcpy(qos_map->up, pos, IEEE80211_QOS_MAP_LEN_MIN); in nl80211_set_qos_map()
15470 ret = nl80211_key_allowed(dev->ieee80211_ptr); in nl80211_set_qos_map()
15480 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_add_tx_ts()
15481 struct net_device *dev = info->user_ptr[1]; in nl80211_add_tx_ts()
15482 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_add_tx_ts()
15487 if (!(rdev->wiphy.features & NL80211_FEATURE_SUPPORTS_WMM_ADMISSION)) in nl80211_add_tx_ts()
15488 return -EOPNOTSUPP; in nl80211_add_tx_ts()
15490 if (!info->attrs[NL80211_ATTR_TSID] || !info->attrs[NL80211_ATTR_MAC] || in nl80211_add_tx_ts()
15491 !info->attrs[NL80211_ATTR_USER_PRIO]) in nl80211_add_tx_ts()
15492 return -EINVAL; in nl80211_add_tx_ts()
15494 tsid = nla_get_u8(info->attrs[NL80211_ATTR_TSID]); in nl80211_add_tx_ts()
15495 up = nla_get_u8(info->attrs[NL80211_ATTR_USER_PRIO]); in nl80211_add_tx_ts()
15497 /* WMM uses TIDs 0-7 even for TSPEC */ in nl80211_add_tx_ts()
15503 return -EINVAL; in nl80211_add_tx_ts()
15506 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_add_tx_ts()
15508 if (info->attrs[NL80211_ATTR_ADMITTED_TIME]) { in nl80211_add_tx_ts()
15510 nla_get_u16(info->attrs[NL80211_ATTR_ADMITTED_TIME]); in nl80211_add_tx_ts()
15512 return -EINVAL; in nl80211_add_tx_ts()
15515 switch (wdev->iftype) { in nl80211_add_tx_ts()
15518 if (wdev->connected) in nl80211_add_tx_ts()
15520 return -ENOTCONN; in nl80211_add_tx_ts()
15522 return -EOPNOTSUPP; in nl80211_add_tx_ts()
15530 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_del_tx_ts()
15531 struct net_device *dev = info->user_ptr[1]; in nl80211_del_tx_ts()
15535 if (!info->attrs[NL80211_ATTR_TSID] || !info->attrs[NL80211_ATTR_MAC]) in nl80211_del_tx_ts()
15536 return -EINVAL; in nl80211_del_tx_ts()
15538 tsid = nla_get_u8(info->attrs[NL80211_ATTR_TSID]); in nl80211_del_tx_ts()
15539 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_del_tx_ts()
15547 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_tdls_channel_switch()
15548 struct net_device *dev = info->user_ptr[1]; in nl80211_tdls_channel_switch()
15549 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_tdls_channel_switch()
15555 if (!rdev->ops->tdls_channel_switch || in nl80211_tdls_channel_switch()
15556 !(rdev->wiphy.features & NL80211_FEATURE_TDLS_CHANNEL_SWITCH)) in nl80211_tdls_channel_switch()
15557 return -EOPNOTSUPP; in nl80211_tdls_channel_switch()
15559 switch (dev->ieee80211_ptr->iftype) { in nl80211_tdls_channel_switch()
15564 return -EOPNOTSUPP; in nl80211_tdls_channel_switch()
15567 if (!info->attrs[NL80211_ATTR_MAC] || in nl80211_tdls_channel_switch()
15568 !info->attrs[NL80211_ATTR_OPER_CLASS]) in nl80211_tdls_channel_switch()
15569 return -EINVAL; in nl80211_tdls_channel_switch()
15576 * Don't allow wide channels on the 2.4Ghz band, as per IEEE802.11-2012 in nl80211_tdls_channel_switch()
15580 if (chandef.chan->band == NL80211_BAND_2GHZ && in nl80211_tdls_channel_switch()
15583 return -EINVAL; in nl80211_tdls_channel_switch()
15586 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &chandef, in nl80211_tdls_channel_switch()
15587 wdev->iftype)) in nl80211_tdls_channel_switch()
15588 return -EINVAL; in nl80211_tdls_channel_switch()
15591 if (cfg80211_chandef_dfs_required(wdev->wiphy, &chandef, wdev->iftype)) in nl80211_tdls_channel_switch()
15592 return -EINVAL; in nl80211_tdls_channel_switch()
15594 addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_tdls_channel_switch()
15595 oper_class = nla_get_u8(info->attrs[NL80211_ATTR_OPER_CLASS]); in nl80211_tdls_channel_switch()
15603 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_tdls_cancel_channel_switch()
15604 struct net_device *dev = info->user_ptr[1]; in nl80211_tdls_cancel_channel_switch()
15607 if (!rdev->ops->tdls_channel_switch || in nl80211_tdls_cancel_channel_switch()
15608 !rdev->ops->tdls_cancel_channel_switch || in nl80211_tdls_cancel_channel_switch()
15609 !(rdev->wiphy.features & NL80211_FEATURE_TDLS_CHANNEL_SWITCH)) in nl80211_tdls_cancel_channel_switch()
15610 return -EOPNOTSUPP; in nl80211_tdls_cancel_channel_switch()
15612 switch (dev->ieee80211_ptr->iftype) { in nl80211_tdls_cancel_channel_switch()
15617 return -EOPNOTSUPP; in nl80211_tdls_cancel_channel_switch()
15620 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_tdls_cancel_channel_switch()
15621 return -EINVAL; in nl80211_tdls_cancel_channel_switch()
15623 addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_tdls_cancel_channel_switch()
15633 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_multicast_to_unicast()
15634 struct net_device *dev = info->user_ptr[1]; in nl80211_set_multicast_to_unicast()
15635 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_multicast_to_unicast()
15639 if (!rdev->ops->set_multicast_to_unicast) in nl80211_set_multicast_to_unicast()
15640 return -EOPNOTSUPP; in nl80211_set_multicast_to_unicast()
15642 if (wdev->iftype != NL80211_IFTYPE_AP && in nl80211_set_multicast_to_unicast()
15643 wdev->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_set_multicast_to_unicast()
15644 return -EOPNOTSUPP; in nl80211_set_multicast_to_unicast()
15646 nla = info->attrs[NL80211_ATTR_MULTICAST_TO_UNICAST_ENABLED]; in nl80211_set_multicast_to_unicast()
15654 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_pmk()
15655 struct net_device *dev = info->user_ptr[1]; in nl80211_set_pmk()
15656 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_pmk()
15659 if (wdev->iftype != NL80211_IFTYPE_STATION && in nl80211_set_pmk()
15660 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_set_pmk()
15661 return -EOPNOTSUPP; in nl80211_set_pmk()
15663 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_set_pmk()
15665 return -EOPNOTSUPP; in nl80211_set_pmk()
15667 if (!info->attrs[NL80211_ATTR_MAC] || !info->attrs[NL80211_ATTR_PMK]) in nl80211_set_pmk()
15668 return -EINVAL; in nl80211_set_pmk()
15670 if (!wdev->connected) in nl80211_set_pmk()
15671 return -ENOTCONN; in nl80211_set_pmk()
15673 pmk_conf.aa = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_set_pmk()
15674 if (memcmp(pmk_conf.aa, wdev->u.client.connected_addr, ETH_ALEN)) in nl80211_set_pmk()
15675 return -EINVAL; in nl80211_set_pmk()
15677 pmk_conf.pmk = nla_data(info->attrs[NL80211_ATTR_PMK]); in nl80211_set_pmk()
15678 pmk_conf.pmk_len = nla_len(info->attrs[NL80211_ATTR_PMK]); in nl80211_set_pmk()
15681 return -EINVAL; in nl80211_set_pmk()
15683 if (info->attrs[NL80211_ATTR_PMKR0_NAME]) in nl80211_set_pmk()
15685 nla_data(info->attrs[NL80211_ATTR_PMKR0_NAME]); in nl80211_set_pmk()
15692 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_del_pmk()
15693 struct net_device *dev = info->user_ptr[1]; in nl80211_del_pmk()
15694 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_del_pmk()
15697 if (wdev->iftype != NL80211_IFTYPE_STATION && in nl80211_del_pmk()
15698 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_del_pmk()
15699 return -EOPNOTSUPP; in nl80211_del_pmk()
15701 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_del_pmk()
15703 return -EOPNOTSUPP; in nl80211_del_pmk()
15705 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_del_pmk()
15706 return -EINVAL; in nl80211_del_pmk()
15708 aa = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_del_pmk()
15714 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_external_auth()
15715 struct net_device *dev = info->user_ptr[1]; in nl80211_external_auth()
15718 if (!rdev->ops->external_auth) in nl80211_external_auth()
15719 return -EOPNOTSUPP; in nl80211_external_auth()
15721 if (!info->attrs[NL80211_ATTR_SSID] && in nl80211_external_auth()
15722 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && in nl80211_external_auth()
15723 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_external_auth()
15724 return -EINVAL; in nl80211_external_auth()
15726 if (!info->attrs[NL80211_ATTR_BSSID]) in nl80211_external_auth()
15727 return -EINVAL; in nl80211_external_auth()
15729 if (!info->attrs[NL80211_ATTR_STATUS_CODE]) in nl80211_external_auth()
15730 return -EINVAL; in nl80211_external_auth()
15734 if (info->attrs[NL80211_ATTR_SSID]) { in nl80211_external_auth()
15735 params.ssid.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); in nl80211_external_auth()
15737 return -EINVAL; in nl80211_external_auth()
15739 nla_data(info->attrs[NL80211_ATTR_SSID]), in nl80211_external_auth()
15743 memcpy(params.bssid, nla_data(info->attrs[NL80211_ATTR_BSSID]), in nl80211_external_auth()
15746 params.status = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]); in nl80211_external_auth()
15748 if (info->attrs[NL80211_ATTR_PMKID]) in nl80211_external_auth()
15749 params.pmkid = nla_data(info->attrs[NL80211_ATTR_PMKID]); in nl80211_external_auth()
15756 bool dont_wait_for_ack = info->attrs[NL80211_ATTR_DONT_WAIT_FOR_ACK]; in nl80211_tx_control_port()
15757 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_tx_control_port()
15758 struct net_device *dev = info->user_ptr[1]; in nl80211_tx_control_port()
15759 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_tx_control_port()
15769 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_tx_control_port()
15771 return -EOPNOTSUPP; in nl80211_tx_control_port()
15773 if (!rdev->ops->tx_control_port) in nl80211_tx_control_port()
15774 return -EOPNOTSUPP; in nl80211_tx_control_port()
15776 if (!info->attrs[NL80211_ATTR_FRAME] || in nl80211_tx_control_port()
15777 !info->attrs[NL80211_ATTR_MAC] || in nl80211_tx_control_port()
15778 !info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]) { in nl80211_tx_control_port()
15780 return -EINVAL; in nl80211_tx_control_port()
15783 switch (wdev->iftype) { in nl80211_tx_control_port()
15789 if (wdev->u.ibss.current_bss) in nl80211_tx_control_port()
15791 return -ENOTCONN; in nl80211_tx_control_port()
15794 if (wdev->connected) in nl80211_tx_control_port()
15796 return -ENOTCONN; in nl80211_tx_control_port()
15798 return -EOPNOTSUPP; in nl80211_tx_control_port()
15801 buf = nla_data(info->attrs[NL80211_ATTR_FRAME]); in nl80211_tx_control_port()
15802 len = nla_len(info->attrs[NL80211_ATTR_FRAME]); in nl80211_tx_control_port()
15803 dest = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_tx_control_port()
15804 proto = nla_get_u16(info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]); in nl80211_tx_control_port()
15806 nla_get_flag(info->attrs[NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT]); in nl80211_tx_control_port()
15808 link_id = nl80211_link_id_or_invalid(info->attrs); in nl80211_tx_control_port()
15814 nl_set_extack_cookie_u64(info->extack, cookie); in nl80211_tx_control_port()
15821 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_ftm_responder_stats()
15822 struct net_device *dev = info->user_ptr[1]; in nl80211_get_ftm_responder_stats()
15823 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_get_ftm_responder_stats()
15825 unsigned int link_id = nl80211_link_id(info->attrs); in nl80211_get_ftm_responder_stats()
15831 if (wdev->iftype != NL80211_IFTYPE_AP || in nl80211_get_ftm_responder_stats()
15832 !wdev->links[link_id].ap.beacon_interval) in nl80211_get_ftm_responder_stats()
15833 return -EOPNOTSUPP; in nl80211_get_ftm_responder_stats()
15840 return -ENODATA; in nl80211_get_ftm_responder_stats()
15844 return -ENOMEM; in nl80211_get_ftm_responder_stats()
15846 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_ftm_responder_stats()
15851 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) in nl80211_get_ftm_responder_stats()
15888 return -ENOBUFS; in nl80211_get_ftm_responder_stats()
15893 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_update_owe_info()
15895 struct net_device *dev = info->user_ptr[1]; in nl80211_update_owe_info()
15897 if (!rdev->ops->update_owe_info) in nl80211_update_owe_info()
15898 return -EOPNOTSUPP; in nl80211_update_owe_info()
15900 if (!info->attrs[NL80211_ATTR_STATUS_CODE] || in nl80211_update_owe_info()
15901 !info->attrs[NL80211_ATTR_MAC]) in nl80211_update_owe_info()
15902 return -EINVAL; in nl80211_update_owe_info()
15905 owe_info.status = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]); in nl80211_update_owe_info()
15906 nla_memcpy(owe_info.peer, info->attrs[NL80211_ATTR_MAC], ETH_ALEN); in nl80211_update_owe_info()
15908 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_update_owe_info()
15909 owe_info.ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_update_owe_info()
15910 owe_info.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_update_owe_info()
15918 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_probe_mesh_link()
15919 struct net_device *dev = info->user_ptr[1]; in nl80211_probe_mesh_link()
15920 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_probe_mesh_link()
15927 if (!rdev->ops->probe_mesh_link || !rdev->ops->get_station) in nl80211_probe_mesh_link()
15928 return -EOPNOTSUPP; in nl80211_probe_mesh_link()
15930 if (!info->attrs[NL80211_ATTR_MAC] || in nl80211_probe_mesh_link()
15931 !info->attrs[NL80211_ATTR_FRAME]) { in nl80211_probe_mesh_link()
15933 return -EINVAL; in nl80211_probe_mesh_link()
15936 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_probe_mesh_link()
15937 return -EOPNOTSUPP; in nl80211_probe_mesh_link()
15939 dest = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_probe_mesh_link()
15940 buf = nla_data(info->attrs[NL80211_ATTR_FRAME]); in nl80211_probe_mesh_link()
15941 len = nla_len(info->attrs[NL80211_ATTR_FRAME]); in nl80211_probe_mesh_link()
15944 return -EINVAL; in nl80211_probe_mesh_link()
15947 !ether_addr_equal(buf + ETH_ALEN, dev->dev_addr)) in nl80211_probe_mesh_link()
15948 return -EINVAL; in nl80211_probe_mesh_link()
15965 struct netlink_ext_ack *extack = info->extack; in parse_tid_conf()
15970 return -EINVAL; in parse_tid_conf()
15972 tid_conf->config_override = in parse_tid_conf()
15974 tid_conf->tids = nla_get_u16(attrs[NL80211_TID_CONFIG_ATTR_TIDS]); in parse_tid_conf()
15976 if (tid_conf->config_override) { in parse_tid_conf()
15977 if (rdev->ops->reset_tid_config) { in parse_tid_conf()
15979 tid_conf->tids); in parse_tid_conf()
15983 return -EINVAL; in parse_tid_conf()
15988 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_NOACK); in parse_tid_conf()
15989 tid_conf->noack = in parse_tid_conf()
15994 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_RETRY_SHORT); in parse_tid_conf()
15995 tid_conf->retry_short = in parse_tid_conf()
15998 if (tid_conf->retry_short > rdev->wiphy.max_data_retry_count) in parse_tid_conf()
15999 return -EINVAL; in parse_tid_conf()
16003 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_RETRY_LONG); in parse_tid_conf()
16004 tid_conf->retry_long = in parse_tid_conf()
16007 if (tid_conf->retry_long > rdev->wiphy.max_data_retry_count) in parse_tid_conf()
16008 return -EINVAL; in parse_tid_conf()
16012 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_AMPDU_CTRL); in parse_tid_conf()
16013 tid_conf->ampdu = in parse_tid_conf()
16018 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL); in parse_tid_conf()
16019 tid_conf->rtscts = in parse_tid_conf()
16024 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_AMSDU_CTRL); in parse_tid_conf()
16025 tid_conf->amsdu = in parse_tid_conf()
16032 tid_conf->txrate_type = nla_get_u8(attrs[idx]); in parse_tid_conf()
16034 if (tid_conf->txrate_type != NL80211_TX_RATE_AUTOMATIC) { in parse_tid_conf()
16037 &tid_conf->txrate_mask, dev, in parse_tid_conf()
16042 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_TX_RATE); in parse_tid_conf()
16044 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE); in parse_tid_conf()
16048 mask = rdev->wiphy.tid_config_support.peer; in parse_tid_conf()
16050 mask = rdev->wiphy.tid_config_support.vif; in parse_tid_conf()
16052 if (tid_conf->mask & ~mask) { in parse_tid_conf()
16054 return -EOPNOTSUPP; in parse_tid_conf()
16063 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_tid_config()
16065 unsigned int link_id = nl80211_link_id(info->attrs); in nl80211_set_tid_config()
16066 struct net_device *dev = info->user_ptr[1]; in nl80211_set_tid_config()
16070 int ret = -EINVAL; in nl80211_set_tid_config()
16073 if (!info->attrs[NL80211_ATTR_TID_CONFIG]) in nl80211_set_tid_config()
16074 return -EINVAL; in nl80211_set_tid_config()
16076 if (!rdev->ops->set_tid_config) in nl80211_set_tid_config()
16077 return -EOPNOTSUPP; in nl80211_set_tid_config()
16079 nla_for_each_nested(tid, info->attrs[NL80211_ATTR_TID_CONFIG], in nl80211_set_tid_config()
16086 return -ENOMEM; in nl80211_set_tid_config()
16088 tid_config->n_tid_conf = num_conf; in nl80211_set_tid_config()
16090 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_set_tid_config()
16091 tid_config->peer = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_set_tid_config()
16093 nla_for_each_nested(tid, info->attrs[NL80211_ATTR_TID_CONFIG], in nl80211_set_tid_config()
16102 &tid_config->tid_conf[conf_idx], in nl80211_set_tid_config()
16103 info, tid_config->peer, link_id); in nl80211_set_tid_config()
16119 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_color_change()
16121 struct net_device *dev = info->user_ptr[1]; in nl80211_color_change()
16122 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_color_change()
16127 if (!rdev->ops->color_change) in nl80211_color_change()
16128 return -EOPNOTSUPP; in nl80211_color_change()
16130 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_color_change()
16132 return -EOPNOTSUPP; in nl80211_color_change()
16134 if (wdev->iftype != NL80211_IFTYPE_AP) in nl80211_color_change()
16135 return -EOPNOTSUPP; in nl80211_color_change()
16137 if (!info->attrs[NL80211_ATTR_COLOR_CHANGE_COUNT] || in nl80211_color_change()
16138 !info->attrs[NL80211_ATTR_COLOR_CHANGE_COLOR] || in nl80211_color_change()
16139 !info->attrs[NL80211_ATTR_COLOR_CHANGE_ELEMS]) in nl80211_color_change()
16140 return -EINVAL; in nl80211_color_change()
16142 params.count = nla_get_u8(info->attrs[NL80211_ATTR_COLOR_CHANGE_COUNT]); in nl80211_color_change()
16143 params.color = nla_get_u8(info->attrs[NL80211_ATTR_COLOR_CHANGE_COLOR]); in nl80211_color_change()
16145 err = nl80211_parse_beacon(rdev, info->attrs, &params.beacon_next, in nl80211_color_change()
16146 info->extack); in nl80211_color_change()
16152 return -ENOMEM; in nl80211_color_change()
16155 info->attrs[NL80211_ATTR_COLOR_CHANGE_ELEMS], in nl80211_color_change()
16156 nl80211_policy, info->extack); in nl80211_color_change()
16161 info->extack); in nl80211_color_change()
16166 err = -EINVAL; in nl80211_color_change()
16171 err = -EINVAL; in nl80211_color_change()
16177 err = -EINVAL; in nl80211_color_change()
16182 err = -EINVAL; in nl80211_color_change()
16191 err = -EINVAL; in nl80211_color_change()
16197 err = -EINVAL; in nl80211_color_change()
16203 err = -EINVAL; in nl80211_color_change()
16210 params.link_id = nl80211_link_id(info->attrs); in nl80211_color_change()
16225 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_fils_aad()
16226 struct net_device *dev = info->user_ptr[1]; in nl80211_set_fils_aad()
16230 if (!info->attrs[NL80211_ATTR_MAC] || in nl80211_set_fils_aad()
16231 !info->attrs[NL80211_ATTR_FILS_KEK] || in nl80211_set_fils_aad()
16232 !info->attrs[NL80211_ATTR_FILS_NONCES]) in nl80211_set_fils_aad()
16233 return -EINVAL; in nl80211_set_fils_aad()
16235 fils_aad.macaddr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_set_fils_aad()
16236 fils_aad.kek_len = nla_len(info->attrs[NL80211_ATTR_FILS_KEK]); in nl80211_set_fils_aad()
16237 fils_aad.kek = nla_data(info->attrs[NL80211_ATTR_FILS_KEK]); in nl80211_set_fils_aad()
16238 nonces = nla_data(info->attrs[NL80211_ATTR_FILS_NONCES]); in nl80211_set_fils_aad()
16247 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_add_link()
16248 unsigned int link_id = nl80211_link_id(info->attrs); in nl80211_add_link()
16249 struct net_device *dev = info->user_ptr[1]; in nl80211_add_link()
16250 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_add_link()
16253 if (!(wdev->wiphy->flags & WIPHY_FLAG_SUPPORTS_MLO)) in nl80211_add_link()
16254 return -EINVAL; in nl80211_add_link()
16256 switch (wdev->iftype) { in nl80211_add_link()
16260 return -EINVAL; in nl80211_add_link()
16263 if (!info->attrs[NL80211_ATTR_MAC] || in nl80211_add_link()
16264 !is_valid_ether_addr(nla_data(info->attrs[NL80211_ATTR_MAC]))) in nl80211_add_link()
16265 return -EINVAL; in nl80211_add_link()
16267 wdev->valid_links |= BIT(link_id); in nl80211_add_link()
16268 ether_addr_copy(wdev->links[link_id].addr, in nl80211_add_link()
16269 nla_data(info->attrs[NL80211_ATTR_MAC])); in nl80211_add_link()
16273 wdev->valid_links &= ~BIT(link_id); in nl80211_add_link()
16274 eth_zero_addr(wdev->links[link_id].addr); in nl80211_add_link()
16282 unsigned int link_id = nl80211_link_id(info->attrs); in nl80211_remove_link()
16283 struct net_device *dev = info->user_ptr[1]; in nl80211_remove_link()
16284 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_remove_link()
16287 if (!info->attrs[NL80211_ATTR_MLO_LINK_ID]) in nl80211_remove_link()
16288 return -EINVAL; in nl80211_remove_link()
16290 switch (wdev->iftype) { in nl80211_remove_link()
16294 return -EINVAL; in nl80211_remove_link()
16307 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_add_mod_link_station()
16308 struct net_device *dev = info->user_ptr[1]; in nl80211_add_mod_link_station()
16311 if ((add && !rdev->ops->add_link_station) || in nl80211_add_mod_link_station()
16312 (!add && !rdev->ops->mod_link_station)) in nl80211_add_mod_link_station()
16313 return -EOPNOTSUPP; in nl80211_add_mod_link_station()
16315 if (add && !info->attrs[NL80211_ATTR_MAC]) in nl80211_add_mod_link_station()
16316 return -EINVAL; in nl80211_add_mod_link_station()
16318 if (!info->attrs[NL80211_ATTR_MLD_ADDR]) in nl80211_add_mod_link_station()
16319 return -EINVAL; in nl80211_add_mod_link_station()
16321 if (add && !info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) in nl80211_add_mod_link_station()
16322 return -EINVAL; in nl80211_add_mod_link_station()
16324 params.mld_mac = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]); in nl80211_add_mod_link_station()
16326 if (info->attrs[NL80211_ATTR_MAC]) { in nl80211_add_mod_link_station()
16327 params.link_mac = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_add_mod_link_station()
16329 return -EINVAL; in nl80211_add_mod_link_station()
16332 if (!info->attrs[NL80211_ATTR_MLO_LINK_ID]) in nl80211_add_mod_link_station()
16333 return -EINVAL; in nl80211_add_mod_link_station()
16335 params.link_id = nla_get_u8(info->attrs[NL80211_ATTR_MLO_LINK_ID]); in nl80211_add_mod_link_station()
16337 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) { in nl80211_add_mod_link_station()
16339 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); in nl80211_add_mod_link_station()
16341 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); in nl80211_add_mod_link_station()
16344 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) in nl80211_add_mod_link_station()
16346 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]); in nl80211_add_mod_link_station()
16348 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) in nl80211_add_mod_link_station()
16350 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]); in nl80211_add_mod_link_station()
16352 if (info->attrs[NL80211_ATTR_HE_CAPABILITY]) { in nl80211_add_mod_link_station()
16354 nla_data(info->attrs[NL80211_ATTR_HE_CAPABILITY]); in nl80211_add_mod_link_station()
16356 nla_len(info->attrs[NL80211_ATTR_HE_CAPABILITY]); in nl80211_add_mod_link_station()
16358 if (info->attrs[NL80211_ATTR_EHT_CAPABILITY]) { in nl80211_add_mod_link_station()
16360 nla_data(info->attrs[NL80211_ATTR_EHT_CAPABILITY]); in nl80211_add_mod_link_station()
16362 nla_len(info->attrs[NL80211_ATTR_EHT_CAPABILITY]); in nl80211_add_mod_link_station()
16368 return -EINVAL; in nl80211_add_mod_link_station()
16372 if (info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]) in nl80211_add_mod_link_station()
16374 nla_data(info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]); in nl80211_add_mod_link_station()
16376 if (info->attrs[NL80211_ATTR_OPMODE_NOTIF]) { in nl80211_add_mod_link_station()
16379 nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]); in nl80211_add_mod_link_station()
16409 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_remove_link_station()
16410 struct net_device *dev = info->user_ptr[1]; in nl80211_remove_link_station()
16412 if (!rdev->ops->del_link_station) in nl80211_remove_link_station()
16413 return -EOPNOTSUPP; in nl80211_remove_link_station()
16415 if (!info->attrs[NL80211_ATTR_MLD_ADDR] || in nl80211_remove_link_station()
16416 !info->attrs[NL80211_ATTR_MLO_LINK_ID]) in nl80211_remove_link_station()
16417 return -EINVAL; in nl80211_remove_link_station()
16419 params.mld_mac = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]); in nl80211_remove_link_station()
16420 params.link_id = nla_get_u8(info->attrs[NL80211_ATTR_MLO_LINK_ID]); in nl80211_remove_link_station()
16428 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_hw_timestamp()
16429 struct net_device *dev = info->user_ptr[1]; in nl80211_set_hw_timestamp()
16432 if (!rdev->wiphy.hw_timestamp_max_peers) in nl80211_set_hw_timestamp()
16433 return -EOPNOTSUPP; in nl80211_set_hw_timestamp()
16435 if (!info->attrs[NL80211_ATTR_MAC] && in nl80211_set_hw_timestamp()
16436 rdev->wiphy.hw_timestamp_max_peers != CFG80211_HW_TIMESTAMP_ALL_PEERS) in nl80211_set_hw_timestamp()
16437 return -EOPNOTSUPP; in nl80211_set_hw_timestamp()
16439 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_set_hw_timestamp()
16440 hwts.macaddr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_set_hw_timestamp()
16443 nla_get_flag(info->attrs[NL80211_ATTR_HW_TIMESTAMP_ENABLED]); in nl80211_set_hw_timestamp()
16452 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_ttlm()
16453 struct net_device *dev = info->user_ptr[1]; in nl80211_set_ttlm()
16454 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_ttlm()
16456 if (wdev->iftype != NL80211_IFTYPE_STATION && in nl80211_set_ttlm()
16457 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_set_ttlm()
16458 return -EOPNOTSUPP; in nl80211_set_ttlm()
16460 if (!wdev->connected) in nl80211_set_ttlm()
16461 return -ENOLINK; in nl80211_set_ttlm()
16463 if (!info->attrs[NL80211_ATTR_MLO_TTLM_DLINK] || in nl80211_set_ttlm()
16464 !info->attrs[NL80211_ATTR_MLO_TTLM_ULINK]) in nl80211_set_ttlm()
16465 return -EINVAL; in nl80211_set_ttlm()
16468 info->attrs[NL80211_ATTR_MLO_TTLM_DLINK], in nl80211_set_ttlm()
16471 info->attrs[NL80211_ATTR_MLO_TTLM_ULINK], in nl80211_set_ttlm()
16575 if (WARN_ON(ops->internal_flags >= ARRAY_SIZE(nl80211_internal_flags))) in nl80211_pre_doit()
16576 return -EINVAL; in nl80211_pre_doit()
16578 internal_flags = nl80211_internal_flags[ops->internal_flags]; in nl80211_pre_doit()
16587 info->user_ptr[0] = rdev; in nl80211_pre_doit()
16591 info->attrs); in nl80211_pre_doit()
16597 dev = wdev->netdev; in nl80211_pre_doit()
16599 rdev = wiphy_to_rdev(wdev->wiphy); in nl80211_pre_doit()
16603 err = -EINVAL; in nl80211_pre_doit()
16607 info->user_ptr[1] = dev; in nl80211_pre_doit()
16609 info->user_ptr[1] = wdev; in nl80211_pre_doit()
16614 err = -ENETDOWN; in nl80211_pre_doit()
16618 info->user_ptr[0] = rdev; in nl80211_pre_doit()
16622 struct nlattr *link_id = info->attrs[NL80211_ATTR_MLO_LINK_ID]; in nl80211_pre_doit()
16625 err = -EINVAL; in nl80211_pre_doit()
16629 /* MLO -> require valid link ID */ in nl80211_pre_doit()
16630 if (wdev->valid_links && in nl80211_pre_doit()
16632 !(wdev->valid_links & BIT(nla_get_u8(link_id))))) { in nl80211_pre_doit()
16633 err = -EINVAL; in nl80211_pre_doit()
16637 /* non-MLO -> no link ID attribute accepted */ in nl80211_pre_doit()
16638 if (!wdev->valid_links && link_id) { in nl80211_pre_doit()
16639 err = -EINVAL; in nl80211_pre_doit()
16645 if (info->attrs[NL80211_ATTR_MLO_LINK_ID] || in nl80211_pre_doit()
16646 (wdev && wdev->valid_links)) { in nl80211_pre_doit()
16647 err = -EINVAL; in nl80211_pre_doit()
16653 wiphy_lock(&rdev->wiphy); in nl80211_pre_doit()
16655 __release(&rdev->wiphy.mtx); in nl80211_pre_doit()
16671 u32 internal_flags = nl80211_internal_flags[ops->internal_flags]; in nl80211_post_doit()
16673 if (info->user_ptr[1]) { in nl80211_post_doit()
16675 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_post_doit()
16677 dev_put(wdev->netdev); in nl80211_post_doit()
16679 dev_put(info->user_ptr[1]); in nl80211_post_doit()
16683 if (info->user_ptr[0] && in nl80211_post_doit()
16685 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_post_doit()
16688 __acquire(&rdev->wiphy.mtx); in nl80211_post_doit()
16689 wiphy_unlock(&rdev->wiphy); in nl80211_post_doit()
16714 return -EINVAL; in nl80211_set_sar_sub_specs()
16718 return -EINVAL; in nl80211_set_sar_sub_specs()
16723 if (range_index >= rdev->wiphy.sar_capa->num_freq_ranges) in nl80211_set_sar_sub_specs()
16724 return -EINVAL; in nl80211_set_sar_sub_specs()
16728 if (sar_specs->sub_specs[i].freq_range_index == range_index) in nl80211_set_sar_sub_specs()
16729 return -EINVAL; in nl80211_set_sar_sub_specs()
16732 sar_specs->sub_specs[index].power = in nl80211_set_sar_sub_specs()
16735 sar_specs->sub_specs[index].freq_range_index = range_index; in nl80211_set_sar_sub_specs()
16742 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_sar_specs()
16751 if (!rdev->wiphy.sar_capa || !rdev->ops->set_sar_specs) in nl80211_set_sar_specs()
16752 return -EOPNOTSUPP; in nl80211_set_sar_specs()
16754 if (!info->attrs[NL80211_ATTR_SAR_SPEC]) in nl80211_set_sar_specs()
16755 return -EINVAL; in nl80211_set_sar_specs()
16758 info->attrs[NL80211_ATTR_SAR_SPEC], in nl80211_set_sar_specs()
16762 return -EINVAL; in nl80211_set_sar_specs()
16765 if (type != rdev->wiphy.sar_capa->type) in nl80211_set_sar_specs()
16766 return -EINVAL; in nl80211_set_sar_specs()
16772 if (specs > rdev->wiphy.sar_capa->num_freq_ranges) in nl80211_set_sar_specs()
16773 return -EINVAL; in nl80211_set_sar_specs()
16777 return -ENOMEM; in nl80211_set_sar_specs()
16779 sar_spec->type = type; in nl80211_set_sar_specs()
16789 err = -EINVAL; in nl80211_set_sar_specs()
16794 err = -EINVAL; in nl80211_set_sar_specs()
16800 sar_spec->num_sub_specs = specs; in nl80211_set_sar_specs()
16802 rdev->cur_cmd_info = info; in nl80211_set_sar_specs()
16804 rdev->cur_cmd_info = NULL; in nl80211_set_sar_specs()
17711 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_notify_wiphy()
17730 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_notify_iface()
17737 struct cfg80211_scan_request *req = rdev->scan_req; in nl80211_add_scan_req()
17748 for (i = 0; i < req->n_ssids; i++) { in nl80211_add_scan_req()
17749 if (nla_put(msg, i, req->ssids[i].ssid_len, req->ssids[i].ssid)) in nl80211_add_scan_req()
17754 if (req->flags & NL80211_SCAN_FLAG_FREQ_KHZ) { in nl80211_add_scan_req()
17758 for (i = 0; i < req->n_channels; i++) { in nl80211_add_scan_req()
17760 ieee80211_channel_to_khz(req->channels[i]))) in nl80211_add_scan_req()
17769 for (i = 0; i < req->n_channels; i++) { in nl80211_add_scan_req()
17770 if (nla_put_u32(msg, i, req->channels[i]->center_freq)) in nl80211_add_scan_req()
17776 if (req->ie && in nl80211_add_scan_req()
17777 nla_put(msg, NL80211_ATTR_IE, req->ie_len, req->ie)) in nl80211_add_scan_req()
17780 if (req->flags && in nl80211_add_scan_req()
17781 nla_put_u32(msg, NL80211_ATTR_SCAN_FLAGS, req->flags)) in nl80211_add_scan_req()
17784 info = rdev->int_scan_req ? &rdev->int_scan_req->info : in nl80211_add_scan_req()
17785 &rdev->scan_req->info; in nl80211_add_scan_req()
17786 if (info->scan_start_tsf && in nl80211_add_scan_req()
17788 info->scan_start_tsf, NL80211_BSS_PAD) || in nl80211_add_scan_req()
17790 info->tsf_bssid))) in nl80211_add_scan_req()
17795 return -ENOBUFS; in nl80211_add_scan_req()
17808 return -1; in nl80211_prep_scan_msg()
17810 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_prep_scan_msg()
17811 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, in nl80211_prep_scan_msg()
17812 wdev->netdev->ifindex)) || in nl80211_prep_scan_msg()
17825 return -EMSGSIZE; in nl80211_prep_scan_msg()
17836 return -1; in nl80211_prep_sched_scan_msg()
17839 wiphy_to_rdev(req->wiphy)->wiphy_idx) || in nl80211_prep_sched_scan_msg()
17840 nla_put_u32(msg, NL80211_ATTR_IFINDEX, req->dev->ifindex) || in nl80211_prep_sched_scan_msg()
17841 nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, req->reqid, in nl80211_prep_sched_scan_msg()
17850 return -EMSGSIZE; in nl80211_prep_sched_scan_msg()
17868 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_scan_start()
17898 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_scan_msg()
17915 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(req->wiphy), msg, 0, in nl80211_send_sched_scan()
17923 if (nla_put_u8(msg, NL80211_ATTR_REG_INITIATOR, request->initiator)) in nl80211_reg_change_event_fill()
17926 if (request->alpha2[0] == '0' && request->alpha2[1] == '0') { in nl80211_reg_change_event_fill()
17930 } else if (request->alpha2[0] == '9' && request->alpha2[1] == '9') { in nl80211_reg_change_event_fill()
17934 } else if ((request->alpha2[0] == '9' && request->alpha2[1] == '8') || in nl80211_reg_change_event_fill()
17935 request->intersect) { in nl80211_reg_change_event_fill()
17943 request->alpha2)) in nl80211_reg_change_event_fill()
17947 if (request->wiphy_idx != WIPHY_IDX_INVALID) { in nl80211_reg_change_event_fill()
17948 struct wiphy *wiphy = wiphy_idx_to_wiphy(request->wiphy_idx); in nl80211_reg_change_event_fill()
17951 nla_put_u32(msg, NL80211_ATTR_WIPHY, request->wiphy_idx)) in nl80211_reg_change_event_fill()
17955 wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED && in nl80211_reg_change_event_fill()
18018 msg = nlmsg_new(100 + event->buf_len + event->req_ies_len, gfp); in nl80211_send_mlme_event()
18022 hdr = nl80211hdr_put(msg, 0, 0, 0, event->cmd); in nl80211_send_mlme_event()
18028 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_mlme_event()
18029 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_send_mlme_event()
18030 nla_put(msg, NL80211_ATTR_FRAME, event->buf_len, event->buf) || in nl80211_send_mlme_event()
18031 (event->req_ies && in nl80211_send_mlme_event()
18032 nla_put(msg, NL80211_ATTR_REQ_IE, event->req_ies_len, in nl80211_send_mlme_event()
18033 event->req_ies))) in nl80211_send_mlme_event()
18036 if (event->reconnect && in nl80211_send_mlme_event()
18040 if (event->uapsd_queues >= 0) { in nl80211_send_mlme_event()
18047 event->uapsd_queues)) in nl80211_send_mlme_event()
18055 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_mlme_event()
18071 .uapsd_queues = -1, in nl80211_send_rx_auth()
18083 .buf = data->buf, in nl80211_send_rx_assoc()
18084 .buf_len = data->len, in nl80211_send_rx_assoc()
18085 .uapsd_queues = data->uapsd_queues, in nl80211_send_rx_assoc()
18086 .req_ies = data->req_ies, in nl80211_send_rx_assoc()
18087 .req_ies_len = data->req_ies_len, in nl80211_send_rx_assoc()
18102 .uapsd_queues = -1, in nl80211_send_deauth()
18117 .uapsd_queues = -1, in nl80211_send_disassoc()
18126 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_rx_unprot_mlme_mgmt()
18127 struct wiphy *wiphy = wdev->wiphy; in cfg80211_rx_unprot_mlme_mgmt()
18133 .uapsd_queues = -1, in cfg80211_rx_unprot_mlme_mgmt()
18139 if (ieee80211_is_deauth(mgmt->frame_control)) { in cfg80211_rx_unprot_mlme_mgmt()
18141 } else if (ieee80211_is_disassoc(mgmt->frame_control)) { in cfg80211_rx_unprot_mlme_mgmt()
18143 } else if (ieee80211_is_beacon(mgmt->frame_control)) { in cfg80211_rx_unprot_mlme_mgmt()
18144 if (wdev->unprot_beacon_reported && in cfg80211_rx_unprot_mlme_mgmt()
18145 elapsed_jiffies_msecs(wdev->unprot_beacon_reported) < 10000) in cfg80211_rx_unprot_mlme_mgmt()
18148 wdev->unprot_beacon_reported = jiffies; in cfg80211_rx_unprot_mlme_mgmt()
18175 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_mlme_timeout()
18176 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_send_mlme_timeout()
18183 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_mlme_timeout()
18216 const u8 *connected_addr = cr->valid_links ? in nl80211_send_connect_result()
18217 cr->ap_mld_addr : cr->links[0].bssid; in nl80211_send_connect_result()
18219 if (cr->valid_links) { in nl80211_send_connect_result()
18225 link_info_size += cr->links[link].addr ? in nl80211_send_connect_result()
18227 link_info_size += (cr->links[link].bssid || in nl80211_send_connect_result()
18228 cr->links[link].bss) ? in nl80211_send_connect_result()
18234 msg = nlmsg_new(100 + cr->req_ie_len + cr->resp_ie_len + in nl80211_send_connect_result()
18235 cr->fils.kek_len + cr->fils.pmk_len + in nl80211_send_connect_result()
18236 (cr->fils.pmkid ? WLAN_PMKID_LEN : 0) + link_info_size, in nl80211_send_connect_result()
18247 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_connect_result()
18248 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_send_connect_result()
18252 cr->status < 0 ? WLAN_STATUS_UNSPECIFIED_FAILURE : in nl80211_send_connect_result()
18253 cr->status) || in nl80211_send_connect_result()
18254 (cr->status < 0 && in nl80211_send_connect_result()
18257 cr->timeout_reason))) || in nl80211_send_connect_result()
18258 (cr->req_ie && in nl80211_send_connect_result()
18259 nla_put(msg, NL80211_ATTR_REQ_IE, cr->req_ie_len, cr->req_ie)) || in nl80211_send_connect_result()
18260 (cr->resp_ie && in nl80211_send_connect_result()
18261 nla_put(msg, NL80211_ATTR_RESP_IE, cr->resp_ie_len, in nl80211_send_connect_result()
18262 cr->resp_ie)) || in nl80211_send_connect_result()
18263 (cr->fils.update_erp_next_seq_num && in nl80211_send_connect_result()
18265 cr->fils.erp_next_seq_num)) || in nl80211_send_connect_result()
18266 (cr->status == WLAN_STATUS_SUCCESS && in nl80211_send_connect_result()
18267 ((cr->fils.kek && in nl80211_send_connect_result()
18268 nla_put(msg, NL80211_ATTR_FILS_KEK, cr->fils.kek_len, in nl80211_send_connect_result()
18269 cr->fils.kek)) || in nl80211_send_connect_result()
18270 (cr->fils.pmk && in nl80211_send_connect_result()
18271 nla_put(msg, NL80211_ATTR_PMK, cr->fils.pmk_len, cr->fils.pmk)) || in nl80211_send_connect_result()
18272 (cr->fils.pmkid && in nl80211_send_connect_result()
18273 nla_put(msg, NL80211_ATTR_PMKID, WLAN_PMKID_LEN, cr->fils.pmkid))))) in nl80211_send_connect_result()
18276 if (cr->valid_links) { in nl80211_send_connect_result()
18286 const u8 *bssid = cr->links[link].bss ? in nl80211_send_connect_result()
18287 cr->links[link].bss->bssid : in nl80211_send_connect_result()
18288 cr->links[link].bssid; in nl80211_send_connect_result()
18297 (cr->links[link].addr && in nl80211_send_connect_result()
18299 cr->links[link].addr)) || in nl80211_send_connect_result()
18301 cr->links[link].status)) in nl80211_send_connect_result()
18312 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_connect_result()
18328 const u8 *connected_addr = info->ap_mld_addr ? in nl80211_send_roamed()
18329 info->ap_mld_addr : in nl80211_send_roamed()
18330 (info->links[0].bss ? in nl80211_send_roamed()
18331 info->links[0].bss->bssid : in nl80211_send_roamed()
18332 info->links[0].bssid); in nl80211_send_roamed()
18334 if (info->valid_links) { in nl80211_send_roamed()
18340 link_info_size += info->links[link].addr ? in nl80211_send_roamed()
18342 link_info_size += (info->links[link].bssid || in nl80211_send_roamed()
18343 info->links[link].bss) ? in nl80211_send_roamed()
18348 msg = nlmsg_new(100 + info->req_ie_len + info->resp_ie_len + in nl80211_send_roamed()
18349 info->fils.kek_len + info->fils.pmk_len + in nl80211_send_roamed()
18350 (info->fils.pmkid ? WLAN_PMKID_LEN : 0) + in nl80211_send_roamed()
18361 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_roamed()
18362 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_send_roamed()
18364 (info->req_ie && in nl80211_send_roamed()
18365 nla_put(msg, NL80211_ATTR_REQ_IE, info->req_ie_len, in nl80211_send_roamed()
18366 info->req_ie)) || in nl80211_send_roamed()
18367 (info->resp_ie && in nl80211_send_roamed()
18368 nla_put(msg, NL80211_ATTR_RESP_IE, info->resp_ie_len, in nl80211_send_roamed()
18369 info->resp_ie)) || in nl80211_send_roamed()
18370 (info->fils.update_erp_next_seq_num && in nl80211_send_roamed()
18372 info->fils.erp_next_seq_num)) || in nl80211_send_roamed()
18373 (info->fils.kek && in nl80211_send_roamed()
18374 nla_put(msg, NL80211_ATTR_FILS_KEK, info->fils.kek_len, in nl80211_send_roamed()
18375 info->fils.kek)) || in nl80211_send_roamed()
18376 (info->fils.pmk && in nl80211_send_roamed()
18377 nla_put(msg, NL80211_ATTR_PMK, info->fils.pmk_len, info->fils.pmk)) || in nl80211_send_roamed()
18378 (info->fils.pmkid && in nl80211_send_roamed()
18379 nla_put(msg, NL80211_ATTR_PMKID, WLAN_PMKID_LEN, info->fils.pmkid))) in nl80211_send_roamed()
18382 if (info->valid_links) { in nl80211_send_roamed()
18392 const u8 *bssid = info->links[link].bss ? in nl80211_send_roamed()
18393 info->links[link].bss->bssid : in nl80211_send_roamed()
18394 info->links[link].bssid; in nl80211_send_roamed()
18403 (info->links[link].addr && in nl80211_send_roamed()
18405 info->links[link].addr))) in nl80211_send_roamed()
18416 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_roamed()
18441 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_port_authorized()
18442 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_send_port_authorized()
18453 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_port_authorized()
18478 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_disconnected()
18479 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_send_disconnected()
18489 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_disconnected()
18499 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_links_removed()
18500 struct wiphy *wiphy = wdev->wiphy; in cfg80211_links_removed()
18506 lockdep_assert_wiphy(wdev->wiphy); in cfg80211_links_removed()
18509 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_STATION && in cfg80211_links_removed()
18510 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT)) in cfg80211_links_removed()
18513 if (WARN_ON(!wdev->valid_links || !link_mask || in cfg80211_links_removed()
18514 (wdev->valid_links & link_mask) != link_mask || in cfg80211_links_removed()
18515 wdev->valid_links == link_mask)) in cfg80211_links_removed()
18519 wdev->valid_links &= ~link_mask; in cfg80211_links_removed()
18531 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_links_removed()
18532 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) in cfg80211_links_removed()
18558 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_links_removed()
18584 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_ibss_bssid()
18585 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_send_ibss_bssid()
18591 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_ibss_bssid()
18603 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_notify_new_peer_candidate()
18604 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_notify_new_peer_candidate()
18608 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_MESH_POINT)) in cfg80211_notify_new_peer_candidate()
18623 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_notify_new_peer_candidate()
18624 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in cfg80211_notify_new_peer_candidate()
18634 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_notify_new_peer_candidate()
18661 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_michael_mic_failure()
18662 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_michael_mic_failure()
18665 (key_id != -1 && in nl80211_michael_mic_failure()
18672 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_michael_mic_failure()
18755 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_remain_on_chan_event()
18756 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, in nl80211_send_remain_on_chan_event()
18757 wdev->netdev->ifindex)) || in nl80211_send_remain_on_chan_event()
18760 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, chan->center_freq) || in nl80211_send_remain_on_chan_event()
18773 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_remain_on_chan_event()
18784 struct wireless_dev *wdev = netdev->ieee80211_ptr; in cfg80211_assoc_comeback()
18785 struct wiphy *wiphy = wdev->wiphy; in cfg80211_assoc_comeback()
18802 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_assoc_comeback()
18803 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in cfg80211_assoc_comeback()
18810 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_assoc_comeback()
18823 struct wiphy *wiphy = wdev->wiphy; in cfg80211_ready_on_channel()
18837 struct wiphy *wiphy = wdev->wiphy; in cfg80211_remain_on_channel_expired()
18850 struct wiphy *wiphy = wdev->wiphy; in cfg80211_tx_mgmt_expired()
18862 struct wiphy *wiphy = dev->ieee80211_ptr->wiphy; in cfg80211_new_sta()
18878 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_new_sta()
18886 struct wiphy *wiphy = dev->ieee80211_ptr->wiphy; in cfg80211_del_sta_sinfo()
18908 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_del_sta_sinfo()
18917 struct wiphy *wiphy = dev->ieee80211_ptr->wiphy; in cfg80211_conn_failed()
18932 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in cfg80211_conn_failed()
18939 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_conn_failed()
18951 struct wireless_dev *wdev = dev->ieee80211_ptr; in __nl80211_unexpected_frame()
18952 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in __nl80211_unexpected_frame()
18955 u32 nlportid = READ_ONCE(wdev->ap_unexpected_nlportid); in __nl80211_unexpected_frame()
18970 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in __nl80211_unexpected_frame()
18971 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in __nl80211_unexpected_frame()
18976 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); in __nl80211_unexpected_frame()
18987 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_rx_spurious_frame()
18992 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP && in cfg80211_rx_spurious_frame()
18993 wdev->iftype != NL80211_IFTYPE_P2P_GO)) { in cfg80211_rx_spurious_frame()
19007 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_rx_unexpected_4addr_frame()
19012 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP && in cfg80211_rx_unexpected_4addr_frame()
19013 wdev->iftype != NL80211_IFTYPE_P2P_GO && in cfg80211_rx_unexpected_4addr_frame()
19014 wdev->iftype != NL80211_IFTYPE_AP_VLAN)) { in cfg80211_rx_unexpected_4addr_frame()
19030 struct net_device *netdev = wdev->netdev; in nl80211_send_mgmt()
19034 msg = nlmsg_new(100 + info->len, gfp); in nl80211_send_mgmt()
19036 return -ENOMEM; in nl80211_send_mgmt()
19041 return -ENOMEM; in nl80211_send_mgmt()
19044 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_mgmt()
19046 netdev->ifindex)) || in nl80211_send_mgmt()
19049 (info->have_link_id && in nl80211_send_mgmt()
19050 nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, info->link_id)) || in nl80211_send_mgmt()
19051 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, KHZ_TO_MHZ(info->freq)) || in nl80211_send_mgmt()
19052 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ_OFFSET, info->freq % 1000) || in nl80211_send_mgmt()
19053 (info->sig_dbm && in nl80211_send_mgmt()
19054 nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, info->sig_dbm)) || in nl80211_send_mgmt()
19055 nla_put(msg, NL80211_ATTR_FRAME, info->len, info->buf) || in nl80211_send_mgmt()
19056 (info->flags && in nl80211_send_mgmt()
19057 nla_put_u32(msg, NL80211_ATTR_RXMGMT_FLAGS, info->flags)) || in nl80211_send_mgmt()
19058 (info->rx_tstamp && nla_put_u64_64bit(msg, in nl80211_send_mgmt()
19060 info->rx_tstamp, in nl80211_send_mgmt()
19062 (info->ack_tstamp && nla_put_u64_64bit(msg, in nl80211_send_mgmt()
19064 info->ack_tstamp, in nl80211_send_mgmt()
19070 return genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); in nl80211_send_mgmt()
19074 return -ENOBUFS; in nl80211_send_mgmt()
19081 struct wiphy *wiphy = wdev->wiphy; in nl80211_frame_tx_status()
19083 struct net_device *netdev = wdev->netdev; in nl80211_frame_tx_status()
19088 trace_cfg80211_mgmt_tx_status(wdev, status->cookie, in nl80211_frame_tx_status()
19089 status->ack); in nl80211_frame_tx_status()
19091 trace_cfg80211_control_port_tx_status(wdev, status->cookie, in nl80211_frame_tx_status()
19092 status->ack); in nl80211_frame_tx_status()
19094 msg = nlmsg_new(100 + status->len, gfp); in nl80211_frame_tx_status()
19104 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_frame_tx_status()
19106 netdev->ifindex)) || in nl80211_frame_tx_status()
19109 nla_put(msg, NL80211_ATTR_FRAME, status->len, status->buf) || in nl80211_frame_tx_status()
19110 nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, status->cookie, in nl80211_frame_tx_status()
19112 (status->ack && nla_put_flag(msg, NL80211_ATTR_ACK)) || in nl80211_frame_tx_status()
19113 (status->tx_tstamp && in nl80211_frame_tx_status()
19115 status->tx_tstamp, NL80211_ATTR_PAD)) || in nl80211_frame_tx_status()
19116 (status->ack_tstamp && in nl80211_frame_tx_status()
19118 status->ack_tstamp, NL80211_ATTR_PAD))) in nl80211_frame_tx_status()
19123 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_frame_tx_status()
19160 struct wireless_dev *wdev = dev->ieee80211_ptr; in __nl80211_rx_control_port()
19161 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in __nl80211_rx_control_port()
19163 const u8 *addr = ehdr->h_source; in __nl80211_rx_control_port()
19164 u16 proto = be16_to_cpu(skb->protocol); in __nl80211_rx_control_port()
19169 u32 nlportid = READ_ONCE(wdev->conn_owner_nlportid); in __nl80211_rx_control_port()
19172 return -ENOENT; in __nl80211_rx_control_port()
19174 msg = nlmsg_new(100 + skb->len, gfp); in __nl80211_rx_control_port()
19176 return -ENOMEM; in __nl80211_rx_control_port()
19181 return -ENOBUFS; in __nl80211_rx_control_port()
19184 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in __nl80211_rx_control_port()
19185 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in __nl80211_rx_control_port()
19196 frame = nla_reserve(msg, NL80211_ATTR_FRAME, skb->len); in __nl80211_rx_control_port()
19200 skb_copy_bits(skb, 0, nla_data(frame), skb->len); in __nl80211_rx_control_port()
19203 return genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); in __nl80211_rx_control_port()
19207 return -ENOBUFS; in __nl80211_rx_control_port()
19226 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_prepare_cqm()
19227 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_prepare_cqm()
19234 cb = (void **)msg->cb; in cfg80211_prepare_cqm()
19242 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_prepare_cqm()
19243 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) in cfg80211_prepare_cqm()
19263 void **cb = (void **)msg->cb; in cfg80211_send_cqm()
19269 memset(msg->cb, 0, sizeof(msg->cb)); in cfg80211_send_cqm()
19271 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_send_cqm()
19279 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_cqm_rssi_notify()
19289 cqm_config = rcu_dereference(wdev->cqm_config); in cfg80211_cqm_rssi_notify()
19291 cqm_config->last_rssi_event_value = rssi_level; in cfg80211_cqm_rssi_notify()
19292 cqm_config->last_rssi_event_type = rssi_event; in cfg80211_cqm_rssi_notify()
19293 wiphy_work_queue(wdev->wiphy, &wdev->cqm_rssi_work); in cfg80211_cqm_rssi_notify()
19309 cqm_config = wiphy_dereference(wdev->wiphy, wdev->cqm_config); in cfg80211_cqm_rssi_notify_work()
19313 if (cqm_config->use_range_api) in cfg80211_cqm_rssi_notify_work()
19314 cfg80211_cqm_rssi_update(rdev, wdev->netdev, cqm_config); in cfg80211_cqm_rssi_notify_work()
19316 rssi_level = cqm_config->last_rssi_event_value; in cfg80211_cqm_rssi_notify_work()
19317 rssi_event = cqm_config->last_rssi_event_type; in cfg80211_cqm_rssi_notify_work()
19319 msg = cfg80211_prepare_cqm(wdev->netdev, NULL, GFP_KERNEL); in cfg80211_cqm_rssi_notify_work()
19425 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_gtk_rekey_notify()
19426 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_gtk_rekey_notify()
19442 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_gtk_rekey_notify()
19453 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_gtk_rekey_notify()
19454 struct wiphy *wiphy = wdev->wiphy; in cfg80211_gtk_rekey_notify()
19481 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_pmksa_candidate_notify()
19482 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex)) in nl80211_pmksa_candidate_notify()
19499 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_pmksa_candidate_notify()
19510 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_pmksa_candidate_notify()
19511 struct wiphy *wiphy = wdev->wiphy; in cfg80211_pmksa_candidate_notify()
19527 struct wireless_dev *wdev = netdev->ieee80211_ptr; in nl80211_ch_switch_notify()
19541 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex)) in nl80211_ch_switch_notify()
19544 if (wdev->valid_links && in nl80211_ch_switch_notify()
19561 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_ch_switch_notify()
19573 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_ch_switch_notify()
19574 struct wiphy *wiphy = wdev->wiphy; in cfg80211_ch_switch_notify()
19577 lockdep_assert_wiphy(wdev->wiphy); in cfg80211_ch_switch_notify()
19582 switch (wdev->iftype) { in cfg80211_ch_switch_notify()
19585 if (!WARN_ON(!wdev->links[link_id].client.current_bss)) in cfg80211_ch_switch_notify()
19587 chandef->chan); in cfg80211_ch_switch_notify()
19590 wdev->u.mesh.chandef = *chandef; in cfg80211_ch_switch_notify()
19591 wdev->u.mesh.preset_chandef = *chandef; in cfg80211_ch_switch_notify()
19595 wdev->links[link_id].ap.chandef = *chandef; in cfg80211_ch_switch_notify()
19598 wdev->u.ibss.chandef = *chandef; in cfg80211_ch_switch_notify()
19618 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_ch_switch_started_notify()
19619 struct wiphy *wiphy = wdev->wiphy; in cfg80211_ch_switch_started_notify()
19622 lockdep_assert_wiphy(wdev->wiphy); in cfg80211_ch_switch_started_notify()
19638 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_bss_color_notify()
19639 struct wiphy *wiphy = wdev->wiphy; in cfg80211_bss_color_notify()
19644 lockdep_assert_wiphy(wdev->wiphy); in cfg80211_bss_color_notify()
19650 return -ENOMEM; in cfg80211_bss_color_notify()
19656 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) in cfg80211_bss_color_notify()
19659 if (wdev->valid_links && in cfg80211_bss_color_notify()
19674 return genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), in cfg80211_bss_color_notify()
19679 return -EINVAL; in cfg80211_bss_color_notify()
19702 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx)) in nl80211_radar_notify()
19707 struct wireless_dev *wdev = netdev->ieee80211_ptr; in nl80211_radar_notify()
19709 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_radar_notify()
19723 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_radar_notify()
19736 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_sta_opmode_change_notify()
19737 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_sta_opmode_change_notify()
19753 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx)) in cfg80211_sta_opmode_change_notify()
19756 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) in cfg80211_sta_opmode_change_notify()
19762 if ((sta_opmode->changed & STA_OPMODE_SMPS_MODE_CHANGED) && in cfg80211_sta_opmode_change_notify()
19763 nla_put_u8(msg, NL80211_ATTR_SMPS_MODE, sta_opmode->smps_mode)) in cfg80211_sta_opmode_change_notify()
19766 if ((sta_opmode->changed & STA_OPMODE_MAX_BW_CHANGED) && in cfg80211_sta_opmode_change_notify()
19767 nla_put_u32(msg, NL80211_ATTR_CHANNEL_WIDTH, sta_opmode->bw)) in cfg80211_sta_opmode_change_notify()
19770 if ((sta_opmode->changed & STA_OPMODE_N_SS_CHANGED) && in cfg80211_sta_opmode_change_notify()
19771 nla_put_u8(msg, NL80211_ATTR_NSS, sta_opmode->rx_nss)) in cfg80211_sta_opmode_change_notify()
19776 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_sta_opmode_change_notify()
19790 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_probe_status()
19791 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_probe_status()
19808 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_probe_status()
19809 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in cfg80211_probe_status()
19820 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_probe_status()
19839 spin_lock_bh(&rdev->beacon_registrations_lock); in cfg80211_report_obss_beacon_khz()
19840 list_for_each_entry(reg, &rdev->beacon_registrations, list) { in cfg80211_report_obss_beacon_khz()
19843 spin_unlock_bh(&rdev->beacon_registrations_lock); in cfg80211_report_obss_beacon_khz()
19851 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_report_obss_beacon_khz()
19864 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, reg->nlportid); in cfg80211_report_obss_beacon_khz()
19866 spin_unlock_bh(&rdev->beacon_registrations_lock); in cfg80211_report_obss_beacon_khz()
19870 spin_unlock_bh(&rdev->beacon_registrations_lock); in cfg80211_report_obss_beacon_khz()
19879 struct cfg80211_wowlan_nd_info *nd = wakeup->net_detect; in cfg80211_net_detect_results()
19886 return -EMSGSIZE; in cfg80211_net_detect_results()
19888 for (i = 0; i < nd->n_matches; i++) { in cfg80211_net_detect_results()
19889 struct cfg80211_wowlan_nd_match *match = nd->matches[i]; in cfg80211_net_detect_results()
19902 if (nla_put(msg, NL80211_ATTR_SSID, match->ssid.ssid_len, in cfg80211_net_detect_results()
19903 match->ssid.ssid)) { in cfg80211_net_detect_results()
19908 if (match->n_channels) { in cfg80211_net_detect_results()
19916 for (j = 0; j < match->n_channels; j++) { in cfg80211_net_detect_results()
19917 if (nla_put_u32(msg, j, match->channels[j])) { in cfg80211_net_detect_results()
19939 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_report_wowlan_wakeup()
19944 trace_cfg80211_report_wowlan_wakeup(wdev->wiphy, wdev, wakeup); in cfg80211_report_wowlan_wakeup()
19947 size += wakeup->packet_present_len; in cfg80211_report_wowlan_wakeup()
19957 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_report_wowlan_wakeup()
19962 if (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, in cfg80211_report_wowlan_wakeup()
19963 wdev->netdev->ifindex)) in cfg80211_report_wowlan_wakeup()
19974 if (wakeup->disconnect && in cfg80211_report_wowlan_wakeup()
19977 if (wakeup->magic_pkt && in cfg80211_report_wowlan_wakeup()
19980 if (wakeup->gtk_rekey_failure && in cfg80211_report_wowlan_wakeup()
19983 if (wakeup->eap_identity_req && in cfg80211_report_wowlan_wakeup()
19986 if (wakeup->four_way_handshake && in cfg80211_report_wowlan_wakeup()
19989 if (wakeup->rfkill_release && in cfg80211_report_wowlan_wakeup()
19993 if (wakeup->pattern_idx >= 0 && in cfg80211_report_wowlan_wakeup()
19995 wakeup->pattern_idx)) in cfg80211_report_wowlan_wakeup()
19998 if (wakeup->tcp_match && in cfg80211_report_wowlan_wakeup()
20002 if (wakeup->tcp_connlost && in cfg80211_report_wowlan_wakeup()
20006 if (wakeup->tcp_nomoretokens && in cfg80211_report_wowlan_wakeup()
20011 if (wakeup->unprot_deauth_disassoc && in cfg80211_report_wowlan_wakeup()
20016 if (wakeup->packet) { in cfg80211_report_wowlan_wakeup()
20020 if (!wakeup->packet_80211) { in cfg80211_report_wowlan_wakeup()
20027 if (wakeup->packet_len && in cfg80211_report_wowlan_wakeup()
20028 nla_put_u32(msg, len_attr, wakeup->packet_len)) in cfg80211_report_wowlan_wakeup()
20031 if (nla_put(msg, pkt_attr, wakeup->packet_present_len, in cfg80211_report_wowlan_wakeup()
20032 wakeup->packet)) in cfg80211_report_wowlan_wakeup()
20036 if (wakeup->net_detect && in cfg80211_report_wowlan_wakeup()
20045 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_report_wowlan_wakeup()
20059 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_tdls_oper_request()
20060 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_tdls_oper_request()
20064 trace_cfg80211_tdls_oper_request(wdev->wiphy, dev, peer, oper, in cfg80211_tdls_oper_request()
20077 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_tdls_oper_request()
20078 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in cfg80211_tdls_oper_request()
20087 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_tdls_oper_request()
20105 if (state != NETLINK_URELEASE || notify->protocol != NETLINK_GENERIC) in nl80211_netlink_notify()
20114 &rdev->sched_scan_req_list, in nl80211_netlink_notify()
20116 if (sched_scan_req->owner_nlportid == notify->portid) { in nl80211_netlink_notify()
20117 sched_scan_req->nl_owner_dead = true; in nl80211_netlink_notify()
20118 wiphy_work_queue(&rdev->wiphy, in nl80211_netlink_notify()
20119 &rdev->sched_scan_stop_wk); in nl80211_netlink_notify()
20123 list_for_each_entry_rcu(wdev, &rdev->wiphy.wdev_list, list) { in nl80211_netlink_notify()
20124 cfg80211_mlme_unregister_socket(wdev, notify->portid); in nl80211_netlink_notify()
20126 if (wdev->owner_nlportid == notify->portid) { in nl80211_netlink_notify()
20127 wdev->nl_owner_dead = true; in nl80211_netlink_notify()
20128 schedule_work(&rdev->destroy_work); in nl80211_netlink_notify()
20129 } else if (wdev->conn_owner_nlportid == notify->portid) { in nl80211_netlink_notify()
20130 schedule_work(&wdev->disconnect_wk); in nl80211_netlink_notify()
20133 cfg80211_release_pmsr(wdev, notify->portid); in nl80211_netlink_notify()
20136 spin_lock_bh(&rdev->beacon_registrations_lock); in nl80211_netlink_notify()
20137 list_for_each_entry_safe(reg, tmp, &rdev->beacon_registrations, in nl80211_netlink_notify()
20139 if (reg->nlportid == notify->portid) { in nl80211_netlink_notify()
20140 list_del(&reg->list); in nl80211_netlink_notify()
20145 spin_unlock_bh(&rdev->beacon_registrations_lock); in nl80211_netlink_notify()
20154 regulatory_netlink_notify(notify->portid); in nl80211_netlink_notify()
20165 struct wiphy *wiphy = netdev->ieee80211_ptr->wiphy; in cfg80211_ft_event()
20172 if (!ft_event->target_ap) in cfg80211_ft_event()
20175 msg = nlmsg_new(100 + ft_event->ies_len + ft_event->ric_ies_len, in cfg80211_ft_event()
20184 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_ft_event()
20185 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in cfg80211_ft_event()
20186 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, ft_event->target_ap)) in cfg80211_ft_event()
20189 if (ft_event->ies && in cfg80211_ft_event()
20190 nla_put(msg, NL80211_ATTR_IE, ft_event->ies_len, ft_event->ies)) in cfg80211_ft_event()
20192 if (ft_event->ric_ies && in cfg80211_ft_event()
20193 nla_put(msg, NL80211_ATTR_IE_RIC, ft_event->ric_ies_len, in cfg80211_ft_event()
20194 ft_event->ric_ies)) in cfg80211_ft_event()
20199 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_ft_event()
20214 rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_crit_proto_stopped()
20215 if (!rdev->crit_proto_nlportid) in cfg80211_crit_proto_stopped()
20218 nlportid = rdev->crit_proto_nlportid; in cfg80211_crit_proto_stopped()
20219 rdev->crit_proto_nlportid = 0; in cfg80211_crit_proto_stopped()
20229 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_crit_proto_stopped()
20236 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); in cfg80211_crit_proto_stopped()
20246 struct wiphy *wiphy = wdev->wiphy; in nl80211_send_ap_stopped()
20259 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_ap_stopped()
20260 nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex) || in nl80211_send_ap_stopped()
20263 (wdev->valid_links && in nl80211_send_ap_stopped()
20280 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_external_auth_request()
20281 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_external_auth_request()
20285 if (!wdev->conn_owner_nlportid) in cfg80211_external_auth_request()
20286 return -EINVAL; in cfg80211_external_auth_request()
20290 return -ENOMEM; in cfg80211_external_auth_request()
20296 /* Some historical mistakes in drivers <-> userspace interface (notably in cfg80211_external_auth_request()
20297 * between drivers and wpa_supplicant) led to a big-endian conversion in cfg80211_external_auth_request()
20301 * in big-endian. Note that newer wpa_supplicant will also detect this in cfg80211_external_auth_request()
20304 if (params->key_mgmt_suite == WLAN_AKM_SUITE_SAE) { in cfg80211_external_auth_request()
20310 params->key_mgmt_suite)) in cfg80211_external_auth_request()
20314 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_external_auth_request()
20315 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in cfg80211_external_auth_request()
20317 params->action) || in cfg80211_external_auth_request()
20318 nla_put(msg, NL80211_ATTR_BSSID, ETH_ALEN, params->bssid) || in cfg80211_external_auth_request()
20319 nla_put(msg, NL80211_ATTR_SSID, params->ssid.ssid_len, in cfg80211_external_auth_request()
20320 params->ssid.ssid) || in cfg80211_external_auth_request()
20321 (!is_zero_ether_addr(params->mld_addr) && in cfg80211_external_auth_request()
20322 nla_put(msg, NL80211_ATTR_MLD_ADDR, ETH_ALEN, params->mld_addr))) in cfg80211_external_auth_request()
20326 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, in cfg80211_external_auth_request()
20327 wdev->conn_owner_nlportid); in cfg80211_external_auth_request()
20332 return -ENOBUFS; in cfg80211_external_auth_request()
20340 struct wiphy *wiphy = netdev->ieee80211_ptr->wiphy; in cfg80211_update_owe_info_event()
20355 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_update_owe_info_event()
20356 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in cfg80211_update_owe_info_event()
20357 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, owe_info->peer)) in cfg80211_update_owe_info_event()
20360 if (!owe_info->ie_len || in cfg80211_update_owe_info_event()
20361 nla_put(msg, NL80211_ATTR_IE, owe_info->ie_len, owe_info->ie)) in cfg80211_update_owe_info_event()
20364 if (owe_info->assoc_link_id != -1) { in cfg80211_update_owe_info_event()
20366 owe_info->assoc_link_id)) in cfg80211_update_owe_info_event()
20369 if (!is_zero_ether_addr(owe_info->peer_mld_addr) && in cfg80211_update_owe_info_event()
20371 owe_info->peer_mld_addr)) in cfg80211_update_owe_info_event()
20377 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_update_owe_info_event()
20389 struct wiphy *wiphy = wdev->wiphy; in cfg80211_schedule_channels_check()
20392 if (wdev->iftype == NL80211_IFTYPE_STATION && in cfg80211_schedule_channels_check()
20396 wiphy->regulatory_flags & REGULATORY_ENABLE_RELAX_NO_IR))) in cfg80211_schedule_channels_check()