Lines Matching +full:rx +full:- +full:level +full:- +full:trig
1 // SPDX-License-Identifier: GPL-2.0-only
3 * This is the new netlink-based wireless configuration interface.
5 * Copyright 2006-2010 Johannes Berg <johannes@sipsolutions.net>
6 * Copyright 2013-2014 Intel Mobile Communications GmbH
7 * Copyright 2015-2017 Intel Deutschland GmbH
8 * Copyright (C) 2018-2021 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()
444 .len = 20-1 },
470 [NL80211_ATTR_IFNAME] = { .type = NLA_NUL_STRING, .len = IFNAMSIZ-1 },
500 NLA_POLICY_MAX(NLA_U8, NUM_NL80211_PLINK_ACTIONS - 1),
579 NLA_POLICY_MAX(NLA_U8, NUM_NL80211_PLINK_STATES - 1),
674 [NL80211_ATTR_TSID] = NLA_POLICY_MAX(NLA_U8, IEEE80211_NUM_TIDS - 1),
676 NLA_POLICY_MAX(NLA_U8, IEEE80211_NUM_UPS - 1),
688 NLA_POLICY_MAX(NLA_U8, NUM_NL80211_P2P_PS_STATUS - 1),
736 [NL80211_ATTR_VLAN_ID] = NLA_POLICY_RANGE(NLA_U16, 1, VLAN_N_VID - 2),
776 [NL80211_KEY_TYPE] = NLA_POLICY_MAX(NLA_U32, NUM_NL80211_KEYTYPES - 1),
931 if (!cb->args[0]) { in nl80211_prepare_wdev_dump()
937 return -ENOMEM; in nl80211_prepare_wdev_dump()
939 err = nlmsg_parse_deprecated(cb->nlh, in nl80211_prepare_wdev_dump()
949 *wdev = __cfg80211_wdev_from_attrs(NULL, sock_net(cb->skb->sk), in nl80211_prepare_wdev_dump()
956 *rdev = wiphy_to_rdev((*wdev)->wiphy); in nl80211_prepare_wdev_dump()
957 mutex_lock(&(*rdev)->wiphy.mtx); in nl80211_prepare_wdev_dump()
959 /* 0 is the first index - add 1 to parse only once */ in nl80211_prepare_wdev_dump()
960 cb->args[0] = (*rdev)->wiphy_idx + 1; in nl80211_prepare_wdev_dump()
961 cb->args[1] = (*wdev)->identifier; in nl80211_prepare_wdev_dump()
968 wiphy = wiphy_idx_to_wiphy(cb->args[0] - 1); in nl80211_prepare_wdev_dump()
971 return -ENODEV; in nl80211_prepare_wdev_dump()
976 list_for_each_entry(tmp, &(*rdev)->wiphy.wdev_list, list) { in nl80211_prepare_wdev_dump()
977 if (tmp->identifier == cb->args[1]) { in nl80211_prepare_wdev_dump()
985 return -ENODEV; in nl80211_prepare_wdev_dump()
987 mutex_lock(&(*rdev)->wiphy.mtx); in nl80211_prepare_wdev_dump()
1019 rule->wmm_rule.client[j].cw_min) || in nl80211_msg_put_wmm_rules()
1021 rule->wmm_rule.client[j].cw_max) || in nl80211_msg_put_wmm_rules()
1023 rule->wmm_rule.client[j].aifsn) || in nl80211_msg_put_wmm_rules()
1025 rule->wmm_rule.client[j].cot)) in nl80211_msg_put_wmm_rules()
1035 return -ENOBUFS; in nl80211_msg_put_wmm_rules()
1043 * list to protect old user-space tools from breaking in nl80211_msg_put_channel()
1045 if (!large && chan->flags & in nl80211_msg_put_channel()
1048 if (!large && chan->freq_offset) in nl80211_msg_put_channel()
1052 chan->center_freq)) in nl80211_msg_put_channel()
1055 if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_OFFSET, chan->freq_offset)) in nl80211_msg_put_channel()
1058 if ((chan->flags & IEEE80211_CHAN_DISABLED) && in nl80211_msg_put_channel()
1061 if (chan->flags & IEEE80211_CHAN_NO_IR) { in nl80211_msg_put_channel()
1067 if (chan->flags & IEEE80211_CHAN_RADAR) { in nl80211_msg_put_channel()
1073 time = elapsed_jiffies_msecs(chan->dfs_state_entered); in nl80211_msg_put_channel()
1076 chan->dfs_state)) in nl80211_msg_put_channel()
1083 chan->dfs_cac_ms)) in nl80211_msg_put_channel()
1089 if ((chan->flags & IEEE80211_CHAN_NO_HT40MINUS) && in nl80211_msg_put_channel()
1092 if ((chan->flags & IEEE80211_CHAN_NO_HT40PLUS) && in nl80211_msg_put_channel()
1095 if ((chan->flags & IEEE80211_CHAN_NO_80MHZ) && in nl80211_msg_put_channel()
1098 if ((chan->flags & IEEE80211_CHAN_NO_160MHZ) && in nl80211_msg_put_channel()
1101 if ((chan->flags & IEEE80211_CHAN_INDOOR_ONLY) && in nl80211_msg_put_channel()
1104 if ((chan->flags & IEEE80211_CHAN_IR_CONCURRENT) && in nl80211_msg_put_channel()
1107 if ((chan->flags & IEEE80211_CHAN_NO_20MHZ) && in nl80211_msg_put_channel()
1110 if ((chan->flags & IEEE80211_CHAN_NO_10MHZ) && in nl80211_msg_put_channel()
1113 if ((chan->flags & IEEE80211_CHAN_NO_HE) && in nl80211_msg_put_channel()
1116 if ((chan->flags & IEEE80211_CHAN_1MHZ) && in nl80211_msg_put_channel()
1119 if ((chan->flags & IEEE80211_CHAN_2MHZ) && in nl80211_msg_put_channel()
1122 if ((chan->flags & IEEE80211_CHAN_4MHZ) && in nl80211_msg_put_channel()
1125 if ((chan->flags & IEEE80211_CHAN_8MHZ) && in nl80211_msg_put_channel()
1128 if ((chan->flags & IEEE80211_CHAN_16MHZ) && in nl80211_msg_put_channel()
1134 DBM_TO_MBM(chan->max_power))) in nl80211_msg_put_channel()
1139 freq_reg_info(wiphy, MHZ_TO_KHZ(chan->center_freq)); in nl80211_msg_put_channel()
1141 if (!IS_ERR_OR_NULL(rule) && rule->has_wmm) { in nl80211_msg_put_channel()
1150 return -ENOBUFS; in nl80211_msg_put_channel()
1160 if (txqstats->filled & BIT(NL80211_TXQ_STATS_ ## attr) && \ in nl80211_put_txq_stats()
1161 nla_put_u32(msg, NL80211_TXQ_STATS_ ## attr, txqstats->memb)) \ in nl80211_put_txq_stats()
1202 info->extack); in nl80211_parse_key_new()
1206 k->def = !!tb[NL80211_KEY_DEFAULT]; in nl80211_parse_key_new()
1207 k->defmgmt = !!tb[NL80211_KEY_DEFAULT_MGMT]; in nl80211_parse_key_new()
1208 k->defbeacon = !!tb[NL80211_KEY_DEFAULT_BEACON]; in nl80211_parse_key_new()
1210 if (k->def) { in nl80211_parse_key_new()
1211 k->def_uni = true; in nl80211_parse_key_new()
1212 k->def_multi = true; in nl80211_parse_key_new()
1214 if (k->defmgmt || k->defbeacon) in nl80211_parse_key_new()
1215 k->def_multi = true; in nl80211_parse_key_new()
1218 k->idx = nla_get_u8(tb[NL80211_KEY_IDX]); in nl80211_parse_key_new()
1221 k->p.key = nla_data(tb[NL80211_KEY_DATA]); in nl80211_parse_key_new()
1222 k->p.key_len = nla_len(tb[NL80211_KEY_DATA]); in nl80211_parse_key_new()
1226 k->p.seq = nla_data(tb[NL80211_KEY_SEQ]); in nl80211_parse_key_new()
1227 k->p.seq_len = nla_len(tb[NL80211_KEY_SEQ]); in nl80211_parse_key_new()
1231 k->p.cipher = nla_get_u32(tb[NL80211_KEY_CIPHER]); in nl80211_parse_key_new()
1234 k->type = nla_get_u32(tb[NL80211_KEY_TYPE]); in nl80211_parse_key_new()
1240 NUM_NL80211_KEY_DEFAULT_TYPES - 1, in nl80211_parse_key_new()
1243 info->extack); in nl80211_parse_key_new()
1247 k->def_uni = kdt[NL80211_KEY_DEFAULT_TYPE_UNICAST]; in nl80211_parse_key_new()
1248 k->def_multi = kdt[NL80211_KEY_DEFAULT_TYPE_MULTICAST]; in nl80211_parse_key_new()
1252 k->p.mode = nla_get_u8(tb[NL80211_KEY_MODE]); in nl80211_parse_key_new()
1259 if (info->attrs[NL80211_ATTR_KEY_DATA]) { in nl80211_parse_key_old()
1260 k->p.key = nla_data(info->attrs[NL80211_ATTR_KEY_DATA]); in nl80211_parse_key_old()
1261 k->p.key_len = nla_len(info->attrs[NL80211_ATTR_KEY_DATA]); in nl80211_parse_key_old()
1264 if (info->attrs[NL80211_ATTR_KEY_SEQ]) { in nl80211_parse_key_old()
1265 k->p.seq = nla_data(info->attrs[NL80211_ATTR_KEY_SEQ]); in nl80211_parse_key_old()
1266 k->p.seq_len = nla_len(info->attrs[NL80211_ATTR_KEY_SEQ]); in nl80211_parse_key_old()
1269 if (info->attrs[NL80211_ATTR_KEY_IDX]) in nl80211_parse_key_old()
1270 k->idx = nla_get_u8(info->attrs[NL80211_ATTR_KEY_IDX]); in nl80211_parse_key_old()
1272 if (info->attrs[NL80211_ATTR_KEY_CIPHER]) in nl80211_parse_key_old()
1273 k->p.cipher = nla_get_u32(info->attrs[NL80211_ATTR_KEY_CIPHER]); in nl80211_parse_key_old()
1275 k->def = !!info->attrs[NL80211_ATTR_KEY_DEFAULT]; in nl80211_parse_key_old()
1276 k->defmgmt = !!info->attrs[NL80211_ATTR_KEY_DEFAULT_MGMT]; in nl80211_parse_key_old()
1278 if (k->def) { in nl80211_parse_key_old()
1279 k->def_uni = true; in nl80211_parse_key_old()
1280 k->def_multi = true; in nl80211_parse_key_old()
1282 if (k->defmgmt) in nl80211_parse_key_old()
1283 k->def_multi = true; in nl80211_parse_key_old()
1285 if (info->attrs[NL80211_ATTR_KEY_TYPE]) in nl80211_parse_key_old()
1286 k->type = nla_get_u32(info->attrs[NL80211_ATTR_KEY_TYPE]); in nl80211_parse_key_old()
1288 if (info->attrs[NL80211_ATTR_KEY_DEFAULT_TYPES]) { in nl80211_parse_key_old()
1291 NUM_NL80211_KEY_DEFAULT_TYPES - 1, in nl80211_parse_key_old()
1292 info->attrs[NL80211_ATTR_KEY_DEFAULT_TYPES], in nl80211_parse_key_old()
1294 info->extack); in nl80211_parse_key_old()
1298 k->def_uni = kdt[NL80211_KEY_DEFAULT_TYPE_UNICAST]; in nl80211_parse_key_old()
1299 k->def_multi = kdt[NL80211_KEY_DEFAULT_TYPE_MULTICAST]; in nl80211_parse_key_old()
1310 k->idx = -1; in nl80211_parse_key()
1311 k->type = -1; in nl80211_parse_key()
1313 if (info->attrs[NL80211_ATTR_KEY]) in nl80211_parse_key()
1314 err = nl80211_parse_key_new(info, info->attrs[NL80211_ATTR_KEY], k); in nl80211_parse_key()
1321 if ((k->def ? 1 : 0) + (k->defmgmt ? 1 : 0) + in nl80211_parse_key()
1322 (k->defbeacon ? 1 : 0) > 1) { in nl80211_parse_key()
1325 return -EINVAL; in nl80211_parse_key()
1328 if (k->defmgmt || k->defbeacon) { in nl80211_parse_key()
1329 if (k->def_uni || !k->def_multi) { in nl80211_parse_key()
1332 return -EINVAL; in nl80211_parse_key()
1336 if (k->idx != -1) { in nl80211_parse_key()
1337 if (k->defmgmt) { in nl80211_parse_key()
1338 if (k->idx < 4 || k->idx > 5) { in nl80211_parse_key()
1341 return -EINVAL; in nl80211_parse_key()
1343 } else if (k->defbeacon) { in nl80211_parse_key()
1344 if (k->idx < 6 || k->idx > 7) { in nl80211_parse_key()
1347 return -EINVAL; in nl80211_parse_key()
1349 } else if (k->def) { in nl80211_parse_key()
1350 if (k->idx < 0 || k->idx > 3) { in nl80211_parse_key()
1351 GENL_SET_ERR_MSG(info, "def key idx not 0-3"); in nl80211_parse_key()
1352 return -EINVAL; in nl80211_parse_key()
1355 if (k->idx < 0 || k->idx > 7) { in nl80211_parse_key()
1356 GENL_SET_ERR_MSG(info, "key idx not 0-7"); in nl80211_parse_key()
1357 return -EINVAL; in nl80211_parse_key()
1369 struct nlattr *keys = info->attrs[NL80211_ATTR_KEYS]; in nl80211_parse_connkeys()
1386 return ERR_PTR(-ENOMEM); in nl80211_parse_connkeys()
1388 result->def = -1; in nl80211_parse_connkeys()
1392 parse.idx = -1; in nl80211_parse_connkeys()
1397 err = -EINVAL; in nl80211_parse_connkeys()
1401 GENL_SET_ERR_MSG(info, "key index out of range [0-3]"); in nl80211_parse_connkeys()
1411 result->def = parse.idx; in nl80211_parse_connkeys()
1423 err = -EINVAL; in nl80211_parse_connkeys()
1426 result->params[parse.idx].cipher = parse.p.cipher; in nl80211_parse_connkeys()
1427 result->params[parse.idx].key_len = parse.p.key_len; in nl80211_parse_connkeys()
1428 result->params[parse.idx].key = result->data[parse.idx]; in nl80211_parse_connkeys()
1429 memcpy(result->data[parse.idx], parse.p.key, parse.p.key_len); in nl80211_parse_connkeys()
1436 if (result->def < 0) { in nl80211_parse_connkeys()
1437 err = -EINVAL; in nl80211_parse_connkeys()
1452 switch (wdev->iftype) { in nl80211_key_allowed()
1461 if (!wdev->current_bss) in nl80211_key_allowed()
1462 return -ENOLINK; in nl80211_key_allowed()
1471 return -EINVAL; in nl80211_key_allowed()
1483 if (!chan || chan->flags & IEEE80211_CHAN_DISABLED) in nl80211_get_valid_chan()
1508 return -ENOBUFS; in nl80211_put_iftypes()
1523 for (i = 0; i < wiphy->n_iface_combinations; i++) { in nl80211_put_iface_combinations()
1527 c = &wiphy->iface_combinations[i]; in nl80211_put_iface_combinations()
1538 for (j = 0; j < c->n_limits; j++) { in nl80211_put_iface_combinations()
1545 c->limits[j].max)) in nl80211_put_iface_combinations()
1548 c->limits[j].types)) in nl80211_put_iface_combinations()
1555 if (c->beacon_int_infra_match && in nl80211_put_iface_combinations()
1559 c->num_different_channels) || in nl80211_put_iface_combinations()
1561 c->max_interfaces)) in nl80211_put_iface_combinations()
1565 c->radar_detect_widths) || in nl80211_put_iface_combinations()
1567 c->radar_detect_regions))) in nl80211_put_iface_combinations()
1569 if (c->beacon_int_min_gcd && in nl80211_put_iface_combinations()
1571 c->beacon_int_min_gcd)) in nl80211_put_iface_combinations()
1581 return -ENOBUFS; in nl80211_put_iface_combinations()
1588 const struct wiphy_wowlan_tcp_support *tcp = rdev->wiphy.wowlan->tcp; in nl80211_send_wowlan_tcp_caps()
1597 return -ENOBUFS; in nl80211_send_wowlan_tcp_caps()
1600 tcp->data_payload_max)) in nl80211_send_wowlan_tcp_caps()
1601 return -ENOBUFS; in nl80211_send_wowlan_tcp_caps()
1604 tcp->data_payload_max)) in nl80211_send_wowlan_tcp_caps()
1605 return -ENOBUFS; in nl80211_send_wowlan_tcp_caps()
1607 if (tcp->seq && nla_put_flag(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ)) in nl80211_send_wowlan_tcp_caps()
1608 return -ENOBUFS; in nl80211_send_wowlan_tcp_caps()
1610 if (tcp->tok && nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN, in nl80211_send_wowlan_tcp_caps()
1611 sizeof(*tcp->tok), tcp->tok)) in nl80211_send_wowlan_tcp_caps()
1612 return -ENOBUFS; in nl80211_send_wowlan_tcp_caps()
1615 tcp->data_interval_max)) in nl80211_send_wowlan_tcp_caps()
1616 return -ENOBUFS; in nl80211_send_wowlan_tcp_caps()
1619 tcp->wake_payload_max)) in nl80211_send_wowlan_tcp_caps()
1620 return -ENOBUFS; in nl80211_send_wowlan_tcp_caps()
1632 if (!rdev->wiphy.wowlan) in nl80211_send_wowlan()
1638 return -ENOBUFS; in nl80211_send_wowlan()
1640 if (((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_ANY) && in nl80211_send_wowlan()
1642 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_DISCONNECT) && in nl80211_send_wowlan()
1644 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_MAGIC_PKT) && in nl80211_send_wowlan()
1646 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_SUPPORTS_GTK_REKEY) && in nl80211_send_wowlan()
1648 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_GTK_REKEY_FAILURE) && in nl80211_send_wowlan()
1650 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_EAP_IDENTITY_REQ) && in nl80211_send_wowlan()
1652 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_4WAY_HANDSHAKE) && in nl80211_send_wowlan()
1654 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_RFKILL_RELEASE) && in nl80211_send_wowlan()
1656 return -ENOBUFS; in nl80211_send_wowlan()
1658 if (rdev->wiphy.wowlan->n_patterns) { in nl80211_send_wowlan()
1660 .max_patterns = rdev->wiphy.wowlan->n_patterns, in nl80211_send_wowlan()
1661 .min_pattern_len = rdev->wiphy.wowlan->pattern_min_len, in nl80211_send_wowlan()
1662 .max_pattern_len = rdev->wiphy.wowlan->pattern_max_len, in nl80211_send_wowlan()
1663 .max_pkt_offset = rdev->wiphy.wowlan->max_pkt_offset, in nl80211_send_wowlan()
1668 return -ENOBUFS; in nl80211_send_wowlan()
1671 if ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_NET_DETECT) && in nl80211_send_wowlan()
1673 rdev->wiphy.wowlan->max_nd_match_sets)) in nl80211_send_wowlan()
1674 return -ENOBUFS; in nl80211_send_wowlan()
1677 return -ENOBUFS; in nl80211_send_wowlan()
1690 if (!rdev->wiphy.coalesce) in nl80211_send_coalesce()
1693 rule.max_rules = rdev->wiphy.coalesce->n_rules; in nl80211_send_coalesce()
1694 rule.max_delay = rdev->wiphy.coalesce->max_delay; in nl80211_send_coalesce()
1695 rule.pat.max_patterns = rdev->wiphy.coalesce->n_patterns; in nl80211_send_coalesce()
1696 rule.pat.min_pattern_len = rdev->wiphy.coalesce->pattern_min_len; in nl80211_send_coalesce()
1697 rule.pat.max_pattern_len = rdev->wiphy.coalesce->pattern_max_len; in nl80211_send_coalesce()
1698 rule.pat.max_pkt_offset = rdev->wiphy.coalesce->max_pkt_offset; in nl80211_send_coalesce()
1701 return -ENOBUFS; in nl80211_send_coalesce()
1711 const struct ieee80211_sta_he_cap *he_cap = &iftdata->he_cap; in nl80211_send_iftype_data()
1714 iftdata->types_mask)) in nl80211_send_iftype_data()
1715 return -ENOBUFS; in nl80211_send_iftype_data()
1717 if (he_cap->has_he) { in nl80211_send_iftype_data()
1719 sizeof(he_cap->he_cap_elem.mac_cap_info), in nl80211_send_iftype_data()
1720 he_cap->he_cap_elem.mac_cap_info) || in nl80211_send_iftype_data()
1722 sizeof(he_cap->he_cap_elem.phy_cap_info), in nl80211_send_iftype_data()
1723 he_cap->he_cap_elem.phy_cap_info) || in nl80211_send_iftype_data()
1725 sizeof(he_cap->he_mcs_nss_supp), in nl80211_send_iftype_data()
1726 &he_cap->he_mcs_nss_supp) || in nl80211_send_iftype_data()
1728 sizeof(he_cap->ppe_thres), he_cap->ppe_thres)) in nl80211_send_iftype_data()
1729 return -ENOBUFS; in nl80211_send_iftype_data()
1732 if (sband->band == NL80211_BAND_6GHZ && in nl80211_send_iftype_data()
1734 sizeof(iftdata->he_6ghz_capa), in nl80211_send_iftype_data()
1735 &iftdata->he_6ghz_capa)) in nl80211_send_iftype_data()
1736 return -ENOBUFS; in nl80211_send_iftype_data()
1738 if (iftdata->vendor_elems.data && iftdata->vendor_elems.len && in nl80211_send_iftype_data()
1740 iftdata->vendor_elems.len, iftdata->vendor_elems.data)) in nl80211_send_iftype_data()
1741 return -ENOBUFS; in nl80211_send_iftype_data()
1755 if (sband->ht_cap.ht_supported && in nl80211_send_band_rateinfo()
1757 sizeof(sband->ht_cap.mcs), in nl80211_send_band_rateinfo()
1758 &sband->ht_cap.mcs) || in nl80211_send_band_rateinfo()
1760 sband->ht_cap.cap) || in nl80211_send_band_rateinfo()
1762 sband->ht_cap.ampdu_factor) || in nl80211_send_band_rateinfo()
1764 sband->ht_cap.ampdu_density))) in nl80211_send_band_rateinfo()
1765 return -ENOBUFS; in nl80211_send_band_rateinfo()
1768 if (sband->vht_cap.vht_supported && in nl80211_send_band_rateinfo()
1770 sizeof(sband->vht_cap.vht_mcs), in nl80211_send_band_rateinfo()
1771 &sband->vht_cap.vht_mcs) || in nl80211_send_band_rateinfo()
1773 sband->vht_cap.cap))) in nl80211_send_band_rateinfo()
1774 return -ENOBUFS; in nl80211_send_band_rateinfo()
1776 if (large && sband->n_iftype_data) { in nl80211_send_band_rateinfo()
1783 return -ENOBUFS; in nl80211_send_band_rateinfo()
1785 for (i = 0; i < sband->n_iftype_data; i++) { in nl80211_send_band_rateinfo()
1790 return -ENOBUFS; in nl80211_send_band_rateinfo()
1793 &sband->iftype_data[i]); in nl80211_send_band_rateinfo()
1804 if (large && sband->edmg_cap.channels && in nl80211_send_band_rateinfo()
1806 sband->edmg_cap.channels) || in nl80211_send_band_rateinfo()
1808 sband->edmg_cap.bw_config))) in nl80211_send_band_rateinfo()
1810 return -ENOBUFS; in nl80211_send_band_rateinfo()
1815 return -ENOBUFS; in nl80211_send_band_rateinfo()
1817 for (i = 0; i < sband->n_bitrates; i++) { in nl80211_send_band_rateinfo()
1820 return -ENOBUFS; in nl80211_send_band_rateinfo()
1822 rate = &sband->bitrates[i]; in nl80211_send_band_rateinfo()
1824 rate->bitrate)) in nl80211_send_band_rateinfo()
1825 return -ENOBUFS; in nl80211_send_band_rateinfo()
1826 if ((rate->flags & IEEE80211_RATE_SHORT_PREAMBLE) && in nl80211_send_band_rateinfo()
1829 return -ENOBUFS; in nl80211_send_band_rateinfo()
1853 return -ENOBUFS; in nl80211_send_mgmt_stypes()
1858 return -ENOBUFS; in nl80211_send_mgmt_stypes()
1865 return -ENOBUFS; in nl80211_send_mgmt_stypes()
1876 return -ENOBUFS; in nl80211_send_mgmt_stypes()
1881 return -ENOBUFS; in nl80211_send_mgmt_stypes()
1883 stypes = mgmt_stypes[ift].rx; in nl80211_send_mgmt_stypes()
1888 return -ENOBUFS; in nl80211_send_mgmt_stypes()
1901 if (rdev->ops->op) { \
1935 if (rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL) in nl80211_add_commands_unsplit()
1940 if (rdev->wiphy.flags & WIPHY_FLAG_NETNS_OK) { in nl80211_add_commands_unsplit()
1945 if (rdev->ops->set_monitor_channel || rdev->ops->start_ap || in nl80211_add_commands_unsplit()
1946 rdev->ops->join_mesh) { in nl80211_add_commands_unsplit()
1951 if (rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) { in nl80211_add_commands_unsplit()
1955 if (rdev->wiphy.max_sched_scan_reqs) in nl80211_add_commands_unsplit()
1959 if (rdev->wiphy.flags & WIPHY_FLAG_REPORTS_OBSS) { in nl80211_add_commands_unsplit()
1970 if (rdev->ops->connect || rdev->ops->auth) { in nl80211_add_commands_unsplit()
1976 if (rdev->ops->disconnect || rdev->ops->deauth) { in nl80211_add_commands_unsplit()
1984 return -ENOBUFS; in nl80211_add_commands_unsplit()
1993 if (!cap->ftm.supported) in nl80211_send_pmsr_ftm_capa()
1998 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
2000 if (cap->ftm.asap && nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_ASAP)) in nl80211_send_pmsr_ftm_capa()
2001 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
2002 if (cap->ftm.non_asap && in nl80211_send_pmsr_ftm_capa()
2004 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
2005 if (cap->ftm.request_lci && in nl80211_send_pmsr_ftm_capa()
2007 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
2008 if (cap->ftm.request_civicloc && in nl80211_send_pmsr_ftm_capa()
2010 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
2012 cap->ftm.preambles)) in nl80211_send_pmsr_ftm_capa()
2013 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
2015 cap->ftm.bandwidths)) in nl80211_send_pmsr_ftm_capa()
2016 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
2017 if (cap->ftm.max_bursts_exponent >= 0 && in nl80211_send_pmsr_ftm_capa()
2019 cap->ftm.max_bursts_exponent)) in nl80211_send_pmsr_ftm_capa()
2020 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
2021 if (cap->ftm.max_ftms_per_burst && in nl80211_send_pmsr_ftm_capa()
2023 cap->ftm.max_ftms_per_burst)) in nl80211_send_pmsr_ftm_capa()
2024 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
2025 if (cap->ftm.trigger_based && in nl80211_send_pmsr_ftm_capa()
2027 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
2028 if (cap->ftm.non_trigger_based && in nl80211_send_pmsr_ftm_capa()
2030 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
2039 const struct cfg80211_pmsr_capabilities *cap = rdev->wiphy.pmsr_capa; in nl80211_send_pmsr_capa()
2052 return -ENOBUFS; in nl80211_send_pmsr_capa()
2054 if (nla_put_u32(msg, NL80211_PMSR_ATTR_MAX_PEERS, cap->max_peers)) in nl80211_send_pmsr_capa()
2055 return -ENOBUFS; in nl80211_send_pmsr_capa()
2057 if (cap->report_ap_tsf && in nl80211_send_pmsr_capa()
2059 return -ENOBUFS; in nl80211_send_pmsr_capa()
2061 if (cap->randomize_mac_addr && in nl80211_send_pmsr_capa()
2063 return -ENOBUFS; in nl80211_send_pmsr_capa()
2067 return -ENOBUFS; in nl80211_send_pmsr_capa()
2070 return -ENOBUFS; in nl80211_send_pmsr_capa()
2086 if (!rdev->wiphy.num_iftype_akm_suites || in nl80211_put_iftype_akm_suites()
2087 !rdev->wiphy.iftype_akm_suites) in nl80211_put_iftype_akm_suites()
2092 return -ENOBUFS; in nl80211_put_iftype_akm_suites()
2094 for (i = 0; i < rdev->wiphy.num_iftype_akm_suites; i++) { in nl80211_put_iftype_akm_suites()
2097 return -ENOBUFS; in nl80211_put_iftype_akm_suites()
2099 iftype_akms = &rdev->wiphy.iftype_akm_suites[i]; in nl80211_put_iftype_akm_suites()
2102 iftype_akms->iftypes_mask)) in nl80211_put_iftype_akm_suites()
2103 return -ENOBUFS; in nl80211_put_iftype_akm_suites()
2106 sizeof(u32) * iftype_akms->n_akm_suites, in nl80211_put_iftype_akm_suites()
2107 iftype_akms->akm_suites)) { in nl80211_put_iftype_akm_suites()
2108 return -ENOBUFS; in nl80211_put_iftype_akm_suites()
2124 if (!rdev->wiphy.tid_config_support.vif && in nl80211_put_tid_config_support()
2125 !rdev->wiphy.tid_config_support.peer) in nl80211_put_tid_config_support()
2130 return -ENOSPC; in nl80211_put_tid_config_support()
2132 if (rdev->wiphy.tid_config_support.vif && in nl80211_put_tid_config_support()
2134 rdev->wiphy.tid_config_support.vif, in nl80211_put_tid_config_support()
2138 if (rdev->wiphy.tid_config_support.peer && in nl80211_put_tid_config_support()
2140 rdev->wiphy.tid_config_support.peer, in nl80211_put_tid_config_support()
2146 rdev->wiphy.tid_config_support.max_retry)) in nl80211_put_tid_config_support()
2149 rdev->wiphy.tid_config_support.max_retry)) in nl80211_put_tid_config_support()
2157 return -ENOBUFS; in nl80211_put_tid_config_support()
2168 if (!rdev->wiphy.sar_capa) in nl80211_put_sar_specs()
2171 num_freq_ranges = rdev->wiphy.sar_capa->num_freq_ranges; in nl80211_put_sar_specs()
2175 return -ENOSPC; in nl80211_put_sar_specs()
2177 if (nla_put_u32(msg, NL80211_SAR_ATTR_TYPE, rdev->wiphy.sar_capa->type)) in nl80211_put_sar_specs()
2191 rdev->wiphy.sar_capa->freq_ranges[i].start_freq)) in nl80211_put_sar_specs()
2195 rdev->wiphy.sar_capa->freq_ranges[i].end_freq)) in nl80211_put_sar_specs()
2207 return -ENOBUFS; in nl80211_put_sar_specs()
2230 rdev->wiphy.mgmt_stypes; in nl80211_send_wiphy()
2235 return -ENOBUFS; in nl80211_send_wiphy()
2238 return -EINVAL; in nl80211_send_wiphy()
2240 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_wiphy()
2242 wiphy_name(&rdev->wiphy)) || in nl80211_send_wiphy()
2250 switch (state->split_start) { in nl80211_send_wiphy()
2253 rdev->wiphy.retry_short) || in nl80211_send_wiphy()
2255 rdev->wiphy.retry_long) || in nl80211_send_wiphy()
2257 rdev->wiphy.frag_threshold) || in nl80211_send_wiphy()
2259 rdev->wiphy.rts_threshold) || in nl80211_send_wiphy()
2261 rdev->wiphy.coverage_class) || in nl80211_send_wiphy()
2263 rdev->wiphy.max_scan_ssids) || in nl80211_send_wiphy()
2265 rdev->wiphy.max_sched_scan_ssids) || in nl80211_send_wiphy()
2267 rdev->wiphy.max_scan_ie_len) || in nl80211_send_wiphy()
2269 rdev->wiphy.max_sched_scan_ie_len) || in nl80211_send_wiphy()
2271 rdev->wiphy.max_match_sets)) in nl80211_send_wiphy()
2274 if ((rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN) && in nl80211_send_wiphy()
2277 if ((rdev->wiphy.flags & WIPHY_FLAG_MESH_AUTH) && in nl80211_send_wiphy()
2280 if ((rdev->wiphy.flags & WIPHY_FLAG_AP_UAPSD) && in nl80211_send_wiphy()
2283 if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_FW_ROAM) && in nl80211_send_wiphy()
2286 if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) && in nl80211_send_wiphy()
2289 if ((rdev->wiphy.flags & WIPHY_FLAG_TDLS_EXTERNAL_SETUP) && in nl80211_send_wiphy()
2292 state->split_start++; in nl80211_send_wiphy()
2293 if (state->split) in nl80211_send_wiphy()
2298 sizeof(u32) * rdev->wiphy.n_cipher_suites, in nl80211_send_wiphy()
2299 rdev->wiphy.cipher_suites)) in nl80211_send_wiphy()
2303 rdev->wiphy.max_num_pmkids)) in nl80211_send_wiphy()
2306 if ((rdev->wiphy.flags & WIPHY_FLAG_CONTROL_PORT_PROTOCOL) && in nl80211_send_wiphy()
2311 rdev->wiphy.available_antennas_tx) || in nl80211_send_wiphy()
2313 rdev->wiphy.available_antennas_rx)) in nl80211_send_wiphy()
2316 if ((rdev->wiphy.flags & WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD) && in nl80211_send_wiphy()
2318 rdev->wiphy.probe_resp_offload)) in nl80211_send_wiphy()
2321 if ((rdev->wiphy.available_antennas_tx || in nl80211_send_wiphy()
2322 rdev->wiphy.available_antennas_rx) && in nl80211_send_wiphy()
2323 rdev->ops->get_antenna) { in nl80211_send_wiphy()
2339 state->split_start++; in nl80211_send_wiphy()
2340 if (state->split) in nl80211_send_wiphy()
2345 rdev->wiphy.interface_modes)) in nl80211_send_wiphy()
2347 state->split_start++; in nl80211_send_wiphy()
2348 if (state->split) in nl80211_send_wiphy()
2357 for (band = state->band_start; in nl80211_send_wiphy()
2358 band < (state->split ? in nl80211_send_wiphy()
2365 if (band > NL80211_BAND_5GHZ && !state->split) in nl80211_send_wiphy()
2368 sband = rdev->wiphy.bands[band]; in nl80211_send_wiphy()
2377 switch (state->chan_start) { in nl80211_send_wiphy()
2380 state->split)) in nl80211_send_wiphy()
2382 state->chan_start++; in nl80211_send_wiphy()
2383 if (state->split) in nl80211_send_wiphy()
2393 for (i = state->chan_start - 1; in nl80211_send_wiphy()
2394 i < sband->n_channels; in nl80211_send_wiphy()
2401 chan = &sband->channels[i]; in nl80211_send_wiphy()
2404 msg, &rdev->wiphy, chan, in nl80211_send_wiphy()
2405 state->split)) in nl80211_send_wiphy()
2409 if (state->split) in nl80211_send_wiphy()
2412 if (i < sband->n_channels) in nl80211_send_wiphy()
2413 state->chan_start = i + 2; in nl80211_send_wiphy()
2415 state->chan_start = 0; in nl80211_send_wiphy()
2421 if (state->split) { in nl80211_send_wiphy()
2423 if (state->chan_start) in nl80211_send_wiphy()
2424 band--; in nl80211_send_wiphy()
2431 state->band_start = band + 1; in nl80211_send_wiphy()
2433 state->band_start = 0; in nl80211_send_wiphy()
2436 if (state->band_start == 0 && state->chan_start == 0) in nl80211_send_wiphy()
2437 state->split_start++; in nl80211_send_wiphy()
2438 if (state->split) in nl80211_send_wiphy()
2450 if (state->split) { in nl80211_send_wiphy()
2453 if (rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH) in nl80211_send_wiphy()
2456 if (rdev->wiphy.features & in nl80211_send_wiphy()
2462 if (rdev->wiphy.sar_capa) in nl80211_send_wiphy()
2468 state->split_start++; in nl80211_send_wiphy()
2469 if (state->split) in nl80211_send_wiphy()
2473 if (rdev->ops->remain_on_channel && in nl80211_send_wiphy()
2474 (rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL) && in nl80211_send_wiphy()
2477 rdev->wiphy.max_remain_on_channel_duration)) in nl80211_send_wiphy()
2480 if ((rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX) && in nl80211_send_wiphy()
2484 state->split_start++; in nl80211_send_wiphy()
2485 if (state->split) in nl80211_send_wiphy()
2490 if (nl80211_send_wowlan(msg, rdev, state->split)) in nl80211_send_wiphy()
2492 state->split_start++; in nl80211_send_wiphy()
2493 if (state->split) in nl80211_send_wiphy()
2496 state->split_start++; in nl80211_send_wiphy()
2501 rdev->wiphy.software_iftypes)) in nl80211_send_wiphy()
2504 if (nl80211_put_iface_combinations(&rdev->wiphy, msg, in nl80211_send_wiphy()
2505 state->split)) in nl80211_send_wiphy()
2508 state->split_start++; in nl80211_send_wiphy()
2509 if (state->split) in nl80211_send_wiphy()
2513 if ((rdev->wiphy.flags & WIPHY_FLAG_HAVE_AP_SME) && in nl80211_send_wiphy()
2515 rdev->wiphy.ap_sme_capa)) in nl80211_send_wiphy()
2518 features = rdev->wiphy.features; in nl80211_send_wiphy()
2520 * We can only add the per-channel limit information if the in nl80211_send_wiphy()
2524 if (state->split) in nl80211_send_wiphy()
2529 if (rdev->wiphy.ht_capa_mod_mask && in nl80211_send_wiphy()
2531 sizeof(*rdev->wiphy.ht_capa_mod_mask), in nl80211_send_wiphy()
2532 rdev->wiphy.ht_capa_mod_mask)) in nl80211_send_wiphy()
2535 if (rdev->wiphy.flags & WIPHY_FLAG_HAVE_AP_SME && in nl80211_send_wiphy()
2536 rdev->wiphy.max_acl_mac_addrs && in nl80211_send_wiphy()
2538 rdev->wiphy.max_acl_mac_addrs)) in nl80211_send_wiphy()
2551 if (state->split) in nl80211_send_wiphy()
2552 state->split_start++; in nl80211_send_wiphy()
2554 state->split_start = 0; in nl80211_send_wiphy()
2561 rdev->wiphy.max_sched_scan_plans) || in nl80211_send_wiphy()
2563 rdev->wiphy.max_sched_scan_plan_interval) || in nl80211_send_wiphy()
2565 rdev->wiphy.max_sched_scan_plan_iterations)) in nl80211_send_wiphy()
2568 if (rdev->wiphy.extended_capabilities && in nl80211_send_wiphy()
2570 rdev->wiphy.extended_capabilities_len, in nl80211_send_wiphy()
2571 rdev->wiphy.extended_capabilities) || in nl80211_send_wiphy()
2573 rdev->wiphy.extended_capabilities_len, in nl80211_send_wiphy()
2574 rdev->wiphy.extended_capabilities_mask))) in nl80211_send_wiphy()
2577 if (rdev->wiphy.vht_capa_mod_mask && in nl80211_send_wiphy()
2579 sizeof(*rdev->wiphy.vht_capa_mod_mask), in nl80211_send_wiphy()
2580 rdev->wiphy.vht_capa_mod_mask)) in nl80211_send_wiphy()
2584 rdev->wiphy.perm_addr)) in nl80211_send_wiphy()
2587 if (!is_zero_ether_addr(rdev->wiphy.addr_mask) && in nl80211_send_wiphy()
2589 rdev->wiphy.addr_mask)) in nl80211_send_wiphy()
2592 if (rdev->wiphy.n_addresses > 1) { in nl80211_send_wiphy()
2599 for (i = 0; i < rdev->wiphy.n_addresses; i++) in nl80211_send_wiphy()
2601 rdev->wiphy.addresses[i].addr)) in nl80211_send_wiphy()
2607 state->split_start++; in nl80211_send_wiphy()
2613 if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_5_10_MHZ) && in nl80211_send_wiphy()
2618 if (rdev->wiphy.max_ap_assoc_sta && in nl80211_send_wiphy()
2620 rdev->wiphy.max_ap_assoc_sta)) in nl80211_send_wiphy()
2623 state->split_start++; in nl80211_send_wiphy()
2626 if (rdev->wiphy.n_vendor_commands) { in nl80211_send_wiphy()
2635 for (i = 0; i < rdev->wiphy.n_vendor_commands; i++) { in nl80211_send_wiphy()
2636 info = &rdev->wiphy.vendor_commands[i].info; in nl80211_send_wiphy()
2643 if (rdev->wiphy.n_vendor_events) { in nl80211_send_wiphy()
2652 for (i = 0; i < rdev->wiphy.n_vendor_events; i++) { in nl80211_send_wiphy()
2653 info = &rdev->wiphy.vendor_events[i]; in nl80211_send_wiphy()
2659 state->split_start++; in nl80211_send_wiphy()
2662 if (rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH && in nl80211_send_wiphy()
2664 rdev->wiphy.max_num_csa_counters)) in nl80211_send_wiphy()
2667 if (rdev->wiphy.regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED && in nl80211_send_wiphy()
2671 if (rdev->wiphy.max_sched_scan_reqs && in nl80211_send_wiphy()
2673 rdev->wiphy.max_sched_scan_reqs)) in nl80211_send_wiphy()
2677 sizeof(rdev->wiphy.ext_features), in nl80211_send_wiphy()
2678 rdev->wiphy.ext_features)) in nl80211_send_wiphy()
2681 if (rdev->wiphy.bss_select_support) { in nl80211_send_wiphy()
2683 u32 bss_select_support = rdev->wiphy.bss_select_support; in nl80211_send_wiphy()
2701 state->split_start++; in nl80211_send_wiphy()
2704 if (rdev->wiphy.num_iftype_ext_capab && in nl80211_send_wiphy()
2705 rdev->wiphy.iftype_ext_capab) { in nl80211_send_wiphy()
2713 for (i = state->capa_start; in nl80211_send_wiphy()
2714 i < rdev->wiphy.num_iftype_ext_capab; i++) { in nl80211_send_wiphy()
2717 capab = &rdev->wiphy.iftype_ext_capab[i]; in nl80211_send_wiphy()
2723 capab->iftype) || in nl80211_send_wiphy()
2725 capab->extended_capabilities_len, in nl80211_send_wiphy()
2726 capab->extended_capabilities) || in nl80211_send_wiphy()
2728 capab->extended_capabilities_len, in nl80211_send_wiphy()
2729 capab->extended_capabilities_mask)) in nl80211_send_wiphy()
2733 if (state->split) in nl80211_send_wiphy()
2737 if (i < rdev->wiphy.num_iftype_ext_capab) { in nl80211_send_wiphy()
2738 state->capa_start = i + 1; in nl80211_send_wiphy()
2744 rdev->wiphy.nan_supported_bands)) in nl80211_send_wiphy()
2747 if (wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_send_wiphy()
2759 rdev->wiphy.txq_limit)) in nl80211_send_wiphy()
2762 rdev->wiphy.txq_memory_limit)) in nl80211_send_wiphy()
2765 rdev->wiphy.txq_quantum)) in nl80211_send_wiphy()
2769 state->split_start++; in nl80211_send_wiphy()
2775 state->split_start++; in nl80211_send_wiphy()
2778 if (rdev->wiphy.akm_suites && in nl80211_send_wiphy()
2780 sizeof(u32) * rdev->wiphy.n_akm_suites, in nl80211_send_wiphy()
2781 rdev->wiphy.akm_suites)) in nl80211_send_wiphy()
2789 state->split_start++; in nl80211_send_wiphy()
2796 state->split_start = 0; in nl80211_send_wiphy()
2805 return -EMSGSIZE; in nl80211_send_wiphy()
2816 return -ENOMEM; in nl80211_dump_wiphy_parse()
2818 ret = nlmsg_parse_deprecated(cb->nlh, in nl80211_dump_wiphy_parse()
2828 state->split = tb[NL80211_ATTR_SPLIT_WIPHY_DUMP]; in nl80211_dump_wiphy_parse()
2830 state->filter_wiphy = nla_get_u32(tb[NL80211_ATTR_WIPHY]); in nl80211_dump_wiphy_parse()
2832 state->filter_wiphy = nla_get_u64(tb[NL80211_ATTR_WDEV]) >> 32; in nl80211_dump_wiphy_parse()
2838 netdev = __dev_get_by_index(sock_net(skb->sk), ifidx); in nl80211_dump_wiphy_parse()
2840 ret = -ENODEV; in nl80211_dump_wiphy_parse()
2843 if (netdev->ieee80211_ptr) { in nl80211_dump_wiphy_parse()
2845 netdev->ieee80211_ptr->wiphy); in nl80211_dump_wiphy_parse()
2846 state->filter_wiphy = rdev->wiphy_idx; in nl80211_dump_wiphy_parse()
2859 struct nl80211_dump_wiphy_state *state = (void *)cb->args[0]; in nl80211_dump_wiphy()
2867 return -ENOMEM; in nl80211_dump_wiphy()
2869 state->filter_wiphy = -1; in nl80211_dump_wiphy()
2876 cb->args[0] = (long)state; in nl80211_dump_wiphy()
2880 if (!net_eq(wiphy_net(&rdev->wiphy), sock_net(skb->sk))) in nl80211_dump_wiphy()
2882 if (++idx <= state->start) in nl80211_dump_wiphy()
2884 if (state->filter_wiphy != -1 && in nl80211_dump_wiphy()
2885 state->filter_wiphy != rdev->wiphy_idx) in nl80211_dump_wiphy()
2891 NETLINK_CB(cb->skb).portid, in nl80211_dump_wiphy()
2892 cb->nlh->nlmsg_seq, in nl80211_dump_wiphy()
2903 * This results in an empty message being RX'ed in nl80211_dump_wiphy()
2908 if ((ret == -ENOBUFS || ret == -EMSGSIZE) && in nl80211_dump_wiphy()
2909 !skb->len && !state->split && in nl80211_dump_wiphy()
2910 cb->min_dump_alloc < 4096) { in nl80211_dump_wiphy()
2911 cb->min_dump_alloc = 4096; in nl80211_dump_wiphy()
2912 state->split_start = 0; in nl80211_dump_wiphy()
2916 idx--; in nl80211_dump_wiphy()
2919 } while (state->split_start > 0); in nl80211_dump_wiphy()
2924 state->start = idx; in nl80211_dump_wiphy()
2926 return skb->len; in nl80211_dump_wiphy()
2931 kfree((void *)cb->args[0]); in nl80211_dump_wiphy_done()
2938 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_wiphy()
2943 return -ENOMEM; in nl80211_get_wiphy()
2946 info->snd_portid, info->snd_seq, 0, in nl80211_get_wiphy()
2949 return -ENOBUFS; in nl80211_get_wiphy()
2971 return -EINVAL; in parse_txq_params()
2974 txq_params->txop = nla_get_u16(tb[NL80211_TXQ_ATTR_TXOP]); in parse_txq_params()
2975 txq_params->cwmin = nla_get_u16(tb[NL80211_TXQ_ATTR_CWMIN]); in parse_txq_params()
2976 txq_params->cwmax = nla_get_u16(tb[NL80211_TXQ_ATTR_CWMAX]); in parse_txq_params()
2977 txq_params->aifs = nla_get_u8(tb[NL80211_TXQ_ATTR_AIFS]); in parse_txq_params()
2980 return -EINVAL; in parse_txq_params()
2981 txq_params->ac = array_index_nospec(ac, NL80211_NUM_ACS); in parse_txq_params()
2994 * low-level driver when the AP starts or the mesh is joined. in nl80211_can_set_dev_channel()
2996 * the channel in the start-ap or join-mesh commands instead. in nl80211_can_set_dev_channel()
3003 wdev->iftype == NL80211_IFTYPE_AP || in nl80211_can_set_dev_channel()
3004 wdev->iftype == NL80211_IFTYPE_MESH_POINT || in nl80211_can_set_dev_channel()
3005 wdev->iftype == NL80211_IFTYPE_MONITOR || in nl80211_can_set_dev_channel()
3006 wdev->iftype == NL80211_IFTYPE_P2P_GO; in nl80211_can_set_dev_channel()
3013 struct netlink_ext_ack *extack = info->extack; in nl80211_parse_chandef()
3014 struct nlattr **attrs = info->attrs; in nl80211_parse_chandef()
3018 return -EINVAL; in nl80211_parse_chandef()
3021 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ])); in nl80211_parse_chandef()
3022 if (info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]) in nl80211_parse_chandef()
3024 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]); in nl80211_parse_chandef()
3027 chandef->chan = ieee80211_get_channel_khz(&rdev->wiphy, control_freq); in nl80211_parse_chandef()
3028 chandef->width = NL80211_CHAN_WIDTH_20_NOHT; in nl80211_parse_chandef()
3029 chandef->center_freq1 = KHZ_TO_MHZ(control_freq); in nl80211_parse_chandef()
3030 chandef->freq1_offset = control_freq % 1000; in nl80211_parse_chandef()
3031 chandef->center_freq2 = 0; in nl80211_parse_chandef()
3034 if (!chandef->chan || chandef->chan->flags & IEEE80211_CHAN_DISABLED) { in nl80211_parse_chandef()
3037 return -EINVAL; in nl80211_parse_chandef()
3050 cfg80211_chandef_create(chandef, chandef->chan, in nl80211_parse_chandef()
3054 chandef->center_freq1 != nla_get_u32(attrs[NL80211_ATTR_CENTER_FREQ1])) { in nl80211_parse_chandef()
3058 return -EINVAL; in nl80211_parse_chandef()
3066 return -EINVAL; in nl80211_parse_chandef()
3073 return -EINVAL; in nl80211_parse_chandef()
3076 chandef->width = in nl80211_parse_chandef()
3079 chandef->center_freq1 = in nl80211_parse_chandef()
3082 chandef->freq1_offset = nla_get_u32( in nl80211_parse_chandef()
3085 chandef->freq1_offset = 0; in nl80211_parse_chandef()
3088 chandef->center_freq2 = in nl80211_parse_chandef()
3092 if (info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]) { in nl80211_parse_chandef()
3093 chandef->edmg.channels = in nl80211_parse_chandef()
3094 nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]); in nl80211_parse_chandef()
3096 if (info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]) in nl80211_parse_chandef()
3097 chandef->edmg.bw_config = in nl80211_parse_chandef()
3098 nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]); in nl80211_parse_chandef()
3100 chandef->edmg.bw_config = 0; in nl80211_parse_chandef()
3101 chandef->edmg.channels = 0; in nl80211_parse_chandef()
3106 return -EINVAL; in nl80211_parse_chandef()
3109 if (!cfg80211_chandef_usable(&rdev->wiphy, chandef, in nl80211_parse_chandef()
3112 return -EINVAL; in nl80211_parse_chandef()
3115 if ((chandef->width == NL80211_CHAN_WIDTH_5 || in nl80211_parse_chandef()
3116 chandef->width == NL80211_CHAN_WIDTH_10) && in nl80211_parse_chandef()
3117 !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_5_10_MHZ)) { in nl80211_parse_chandef()
3119 return -EINVAL; in nl80211_parse_chandef()
3135 wdev = dev->ieee80211_ptr; in __nl80211_set_channel()
3137 return -EOPNOTSUPP; in __nl80211_set_channel()
3139 iftype = wdev->iftype; in __nl80211_set_channel()
3148 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &chandef, in __nl80211_set_channel()
3150 result = -EINVAL; in __nl80211_set_channel()
3153 if (wdev->beacon_interval) { in __nl80211_set_channel()
3154 if (!dev || !rdev->ops->set_ap_chanwidth || in __nl80211_set_channel()
3155 !(rdev->wiphy.features & in __nl80211_set_channel()
3157 result = -EBUSY; in __nl80211_set_channel()
3162 if (chandef.chan != wdev->preset_chandef.chan) { in __nl80211_set_channel()
3163 result = -EBUSY; in __nl80211_set_channel()
3170 wdev->preset_chandef = chandef; in __nl80211_set_channel()
3180 result = -EINVAL; in __nl80211_set_channel()
3188 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_channel()
3189 struct net_device *netdev = info->user_ptr[1]; in nl80211_set_channel()
3211 * done for backward compatibility -- previously in nl80211_set_wiphy()
3218 if (info->attrs[NL80211_ATTR_IFINDEX]) { in nl80211_set_wiphy()
3219 int ifindex = nla_get_u32(info->attrs[NL80211_ATTR_IFINDEX]); in nl80211_set_wiphy()
3222 if (netdev && netdev->ieee80211_ptr) in nl80211_set_wiphy()
3223 rdev = wiphy_to_rdev(netdev->ieee80211_ptr->wiphy); in nl80211_set_wiphy()
3230 info->attrs); in nl80211_set_wiphy()
3239 wdev = netdev->ieee80211_ptr; in nl80211_set_wiphy()
3241 wiphy_lock(&rdev->wiphy); in nl80211_set_wiphy()
3248 if (info->attrs[NL80211_ATTR_WIPHY_NAME]) in nl80211_set_wiphy()
3250 rdev, nla_data(info->attrs[NL80211_ATTR_WIPHY_NAME])); in nl80211_set_wiphy()
3256 if (info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS]) { in nl80211_set_wiphy()
3260 if (!rdev->ops->set_txq_params) { in nl80211_set_wiphy()
3261 result = -EOPNOTSUPP; in nl80211_set_wiphy()
3266 result = -EINVAL; in nl80211_set_wiphy()
3270 if (netdev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && in nl80211_set_wiphy()
3271 netdev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) { in nl80211_set_wiphy()
3272 result = -EINVAL; in nl80211_set_wiphy()
3277 result = -ENETDOWN; in nl80211_set_wiphy()
3282 info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS], in nl80211_set_wiphy()
3288 info->extack); in nl80211_set_wiphy()
3302 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { in nl80211_set_wiphy()
3311 if (info->attrs[NL80211_ATTR_WIPHY_TX_POWER_SETTING]) { in nl80211_set_wiphy()
3316 if (!(rdev->wiphy.features & NL80211_FEATURE_VIF_TXPOWER)) in nl80211_set_wiphy()
3319 if (!rdev->ops->set_tx_power) { in nl80211_set_wiphy()
3320 result = -EOPNOTSUPP; in nl80211_set_wiphy()
3325 type = nla_get_u32(info->attrs[idx]); in nl80211_set_wiphy()
3327 if (!info->attrs[NL80211_ATTR_WIPHY_TX_POWER_LEVEL] && in nl80211_set_wiphy()
3329 result = -EINVAL; in nl80211_set_wiphy()
3335 mbm = nla_get_u32(info->attrs[idx]); in nl80211_set_wiphy()
3343 if (info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX] && in nl80211_set_wiphy()
3344 info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]) { in nl80211_set_wiphy()
3347 if ((!rdev->wiphy.available_antennas_tx && in nl80211_set_wiphy()
3348 !rdev->wiphy.available_antennas_rx) || in nl80211_set_wiphy()
3349 !rdev->ops->set_antenna) { in nl80211_set_wiphy()
3350 result = -EOPNOTSUPP; in nl80211_set_wiphy()
3354 tx_ant = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX]); in nl80211_set_wiphy()
3355 rx_ant = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]); in nl80211_set_wiphy()
3359 if ((~tx_ant && (tx_ant & ~rdev->wiphy.available_antennas_tx)) || in nl80211_set_wiphy()
3360 (~rx_ant && (rx_ant & ~rdev->wiphy.available_antennas_rx))) { in nl80211_set_wiphy()
3361 result = -EINVAL; in nl80211_set_wiphy()
3365 tx_ant = tx_ant & rdev->wiphy.available_antennas_tx; in nl80211_set_wiphy()
3366 rx_ant = rx_ant & rdev->wiphy.available_antennas_rx; in nl80211_set_wiphy()
3375 if (info->attrs[NL80211_ATTR_WIPHY_RETRY_SHORT]) { in nl80211_set_wiphy()
3377 info->attrs[NL80211_ATTR_WIPHY_RETRY_SHORT]); in nl80211_set_wiphy()
3382 if (info->attrs[NL80211_ATTR_WIPHY_RETRY_LONG]) { in nl80211_set_wiphy()
3384 info->attrs[NL80211_ATTR_WIPHY_RETRY_LONG]); in nl80211_set_wiphy()
3389 if (info->attrs[NL80211_ATTR_WIPHY_FRAG_THRESHOLD]) { in nl80211_set_wiphy()
3391 info->attrs[NL80211_ATTR_WIPHY_FRAG_THRESHOLD]); in nl80211_set_wiphy()
3393 result = -EINVAL; in nl80211_set_wiphy()
3397 if (frag_threshold != (u32) -1) { in nl80211_set_wiphy()
3409 if (info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]) { in nl80211_set_wiphy()
3411 info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]); in nl80211_set_wiphy()
3415 if (info->attrs[NL80211_ATTR_WIPHY_COVERAGE_CLASS]) { in nl80211_set_wiphy()
3416 if (info->attrs[NL80211_ATTR_WIPHY_DYN_ACK]) { in nl80211_set_wiphy()
3417 result = -EINVAL; in nl80211_set_wiphy()
3422 info->attrs[NL80211_ATTR_WIPHY_COVERAGE_CLASS]); in nl80211_set_wiphy()
3426 if (info->attrs[NL80211_ATTR_WIPHY_DYN_ACK]) { in nl80211_set_wiphy()
3427 if (!(rdev->wiphy.features & NL80211_FEATURE_ACKTO_ESTIMATION)) { in nl80211_set_wiphy()
3428 result = -EOPNOTSUPP; in nl80211_set_wiphy()
3435 if (info->attrs[NL80211_ATTR_TXQ_LIMIT]) { in nl80211_set_wiphy()
3436 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_set_wiphy()
3438 result = -EOPNOTSUPP; in nl80211_set_wiphy()
3442 info->attrs[NL80211_ATTR_TXQ_LIMIT]); in nl80211_set_wiphy()
3446 if (info->attrs[NL80211_ATTR_TXQ_MEMORY_LIMIT]) { in nl80211_set_wiphy()
3447 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_set_wiphy()
3449 result = -EOPNOTSUPP; in nl80211_set_wiphy()
3453 info->attrs[NL80211_ATTR_TXQ_MEMORY_LIMIT]); in nl80211_set_wiphy()
3457 if (info->attrs[NL80211_ATTR_TXQ_QUANTUM]) { in nl80211_set_wiphy()
3458 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_set_wiphy()
3460 result = -EOPNOTSUPP; in nl80211_set_wiphy()
3464 info->attrs[NL80211_ATTR_TXQ_QUANTUM]); in nl80211_set_wiphy()
3474 if (!rdev->ops->set_wiphy_params) { in nl80211_set_wiphy()
3475 result = -EOPNOTSUPP; in nl80211_set_wiphy()
3479 old_retry_short = rdev->wiphy.retry_short; in nl80211_set_wiphy()
3480 old_retry_long = rdev->wiphy.retry_long; in nl80211_set_wiphy()
3481 old_frag_threshold = rdev->wiphy.frag_threshold; in nl80211_set_wiphy()
3482 old_rts_threshold = rdev->wiphy.rts_threshold; in nl80211_set_wiphy()
3483 old_coverage_class = rdev->wiphy.coverage_class; in nl80211_set_wiphy()
3484 old_txq_limit = rdev->wiphy.txq_limit; in nl80211_set_wiphy()
3485 old_txq_memory_limit = rdev->wiphy.txq_memory_limit; in nl80211_set_wiphy()
3486 old_txq_quantum = rdev->wiphy.txq_quantum; in nl80211_set_wiphy()
3489 rdev->wiphy.retry_short = retry_short; in nl80211_set_wiphy()
3491 rdev->wiphy.retry_long = retry_long; in nl80211_set_wiphy()
3493 rdev->wiphy.frag_threshold = frag_threshold; in nl80211_set_wiphy()
3495 rdev->wiphy.rts_threshold = rts_threshold; in nl80211_set_wiphy()
3497 rdev->wiphy.coverage_class = coverage_class; in nl80211_set_wiphy()
3499 rdev->wiphy.txq_limit = txq_limit; in nl80211_set_wiphy()
3501 rdev->wiphy.txq_memory_limit = txq_memory_limit; in nl80211_set_wiphy()
3503 rdev->wiphy.txq_quantum = txq_quantum; in nl80211_set_wiphy()
3507 rdev->wiphy.retry_short = old_retry_short; in nl80211_set_wiphy()
3508 rdev->wiphy.retry_long = old_retry_long; in nl80211_set_wiphy()
3509 rdev->wiphy.frag_threshold = old_frag_threshold; in nl80211_set_wiphy()
3510 rdev->wiphy.rts_threshold = old_rts_threshold; in nl80211_set_wiphy()
3511 rdev->wiphy.coverage_class = old_coverage_class; in nl80211_set_wiphy()
3512 rdev->wiphy.txq_limit = old_txq_limit; in nl80211_set_wiphy()
3513 rdev->wiphy.txq_memory_limit = old_txq_memory_limit; in nl80211_set_wiphy()
3514 rdev->wiphy.txq_quantum = old_txq_quantum; in nl80211_set_wiphy()
3522 wiphy_unlock(&rdev->wiphy); in nl80211_set_wiphy()
3530 return -EINVAL; in nl80211_send_chandef()
3533 chandef->chan->center_freq)) in nl80211_send_chandef()
3534 return -ENOBUFS; in nl80211_send_chandef()
3536 chandef->chan->freq_offset)) in nl80211_send_chandef()
3537 return -ENOBUFS; in nl80211_send_chandef()
3538 switch (chandef->width) { in nl80211_send_chandef()
3544 return -ENOBUFS; in nl80211_send_chandef()
3549 if (nla_put_u32(msg, NL80211_ATTR_CHANNEL_WIDTH, chandef->width)) in nl80211_send_chandef()
3550 return -ENOBUFS; in nl80211_send_chandef()
3551 if (nla_put_u32(msg, NL80211_ATTR_CENTER_FREQ1, chandef->center_freq1)) in nl80211_send_chandef()
3552 return -ENOBUFS; in nl80211_send_chandef()
3553 if (chandef->center_freq2 && in nl80211_send_chandef()
3554 nla_put_u32(msg, NL80211_ATTR_CENTER_FREQ2, chandef->center_freq2)) in nl80211_send_chandef()
3555 return -ENOBUFS; in nl80211_send_chandef()
3564 struct net_device *dev = wdev->netdev; in nl80211_send_iface()
3573 return -1; in nl80211_send_iface()
3576 (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in nl80211_send_iface()
3577 nla_put_string(msg, NL80211_ATTR_IFNAME, dev->name))) in nl80211_send_iface()
3580 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_iface()
3581 nla_put_u32(msg, NL80211_ATTR_IFTYPE, wdev->iftype) || in nl80211_send_iface()
3586 rdev->devlist_generation ^ in nl80211_send_iface()
3588 nla_put_u8(msg, NL80211_ATTR_4ADDR, wdev->use_4addr)) in nl80211_send_iface()
3591 if (rdev->ops->get_channel) { in nl80211_send_iface()
3602 if (rdev->ops->get_tx_power) { in nl80211_send_iface()
3613 switch (wdev->iftype) { in nl80211_send_iface()
3615 if (wdev->ssid_len && in nl80211_send_iface()
3616 nla_put(msg, NL80211_ATTR_SSID, wdev->ssid_len, wdev->ssid)) in nl80211_send_iface()
3623 if (!wdev->current_bss) in nl80211_send_iface()
3626 ssid_ie = ieee80211_bss_get_ie(&wdev->current_bss->pub, in nl80211_send_iface()
3640 if (rdev->ops->get_txq_stats) { in nl80211_send_iface()
3659 return -EMSGSIZE; in nl80211_send_iface()
3666 int wp_start = cb->args[0]; in nl80211_dump_interface()
3667 int if_start = cb->args[1]; in nl80211_dump_interface()
3668 int filter_wiphy = -1; in nl80211_dump_interface()
3674 if (!cb->args[2]) { in nl80211_dump_interface()
3676 .filter_wiphy = -1, in nl80211_dump_interface()
3686 * if filtering, set cb->args[2] to +1 since 0 is the default in nl80211_dump_interface()
3690 cb->args[2] = filter_wiphy + 1; in nl80211_dump_interface()
3692 cb->args[2] = -1; in nl80211_dump_interface()
3693 } else if (cb->args[2] > 0) { in nl80211_dump_interface()
3694 filter_wiphy = cb->args[2] - 1; in nl80211_dump_interface()
3698 if (!net_eq(wiphy_net(&rdev->wiphy), sock_net(skb->sk))) in nl80211_dump_interface()
3705 if (filter_wiphy >= 0 && filter_wiphy != rdev->wiphy_idx) in nl80211_dump_interface()
3710 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) { in nl80211_dump_interface()
3715 if (nl80211_send_iface(skb, NETLINK_CB(cb->skb).portid, in nl80211_dump_interface()
3716 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_dump_interface()
3727 cb->args[0] = wp_idx; in nl80211_dump_interface()
3728 cb->args[1] = if_idx; in nl80211_dump_interface()
3730 ret = skb->len; in nl80211_dump_interface()
3740 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_interface()
3741 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_get_interface()
3745 return -ENOMEM; in nl80211_get_interface()
3747 if (nl80211_send_iface(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_interface()
3750 return -ENOBUFS; in nl80211_get_interface()
3773 return -EINVAL; in parse_monitor_flags()
3776 return -EINVAL; in parse_monitor_flags()
3795 if (info->attrs[NL80211_ATTR_MNTR_FLAGS]) { in nl80211_parse_mon_options()
3797 return -EINVAL; in nl80211_parse_mon_options()
3799 err = parse_monitor_flags(info->attrs[NL80211_ATTR_MNTR_FLAGS], in nl80211_parse_mon_options()
3800 ¶ms->flags); in nl80211_parse_mon_options()
3807 if (params->flags & MONITOR_FLAG_ACTIVE && in nl80211_parse_mon_options()
3808 !(rdev->wiphy.features & NL80211_FEATURE_ACTIVE_MONITOR)) in nl80211_parse_mon_options()
3809 return -EOPNOTSUPP; in nl80211_parse_mon_options()
3811 if (info->attrs[NL80211_ATTR_MU_MIMO_GROUP_DATA]) { in nl80211_parse_mon_options()
3816 return -EINVAL; in nl80211_parse_mon_options()
3818 if (!wiphy_ext_feature_isset(&rdev->wiphy, cap_flag)) in nl80211_parse_mon_options()
3819 return -EOPNOTSUPP; in nl80211_parse_mon_options()
3822 nla_data(info->attrs[NL80211_ATTR_MU_MIMO_GROUP_DATA]); in nl80211_parse_mon_options()
3826 (mumimo_groups[VHT_MUMIMO_GROUPS_DATA_LEN - 1] & BIT(7))) in nl80211_parse_mon_options()
3827 return -EINVAL; in nl80211_parse_mon_options()
3829 params->vht_mumimo_groups = mumimo_groups; in nl80211_parse_mon_options()
3833 if (info->attrs[NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR]) { in nl80211_parse_mon_options()
3837 return -EINVAL; in nl80211_parse_mon_options()
3839 if (!wiphy_ext_feature_isset(&rdev->wiphy, cap_flag)) in nl80211_parse_mon_options()
3840 return -EOPNOTSUPP; in nl80211_parse_mon_options()
3842 params->vht_mumimo_follow_addr = in nl80211_parse_mon_options()
3843 nla_data(info->attrs[NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR]); in nl80211_parse_mon_options()
3856 return -EBUSY; in nl80211_valid_4addr()
3862 if (rdev->wiphy.flags & WIPHY_FLAG_4ADDR_AP) in nl80211_valid_4addr()
3866 if (rdev->wiphy.flags & WIPHY_FLAG_4ADDR_STATION) in nl80211_valid_4addr()
3873 return -EOPNOTSUPP; in nl80211_valid_4addr()
3878 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_interface()
3882 struct net_device *dev = info->user_ptr[1]; in nl80211_set_interface()
3887 otype = ntype = dev->ieee80211_ptr->iftype; in nl80211_set_interface()
3889 if (info->attrs[NL80211_ATTR_IFTYPE]) { in nl80211_set_interface()
3890 ntype = nla_get_u32(info->attrs[NL80211_ATTR_IFTYPE]); in nl80211_set_interface()
3895 if (info->attrs[NL80211_ATTR_MESH_ID]) { in nl80211_set_interface()
3896 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_interface()
3899 return -EINVAL; in nl80211_set_interface()
3901 return -EBUSY; in nl80211_set_interface()
3906 wdev->mesh_id_up_len = in nl80211_set_interface()
3907 nla_len(info->attrs[NL80211_ATTR_MESH_ID]); in nl80211_set_interface()
3908 memcpy(wdev->ssid, nla_data(info->attrs[NL80211_ATTR_MESH_ID]), in nl80211_set_interface()
3909 wdev->mesh_id_up_len); in nl80211_set_interface()
3913 if (info->attrs[NL80211_ATTR_4ADDR]) { in nl80211_set_interface()
3914 params.use_4addr = !!nla_get_u8(info->attrs[NL80211_ATTR_4ADDR]); in nl80211_set_interface()
3920 params.use_4addr = -1; in nl80211_set_interface()
3934 if (!err && params.use_4addr != -1) in nl80211_set_interface()
3935 dev->ieee80211_ptr->use_4addr = params.use_4addr; in nl80211_set_interface()
3938 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_interface()
3948 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in _nl80211_new_interface()
3957 if (!info->attrs[NL80211_ATTR_IFNAME]) in _nl80211_new_interface()
3958 return -EINVAL; in _nl80211_new_interface()
3960 if (info->attrs[NL80211_ATTR_IFTYPE]) in _nl80211_new_interface()
3961 type = nla_get_u32(info->attrs[NL80211_ATTR_IFTYPE]); in _nl80211_new_interface()
3963 if (!rdev->ops->add_virtual_intf) in _nl80211_new_interface()
3964 return -EOPNOTSUPP; in _nl80211_new_interface()
3967 rdev->wiphy.features & NL80211_FEATURE_MAC_ON_CREATE) && in _nl80211_new_interface()
3968 info->attrs[NL80211_ATTR_MAC]) { in _nl80211_new_interface()
3969 nla_memcpy(params.macaddr, info->attrs[NL80211_ATTR_MAC], in _nl80211_new_interface()
3972 return -EADDRNOTAVAIL; in _nl80211_new_interface()
3975 if (info->attrs[NL80211_ATTR_4ADDR]) { in _nl80211_new_interface()
3976 params.use_4addr = !!nla_get_u8(info->attrs[NL80211_ATTR_4ADDR]); in _nl80211_new_interface()
3982 if (!cfg80211_iftype_allowed(&rdev->wiphy, type, params.use_4addr, 0)) in _nl80211_new_interface()
3983 return -EOPNOTSUPP; in _nl80211_new_interface()
3991 return -ENOMEM; in _nl80211_new_interface()
3994 nla_data(info->attrs[NL80211_ATTR_IFNAME]), in _nl80211_new_interface()
3998 return -EPROTO; in _nl80211_new_interface()
4004 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) in _nl80211_new_interface()
4005 wdev->owner_nlportid = info->snd_portid; in _nl80211_new_interface()
4009 if (!info->attrs[NL80211_ATTR_MESH_ID]) in _nl80211_new_interface()
4014 wdev->mesh_id_up_len = in _nl80211_new_interface()
4015 nla_len(info->attrs[NL80211_ATTR_MESH_ID]); in _nl80211_new_interface()
4016 memcpy(wdev->ssid, nla_data(info->attrs[NL80211_ATTR_MESH_ID]), in _nl80211_new_interface()
4017 wdev->mesh_id_up_len); in _nl80211_new_interface()
4033 if (nl80211_send_iface(msg, info->snd_portid, info->snd_seq, 0, in _nl80211_new_interface()
4036 return -ENOBUFS; in _nl80211_new_interface()
4044 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_new_interface()
4050 wiphy_lock(&rdev->wiphy); in nl80211_new_interface()
4052 wiphy_unlock(&rdev->wiphy); in nl80211_new_interface()
4059 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_del_interface()
4060 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_del_interface()
4062 if (!rdev->ops->del_virtual_intf) in nl80211_del_interface()
4063 return -EOPNOTSUPP; in nl80211_del_interface()
4074 mutex_unlock(&rdev->wiphy.mtx); in nl80211_del_interface()
4083 if (!wdev->netdev) in nl80211_del_interface()
4084 info->user_ptr[1] = NULL; in nl80211_del_interface()
4086 dev_close(wdev->netdev); in nl80211_del_interface()
4088 mutex_lock(&rdev->wiphy.mtx); in nl80211_del_interface()
4095 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_noack_map()
4096 struct net_device *dev = info->user_ptr[1]; in nl80211_set_noack_map()
4099 if (!info->attrs[NL80211_ATTR_NOACK_MAP]) in nl80211_set_noack_map()
4100 return -EINVAL; in nl80211_set_noack_map()
4102 if (!rdev->ops->set_noack_map) in nl80211_set_noack_map()
4103 return -EOPNOTSUPP; in nl80211_set_noack_map()
4105 noack_map = nla_get_u16(info->attrs[NL80211_ATTR_NOACK_MAP]); in nl80211_set_noack_map()
4121 if ((params->key && in get_key_callback()
4122 nla_put(cookie->msg, NL80211_ATTR_KEY_DATA, in get_key_callback()
4123 params->key_len, params->key)) || in get_key_callback()
4124 (params->seq && in get_key_callback()
4125 nla_put(cookie->msg, NL80211_ATTR_KEY_SEQ, in get_key_callback()
4126 params->seq_len, params->seq)) || in get_key_callback()
4127 (params->cipher && in get_key_callback()
4128 nla_put_u32(cookie->msg, NL80211_ATTR_KEY_CIPHER, in get_key_callback()
4129 params->cipher))) in get_key_callback()
4132 key = nla_nest_start_noflag(cookie->msg, NL80211_ATTR_KEY); in get_key_callback()
4136 if ((params->key && in get_key_callback()
4137 nla_put(cookie->msg, NL80211_KEY_DATA, in get_key_callback()
4138 params->key_len, params->key)) || in get_key_callback()
4139 (params->seq && in get_key_callback()
4140 nla_put(cookie->msg, NL80211_KEY_SEQ, in get_key_callback()
4141 params->seq_len, params->seq)) || in get_key_callback()
4142 (params->cipher && in get_key_callback()
4143 nla_put_u32(cookie->msg, NL80211_KEY_CIPHER, in get_key_callback()
4144 params->cipher))) in get_key_callback()
4147 if (nla_put_u8(cookie->msg, NL80211_KEY_IDX, cookie->idx)) in get_key_callback()
4150 nla_nest_end(cookie->msg, key); in get_key_callback()
4154 cookie->error = 1; in get_key_callback()
4159 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_key()
4161 struct net_device *dev = info->user_ptr[1]; in nl80211_get_key()
4172 if (wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_get_key()
4176 if ((dev->ieee80211_ptr->iftype == NL80211_IFTYPE_STATION || in nl80211_get_key()
4177 dev->ieee80211_ptr->iftype == NL80211_IFTYPE_P2P_CLIENT) && in nl80211_get_key()
4178 wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_get_key()
4182 if (info->attrs[NL80211_ATTR_KEY_IDX]) { in nl80211_get_key()
4183 key_idx = nla_get_u8(info->attrs[NL80211_ATTR_KEY_IDX]); in nl80211_get_key()
4187 return -EINVAL; in nl80211_get_key()
4191 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_get_key()
4192 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_get_key()
4195 if (info->attrs[NL80211_ATTR_KEY_TYPE]) { in nl80211_get_key()
4196 u32 kt = nla_get_u32(info->attrs[NL80211_ATTR_KEY_TYPE]); in nl80211_get_key()
4200 return -EINVAL; in nl80211_get_key()
4204 if (!rdev->ops->get_key) in nl80211_get_key()
4205 return -EOPNOTSUPP; in nl80211_get_key()
4207 if (!pairwise && mac_addr && !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN)) in nl80211_get_key()
4208 return -ENOENT; in nl80211_get_key()
4212 return -ENOMEM; in nl80211_get_key()
4214 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_key()
4222 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in nl80211_get_key()
4242 err = -ENOBUFS; in nl80211_get_key()
4250 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_key()
4253 struct net_device *dev = info->user_ptr[1]; in nl80211_set_key()
4260 return -EINVAL; in nl80211_set_key()
4267 return -EINVAL; in nl80211_set_key()
4269 wdev_lock(dev->ieee80211_ptr); in nl80211_set_key()
4272 if (!rdev->ops->set_default_key) { in nl80211_set_key()
4273 err = -EOPNOTSUPP; in nl80211_set_key()
4277 err = nl80211_key_allowed(dev->ieee80211_ptr); in nl80211_set_key()
4288 dev->ieee80211_ptr->wext.default_key = key.idx; in nl80211_set_key()
4292 err = -EINVAL; in nl80211_set_key()
4296 if (!rdev->ops->set_default_mgmt_key) { in nl80211_set_key()
4297 err = -EOPNOTSUPP; in nl80211_set_key()
4301 err = nl80211_key_allowed(dev->ieee80211_ptr); in nl80211_set_key()
4310 dev->ieee80211_ptr->wext.default_mgmt_key = key.idx; in nl80211_set_key()
4314 err = -EINVAL; in nl80211_set_key()
4318 if (!rdev->ops->set_default_beacon_key) { in nl80211_set_key()
4319 err = -EOPNOTSUPP; in nl80211_set_key()
4323 err = nl80211_key_allowed(dev->ieee80211_ptr); in nl80211_set_key()
4331 wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_set_key()
4335 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_set_key()
4336 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_set_key()
4339 err = -EINVAL; in nl80211_set_key()
4347 err = -EINVAL; in nl80211_set_key()
4350 wdev_unlock(dev->ieee80211_ptr); in nl80211_set_key()
4357 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_new_key()
4359 struct net_device *dev = info->user_ptr[1]; in nl80211_new_key()
4369 return -EINVAL; in nl80211_new_key()
4372 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_new_key()
4373 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_new_key()
4375 if (key.type == -1) { in nl80211_new_key()
4386 return -EINVAL; in nl80211_new_key()
4390 info->attrs[NL80211_ATTR_VLAN_ID]) in nl80211_new_key()
4391 key.p.vlan_id = nla_get_u16(info->attrs[NL80211_ATTR_VLAN_ID]); in nl80211_new_key()
4393 if (!rdev->ops->add_key) in nl80211_new_key()
4394 return -EOPNOTSUPP; in nl80211_new_key()
4400 return -EINVAL; in nl80211_new_key()
4403 wdev_lock(dev->ieee80211_ptr); in nl80211_new_key()
4404 err = nl80211_key_allowed(dev->ieee80211_ptr); in nl80211_new_key()
4414 wdev_unlock(dev->ieee80211_ptr); in nl80211_new_key()
4421 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_del_key()
4423 struct net_device *dev = info->user_ptr[1]; in nl80211_del_key()
4431 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_del_key()
4432 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_del_key()
4434 if (key.type == -1) { in nl80211_del_key()
4444 return -EINVAL; in nl80211_del_key()
4448 return -EINVAL; in nl80211_del_key()
4450 if (!rdev->ops->del_key) in nl80211_del_key()
4451 return -EOPNOTSUPP; in nl80211_del_key()
4453 wdev_lock(dev->ieee80211_ptr); in nl80211_del_key()
4454 err = nl80211_key_allowed(dev->ieee80211_ptr); in nl80211_del_key()
4457 !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN)) in nl80211_del_key()
4458 err = -ENOENT; in nl80211_del_key()
4467 if (key.idx == dev->ieee80211_ptr->wext.default_key) in nl80211_del_key()
4468 dev->ieee80211_ptr->wext.default_key = -1; in nl80211_del_key()
4469 else if (key.idx == dev->ieee80211_ptr->wext.default_mgmt_key) in nl80211_del_key()
4470 dev->ieee80211_ptr->wext.default_mgmt_key = -1; in nl80211_del_key()
4473 wdev_unlock(dev->ieee80211_ptr); in nl80211_del_key()
4486 return -EINVAL; in validate_acl_mac_addrs()
4507 if (!wiphy->max_acl_mac_addrs) in parse_acl_data()
4508 return ERR_PTR(-EOPNOTSUPP); in parse_acl_data()
4510 if (!info->attrs[NL80211_ATTR_ACL_POLICY]) in parse_acl_data()
4511 return ERR_PTR(-EINVAL); in parse_acl_data()
4513 acl_policy = nla_get_u32(info->attrs[NL80211_ATTR_ACL_POLICY]); in parse_acl_data()
4516 return ERR_PTR(-EINVAL); in parse_acl_data()
4518 if (!info->attrs[NL80211_ATTR_MAC_ADDRS]) in parse_acl_data()
4519 return ERR_PTR(-EINVAL); in parse_acl_data()
4521 n_entries = validate_acl_mac_addrs(info->attrs[NL80211_ATTR_MAC_ADDRS]); in parse_acl_data()
4525 if (n_entries > wiphy->max_acl_mac_addrs) in parse_acl_data()
4526 return ERR_PTR(-ENOTSUPP); in parse_acl_data()
4530 return ERR_PTR(-ENOMEM); in parse_acl_data()
4532 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_MAC_ADDRS], tmp) { in parse_acl_data()
4533 memcpy(acl->mac_addrs[i].addr, nla_data(attr), ETH_ALEN); in parse_acl_data()
4537 acl->n_acl_entries = n_entries; in parse_acl_data()
4538 acl->acl_policy = acl_policy; in parse_acl_data()
4545 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_mac_acl()
4546 struct net_device *dev = info->user_ptr[1]; in nl80211_set_mac_acl()
4550 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && in nl80211_set_mac_acl()
4551 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_set_mac_acl()
4552 return -EOPNOTSUPP; in nl80211_set_mac_acl()
4554 if (!dev->ieee80211_ptr->beacon_interval) in nl80211_set_mac_acl()
4555 return -EINVAL; in nl80211_set_mac_acl()
4557 acl = parse_acl_data(&rdev->wiphy, info); in nl80211_set_mac_acl()
4578 for (ridx = 0; ridx < sband->n_bitrates; ridx++) { in rateset_to_mask()
4580 &sband->bitrates[ridx]; in rateset_to_mask()
4581 if (rate == srate->bitrate) { in rateset_to_mask()
4586 if (ridx == sband->n_bitrates) in rateset_to_mask()
4613 if (sband->ht_cap.mcs.rx_mask[ridx] & rbit) in ht_rateset_to_mask()
4660 u16 tx_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map); in vht_set_mcs_mask()
4664 if (!sband->vht_cap.vht_supported) in vht_set_mcs_mask()
4673 if ((tx_mcs_mask[i] & txrate->mcs[i]) == txrate->mcs[i]) in vht_set_mcs_mask()
4674 mcs[i] = txrate->mcs[i]; in vht_set_mcs_mask()
4713 struct net_device *dev = info->user_ptr[1]; in he_get_txmcsmap()
4714 struct wireless_dev *wdev = dev->ieee80211_ptr; in he_get_txmcsmap()
4717 switch (wdev->chandef.width) { in he_get_txmcsmap()
4719 tx_mcs = he_cap->he_mcs_nss_supp.tx_mcs_80p80; in he_get_txmcsmap()
4722 tx_mcs = he_cap->he_mcs_nss_supp.tx_mcs_160; in he_get_txmcsmap()
4725 tx_mcs = he_cap->he_mcs_nss_supp.tx_mcs_80; in he_get_txmcsmap()
4742 he_cap = ieee80211_get_he_iftype_cap(sband, wdev->iftype); in he_set_mcs_mask()
4754 if ((tx_mcs_mask[i] & txrate->mcs[i]) == txrate->mcs[i]) in he_set_mcs_mask()
4755 mcs[i] = txrate->mcs[i]; in he_set_mcs_mask()
4771 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_parse_tx_bitrate_mask()
4772 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_parse_tx_bitrate_mask()
4786 sband = rdev->wiphy.bands[i]; in nl80211_parse_tx_bitrate_mask()
4791 mask->control[i].legacy = (1 << sband->n_bitrates) - 1; in nl80211_parse_tx_bitrate_mask()
4792 memcpy(mask->control[i].ht_mcs, in nl80211_parse_tx_bitrate_mask()
4793 sband->ht_cap.mcs.rx_mask, in nl80211_parse_tx_bitrate_mask()
4794 sizeof(mask->control[i].ht_mcs)); in nl80211_parse_tx_bitrate_mask()
4796 if (sband->vht_cap.vht_supported) { in nl80211_parse_tx_bitrate_mask()
4797 vht_tx_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map); in nl80211_parse_tx_bitrate_mask()
4798 vht_build_mcs_mask(vht_tx_mcs_map, mask->control[i].vht_mcs); in nl80211_parse_tx_bitrate_mask()
4801 he_cap = ieee80211_get_he_iftype_cap(sband, wdev->iftype); in nl80211_parse_tx_bitrate_mask()
4806 he_build_mcs_mask(he_tx_mcs_map, mask->control[i].he_mcs); in nl80211_parse_tx_bitrate_mask()
4808 mask->control[i].he_gi = 0xFF; in nl80211_parse_tx_bitrate_mask()
4809 mask->control[i].he_ltf = 0xFF; in nl80211_parse_tx_bitrate_mask()
4825 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
4826 sband = rdev->wiphy.bands[band]; in nl80211_parse_tx_bitrate_mask()
4828 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
4832 info->extack); in nl80211_parse_tx_bitrate_mask()
4836 mask->control[band].legacy = rateset_to_mask( in nl80211_parse_tx_bitrate_mask()
4840 if ((mask->control[band].legacy == 0) && in nl80211_parse_tx_bitrate_mask()
4842 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
4849 mask->control[band].ht_mcs)) in nl80211_parse_tx_bitrate_mask()
4850 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
4857 mask->control[band].vht_mcs)) in nl80211_parse_tx_bitrate_mask()
4858 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
4862 mask->control[band].gi = in nl80211_parse_tx_bitrate_mask()
4864 if (mask->control[band].gi > NL80211_TXRATE_FORCE_LGI) in nl80211_parse_tx_bitrate_mask()
4865 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
4870 mask->control[band].he_mcs)) in nl80211_parse_tx_bitrate_mask()
4871 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
4874 mask->control[band].he_gi = in nl80211_parse_tx_bitrate_mask()
4877 mask->control[band].he_ltf = in nl80211_parse_tx_bitrate_mask()
4880 if (mask->control[band].legacy == 0) { in nl80211_parse_tx_bitrate_mask()
4884 if (!(rdev->wiphy.bands[band]->ht_cap.ht_supported || in nl80211_parse_tx_bitrate_mask()
4885 rdev->wiphy.bands[band]->vht_cap.vht_supported || in nl80211_parse_tx_bitrate_mask()
4886 ieee80211_get_he_iftype_cap(sband, wdev->iftype))) in nl80211_parse_tx_bitrate_mask()
4887 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
4890 if (mask->control[band].ht_mcs[i]) in nl80211_parse_tx_bitrate_mask()
4894 if (mask->control[band].vht_mcs[i]) in nl80211_parse_tx_bitrate_mask()
4898 if (mask->control[band].he_mcs[i]) in nl80211_parse_tx_bitrate_mask()
4902 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
4915 u32 rate = beacon_rate->control[band].legacy; in validate_beacon_tx_rate()
4919 return -EINVAL; in validate_beacon_tx_rate()
4923 if (hweight8(beacon_rate->control[band].ht_mcs[i]) > 1) { in validate_beacon_tx_rate()
4924 return -EINVAL; in validate_beacon_tx_rate()
4925 } else if (beacon_rate->control[band].ht_mcs[i]) { in validate_beacon_tx_rate()
4928 return -EINVAL; in validate_beacon_tx_rate()
4931 return -EINVAL; in validate_beacon_tx_rate()
4936 if (hweight16(beacon_rate->control[band].vht_mcs[i]) > 1) { in validate_beacon_tx_rate()
4937 return -EINVAL; in validate_beacon_tx_rate()
4938 } else if (beacon_rate->control[band].vht_mcs[i]) { in validate_beacon_tx_rate()
4941 return -EINVAL; in validate_beacon_tx_rate()
4944 return -EINVAL; in validate_beacon_tx_rate()
4949 if (hweight16(beacon_rate->control[band].he_mcs[i]) > 1) { in validate_beacon_tx_rate()
4950 return -EINVAL; in validate_beacon_tx_rate()
4951 } else if (beacon_rate->control[band].he_mcs[i]) { in validate_beacon_tx_rate()
4954 return -EINVAL; in validate_beacon_tx_rate()
4957 return -EINVAL; in validate_beacon_tx_rate()
4962 return -EINVAL; in validate_beacon_tx_rate()
4965 !wiphy_ext_feature_isset(&rdev->wiphy, in validate_beacon_tx_rate()
4967 return -EINVAL; in validate_beacon_tx_rate()
4969 !wiphy_ext_feature_isset(&rdev->wiphy, in validate_beacon_tx_rate()
4971 return -EINVAL; in validate_beacon_tx_rate()
4973 !wiphy_ext_feature_isset(&rdev->wiphy, in validate_beacon_tx_rate()
4975 return -EINVAL; in validate_beacon_tx_rate()
4977 !wiphy_ext_feature_isset(&rdev->wiphy, in validate_beacon_tx_rate()
4979 return -EINVAL; in validate_beacon_tx_rate()
4994 bcn->head = nla_data(attrs[NL80211_ATTR_BEACON_HEAD]); in nl80211_parse_beacon()
4995 bcn->head_len = nla_len(attrs[NL80211_ATTR_BEACON_HEAD]); in nl80211_parse_beacon()
4996 if (!bcn->head_len) in nl80211_parse_beacon()
4997 return -EINVAL; in nl80211_parse_beacon()
5002 bcn->tail = nla_data(attrs[NL80211_ATTR_BEACON_TAIL]); in nl80211_parse_beacon()
5003 bcn->tail_len = nla_len(attrs[NL80211_ATTR_BEACON_TAIL]); in nl80211_parse_beacon()
5008 return -EINVAL; in nl80211_parse_beacon()
5011 bcn->beacon_ies = nla_data(attrs[NL80211_ATTR_IE]); in nl80211_parse_beacon()
5012 bcn->beacon_ies_len = nla_len(attrs[NL80211_ATTR_IE]); in nl80211_parse_beacon()
5016 bcn->proberesp_ies = in nl80211_parse_beacon()
5018 bcn->proberesp_ies_len = in nl80211_parse_beacon()
5023 bcn->assocresp_ies = in nl80211_parse_beacon()
5025 bcn->assocresp_ies_len = in nl80211_parse_beacon()
5030 bcn->probe_resp = nla_data(attrs[NL80211_ATTR_PROBE_RESP]); in nl80211_parse_beacon()
5031 bcn->probe_resp_len = nla_len(attrs[NL80211_ATTR_PROBE_RESP]); in nl80211_parse_beacon()
5045 wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_parse_beacon()
5047 bcn->ftm_responder = 1; in nl80211_parse_beacon()
5049 return -EOPNOTSUPP; in nl80211_parse_beacon()
5052 bcn->lci = nla_data(tb[NL80211_FTM_RESP_ATTR_LCI]); in nl80211_parse_beacon()
5053 bcn->lci_len = nla_len(tb[NL80211_FTM_RESP_ATTR_LCI]); in nl80211_parse_beacon()
5057 bcn->civicloc = nla_data(tb[NL80211_FTM_RESP_ATTR_CIVICLOC]); in nl80211_parse_beacon()
5058 bcn->civicloc_len = nla_len(tb[NL80211_FTM_RESP_ATTR_CIVICLOC]); in nl80211_parse_beacon()
5061 bcn->ftm_responder = -1; in nl80211_parse_beacon()
5079 return -EINVAL; in nl80211_parse_he_obss_pd()
5081 he_obss_pd->sr_ctrl = nla_get_u8(tb[NL80211_HE_OBSS_PD_ATTR_SR_CTRL]); in nl80211_parse_he_obss_pd()
5084 he_obss_pd->min_offset = in nl80211_parse_he_obss_pd()
5087 he_obss_pd->max_offset = in nl80211_parse_he_obss_pd()
5090 he_obss_pd->non_srg_max_offset = in nl80211_parse_he_obss_pd()
5093 if (he_obss_pd->min_offset > he_obss_pd->max_offset) in nl80211_parse_he_obss_pd()
5094 return -EINVAL; in nl80211_parse_he_obss_pd()
5097 memcpy(he_obss_pd->bss_color_bitmap, in nl80211_parse_he_obss_pd()
5099 sizeof(he_obss_pd->bss_color_bitmap)); in nl80211_parse_he_obss_pd()
5102 memcpy(he_obss_pd->partial_bssid_bitmap, in nl80211_parse_he_obss_pd()
5104 sizeof(he_obss_pd->partial_bssid_bitmap)); in nl80211_parse_he_obss_pd()
5106 he_obss_pd->enable = true; in nl80211_parse_he_obss_pd()
5123 return -EINVAL; in nl80211_parse_he_bss_color()
5125 he_bss_color->color = in nl80211_parse_he_bss_color()
5127 he_bss_color->enabled = in nl80211_parse_he_bss_color()
5129 he_bss_color->partial = in nl80211_parse_he_bss_color()
5141 struct cfg80211_fils_discovery *fd = ¶ms->fils_discovery; in nl80211_parse_fils_discovery()
5143 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_parse_fils_discovery()
5145 return -EINVAL; in nl80211_parse_fils_discovery()
5155 return -EINVAL; in nl80211_parse_fils_discovery()
5157 fd->tmpl_len = nla_len(tb[NL80211_FILS_DISCOVERY_ATTR_TMPL]); in nl80211_parse_fils_discovery()
5158 fd->tmpl = nla_data(tb[NL80211_FILS_DISCOVERY_ATTR_TMPL]); in nl80211_parse_fils_discovery()
5159 fd->min_interval = nla_get_u32(tb[NL80211_FILS_DISCOVERY_ATTR_INT_MIN]); in nl80211_parse_fils_discovery()
5160 fd->max_interval = nla_get_u32(tb[NL80211_FILS_DISCOVERY_ATTR_INT_MAX]); in nl80211_parse_fils_discovery()
5173 ¶ms->unsol_bcast_probe_resp; in nl80211_parse_unsol_bcast_probe_resp()
5175 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_parse_unsol_bcast_probe_resp()
5177 return -EINVAL; in nl80211_parse_unsol_bcast_probe_resp()
5186 return -EINVAL; in nl80211_parse_unsol_bcast_probe_resp()
5188 presp->tmpl = nla_data(tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_TMPL]); in nl80211_parse_unsol_bcast_probe_resp()
5189 presp->tmpl_len = nla_len(tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_TMPL]); in nl80211_parse_unsol_bcast_probe_resp()
5190 presp->interval = nla_get_u32(tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_INT]); in nl80211_parse_unsol_bcast_probe_resp()
5204 params->ht_required = true; in nl80211_check_ap_rate_selectors()
5206 params->vht_required = true; in nl80211_check_ap_rate_selectors()
5208 params->he_required = true; in nl80211_check_ap_rate_selectors()
5210 params->sae_h2e_required = true; in nl80211_check_ap_rate_selectors()
5221 const struct cfg80211_beacon_data *bcn = ¶ms->beacon; in nl80211_calculate_ap_params()
5222 size_t ies_len = bcn->tail_len; in nl80211_calculate_ap_params()
5223 const u8 *ies = bcn->tail; in nl80211_calculate_ap_params()
5234 if (cap && cap[1] >= sizeof(*params->ht_cap)) in nl80211_calculate_ap_params()
5235 params->ht_cap = (void *)(cap + 2); in nl80211_calculate_ap_params()
5237 if (cap && cap[1] >= sizeof(*params->vht_cap)) in nl80211_calculate_ap_params()
5238 params->vht_cap = (void *)(cap + 2); in nl80211_calculate_ap_params()
5240 if (cap && cap[1] >= sizeof(*params->he_cap) + 1) in nl80211_calculate_ap_params()
5241 params->he_cap = (void *)(cap + 3); in nl80211_calculate_ap_params()
5243 if (cap && cap[1] >= sizeof(*params->he_oper) + 1) in nl80211_calculate_ap_params()
5244 params->he_oper = (void *)(cap + 3); in nl80211_calculate_ap_params()
5253 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) { in nl80211_get_ap_channel()
5254 if (wdev->iftype != NL80211_IFTYPE_AP && in nl80211_get_ap_channel()
5255 wdev->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_get_ap_channel()
5258 if (!wdev->preset_chandef.chan) in nl80211_get_ap_channel()
5261 params->chandef = wdev->preset_chandef; in nl80211_get_ap_channel()
5278 if (!(rdev->wiphy.features & NL80211_FEATURE_SAE) && in nl80211_valid_auth_type()
5281 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_valid_auth_type()
5289 if (!(rdev->wiphy.features & NL80211_FEATURE_SAE) && in nl80211_valid_auth_type()
5290 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_valid_auth_type()
5300 &rdev->wiphy, in nl80211_valid_auth_type()
5306 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_valid_auth_type()
5323 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_start_ap()
5324 struct net_device *dev = info->user_ptr[1]; in nl80211_start_ap()
5325 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_start_ap()
5329 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && in nl80211_start_ap()
5330 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_start_ap()
5331 return -EOPNOTSUPP; in nl80211_start_ap()
5333 if (!rdev->ops->start_ap) in nl80211_start_ap()
5334 return -EOPNOTSUPP; in nl80211_start_ap()
5336 if (wdev->beacon_interval) in nl80211_start_ap()
5337 return -EALREADY; in nl80211_start_ap()
5342 if (!info->attrs[NL80211_ATTR_BEACON_INTERVAL] || in nl80211_start_ap()
5343 !info->attrs[NL80211_ATTR_DTIM_PERIOD] || in nl80211_start_ap()
5344 !info->attrs[NL80211_ATTR_BEACON_HEAD]) in nl80211_start_ap()
5345 return -EINVAL; in nl80211_start_ap()
5347 err = nl80211_parse_beacon(rdev, info->attrs, ¶ms.beacon); in nl80211_start_ap()
5352 nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]); in nl80211_start_ap()
5354 nla_get_u32(info->attrs[NL80211_ATTR_DTIM_PERIOD]); in nl80211_start_ap()
5356 err = cfg80211_validate_beacon_int(rdev, dev->ieee80211_ptr->iftype, in nl80211_start_ap()
5366 * additional information -- drivers must check! in nl80211_start_ap()
5368 if (info->attrs[NL80211_ATTR_SSID]) { in nl80211_start_ap()
5369 params.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); in nl80211_start_ap()
5371 nla_len(info->attrs[NL80211_ATTR_SSID]); in nl80211_start_ap()
5373 return -EINVAL; in nl80211_start_ap()
5376 if (info->attrs[NL80211_ATTR_HIDDEN_SSID]) in nl80211_start_ap()
5378 info->attrs[NL80211_ATTR_HIDDEN_SSID]); in nl80211_start_ap()
5380 params.privacy = !!info->attrs[NL80211_ATTR_PRIVACY]; in nl80211_start_ap()
5382 if (info->attrs[NL80211_ATTR_AUTH_TYPE]) { in nl80211_start_ap()
5384 info->attrs[NL80211_ATTR_AUTH_TYPE]); in nl80211_start_ap()
5387 return -EINVAL; in nl80211_start_ap()
5396 if (info->attrs[NL80211_ATTR_INACTIVITY_TIMEOUT]) { in nl80211_start_ap()
5397 if (!(rdev->wiphy.features & NL80211_FEATURE_INACTIVITY_TIMER)) in nl80211_start_ap()
5398 return -EOPNOTSUPP; in nl80211_start_ap()
5400 info->attrs[NL80211_ATTR_INACTIVITY_TIMEOUT]); in nl80211_start_ap()
5403 if (info->attrs[NL80211_ATTR_P2P_CTWINDOW]) { in nl80211_start_ap()
5404 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_start_ap()
5405 return -EINVAL; in nl80211_start_ap()
5407 nla_get_u8(info->attrs[NL80211_ATTR_P2P_CTWINDOW]); in nl80211_start_ap()
5409 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_CTWIN)) in nl80211_start_ap()
5410 return -EINVAL; in nl80211_start_ap()
5413 if (info->attrs[NL80211_ATTR_P2P_OPPPS]) { in nl80211_start_ap()
5416 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_start_ap()
5417 return -EINVAL; in nl80211_start_ap()
5418 tmp = nla_get_u8(info->attrs[NL80211_ATTR_P2P_OPPPS]); in nl80211_start_ap()
5421 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_OPPPS)) in nl80211_start_ap()
5422 return -EINVAL; in nl80211_start_ap()
5425 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { in nl80211_start_ap()
5429 } else if (wdev->preset_chandef.chan) { in nl80211_start_ap()
5430 params.chandef = wdev->preset_chandef; in nl80211_start_ap()
5432 return -EINVAL; in nl80211_start_ap()
5434 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, ¶ms.chandef, in nl80211_start_ap()
5435 wdev->iftype)) in nl80211_start_ap()
5436 return -EINVAL; in nl80211_start_ap()
5438 if (info->attrs[NL80211_ATTR_TX_RATES]) { in nl80211_start_ap()
5439 err = nl80211_parse_tx_bitrate_mask(info, info->attrs, in nl80211_start_ap()
5446 err = validate_beacon_tx_rate(rdev, params.chandef.chan->band, in nl80211_start_ap()
5452 if (info->attrs[NL80211_ATTR_SMPS_MODE]) { in nl80211_start_ap()
5454 nla_get_u8(info->attrs[NL80211_ATTR_SMPS_MODE]); in nl80211_start_ap()
5459 if (!(rdev->wiphy.features & in nl80211_start_ap()
5461 return -EINVAL; in nl80211_start_ap()
5464 if (!(rdev->wiphy.features & in nl80211_start_ap()
5466 return -EINVAL; in nl80211_start_ap()
5469 return -EINVAL; in nl80211_start_ap()
5475 params.pbss = nla_get_flag(info->attrs[NL80211_ATTR_PBSS]); in nl80211_start_ap()
5476 if (params.pbss && !rdev->wiphy.bands[NL80211_BAND_60GHZ]) in nl80211_start_ap()
5477 return -EOPNOTSUPP; in nl80211_start_ap()
5479 if (info->attrs[NL80211_ATTR_ACL_POLICY]) { in nl80211_start_ap()
5480 params.acl = parse_acl_data(&rdev->wiphy, info); in nl80211_start_ap()
5486 nla_get_flag(info->attrs[NL80211_ATTR_TWT_RESPONDER]); in nl80211_start_ap()
5488 if (info->attrs[NL80211_ATTR_HE_OBSS_PD]) { in nl80211_start_ap()
5490 info->attrs[NL80211_ATTR_HE_OBSS_PD], in nl80211_start_ap()
5496 if (info->attrs[NL80211_ATTR_HE_BSS_COLOR]) { in nl80211_start_ap()
5498 info->attrs[NL80211_ATTR_HE_BSS_COLOR], in nl80211_start_ap()
5504 if (info->attrs[NL80211_ATTR_FILS_DISCOVERY]) { in nl80211_start_ap()
5506 info->attrs[NL80211_ATTR_FILS_DISCOVERY], in nl80211_start_ap()
5512 if (info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP]) { in nl80211_start_ap()
5514 rdev, info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP], in nl80211_start_ap()
5522 if (info->attrs[NL80211_ATTR_EXTERNAL_AUTH_SUPPORT]) in nl80211_start_ap()
5528 wdev->preset_chandef = params.chandef; in nl80211_start_ap()
5529 wdev->beacon_interval = params.beacon_interval; in nl80211_start_ap()
5530 wdev->chandef = params.chandef; in nl80211_start_ap()
5531 wdev->ssid_len = params.ssid_len; in nl80211_start_ap()
5532 memcpy(wdev->ssid, params.ssid, wdev->ssid_len); in nl80211_start_ap()
5534 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) in nl80211_start_ap()
5535 wdev->conn_owner_nlportid = info->snd_portid; in nl80211_start_ap()
5547 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_beacon()
5548 struct net_device *dev = info->user_ptr[1]; in nl80211_set_beacon()
5549 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_beacon()
5553 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && in nl80211_set_beacon()
5554 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_set_beacon()
5555 return -EOPNOTSUPP; in nl80211_set_beacon()
5557 if (!rdev->ops->change_beacon) in nl80211_set_beacon()
5558 return -EOPNOTSUPP; in nl80211_set_beacon()
5560 if (!wdev->beacon_interval) in nl80211_set_beacon()
5561 return -EINVAL; in nl80211_set_beacon()
5563 err = nl80211_parse_beacon(rdev, info->attrs, ¶ms); in nl80211_set_beacon()
5576 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_stop_ap()
5577 struct net_device *dev = info->user_ptr[1]; in nl80211_stop_ap()
5603 nla = info->attrs[NL80211_ATTR_STA_FLAGS2]; in parse_station_flags()
5608 params->sta_flags_mask = sta_flags->mask; in parse_station_flags()
5609 params->sta_flags_set = sta_flags->set; in parse_station_flags()
5610 params->sta_flags_set &= params->sta_flags_mask; in parse_station_flags()
5611 if ((params->sta_flags_mask | in parse_station_flags()
5612 params->sta_flags_set) & BIT(__NL80211_STA_FLAG_INVALID)) in parse_station_flags()
5613 return -EINVAL; in parse_station_flags()
5619 nla = info->attrs[NL80211_ATTR_STA_FLAGS]; in parse_station_flags()
5623 if (nla_parse_nested_deprecated(flags, NL80211_STA_FLAG_MAX, nla, sta_flags_policy, info->extack)) in parse_station_flags()
5624 return -EINVAL; in parse_station_flags()
5636 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHORIZED) | in parse_station_flags()
5643 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHORIZED) | in parse_station_flags()
5647 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHENTICATED) | in parse_station_flags()
5652 return -EINVAL; in parse_station_flags()
5657 params->sta_flags_set |= (1<<flag); in parse_station_flags()
5661 return -EINVAL; in parse_station_flags()
5681 /* report 16-bit bitrate only if we can */ in nl80211_put_sta_rate()
5690 switch (info->bw) { in nl80211_put_sta_rate()
5714 WARN_ON(!(info->flags & RATE_INFO_FLAGS_HE_MCS)); in nl80211_put_sta_rate()
5720 if (info->flags & RATE_INFO_FLAGS_MCS) { in nl80211_put_sta_rate()
5721 if (nla_put_u8(msg, NL80211_RATE_INFO_MCS, info->mcs)) in nl80211_put_sta_rate()
5723 if (info->flags & RATE_INFO_FLAGS_SHORT_GI && in nl80211_put_sta_rate()
5726 } else if (info->flags & RATE_INFO_FLAGS_VHT_MCS) { in nl80211_put_sta_rate()
5727 if (nla_put_u8(msg, NL80211_RATE_INFO_VHT_MCS, info->mcs)) in nl80211_put_sta_rate()
5729 if (nla_put_u8(msg, NL80211_RATE_INFO_VHT_NSS, info->nss)) in nl80211_put_sta_rate()
5731 if (info->flags & RATE_INFO_FLAGS_SHORT_GI && in nl80211_put_sta_rate()
5734 } else if (info->flags & RATE_INFO_FLAGS_HE_MCS) { in nl80211_put_sta_rate()
5735 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_MCS, info->mcs)) in nl80211_put_sta_rate()
5737 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_NSS, info->nss)) in nl80211_put_sta_rate()
5739 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_GI, info->he_gi)) in nl80211_put_sta_rate()
5741 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_DCM, info->he_dcm)) in nl80211_put_sta_rate()
5743 if (info->bw == RATE_INFO_BW_HE_RU && in nl80211_put_sta_rate()
5745 info->he_ru_alloc)) in nl80211_put_sta_rate()
5791 return -1; in nl80211_send_station()
5794 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in nl80211_send_station()
5796 nla_put_u32(msg, NL80211_ATTR_GENERATION, sinfo->generation)) in nl80211_send_station()
5805 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_ ## attr) && \ in nl80211_send_station()
5807 sinfo->memb)) \ in nl80211_send_station()
5811 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_ ## attr) && \ in nl80211_send_station()
5813 sinfo->memb, NL80211_STA_INFO_PAD)) \ in nl80211_send_station()
5821 if (sinfo->filled & (BIT_ULL(NL80211_STA_INFO_RX_BYTES) | in nl80211_send_station()
5824 (u32)sinfo->rx_bytes)) in nl80211_send_station()
5827 if (sinfo->filled & (BIT_ULL(NL80211_STA_INFO_TX_BYTES) | in nl80211_send_station()
5830 (u32)sinfo->tx_bytes)) in nl80211_send_station()
5841 if (wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_send_station()
5845 switch (rdev->wiphy.signal_type) { in nl80211_send_station()
5853 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL)) { in nl80211_send_station()
5854 if (!nl80211_put_signal(msg, sinfo->chains, in nl80211_send_station()
5855 sinfo->chain_signal, in nl80211_send_station()
5859 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL_AVG)) { in nl80211_send_station()
5860 if (!nl80211_put_signal(msg, sinfo->chains, in nl80211_send_station()
5861 sinfo->chain_signal_avg, in nl80211_send_station()
5865 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_TX_BITRATE)) { in nl80211_send_station()
5866 if (!nl80211_put_sta_rate(msg, &sinfo->txrate, in nl80211_send_station()
5870 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_RX_BITRATE)) { in nl80211_send_station()
5871 if (!nl80211_put_sta_rate(msg, &sinfo->rxrate, in nl80211_send_station()
5889 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_BSS_PARAM)) { in nl80211_send_station()
5895 if (((sinfo->bss_param.flags & BSS_PARAM_FLAGS_CTS_PROT) && in nl80211_send_station()
5897 ((sinfo->bss_param.flags & BSS_PARAM_FLAGS_SHORT_PREAMBLE) && in nl80211_send_station()
5899 ((sinfo->bss_param.flags & BSS_PARAM_FLAGS_SHORT_SLOT_TIME) && in nl80211_send_station()
5902 sinfo->bss_param.dtim_period) || in nl80211_send_station()
5904 sinfo->bss_param.beacon_interval)) in nl80211_send_station()
5909 if ((sinfo->filled & BIT_ULL(NL80211_STA_INFO_STA_FLAGS)) && in nl80211_send_station()
5912 &sinfo->sta_flags)) in nl80211_send_station()
5921 if (wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_send_station()
5930 if (sinfo->pertid) { in nl80211_send_station()
5943 tidstats = &sinfo->pertid[tid]; in nl80211_send_station()
5945 if (!tidstats->filled) in nl80211_send_station()
5953 if (tidstats->filled & BIT(NL80211_TID_STATS_ ## attr) && \ in nl80211_send_station()
5955 tidstats->memb, NL80211_TID_STATS_PAD)) \ in nl80211_send_station()
5965 if ((tidstats->filled & in nl80211_send_station()
5967 !nl80211_put_txq_stats(msg, &tidstats->txq_stats, in nl80211_send_station()
5979 if (sinfo->assoc_req_ies_len && in nl80211_send_station()
5980 nla_put(msg, NL80211_ATTR_IE, sinfo->assoc_req_ies_len, in nl80211_send_station()
5981 sinfo->assoc_req_ies)) in nl80211_send_station()
5991 return -EMSGSIZE; in nl80211_send_station()
6001 int sta_idx = cb->args[2]; in nl80211_dump_station()
6008 __acquire(&rdev->wiphy.mtx); in nl80211_dump_station()
6010 if (!wdev->netdev) { in nl80211_dump_station()
6011 err = -EINVAL; in nl80211_dump_station()
6015 if (!rdev->ops->dump_station) { in nl80211_dump_station()
6016 err = -EOPNOTSUPP; in nl80211_dump_station()
6022 err = rdev_dump_station(rdev, wdev->netdev, sta_idx, in nl80211_dump_station()
6024 if (err == -ENOENT) in nl80211_dump_station()
6030 NETLINK_CB(cb->skb).portid, in nl80211_dump_station()
6031 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_dump_station()
6032 rdev, wdev->netdev, mac_addr, in nl80211_dump_station()
6040 cb->args[2] = sta_idx; in nl80211_dump_station()
6041 err = skb->len; in nl80211_dump_station()
6043 wiphy_unlock(&rdev->wiphy); in nl80211_dump_station()
6050 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_station()
6051 struct net_device *dev = info->user_ptr[1]; in nl80211_get_station()
6059 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_get_station()
6060 return -EINVAL; in nl80211_get_station()
6062 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_get_station()
6064 if (!rdev->ops->get_station) in nl80211_get_station()
6065 return -EOPNOTSUPP; in nl80211_get_station()
6074 return -ENOMEM; in nl80211_get_station()
6078 info->snd_portid, info->snd_seq, 0, in nl80211_get_station()
6081 return -ENOBUFS; in nl80211_get_station()
6091 if (params->listen_interval != -1 && in cfg80211_check_station_change()
6093 return -EINVAL; in cfg80211_check_station_change()
6095 if (params->support_p2p_ps != -1 && in cfg80211_check_station_change()
6097 return -EINVAL; in cfg80211_check_station_change()
6099 if (params->aid && in cfg80211_check_station_change()
6100 !(params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) && in cfg80211_check_station_change()
6102 return -EINVAL; in cfg80211_check_station_change()
6111 * No ignoring the TDLS flag here -- the userspace mesh in cfg80211_check_station_change()
6115 if (params->sta_flags_mask & in cfg80211_check_station_change()
6119 return -EINVAL; in cfg80211_check_station_change()
6123 if (!(params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER))) in cfg80211_check_station_change()
6124 return -EINVAL; in cfg80211_check_station_change()
6126 params->sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER); in cfg80211_check_station_change()
6129 /* disallow mesh-specific things */ in cfg80211_check_station_change()
6130 if (params->plink_action != NL80211_PLINK_ACTION_NO_ACTION) in cfg80211_check_station_change()
6131 return -EINVAL; in cfg80211_check_station_change()
6132 if (params->local_pm) in cfg80211_check_station_change()
6133 return -EINVAL; in cfg80211_check_station_change()
6134 if (params->sta_modify_mask & STATION_PARAM_APPLY_PLINK_STATE) in cfg80211_check_station_change()
6135 return -EINVAL; in cfg80211_check_station_change()
6141 if (params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) in cfg80211_check_station_change()
6142 return -EINVAL; in cfg80211_check_station_change()
6145 * a hostapd/wpa_supplicant issue -- it always includes the in cfg80211_check_station_change()
6148 params->sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER); in cfg80211_check_station_change()
6154 if (params->sta_modify_mask & STATION_PARAM_APPLY_UAPSD) in cfg80211_check_station_change()
6155 return -EINVAL; in cfg80211_check_station_change()
6156 if (params->sta_modify_mask & STATION_PARAM_APPLY_CAPABILITY) in cfg80211_check_station_change()
6157 return -EINVAL; in cfg80211_check_station_change()
6158 if (params->supported_rates) in cfg80211_check_station_change()
6159 return -EINVAL; in cfg80211_check_station_change()
6160 if (params->ext_capab || params->ht_capa || params->vht_capa || in cfg80211_check_station_change()
6161 params->he_capa) in cfg80211_check_station_change()
6162 return -EINVAL; in cfg80211_check_station_change()
6167 if (params->vlan) in cfg80211_check_station_change()
6168 return -EINVAL; in cfg80211_check_station_change()
6174 if (!(params->sta_flags_mask & BIT(NL80211_STA_FLAG_AUTHORIZED))) in cfg80211_check_station_change()
6175 return -EOPNOTSUPP; in cfg80211_check_station_change()
6180 if (params->sta_flags_mask & in cfg80211_check_station_change()
6187 return -EINVAL; in cfg80211_check_station_change()
6190 if (!(wiphy->features & NL80211_FEATURE_FULL_AP_CLIENT_STATE) && in cfg80211_check_station_change()
6191 params->sta_flags_mask & in cfg80211_check_station_change()
6194 return -EINVAL; in cfg80211_check_station_change()
6199 if (params->sta_flags_mask & ~BIT(NL80211_STA_FLAG_AUTHORIZED)) in cfg80211_check_station_change()
6200 return -EINVAL; in cfg80211_check_station_change()
6204 if (params->sta_flags_mask & ~(BIT(NL80211_STA_FLAG_AUTHORIZED) | in cfg80211_check_station_change()
6206 return -EINVAL; in cfg80211_check_station_change()
6208 if (params->sta_flags_set & BIT(NL80211_STA_FLAG_AUTHORIZED) && in cfg80211_check_station_change()
6209 !params->supported_rates) in cfg80211_check_station_change()
6210 return -EINVAL; in cfg80211_check_station_change()
6214 return -EINVAL; in cfg80211_check_station_change()
6216 if (params->sta_modify_mask & STATION_PARAM_APPLY_PLINK_STATE) in cfg80211_check_station_change()
6217 return -EINVAL; in cfg80211_check_station_change()
6220 if (params->plink_action != NL80211_PLINK_ACTION_NO_ACTION && in cfg80211_check_station_change()
6221 params->plink_action != NL80211_PLINK_ACTION_BLOCK) in cfg80211_check_station_change()
6222 return -EINVAL; in cfg80211_check_station_change()
6233 params->opmode_notif_used = false; in cfg80211_check_station_change()
6245 struct nlattr *vlanattr = info->attrs[NL80211_ATTR_STA_VLAN]; in get_vlan()
6254 return ERR_PTR(-ENODEV); in get_vlan()
6256 if (!v->ieee80211_ptr || v->ieee80211_ptr->wiphy != &rdev->wiphy) { in get_vlan()
6257 ret = -EINVAL; in get_vlan()
6261 if (v->ieee80211_ptr->iftype != NL80211_IFTYPE_AP_VLAN && in get_vlan()
6262 v->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && in get_vlan()
6263 v->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) { in get_vlan()
6264 ret = -EINVAL; in get_vlan()
6269 ret = -ENETDOWN; in get_vlan()
6293 if (!info->attrs[NL80211_ATTR_STA_WME]) in nl80211_parse_sta_wme()
6296 nla = info->attrs[NL80211_ATTR_STA_WME]; in nl80211_parse_sta_wme()
6299 info->extack); in nl80211_parse_sta_wme()
6304 params->uapsd_queues = nla_get_u8( in nl80211_parse_sta_wme()
6306 if (params->uapsd_queues & ~IEEE80211_WMM_IE_STA_QOSINFO_AC_MASK) in nl80211_parse_sta_wme()
6307 return -EINVAL; in nl80211_parse_sta_wme()
6310 params->max_sp = nla_get_u8(tb[NL80211_STA_WME_MAX_SP]); in nl80211_parse_sta_wme()
6312 if (params->max_sp & ~IEEE80211_WMM_IE_STA_QOSINFO_SP_MASK) in nl80211_parse_sta_wme()
6313 return -EINVAL; in nl80211_parse_sta_wme()
6315 params->sta_modify_mask |= STATION_PARAM_APPLY_UAPSD; in nl80211_parse_sta_wme()
6323 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]) { in nl80211_parse_sta_channel_info()
6324 params->supported_channels = in nl80211_parse_sta_channel_info()
6325 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]); in nl80211_parse_sta_channel_info()
6326 params->supported_channels_len = in nl80211_parse_sta_channel_info()
6327 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]); in nl80211_parse_sta_channel_info()
6333 if (params->supported_channels_len % 2) in nl80211_parse_sta_channel_info()
6334 return -EINVAL; in nl80211_parse_sta_channel_info()
6337 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]) { in nl80211_parse_sta_channel_info()
6338 params->supported_oper_classes = in nl80211_parse_sta_channel_info()
6339 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]); in nl80211_parse_sta_channel_info()
6340 params->supported_oper_classes_len = in nl80211_parse_sta_channel_info()
6341 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]); in nl80211_parse_sta_channel_info()
6351 if (info->attrs[NL80211_ATTR_PEER_AID]) in nl80211_set_station_tdls()
6352 params->aid = nla_get_u16(info->attrs[NL80211_ATTR_PEER_AID]); in nl80211_set_station_tdls()
6353 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) in nl80211_set_station_tdls()
6354 params->ht_capa = in nl80211_set_station_tdls()
6355 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]); in nl80211_set_station_tdls()
6356 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) in nl80211_set_station_tdls()
6357 params->vht_capa = in nl80211_set_station_tdls()
6358 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]); in nl80211_set_station_tdls()
6359 if (info->attrs[NL80211_ATTR_HE_CAPABILITY]) { in nl80211_set_station_tdls()
6360 params->he_capa = in nl80211_set_station_tdls()
6361 nla_data(info->attrs[NL80211_ATTR_HE_CAPABILITY]); in nl80211_set_station_tdls()
6362 params->he_capa_len = in nl80211_set_station_tdls()
6363 nla_len(info->attrs[NL80211_ATTR_HE_CAPABILITY]); in nl80211_set_station_tdls()
6376 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_parse_sta_txpower_setting()
6379 if (info->attrs[NL80211_ATTR_STA_TX_POWER_SETTING]) { in nl80211_parse_sta_txpower_setting()
6380 if (!rdev->ops->set_tx_power || in nl80211_parse_sta_txpower_setting()
6381 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_parse_sta_txpower_setting()
6383 return -EOPNOTSUPP; in nl80211_parse_sta_txpower_setting()
6386 params->txpwr.type = nla_get_u8(info->attrs[idx]); in nl80211_parse_sta_txpower_setting()
6388 if (params->txpwr.type == NL80211_TX_POWER_LIMITED) { in nl80211_parse_sta_txpower_setting()
6391 if (info->attrs[idx]) in nl80211_parse_sta_txpower_setting()
6392 params->txpwr.power = in nl80211_parse_sta_txpower_setting()
6393 nla_get_s16(info->attrs[idx]); in nl80211_parse_sta_txpower_setting()
6395 return -EINVAL; in nl80211_parse_sta_txpower_setting()
6397 params->sta_modify_mask |= STATION_PARAM_APPLY_STA_TXPOWER; in nl80211_parse_sta_txpower_setting()
6405 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_station()
6406 struct net_device *dev = info->user_ptr[1]; in nl80211_set_station()
6413 if (!rdev->ops->change_station) in nl80211_set_station()
6414 return -EOPNOTSUPP; in nl80211_set_station()
6421 if (info->attrs[NL80211_ATTR_STA_AID]) in nl80211_set_station()
6422 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_STA_AID]); in nl80211_set_station()
6424 if (info->attrs[NL80211_ATTR_VLAN_ID]) in nl80211_set_station()
6425 params.vlan_id = nla_get_u16(info->attrs[NL80211_ATTR_VLAN_ID]); in nl80211_set_station()
6427 if (info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]) in nl80211_set_station()
6429 nla_get_u16(info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]); in nl80211_set_station()
6431 params.listen_interval = -1; in nl80211_set_station()
6433 if (info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]) in nl80211_set_station()
6435 nla_get_u8(info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]); in nl80211_set_station()
6437 params.support_p2p_ps = -1; in nl80211_set_station()
6439 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_set_station()
6440 return -EINVAL; in nl80211_set_station()
6442 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_set_station()
6444 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) { in nl80211_set_station()
6446 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); in nl80211_set_station()
6448 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); in nl80211_set_station()
6451 if (info->attrs[NL80211_ATTR_STA_CAPABILITY]) { in nl80211_set_station()
6453 nla_get_u16(info->attrs[NL80211_ATTR_STA_CAPABILITY]); in nl80211_set_station()
6457 if (info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]) { in nl80211_set_station()
6459 nla_data(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); in nl80211_set_station()
6461 nla_len(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); in nl80211_set_station()
6464 if (parse_station_flags(info, dev->ieee80211_ptr->iftype, ¶ms)) in nl80211_set_station()
6465 return -EINVAL; in nl80211_set_station()
6467 if (info->attrs[NL80211_ATTR_STA_PLINK_ACTION]) in nl80211_set_station()
6469 nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_ACTION]); in nl80211_set_station()
6471 if (info->attrs[NL80211_ATTR_STA_PLINK_STATE]) { in nl80211_set_station()
6473 nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_STATE]); in nl80211_set_station()
6474 if (info->attrs[NL80211_ATTR_MESH_PEER_AID]) in nl80211_set_station()
6476 info->attrs[NL80211_ATTR_MESH_PEER_AID]); in nl80211_set_station()
6480 if (info->attrs[NL80211_ATTR_LOCAL_MESH_POWER_MODE]) in nl80211_set_station()
6482 info->attrs[NL80211_ATTR_LOCAL_MESH_POWER_MODE]); in nl80211_set_station()
6484 if (info->attrs[NL80211_ATTR_OPMODE_NOTIF]) { in nl80211_set_station()
6487 nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]); in nl80211_set_station()
6490 if (info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]) in nl80211_set_station()
6492 nla_data(info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]); in nl80211_set_station()
6494 if (info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]) in nl80211_set_station()
6496 nla_get_u16(info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]); in nl80211_set_station()
6499 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_set_station()
6501 return -EOPNOTSUPP; in nl80211_set_station()
6516 switch (dev->ieee80211_ptr->iftype) { in nl80211_set_station()
6526 err = -EOPNOTSUPP; in nl80211_set_station()
6541 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_new_station()
6543 struct net_device *dev = info->user_ptr[1]; in nl80211_new_station()
6551 if (!rdev->ops->add_station) in nl80211_new_station()
6552 return -EOPNOTSUPP; in nl80211_new_station()
6554 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_new_station()
6555 return -EINVAL; in nl80211_new_station()
6557 if (!info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]) in nl80211_new_station()
6558 return -EINVAL; in nl80211_new_station()
6560 if (!info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) in nl80211_new_station()
6561 return -EINVAL; in nl80211_new_station()
6563 if (!info->attrs[NL80211_ATTR_STA_AID] && in nl80211_new_station()
6564 !info->attrs[NL80211_ATTR_PEER_AID]) in nl80211_new_station()
6565 return -EINVAL; in nl80211_new_station()
6567 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_new_station()
6569 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); in nl80211_new_station()
6571 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); in nl80211_new_station()
6573 nla_get_u16(info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]); in nl80211_new_station()
6575 if (info->attrs[NL80211_ATTR_VLAN_ID]) in nl80211_new_station()
6576 params.vlan_id = nla_get_u16(info->attrs[NL80211_ATTR_VLAN_ID]); in nl80211_new_station()
6578 if (info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]) { in nl80211_new_station()
6580 nla_get_u8(info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]); in nl80211_new_station()
6587 dev->ieee80211_ptr->iftype == NL80211_IFTYPE_P2P_GO; in nl80211_new_station()
6590 if (info->attrs[NL80211_ATTR_PEER_AID]) in nl80211_new_station()
6591 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_PEER_AID]); in nl80211_new_station()
6593 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_STA_AID]); in nl80211_new_station()
6595 if (info->attrs[NL80211_ATTR_STA_CAPABILITY]) { in nl80211_new_station()
6597 nla_get_u16(info->attrs[NL80211_ATTR_STA_CAPABILITY]); in nl80211_new_station()
6601 if (info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]) { in nl80211_new_station()
6603 nla_data(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); in nl80211_new_station()
6605 nla_len(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); in nl80211_new_station()
6608 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) in nl80211_new_station()
6610 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]); in nl80211_new_station()
6612 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) in nl80211_new_station()
6614 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]); in nl80211_new_station()
6616 if (info->attrs[NL80211_ATTR_HE_CAPABILITY]) { in nl80211_new_station()
6618 nla_data(info->attrs[NL80211_ATTR_HE_CAPABILITY]); in nl80211_new_station()
6620 nla_len(info->attrs[NL80211_ATTR_HE_CAPABILITY]); in nl80211_new_station()
6623 if (info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]) in nl80211_new_station()
6625 nla_data(info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]); in nl80211_new_station()
6627 if (info->attrs[NL80211_ATTR_OPMODE_NOTIF]) { in nl80211_new_station()
6630 nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]); in nl80211_new_station()
6633 if (info->attrs[NL80211_ATTR_STA_PLINK_ACTION]) in nl80211_new_station()
6635 nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_ACTION]); in nl80211_new_station()
6637 if (info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]) in nl80211_new_station()
6639 nla_get_u16(info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]); in nl80211_new_station()
6642 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_new_station()
6644 return -EOPNOTSUPP; in nl80211_new_station()
6658 if (parse_station_flags(info, dev->ieee80211_ptr->iftype, ¶ms)) in nl80211_new_station()
6659 return -EINVAL; in nl80211_new_station()
6672 return -EINVAL; in nl80211_new_station()
6677 return -EINVAL; in nl80211_new_station()
6682 switch (dev->ieee80211_ptr->iftype) { in nl80211_new_station()
6687 if (!(rdev->wiphy.flags & WIPHY_FLAG_AP_UAPSD) || in nl80211_new_station()
6693 info->attrs[NL80211_ATTR_PEER_AID]) in nl80211_new_station()
6694 return -EINVAL; in nl80211_new_station()
6699 if (!(rdev->wiphy.features & in nl80211_new_station()
6702 return -EINVAL; in nl80211_new_station()
6730 return -EINVAL; in nl80211_new_station()
6733 info->attrs[NL80211_ATTR_PEER_AID]) in nl80211_new_station()
6734 return -EINVAL; in nl80211_new_station()
6745 return -EINVAL; in nl80211_new_station()
6748 return -EINVAL; in nl80211_new_station()
6750 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS)) in nl80211_new_station()
6751 return -EOPNOTSUPP; in nl80211_new_station()
6753 if (!(rdev->wiphy.flags & WIPHY_FLAG_TDLS_EXTERNAL_SETUP)) in nl80211_new_station()
6754 return -EOPNOTSUPP; in nl80211_new_station()
6762 return -EOPNOTSUPP; in nl80211_new_station()
6775 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_del_station()
6776 struct net_device *dev = info->user_ptr[1]; in nl80211_del_station()
6781 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_del_station()
6782 params.mac = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_del_station()
6784 switch (dev->ieee80211_ptr->iftype) { in nl80211_del_station()
6793 if (wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_del_station()
6796 return -EINVAL; in nl80211_del_station()
6798 return -EINVAL; in nl80211_del_station()
6801 if (!rdev->ops->del_station) in nl80211_del_station()
6802 return -EOPNOTSUPP; in nl80211_del_station()
6804 if (info->attrs[NL80211_ATTR_MGMT_SUBTYPE]) { in nl80211_del_station()
6806 nla_get_u8(info->attrs[NL80211_ATTR_MGMT_SUBTYPE]); in nl80211_del_station()
6809 return -EINVAL; in nl80211_del_station()
6815 if (info->attrs[NL80211_ATTR_REASON_CODE]) { in nl80211_del_station()
6817 nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); in nl80211_del_station()
6819 return -EINVAL; /* 0 is reserved */ in nl80211_del_station()
6838 return -1; in nl80211_send_mpath()
6840 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in nl80211_send_mpath()
6843 nla_put_u32(msg, NL80211_ATTR_GENERATION, pinfo->generation)) in nl80211_send_mpath()
6849 if ((pinfo->filled & MPATH_INFO_FRAME_QLEN) && in nl80211_send_mpath()
6851 pinfo->frame_qlen)) in nl80211_send_mpath()
6853 if (((pinfo->filled & MPATH_INFO_SN) && in nl80211_send_mpath()
6854 nla_put_u32(msg, NL80211_MPATH_INFO_SN, pinfo->sn)) || in nl80211_send_mpath()
6855 ((pinfo->filled & MPATH_INFO_METRIC) && in nl80211_send_mpath()
6857 pinfo->metric)) || in nl80211_send_mpath()
6858 ((pinfo->filled & MPATH_INFO_EXPTIME) && in nl80211_send_mpath()
6860 pinfo->exptime)) || in nl80211_send_mpath()
6861 ((pinfo->filled & MPATH_INFO_FLAGS) && in nl80211_send_mpath()
6863 pinfo->flags)) || in nl80211_send_mpath()
6864 ((pinfo->filled & MPATH_INFO_DISCOVERY_TIMEOUT) && in nl80211_send_mpath()
6866 pinfo->discovery_timeout)) || in nl80211_send_mpath()
6867 ((pinfo->filled & MPATH_INFO_DISCOVERY_RETRIES) && in nl80211_send_mpath()
6869 pinfo->discovery_retries)) || in nl80211_send_mpath()
6870 ((pinfo->filled & MPATH_INFO_HOP_COUNT) && in nl80211_send_mpath()
6872 pinfo->hop_count)) || in nl80211_send_mpath()
6873 ((pinfo->filled & MPATH_INFO_PATH_CHANGE) && in nl80211_send_mpath()
6875 pinfo->path_change_count))) in nl80211_send_mpath()
6885 return -EMSGSIZE; in nl80211_send_mpath()
6896 int path_idx = cb->args[2]; in nl80211_dump_mpath()
6903 __acquire(&rdev->wiphy.mtx); in nl80211_dump_mpath()
6905 if (!rdev->ops->dump_mpath) { in nl80211_dump_mpath()
6906 err = -EOPNOTSUPP; in nl80211_dump_mpath()
6910 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) { in nl80211_dump_mpath()
6911 err = -EOPNOTSUPP; in nl80211_dump_mpath()
6916 err = rdev_dump_mpath(rdev, wdev->netdev, path_idx, dst, in nl80211_dump_mpath()
6918 if (err == -ENOENT) in nl80211_dump_mpath()
6923 if (nl80211_send_mpath(skb, NETLINK_CB(cb->skb).portid, in nl80211_dump_mpath()
6924 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_dump_mpath()
6925 wdev->netdev, dst, next_hop, in nl80211_dump_mpath()
6933 cb->args[2] = path_idx; in nl80211_dump_mpath()
6934 err = skb->len; in nl80211_dump_mpath()
6936 wiphy_unlock(&rdev->wiphy); in nl80211_dump_mpath()
6942 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_mpath()
6944 struct net_device *dev = info->user_ptr[1]; in nl80211_get_mpath()
6952 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_get_mpath()
6953 return -EINVAL; in nl80211_get_mpath()
6955 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_get_mpath()
6957 if (!rdev->ops->get_mpath) in nl80211_get_mpath()
6958 return -EOPNOTSUPP; in nl80211_get_mpath()
6960 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_get_mpath()
6961 return -EOPNOTSUPP; in nl80211_get_mpath()
6969 return -ENOMEM; in nl80211_get_mpath()
6971 if (nl80211_send_mpath(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_mpath()
6974 return -ENOBUFS; in nl80211_get_mpath()
6982 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_mpath()
6983 struct net_device *dev = info->user_ptr[1]; in nl80211_set_mpath()
6987 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_set_mpath()
6988 return -EINVAL; in nl80211_set_mpath()
6990 if (!info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]) in nl80211_set_mpath()
6991 return -EINVAL; in nl80211_set_mpath()
6993 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_set_mpath()
6994 next_hop = nla_data(info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]); in nl80211_set_mpath()
6996 if (!rdev->ops->change_mpath) in nl80211_set_mpath()
6997 return -EOPNOTSUPP; in nl80211_set_mpath()
6999 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_set_mpath()
7000 return -EOPNOTSUPP; in nl80211_set_mpath()
7007 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_new_mpath()
7008 struct net_device *dev = info->user_ptr[1]; in nl80211_new_mpath()
7012 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_new_mpath()
7013 return -EINVAL; in nl80211_new_mpath()
7015 if (!info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]) in nl80211_new_mpath()
7016 return -EINVAL; in nl80211_new_mpath()
7018 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_new_mpath()
7019 next_hop = nla_data(info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]); in nl80211_new_mpath()
7021 if (!rdev->ops->add_mpath) in nl80211_new_mpath()
7022 return -EOPNOTSUPP; in nl80211_new_mpath()
7024 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_new_mpath()
7025 return -EOPNOTSUPP; in nl80211_new_mpath()
7032 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_del_mpath()
7033 struct net_device *dev = info->user_ptr[1]; in nl80211_del_mpath()
7036 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_del_mpath()
7037 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_del_mpath()
7039 if (!rdev->ops->del_mpath) in nl80211_del_mpath()
7040 return -EOPNOTSUPP; in nl80211_del_mpath()
7042 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_del_mpath()
7043 return -EOPNOTSUPP; in nl80211_del_mpath()
7050 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_mpp()
7052 struct net_device *dev = info->user_ptr[1]; in nl80211_get_mpp()
7060 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_get_mpp()
7061 return -EINVAL; in nl80211_get_mpp()
7063 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_get_mpp()
7065 if (!rdev->ops->get_mpp) in nl80211_get_mpp()
7066 return -EOPNOTSUPP; in nl80211_get_mpp()
7068 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_get_mpp()
7069 return -EOPNOTSUPP; in nl80211_get_mpp()
7077 return -ENOMEM; in nl80211_get_mpp()
7079 if (nl80211_send_mpath(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_mpp()
7082 return -ENOBUFS; in nl80211_get_mpp()
7096 int path_idx = cb->args[2]; in nl80211_dump_mpp()
7103 __acquire(&rdev->wiphy.mtx); in nl80211_dump_mpp()
7105 if (!rdev->ops->dump_mpp) { in nl80211_dump_mpp()
7106 err = -EOPNOTSUPP; in nl80211_dump_mpp()
7110 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) { in nl80211_dump_mpp()
7111 err = -EOPNOTSUPP; in nl80211_dump_mpp()
7116 err = rdev_dump_mpp(rdev, wdev->netdev, path_idx, dst, in nl80211_dump_mpp()
7118 if (err == -ENOENT) in nl80211_dump_mpp()
7123 if (nl80211_send_mpath(skb, NETLINK_CB(cb->skb).portid, in nl80211_dump_mpp()
7124 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_dump_mpp()
7125 wdev->netdev, dst, mpp, in nl80211_dump_mpp()
7133 cb->args[2] = path_idx; in nl80211_dump_mpp()
7134 err = skb->len; in nl80211_dump_mpp()
7136 wiphy_unlock(&rdev->wiphy); in nl80211_dump_mpp()
7142 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_bss()
7143 struct net_device *dev = info->user_ptr[1]; in nl80211_set_bss()
7144 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_bss()
7150 params.use_cts_prot = -1; in nl80211_set_bss()
7151 params.use_short_preamble = -1; in nl80211_set_bss()
7152 params.use_short_slot_time = -1; in nl80211_set_bss()
7153 params.ap_isolate = -1; in nl80211_set_bss()
7154 params.ht_opmode = -1; in nl80211_set_bss()
7155 params.p2p_ctwindow = -1; in nl80211_set_bss()
7156 params.p2p_opp_ps = -1; in nl80211_set_bss()
7158 if (info->attrs[NL80211_ATTR_BSS_CTS_PROT]) in nl80211_set_bss()
7160 nla_get_u8(info->attrs[NL80211_ATTR_BSS_CTS_PROT]); in nl80211_set_bss()
7161 if (info->attrs[NL80211_ATTR_BSS_SHORT_PREAMBLE]) in nl80211_set_bss()
7163 nla_get_u8(info->attrs[NL80211_ATTR_BSS_SHORT_PREAMBLE]); in nl80211_set_bss()
7164 if (info->attrs[NL80211_ATTR_BSS_SHORT_SLOT_TIME]) in nl80211_set_bss()
7166 nla_get_u8(info->attrs[NL80211_ATTR_BSS_SHORT_SLOT_TIME]); in nl80211_set_bss()
7167 if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) { in nl80211_set_bss()
7169 nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); in nl80211_set_bss()
7171 nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); in nl80211_set_bss()
7173 if (info->attrs[NL80211_ATTR_AP_ISOLATE]) in nl80211_set_bss()
7174 params.ap_isolate = !!nla_get_u8(info->attrs[NL80211_ATTR_AP_ISOLATE]); in nl80211_set_bss()
7175 if (info->attrs[NL80211_ATTR_BSS_HT_OPMODE]) in nl80211_set_bss()
7177 nla_get_u16(info->attrs[NL80211_ATTR_BSS_HT_OPMODE]); in nl80211_set_bss()
7179 if (info->attrs[NL80211_ATTR_P2P_CTWINDOW]) { in nl80211_set_bss()
7180 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_set_bss()
7181 return -EINVAL; in nl80211_set_bss()
7183 nla_get_u8(info->attrs[NL80211_ATTR_P2P_CTWINDOW]); in nl80211_set_bss()
7185 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_CTWIN)) in nl80211_set_bss()
7186 return -EINVAL; in nl80211_set_bss()
7189 if (info->attrs[NL80211_ATTR_P2P_OPPPS]) { in nl80211_set_bss()
7192 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_set_bss()
7193 return -EINVAL; in nl80211_set_bss()
7194 tmp = nla_get_u8(info->attrs[NL80211_ATTR_P2P_OPPPS]); in nl80211_set_bss()
7197 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_OPPPS)) in nl80211_set_bss()
7198 return -EINVAL; in nl80211_set_bss()
7201 if (!rdev->ops->change_bss) in nl80211_set_bss()
7202 return -EOPNOTSUPP; in nl80211_set_bss()
7204 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && in nl80211_set_bss()
7205 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_set_bss()
7206 return -EOPNOTSUPP; in nl80211_set_bss()
7224 * completely when built-in to the kernel right between the time in nl80211_req_set_reg()
7229 return -EINPROGRESS; in nl80211_req_set_reg()
7231 if (info->attrs[NL80211_ATTR_USER_REG_HINT_TYPE]) in nl80211_req_set_reg()
7233 nla_get_u32(info->attrs[NL80211_ATTR_USER_REG_HINT_TYPE]); in nl80211_req_set_reg()
7240 if (!info->attrs[NL80211_ATTR_REG_ALPHA2]) in nl80211_req_set_reg()
7241 return -EINVAL; in nl80211_req_set_reg()
7243 data = nla_data(info->attrs[NL80211_ATTR_REG_ALPHA2]); in nl80211_req_set_reg()
7246 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) { in nl80211_req_set_reg()
7247 owner_nlportid = info->snd_portid; in nl80211_req_set_reg()
7248 is_indoor = !!info->attrs[NL80211_ATTR_REG_INDOOR]; in nl80211_req_set_reg()
7256 return -EINVAL; in nl80211_req_set_reg()
7268 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_mesh_config()
7269 struct net_device *dev = info->user_ptr[1]; in nl80211_get_mesh_config()
7270 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_get_mesh_config()
7277 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_get_mesh_config()
7278 return -EOPNOTSUPP; in nl80211_get_mesh_config()
7280 if (!rdev->ops->get_mesh_config) in nl80211_get_mesh_config()
7281 return -EOPNOTSUPP; in nl80211_get_mesh_config()
7285 if (!wdev->mesh_id_len) in nl80211_get_mesh_config()
7297 return -ENOMEM; in nl80211_get_mesh_config()
7298 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_mesh_config()
7305 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in nl80211_get_mesh_config()
7376 return -ENOBUFS; in nl80211_get_mesh_config()
7411 NLA_POLICY_RANGE(NLA_S32, -255, 0),
7454 cfg->param = fn(tb[attr]); \ in nl80211_parse_mesh_config()
7455 mask |= BIT((attr) - 1); \ in nl80211_parse_mesh_config()
7459 if (!info->attrs[NL80211_ATTR_MESH_CONFIG]) in nl80211_parse_mesh_config()
7460 return -EINVAL; in nl80211_parse_mesh_config()
7461 …ated(tb, NL80211_MESHCONF_ATTR_MAX, info->attrs[NL80211_ATTR_MESH_CONFIG], nl80211_meshconf_params… in nl80211_parse_mesh_config()
7462 return -EINVAL; in nl80211_parse_mesh_config()
7500 (cfg->path_refresh_time < 1 || cfg->path_refresh_time > 65535)) in nl80211_parse_mesh_config()
7501 return -EINVAL; in nl80211_parse_mesh_config()
7510 (cfg->dot11MeshHWMPactivePathTimeout < 1 || in nl80211_parse_mesh_config()
7511 cfg->dot11MeshHWMPactivePathTimeout > 65535)) in nl80211_parse_mesh_config()
7512 return -EINVAL; in nl80211_parse_mesh_config()
7544 * IEEE 802.11-2016 9.4.2.57 HT Operation element. in nl80211_parse_mesh_config()
7552 return -EINVAL; in nl80211_parse_mesh_config()
7557 cfg->ht_opmode = ht_opmode; in nl80211_parse_mesh_config()
7558 mask |= (1 << (NL80211_MESHCONF_HT_OPMODE - 1)); in nl80211_parse_mesh_config()
7565 (cfg->dot11MeshHWMPactivePathToRootTimeout < 1 || in nl80211_parse_mesh_config()
7566 cfg->dot11MeshHWMPactivePathToRootTimeout > 65535)) in nl80211_parse_mesh_config()
7567 return -EINVAL; in nl80211_parse_mesh_config()
7594 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_parse_mesh_setup()
7597 if (!info->attrs[NL80211_ATTR_MESH_SETUP]) in nl80211_parse_mesh_setup()
7598 return -EINVAL; in nl80211_parse_mesh_setup()
7599 …ed(tb, NL80211_MESH_SETUP_ATTR_MAX, info->attrs[NL80211_ATTR_MESH_SETUP], nl80211_mesh_setup_param… in nl80211_parse_mesh_setup()
7600 return -EINVAL; in nl80211_parse_mesh_setup()
7603 setup->sync_method = in nl80211_parse_mesh_setup()
7609 setup->path_sel_proto = in nl80211_parse_mesh_setup()
7615 setup->path_metric = in nl80211_parse_mesh_setup()
7623 setup->ie = nla_data(ieattr); in nl80211_parse_mesh_setup()
7624 setup->ie_len = nla_len(ieattr); in nl80211_parse_mesh_setup()
7627 !(rdev->wiphy.features & NL80211_FEATURE_USERSPACE_MPM)) in nl80211_parse_mesh_setup()
7628 return -EINVAL; in nl80211_parse_mesh_setup()
7629 setup->user_mpm = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_MPM]); in nl80211_parse_mesh_setup()
7630 setup->is_authenticated = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_AUTH]); in nl80211_parse_mesh_setup()
7631 setup->is_secure = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_AMPE]); in nl80211_parse_mesh_setup()
7632 if (setup->is_secure) in nl80211_parse_mesh_setup()
7633 setup->user_mpm = true; in nl80211_parse_mesh_setup()
7636 if (!setup->user_mpm) in nl80211_parse_mesh_setup()
7637 return -EINVAL; in nl80211_parse_mesh_setup()
7638 setup->auth_id = in nl80211_parse_mesh_setup()
7648 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_update_mesh_config()
7649 struct net_device *dev = info->user_ptr[1]; in nl80211_update_mesh_config()
7650 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_update_mesh_config()
7655 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_update_mesh_config()
7656 return -EOPNOTSUPP; in nl80211_update_mesh_config()
7658 if (!rdev->ops->update_mesh_config) in nl80211_update_mesh_config()
7659 return -EOPNOTSUPP; in nl80211_update_mesh_config()
7666 if (!wdev->mesh_id_len) in nl80211_update_mesh_config()
7667 err = -ENOLINK; in nl80211_update_mesh_config()
7683 if (nla_put_string(msg, NL80211_ATTR_REG_ALPHA2, regdom->alpha2) || in nl80211_put_regdom()
7684 (regdom->dfs_region && in nl80211_put_regdom()
7685 nla_put_u8(msg, NL80211_ATTR_DFS_REGION, regdom->dfs_region))) in nl80211_put_regdom()
7692 for (i = 0; i < regdom->n_reg_rules; i++) { in nl80211_put_regdom()
7699 reg_rule = ®dom->reg_rules[i]; in nl80211_put_regdom()
7700 freq_range = ®_rule->freq_range; in nl80211_put_regdom()
7701 power_rule = ®_rule->power_rule; in nl80211_put_regdom()
7707 max_bandwidth_khz = freq_range->max_bandwidth_khz; in nl80211_put_regdom()
7713 reg_rule->flags) || in nl80211_put_regdom()
7715 freq_range->start_freq_khz) || in nl80211_put_regdom()
7717 freq_range->end_freq_khz) || in nl80211_put_regdom()
7721 power_rule->max_antenna_gain) || in nl80211_put_regdom()
7723 power_rule->max_eirp) || in nl80211_put_regdom()
7725 reg_rule->dfs_cac_ms)) in nl80211_put_regdom()
7735 return -EMSGSIZE; in nl80211_put_regdom()
7748 return -ENOBUFS; in nl80211_get_reg_do()
7750 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_reg_do()
7757 if (info->attrs[NL80211_ATTR_WIPHY]) { in nl80211_get_reg_do()
7767 wiphy = &rdev->wiphy; in nl80211_get_reg_do()
7768 self_managed = wiphy->regulatory_flags & in nl80211_get_reg_do()
7772 /* a self-managed-reg device must have a private regdom */ in nl80211_get_reg_do()
7776 return -EINVAL; in nl80211_get_reg_do()
7809 return -EMSGSIZE; in nl80211_get_reg_do()
7816 void *hdr = nl80211hdr_put(msg, NETLINK_CB(cb->skb).portid, seq, flags, in nl80211_send_regdom()
7820 return -1; in nl80211_send_regdom()
7836 if (wiphy && wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED && in nl80211_send_regdom()
7845 return -EMSGSIZE; in nl80211_send_regdom()
7853 int err, reg_idx, start = cb->args[2]; in nl80211_get_reg_dump()
7858 err = nl80211_send_regdom(skb, cb, cb->nlh->nlmsg_seq, in nl80211_get_reg_dump()
7868 regdom = get_wiphy_regdom(&rdev->wiphy); in nl80211_get_reg_dump()
7875 err = nl80211_send_regdom(skb, cb, cb->nlh->nlmsg_seq, in nl80211_get_reg_dump()
7876 NLM_F_MULTI, &rdev->wiphy, regdom); in nl80211_get_reg_dump()
7878 reg_idx--; in nl80211_get_reg_dump()
7883 cb->args[2] = reg_idx; in nl80211_get_reg_dump()
7884 err = skb->len; in nl80211_get_reg_dump()
7904 struct ieee80211_freq_range *freq_range = ®_rule->freq_range; in parse_reg_rule()
7905 struct ieee80211_power_rule *power_rule = ®_rule->power_rule; in parse_reg_rule()
7908 return -EINVAL; in parse_reg_rule()
7910 return -EINVAL; in parse_reg_rule()
7912 return -EINVAL; in parse_reg_rule()
7914 return -EINVAL; in parse_reg_rule()
7916 return -EINVAL; in parse_reg_rule()
7918 reg_rule->flags = nla_get_u32(tb[NL80211_ATTR_REG_RULE_FLAGS]); in parse_reg_rule()
7920 freq_range->start_freq_khz = in parse_reg_rule()
7922 freq_range->end_freq_khz = in parse_reg_rule()
7924 freq_range->max_bandwidth_khz = in parse_reg_rule()
7927 power_rule->max_eirp = in parse_reg_rule()
7931 power_rule->max_antenna_gain = in parse_reg_rule()
7935 reg_rule->dfs_cac_ms = in parse_reg_rule()
7951 if (!info->attrs[NL80211_ATTR_REG_ALPHA2]) in nl80211_set_reg()
7952 return -EINVAL; in nl80211_set_reg()
7954 if (!info->attrs[NL80211_ATTR_REG_RULES]) in nl80211_set_reg()
7955 return -EINVAL; in nl80211_set_reg()
7957 alpha2 = nla_data(info->attrs[NL80211_ATTR_REG_ALPHA2]); in nl80211_set_reg()
7959 if (info->attrs[NL80211_ATTR_DFS_REGION]) in nl80211_set_reg()
7960 dfs_region = nla_get_u8(info->attrs[NL80211_ATTR_DFS_REGION]); in nl80211_set_reg()
7962 nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES], in nl80211_set_reg()
7966 return -EINVAL; in nl80211_set_reg()
7971 r = -EINVAL; in nl80211_set_reg()
7977 r = -ENOMEM; in nl80211_set_reg()
7981 rd->n_reg_rules = num_rules; in nl80211_set_reg()
7982 rd->alpha2[0] = alpha2[0]; in nl80211_set_reg()
7983 rd->alpha2[1] = alpha2[1]; in nl80211_set_reg()
7990 rd->dfs_region = dfs_region; in nl80211_set_reg()
7992 nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES], in nl80211_set_reg()
7996 info->extack); in nl80211_set_reg()
7999 r = parse_reg_rule(tb, &rd->reg_rules[rule_idx]); in nl80211_set_reg()
8006 r = -EINVAL; in nl80211_set_reg()
8053 return b < NUM_NL80211_BANDS && wiphy->bands[b]; in is_band_valid()
8068 return -EINVAL; in parse_bss_select()
8080 return -EINVAL; in parse_bss_select()
8085 bss_select->behaviour = __NL80211_BSS_SELECT_ATTR_INVALID; in parse_bss_select()
8088 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_RSSI; in parse_bss_select()
8091 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_BAND_PREF; in parse_bss_select()
8092 bss_select->param.band_pref = in parse_bss_select()
8094 if (!is_band_valid(wiphy, bss_select->param.band_pref)) in parse_bss_select()
8095 return -EINVAL; in parse_bss_select()
8102 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_RSSI_ADJUST; in parse_bss_select()
8103 bss_select->param.adjust.band = adj_param->band; in parse_bss_select()
8104 bss_select->param.adjust.delta = adj_param->delta; in parse_bss_select()
8105 if (!is_band_valid(wiphy, bss_select->param.adjust.band)) in parse_bss_select()
8106 return -EINVAL; in parse_bss_select()
8109 /* user-space did not provide behaviour attribute */ in parse_bss_select()
8110 if (bss_select->behaviour == __NL80211_BSS_SELECT_ATTR_INVALID) in parse_bss_select()
8111 return -EINVAL; in parse_bss_select()
8113 if (!(wiphy->bss_select_support & BIT(bss_select->behaviour))) in parse_bss_select()
8114 return -EINVAL; in parse_bss_select()
8135 return -EINVAL; in nl80211_parse_random_mac()
8143 return -EINVAL; in nl80211_parse_random_mac()
8163 if (!(wdev->chandef.chan->flags & IEEE80211_CHAN_RADAR)) in cfg80211_off_channel_oper_allowed()
8166 return regulatory_pre_cac_allowed(wdev->wiphy); in cfg80211_off_channel_oper_allowed()
8197 flags = &req->flags; in nl80211_check_scan_flags()
8198 mac_addr = req->mac_addr; in nl80211_check_scan_flags()
8199 mac_addr_mask = req->mac_addr_mask; in nl80211_check_scan_flags()
8204 flags = &req->flags; in nl80211_check_scan_flags()
8205 mac_addr = req->mac_addr; in nl80211_check_scan_flags()
8206 mac_addr_mask = req->mac_addr_mask; in nl80211_check_scan_flags()
8212 !(wiphy->features & NL80211_FEATURE_LOW_PRIORITY_SCAN)) || in nl80211_check_scan_flags()
8240 return -EOPNOTSUPP; in nl80211_check_scan_flags()
8245 if (!(wiphy->features & randomness_flag) || in nl80211_check_scan_flags()
8246 (wdev && wdev->current_bss)) in nl80211_check_scan_flags()
8247 return -EOPNOTSUPP; in nl80211_check_scan_flags()
8259 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_trigger_scan()
8260 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_trigger_scan()
8269 wiphy = &rdev->wiphy; in nl80211_trigger_scan()
8271 if (wdev->iftype == NL80211_IFTYPE_NAN) in nl80211_trigger_scan()
8272 return -EOPNOTSUPP; in nl80211_trigger_scan()
8274 if (!rdev->ops->scan) in nl80211_trigger_scan()
8275 return -EOPNOTSUPP; in nl80211_trigger_scan()
8277 if (rdev->scan_req || rdev->scan_msg) in nl80211_trigger_scan()
8278 return -EBUSY; in nl80211_trigger_scan()
8280 if (info->attrs[NL80211_ATTR_SCAN_FREQ_KHZ]) { in nl80211_trigger_scan()
8283 return -EOPNOTSUPP; in nl80211_trigger_scan()
8284 scan_freqs = info->attrs[NL80211_ATTR_SCAN_FREQ_KHZ]; in nl80211_trigger_scan()
8286 } else if (info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]) in nl80211_trigger_scan()
8287 scan_freqs = info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]; in nl80211_trigger_scan()
8292 return -EINVAL; in nl80211_trigger_scan()
8297 if (info->attrs[NL80211_ATTR_SCAN_SSIDS]) in nl80211_trigger_scan()
8298 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp) in nl80211_trigger_scan()
8301 if (n_ssids > wiphy->max_scan_ssids) in nl80211_trigger_scan()
8302 return -EINVAL; in nl80211_trigger_scan()
8304 if (info->attrs[NL80211_ATTR_IE]) in nl80211_trigger_scan()
8305 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_trigger_scan()
8309 if (ie_len > wiphy->max_scan_ie_len) in nl80211_trigger_scan()
8310 return -EINVAL; in nl80211_trigger_scan()
8313 + sizeof(*request->ssids) * n_ssids in nl80211_trigger_scan()
8314 + sizeof(*request->channels) * n_channels in nl80211_trigger_scan()
8317 return -ENOMEM; in nl80211_trigger_scan()
8320 request->ssids = (void *)&request->channels[n_channels]; in nl80211_trigger_scan()
8321 request->n_ssids = n_ssids; in nl80211_trigger_scan()
8324 request->ie = (void *)(request->ssids + n_ssids); in nl80211_trigger_scan()
8326 request->ie = (void *)(request->channels + n_channels); in nl80211_trigger_scan()
8341 err = -EINVAL; in nl80211_trigger_scan()
8346 if (chan->flags & IEEE80211_CHAN_DISABLED) in nl80211_trigger_scan()
8349 request->channels[i] = chan; in nl80211_trigger_scan()
8359 if (!wiphy->bands[band]) in nl80211_trigger_scan()
8361 for (j = 0; j < wiphy->bands[band]->n_channels; j++) { in nl80211_trigger_scan()
8364 chan = &wiphy->bands[band]->channels[j]; in nl80211_trigger_scan()
8366 if (chan->flags & IEEE80211_CHAN_DISABLED) in nl80211_trigger_scan()
8369 request->channels[i] = chan; in nl80211_trigger_scan()
8376 err = -EINVAL; in nl80211_trigger_scan()
8380 request->n_channels = i; in nl80211_trigger_scan()
8386 if (request->n_channels != 1) { in nl80211_trigger_scan()
8388 err = -EBUSY; in nl80211_trigger_scan()
8392 chan = request->channels[0]; in nl80211_trigger_scan()
8393 if (chan->center_freq != wdev->chandef.chan->center_freq) { in nl80211_trigger_scan()
8395 err = -EBUSY; in nl80211_trigger_scan()
8403 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp) { in nl80211_trigger_scan()
8405 err = -EINVAL; in nl80211_trigger_scan()
8408 request->ssids[i].ssid_len = nla_len(attr); in nl80211_trigger_scan()
8409 memcpy(request->ssids[i].ssid, nla_data(attr), nla_len(attr)); in nl80211_trigger_scan()
8414 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_trigger_scan()
8415 request->ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_trigger_scan()
8416 memcpy((void *)request->ie, in nl80211_trigger_scan()
8417 nla_data(info->attrs[NL80211_ATTR_IE]), in nl80211_trigger_scan()
8418 request->ie_len); in nl80211_trigger_scan()
8422 if (wiphy->bands[i]) in nl80211_trigger_scan()
8423 request->rates[i] = in nl80211_trigger_scan()
8424 (1 << wiphy->bands[i]->n_bitrates) - 1; in nl80211_trigger_scan()
8426 if (info->attrs[NL80211_ATTR_SCAN_SUPP_RATES]) { in nl80211_trigger_scan()
8428 info->attrs[NL80211_ATTR_SCAN_SUPP_RATES], in nl80211_trigger_scan()
8433 err = -EINVAL; in nl80211_trigger_scan()
8437 if (!wiphy->bands[band]) in nl80211_trigger_scan()
8440 err = ieee80211_get_ratemask(wiphy->bands[band], in nl80211_trigger_scan()
8443 &request->rates[band]); in nl80211_trigger_scan()
8449 if (info->attrs[NL80211_ATTR_MEASUREMENT_DURATION]) { in nl80211_trigger_scan()
8450 request->duration = in nl80211_trigger_scan()
8451 nla_get_u16(info->attrs[NL80211_ATTR_MEASUREMENT_DURATION]); in nl80211_trigger_scan()
8452 request->duration_mandatory = in nl80211_trigger_scan()
8453 nla_get_flag(info->attrs[NL80211_ATTR_MEASUREMENT_DURATION_MANDATORY]); in nl80211_trigger_scan()
8456 err = nl80211_check_scan_flags(wiphy, wdev, request, info->attrs, in nl80211_trigger_scan()
8461 request->no_cck = in nl80211_trigger_scan()
8462 nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]); in nl80211_trigger_scan()
8473 if (info->attrs[NL80211_ATTR_BSSID]) in nl80211_trigger_scan()
8474 memcpy(request->bssid, in nl80211_trigger_scan()
8475 nla_data(info->attrs[NL80211_ATTR_BSSID]), ETH_ALEN); in nl80211_trigger_scan()
8476 else if (!(request->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) && in nl80211_trigger_scan()
8477 info->attrs[NL80211_ATTR_MAC]) in nl80211_trigger_scan()
8478 memcpy(request->bssid, nla_data(info->attrs[NL80211_ATTR_MAC]), in nl80211_trigger_scan()
8481 eth_broadcast_addr(request->bssid); in nl80211_trigger_scan()
8483 request->wdev = wdev; in nl80211_trigger_scan()
8484 request->wiphy = &rdev->wiphy; in nl80211_trigger_scan()
8485 request->scan_start = jiffies; in nl80211_trigger_scan()
8487 rdev->scan_req = request; in nl80211_trigger_scan()
8494 dev_hold(wdev->netdev); in nl80211_trigger_scan()
8499 rdev->scan_req = NULL; in nl80211_trigger_scan()
8507 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_abort_scan()
8508 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_abort_scan()
8510 if (!rdev->ops->abort_scan) in nl80211_abort_scan()
8511 return -EOPNOTSUPP; in nl80211_abort_scan()
8513 if (rdev->scan_msg) in nl80211_abort_scan()
8516 if (!rdev->scan_req) in nl80211_abort_scan()
8517 return -ENOENT; in nl80211_abort_scan()
8542 return -EINVAL; in nl80211_parse_sched_scan_plans()
8544 request->scan_plans[0].interval = in nl80211_parse_sched_scan_plans()
8546 if (!request->scan_plans[0].interval) in nl80211_parse_sched_scan_plans()
8547 return -EINVAL; in nl80211_parse_sched_scan_plans()
8549 if (request->scan_plans[0].interval > in nl80211_parse_sched_scan_plans()
8550 wiphy->max_sched_scan_plan_interval) in nl80211_parse_sched_scan_plans()
8551 request->scan_plans[0].interval = in nl80211_parse_sched_scan_plans()
8552 wiphy->max_sched_scan_plan_interval; in nl80211_parse_sched_scan_plans()
8561 return -EINVAL; in nl80211_parse_sched_scan_plans()
8571 return -EINVAL; in nl80211_parse_sched_scan_plans()
8573 request->scan_plans[i].interval = in nl80211_parse_sched_scan_plans()
8575 if (!request->scan_plans[i].interval || in nl80211_parse_sched_scan_plans()
8576 request->scan_plans[i].interval > in nl80211_parse_sched_scan_plans()
8577 wiphy->max_sched_scan_plan_interval) in nl80211_parse_sched_scan_plans()
8578 return -EINVAL; in nl80211_parse_sched_scan_plans()
8581 request->scan_plans[i].iterations = in nl80211_parse_sched_scan_plans()
8583 if (!request->scan_plans[i].iterations || in nl80211_parse_sched_scan_plans()
8584 (request->scan_plans[i].iterations > in nl80211_parse_sched_scan_plans()
8585 wiphy->max_sched_scan_plan_iterations)) in nl80211_parse_sched_scan_plans()
8586 return -EINVAL; in nl80211_parse_sched_scan_plans()
8587 } else if (i < n_plans - 1) { in nl80211_parse_sched_scan_plans()
8592 return -EINVAL; in nl80211_parse_sched_scan_plans()
8602 if (request->scan_plans[n_plans - 1].iterations) in nl80211_parse_sched_scan_plans()
8603 return -EINVAL; in nl80211_parse_sched_scan_plans()
8620 ret = -EOPNOTSUPP; in nl80211_parse_sched_scan_per_band_rssi()
8623 match_sets->per_band_rssi_thold[i] = in nl80211_parse_sched_scan_per_band_rssi()
8629 match_sets->per_band_rssi_thold[i] = rssi_thold; in nl80211_parse_sched_scan_per_band_rssi()
8635 return -EINVAL; in nl80211_parse_sched_scan_per_band_rssi()
8637 match_sets->per_band_rssi_thold[band] = nla_get_s32(attr); in nl80211_parse_sched_scan_per_band_rssi()
8659 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
8669 if (n_ssids > wiphy->max_sched_scan_ssids) in nl80211_parse_sched_scan()
8670 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
8679 * global RSSI for all other matchsets - if there are other matchsets. in nl80211_parse_sched_scan()
8698 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
8717 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
8724 if (ie_len > wiphy->max_sched_scan_ie_len) in nl80211_parse_sched_scan()
8725 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
8733 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
8746 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
8751 if (!n_plans || n_plans > wiphy->max_sched_scan_plans) in nl80211_parse_sched_scan()
8752 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
8758 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
8761 + sizeof(*request->ssids) * n_ssids in nl80211_parse_sched_scan()
8762 + sizeof(*request->match_sets) * n_match_sets in nl80211_parse_sched_scan()
8763 + sizeof(*request->scan_plans) * n_plans in nl80211_parse_sched_scan()
8764 + sizeof(*request->channels) * n_channels in nl80211_parse_sched_scan()
8767 return ERR_PTR(-ENOMEM); in nl80211_parse_sched_scan()
8770 request->ssids = (void *)&request->channels[n_channels]; in nl80211_parse_sched_scan()
8771 request->n_ssids = n_ssids; in nl80211_parse_sched_scan()
8774 request->ie = (void *)(request->ssids + n_ssids); in nl80211_parse_sched_scan()
8776 request->ie = (void *)(request->channels + n_channels); in nl80211_parse_sched_scan()
8780 if (request->ie) in nl80211_parse_sched_scan()
8781 request->match_sets = (void *)(request->ie + ie_len); in nl80211_parse_sched_scan()
8783 request->match_sets = in nl80211_parse_sched_scan()
8784 (void *)(request->ssids + n_ssids); in nl80211_parse_sched_scan()
8786 request->match_sets = in nl80211_parse_sched_scan()
8787 (void *)(request->channels + n_channels); in nl80211_parse_sched_scan()
8789 request->n_match_sets = n_match_sets; in nl80211_parse_sched_scan()
8792 request->scan_plans = (void *)(request->match_sets + in nl80211_parse_sched_scan()
8794 else if (request->ie) in nl80211_parse_sched_scan()
8795 request->scan_plans = (void *)(request->ie + ie_len); in nl80211_parse_sched_scan()
8797 request->scan_plans = (void *)(request->ssids + n_ssids); in nl80211_parse_sched_scan()
8799 request->scan_plans = (void *)(request->channels + n_channels); in nl80211_parse_sched_scan()
8801 request->n_scan_plans = n_plans; in nl80211_parse_sched_scan()
8814 err = -EINVAL; in nl80211_parse_sched_scan()
8819 if (chan->flags & IEEE80211_CHAN_DISABLED) in nl80211_parse_sched_scan()
8822 request->channels[i] = chan; in nl80211_parse_sched_scan()
8830 if (!wiphy->bands[band]) in nl80211_parse_sched_scan()
8832 for (j = 0; j < wiphy->bands[band]->n_channels; j++) { in nl80211_parse_sched_scan()
8835 chan = &wiphy->bands[band]->channels[j]; in nl80211_parse_sched_scan()
8837 if (chan->flags & IEEE80211_CHAN_DISABLED) in nl80211_parse_sched_scan()
8840 request->channels[i] = chan; in nl80211_parse_sched_scan()
8847 err = -EINVAL; in nl80211_parse_sched_scan()
8851 request->n_channels = i; in nl80211_parse_sched_scan()
8858 err = -EINVAL; in nl80211_parse_sched_scan()
8861 request->ssids[i].ssid_len = nla_len(attr); in nl80211_parse_sched_scan()
8862 memcpy(request->ssids[i].ssid, nla_data(attr), in nl80211_parse_sched_scan()
8895 err = -EINVAL; in nl80211_parse_sched_scan()
8900 memcpy(request->match_sets[i].ssid.ssid, in nl80211_parse_sched_scan()
8902 request->match_sets[i].ssid.ssid_len = in nl80211_parse_sched_scan()
8906 memcpy(request->match_sets[i].bssid, in nl80211_parse_sched_scan()
8909 /* special attribute - old implementation w/a */ in nl80211_parse_sched_scan()
8910 request->match_sets[i].rssi_thold = default_match_rssi; in nl80211_parse_sched_scan()
8913 request->match_sets[i].rssi_thold = in nl80211_parse_sched_scan()
8918 &request->match_sets[i], in nl80211_parse_sched_scan()
8920 request->match_sets[i].rssi_thold); in nl80211_parse_sched_scan()
8929 request->match_sets[0].rssi_thold = default_match_rssi; in nl80211_parse_sched_scan()
8931 request->min_rssi_thold = INT_MAX; in nl80211_parse_sched_scan()
8933 request->min_rssi_thold = in nl80211_parse_sched_scan()
8934 min(request->match_sets[i].rssi_thold, in nl80211_parse_sched_scan()
8935 request->min_rssi_thold); in nl80211_parse_sched_scan()
8937 request->min_rssi_thold = NL80211_SCAN_RSSI_THOLD_OFF; in nl80211_parse_sched_scan()
8941 request->ie_len = ie_len; in nl80211_parse_sched_scan()
8942 memcpy((void *)request->ie, in nl80211_parse_sched_scan()
8944 request->ie_len); in nl80211_parse_sched_scan()
8952 request->delay = in nl80211_parse_sched_scan()
8956 request->relative_rssi = nla_get_s8( in nl80211_parse_sched_scan()
8958 request->relative_rssi_set = true; in nl80211_parse_sched_scan()
8961 if (request->relative_rssi_set && in nl80211_parse_sched_scan()
8967 request->rssi_adjust.band = rssi_adjust->band; in nl80211_parse_sched_scan()
8968 request->rssi_adjust.delta = rssi_adjust->delta; in nl80211_parse_sched_scan()
8969 if (!is_band_valid(wiphy, request->rssi_adjust.band)) { in nl80211_parse_sched_scan()
8970 err = -EINVAL; in nl80211_parse_sched_scan()
8979 request->scan_start = jiffies; in nl80211_parse_sched_scan()
8991 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_start_sched_scan()
8992 struct net_device *dev = info->user_ptr[1]; in nl80211_start_sched_scan()
8993 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_start_sched_scan()
8998 if (!rdev->wiphy.max_sched_scan_reqs || !rdev->ops->sched_scan_start) in nl80211_start_sched_scan()
8999 return -EOPNOTSUPP; in nl80211_start_sched_scan()
9001 want_multi = info->attrs[NL80211_ATTR_SCHED_SCAN_MULTI]; in nl80211_start_sched_scan()
9006 sched_scan_req = nl80211_parse_sched_scan(&rdev->wiphy, wdev, in nl80211_start_sched_scan()
9007 info->attrs, in nl80211_start_sched_scan()
9008 rdev->wiphy.max_match_sets); in nl80211_start_sched_scan()
9015 * or if driver does not support multi-scheduled scan in nl80211_start_sched_scan()
9017 if (want_multi && rdev->wiphy.max_sched_scan_reqs > 1) in nl80211_start_sched_scan()
9018 sched_scan_req->reqid = cfg80211_assign_cookie(rdev); in nl80211_start_sched_scan()
9024 sched_scan_req->dev = dev; in nl80211_start_sched_scan()
9025 sched_scan_req->wiphy = &rdev->wiphy; in nl80211_start_sched_scan()
9027 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) in nl80211_start_sched_scan()
9028 sched_scan_req->owner_nlportid = info->snd_portid; in nl80211_start_sched_scan()
9045 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_stop_sched_scan()
9048 if (!rdev->wiphy.max_sched_scan_reqs || !rdev->ops->sched_scan_stop) in nl80211_stop_sched_scan()
9049 return -EOPNOTSUPP; in nl80211_stop_sched_scan()
9051 if (info->attrs[NL80211_ATTR_COOKIE]) { in nl80211_stop_sched_scan()
9052 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); in nl80211_stop_sched_scan()
9056 req = list_first_or_null_rcu(&rdev->sched_scan_req_list, in nl80211_stop_sched_scan()
9059 if (!req || req->reqid || in nl80211_stop_sched_scan()
9060 (req->owner_nlportid && in nl80211_stop_sched_scan()
9061 req->owner_nlportid != info->snd_portid)) in nl80211_stop_sched_scan()
9062 return -ENOENT; in nl80211_stop_sched_scan()
9070 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_start_radar_detection()
9071 struct net_device *dev = info->user_ptr[1]; in nl80211_start_radar_detection()
9072 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_start_radar_detection()
9073 struct wiphy *wiphy = wdev->wiphy; in nl80211_start_radar_detection()
9081 return -EINVAL; in nl80211_start_radar_detection()
9088 return -EBUSY; in nl80211_start_radar_detection()
9090 if (wdev->cac_started) in nl80211_start_radar_detection()
9091 return -EBUSY; in nl80211_start_radar_detection()
9093 err = cfg80211_chandef_dfs_required(wiphy, &chandef, wdev->iftype); in nl80211_start_radar_detection()
9098 return -EINVAL; in nl80211_start_radar_detection()
9101 return -EINVAL; in nl80211_start_radar_detection()
9105 return -EOPNOTSUPP; in nl80211_start_radar_detection()
9107 if (!rdev->ops->start_radar_detection) in nl80211_start_radar_detection()
9108 return -EOPNOTSUPP; in nl80211_start_radar_detection()
9110 cac_time_ms = cfg80211_chandef_dfs_cac_time(&rdev->wiphy, &chandef); in nl80211_start_radar_detection()
9116 wdev->chandef = chandef; in nl80211_start_radar_detection()
9117 wdev->cac_started = true; in nl80211_start_radar_detection()
9118 wdev->cac_start_time = jiffies; in nl80211_start_radar_detection()
9119 wdev->cac_time_ms = cac_time_ms; in nl80211_start_radar_detection()
9127 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_notify_radar_detection()
9128 struct net_device *dev = info->user_ptr[1]; in nl80211_notify_radar_detection()
9129 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_notify_radar_detection()
9130 struct wiphy *wiphy = wdev->wiphy; in nl80211_notify_radar_detection()
9139 return -EINVAL; in nl80211_notify_radar_detection()
9148 err = cfg80211_chandef_dfs_required(wiphy, &chandef, wdev->iftype); in nl80211_notify_radar_detection()
9157 return -EINVAL; in nl80211_notify_radar_detection()
9163 if (chandef.chan->dfs_state == NL80211_DFS_UNAVAILABLE) in nl80211_notify_radar_detection()
9170 rdev->radar_chandef = chandef; in nl80211_notify_radar_detection()
9173 queue_work(cfg80211_wq, &rdev->propagate_radar_detect_wk); in nl80211_notify_radar_detection()
9180 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_channel_switch()
9181 struct net_device *dev = info->user_ptr[1]; in nl80211_channel_switch()
9182 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_channel_switch()
9191 if (!rdev->ops->channel_switch || in nl80211_channel_switch()
9192 !(rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH)) in nl80211_channel_switch()
9193 return -EOPNOTSUPP; in nl80211_channel_switch()
9195 switch (dev->ieee80211_ptr->iftype) { in nl80211_channel_switch()
9207 if (!wdev->beacon_interval) in nl80211_channel_switch()
9208 return -ENOTCONN; in nl80211_channel_switch()
9211 if (!wdev->ssid_len) in nl80211_channel_switch()
9212 return -ENOTCONN; in nl80211_channel_switch()
9215 if (!wdev->mesh_id_len) in nl80211_channel_switch()
9216 return -ENOTCONN; in nl80211_channel_switch()
9219 return -EOPNOTSUPP; in nl80211_channel_switch()
9223 params.beacon_csa.ftm_responder = -1; in nl80211_channel_switch()
9225 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ] || in nl80211_channel_switch()
9226 !info->attrs[NL80211_ATTR_CH_SWITCH_COUNT]) in nl80211_channel_switch()
9227 return -EINVAL; in nl80211_channel_switch()
9230 if (need_new_beacon && !info->attrs[NL80211_ATTR_CSA_IES]) in nl80211_channel_switch()
9231 return -EINVAL; in nl80211_channel_switch()
9236 cs_count = nla_get_u32(info->attrs[NL80211_ATTR_CH_SWITCH_COUNT]); in nl80211_channel_switch()
9238 return -EINVAL; in nl80211_channel_switch()
9245 err = nl80211_parse_beacon(rdev, info->attrs, ¶ms.beacon_after); in nl80211_channel_switch()
9252 return -ENOMEM; in nl80211_channel_switch()
9255 info->attrs[NL80211_ATTR_CSA_IES], in nl80211_channel_switch()
9256 nl80211_policy, info->extack); in nl80211_channel_switch()
9265 err = -EINVAL; in nl80211_channel_switch()
9271 err = -EINVAL; in nl80211_channel_switch()
9276 if (rdev->wiphy.max_num_csa_counters && in nl80211_channel_switch()
9278 rdev->wiphy.max_num_csa_counters)) { in nl80211_channel_switch()
9279 err = -EINVAL; in nl80211_channel_switch()
9286 /* sanity checks - counters should fit and be the same */ in nl80211_channel_switch()
9291 err = -EINVAL; in nl80211_channel_switch()
9296 err = -EINVAL; in nl80211_channel_switch()
9304 err = -EINVAL; in nl80211_channel_switch()
9309 if (rdev->wiphy.max_num_csa_counters && in nl80211_channel_switch()
9311 rdev->wiphy.max_num_csa_counters)) { in nl80211_channel_switch()
9312 err = -EINVAL; in nl80211_channel_switch()
9319 /* sanity checks - counters should fit and be the same */ in nl80211_channel_switch()
9324 err = -EINVAL; in nl80211_channel_switch()
9330 err = -EINVAL; in nl80211_channel_switch()
9341 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, ¶ms.chandef, in nl80211_channel_switch()
9342 wdev->iftype)) { in nl80211_channel_switch()
9343 err = -EINVAL; in nl80211_channel_switch()
9347 err = cfg80211_chandef_dfs_required(wdev->wiphy, in nl80211_channel_switch()
9349 wdev->iftype); in nl80211_channel_switch()
9356 !nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS])) { in nl80211_channel_switch()
9357 err = -EINVAL; in nl80211_channel_switch()
9362 if (info->attrs[NL80211_ATTR_CH_SWITCH_BLOCK_TX]) in nl80211_channel_switch()
9380 struct cfg80211_bss *res = &intbss->pub; in nl80211_send_bss()
9387 hdr = nl80211hdr_put(msg, NETLINK_CB(cb->skb).portid, seq, flags, in nl80211_send_bss()
9390 return -1; in nl80211_send_bss()
9394 if (nla_put_u32(msg, NL80211_ATTR_GENERATION, rdev->bss_generation)) in nl80211_send_bss()
9396 if (wdev->netdev && in nl80211_send_bss()
9397 nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex)) in nl80211_send_bss()
9406 if ((!is_zero_ether_addr(res->bssid) && in nl80211_send_bss()
9407 nla_put(msg, NL80211_BSS_BSSID, ETH_ALEN, res->bssid))) in nl80211_send_bss()
9412 if (rcu_access_pointer(res->proberesp_ies) && in nl80211_send_bss()
9419 ies = rcu_dereference(res->ies); in nl80211_send_bss()
9421 if (nla_put_u64_64bit(msg, NL80211_BSS_TSF, ies->tsf, in nl80211_send_bss()
9424 if (ies->len && nla_put(msg, NL80211_BSS_INFORMATION_ELEMENTS, in nl80211_send_bss()
9425 ies->len, ies->data)) in nl80211_send_bss()
9430 ies = rcu_dereference(res->beacon_ies); in nl80211_send_bss()
9431 if (ies && ies->from_beacon) { in nl80211_send_bss()
9432 if (nla_put_u64_64bit(msg, NL80211_BSS_BEACON_TSF, ies->tsf, in nl80211_send_bss()
9435 if (ies->len && nla_put(msg, NL80211_BSS_BEACON_IES, in nl80211_send_bss()
9436 ies->len, ies->data)) in nl80211_send_bss()
9441 if (res->beacon_interval && in nl80211_send_bss()
9442 nla_put_u16(msg, NL80211_BSS_BEACON_INTERVAL, res->beacon_interval)) in nl80211_send_bss()
9444 if (nla_put_u16(msg, NL80211_BSS_CAPABILITY, res->capability) || in nl80211_send_bss()
9445 nla_put_u32(msg, NL80211_BSS_FREQUENCY, res->channel->center_freq) || in nl80211_send_bss()
9447 res->channel->freq_offset) || in nl80211_send_bss()
9448 nla_put_u32(msg, NL80211_BSS_CHAN_WIDTH, res->scan_width) || in nl80211_send_bss()
9450 jiffies_to_msecs(jiffies - intbss->ts))) in nl80211_send_bss()
9453 if (intbss->parent_tsf && in nl80211_send_bss()
9455 intbss->parent_tsf, NL80211_BSS_PAD) || in nl80211_send_bss()
9457 intbss->parent_bssid))) in nl80211_send_bss()
9460 if (intbss->ts_boottime && in nl80211_send_bss()
9462 intbss->ts_boottime, NL80211_BSS_PAD)) in nl80211_send_bss()
9465 if (!nl80211_put_signal(msg, intbss->pub.chains, in nl80211_send_bss()
9466 intbss->pub.chain_signal, in nl80211_send_bss()
9470 switch (rdev->wiphy.signal_type) { in nl80211_send_bss()
9472 if (nla_put_u32(msg, NL80211_BSS_SIGNAL_MBM, res->signal)) in nl80211_send_bss()
9476 if (nla_put_u8(msg, NL80211_BSS_SIGNAL_UNSPEC, res->signal)) in nl80211_send_bss()
9483 switch (wdev->iftype) { in nl80211_send_bss()
9486 if (intbss == wdev->current_bss && in nl80211_send_bss()
9492 if (intbss == wdev->current_bss && in nl80211_send_bss()
9510 return -EMSGSIZE; in nl80211_send_bss()
9518 int start = cb->args[2], idx = 0; in nl80211_dump_scan()
9525 __acquire(&rdev->wiphy.mtx); in nl80211_dump_scan()
9528 spin_lock_bh(&rdev->bss_lock); in nl80211_dump_scan()
9532 * into multiple messages. It is unlikely that any more bss-es will be in nl80211_dump_scan()
9539 cb->seq = rdev->bss_generation; in nl80211_dump_scan()
9541 list_for_each_entry(scan, &rdev->bss_list, list) { in nl80211_dump_scan()
9545 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_dump_scan()
9547 idx--; in nl80211_dump_scan()
9552 spin_unlock_bh(&rdev->bss_lock); in nl80211_dump_scan()
9555 cb->args[2] = idx; in nl80211_dump_scan()
9556 wiphy_unlock(&rdev->wiphy); in nl80211_dump_scan()
9558 return skb->len; in nl80211_dump_scan()
9570 if (!survey->channel && !allow_radio_stats) in nl80211_send_survey()
9576 return -ENOMEM; in nl80211_send_survey()
9578 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) in nl80211_send_survey()
9585 if (survey->channel && in nl80211_send_survey()
9587 survey->channel->center_freq)) in nl80211_send_survey()
9590 if (survey->channel && survey->channel->freq_offset && in nl80211_send_survey()
9592 survey->channel->freq_offset)) in nl80211_send_survey()
9595 if ((survey->filled & SURVEY_INFO_NOISE_DBM) && in nl80211_send_survey()
9596 nla_put_u8(msg, NL80211_SURVEY_INFO_NOISE, survey->noise)) in nl80211_send_survey()
9598 if ((survey->filled & SURVEY_INFO_IN_USE) && in nl80211_send_survey()
9601 if ((survey->filled & SURVEY_INFO_TIME) && in nl80211_send_survey()
9603 survey->time, NL80211_SURVEY_INFO_PAD)) in nl80211_send_survey()
9605 if ((survey->filled & SURVEY_INFO_TIME_BUSY) && in nl80211_send_survey()
9607 survey->time_busy, NL80211_SURVEY_INFO_PAD)) in nl80211_send_survey()
9609 if ((survey->filled & SURVEY_INFO_TIME_EXT_BUSY) && in nl80211_send_survey()
9611 survey->time_ext_busy, NL80211_SURVEY_INFO_PAD)) in nl80211_send_survey()
9613 if ((survey->filled & SURVEY_INFO_TIME_RX) && in nl80211_send_survey()
9615 survey->time_rx, NL80211_SURVEY_INFO_PAD)) in nl80211_send_survey()
9617 if ((survey->filled & SURVEY_INFO_TIME_TX) && in nl80211_send_survey()
9619 survey->time_tx, NL80211_SURVEY_INFO_PAD)) in nl80211_send_survey()
9621 if ((survey->filled & SURVEY_INFO_TIME_SCAN) && in nl80211_send_survey()
9623 survey->time_scan, NL80211_SURVEY_INFO_PAD)) in nl80211_send_survey()
9625 if ((survey->filled & SURVEY_INFO_TIME_BSS_RX) && in nl80211_send_survey()
9627 survey->time_bss_rx, NL80211_SURVEY_INFO_PAD)) in nl80211_send_survey()
9637 return -EMSGSIZE; in nl80211_send_survey()
9646 int survey_idx = cb->args[2]; in nl80211_dump_survey()
9652 return -ENOMEM; in nl80211_dump_survey()
9660 __acquire(&rdev->wiphy.mtx); in nl80211_dump_survey()
9665 if (!wdev->netdev) { in nl80211_dump_survey()
9666 res = -EINVAL; in nl80211_dump_survey()
9670 if (!rdev->ops->dump_survey) { in nl80211_dump_survey()
9671 res = -EOPNOTSUPP; in nl80211_dump_survey()
9676 res = rdev_dump_survey(rdev, wdev->netdev, survey_idx, &survey); in nl80211_dump_survey()
9677 if (res == -ENOENT) in nl80211_dump_survey()
9682 /* don't send disabled channels, but do send non-channel data */ in nl80211_dump_survey()
9684 survey.channel->flags & IEEE80211_CHAN_DISABLED) { in nl80211_dump_survey()
9690 NETLINK_CB(cb->skb).portid, in nl80211_dump_survey()
9691 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_dump_survey()
9692 wdev->netdev, radio_stats, &survey) < 0) in nl80211_dump_survey()
9698 cb->args[2] = survey_idx; in nl80211_dump_survey()
9699 res = skb->len; in nl80211_dump_survey()
9702 wiphy_unlock(&rdev->wiphy); in nl80211_dump_survey()
9715 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_authenticate()
9716 struct net_device *dev = info->user_ptr[1]; in nl80211_authenticate()
9725 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_authenticate()
9726 return -EINVAL; in nl80211_authenticate()
9728 if (!info->attrs[NL80211_ATTR_AUTH_TYPE]) in nl80211_authenticate()
9729 return -EINVAL; in nl80211_authenticate()
9731 if (!info->attrs[NL80211_ATTR_SSID]) in nl80211_authenticate()
9732 return -EINVAL; in nl80211_authenticate()
9734 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ]) in nl80211_authenticate()
9735 return -EINVAL; in nl80211_authenticate()
9742 if (key.type != -1 && key.type != NL80211_KEYTYPE_GROUP) in nl80211_authenticate()
9743 return -EINVAL; in nl80211_authenticate()
9745 return -EINVAL; in nl80211_authenticate()
9750 return -EINVAL; in nl80211_authenticate()
9752 return -EINVAL; in nl80211_authenticate()
9762 for (i = 0; i < rdev->wiphy.n_cipher_suites; i++) { in nl80211_authenticate()
9763 if (key.p.cipher == rdev->wiphy.cipher_suites[i]) { in nl80211_authenticate()
9769 return -EINVAL; in nl80211_authenticate()
9772 if (!rdev->ops->auth) in nl80211_authenticate()
9773 return -EOPNOTSUPP; in nl80211_authenticate()
9775 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_authenticate()
9776 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_authenticate()
9777 return -EOPNOTSUPP; in nl80211_authenticate()
9779 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_authenticate()
9780 freq = MHZ_TO_KHZ(nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ])); in nl80211_authenticate()
9781 if (info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]) in nl80211_authenticate()
9783 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]); in nl80211_authenticate()
9785 chan = nl80211_get_valid_chan(&rdev->wiphy, freq); in nl80211_authenticate()
9787 return -EINVAL; in nl80211_authenticate()
9789 ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); in nl80211_authenticate()
9790 ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); in nl80211_authenticate()
9792 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_authenticate()
9793 ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_authenticate()
9794 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_authenticate()
9797 auth_type = nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]); in nl80211_authenticate()
9799 return -EINVAL; in nl80211_authenticate()
9805 !info->attrs[NL80211_ATTR_AUTH_DATA]) in nl80211_authenticate()
9806 return -EINVAL; in nl80211_authenticate()
9808 if (info->attrs[NL80211_ATTR_AUTH_DATA]) { in nl80211_authenticate()
9813 return -EINVAL; in nl80211_authenticate()
9814 auth_data = nla_data(info->attrs[NL80211_ATTR_AUTH_DATA]); in nl80211_authenticate()
9815 auth_data_len = nla_len(info->attrs[NL80211_ATTR_AUTH_DATA]); in nl80211_authenticate()
9818 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; in nl80211_authenticate()
9827 wdev_lock(dev->ieee80211_ptr); in nl80211_authenticate()
9832 wdev_unlock(dev->ieee80211_ptr); in nl80211_authenticate()
9839 if (!info->attrs[NL80211_ATTR_SOCKET_OWNER]) { in validate_pae_over_nl80211()
9841 return -EINVAL; in validate_pae_over_nl80211()
9844 if (!rdev->ops->tx_control_port || in validate_pae_over_nl80211()
9845 !wiphy_ext_feature_isset(&rdev->wiphy, in validate_pae_over_nl80211()
9847 return -EOPNOTSUPP; in validate_pae_over_nl80211()
9859 settings->control_port = info->attrs[NL80211_ATTR_CONTROL_PORT]; in nl80211_crypto_settings()
9861 if (info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]) { in nl80211_crypto_settings()
9865 info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]); in nl80211_crypto_settings()
9866 settings->control_port_ethertype = cpu_to_be16(proto); in nl80211_crypto_settings()
9867 if (!(rdev->wiphy.flags & WIPHY_FLAG_CONTROL_PORT_PROTOCOL) && in nl80211_crypto_settings()
9869 return -EINVAL; in nl80211_crypto_settings()
9870 if (info->attrs[NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT]) in nl80211_crypto_settings()
9871 settings->control_port_no_encrypt = true; in nl80211_crypto_settings()
9873 settings->control_port_ethertype = cpu_to_be16(ETH_P_PAE); in nl80211_crypto_settings()
9875 if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) { in nl80211_crypto_settings()
9881 settings->control_port_over_nl80211 = true; in nl80211_crypto_settings()
9883 if (info->attrs[NL80211_ATTR_CONTROL_PORT_NO_PREAUTH]) in nl80211_crypto_settings()
9884 settings->control_port_no_preauth = true; in nl80211_crypto_settings()
9887 if (info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]) { in nl80211_crypto_settings()
9891 data = nla_data(info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]); in nl80211_crypto_settings()
9892 len = nla_len(info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]); in nl80211_crypto_settings()
9893 settings->n_ciphers_pairwise = len / sizeof(u32); in nl80211_crypto_settings()
9896 return -EINVAL; in nl80211_crypto_settings()
9898 if (settings->n_ciphers_pairwise > cipher_limit) in nl80211_crypto_settings()
9899 return -EINVAL; in nl80211_crypto_settings()
9901 memcpy(settings->ciphers_pairwise, data, len); in nl80211_crypto_settings()
9903 for (i = 0; i < settings->n_ciphers_pairwise; i++) in nl80211_crypto_settings()
9905 &rdev->wiphy, in nl80211_crypto_settings()
9906 settings->ciphers_pairwise[i])) in nl80211_crypto_settings()
9907 return -EINVAL; in nl80211_crypto_settings()
9910 if (info->attrs[NL80211_ATTR_CIPHER_SUITE_GROUP]) { in nl80211_crypto_settings()
9911 settings->cipher_group = in nl80211_crypto_settings()
9912 nla_get_u32(info->attrs[NL80211_ATTR_CIPHER_SUITE_GROUP]); in nl80211_crypto_settings()
9913 if (!cfg80211_supported_cipher_suite(&rdev->wiphy, in nl80211_crypto_settings()
9914 settings->cipher_group)) in nl80211_crypto_settings()
9915 return -EINVAL; in nl80211_crypto_settings()
9918 if (info->attrs[NL80211_ATTR_WPA_VERSIONS]) { in nl80211_crypto_settings()
9919 settings->wpa_versions = in nl80211_crypto_settings()
9920 nla_get_u32(info->attrs[NL80211_ATTR_WPA_VERSIONS]); in nl80211_crypto_settings()
9921 if (!nl80211_valid_wpa_versions(settings->wpa_versions)) in nl80211_crypto_settings()
9922 return -EINVAL; in nl80211_crypto_settings()
9925 if (info->attrs[NL80211_ATTR_AKM_SUITES]) { in nl80211_crypto_settings()
9929 data = nla_data(info->attrs[NL80211_ATTR_AKM_SUITES]); in nl80211_crypto_settings()
9930 len = nla_len(info->attrs[NL80211_ATTR_AKM_SUITES]); in nl80211_crypto_settings()
9931 settings->n_akm_suites = len / sizeof(u32); in nl80211_crypto_settings()
9934 return -EINVAL; in nl80211_crypto_settings()
9936 if (settings->n_akm_suites > NL80211_MAX_NR_AKM_SUITES) in nl80211_crypto_settings()
9937 return -EINVAL; in nl80211_crypto_settings()
9939 memcpy(settings->akm_suites, data, len); in nl80211_crypto_settings()
9942 if (info->attrs[NL80211_ATTR_PMK]) { in nl80211_crypto_settings()
9943 if (nla_len(info->attrs[NL80211_ATTR_PMK]) != WLAN_PMK_LEN) in nl80211_crypto_settings()
9944 return -EINVAL; in nl80211_crypto_settings()
9945 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_crypto_settings()
9947 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_crypto_settings()
9949 return -EINVAL; in nl80211_crypto_settings()
9950 settings->psk = nla_data(info->attrs[NL80211_ATTR_PMK]); in nl80211_crypto_settings()
9953 if (info->attrs[NL80211_ATTR_SAE_PASSWORD]) { in nl80211_crypto_settings()
9954 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_crypto_settings()
9956 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_crypto_settings()
9958 return -EINVAL; in nl80211_crypto_settings()
9959 settings->sae_pwd = in nl80211_crypto_settings()
9960 nla_data(info->attrs[NL80211_ATTR_SAE_PASSWORD]); in nl80211_crypto_settings()
9961 settings->sae_pwd_len = in nl80211_crypto_settings()
9962 nla_len(info->attrs[NL80211_ATTR_SAE_PASSWORD]); in nl80211_crypto_settings()
9965 if (info->attrs[NL80211_ATTR_SAE_PWE]) in nl80211_crypto_settings()
9966 settings->sae_pwe = in nl80211_crypto_settings()
9967 nla_get_u8(info->attrs[NL80211_ATTR_SAE_PWE]); in nl80211_crypto_settings()
9969 settings->sae_pwe = NL80211_SAE_PWE_UNSPECIFIED; in nl80211_crypto_settings()
9976 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_associate()
9977 struct net_device *dev = info->user_ptr[1]; in nl80211_associate()
9984 if (dev->ieee80211_ptr->conn_owner_nlportid && in nl80211_associate()
9985 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) in nl80211_associate()
9986 return -EPERM; in nl80211_associate()
9988 if (!info->attrs[NL80211_ATTR_MAC] || in nl80211_associate()
9989 !info->attrs[NL80211_ATTR_SSID] || in nl80211_associate()
9990 !info->attrs[NL80211_ATTR_WIPHY_FREQ]) in nl80211_associate()
9991 return -EINVAL; in nl80211_associate()
9993 if (!rdev->ops->assoc) in nl80211_associate()
9994 return -EOPNOTSUPP; in nl80211_associate()
9996 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_associate()
9997 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_associate()
9998 return -EOPNOTSUPP; in nl80211_associate()
10000 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_associate()
10002 freq = MHZ_TO_KHZ(nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ])); in nl80211_associate()
10003 if (info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]) in nl80211_associate()
10005 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]); in nl80211_associate()
10006 chan = nl80211_get_valid_chan(&rdev->wiphy, freq); in nl80211_associate()
10008 return -EINVAL; in nl80211_associate()
10010 ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); in nl80211_associate()
10011 ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); in nl80211_associate()
10013 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_associate()
10014 req.ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_associate()
10015 req.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_associate()
10018 if (info->attrs[NL80211_ATTR_USE_MFP]) { in nl80211_associate()
10020 nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]); in nl80211_associate()
10024 return -EINVAL; in nl80211_associate()
10027 if (info->attrs[NL80211_ATTR_PREV_BSSID]) in nl80211_associate()
10028 req.prev_bssid = nla_data(info->attrs[NL80211_ATTR_PREV_BSSID]); in nl80211_associate()
10030 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HT])) in nl80211_associate()
10033 if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) in nl80211_associate()
10035 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]), in nl80211_associate()
10038 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) { in nl80211_associate()
10039 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) in nl80211_associate()
10040 return -EINVAL; in nl80211_associate()
10042 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]), in nl80211_associate()
10046 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_VHT])) in nl80211_associate()
10049 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HE])) in nl80211_associate()
10052 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) in nl80211_associate()
10054 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]), in nl80211_associate()
10057 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) { in nl80211_associate()
10058 if (!info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) in nl80211_associate()
10059 return -EINVAL; in nl80211_associate()
10061 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]), in nl80211_associate()
10065 if (nla_get_flag(info->attrs[NL80211_ATTR_USE_RRM])) { in nl80211_associate()
10066 if (!((rdev->wiphy.features & in nl80211_associate()
10068 (rdev->wiphy.features & NL80211_FEATURE_QUIET)) && in nl80211_associate()
10069 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_associate()
10071 return -EINVAL; in nl80211_associate()
10075 if (info->attrs[NL80211_ATTR_FILS_KEK]) { in nl80211_associate()
10076 req.fils_kek = nla_data(info->attrs[NL80211_ATTR_FILS_KEK]); in nl80211_associate()
10077 req.fils_kek_len = nla_len(info->attrs[NL80211_ATTR_FILS_KEK]); in nl80211_associate()
10078 if (!info->attrs[NL80211_ATTR_FILS_NONCES]) in nl80211_associate()
10079 return -EINVAL; in nl80211_associate()
10081 nla_data(info->attrs[NL80211_ATTR_FILS_NONCES]); in nl80211_associate()
10084 if (info->attrs[NL80211_ATTR_S1G_CAPABILITY_MASK]) { in nl80211_associate()
10085 if (!info->attrs[NL80211_ATTR_S1G_CAPABILITY]) in nl80211_associate()
10086 return -EINVAL; in nl80211_associate()
10088 nla_data(info->attrs[NL80211_ATTR_S1G_CAPABILITY_MASK]), in nl80211_associate()
10092 if (info->attrs[NL80211_ATTR_S1G_CAPABILITY]) { in nl80211_associate()
10093 if (!info->attrs[NL80211_ATTR_S1G_CAPABILITY_MASK]) in nl80211_associate()
10094 return -EINVAL; in nl80211_associate()
10096 nla_data(info->attrs[NL80211_ATTR_S1G_CAPABILITY]), in nl80211_associate()
10102 wdev_lock(dev->ieee80211_ptr); in nl80211_associate()
10107 if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) { in nl80211_associate()
10108 dev->ieee80211_ptr->conn_owner_nlportid = in nl80211_associate()
10109 info->snd_portid; in nl80211_associate()
10110 memcpy(dev->ieee80211_ptr->disconnect_bssid, in nl80211_associate()
10114 wdev_unlock(dev->ieee80211_ptr); in nl80211_associate()
10122 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_deauthenticate()
10123 struct net_device *dev = info->user_ptr[1]; in nl80211_deauthenticate()
10129 if (dev->ieee80211_ptr->conn_owner_nlportid && in nl80211_deauthenticate()
10130 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) in nl80211_deauthenticate()
10131 return -EPERM; in nl80211_deauthenticate()
10133 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_deauthenticate()
10134 return -EINVAL; in nl80211_deauthenticate()
10136 if (!info->attrs[NL80211_ATTR_REASON_CODE]) in nl80211_deauthenticate()
10137 return -EINVAL; in nl80211_deauthenticate()
10139 if (!rdev->ops->deauth) in nl80211_deauthenticate()
10140 return -EOPNOTSUPP; in nl80211_deauthenticate()
10142 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_deauthenticate()
10143 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_deauthenticate()
10144 return -EOPNOTSUPP; in nl80211_deauthenticate()
10146 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_deauthenticate()
10148 reason_code = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); in nl80211_deauthenticate()
10151 return -EINVAL; in nl80211_deauthenticate()
10154 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_deauthenticate()
10155 ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_deauthenticate()
10156 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_deauthenticate()
10159 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; in nl80211_deauthenticate()
10161 wdev_lock(dev->ieee80211_ptr); in nl80211_deauthenticate()
10164 wdev_unlock(dev->ieee80211_ptr); in nl80211_deauthenticate()
10170 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_disassociate()
10171 struct net_device *dev = info->user_ptr[1]; in nl80211_disassociate()
10177 if (dev->ieee80211_ptr->conn_owner_nlportid && in nl80211_disassociate()
10178 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) in nl80211_disassociate()
10179 return -EPERM; in nl80211_disassociate()
10181 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_disassociate()
10182 return -EINVAL; in nl80211_disassociate()
10184 if (!info->attrs[NL80211_ATTR_REASON_CODE]) in nl80211_disassociate()
10185 return -EINVAL; in nl80211_disassociate()
10187 if (!rdev->ops->disassoc) in nl80211_disassociate()
10188 return -EOPNOTSUPP; in nl80211_disassociate()
10190 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_disassociate()
10191 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_disassociate()
10192 return -EOPNOTSUPP; in nl80211_disassociate()
10194 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_disassociate()
10196 reason_code = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); in nl80211_disassociate()
10199 return -EINVAL; in nl80211_disassociate()
10202 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_disassociate()
10203 ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_disassociate()
10204 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_disassociate()
10207 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; in nl80211_disassociate()
10209 wdev_lock(dev->ieee80211_ptr); in nl80211_disassociate()
10212 wdev_unlock(dev->ieee80211_ptr); in nl80211_disassociate()
10221 struct wiphy *wiphy = &rdev->wiphy; in nl80211_parse_mcast_rate()
10228 sband = wiphy->bands[band]; in nl80211_parse_mcast_rate()
10232 for (i = 0; i < sband->n_bitrates; i++) { in nl80211_parse_mcast_rate()
10233 if (sband->bitrates[i].bitrate == rateval) { in nl80211_parse_mcast_rate()
10246 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_join_ibss()
10247 struct net_device *dev = info->user_ptr[1]; in nl80211_join_ibss()
10255 if (!info->attrs[NL80211_ATTR_SSID] || in nl80211_join_ibss()
10256 !nla_len(info->attrs[NL80211_ATTR_SSID])) in nl80211_join_ibss()
10257 return -EINVAL; in nl80211_join_ibss()
10261 if (info->attrs[NL80211_ATTR_BEACON_INTERVAL]) in nl80211_join_ibss()
10263 nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]); in nl80211_join_ibss()
10270 if (!rdev->ops->join_ibss) in nl80211_join_ibss()
10271 return -EOPNOTSUPP; in nl80211_join_ibss()
10273 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC) in nl80211_join_ibss()
10274 return -EOPNOTSUPP; in nl80211_join_ibss()
10276 wiphy = &rdev->wiphy; in nl80211_join_ibss()
10278 if (info->attrs[NL80211_ATTR_MAC]) { in nl80211_join_ibss()
10279 ibss.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_join_ibss()
10282 return -EINVAL; in nl80211_join_ibss()
10284 ibss.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); in nl80211_join_ibss()
10285 ibss.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); in nl80211_join_ibss()
10287 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_join_ibss()
10288 ibss.ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_join_ibss()
10289 ibss.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_join_ibss()
10296 if (!cfg80211_reg_can_beacon(&rdev->wiphy, &ibss.chandef, in nl80211_join_ibss()
10298 return -EINVAL; in nl80211_join_ibss()
10307 if (!(rdev->wiphy.features & NL80211_FEATURE_HT_IBSS)) in nl80211_join_ibss()
10308 return -EINVAL; in nl80211_join_ibss()
10313 if (!(rdev->wiphy.features & NL80211_FEATURE_HT_IBSS)) in nl80211_join_ibss()
10314 return -EINVAL; in nl80211_join_ibss()
10315 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_join_ibss()
10317 return -EINVAL; in nl80211_join_ibss()
10320 return -EINVAL; in nl80211_join_ibss()
10323 ibss.channel_fixed = !!info->attrs[NL80211_ATTR_FREQ_FIXED]; in nl80211_join_ibss()
10324 ibss.privacy = !!info->attrs[NL80211_ATTR_PRIVACY]; in nl80211_join_ibss()
10326 if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) { in nl80211_join_ibss()
10328 nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); in nl80211_join_ibss()
10330 nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); in nl80211_join_ibss()
10332 wiphy->bands[ibss.chandef.chan->band]; in nl80211_join_ibss()
10340 if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) in nl80211_join_ibss()
10342 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]), in nl80211_join_ibss()
10345 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) { in nl80211_join_ibss()
10346 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) in nl80211_join_ibss()
10347 return -EINVAL; in nl80211_join_ibss()
10349 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]), in nl80211_join_ibss()
10353 if (info->attrs[NL80211_ATTR_MCAST_RATE] && in nl80211_join_ibss()
10355 nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]))) in nl80211_join_ibss()
10356 return -EINVAL; in nl80211_join_ibss()
10358 if (ibss.privacy && info->attrs[NL80211_ATTR_KEYS]) { in nl80211_join_ibss()
10368 return -EINVAL; in nl80211_join_ibss()
10373 nla_get_flag(info->attrs[NL80211_ATTR_CONTROL_PORT]); in nl80211_join_ibss()
10375 if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) { in nl80211_join_ibss()
10387 nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS]); in nl80211_join_ibss()
10389 wdev_lock(dev->ieee80211_ptr); in nl80211_join_ibss()
10393 else if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) in nl80211_join_ibss()
10394 dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid; in nl80211_join_ibss()
10395 wdev_unlock(dev->ieee80211_ptr); in nl80211_join_ibss()
10402 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_leave_ibss()
10403 struct net_device *dev = info->user_ptr[1]; in nl80211_leave_ibss()
10405 if (!rdev->ops->leave_ibss) in nl80211_leave_ibss()
10406 return -EOPNOTSUPP; in nl80211_leave_ibss()
10408 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC) in nl80211_leave_ibss()
10409 return -EOPNOTSUPP; in nl80211_leave_ibss()
10416 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_mcast_rate()
10417 struct net_device *dev = info->user_ptr[1]; in nl80211_set_mcast_rate()
10422 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC && in nl80211_set_mcast_rate()
10423 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT && in nl80211_set_mcast_rate()
10424 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_OCB) in nl80211_set_mcast_rate()
10425 return -EOPNOTSUPP; in nl80211_set_mcast_rate()
10427 if (!rdev->ops->set_mcast_rate) in nl80211_set_mcast_rate()
10428 return -EOPNOTSUPP; in nl80211_set_mcast_rate()
10432 if (!info->attrs[NL80211_ATTR_MCAST_RATE]) in nl80211_set_mcast_rate()
10433 return -EINVAL; in nl80211_set_mcast_rate()
10435 nla_rate = nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]); in nl80211_set_mcast_rate()
10437 return -EINVAL; in nl80211_set_mcast_rate()
10466 if (nla_put_u32(skb, NL80211_ATTR_WIPHY, rdev->wiphy_idx)) in __cfg80211_alloc_vendor_skb()
10471 info->vendor_id)) in __cfg80211_alloc_vendor_skb()
10474 info->subcmd)) in __cfg80211_alloc_vendor_skb()
10482 if (wdev->netdev && in __cfg80211_alloc_vendor_skb()
10484 wdev->netdev->ifindex)) in __cfg80211_alloc_vendor_skb()
10492 ((void **)skb->cb)[0] = rdev; in __cfg80211_alloc_vendor_skb()
10493 ((void **)skb->cb)[1] = hdr; in __cfg80211_alloc_vendor_skb()
10494 ((void **)skb->cb)[2] = data; in __cfg80211_alloc_vendor_skb()
10516 if (WARN_ON(vendor_event_idx != -1)) in __cfg80211_alloc_event_skb()
10522 vendor_event_idx >= wiphy->n_vendor_events)) in __cfg80211_alloc_event_skb()
10524 info = &wiphy->vendor_events[vendor_event_idx]; in __cfg80211_alloc_event_skb()
10538 struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0]; in __cfg80211_send_event_skb()
10539 void *hdr = ((void **)skb->cb)[1]; in __cfg80211_send_event_skb()
10541 struct nlattr *data = ((void **)skb->cb)[2]; in __cfg80211_send_event_skb()
10545 memset(skb->cb, 0, sizeof(skb->cb)); in __cfg80211_send_event_skb()
10550 if (nlhdr->nlmsg_pid) { in __cfg80211_send_event_skb()
10551 genlmsg_unicast(wiphy_net(&rdev->wiphy), skb, in __cfg80211_send_event_skb()
10552 nlhdr->nlmsg_pid); in __cfg80211_send_event_skb()
10554 if (data->nla_type == NL80211_ATTR_VENDOR_DATA) in __cfg80211_send_event_skb()
10557 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), in __cfg80211_send_event_skb()
10566 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_testmode_do()
10570 lockdep_assert_held(&rdev->wiphy.mtx); in nl80211_testmode_do()
10573 info->attrs); in nl80211_testmode_do()
10575 if (!rdev->ops->testmode_cmd) in nl80211_testmode_do()
10576 return -EOPNOTSUPP; in nl80211_testmode_do()
10580 if (err != -EINVAL) in nl80211_testmode_do()
10583 } else if (wdev->wiphy != &rdev->wiphy) { in nl80211_testmode_do()
10584 return -EINVAL; in nl80211_testmode_do()
10587 if (!info->attrs[NL80211_ATTR_TESTDATA]) in nl80211_testmode_do()
10588 return -EINVAL; in nl80211_testmode_do()
10590 rdev->cur_cmd_info = info; in nl80211_testmode_do()
10592 nla_data(info->attrs[NL80211_ATTR_TESTDATA]), in nl80211_testmode_do()
10593 nla_len(info->attrs[NL80211_ATTR_TESTDATA])); in nl80211_testmode_do()
10594 rdev->cur_cmd_info = NULL; in nl80211_testmode_do()
10611 if (cb->args[0]) { in nl80211_testmode_dump()
10616 phy_idx = cb->args[0] - 1; in nl80211_testmode_dump()
10620 err = -ENOENT; in nl80211_testmode_dump()
10627 err = -ENOMEM; in nl80211_testmode_dump()
10631 err = nlmsg_parse_deprecated(cb->nlh, in nl80211_testmode_dump()
10638 rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk), attrbuf); in nl80211_testmode_dump()
10643 phy_idx = rdev->wiphy_idx; in nl80211_testmode_dump()
10646 cb->args[1] = (long)attrbuf[NL80211_ATTR_TESTDATA]; in nl80211_testmode_dump()
10649 if (cb->args[1]) { in nl80211_testmode_dump()
10650 data = nla_data((void *)cb->args[1]); in nl80211_testmode_dump()
10651 data_len = nla_len((void *)cb->args[1]); in nl80211_testmode_dump()
10654 if (!rdev->ops->testmode_dump) { in nl80211_testmode_dump()
10655 err = -EOPNOTSUPP; in nl80211_testmode_dump()
10660 void *hdr = nl80211hdr_put(skb, NETLINK_CB(cb->skb).portid, in nl80211_testmode_dump()
10661 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_testmode_dump()
10681 if (err == -ENOBUFS || err == -ENOENT) { in nl80211_testmode_dump()
10692 err = skb->len; in nl80211_testmode_dump()
10694 cb->args[0] = phy_idx + 1; in nl80211_testmode_dump()
10704 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_connect()
10705 struct net_device *dev = info->user_ptr[1]; in nl80211_connect()
10714 if (!info->attrs[NL80211_ATTR_SSID] || in nl80211_connect()
10715 !nla_len(info->attrs[NL80211_ATTR_SSID])) in nl80211_connect()
10716 return -EINVAL; in nl80211_connect()
10718 if (info->attrs[NL80211_ATTR_AUTH_TYPE]) { in nl80211_connect()
10720 nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]); in nl80211_connect()
10723 return -EINVAL; in nl80211_connect()
10727 connect.privacy = info->attrs[NL80211_ATTR_PRIVACY]; in nl80211_connect()
10729 if (info->attrs[NL80211_ATTR_WANT_1X_4WAY_HS] && in nl80211_connect()
10730 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_connect()
10732 return -EINVAL; in nl80211_connect()
10733 connect.want_1x = info->attrs[NL80211_ATTR_WANT_1X_4WAY_HS]; in nl80211_connect()
10740 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_connect()
10741 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_connect()
10742 return -EOPNOTSUPP; in nl80211_connect()
10744 wiphy = &rdev->wiphy; in nl80211_connect()
10746 connect.bg_scan_period = -1; in nl80211_connect()
10747 if (info->attrs[NL80211_ATTR_BG_SCAN_PERIOD] && in nl80211_connect()
10748 (wiphy->flags & WIPHY_FLAG_SUPPORTS_FW_ROAM)) { in nl80211_connect()
10750 nla_get_u16(info->attrs[NL80211_ATTR_BG_SCAN_PERIOD]); in nl80211_connect()
10753 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_connect()
10754 connect.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_connect()
10755 else if (info->attrs[NL80211_ATTR_MAC_HINT]) in nl80211_connect()
10757 nla_data(info->attrs[NL80211_ATTR_MAC_HINT]); in nl80211_connect()
10758 connect.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); in nl80211_connect()
10759 connect.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); in nl80211_connect()
10761 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_connect()
10762 connect.ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_connect()
10763 connect.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_connect()
10766 if (info->attrs[NL80211_ATTR_USE_MFP]) { in nl80211_connect()
10767 connect.mfp = nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]); in nl80211_connect()
10769 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_connect()
10771 return -EOPNOTSUPP; in nl80211_connect()
10776 if (info->attrs[NL80211_ATTR_PREV_BSSID]) in nl80211_connect()
10778 nla_data(info->attrs[NL80211_ATTR_PREV_BSSID]); in nl80211_connect()
10780 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) in nl80211_connect()
10782 info->attrs[NL80211_ATTR_WIPHY_FREQ])); in nl80211_connect()
10783 if (info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]) in nl80211_connect()
10785 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]); in nl80211_connect()
10790 return -EINVAL; in nl80211_connect()
10791 } else if (info->attrs[NL80211_ATTR_WIPHY_FREQ_HINT]) { in nl80211_connect()
10792 freq = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_HINT]); in nl80211_connect()
10796 return -EINVAL; in nl80211_connect()
10799 if (info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]) { in nl80211_connect()
10801 nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]); in nl80211_connect()
10803 if (info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]) in nl80211_connect()
10805 nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]); in nl80211_connect()
10808 if (connect.privacy && info->attrs[NL80211_ATTR_KEYS]) { in nl80211_connect()
10814 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HT])) in nl80211_connect()
10817 if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) in nl80211_connect()
10819 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]), in nl80211_connect()
10822 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) { in nl80211_connect()
10823 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) { in nl80211_connect()
10825 return -EINVAL; in nl80211_connect()
10828 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]), in nl80211_connect()
10832 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_VHT])) in nl80211_connect()
10835 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HE])) in nl80211_connect()
10838 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) in nl80211_connect()
10840 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]), in nl80211_connect()
10843 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) { in nl80211_connect()
10844 if (!info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) { in nl80211_connect()
10846 return -EINVAL; in nl80211_connect()
10849 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]), in nl80211_connect()
10853 if (nla_get_flag(info->attrs[NL80211_ATTR_USE_RRM])) { in nl80211_connect()
10854 if (!((rdev->wiphy.features & in nl80211_connect()
10856 (rdev->wiphy.features & NL80211_FEATURE_QUIET)) && in nl80211_connect()
10857 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_connect()
10860 return -EINVAL; in nl80211_connect()
10865 connect.pbss = nla_get_flag(info->attrs[NL80211_ATTR_PBSS]); in nl80211_connect()
10866 if (connect.pbss && !rdev->wiphy.bands[NL80211_BAND_60GHZ]) { in nl80211_connect()
10868 return -EOPNOTSUPP; in nl80211_connect()
10871 if (info->attrs[NL80211_ATTR_BSS_SELECT]) { in nl80211_connect()
10875 return -EINVAL; in nl80211_connect()
10878 err = parse_bss_select(info->attrs[NL80211_ATTR_BSS_SELECT], in nl80211_connect()
10886 if (wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_connect()
10888 info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] && in nl80211_connect()
10889 info->attrs[NL80211_ATTR_FILS_ERP_REALM] && in nl80211_connect()
10890 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] && in nl80211_connect()
10891 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { in nl80211_connect()
10893 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); in nl80211_connect()
10895 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); in nl80211_connect()
10897 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); in nl80211_connect()
10899 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); in nl80211_connect()
10902 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM]); in nl80211_connect()
10904 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); in nl80211_connect()
10906 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); in nl80211_connect()
10907 } else if (info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] || in nl80211_connect()
10908 info->attrs[NL80211_ATTR_FILS_ERP_REALM] || in nl80211_connect()
10909 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] || in nl80211_connect()
10910 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { in nl80211_connect()
10912 return -EINVAL; in nl80211_connect()
10915 if (nla_get_flag(info->attrs[NL80211_ATTR_EXTERNAL_AUTH_SUPPORT])) { in nl80211_connect()
10916 if (!info->attrs[NL80211_ATTR_SOCKET_OWNER]) { in nl80211_connect()
10920 return -EINVAL; in nl80211_connect()
10925 wdev_lock(dev->ieee80211_ptr); in nl80211_connect()
10932 if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) { in nl80211_connect()
10933 dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid; in nl80211_connect()
10935 memcpy(dev->ieee80211_ptr->disconnect_bssid, in nl80211_connect()
10938 eth_zero_addr(dev->ieee80211_ptr->disconnect_bssid); in nl80211_connect()
10941 wdev_unlock(dev->ieee80211_ptr); in nl80211_connect()
10950 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_update_connect_params()
10951 struct net_device *dev = info->user_ptr[1]; in nl80211_update_connect_params()
10952 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_update_connect_params()
10958 if (!rdev->ops->update_connect_params) in nl80211_update_connect_params()
10959 return -EOPNOTSUPP; in nl80211_update_connect_params()
10961 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_update_connect_params()
10962 connect.ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_update_connect_params()
10963 connect.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_update_connect_params()
10967 fils_sk_offload = wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_update_connect_params()
10971 * when driver supports fils-sk offload all attributes must be in nl80211_update_connect_params()
10972 * provided. So the else covers "fils-sk-not-all" and in nl80211_update_connect_params()
10973 * "no-fils-sk-any". in nl80211_update_connect_params()
10976 info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] && in nl80211_update_connect_params()
10977 info->attrs[NL80211_ATTR_FILS_ERP_REALM] && in nl80211_update_connect_params()
10978 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] && in nl80211_update_connect_params()
10979 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { in nl80211_update_connect_params()
10981 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); in nl80211_update_connect_params()
10983 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); in nl80211_update_connect_params()
10985 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); in nl80211_update_connect_params()
10987 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); in nl80211_update_connect_params()
10990 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM]); in nl80211_update_connect_params()
10992 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); in nl80211_update_connect_params()
10994 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); in nl80211_update_connect_params()
10996 } else if (info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] || in nl80211_update_connect_params()
10997 info->attrs[NL80211_ATTR_FILS_ERP_REALM] || in nl80211_update_connect_params()
10998 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] || in nl80211_update_connect_params()
10999 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { in nl80211_update_connect_params()
11000 return -EINVAL; in nl80211_update_connect_params()
11003 if (info->attrs[NL80211_ATTR_AUTH_TYPE]) { in nl80211_update_connect_params()
11004 auth_type = nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]); in nl80211_update_connect_params()
11007 return -EINVAL; in nl80211_update_connect_params()
11011 return -EINVAL; in nl80211_update_connect_params()
11017 wdev_lock(dev->ieee80211_ptr); in nl80211_update_connect_params()
11018 if (!wdev->current_bss) in nl80211_update_connect_params()
11019 ret = -ENOLINK; in nl80211_update_connect_params()
11022 wdev_unlock(dev->ieee80211_ptr); in nl80211_update_connect_params()
11029 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_disconnect()
11030 struct net_device *dev = info->user_ptr[1]; in nl80211_disconnect()
11034 if (dev->ieee80211_ptr->conn_owner_nlportid && in nl80211_disconnect()
11035 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) in nl80211_disconnect()
11036 return -EPERM; in nl80211_disconnect()
11038 if (!info->attrs[NL80211_ATTR_REASON_CODE]) in nl80211_disconnect()
11041 reason = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); in nl80211_disconnect()
11044 return -EINVAL; in nl80211_disconnect()
11046 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_disconnect()
11047 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_disconnect()
11048 return -EOPNOTSUPP; in nl80211_disconnect()
11050 wdev_lock(dev->ieee80211_ptr); in nl80211_disconnect()
11052 wdev_unlock(dev->ieee80211_ptr); in nl80211_disconnect()
11058 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_wiphy_netns()
11062 if (info->attrs[NL80211_ATTR_PID]) { in nl80211_wiphy_netns()
11063 u32 pid = nla_get_u32(info->attrs[NL80211_ATTR_PID]); in nl80211_wiphy_netns()
11066 } else if (info->attrs[NL80211_ATTR_NETNS_FD]) { in nl80211_wiphy_netns()
11067 u32 fd = nla_get_u32(info->attrs[NL80211_ATTR_NETNS_FD]); in nl80211_wiphy_netns()
11071 return -EINVAL; in nl80211_wiphy_netns()
11080 if (!net_eq(wiphy_net(&rdev->wiphy), net)) in nl80211_wiphy_netns()
11089 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_setdel_pmksa()
11092 struct net_device *dev = info->user_ptr[1]; in nl80211_setdel_pmksa()
11097 if (!info->attrs[NL80211_ATTR_PMKID]) in nl80211_setdel_pmksa()
11098 return -EINVAL; in nl80211_setdel_pmksa()
11100 pmksa.pmkid = nla_data(info->attrs[NL80211_ATTR_PMKID]); in nl80211_setdel_pmksa()
11102 if (info->attrs[NL80211_ATTR_MAC]) { in nl80211_setdel_pmksa()
11103 pmksa.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_setdel_pmksa()
11104 } else if (info->attrs[NL80211_ATTR_SSID] && in nl80211_setdel_pmksa()
11105 info->attrs[NL80211_ATTR_FILS_CACHE_ID] && in nl80211_setdel_pmksa()
11106 (info->genlhdr->cmd == NL80211_CMD_DEL_PMKSA || in nl80211_setdel_pmksa()
11107 info->attrs[NL80211_ATTR_PMK])) { in nl80211_setdel_pmksa()
11108 pmksa.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); in nl80211_setdel_pmksa()
11109 pmksa.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); in nl80211_setdel_pmksa()
11111 nla_data(info->attrs[NL80211_ATTR_FILS_CACHE_ID]); in nl80211_setdel_pmksa()
11113 return -EINVAL; in nl80211_setdel_pmksa()
11115 if (info->attrs[NL80211_ATTR_PMK]) { in nl80211_setdel_pmksa()
11116 pmksa.pmk = nla_data(info->attrs[NL80211_ATTR_PMK]); in nl80211_setdel_pmksa()
11117 pmksa.pmk_len = nla_len(info->attrs[NL80211_ATTR_PMK]); in nl80211_setdel_pmksa()
11120 if (info->attrs[NL80211_ATTR_PMK_LIFETIME]) in nl80211_setdel_pmksa()
11122 nla_get_u32(info->attrs[NL80211_ATTR_PMK_LIFETIME]); in nl80211_setdel_pmksa()
11124 if (info->attrs[NL80211_ATTR_PMK_REAUTH_THRESHOLD]) in nl80211_setdel_pmksa()
11127 info->attrs[NL80211_ATTR_PMK_REAUTH_THRESHOLD]); in nl80211_setdel_pmksa()
11129 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_setdel_pmksa()
11130 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT && in nl80211_setdel_pmksa()
11131 !(dev->ieee80211_ptr->iftype == NL80211_IFTYPE_AP && in nl80211_setdel_pmksa()
11132 wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_setdel_pmksa()
11134 return -EOPNOTSUPP; in nl80211_setdel_pmksa()
11136 switch (info->genlhdr->cmd) { in nl80211_setdel_pmksa()
11138 rdev_ops = rdev->ops->set_pmksa; in nl80211_setdel_pmksa()
11141 rdev_ops = rdev->ops->del_pmksa; in nl80211_setdel_pmksa()
11149 return -EOPNOTSUPP; in nl80211_setdel_pmksa()
11151 return rdev_ops(&rdev->wiphy, dev, &pmksa); in nl80211_setdel_pmksa()
11156 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_flush_pmksa()
11157 struct net_device *dev = info->user_ptr[1]; in nl80211_flush_pmksa()
11159 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_flush_pmksa()
11160 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_flush_pmksa()
11161 return -EOPNOTSUPP; in nl80211_flush_pmksa()
11163 if (!rdev->ops->flush_pmksa) in nl80211_flush_pmksa()
11164 return -EOPNOTSUPP; in nl80211_flush_pmksa()
11171 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_tdls_mgmt()
11172 struct net_device *dev = info->user_ptr[1]; in nl80211_tdls_mgmt()
11179 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) || in nl80211_tdls_mgmt()
11180 !rdev->ops->tdls_mgmt) in nl80211_tdls_mgmt()
11181 return -EOPNOTSUPP; in nl80211_tdls_mgmt()
11183 if (!info->attrs[NL80211_ATTR_TDLS_ACTION] || in nl80211_tdls_mgmt()
11184 !info->attrs[NL80211_ATTR_STATUS_CODE] || in nl80211_tdls_mgmt()
11185 !info->attrs[NL80211_ATTR_TDLS_DIALOG_TOKEN] || in nl80211_tdls_mgmt()
11186 !info->attrs[NL80211_ATTR_IE] || in nl80211_tdls_mgmt()
11187 !info->attrs[NL80211_ATTR_MAC]) in nl80211_tdls_mgmt()
11188 return -EINVAL; in nl80211_tdls_mgmt()
11190 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_tdls_mgmt()
11191 action_code = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_ACTION]); in nl80211_tdls_mgmt()
11192 status_code = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]); in nl80211_tdls_mgmt()
11193 dialog_token = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_DIALOG_TOKEN]); in nl80211_tdls_mgmt()
11194 initiator = nla_get_flag(info->attrs[NL80211_ATTR_TDLS_INITIATOR]); in nl80211_tdls_mgmt()
11195 if (info->attrs[NL80211_ATTR_TDLS_PEER_CAPABILITY]) in nl80211_tdls_mgmt()
11197 nla_get_u32(info->attrs[NL80211_ATTR_TDLS_PEER_CAPABILITY]); in nl80211_tdls_mgmt()
11202 nla_data(info->attrs[NL80211_ATTR_IE]), in nl80211_tdls_mgmt()
11203 nla_len(info->attrs[NL80211_ATTR_IE])); in nl80211_tdls_mgmt()
11208 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_tdls_oper()
11209 struct net_device *dev = info->user_ptr[1]; in nl80211_tdls_oper()
11213 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) || in nl80211_tdls_oper()
11214 !rdev->ops->tdls_oper) in nl80211_tdls_oper()
11215 return -EOPNOTSUPP; in nl80211_tdls_oper()
11217 if (!info->attrs[NL80211_ATTR_TDLS_OPERATION] || in nl80211_tdls_oper()
11218 !info->attrs[NL80211_ATTR_MAC]) in nl80211_tdls_oper()
11219 return -EINVAL; in nl80211_tdls_oper()
11221 operation = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_OPERATION]); in nl80211_tdls_oper()
11222 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_tdls_oper()
11230 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_remain_on_channel()
11231 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_remain_on_channel()
11240 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ] || in nl80211_remain_on_channel()
11241 !info->attrs[NL80211_ATTR_DURATION]) in nl80211_remain_on_channel()
11242 return -EINVAL; in nl80211_remain_on_channel()
11244 duration = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]); in nl80211_remain_on_channel()
11246 if (!rdev->ops->remain_on_channel || in nl80211_remain_on_channel()
11247 !(rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL)) in nl80211_remain_on_channel()
11248 return -EOPNOTSUPP; in nl80211_remain_on_channel()
11255 duration > rdev->wiphy.max_remain_on_channel_duration) in nl80211_remain_on_channel()
11256 return -EINVAL; in nl80211_remain_on_channel()
11264 !cfg80211_chandef_identical(&wdev->chandef, &chandef)) { in nl80211_remain_on_channel()
11265 compat_chandef = cfg80211_chandef_compatible(&wdev->chandef, in nl80211_remain_on_channel()
11269 return -EBUSY; in nl80211_remain_on_channel()
11276 return -ENOMEM; in nl80211_remain_on_channel()
11278 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_remain_on_channel()
11281 err = -ENOBUFS; in nl80211_remain_on_channel()
11300 err = -ENOBUFS; in nl80211_remain_on_channel()
11309 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_cancel_remain_on_channel()
11310 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_cancel_remain_on_channel()
11313 if (!info->attrs[NL80211_ATTR_COOKIE]) in nl80211_cancel_remain_on_channel()
11314 return -EINVAL; in nl80211_cancel_remain_on_channel()
11316 if (!rdev->ops->cancel_remain_on_channel) in nl80211_cancel_remain_on_channel()
11317 return -EOPNOTSUPP; in nl80211_cancel_remain_on_channel()
11319 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); in nl80211_cancel_remain_on_channel()
11328 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_tx_bitrate_mask()
11329 struct net_device *dev = info->user_ptr[1]; in nl80211_set_tx_bitrate_mask()
11332 if (!rdev->ops->set_bitrate_mask) in nl80211_set_tx_bitrate_mask()
11333 return -EOPNOTSUPP; in nl80211_set_tx_bitrate_mask()
11335 err = nl80211_parse_tx_bitrate_mask(info, info->attrs, in nl80211_set_tx_bitrate_mask()
11346 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_register_mgmt()
11347 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_register_mgmt()
11350 if (!info->attrs[NL80211_ATTR_FRAME_MATCH]) in nl80211_register_mgmt()
11351 return -EINVAL; in nl80211_register_mgmt()
11353 if (info->attrs[NL80211_ATTR_FRAME_TYPE]) in nl80211_register_mgmt()
11354 frame_type = nla_get_u16(info->attrs[NL80211_ATTR_FRAME_TYPE]); in nl80211_register_mgmt()
11356 switch (wdev->iftype) { in nl80211_register_mgmt()
11368 return -EOPNOTSUPP; in nl80211_register_mgmt()
11372 if (!rdev->ops->mgmt_tx) in nl80211_register_mgmt()
11373 return -EOPNOTSUPP; in nl80211_register_mgmt()
11375 if (info->attrs[NL80211_ATTR_RECEIVE_MULTICAST] && in nl80211_register_mgmt()
11376 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_register_mgmt()
11379 "multicast RX registrations are not supported"); in nl80211_register_mgmt()
11380 return -EOPNOTSUPP; in nl80211_register_mgmt()
11383 return cfg80211_mlme_register_mgmt(wdev, info->snd_portid, frame_type, in nl80211_register_mgmt()
11384 nla_data(info->attrs[NL80211_ATTR_FRAME_MATCH]), in nl80211_register_mgmt()
11385 nla_len(info->attrs[NL80211_ATTR_FRAME_MATCH]), in nl80211_register_mgmt()
11386 info->attrs[NL80211_ATTR_RECEIVE_MULTICAST], in nl80211_register_mgmt()
11387 info->extack); in nl80211_register_mgmt()
11392 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_tx_mgmt()
11393 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_tx_mgmt()
11401 info->attrs[NL80211_ATTR_DONT_WAIT_FOR_ACK], in nl80211_tx_mgmt()
11404 if (!info->attrs[NL80211_ATTR_FRAME]) in nl80211_tx_mgmt()
11405 return -EINVAL; in nl80211_tx_mgmt()
11407 if (!rdev->ops->mgmt_tx) in nl80211_tx_mgmt()
11408 return -EOPNOTSUPP; in nl80211_tx_mgmt()
11410 switch (wdev->iftype) { in nl80211_tx_mgmt()
11412 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ]) in nl80211_tx_mgmt()
11413 return -EINVAL; in nl80211_tx_mgmt()
11425 return -EOPNOTSUPP; in nl80211_tx_mgmt()
11428 if (info->attrs[NL80211_ATTR_DURATION]) { in nl80211_tx_mgmt()
11429 if (!(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX)) in nl80211_tx_mgmt()
11430 return -EINVAL; in nl80211_tx_mgmt()
11431 params.wait = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]); in nl80211_tx_mgmt()
11438 params.wait > rdev->wiphy.max_remain_on_channel_duration) in nl80211_tx_mgmt()
11439 return -EINVAL; in nl80211_tx_mgmt()
11442 params.offchan = info->attrs[NL80211_ATTR_OFFCHANNEL_TX_OK]; in nl80211_tx_mgmt()
11444 if (params.offchan && !(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX)) in nl80211_tx_mgmt()
11445 return -EINVAL; in nl80211_tx_mgmt()
11447 params.no_cck = nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]); in nl80211_tx_mgmt()
11453 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { in nl80211_tx_mgmt()
11460 return -EINVAL; in nl80211_tx_mgmt()
11465 return -EBUSY; in nl80211_tx_mgmt()
11469 params.buf = nla_data(info->attrs[NL80211_ATTR_FRAME]); in nl80211_tx_mgmt()
11470 params.len = nla_len(info->attrs[NL80211_ATTR_FRAME]); in nl80211_tx_mgmt()
11472 if (info->attrs[NL80211_ATTR_CSA_C_OFFSETS_TX]) { in nl80211_tx_mgmt()
11473 int len = nla_len(info->attrs[NL80211_ATTR_CSA_C_OFFSETS_TX]); in nl80211_tx_mgmt()
11477 return -EINVAL; in nl80211_tx_mgmt()
11481 nla_data(info->attrs[NL80211_ATTR_CSA_C_OFFSETS_TX]); in nl80211_tx_mgmt()
11486 return -EINVAL; in nl80211_tx_mgmt()
11493 return -ENOMEM; in nl80211_tx_mgmt()
11495 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_tx_mgmt()
11498 err = -ENOBUFS; in nl80211_tx_mgmt()
11520 err = -ENOBUFS; in nl80211_tx_mgmt()
11528 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_tx_mgmt_cancel_wait()
11529 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_tx_mgmt_cancel_wait()
11532 if (!info->attrs[NL80211_ATTR_COOKIE]) in nl80211_tx_mgmt_cancel_wait()
11533 return -EINVAL; in nl80211_tx_mgmt_cancel_wait()
11535 if (!rdev->ops->mgmt_tx_cancel_wait) in nl80211_tx_mgmt_cancel_wait()
11536 return -EOPNOTSUPP; in nl80211_tx_mgmt_cancel_wait()
11538 switch (wdev->iftype) { in nl80211_tx_mgmt_cancel_wait()
11549 return -EOPNOTSUPP; in nl80211_tx_mgmt_cancel_wait()
11552 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); in nl80211_tx_mgmt_cancel_wait()
11559 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_power_save()
11561 struct net_device *dev = info->user_ptr[1]; in nl80211_set_power_save()
11566 if (!info->attrs[NL80211_ATTR_PS_STATE]) in nl80211_set_power_save()
11567 return -EINVAL; in nl80211_set_power_save()
11569 ps_state = nla_get_u32(info->attrs[NL80211_ATTR_PS_STATE]); in nl80211_set_power_save()
11571 wdev = dev->ieee80211_ptr; in nl80211_set_power_save()
11573 if (!rdev->ops->set_power_mgmt) in nl80211_set_power_save()
11574 return -EOPNOTSUPP; in nl80211_set_power_save()
11578 if (state == wdev->ps) in nl80211_set_power_save()
11581 err = rdev_set_power_mgmt(rdev, dev, state, wdev->ps_timeout); in nl80211_set_power_save()
11583 wdev->ps = state; in nl80211_set_power_save()
11589 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_power_save()
11592 struct net_device *dev = info->user_ptr[1]; in nl80211_get_power_save()
11597 wdev = dev->ieee80211_ptr; in nl80211_get_power_save()
11599 if (!rdev->ops->set_power_mgmt) in nl80211_get_power_save()
11600 return -EOPNOTSUPP; in nl80211_get_power_save()
11604 return -ENOMEM; in nl80211_get_power_save()
11606 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_power_save()
11609 err = -ENOBUFS; in nl80211_get_power_save()
11613 if (wdev->ps) in nl80211_get_power_save()
11625 err = -ENOBUFS; in nl80211_get_power_save()
11645 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_cqm_txe()
11646 struct net_device *dev = info->user_ptr[1]; in nl80211_set_cqm_txe()
11647 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_cqm_txe()
11650 return -EINVAL; in nl80211_set_cqm_txe()
11652 if (!rdev->ops->set_cqm_txe_config) in nl80211_set_cqm_txe()
11653 return -EOPNOTSUPP; in nl80211_set_cqm_txe()
11655 if (wdev->iftype != NL80211_IFTYPE_STATION && in nl80211_set_cqm_txe()
11656 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_set_cqm_txe()
11657 return -EOPNOTSUPP; in nl80211_set_cqm_txe()
11665 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_cqm_rssi_update()
11672 if (!wdev->cqm_config) in cfg80211_cqm_rssi_update()
11681 if (!wdev->cqm_config->last_rssi_event_value && wdev->current_bss && in cfg80211_cqm_rssi_update()
11682 rdev->ops->get_station) { in cfg80211_cqm_rssi_update()
11686 mac_addr = wdev->current_bss->pub.bssid; in cfg80211_cqm_rssi_update()
11694 wdev->cqm_config->last_rssi_event_value = in cfg80211_cqm_rssi_update()
11698 last = wdev->cqm_config->last_rssi_event_value; in cfg80211_cqm_rssi_update()
11699 hyst = wdev->cqm_config->rssi_hyst; in cfg80211_cqm_rssi_update()
11700 n = wdev->cqm_config->n_rssi_thresholds; in cfg80211_cqm_rssi_update()
11704 if (last < wdev->cqm_config->rssi_thresholds[i]) in cfg80211_cqm_rssi_update()
11708 low_index = i - 1; in cfg80211_cqm_rssi_update()
11711 low = wdev->cqm_config->rssi_thresholds[low_index] - hyst; in cfg80211_cqm_rssi_update()
11717 high = wdev->cqm_config->rssi_thresholds[i] + hyst - 1; in cfg80211_cqm_rssi_update()
11729 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_cqm_rssi()
11730 struct net_device *dev = info->user_ptr[1]; in nl80211_set_cqm_rssi()
11731 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_cqm_rssi()
11738 return -EINVAL; in nl80211_set_cqm_rssi()
11743 if (wdev->iftype != NL80211_IFTYPE_STATION && in nl80211_set_cqm_rssi()
11744 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_set_cqm_rssi()
11745 return -EOPNOTSUPP; in nl80211_set_cqm_rssi()
11751 if (n_thresholds <= 1 && rdev->ops->set_cqm_rssi_config) { in nl80211_set_cqm_rssi()
11759 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_set_cqm_rssi()
11761 return -EOPNOTSUPP; in nl80211_set_cqm_rssi()
11773 err = -ENOMEM; in nl80211_set_cqm_rssi()
11777 cqm_config->rssi_hyst = hysteresis; in nl80211_set_cqm_rssi()
11778 cqm_config->n_rssi_thresholds = n_thresholds; in nl80211_set_cqm_rssi()
11779 memcpy(cqm_config->rssi_thresholds, thresholds, in nl80211_set_cqm_rssi()
11782 wdev->cqm_config = cqm_config; in nl80211_set_cqm_rssi()
11799 cqm = info->attrs[NL80211_ATTR_CQM]; in nl80211_set_cqm()
11801 return -EINVAL; in nl80211_set_cqm()
11805 info->extack); in nl80211_set_cqm()
11817 return -EINVAL; in nl80211_set_cqm()
11833 return -EINVAL; in nl80211_set_cqm()
11838 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_join_ocb()
11839 struct net_device *dev = info->user_ptr[1]; in nl80211_join_ocb()
11852 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_leave_ocb()
11853 struct net_device *dev = info->user_ptr[1]; in nl80211_leave_ocb()
11860 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_join_mesh()
11861 struct net_device *dev = info->user_ptr[1]; in nl80211_join_mesh()
11870 if (info->attrs[NL80211_ATTR_MESH_CONFIG]) { in nl80211_join_mesh()
11877 if (!info->attrs[NL80211_ATTR_MESH_ID] || in nl80211_join_mesh()
11878 !nla_len(info->attrs[NL80211_ATTR_MESH_ID])) in nl80211_join_mesh()
11879 return -EINVAL; in nl80211_join_mesh()
11881 setup.mesh_id = nla_data(info->attrs[NL80211_ATTR_MESH_ID]); in nl80211_join_mesh()
11882 setup.mesh_id_len = nla_len(info->attrs[NL80211_ATTR_MESH_ID]); in nl80211_join_mesh()
11884 if (info->attrs[NL80211_ATTR_MCAST_RATE] && in nl80211_join_mesh()
11886 nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]))) in nl80211_join_mesh()
11887 return -EINVAL; in nl80211_join_mesh()
11889 if (info->attrs[NL80211_ATTR_BEACON_INTERVAL]) { in nl80211_join_mesh()
11891 nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]); in nl80211_join_mesh()
11900 if (info->attrs[NL80211_ATTR_DTIM_PERIOD]) { in nl80211_join_mesh()
11902 nla_get_u32(info->attrs[NL80211_ATTR_DTIM_PERIOD]); in nl80211_join_mesh()
11904 return -EINVAL; in nl80211_join_mesh()
11907 if (info->attrs[NL80211_ATTR_MESH_SETUP]) { in nl80211_join_mesh()
11917 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { in nl80211_join_mesh()
11926 if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) { in nl80211_join_mesh()
11927 u8 *rates = nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); in nl80211_join_mesh()
11929 nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); in nl80211_join_mesh()
11933 return -EINVAL; in nl80211_join_mesh()
11935 sband = rdev->wiphy.bands[setup.chandef.chan->band]; in nl80211_join_mesh()
11943 if (info->attrs[NL80211_ATTR_TX_RATES]) { in nl80211_join_mesh()
11944 err = nl80211_parse_tx_bitrate_mask(info, info->attrs, in nl80211_join_mesh()
11952 return -EINVAL; in nl80211_join_mesh()
11954 err = validate_beacon_tx_rate(rdev, setup.chandef.chan->band, in nl80211_join_mesh()
11961 nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS]); in nl80211_join_mesh()
11963 if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) { in nl80211_join_mesh()
11972 wdev_lock(dev->ieee80211_ptr); in nl80211_join_mesh()
11974 if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) in nl80211_join_mesh()
11975 dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid; in nl80211_join_mesh()
11976 wdev_unlock(dev->ieee80211_ptr); in nl80211_join_mesh()
11983 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_leave_mesh()
11984 struct net_device *dev = info->user_ptr[1]; in nl80211_leave_mesh()
11993 struct cfg80211_wowlan *wowlan = rdev->wiphy.wowlan_config; in nl80211_send_wowlan_patterns()
11997 if (!wowlan->n_patterns) in nl80211_send_wowlan_patterns()
12002 return -ENOBUFS; in nl80211_send_wowlan_patterns()
12004 for (i = 0; i < wowlan->n_patterns; i++) { in nl80211_send_wowlan_patterns()
12007 return -ENOBUFS; in nl80211_send_wowlan_patterns()
12008 pat_len = wowlan->patterns[i].pattern_len; in nl80211_send_wowlan_patterns()
12010 wowlan->patterns[i].mask) || in nl80211_send_wowlan_patterns()
12012 wowlan->patterns[i].pattern) || in nl80211_send_wowlan_patterns()
12014 wowlan->patterns[i].pkt_offset)) in nl80211_send_wowlan_patterns()
12015 return -ENOBUFS; in nl80211_send_wowlan_patterns()
12034 return -ENOBUFS; in nl80211_send_wowlan_tcp()
12036 if (nla_put_in_addr(msg, NL80211_WOWLAN_TCP_SRC_IPV4, tcp->src) || in nl80211_send_wowlan_tcp()
12037 nla_put_in_addr(msg, NL80211_WOWLAN_TCP_DST_IPV4, tcp->dst) || in nl80211_send_wowlan_tcp()
12038 nla_put(msg, NL80211_WOWLAN_TCP_DST_MAC, ETH_ALEN, tcp->dst_mac) || in nl80211_send_wowlan_tcp()
12039 nla_put_u16(msg, NL80211_WOWLAN_TCP_SRC_PORT, tcp->src_port) || in nl80211_send_wowlan_tcp()
12040 nla_put_u16(msg, NL80211_WOWLAN_TCP_DST_PORT, tcp->dst_port) || in nl80211_send_wowlan_tcp()
12042 tcp->payload_len, tcp->payload) || in nl80211_send_wowlan_tcp()
12044 tcp->data_interval) || in nl80211_send_wowlan_tcp()
12046 tcp->wake_len, tcp->wake_data) || in nl80211_send_wowlan_tcp()
12048 DIV_ROUND_UP(tcp->wake_len, 8), tcp->wake_mask)) in nl80211_send_wowlan_tcp()
12049 return -ENOBUFS; in nl80211_send_wowlan_tcp()
12051 if (tcp->payload_seq.len && in nl80211_send_wowlan_tcp()
12053 sizeof(tcp->payload_seq), &tcp->payload_seq)) in nl80211_send_wowlan_tcp()
12054 return -ENOBUFS; in nl80211_send_wowlan_tcp()
12056 if (tcp->payload_tok.len && in nl80211_send_wowlan_tcp()
12058 sizeof(tcp->payload_tok) + tcp->tokens_size, in nl80211_send_wowlan_tcp()
12059 &tcp->payload_tok)) in nl80211_send_wowlan_tcp()
12060 return -ENOBUFS; in nl80211_send_wowlan_tcp()
12078 return -ENOBUFS; in nl80211_send_wowlan_nd()
12080 if (req->n_scan_plans == 1 && in nl80211_send_wowlan_nd()
12082 req->scan_plans[0].interval * 1000)) in nl80211_send_wowlan_nd()
12083 return -ENOBUFS; in nl80211_send_wowlan_nd()
12085 if (nla_put_u32(msg, NL80211_ATTR_SCHED_SCAN_DELAY, req->delay)) in nl80211_send_wowlan_nd()
12086 return -ENOBUFS; in nl80211_send_wowlan_nd()
12088 if (req->relative_rssi_set) { in nl80211_send_wowlan_nd()
12092 req->relative_rssi)) in nl80211_send_wowlan_nd()
12093 return -ENOBUFS; in nl80211_send_wowlan_nd()
12095 rssi_adjust.band = req->rssi_adjust.band; in nl80211_send_wowlan_nd()
12096 rssi_adjust.delta = req->rssi_adjust.delta; in nl80211_send_wowlan_nd()
12099 return -ENOBUFS; in nl80211_send_wowlan_nd()
12104 return -ENOBUFS; in nl80211_send_wowlan_nd()
12106 for (i = 0; i < req->n_channels; i++) { in nl80211_send_wowlan_nd()
12107 if (nla_put_u32(msg, i, req->channels[i]->center_freq)) in nl80211_send_wowlan_nd()
12108 return -ENOBUFS; in nl80211_send_wowlan_nd()
12113 if (req->n_match_sets) { in nl80211_send_wowlan_nd()
12117 return -ENOBUFS; in nl80211_send_wowlan_nd()
12119 for (i = 0; i < req->n_match_sets; i++) { in nl80211_send_wowlan_nd()
12122 return -ENOBUFS; in nl80211_send_wowlan_nd()
12125 req->match_sets[i].ssid.ssid_len, in nl80211_send_wowlan_nd()
12126 req->match_sets[i].ssid.ssid)) in nl80211_send_wowlan_nd()
12127 return -ENOBUFS; in nl80211_send_wowlan_nd()
12135 return -ENOBUFS; in nl80211_send_wowlan_nd()
12137 for (i = 0; i < req->n_scan_plans; i++) { in nl80211_send_wowlan_nd()
12140 return -ENOBUFS; in nl80211_send_wowlan_nd()
12143 req->scan_plans[i].interval) || in nl80211_send_wowlan_nd()
12144 (req->scan_plans[i].iterations && in nl80211_send_wowlan_nd()
12146 req->scan_plans[i].iterations))) in nl80211_send_wowlan_nd()
12147 return -ENOBUFS; in nl80211_send_wowlan_nd()
12159 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_wowlan()
12164 if (!rdev->wiphy.wowlan) in nl80211_get_wowlan()
12165 return -EOPNOTSUPP; in nl80211_get_wowlan()
12167 if (rdev->wiphy.wowlan_config && rdev->wiphy.wowlan_config->tcp) { in nl80211_get_wowlan()
12169 size += rdev->wiphy.wowlan_config->tcp->tokens_size + in nl80211_get_wowlan()
12170 rdev->wiphy.wowlan_config->tcp->payload_len + in nl80211_get_wowlan()
12171 rdev->wiphy.wowlan_config->tcp->wake_len + in nl80211_get_wowlan()
12172 rdev->wiphy.wowlan_config->tcp->wake_len / 8; in nl80211_get_wowlan()
12177 return -ENOMEM; in nl80211_get_wowlan()
12179 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_wowlan()
12184 if (rdev->wiphy.wowlan_config) { in nl80211_get_wowlan()
12192 if ((rdev->wiphy.wowlan_config->any && in nl80211_get_wowlan()
12194 (rdev->wiphy.wowlan_config->disconnect && in nl80211_get_wowlan()
12196 (rdev->wiphy.wowlan_config->magic_pkt && in nl80211_get_wowlan()
12198 (rdev->wiphy.wowlan_config->gtk_rekey_failure && in nl80211_get_wowlan()
12200 (rdev->wiphy.wowlan_config->eap_identity_req && in nl80211_get_wowlan()
12202 (rdev->wiphy.wowlan_config->four_way_handshake && in nl80211_get_wowlan()
12204 (rdev->wiphy.wowlan_config->rfkill_release && in nl80211_get_wowlan()
12212 rdev->wiphy.wowlan_config->tcp)) in nl80211_get_wowlan()
12217 rdev->wiphy.wowlan_config->nd_config)) in nl80211_get_wowlan()
12228 return -ENOBUFS; in nl80211_get_wowlan()
12233 struct cfg80211_wowlan *trig) in nl80211_parse_wowlan_tcp() argument
12243 if (!rdev->wiphy.wowlan->tcp) in nl80211_parse_wowlan_tcp()
12244 return -EINVAL; in nl80211_parse_wowlan_tcp()
12259 return -EINVAL; in nl80211_parse_wowlan_tcp()
12262 if (data_size > rdev->wiphy.wowlan->tcp->data_payload_max) in nl80211_parse_wowlan_tcp()
12263 return -EINVAL; in nl80211_parse_wowlan_tcp()
12266 rdev->wiphy.wowlan->tcp->data_interval_max || in nl80211_parse_wowlan_tcp()
12268 return -EINVAL; in nl80211_parse_wowlan_tcp()
12271 if (wake_size > rdev->wiphy.wowlan->tcp->wake_payload_max) in nl80211_parse_wowlan_tcp()
12272 return -EINVAL; in nl80211_parse_wowlan_tcp()
12276 return -EINVAL; in nl80211_parse_wowlan_tcp()
12282 tokens_size = tokln - sizeof(*tok); in nl80211_parse_wowlan_tcp()
12284 if (!tok->len || tokens_size % tok->len) in nl80211_parse_wowlan_tcp()
12285 return -EINVAL; in nl80211_parse_wowlan_tcp()
12286 if (!rdev->wiphy.wowlan->tcp->tok) in nl80211_parse_wowlan_tcp()
12287 return -EINVAL; in nl80211_parse_wowlan_tcp()
12288 if (tok->len > rdev->wiphy.wowlan->tcp->tok->max_len) in nl80211_parse_wowlan_tcp()
12289 return -EINVAL; in nl80211_parse_wowlan_tcp()
12290 if (tok->len < rdev->wiphy.wowlan->tcp->tok->min_len) in nl80211_parse_wowlan_tcp()
12291 return -EINVAL; in nl80211_parse_wowlan_tcp()
12292 if (tokens_size > rdev->wiphy.wowlan->tcp->tok->bufsize) in nl80211_parse_wowlan_tcp()
12293 return -EINVAL; in nl80211_parse_wowlan_tcp()
12294 if (tok->offset + tok->len > data_size) in nl80211_parse_wowlan_tcp()
12295 return -EINVAL; in nl80211_parse_wowlan_tcp()
12300 if (!rdev->wiphy.wowlan->tcp->seq) in nl80211_parse_wowlan_tcp()
12301 return -EINVAL; in nl80211_parse_wowlan_tcp()
12302 if (seq->len == 0 || seq->len > 4) in nl80211_parse_wowlan_tcp()
12303 return -EINVAL; in nl80211_parse_wowlan_tcp()
12304 if (seq->len + seq->offset > data_size) in nl80211_parse_wowlan_tcp()
12305 return -EINVAL; in nl80211_parse_wowlan_tcp()
12315 return -ENOMEM; in nl80211_parse_wowlan_tcp()
12316 cfg->src = nla_get_in_addr(tb[NL80211_WOWLAN_TCP_SRC_IPV4]); in nl80211_parse_wowlan_tcp()
12317 cfg->dst = nla_get_in_addr(tb[NL80211_WOWLAN_TCP_DST_IPV4]); in nl80211_parse_wowlan_tcp()
12318 memcpy(cfg->dst_mac, nla_data(tb[NL80211_WOWLAN_TCP_DST_MAC]), in nl80211_parse_wowlan_tcp()
12326 err = __sock_create(wiphy_net(&rdev->wiphy), PF_INET, SOCK_STREAM, in nl80211_parse_wowlan_tcp()
12327 IPPROTO_TCP, &cfg->sock, 1); in nl80211_parse_wowlan_tcp()
12332 if (inet_csk_get_port(cfg->sock->sk, port)) { in nl80211_parse_wowlan_tcp()
12333 sock_release(cfg->sock); in nl80211_parse_wowlan_tcp()
12335 return -EADDRINUSE; in nl80211_parse_wowlan_tcp()
12337 cfg->src_port = inet_sk(cfg->sock->sk)->inet_num; in nl80211_parse_wowlan_tcp()
12341 return -EINVAL; in nl80211_parse_wowlan_tcp()
12343 cfg->src_port = port; in nl80211_parse_wowlan_tcp()
12346 cfg->dst_port = nla_get_u16(tb[NL80211_WOWLAN_TCP_DST_PORT]); in nl80211_parse_wowlan_tcp()
12347 cfg->payload_len = data_size; in nl80211_parse_wowlan_tcp()
12348 cfg->payload = (u8 *)cfg + sizeof(*cfg) + tokens_size; in nl80211_parse_wowlan_tcp()
12349 memcpy((void *)cfg->payload, in nl80211_parse_wowlan_tcp()
12353 cfg->payload_seq = *seq; in nl80211_parse_wowlan_tcp()
12354 cfg->data_interval = nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]); in nl80211_parse_wowlan_tcp()
12355 cfg->wake_len = wake_size; in nl80211_parse_wowlan_tcp()
12356 cfg->wake_data = (u8 *)cfg + sizeof(*cfg) + tokens_size + data_size; in nl80211_parse_wowlan_tcp()
12357 memcpy((void *)cfg->wake_data, in nl80211_parse_wowlan_tcp()
12360 cfg->wake_mask = (u8 *)cfg + sizeof(*cfg) + tokens_size + in nl80211_parse_wowlan_tcp()
12362 memcpy((void *)cfg->wake_mask, in nl80211_parse_wowlan_tcp()
12366 cfg->tokens_size = tokens_size; in nl80211_parse_wowlan_tcp()
12367 memcpy(&cfg->payload_tok, tok, sizeof(*tok) + tokens_size); in nl80211_parse_wowlan_tcp()
12370 trig->tcp = cfg; in nl80211_parse_wowlan_tcp()
12378 struct cfg80211_wowlan *trig) in nl80211_parse_wowlan_nd() argument
12385 return -ENOMEM; in nl80211_parse_wowlan_nd()
12387 if (!(wowlan->flags & WIPHY_WOWLAN_NET_DETECT)) { in nl80211_parse_wowlan_nd()
12388 err = -EOPNOTSUPP; in nl80211_parse_wowlan_nd()
12397 trig->nd_config = nl80211_parse_sched_scan(&rdev->wiphy, NULL, tb, in nl80211_parse_wowlan_nd()
12398 wowlan->max_nd_match_sets); in nl80211_parse_wowlan_nd()
12399 err = PTR_ERR_OR_ZERO(trig->nd_config); in nl80211_parse_wowlan_nd()
12401 trig->nd_config = NULL; in nl80211_parse_wowlan_nd()
12410 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_wowlan()
12414 const struct wiphy_wowlan_support *wowlan = rdev->wiphy.wowlan; in nl80211_set_wowlan()
12416 bool prev_enabled = rdev->wiphy.wowlan_config; in nl80211_set_wowlan()
12420 return -EOPNOTSUPP; in nl80211_set_wowlan()
12422 if (!info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS]) { in nl80211_set_wowlan()
12424 rdev->wiphy.wowlan_config = NULL; in nl80211_set_wowlan()
12429 info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS], in nl80211_set_wowlan()
12430 nl80211_wowlan_policy, info->extack); in nl80211_set_wowlan()
12435 if (!(wowlan->flags & WIPHY_WOWLAN_ANY)) in nl80211_set_wowlan()
12436 return -EINVAL; in nl80211_set_wowlan()
12441 if (!(wowlan->flags & WIPHY_WOWLAN_DISCONNECT)) in nl80211_set_wowlan()
12442 return -EINVAL; in nl80211_set_wowlan()
12448 if (!(wowlan->flags & WIPHY_WOWLAN_MAGIC_PKT)) in nl80211_set_wowlan()
12449 return -EINVAL; in nl80211_set_wowlan()
12455 return -EINVAL; in nl80211_set_wowlan()
12458 if (!(wowlan->flags & WIPHY_WOWLAN_GTK_REKEY_FAILURE)) in nl80211_set_wowlan()
12459 return -EINVAL; in nl80211_set_wowlan()
12465 if (!(wowlan->flags & WIPHY_WOWLAN_EAP_IDENTITY_REQ)) in nl80211_set_wowlan()
12466 return -EINVAL; in nl80211_set_wowlan()
12472 if (!(wowlan->flags & WIPHY_WOWLAN_4WAY_HANDSHAKE)) in nl80211_set_wowlan()
12473 return -EINVAL; in nl80211_set_wowlan()
12479 if (!(wowlan->flags & WIPHY_WOWLAN_RFKILL_RELEASE)) in nl80211_set_wowlan()
12480 return -EINVAL; in nl80211_set_wowlan()
12496 if (n_patterns > wowlan->n_patterns) in nl80211_set_wowlan()
12497 return -EINVAL; in nl80211_set_wowlan()
12503 return -ENOMEM; in nl80211_set_wowlan()
12516 info->extack); in nl80211_set_wowlan()
12520 err = -EINVAL; in nl80211_set_wowlan()
12528 if (pat_len > wowlan->pattern_max_len || in nl80211_set_wowlan()
12529 pat_len < wowlan->pattern_min_len) in nl80211_set_wowlan()
12537 if (pkt_offset > wowlan->max_pkt_offset) in nl80211_set_wowlan()
12543 err = -ENOMEM; in nl80211_set_wowlan()
12579 * normal interrupts (like packet RX, ...) in nl80211_set_wowlan()
12584 err = -EINVAL; in nl80211_set_wowlan()
12590 err = -ENOMEM; in nl80211_set_wowlan()
12594 rdev->wiphy.wowlan_config = ntrig; in nl80211_set_wowlan()
12597 if (rdev->ops->set_wakeup && in nl80211_set_wowlan()
12598 prev_enabled != !!rdev->wiphy.wowlan_config) in nl80211_set_wowlan()
12599 rdev_set_wakeup(rdev, rdev->wiphy.wowlan_config); in nl80211_set_wowlan()
12606 if (new_triggers.tcp && new_triggers.tcp->sock) in nl80211_set_wowlan()
12607 sock_release(new_triggers.tcp->sock); in nl80211_set_wowlan()
12621 if (!rdev->coalesce->n_rules) in nl80211_send_coalesce_rules()
12626 return -ENOBUFS; in nl80211_send_coalesce_rules()
12628 for (i = 0; i < rdev->coalesce->n_rules; i++) { in nl80211_send_coalesce_rules()
12631 return -ENOBUFS; in nl80211_send_coalesce_rules()
12633 rule = &rdev->coalesce->rules[i]; in nl80211_send_coalesce_rules()
12635 rule->delay)) in nl80211_send_coalesce_rules()
12636 return -ENOBUFS; in nl80211_send_coalesce_rules()
12639 rule->condition)) in nl80211_send_coalesce_rules()
12640 return -ENOBUFS; in nl80211_send_coalesce_rules()
12645 return -ENOBUFS; in nl80211_send_coalesce_rules()
12647 for (j = 0; j < rule->n_patterns; j++) { in nl80211_send_coalesce_rules()
12650 return -ENOBUFS; in nl80211_send_coalesce_rules()
12651 pat_len = rule->patterns[j].pattern_len; in nl80211_send_coalesce_rules()
12654 rule->patterns[j].mask) || in nl80211_send_coalesce_rules()
12656 rule->patterns[j].pattern) || in nl80211_send_coalesce_rules()
12658 rule->patterns[j].pkt_offset)) in nl80211_send_coalesce_rules()
12659 return -ENOBUFS; in nl80211_send_coalesce_rules()
12672 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_coalesce()
12676 if (!rdev->wiphy.coalesce) in nl80211_get_coalesce()
12677 return -EOPNOTSUPP; in nl80211_get_coalesce()
12681 return -ENOMEM; in nl80211_get_coalesce()
12683 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_coalesce()
12688 if (rdev->coalesce && nl80211_send_coalesce_rules(msg, rdev)) in nl80211_get_coalesce()
12696 return -ENOBUFS; in nl80211_get_coalesce()
12701 struct cfg80211_coalesce *coalesce = rdev->coalesce; in cfg80211_rdev_free_coalesce()
12708 for (i = 0; i < coalesce->n_rules; i++) { in cfg80211_rdev_free_coalesce()
12709 rule = &coalesce->rules[i]; in cfg80211_rdev_free_coalesce()
12710 for (j = 0; j < rule->n_patterns; j++) in cfg80211_rdev_free_coalesce()
12711 kfree(rule->patterns[j].mask); in cfg80211_rdev_free_coalesce()
12712 kfree(rule->patterns); in cfg80211_rdev_free_coalesce()
12714 kfree(coalesce->rules); in cfg80211_rdev_free_coalesce()
12716 rdev->coalesce = NULL; in cfg80211_rdev_free_coalesce()
12724 const struct wiphy_coalesce_support *coalesce = rdev->wiphy.coalesce; in nl80211_parse_coalesce_rule()
12735 new_rule->delay = in nl80211_parse_coalesce_rule()
12737 if (new_rule->delay > coalesce->max_delay) in nl80211_parse_coalesce_rule()
12738 return -EINVAL; in nl80211_parse_coalesce_rule()
12741 new_rule->condition = in nl80211_parse_coalesce_rule()
12745 return -EINVAL; in nl80211_parse_coalesce_rule()
12750 if (n_patterns > coalesce->n_patterns) in nl80211_parse_coalesce_rule()
12751 return -EINVAL; in nl80211_parse_coalesce_rule()
12753 new_rule->patterns = kcalloc(n_patterns, sizeof(new_rule->patterns[0]), in nl80211_parse_coalesce_rule()
12755 if (!new_rule->patterns) in nl80211_parse_coalesce_rule()
12756 return -ENOMEM; in nl80211_parse_coalesce_rule()
12758 new_rule->n_patterns = n_patterns; in nl80211_parse_coalesce_rule()
12774 return -EINVAL; in nl80211_parse_coalesce_rule()
12778 return -EINVAL; in nl80211_parse_coalesce_rule()
12779 if (pat_len > coalesce->pattern_max_len || in nl80211_parse_coalesce_rule()
12780 pat_len < coalesce->pattern_min_len) in nl80211_parse_coalesce_rule()
12781 return -EINVAL; in nl80211_parse_coalesce_rule()
12787 if (pkt_offset > coalesce->max_pkt_offset) in nl80211_parse_coalesce_rule()
12788 return -EINVAL; in nl80211_parse_coalesce_rule()
12789 new_rule->patterns[i].pkt_offset = pkt_offset; in nl80211_parse_coalesce_rule()
12793 return -ENOMEM; in nl80211_parse_coalesce_rule()
12795 new_rule->patterns[i].mask = mask_pat; in nl80211_parse_coalesce_rule()
12800 new_rule->patterns[i].pattern = mask_pat; in nl80211_parse_coalesce_rule()
12801 new_rule->patterns[i].pattern_len = pat_len; in nl80211_parse_coalesce_rule()
12812 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_coalesce()
12813 const struct wiphy_coalesce_support *coalesce = rdev->wiphy.coalesce; in nl80211_set_coalesce()
12820 if (!rdev->wiphy.coalesce || !rdev->ops->set_coalesce) in nl80211_set_coalesce()
12821 return -EOPNOTSUPP; in nl80211_set_coalesce()
12823 if (!info->attrs[NL80211_ATTR_COALESCE_RULE]) { in nl80211_set_coalesce()
12829 nla_for_each_nested(rule, info->attrs[NL80211_ATTR_COALESCE_RULE], in nl80211_set_coalesce()
12832 if (n_rules > coalesce->n_rules) in nl80211_set_coalesce()
12833 return -EINVAL; in nl80211_set_coalesce()
12838 return -ENOMEM; in nl80211_set_coalesce()
12843 nla_for_each_nested(rule, info->attrs[NL80211_ATTR_COALESCE_RULE], in nl80211_set_coalesce()
12859 err = -ENOMEM; in nl80211_set_coalesce()
12863 rdev->coalesce = n_coalesce; in nl80211_set_coalesce()
12869 for (j = 0; j < tmp_rule->n_patterns; j++) in nl80211_set_coalesce()
12870 kfree(tmp_rule->patterns[j].mask); in nl80211_set_coalesce()
12871 kfree(tmp_rule->patterns); in nl80211_set_coalesce()
12880 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_rekey_data()
12881 struct net_device *dev = info->user_ptr[1]; in nl80211_set_rekey_data()
12882 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_rekey_data()
12887 if (!info->attrs[NL80211_ATTR_REKEY_DATA]) in nl80211_set_rekey_data()
12888 return -EINVAL; in nl80211_set_rekey_data()
12891 info->attrs[NL80211_ATTR_REKEY_DATA], in nl80211_set_rekey_data()
12892 nl80211_rekey_policy, info->extack); in nl80211_set_rekey_data()
12898 return -EINVAL; in nl80211_set_rekey_data()
12900 !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_EXT_KEK_KCK && in nl80211_set_rekey_data()
12902 return -ERANGE; in nl80211_set_rekey_data()
12904 !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_EXT_KEK_KCK && in nl80211_set_rekey_data()
12906 return -ERANGE; in nl80211_set_rekey_data()
12917 if (!wdev->current_bss) { in nl80211_set_rekey_data()
12918 err = -ENOTCONN; in nl80211_set_rekey_data()
12922 if (!rdev->ops->set_rekey_data) { in nl80211_set_rekey_data()
12923 err = -EOPNOTSUPP; in nl80211_set_rekey_data()
12936 struct net_device *dev = info->user_ptr[1]; in nl80211_register_unexpected_frame()
12937 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_register_unexpected_frame()
12939 if (wdev->iftype != NL80211_IFTYPE_AP && in nl80211_register_unexpected_frame()
12940 wdev->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_register_unexpected_frame()
12941 return -EINVAL; in nl80211_register_unexpected_frame()
12943 if (wdev->ap_unexpected_nlportid) in nl80211_register_unexpected_frame()
12944 return -EBUSY; in nl80211_register_unexpected_frame()
12946 wdev->ap_unexpected_nlportid = info->snd_portid; in nl80211_register_unexpected_frame()
12953 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_probe_client()
12954 struct net_device *dev = info->user_ptr[1]; in nl80211_probe_client()
12955 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_probe_client()
12962 if (wdev->iftype != NL80211_IFTYPE_AP && in nl80211_probe_client()
12963 wdev->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_probe_client()
12964 return -EOPNOTSUPP; in nl80211_probe_client()
12966 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_probe_client()
12967 return -EINVAL; in nl80211_probe_client()
12969 if (!rdev->ops->probe_client) in nl80211_probe_client()
12970 return -EOPNOTSUPP; in nl80211_probe_client()
12974 return -ENOMEM; in nl80211_probe_client()
12976 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_probe_client()
12979 err = -ENOBUFS; in nl80211_probe_client()
12983 addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_probe_client()
12998 err = -ENOBUFS; in nl80211_probe_client()
13006 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_register_beacons()
13010 if (!(rdev->wiphy.flags & WIPHY_FLAG_REPORTS_OBSS)) in nl80211_register_beacons()
13011 return -EOPNOTSUPP; in nl80211_register_beacons()
13015 return -ENOMEM; in nl80211_register_beacons()
13018 spin_lock_bh(&rdev->beacon_registrations_lock); in nl80211_register_beacons()
13019 list_for_each_entry(reg, &rdev->beacon_registrations, list) { in nl80211_register_beacons()
13020 if (reg->nlportid == info->snd_portid) { in nl80211_register_beacons()
13021 rv = -EALREADY; in nl80211_register_beacons()
13026 nreg->nlportid = info->snd_portid; in nl80211_register_beacons()
13027 list_add(&nreg->list, &rdev->beacon_registrations); in nl80211_register_beacons()
13029 spin_unlock_bh(&rdev->beacon_registrations_lock); in nl80211_register_beacons()
13033 spin_unlock_bh(&rdev->beacon_registrations_lock); in nl80211_register_beacons()
13040 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_start_p2p_device()
13041 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_start_p2p_device()
13044 if (!rdev->ops->start_p2p_device) in nl80211_start_p2p_device()
13045 return -EOPNOTSUPP; in nl80211_start_p2p_device()
13047 if (wdev->iftype != NL80211_IFTYPE_P2P_DEVICE) in nl80211_start_p2p_device()
13048 return -EOPNOTSUPP; in nl80211_start_p2p_device()
13053 if (rfkill_blocked(rdev->wiphy.rfkill)) in nl80211_start_p2p_device()
13054 return -ERFKILL; in nl80211_start_p2p_device()
13060 wdev->is_running = true; in nl80211_start_p2p_device()
13061 rdev->opencount++; in nl80211_start_p2p_device()
13068 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_stop_p2p_device()
13069 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_stop_p2p_device()
13071 if (wdev->iftype != NL80211_IFTYPE_P2P_DEVICE) in nl80211_stop_p2p_device()
13072 return -EOPNOTSUPP; in nl80211_stop_p2p_device()
13074 if (!rdev->ops->stop_p2p_device) in nl80211_stop_p2p_device()
13075 return -EOPNOTSUPP; in nl80211_stop_p2p_device()
13084 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_start_nan()
13085 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_start_nan()
13089 if (wdev->iftype != NL80211_IFTYPE_NAN) in nl80211_start_nan()
13090 return -EOPNOTSUPP; in nl80211_start_nan()
13093 return -EEXIST; in nl80211_start_nan()
13095 if (rfkill_blocked(rdev->wiphy.rfkill)) in nl80211_start_nan()
13096 return -ERFKILL; in nl80211_start_nan()
13098 if (!info->attrs[NL80211_ATTR_NAN_MASTER_PREF]) in nl80211_start_nan()
13099 return -EINVAL; in nl80211_start_nan()
13102 nla_get_u8(info->attrs[NL80211_ATTR_NAN_MASTER_PREF]); in nl80211_start_nan()
13104 if (info->attrs[NL80211_ATTR_BANDS]) { in nl80211_start_nan()
13105 u32 bands = nla_get_u32(info->attrs[NL80211_ATTR_BANDS]); in nl80211_start_nan()
13107 if (bands & ~(u32)wdev->wiphy->nan_supported_bands) in nl80211_start_nan()
13108 return -EOPNOTSUPP; in nl80211_start_nan()
13111 return -EINVAL; in nl80211_start_nan()
13120 wdev->is_running = true; in nl80211_start_nan()
13121 rdev->opencount++; in nl80211_start_nan()
13128 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_stop_nan()
13129 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_stop_nan()
13131 if (wdev->iftype != NL80211_IFTYPE_NAN) in nl80211_stop_nan()
13132 return -EOPNOTSUPP; in nl80211_stop_nan()
13150 return -EINVAL; in validate_nan_filter()
13167 BUILD_BUG_ON(sizeof(*func->rx_filters) != sizeof(*func->tx_filters)); in handle_nan_filter()
13169 filter = kcalloc(n_entries, sizeof(*func->rx_filters), GFP_KERNEL); in handle_nan_filter()
13171 return -ENOMEM; in handle_nan_filter()
13180 func->num_tx_filters = n_entries; in handle_nan_filter()
13181 func->tx_filters = filter; in handle_nan_filter()
13183 func->num_rx_filters = n_entries; in handle_nan_filter()
13184 func->rx_filters = filter; in handle_nan_filter()
13193 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_nan_add_func()
13194 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_nan_add_func()
13201 if (wdev->iftype != NL80211_IFTYPE_NAN) in nl80211_nan_add_func()
13202 return -EOPNOTSUPP; in nl80211_nan_add_func()
13205 return -ENOTCONN; in nl80211_nan_add_func()
13207 if (!info->attrs[NL80211_ATTR_NAN_FUNC]) in nl80211_nan_add_func()
13208 return -EINVAL; in nl80211_nan_add_func()
13211 info->attrs[NL80211_ATTR_NAN_FUNC], in nl80211_nan_add_func()
13213 info->extack); in nl80211_nan_add_func()
13219 return -ENOMEM; in nl80211_nan_add_func()
13221 func->cookie = cfg80211_assign_cookie(rdev); in nl80211_nan_add_func()
13224 err = -EINVAL; in nl80211_nan_add_func()
13229 func->type = nla_get_u8(tb[NL80211_NAN_FUNC_TYPE]); in nl80211_nan_add_func()
13232 err = -EINVAL; in nl80211_nan_add_func()
13236 memcpy(func->service_id, nla_data(tb[NL80211_NAN_FUNC_SERVICE_ID]), in nl80211_nan_add_func()
13237 sizeof(func->service_id)); in nl80211_nan_add_func()
13239 func->close_range = in nl80211_nan_add_func()
13243 func->serv_spec_info_len = in nl80211_nan_add_func()
13245 func->serv_spec_info = in nl80211_nan_add_func()
13247 func->serv_spec_info_len, in nl80211_nan_add_func()
13249 if (!func->serv_spec_info) { in nl80211_nan_add_func()
13250 err = -ENOMEM; in nl80211_nan_add_func()
13256 func->ttl = nla_get_u32(tb[NL80211_NAN_FUNC_TTL]); in nl80211_nan_add_func()
13258 switch (func->type) { in nl80211_nan_add_func()
13261 err = -EINVAL; in nl80211_nan_add_func()
13265 func->publish_type = in nl80211_nan_add_func()
13267 func->publish_bcast = in nl80211_nan_add_func()
13270 if ((!(func->publish_type & NL80211_NAN_SOLICITED_PUBLISH)) && in nl80211_nan_add_func()
13271 func->publish_bcast) { in nl80211_nan_add_func()
13272 err = -EINVAL; in nl80211_nan_add_func()
13277 func->subscribe_active = in nl80211_nan_add_func()
13284 err = -EINVAL; in nl80211_nan_add_func()
13288 func->followup_id = in nl80211_nan_add_func()
13290 func->followup_reqid = in nl80211_nan_add_func()
13292 memcpy(func->followup_dest.addr, in nl80211_nan_add_func()
13294 sizeof(func->followup_dest.addr)); in nl80211_nan_add_func()
13295 if (func->ttl) { in nl80211_nan_add_func()
13296 err = -EINVAL; in nl80211_nan_add_func()
13301 err = -EINVAL; in nl80211_nan_add_func()
13312 info->extack); in nl80211_nan_add_func()
13316 func->srf_include = in nl80211_nan_add_func()
13322 err = -EINVAL; in nl80211_nan_add_func()
13326 func->srf_bf_len = in nl80211_nan_add_func()
13328 func->srf_bf = in nl80211_nan_add_func()
13330 func->srf_bf_len, GFP_KERNEL); in nl80211_nan_add_func()
13331 if (!func->srf_bf) { in nl80211_nan_add_func()
13332 err = -ENOMEM; in nl80211_nan_add_func()
13336 func->srf_bf_idx = in nl80211_nan_add_func()
13344 err = -EINVAL; in nl80211_nan_add_func()
13350 err = -EINVAL; in nl80211_nan_add_func()
13354 func->srf_num_macs = n_entries; in nl80211_nan_add_func()
13355 func->srf_macs = in nl80211_nan_add_func()
13356 kcalloc(n_entries, sizeof(*func->srf_macs), in nl80211_nan_add_func()
13358 if (!func->srf_macs) { in nl80211_nan_add_func()
13359 err = -ENOMEM; in nl80211_nan_add_func()
13364 memcpy(func->srf_macs[i++].addr, nla_data(attr), in nl80211_nan_add_func()
13365 sizeof(*func->srf_macs)); in nl80211_nan_add_func()
13385 err = -ENOMEM; in nl80211_nan_add_func()
13389 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_nan_add_func()
13391 /* This can't really happen - we just allocated 4KB */ in nl80211_nan_add_func()
13393 err = -ENOMEM; in nl80211_nan_add_func()
13406 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, func->cookie, in nl80211_nan_add_func()
13415 func->instance_id)) in nl80211_nan_add_func()
13425 return -ENOBUFS; in nl80211_nan_add_func()
13431 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_nan_del_func()
13432 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_nan_del_func()
13435 if (wdev->iftype != NL80211_IFTYPE_NAN) in nl80211_nan_del_func()
13436 return -EOPNOTSUPP; in nl80211_nan_del_func()
13439 return -ENOTCONN; in nl80211_nan_del_func()
13441 if (!info->attrs[NL80211_ATTR_COOKIE]) in nl80211_nan_del_func()
13442 return -EINVAL; in nl80211_nan_del_func()
13444 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); in nl80211_nan_del_func()
13454 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_nan_change_config()
13455 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_nan_change_config()
13459 if (wdev->iftype != NL80211_IFTYPE_NAN) in nl80211_nan_change_config()
13460 return -EOPNOTSUPP; in nl80211_nan_change_config()
13463 return -ENOTCONN; in nl80211_nan_change_config()
13465 if (info->attrs[NL80211_ATTR_NAN_MASTER_PREF]) { in nl80211_nan_change_config()
13467 nla_get_u8(info->attrs[NL80211_ATTR_NAN_MASTER_PREF]); in nl80211_nan_change_config()
13469 return -EINVAL; in nl80211_nan_change_config()
13474 if (info->attrs[NL80211_ATTR_BANDS]) { in nl80211_nan_change_config()
13475 u32 bands = nla_get_u32(info->attrs[NL80211_ATTR_BANDS]); in nl80211_nan_change_config()
13477 if (bands & ~(u32)wdev->wiphy->nan_supported_bands) in nl80211_nan_change_config()
13478 return -EOPNOTSUPP; in nl80211_nan_change_config()
13481 return -EINVAL; in nl80211_nan_change_config()
13488 return -EINVAL; in nl80211_nan_change_config()
13496 struct wiphy *wiphy = wdev->wiphy; in cfg80211_nan_match()
13502 if (WARN_ON(!match->inst_id || !match->peer_inst_id || !match->addr)) in cfg80211_nan_match()
13515 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_nan_match()
13516 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, in cfg80211_nan_match()
13517 wdev->netdev->ifindex)) || in cfg80211_nan_match()
13522 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, match->cookie, in cfg80211_nan_match()
13524 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, match->addr)) in cfg80211_nan_match()
13536 if (nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, match->inst_id)) in cfg80211_nan_match()
13546 if (nla_put_u8(msg, NL80211_NAN_FUNC_TYPE, match->type) || in cfg80211_nan_match()
13547 nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, match->peer_inst_id)) in cfg80211_nan_match()
13550 if (match->info && match->info_len && in cfg80211_nan_match()
13551 nla_put(msg, NL80211_NAN_FUNC_SERVICE_INFO, match->info_len, in cfg80211_nan_match()
13552 match->info)) in cfg80211_nan_match()
13559 if (!wdev->owner_nlportid) in cfg80211_nan_match()
13560 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), in cfg80211_nan_match()
13563 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, in cfg80211_nan_match()
13564 wdev->owner_nlportid); in cfg80211_nan_match()
13578 struct wiphy *wiphy = wdev->wiphy; in cfg80211_nan_func_terminated()
13597 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_nan_func_terminated()
13598 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, in cfg80211_nan_func_terminated()
13599 wdev->netdev->ifindex)) || in cfg80211_nan_func_terminated()
13619 if (!wdev->owner_nlportid) in cfg80211_nan_func_terminated()
13620 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), in cfg80211_nan_func_terminated()
13623 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, in cfg80211_nan_func_terminated()
13624 wdev->owner_nlportid); in cfg80211_nan_func_terminated()
13641 return -ENOMEM; in nl80211_get_protocol_features()
13643 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_protocol_features()
13657 return -ENOBUFS; in nl80211_get_protocol_features()
13662 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_update_ft_ies()
13664 struct net_device *dev = info->user_ptr[1]; in nl80211_update_ft_ies()
13666 if (!rdev->ops->update_ft_ies) in nl80211_update_ft_ies()
13667 return -EOPNOTSUPP; in nl80211_update_ft_ies()
13669 if (!info->attrs[NL80211_ATTR_MDID] || in nl80211_update_ft_ies()
13670 !info->attrs[NL80211_ATTR_IE]) in nl80211_update_ft_ies()
13671 return -EINVAL; in nl80211_update_ft_ies()
13674 ft_params.md = nla_get_u16(info->attrs[NL80211_ATTR_MDID]); in nl80211_update_ft_ies()
13675 ft_params.ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_update_ft_ies()
13676 ft_params.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_update_ft_ies()
13684 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_crit_protocol_start()
13685 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_crit_protocol_start()
13690 if (!rdev->ops->crit_proto_start) in nl80211_crit_protocol_start()
13691 return -EOPNOTSUPP; in nl80211_crit_protocol_start()
13693 if (WARN_ON(!rdev->ops->crit_proto_stop)) in nl80211_crit_protocol_start()
13694 return -EINVAL; in nl80211_crit_protocol_start()
13696 if (rdev->crit_proto_nlportid) in nl80211_crit_protocol_start()
13697 return -EBUSY; in nl80211_crit_protocol_start()
13700 if (info->attrs[NL80211_ATTR_CRIT_PROT_ID]) in nl80211_crit_protocol_start()
13701 proto = nla_get_u16(info->attrs[NL80211_ATTR_CRIT_PROT_ID]); in nl80211_crit_protocol_start()
13704 return -EINVAL; in nl80211_crit_protocol_start()
13707 if (!info->attrs[NL80211_ATTR_MAX_CRIT_PROT_DURATION]) in nl80211_crit_protocol_start()
13708 return -EINVAL; in nl80211_crit_protocol_start()
13711 nla_get_u16(info->attrs[NL80211_ATTR_MAX_CRIT_PROT_DURATION]); in nl80211_crit_protocol_start()
13715 rdev->crit_proto_nlportid = info->snd_portid; in nl80211_crit_protocol_start()
13723 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_crit_protocol_stop()
13724 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_crit_protocol_stop()
13726 if (!rdev->ops->crit_proto_stop) in nl80211_crit_protocol_stop()
13727 return -EOPNOTSUPP; in nl80211_crit_protocol_stop()
13729 if (rdev->crit_proto_nlportid) { in nl80211_crit_protocol_stop()
13730 rdev->crit_proto_nlportid = 0; in nl80211_crit_protocol_stop()
13740 if (vcmd->policy == VENDOR_CMD_RAW_DATA) { in nl80211_vendor_check_policy()
13741 if (attr->nla_type & NLA_F_NESTED) { in nl80211_vendor_check_policy()
13744 return -EINVAL; in nl80211_vendor_check_policy()
13750 if (!(attr->nla_type & NLA_F_NESTED)) { in nl80211_vendor_check_policy()
13752 return -EINVAL; in nl80211_vendor_check_policy()
13755 return nla_validate_nested(attr, vcmd->maxattr, vcmd->policy, extack); in nl80211_vendor_check_policy()
13760 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_vendor_cmd()
13763 info->attrs); in nl80211_vendor_cmd()
13767 if (!rdev->wiphy.vendor_commands) in nl80211_vendor_cmd()
13768 return -EOPNOTSUPP; in nl80211_vendor_cmd()
13772 if (err != -EINVAL) in nl80211_vendor_cmd()
13775 } else if (wdev->wiphy != &rdev->wiphy) { in nl80211_vendor_cmd()
13776 return -EINVAL; in nl80211_vendor_cmd()
13779 if (!info->attrs[NL80211_ATTR_VENDOR_ID] || in nl80211_vendor_cmd()
13780 !info->attrs[NL80211_ATTR_VENDOR_SUBCMD]) in nl80211_vendor_cmd()
13781 return -EINVAL; in nl80211_vendor_cmd()
13783 vid = nla_get_u32(info->attrs[NL80211_ATTR_VENDOR_ID]); in nl80211_vendor_cmd()
13784 subcmd = nla_get_u32(info->attrs[NL80211_ATTR_VENDOR_SUBCMD]); in nl80211_vendor_cmd()
13785 for (i = 0; i < rdev->wiphy.n_vendor_commands; i++) { in nl80211_vendor_cmd()
13790 vcmd = &rdev->wiphy.vendor_commands[i]; in nl80211_vendor_cmd()
13792 if (vcmd->info.vendor_id != vid || vcmd->info.subcmd != subcmd) in nl80211_vendor_cmd()
13795 if (vcmd->flags & (WIPHY_VENDOR_CMD_NEED_WDEV | in nl80211_vendor_cmd()
13798 return -EINVAL; in nl80211_vendor_cmd()
13799 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_NETDEV && in nl80211_vendor_cmd()
13800 !wdev->netdev) in nl80211_vendor_cmd()
13801 return -EINVAL; in nl80211_vendor_cmd()
13803 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_RUNNING) { in nl80211_vendor_cmd()
13805 return -ENETDOWN; in nl80211_vendor_cmd()
13811 if (!vcmd->doit) in nl80211_vendor_cmd()
13812 return -EOPNOTSUPP; in nl80211_vendor_cmd()
13814 if (info->attrs[NL80211_ATTR_VENDOR_DATA]) { in nl80211_vendor_cmd()
13815 data = nla_data(info->attrs[NL80211_ATTR_VENDOR_DATA]); in nl80211_vendor_cmd()
13816 len = nla_len(info->attrs[NL80211_ATTR_VENDOR_DATA]); in nl80211_vendor_cmd()
13819 info->attrs[NL80211_ATTR_VENDOR_DATA], in nl80211_vendor_cmd()
13820 info->extack); in nl80211_vendor_cmd()
13825 rdev->cur_cmd_info = info; in nl80211_vendor_cmd()
13826 err = vcmd->doit(&rdev->wiphy, wdev, data, len); in nl80211_vendor_cmd()
13827 rdev->cur_cmd_info = NULL; in nl80211_vendor_cmd()
13831 return -EOPNOTSUPP; in nl80211_vendor_cmd()
13842 int vcmd_idx = -1; in nl80211_prepare_vendor_dump()
13847 if (cb->args[0]) { in nl80211_prepare_vendor_dump()
13849 struct wiphy *wiphy = wiphy_idx_to_wiphy(cb->args[0] - 1); in nl80211_prepare_vendor_dump()
13853 return -ENODEV; in nl80211_prepare_vendor_dump()
13857 if (cb->args[1]) { in nl80211_prepare_vendor_dump()
13858 list_for_each_entry(tmp, &wiphy->wdev_list, list) { in nl80211_prepare_vendor_dump()
13859 if (tmp->identifier == cb->args[1] - 1) { in nl80211_prepare_vendor_dump()
13872 return -ENOMEM; in nl80211_prepare_vendor_dump()
13874 err = nlmsg_parse_deprecated(cb->nlh, in nl80211_prepare_vendor_dump()
13883 err = -EINVAL; in nl80211_prepare_vendor_dump()
13887 *wdev = __cfg80211_wdev_from_attrs(NULL, sock_net(skb->sk), attrbuf); in nl80211_prepare_vendor_dump()
13891 *rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk), attrbuf); in nl80211_prepare_vendor_dump()
13900 for (i = 0; i < (*rdev)->wiphy.n_vendor_commands; i++) { in nl80211_prepare_vendor_dump()
13903 vcmd = &(*rdev)->wiphy.vendor_commands[i]; in nl80211_prepare_vendor_dump()
13905 if (vcmd->info.vendor_id != vid || vcmd->info.subcmd != subcmd) in nl80211_prepare_vendor_dump()
13908 if (!vcmd->dumpit) { in nl80211_prepare_vendor_dump()
13909 err = -EOPNOTSUPP; in nl80211_prepare_vendor_dump()
13918 err = -EOPNOTSUPP; in nl80211_prepare_vendor_dump()
13927 &(*rdev)->wiphy.vendor_commands[vcmd_idx], in nl80211_prepare_vendor_dump()
13929 cb->extack); in nl80211_prepare_vendor_dump()
13934 /* 0 is the first index - add 1 to parse only once */ in nl80211_prepare_vendor_dump()
13935 cb->args[0] = (*rdev)->wiphy_idx + 1; in nl80211_prepare_vendor_dump()
13937 cb->args[1] = *wdev ? (*wdev)->identifier + 1 : 0; in nl80211_prepare_vendor_dump()
13938 cb->args[2] = vcmd_idx; in nl80211_prepare_vendor_dump()
13939 cb->args[3] = (unsigned long)data; in nl80211_prepare_vendor_dump()
13940 cb->args[4] = data_len; in nl80211_prepare_vendor_dump()
13966 vcmd_idx = cb->args[2]; in nl80211_vendor_cmd_dump()
13967 data = (void *)cb->args[3]; in nl80211_vendor_cmd_dump()
13968 data_len = cb->args[4]; in nl80211_vendor_cmd_dump()
13969 vcmd = &rdev->wiphy.vendor_commands[vcmd_idx]; in nl80211_vendor_cmd_dump()
13971 if (vcmd->flags & (WIPHY_VENDOR_CMD_NEED_WDEV | in nl80211_vendor_cmd_dump()
13974 err = -EINVAL; in nl80211_vendor_cmd_dump()
13977 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_NETDEV && in nl80211_vendor_cmd_dump()
13978 !wdev->netdev) { in nl80211_vendor_cmd_dump()
13979 err = -EINVAL; in nl80211_vendor_cmd_dump()
13983 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_RUNNING) { in nl80211_vendor_cmd_dump()
13985 err = -ENETDOWN; in nl80211_vendor_cmd_dump()
13992 void *hdr = nl80211hdr_put(skb, NETLINK_CB(cb->skb).portid, in nl80211_vendor_cmd_dump()
13993 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_vendor_cmd_dump()
13998 if (nla_put_u32(skb, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_vendor_cmd_dump()
14013 err = vcmd->dumpit(&rdev->wiphy, wdev, skb, data, data_len, in nl80211_vendor_cmd_dump()
14014 (unsigned long *)&cb->args[5]); in nl80211_vendor_cmd_dump()
14017 if (err == -ENOBUFS || err == -ENOENT) { in nl80211_vendor_cmd_dump()
14028 err = skb->len; in nl80211_vendor_cmd_dump()
14041 if (WARN_ON(!rdev->cur_cmd_info)) in __cfg80211_alloc_reply_skb()
14045 rdev->cur_cmd_info->snd_portid, in __cfg80211_alloc_reply_skb()
14046 rdev->cur_cmd_info->snd_seq, in __cfg80211_alloc_reply_skb()
14053 struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0]; in cfg80211_vendor_cmd_reply()
14054 void *hdr = ((void **)skb->cb)[1]; in cfg80211_vendor_cmd_reply()
14055 struct nlattr *data = ((void **)skb->cb)[2]; in cfg80211_vendor_cmd_reply()
14058 memset(skb->cb, 0, sizeof(skb->cb)); in cfg80211_vendor_cmd_reply()
14060 if (WARN_ON(!rdev->cur_cmd_info)) { in cfg80211_vendor_cmd_reply()
14062 return -EINVAL; in cfg80211_vendor_cmd_reply()
14067 return genlmsg_reply(skb, rdev->cur_cmd_info); in cfg80211_vendor_cmd_reply()
14075 if (WARN_ON(!rdev->cur_cmd_info)) in cfg80211_vendor_cmd_get_sender()
14078 return rdev->cur_cmd_info->snd_portid; in cfg80211_vendor_cmd_get_sender()
14085 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_qos_map()
14087 struct net_device *dev = info->user_ptr[1]; in nl80211_set_qos_map()
14091 if (!rdev->ops->set_qos_map) in nl80211_set_qos_map()
14092 return -EOPNOTSUPP; in nl80211_set_qos_map()
14094 if (info->attrs[NL80211_ATTR_QOS_MAP]) { in nl80211_set_qos_map()
14095 pos = nla_data(info->attrs[NL80211_ATTR_QOS_MAP]); in nl80211_set_qos_map()
14096 len = nla_len(info->attrs[NL80211_ATTR_QOS_MAP]); in nl80211_set_qos_map()
14099 return -EINVAL; in nl80211_set_qos_map()
14103 return -ENOMEM; in nl80211_set_qos_map()
14105 num_des = (len - IEEE80211_QOS_MAP_LEN_MIN) >> 1; in nl80211_set_qos_map()
14109 memcpy(qos_map->dscp_exception, pos, des_len); in nl80211_set_qos_map()
14110 qos_map->num_des = num_des; in nl80211_set_qos_map()
14112 if (qos_map->dscp_exception[des].up > 7) { in nl80211_set_qos_map()
14114 return -EINVAL; in nl80211_set_qos_map()
14119 memcpy(qos_map->up, pos, IEEE80211_QOS_MAP_LEN_MIN); in nl80211_set_qos_map()
14122 wdev_lock(dev->ieee80211_ptr); in nl80211_set_qos_map()
14123 ret = nl80211_key_allowed(dev->ieee80211_ptr); in nl80211_set_qos_map()
14126 wdev_unlock(dev->ieee80211_ptr); in nl80211_set_qos_map()
14134 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_add_tx_ts()
14135 struct net_device *dev = info->user_ptr[1]; in nl80211_add_tx_ts()
14136 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_add_tx_ts()
14142 if (!(rdev->wiphy.features & NL80211_FEATURE_SUPPORTS_WMM_ADMISSION)) in nl80211_add_tx_ts()
14143 return -EOPNOTSUPP; in nl80211_add_tx_ts()
14145 if (!info->attrs[NL80211_ATTR_TSID] || !info->attrs[NL80211_ATTR_MAC] || in nl80211_add_tx_ts()
14146 !info->attrs[NL80211_ATTR_USER_PRIO]) in nl80211_add_tx_ts()
14147 return -EINVAL; in nl80211_add_tx_ts()
14149 tsid = nla_get_u8(info->attrs[NL80211_ATTR_TSID]); in nl80211_add_tx_ts()
14150 up = nla_get_u8(info->attrs[NL80211_ATTR_USER_PRIO]); in nl80211_add_tx_ts()
14152 /* WMM uses TIDs 0-7 even for TSPEC */ in nl80211_add_tx_ts()
14158 return -EINVAL; in nl80211_add_tx_ts()
14161 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_add_tx_ts()
14163 if (info->attrs[NL80211_ATTR_ADMITTED_TIME]) { in nl80211_add_tx_ts()
14165 nla_get_u16(info->attrs[NL80211_ATTR_ADMITTED_TIME]); in nl80211_add_tx_ts()
14167 return -EINVAL; in nl80211_add_tx_ts()
14171 switch (wdev->iftype) { in nl80211_add_tx_ts()
14174 if (wdev->current_bss) in nl80211_add_tx_ts()
14176 err = -ENOTCONN; in nl80211_add_tx_ts()
14179 err = -EOPNOTSUPP; in nl80211_add_tx_ts()
14192 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_del_tx_ts()
14193 struct net_device *dev = info->user_ptr[1]; in nl80211_del_tx_ts()
14194 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_del_tx_ts()
14199 if (!info->attrs[NL80211_ATTR_TSID] || !info->attrs[NL80211_ATTR_MAC]) in nl80211_del_tx_ts()
14200 return -EINVAL; in nl80211_del_tx_ts()
14202 tsid = nla_get_u8(info->attrs[NL80211_ATTR_TSID]); in nl80211_del_tx_ts()
14203 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_del_tx_ts()
14215 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_tdls_channel_switch()
14216 struct net_device *dev = info->user_ptr[1]; in nl80211_tdls_channel_switch()
14217 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_tdls_channel_switch()
14223 if (!rdev->ops->tdls_channel_switch || in nl80211_tdls_channel_switch()
14224 !(rdev->wiphy.features & NL80211_FEATURE_TDLS_CHANNEL_SWITCH)) in nl80211_tdls_channel_switch()
14225 return -EOPNOTSUPP; in nl80211_tdls_channel_switch()
14227 switch (dev->ieee80211_ptr->iftype) { in nl80211_tdls_channel_switch()
14232 return -EOPNOTSUPP; in nl80211_tdls_channel_switch()
14235 if (!info->attrs[NL80211_ATTR_MAC] || in nl80211_tdls_channel_switch()
14236 !info->attrs[NL80211_ATTR_OPER_CLASS]) in nl80211_tdls_channel_switch()
14237 return -EINVAL; in nl80211_tdls_channel_switch()
14244 * Don't allow wide channels on the 2.4Ghz band, as per IEEE802.11-2012 in nl80211_tdls_channel_switch()
14248 if (chandef.chan->band == NL80211_BAND_2GHZ && in nl80211_tdls_channel_switch()
14251 return -EINVAL; in nl80211_tdls_channel_switch()
14254 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &chandef, in nl80211_tdls_channel_switch()
14255 wdev->iftype)) in nl80211_tdls_channel_switch()
14256 return -EINVAL; in nl80211_tdls_channel_switch()
14259 if (cfg80211_chandef_dfs_required(wdev->wiphy, &chandef, wdev->iftype)) in nl80211_tdls_channel_switch()
14260 return -EINVAL; in nl80211_tdls_channel_switch()
14262 addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_tdls_channel_switch()
14263 oper_class = nla_get_u8(info->attrs[NL80211_ATTR_OPER_CLASS]); in nl80211_tdls_channel_switch()
14275 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_tdls_cancel_channel_switch()
14276 struct net_device *dev = info->user_ptr[1]; in nl80211_tdls_cancel_channel_switch()
14277 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_tdls_cancel_channel_switch()
14280 if (!rdev->ops->tdls_channel_switch || in nl80211_tdls_cancel_channel_switch()
14281 !rdev->ops->tdls_cancel_channel_switch || in nl80211_tdls_cancel_channel_switch()
14282 !(rdev->wiphy.features & NL80211_FEATURE_TDLS_CHANNEL_SWITCH)) in nl80211_tdls_cancel_channel_switch()
14283 return -EOPNOTSUPP; in nl80211_tdls_cancel_channel_switch()
14285 switch (dev->ieee80211_ptr->iftype) { in nl80211_tdls_cancel_channel_switch()
14290 return -EOPNOTSUPP; in nl80211_tdls_cancel_channel_switch()
14293 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_tdls_cancel_channel_switch()
14294 return -EINVAL; in nl80211_tdls_cancel_channel_switch()
14296 addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_tdls_cancel_channel_switch()
14308 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_multicast_to_unicast()
14309 struct net_device *dev = info->user_ptr[1]; in nl80211_set_multicast_to_unicast()
14310 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_multicast_to_unicast()
14314 if (!rdev->ops->set_multicast_to_unicast) in nl80211_set_multicast_to_unicast()
14315 return -EOPNOTSUPP; in nl80211_set_multicast_to_unicast()
14317 if (wdev->iftype != NL80211_IFTYPE_AP && in nl80211_set_multicast_to_unicast()
14318 wdev->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_set_multicast_to_unicast()
14319 return -EOPNOTSUPP; in nl80211_set_multicast_to_unicast()
14321 nla = info->attrs[NL80211_ATTR_MULTICAST_TO_UNICAST_ENABLED]; in nl80211_set_multicast_to_unicast()
14329 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_pmk()
14330 struct net_device *dev = info->user_ptr[1]; in nl80211_set_pmk()
14331 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_pmk()
14335 if (wdev->iftype != NL80211_IFTYPE_STATION && in nl80211_set_pmk()
14336 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_set_pmk()
14337 return -EOPNOTSUPP; in nl80211_set_pmk()
14339 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_set_pmk()
14341 return -EOPNOTSUPP; in nl80211_set_pmk()
14343 if (!info->attrs[NL80211_ATTR_MAC] || !info->attrs[NL80211_ATTR_PMK]) in nl80211_set_pmk()
14344 return -EINVAL; in nl80211_set_pmk()
14347 if (!wdev->current_bss) { in nl80211_set_pmk()
14348 ret = -ENOTCONN; in nl80211_set_pmk()
14352 pmk_conf.aa = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_set_pmk()
14353 if (memcmp(pmk_conf.aa, wdev->current_bss->pub.bssid, ETH_ALEN)) { in nl80211_set_pmk()
14354 ret = -EINVAL; in nl80211_set_pmk()
14358 pmk_conf.pmk = nla_data(info->attrs[NL80211_ATTR_PMK]); in nl80211_set_pmk()
14359 pmk_conf.pmk_len = nla_len(info->attrs[NL80211_ATTR_PMK]); in nl80211_set_pmk()
14362 ret = -EINVAL; in nl80211_set_pmk()
14366 if (info->attrs[NL80211_ATTR_PMKR0_NAME]) in nl80211_set_pmk()
14368 nla_data(info->attrs[NL80211_ATTR_PMKR0_NAME]); in nl80211_set_pmk()
14378 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_del_pmk()
14379 struct net_device *dev = info->user_ptr[1]; in nl80211_del_pmk()
14380 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_del_pmk()
14384 if (wdev->iftype != NL80211_IFTYPE_STATION && in nl80211_del_pmk()
14385 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_del_pmk()
14386 return -EOPNOTSUPP; in nl80211_del_pmk()
14388 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_del_pmk()
14390 return -EOPNOTSUPP; in nl80211_del_pmk()
14392 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_del_pmk()
14393 return -EINVAL; in nl80211_del_pmk()
14396 aa = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_del_pmk()
14405 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_external_auth()
14406 struct net_device *dev = info->user_ptr[1]; in nl80211_external_auth()
14409 if (!rdev->ops->external_auth) in nl80211_external_auth()
14410 return -EOPNOTSUPP; in nl80211_external_auth()
14412 if (!info->attrs[NL80211_ATTR_SSID] && in nl80211_external_auth()
14413 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && in nl80211_external_auth()
14414 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_external_auth()
14415 return -EINVAL; in nl80211_external_auth()
14417 if (!info->attrs[NL80211_ATTR_BSSID]) in nl80211_external_auth()
14418 return -EINVAL; in nl80211_external_auth()
14420 if (!info->attrs[NL80211_ATTR_STATUS_CODE]) in nl80211_external_auth()
14421 return -EINVAL; in nl80211_external_auth()
14425 if (info->attrs[NL80211_ATTR_SSID]) { in nl80211_external_auth()
14426 params.ssid.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); in nl80211_external_auth()
14428 return -EINVAL; in nl80211_external_auth()
14430 nla_data(info->attrs[NL80211_ATTR_SSID]), in nl80211_external_auth()
14434 memcpy(params.bssid, nla_data(info->attrs[NL80211_ATTR_BSSID]), in nl80211_external_auth()
14437 params.status = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]); in nl80211_external_auth()
14439 if (info->attrs[NL80211_ATTR_PMKID]) in nl80211_external_auth()
14440 params.pmkid = nla_data(info->attrs[NL80211_ATTR_PMKID]); in nl80211_external_auth()
14447 bool dont_wait_for_ack = info->attrs[NL80211_ATTR_DONT_WAIT_FOR_ACK]; in nl80211_tx_control_port()
14448 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_tx_control_port()
14449 struct net_device *dev = info->user_ptr[1]; in nl80211_tx_control_port()
14450 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_tx_control_port()
14459 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_tx_control_port()
14461 return -EOPNOTSUPP; in nl80211_tx_control_port()
14463 if (!rdev->ops->tx_control_port) in nl80211_tx_control_port()
14464 return -EOPNOTSUPP; in nl80211_tx_control_port()
14466 if (!info->attrs[NL80211_ATTR_FRAME] || in nl80211_tx_control_port()
14467 !info->attrs[NL80211_ATTR_MAC] || in nl80211_tx_control_port()
14468 !info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]) { in nl80211_tx_control_port()
14470 return -EINVAL; in nl80211_tx_control_port()
14475 switch (wdev->iftype) { in nl80211_tx_control_port()
14483 if (wdev->current_bss) in nl80211_tx_control_port()
14485 err = -ENOTCONN; in nl80211_tx_control_port()
14488 err = -EOPNOTSUPP; in nl80211_tx_control_port()
14494 buf = nla_data(info->attrs[NL80211_ATTR_FRAME]); in nl80211_tx_control_port()
14495 len = nla_len(info->attrs[NL80211_ATTR_FRAME]); in nl80211_tx_control_port()
14496 dest = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_tx_control_port()
14497 proto = nla_get_u16(info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]); in nl80211_tx_control_port()
14499 nla_get_flag(info->attrs[NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT]); in nl80211_tx_control_port()
14505 nl_set_extack_cookie_u64(info->extack, cookie); in nl80211_tx_control_port()
14515 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_ftm_responder_stats()
14516 struct net_device *dev = info->user_ptr[1]; in nl80211_get_ftm_responder_stats()
14517 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_get_ftm_responder_stats()
14524 if (wdev->iftype != NL80211_IFTYPE_AP || !wdev->beacon_interval) in nl80211_get_ftm_responder_stats()
14525 return -EOPNOTSUPP; in nl80211_get_ftm_responder_stats()
14532 return -ENODATA; in nl80211_get_ftm_responder_stats()
14536 return -ENOMEM; in nl80211_get_ftm_responder_stats()
14538 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_ftm_responder_stats()
14543 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) in nl80211_get_ftm_responder_stats()
14580 return -ENOBUFS; in nl80211_get_ftm_responder_stats()
14585 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_update_owe_info()
14587 struct net_device *dev = info->user_ptr[1]; in nl80211_update_owe_info()
14589 if (!rdev->ops->update_owe_info) in nl80211_update_owe_info()
14590 return -EOPNOTSUPP; in nl80211_update_owe_info()
14592 if (!info->attrs[NL80211_ATTR_STATUS_CODE] || in nl80211_update_owe_info()
14593 !info->attrs[NL80211_ATTR_MAC]) in nl80211_update_owe_info()
14594 return -EINVAL; in nl80211_update_owe_info()
14597 owe_info.status = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]); in nl80211_update_owe_info()
14598 nla_memcpy(owe_info.peer, info->attrs[NL80211_ATTR_MAC], ETH_ALEN); in nl80211_update_owe_info()
14600 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_update_owe_info()
14601 owe_info.ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_update_owe_info()
14602 owe_info.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_update_owe_info()
14610 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_probe_mesh_link()
14611 struct net_device *dev = info->user_ptr[1]; in nl80211_probe_mesh_link()
14612 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_probe_mesh_link()
14619 if (!rdev->ops->probe_mesh_link || !rdev->ops->get_station) in nl80211_probe_mesh_link()
14620 return -EOPNOTSUPP; in nl80211_probe_mesh_link()
14622 if (!info->attrs[NL80211_ATTR_MAC] || in nl80211_probe_mesh_link()
14623 !info->attrs[NL80211_ATTR_FRAME]) { in nl80211_probe_mesh_link()
14625 return -EINVAL; in nl80211_probe_mesh_link()
14628 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_probe_mesh_link()
14629 return -EOPNOTSUPP; in nl80211_probe_mesh_link()
14631 dest = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_probe_mesh_link()
14632 buf = nla_data(info->attrs[NL80211_ATTR_FRAME]); in nl80211_probe_mesh_link()
14633 len = nla_len(info->attrs[NL80211_ATTR_FRAME]); in nl80211_probe_mesh_link()
14636 return -EINVAL; in nl80211_probe_mesh_link()
14639 !ether_addr_equal(buf + ETH_ALEN, dev->dev_addr)) in nl80211_probe_mesh_link()
14640 return -EINVAL; in nl80211_probe_mesh_link()
14656 struct netlink_ext_ack *extack = info->extack; in parse_tid_conf()
14661 return -EINVAL; in parse_tid_conf()
14663 tid_conf->config_override = in parse_tid_conf()
14665 tid_conf->tids = nla_get_u16(attrs[NL80211_TID_CONFIG_ATTR_TIDS]); in parse_tid_conf()
14667 if (tid_conf->config_override) { in parse_tid_conf()
14668 if (rdev->ops->reset_tid_config) { in parse_tid_conf()
14670 tid_conf->tids); in parse_tid_conf()
14674 return -EINVAL; in parse_tid_conf()
14679 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_NOACK); in parse_tid_conf()
14680 tid_conf->noack = in parse_tid_conf()
14685 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_RETRY_SHORT); in parse_tid_conf()
14686 tid_conf->retry_short = in parse_tid_conf()
14689 if (tid_conf->retry_short > rdev->wiphy.max_data_retry_count) in parse_tid_conf()
14690 return -EINVAL; in parse_tid_conf()
14694 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_RETRY_LONG); in parse_tid_conf()
14695 tid_conf->retry_long = in parse_tid_conf()
14698 if (tid_conf->retry_long > rdev->wiphy.max_data_retry_count) in parse_tid_conf()
14699 return -EINVAL; in parse_tid_conf()
14703 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_AMPDU_CTRL); in parse_tid_conf()
14704 tid_conf->ampdu = in parse_tid_conf()
14709 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL); in parse_tid_conf()
14710 tid_conf->rtscts = in parse_tid_conf()
14715 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_AMSDU_CTRL); in parse_tid_conf()
14716 tid_conf->amsdu = in parse_tid_conf()
14723 tid_conf->txrate_type = nla_get_u8(attrs[idx]); in parse_tid_conf()
14725 if (tid_conf->txrate_type != NL80211_TX_RATE_AUTOMATIC) { in parse_tid_conf()
14728 &tid_conf->txrate_mask, dev, in parse_tid_conf()
14733 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_TX_RATE); in parse_tid_conf()
14735 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE); in parse_tid_conf()
14739 mask = rdev->wiphy.tid_config_support.peer; in parse_tid_conf()
14741 mask = rdev->wiphy.tid_config_support.vif; in parse_tid_conf()
14743 if (tid_conf->mask & ~mask) { in parse_tid_conf()
14745 return -ENOTSUPP; in parse_tid_conf()
14754 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_tid_config()
14756 struct net_device *dev = info->user_ptr[1]; in nl80211_set_tid_config()
14760 int ret = -EINVAL; in nl80211_set_tid_config()
14763 if (!info->attrs[NL80211_ATTR_TID_CONFIG]) in nl80211_set_tid_config()
14764 return -EINVAL; in nl80211_set_tid_config()
14766 if (!rdev->ops->set_tid_config) in nl80211_set_tid_config()
14767 return -EOPNOTSUPP; in nl80211_set_tid_config()
14769 nla_for_each_nested(tid, info->attrs[NL80211_ATTR_TID_CONFIG], in nl80211_set_tid_config()
14776 return -ENOMEM; in nl80211_set_tid_config()
14778 tid_config->n_tid_conf = num_conf; in nl80211_set_tid_config()
14780 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_set_tid_config()
14781 tid_config->peer = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_set_tid_config()
14783 nla_for_each_nested(tid, info->attrs[NL80211_ATTR_TID_CONFIG], in nl80211_set_tid_config()
14792 &tid_config->tid_conf[conf_idx], in nl80211_set_tid_config()
14793 info, tid_config->peer); in nl80211_set_tid_config()
14809 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_color_change()
14811 struct net_device *dev = info->user_ptr[1]; in nl80211_color_change()
14812 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_color_change()
14817 if (!rdev->ops->color_change) in nl80211_color_change()
14818 return -EOPNOTSUPP; in nl80211_color_change()
14820 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_color_change()
14822 return -EOPNOTSUPP; in nl80211_color_change()
14824 if (wdev->iftype != NL80211_IFTYPE_AP) in nl80211_color_change()
14825 return -EOPNOTSUPP; in nl80211_color_change()
14827 if (!info->attrs[NL80211_ATTR_COLOR_CHANGE_COUNT] || in nl80211_color_change()
14828 !info->attrs[NL80211_ATTR_COLOR_CHANGE_COLOR] || in nl80211_color_change()
14829 !info->attrs[NL80211_ATTR_COLOR_CHANGE_ELEMS]) in nl80211_color_change()
14830 return -EINVAL; in nl80211_color_change()
14832 params.count = nla_get_u8(info->attrs[NL80211_ATTR_COLOR_CHANGE_COUNT]); in nl80211_color_change()
14833 params.color = nla_get_u8(info->attrs[NL80211_ATTR_COLOR_CHANGE_COLOR]); in nl80211_color_change()
14835 err = nl80211_parse_beacon(rdev, info->attrs, ¶ms.beacon_next); in nl80211_color_change()
14841 return -ENOMEM; in nl80211_color_change()
14844 info->attrs[NL80211_ATTR_COLOR_CHANGE_ELEMS], in nl80211_color_change()
14845 nl80211_policy, info->extack); in nl80211_color_change()
14854 err = -EINVAL; in nl80211_color_change()
14859 err = -EINVAL; in nl80211_color_change()
14865 err = -EINVAL; in nl80211_color_change()
14870 err = -EINVAL; in nl80211_color_change()
14879 err = -EINVAL; in nl80211_color_change()
14885 err = -EINVAL; in nl80211_color_change()
14891 err = -EINVAL; in nl80211_color_change()
14928 if (ops->internal_flags & NL80211_FLAG_NEED_WIPHY) { in nl80211_pre_doit()
14934 info->user_ptr[0] = rdev; in nl80211_pre_doit()
14935 } else if (ops->internal_flags & NL80211_FLAG_NEED_NETDEV || in nl80211_pre_doit()
14936 ops->internal_flags & NL80211_FLAG_NEED_WDEV) { in nl80211_pre_doit()
14938 info->attrs); in nl80211_pre_doit()
14944 dev = wdev->netdev; in nl80211_pre_doit()
14945 rdev = wiphy_to_rdev(wdev->wiphy); in nl80211_pre_doit()
14947 if (ops->internal_flags & NL80211_FLAG_NEED_NETDEV) { in nl80211_pre_doit()
14950 return -EINVAL; in nl80211_pre_doit()
14953 info->user_ptr[1] = dev; in nl80211_pre_doit()
14955 info->user_ptr[1] = wdev; in nl80211_pre_doit()
14958 if (ops->internal_flags & NL80211_FLAG_CHECK_NETDEV_UP && in nl80211_pre_doit()
14961 return -ENETDOWN; in nl80211_pre_doit()
14965 info->user_ptr[0] = rdev; in nl80211_pre_doit()
14968 if (rdev && !(ops->internal_flags & NL80211_FLAG_NO_WIPHY_MTX)) { in nl80211_pre_doit()
14969 wiphy_lock(&rdev->wiphy); in nl80211_pre_doit()
14971 __release(&rdev->wiphy.mtx); in nl80211_pre_doit()
14973 if (!(ops->internal_flags & NL80211_FLAG_NEED_RTNL)) in nl80211_pre_doit()
14982 if (info->user_ptr[1]) { in nl80211_post_doit()
14983 if (ops->internal_flags & NL80211_FLAG_NEED_WDEV) { in nl80211_post_doit()
14984 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_post_doit()
14986 dev_put(wdev->netdev); in nl80211_post_doit()
14988 dev_put(info->user_ptr[1]); in nl80211_post_doit()
14992 if (info->user_ptr[0] && in nl80211_post_doit()
14993 !(ops->internal_flags & NL80211_FLAG_NO_WIPHY_MTX)) { in nl80211_post_doit()
14994 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_post_doit()
14997 __acquire(&rdev->wiphy.mtx); in nl80211_post_doit()
14998 wiphy_unlock(&rdev->wiphy); in nl80211_post_doit()
15001 if (ops->internal_flags & NL80211_FLAG_NEED_RTNL) in nl80211_post_doit()
15009 if (ops->internal_flags & NL80211_FLAG_CLEAR_SKB) { in nl80211_post_doit()
15023 return -EINVAL; in nl80211_set_sar_sub_specs()
15027 return -EINVAL; in nl80211_set_sar_sub_specs()
15032 if (range_index >= rdev->wiphy.sar_capa->num_freq_ranges) in nl80211_set_sar_sub_specs()
15033 return -EINVAL; in nl80211_set_sar_sub_specs()
15037 if (sar_specs->sub_specs[i].freq_range_index == range_index) in nl80211_set_sar_sub_specs()
15038 return -EINVAL; in nl80211_set_sar_sub_specs()
15041 sar_specs->sub_specs[index].power = in nl80211_set_sar_sub_specs()
15044 sar_specs->sub_specs[index].freq_range_index = range_index; in nl80211_set_sar_sub_specs()
15051 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_sar_specs()
15060 if (!rdev->wiphy.sar_capa || !rdev->ops->set_sar_specs) in nl80211_set_sar_specs()
15061 return -EOPNOTSUPP; in nl80211_set_sar_specs()
15063 if (!info->attrs[NL80211_ATTR_SAR_SPEC]) in nl80211_set_sar_specs()
15064 return -EINVAL; in nl80211_set_sar_specs()
15067 info->attrs[NL80211_ATTR_SAR_SPEC], in nl80211_set_sar_specs()
15071 return -EINVAL; in nl80211_set_sar_specs()
15074 if (type != rdev->wiphy.sar_capa->type) in nl80211_set_sar_specs()
15075 return -EINVAL; in nl80211_set_sar_specs()
15081 if (specs > rdev->wiphy.sar_capa->num_freq_ranges) in nl80211_set_sar_specs()
15082 return -EINVAL; in nl80211_set_sar_specs()
15088 return -ENOMEM; in nl80211_set_sar_specs()
15090 sar_spec->type = type; in nl80211_set_sar_specs()
15100 err = -EINVAL; in nl80211_set_sar_specs()
15105 err = -EINVAL; in nl80211_set_sar_specs()
15111 sar_spec->num_sub_specs = specs; in nl80211_set_sar_specs()
15113 rdev->cur_cmd_info = info; in nl80211_set_sar_specs()
15115 rdev->cur_cmd_info = NULL; in nl80211_set_sar_specs()
15951 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_notify_wiphy()
15970 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_notify_iface()
15977 struct cfg80211_scan_request *req = rdev->scan_req; in nl80211_add_scan_req()
15988 for (i = 0; i < req->n_ssids; i++) { in nl80211_add_scan_req()
15989 if (nla_put(msg, i, req->ssids[i].ssid_len, req->ssids[i].ssid)) in nl80211_add_scan_req()
15994 if (req->flags & NL80211_SCAN_FLAG_FREQ_KHZ) { in nl80211_add_scan_req()
15998 for (i = 0; i < req->n_channels; i++) { in nl80211_add_scan_req()
16000 ieee80211_channel_to_khz(req->channels[i]))) in nl80211_add_scan_req()
16009 for (i = 0; i < req->n_channels; i++) { in nl80211_add_scan_req()
16010 if (nla_put_u32(msg, i, req->channels[i]->center_freq)) in nl80211_add_scan_req()
16016 if (req->ie && in nl80211_add_scan_req()
16017 nla_put(msg, NL80211_ATTR_IE, req->ie_len, req->ie)) in nl80211_add_scan_req()
16020 if (req->flags && in nl80211_add_scan_req()
16021 nla_put_u32(msg, NL80211_ATTR_SCAN_FLAGS, req->flags)) in nl80211_add_scan_req()
16024 info = rdev->int_scan_req ? &rdev->int_scan_req->info : in nl80211_add_scan_req()
16025 &rdev->scan_req->info; in nl80211_add_scan_req()
16026 if (info->scan_start_tsf && in nl80211_add_scan_req()
16028 info->scan_start_tsf, NL80211_BSS_PAD) || in nl80211_add_scan_req()
16030 info->tsf_bssid))) in nl80211_add_scan_req()
16035 return -ENOBUFS; in nl80211_add_scan_req()
16048 return -1; in nl80211_prep_scan_msg()
16050 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_prep_scan_msg()
16051 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, in nl80211_prep_scan_msg()
16052 wdev->netdev->ifindex)) || in nl80211_prep_scan_msg()
16065 return -EMSGSIZE; in nl80211_prep_scan_msg()
16076 return -1; in nl80211_prep_sched_scan_msg()
16079 wiphy_to_rdev(req->wiphy)->wiphy_idx) || in nl80211_prep_sched_scan_msg()
16080 nla_put_u32(msg, NL80211_ATTR_IFINDEX, req->dev->ifindex) || in nl80211_prep_sched_scan_msg()
16081 nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, req->reqid, in nl80211_prep_sched_scan_msg()
16090 return -EMSGSIZE; in nl80211_prep_sched_scan_msg()
16108 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_scan_start()
16138 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_scan_msg()
16155 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(req->wiphy), msg, 0, in nl80211_send_sched_scan()
16163 if (nla_put_u8(msg, NL80211_ATTR_REG_INITIATOR, request->initiator)) in nl80211_reg_change_event_fill()
16166 if (request->alpha2[0] == '0' && request->alpha2[1] == '0') { in nl80211_reg_change_event_fill()
16170 } else if (request->alpha2[0] == '9' && request->alpha2[1] == '9') { in nl80211_reg_change_event_fill()
16174 } else if ((request->alpha2[0] == '9' && request->alpha2[1] == '8') || in nl80211_reg_change_event_fill()
16175 request->intersect) { in nl80211_reg_change_event_fill()
16183 request->alpha2)) in nl80211_reg_change_event_fill()
16187 if (request->wiphy_idx != WIPHY_IDX_INVALID) { in nl80211_reg_change_event_fill()
16188 struct wiphy *wiphy = wiphy_idx_to_wiphy(request->wiphy_idx); in nl80211_reg_change_event_fill()
16191 nla_put_u32(msg, NL80211_ATTR_WIPHY, request->wiphy_idx)) in nl80211_reg_change_event_fill()
16195 wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED && in nl80211_reg_change_event_fill()
16260 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_mlme_event()
16261 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_send_mlme_event()
16285 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_mlme_event()
16298 NL80211_CMD_AUTHENTICATE, gfp, -1, NULL, 0, in nl80211_send_rx_auth()
16317 NL80211_CMD_DEAUTHENTICATE, gfp, -1, NULL, 0, in nl80211_send_deauth()
16326 NL80211_CMD_DISASSOCIATE, gfp, -1, NULL, 0, in nl80211_send_disassoc()
16333 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_rx_unprot_mlme_mgmt()
16334 struct wiphy *wiphy = wdev->wiphy; in cfg80211_rx_unprot_mlme_mgmt()
16342 if (ieee80211_is_deauth(mgmt->frame_control)) { in cfg80211_rx_unprot_mlme_mgmt()
16344 } else if (ieee80211_is_disassoc(mgmt->frame_control)) { in cfg80211_rx_unprot_mlme_mgmt()
16346 } else if (ieee80211_is_beacon(mgmt->frame_control)) { in cfg80211_rx_unprot_mlme_mgmt()
16347 if (wdev->unprot_beacon_reported && in cfg80211_rx_unprot_mlme_mgmt()
16348 elapsed_jiffies_msecs(wdev->unprot_beacon_reported) < 10000) in cfg80211_rx_unprot_mlme_mgmt()
16351 wdev->unprot_beacon_reported = jiffies; in cfg80211_rx_unprot_mlme_mgmt()
16357 nl80211_send_mlme_event(rdev, dev, buf, len, cmd, GFP_ATOMIC, -1, in cfg80211_rx_unprot_mlme_mgmt()
16379 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_mlme_timeout()
16380 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_send_mlme_timeout()
16387 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_mlme_timeout()
16419 msg = nlmsg_new(100 + cr->req_ie_len + cr->resp_ie_len + in nl80211_send_connect_result()
16420 cr->fils.kek_len + cr->fils.pmk_len + in nl80211_send_connect_result()
16421 (cr->fils.pmkid ? WLAN_PMKID_LEN : 0), gfp); in nl80211_send_connect_result()
16431 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_connect_result()
16432 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_send_connect_result()
16433 (cr->bssid && in nl80211_send_connect_result()
16434 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, cr->bssid)) || in nl80211_send_connect_result()
16436 cr->status < 0 ? WLAN_STATUS_UNSPECIFIED_FAILURE : in nl80211_send_connect_result()
16437 cr->status) || in nl80211_send_connect_result()
16438 (cr->status < 0 && in nl80211_send_connect_result()
16441 cr->timeout_reason))) || in nl80211_send_connect_result()
16442 (cr->req_ie && in nl80211_send_connect_result()
16443 nla_put(msg, NL80211_ATTR_REQ_IE, cr->req_ie_len, cr->req_ie)) || in nl80211_send_connect_result()
16444 (cr->resp_ie && in nl80211_send_connect_result()
16445 nla_put(msg, NL80211_ATTR_RESP_IE, cr->resp_ie_len, in nl80211_send_connect_result()
16446 cr->resp_ie)) || in nl80211_send_connect_result()
16447 (cr->fils.update_erp_next_seq_num && in nl80211_send_connect_result()
16449 cr->fils.erp_next_seq_num)) || in nl80211_send_connect_result()
16450 (cr->status == WLAN_STATUS_SUCCESS && in nl80211_send_connect_result()
16451 ((cr->fils.kek && in nl80211_send_connect_result()
16452 nla_put(msg, NL80211_ATTR_FILS_KEK, cr->fils.kek_len, in nl80211_send_connect_result()
16453 cr->fils.kek)) || in nl80211_send_connect_result()
16454 (cr->fils.pmk && in nl80211_send_connect_result()
16455 nla_put(msg, NL80211_ATTR_PMK, cr->fils.pmk_len, cr->fils.pmk)) || in nl80211_send_connect_result()
16456 (cr->fils.pmkid && in nl80211_send_connect_result()
16457 nla_put(msg, NL80211_ATTR_PMKID, WLAN_PMKID_LEN, cr->fils.pmkid))))) in nl80211_send_connect_result()
16462 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_connect_result()
16476 const u8 *bssid = info->bss ? info->bss->bssid : info->bssid; in nl80211_send_roamed()
16478 msg = nlmsg_new(100 + info->req_ie_len + info->resp_ie_len + in nl80211_send_roamed()
16479 info->fils.kek_len + info->fils.pmk_len + in nl80211_send_roamed()
16480 (info->fils.pmkid ? WLAN_PMKID_LEN : 0), gfp); in nl80211_send_roamed()
16490 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_roamed()
16491 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_send_roamed()
16493 (info->req_ie && in nl80211_send_roamed()
16494 nla_put(msg, NL80211_ATTR_REQ_IE, info->req_ie_len, in nl80211_send_roamed()
16495 info->req_ie)) || in nl80211_send_roamed()
16496 (info->resp_ie && in nl80211_send_roamed()
16497 nla_put(msg, NL80211_ATTR_RESP_IE, info->resp_ie_len, in nl80211_send_roamed()
16498 info->resp_ie)) || in nl80211_send_roamed()
16499 (info->fils.update_erp_next_seq_num && in nl80211_send_roamed()
16501 info->fils.erp_next_seq_num)) || in nl80211_send_roamed()
16502 (info->fils.kek && in nl80211_send_roamed()
16503 nla_put(msg, NL80211_ATTR_FILS_KEK, info->fils.kek_len, in nl80211_send_roamed()
16504 info->fils.kek)) || in nl80211_send_roamed()
16505 (info->fils.pmk && in nl80211_send_roamed()
16506 nla_put(msg, NL80211_ATTR_PMK, info->fils.pmk_len, info->fils.pmk)) || in nl80211_send_roamed()
16507 (info->fils.pmkid && in nl80211_send_roamed()
16508 nla_put(msg, NL80211_ATTR_PMKID, WLAN_PMKID_LEN, info->fils.pmkid))) in nl80211_send_roamed()
16513 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_roamed()
16537 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_port_authorized()
16538 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_send_port_authorized()
16544 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_port_authorized()
16569 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_disconnected()
16570 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_send_disconnected()
16580 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_disconnected()
16605 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_ibss_bssid()
16606 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_send_ibss_bssid()
16612 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_ibss_bssid()
16624 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_notify_new_peer_candidate()
16625 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_notify_new_peer_candidate()
16629 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_MESH_POINT)) in cfg80211_notify_new_peer_candidate()
16644 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_notify_new_peer_candidate()
16645 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in cfg80211_notify_new_peer_candidate()
16655 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_notify_new_peer_candidate()
16682 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_michael_mic_failure()
16683 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_michael_mic_failure()
16686 (key_id != -1 && in nl80211_michael_mic_failure()
16693 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_michael_mic_failure()
16776 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_remain_on_chan_event()
16777 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, in nl80211_send_remain_on_chan_event()
16778 wdev->netdev->ifindex)) || in nl80211_send_remain_on_chan_event()
16781 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, chan->center_freq) || in nl80211_send_remain_on_chan_event()
16794 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_remain_on_chan_event()
16806 struct wiphy *wiphy = wdev->wiphy; in cfg80211_ready_on_channel()
16820 struct wiphy *wiphy = wdev->wiphy; in cfg80211_remain_on_channel_expired()
16833 struct wiphy *wiphy = wdev->wiphy; in cfg80211_tx_mgmt_expired()
16845 struct wiphy *wiphy = dev->ieee80211_ptr->wiphy; in cfg80211_new_sta()
16861 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_new_sta()
16869 struct wiphy *wiphy = dev->ieee80211_ptr->wiphy; in cfg80211_del_sta_sinfo()
16891 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_del_sta_sinfo()
16900 struct wiphy *wiphy = dev->ieee80211_ptr->wiphy; in cfg80211_conn_failed()
16915 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in cfg80211_conn_failed()
16922 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_conn_failed()
16934 struct wireless_dev *wdev = dev->ieee80211_ptr; in __nl80211_unexpected_frame()
16935 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in __nl80211_unexpected_frame()
16938 u32 nlportid = READ_ONCE(wdev->ap_unexpected_nlportid); in __nl80211_unexpected_frame()
16953 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in __nl80211_unexpected_frame()
16954 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in __nl80211_unexpected_frame()
16959 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); in __nl80211_unexpected_frame()
16970 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_rx_spurious_frame()
16975 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP && in cfg80211_rx_spurious_frame()
16976 wdev->iftype != NL80211_IFTYPE_P2P_GO)) { in cfg80211_rx_spurious_frame()
16990 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_rx_unexpected_4addr_frame()
16995 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP && in cfg80211_rx_unexpected_4addr_frame()
16996 wdev->iftype != NL80211_IFTYPE_P2P_GO && in cfg80211_rx_unexpected_4addr_frame()
16997 wdev->iftype != NL80211_IFTYPE_AP_VLAN)) { in cfg80211_rx_unexpected_4addr_frame()
17014 struct net_device *netdev = wdev->netdev; in nl80211_send_mgmt()
17020 return -ENOMEM; in nl80211_send_mgmt()
17025 return -ENOMEM; in nl80211_send_mgmt()
17028 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_mgmt()
17030 netdev->ifindex)) || in nl80211_send_mgmt()
17044 return genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); in nl80211_send_mgmt()
17048 return -ENOBUFS; in nl80211_send_mgmt()
17055 struct wiphy *wiphy = wdev->wiphy; in nl80211_frame_tx_status()
17057 struct net_device *netdev = wdev->netdev; in nl80211_frame_tx_status()
17076 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_frame_tx_status()
17078 netdev->ifindex)) || in nl80211_frame_tx_status()
17089 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_frame_tx_status()
17118 struct wireless_dev *wdev = dev->ieee80211_ptr; in __nl80211_rx_control_port()
17119 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in __nl80211_rx_control_port()
17121 const u8 *addr = ehdr->h_source; in __nl80211_rx_control_port()
17122 u16 proto = be16_to_cpu(skb->protocol); in __nl80211_rx_control_port()
17127 u32 nlportid = READ_ONCE(wdev->conn_owner_nlportid); in __nl80211_rx_control_port()
17130 return -ENOENT; in __nl80211_rx_control_port()
17132 msg = nlmsg_new(100 + skb->len, gfp); in __nl80211_rx_control_port()
17134 return -ENOMEM; in __nl80211_rx_control_port()
17139 return -ENOBUFS; in __nl80211_rx_control_port()
17142 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in __nl80211_rx_control_port()
17143 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in __nl80211_rx_control_port()
17152 frame = nla_reserve(msg, NL80211_ATTR_FRAME, skb->len); in __nl80211_rx_control_port()
17156 skb_copy_bits(skb, 0, nla_data(frame), skb->len); in __nl80211_rx_control_port()
17159 return genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); in __nl80211_rx_control_port()
17163 return -ENOBUFS; in __nl80211_rx_control_port()
17181 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_prepare_cqm()
17182 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_prepare_cqm()
17189 cb = (void **)msg->cb; in cfg80211_prepare_cqm()
17197 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_prepare_cqm()
17198 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) in cfg80211_prepare_cqm()
17218 void **cb = (void **)msg->cb; in cfg80211_send_cqm()
17224 memset(msg->cb, 0, sizeof(msg->cb)); in cfg80211_send_cqm()
17226 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_send_cqm()
17235 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_cqm_rssi_notify()
17236 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_cqm_rssi_notify()
17244 if (wdev->cqm_config) { in cfg80211_cqm_rssi_notify()
17245 wdev->cqm_config->last_rssi_event_value = rssi_level; in cfg80211_cqm_rssi_notify()
17250 rssi_level = wdev->cqm_config->last_rssi_event_value; in cfg80211_cqm_rssi_notify()
17360 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_gtk_rekey_notify()
17361 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_gtk_rekey_notify()
17377 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_gtk_rekey_notify()
17388 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_gtk_rekey_notify()
17389 struct wiphy *wiphy = wdev->wiphy; in cfg80211_gtk_rekey_notify()
17416 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_pmksa_candidate_notify()
17417 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex)) in nl80211_pmksa_candidate_notify()
17434 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_pmksa_candidate_notify()
17445 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_pmksa_candidate_notify()
17446 struct wiphy *wiphy = wdev->wiphy; in cfg80211_pmksa_candidate_notify()
17474 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex)) in nl80211_ch_switch_notify()
17490 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_ch_switch_notify()
17501 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_ch_switch_notify()
17502 struct wiphy *wiphy = wdev->wiphy; in cfg80211_ch_switch_notify()
17509 wdev->chandef = *chandef; in cfg80211_ch_switch_notify()
17510 wdev->preset_chandef = *chandef; in cfg80211_ch_switch_notify()
17512 if (wdev->iftype == NL80211_IFTYPE_STATION && in cfg80211_ch_switch_notify()
17513 !WARN_ON(!wdev->current_bss)) in cfg80211_ch_switch_notify()
17514 cfg80211_update_assoc_bss_entry(wdev, chandef->chan); in cfg80211_ch_switch_notify()
17527 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_ch_switch_started_notify()
17528 struct wiphy *wiphy = wdev->wiphy; in cfg80211_ch_switch_started_notify()
17543 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_bss_color_notify()
17544 struct wiphy *wiphy = wdev->wiphy; in cfg80211_bss_color_notify()
17555 return -ENOMEM; in cfg80211_bss_color_notify()
17561 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) in cfg80211_bss_color_notify()
17575 return genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), in cfg80211_bss_color_notify()
17580 return -EINVAL; in cfg80211_bss_color_notify()
17603 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx)) in nl80211_radar_notify()
17608 struct wireless_dev *wdev = netdev->ieee80211_ptr; in nl80211_radar_notify()
17610 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_radar_notify()
17624 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_radar_notify()
17637 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_sta_opmode_change_notify()
17638 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_sta_opmode_change_notify()
17654 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx)) in cfg80211_sta_opmode_change_notify()
17657 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) in cfg80211_sta_opmode_change_notify()
17663 if ((sta_opmode->changed & STA_OPMODE_SMPS_MODE_CHANGED) && in cfg80211_sta_opmode_change_notify()
17664 nla_put_u8(msg, NL80211_ATTR_SMPS_MODE, sta_opmode->smps_mode)) in cfg80211_sta_opmode_change_notify()
17667 if ((sta_opmode->changed & STA_OPMODE_MAX_BW_CHANGED) && in cfg80211_sta_opmode_change_notify()
17668 nla_put_u32(msg, NL80211_ATTR_CHANNEL_WIDTH, sta_opmode->bw)) in cfg80211_sta_opmode_change_notify()
17671 if ((sta_opmode->changed & STA_OPMODE_N_SS_CHANGED) && in cfg80211_sta_opmode_change_notify()
17672 nla_put_u8(msg, NL80211_ATTR_NSS, sta_opmode->rx_nss)) in cfg80211_sta_opmode_change_notify()
17677 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_sta_opmode_change_notify()
17691 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_probe_status()
17692 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_probe_status()
17709 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_probe_status()
17710 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in cfg80211_probe_status()
17721 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_probe_status()
17740 spin_lock_bh(&rdev->beacon_registrations_lock); in cfg80211_report_obss_beacon_khz()
17741 list_for_each_entry(reg, &rdev->beacon_registrations, list) { in cfg80211_report_obss_beacon_khz()
17744 spin_unlock_bh(&rdev->beacon_registrations_lock); in cfg80211_report_obss_beacon_khz()
17752 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_report_obss_beacon_khz()
17765 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, reg->nlportid); in cfg80211_report_obss_beacon_khz()
17767 spin_unlock_bh(&rdev->beacon_registrations_lock); in cfg80211_report_obss_beacon_khz()
17771 spin_unlock_bh(&rdev->beacon_registrations_lock); in cfg80211_report_obss_beacon_khz()
17780 struct cfg80211_wowlan_nd_info *nd = wakeup->net_detect; in cfg80211_net_detect_results()
17787 return -EMSGSIZE; in cfg80211_net_detect_results()
17789 for (i = 0; i < nd->n_matches; i++) { in cfg80211_net_detect_results()
17790 struct cfg80211_wowlan_nd_match *match = nd->matches[i]; in cfg80211_net_detect_results()
17803 if (nla_put(msg, NL80211_ATTR_SSID, match->ssid.ssid_len, in cfg80211_net_detect_results()
17804 match->ssid.ssid)) { in cfg80211_net_detect_results()
17809 if (match->n_channels) { in cfg80211_net_detect_results()
17817 for (j = 0; j < match->n_channels; j++) { in cfg80211_net_detect_results()
17818 if (nla_put_u32(msg, j, match->channels[j])) { in cfg80211_net_detect_results()
17840 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_report_wowlan_wakeup()
17845 trace_cfg80211_report_wowlan_wakeup(wdev->wiphy, wdev, wakeup); in cfg80211_report_wowlan_wakeup()
17848 size += wakeup->packet_present_len; in cfg80211_report_wowlan_wakeup()
17858 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_report_wowlan_wakeup()
17863 if (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, in cfg80211_report_wowlan_wakeup()
17864 wdev->netdev->ifindex)) in cfg80211_report_wowlan_wakeup()
17875 if (wakeup->disconnect && in cfg80211_report_wowlan_wakeup()
17878 if (wakeup->magic_pkt && in cfg80211_report_wowlan_wakeup()
17881 if (wakeup->gtk_rekey_failure && in cfg80211_report_wowlan_wakeup()
17884 if (wakeup->eap_identity_req && in cfg80211_report_wowlan_wakeup()
17887 if (wakeup->four_way_handshake && in cfg80211_report_wowlan_wakeup()
17890 if (wakeup->rfkill_release && in cfg80211_report_wowlan_wakeup()
17894 if (wakeup->pattern_idx >= 0 && in cfg80211_report_wowlan_wakeup()
17896 wakeup->pattern_idx)) in cfg80211_report_wowlan_wakeup()
17899 if (wakeup->tcp_match && in cfg80211_report_wowlan_wakeup()
17903 if (wakeup->tcp_connlost && in cfg80211_report_wowlan_wakeup()
17907 if (wakeup->tcp_nomoretokens && in cfg80211_report_wowlan_wakeup()
17912 if (wakeup->packet) { in cfg80211_report_wowlan_wakeup()
17916 if (!wakeup->packet_80211) { in cfg80211_report_wowlan_wakeup()
17923 if (wakeup->packet_len && in cfg80211_report_wowlan_wakeup()
17924 nla_put_u32(msg, len_attr, wakeup->packet_len)) in cfg80211_report_wowlan_wakeup()
17927 if (nla_put(msg, pkt_attr, wakeup->packet_present_len, in cfg80211_report_wowlan_wakeup()
17928 wakeup->packet)) in cfg80211_report_wowlan_wakeup()
17932 if (wakeup->net_detect && in cfg80211_report_wowlan_wakeup()
17941 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_report_wowlan_wakeup()
17955 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_tdls_oper_request()
17956 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_tdls_oper_request()
17960 trace_cfg80211_tdls_oper_request(wdev->wiphy, dev, peer, oper, in cfg80211_tdls_oper_request()
17973 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_tdls_oper_request()
17974 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in cfg80211_tdls_oper_request()
17983 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_tdls_oper_request()
18001 if (state != NETLINK_URELEASE || notify->protocol != NETLINK_GENERIC) in nl80211_netlink_notify()
18010 &rdev->sched_scan_req_list, in nl80211_netlink_notify()
18012 if (sched_scan_req->owner_nlportid == notify->portid) { in nl80211_netlink_notify()
18013 sched_scan_req->nl_owner_dead = true; in nl80211_netlink_notify()
18014 schedule_work(&rdev->sched_scan_stop_wk); in nl80211_netlink_notify()
18018 list_for_each_entry_rcu(wdev, &rdev->wiphy.wdev_list, list) { in nl80211_netlink_notify()
18019 cfg80211_mlme_unregister_socket(wdev, notify->portid); in nl80211_netlink_notify()
18021 if (wdev->owner_nlportid == notify->portid) { in nl80211_netlink_notify()
18022 wdev->nl_owner_dead = true; in nl80211_netlink_notify()
18023 schedule_work(&rdev->destroy_work); in nl80211_netlink_notify()
18024 } else if (wdev->conn_owner_nlportid == notify->portid) { in nl80211_netlink_notify()
18025 schedule_work(&wdev->disconnect_wk); in nl80211_netlink_notify()
18028 cfg80211_release_pmsr(wdev, notify->portid); in nl80211_netlink_notify()
18031 spin_lock_bh(&rdev->beacon_registrations_lock); in nl80211_netlink_notify()
18032 list_for_each_entry_safe(reg, tmp, &rdev->beacon_registrations, in nl80211_netlink_notify()
18034 if (reg->nlportid == notify->portid) { in nl80211_netlink_notify()
18035 list_del(®->list); in nl80211_netlink_notify()
18040 spin_unlock_bh(&rdev->beacon_registrations_lock); in nl80211_netlink_notify()
18049 regulatory_netlink_notify(notify->portid); in nl80211_netlink_notify()
18060 struct wiphy *wiphy = netdev->ieee80211_ptr->wiphy; in cfg80211_ft_event()
18067 if (!ft_event->target_ap) in cfg80211_ft_event()
18070 msg = nlmsg_new(100 + ft_event->ies_len + ft_event->ric_ies_len, in cfg80211_ft_event()
18079 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_ft_event()
18080 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in cfg80211_ft_event()
18081 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, ft_event->target_ap)) in cfg80211_ft_event()
18084 if (ft_event->ies && in cfg80211_ft_event()
18085 nla_put(msg, NL80211_ATTR_IE, ft_event->ies_len, ft_event->ies)) in cfg80211_ft_event()
18087 if (ft_event->ric_ies && in cfg80211_ft_event()
18088 nla_put(msg, NL80211_ATTR_IE_RIC, ft_event->ric_ies_len, in cfg80211_ft_event()
18089 ft_event->ric_ies)) in cfg80211_ft_event()
18094 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_ft_event()
18109 rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_crit_proto_stopped()
18110 if (!rdev->crit_proto_nlportid) in cfg80211_crit_proto_stopped()
18113 nlportid = rdev->crit_proto_nlportid; in cfg80211_crit_proto_stopped()
18114 rdev->crit_proto_nlportid = 0; in cfg80211_crit_proto_stopped()
18124 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_crit_proto_stopped()
18131 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); in cfg80211_crit_proto_stopped()
18141 struct wiphy *wiphy = wdev->wiphy; in nl80211_send_ap_stopped()
18154 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_ap_stopped()
18155 nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex) || in nl80211_send_ap_stopped()
18173 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_external_auth_request()
18174 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_external_auth_request()
18178 if (!wdev->conn_owner_nlportid) in cfg80211_external_auth_request()
18179 return -EINVAL; in cfg80211_external_auth_request()
18183 return -ENOMEM; in cfg80211_external_auth_request()
18189 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_external_auth_request()
18190 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in cfg80211_external_auth_request()
18191 nla_put_u32(msg, NL80211_ATTR_AKM_SUITES, params->key_mgmt_suite) || in cfg80211_external_auth_request()
18193 params->action) || in cfg80211_external_auth_request()
18194 nla_put(msg, NL80211_ATTR_BSSID, ETH_ALEN, params->bssid) || in cfg80211_external_auth_request()
18195 nla_put(msg, NL80211_ATTR_SSID, params->ssid.ssid_len, in cfg80211_external_auth_request()
18196 params->ssid.ssid)) in cfg80211_external_auth_request()
18200 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, in cfg80211_external_auth_request()
18201 wdev->conn_owner_nlportid); in cfg80211_external_auth_request()
18206 return -ENOBUFS; in cfg80211_external_auth_request()
18214 struct wiphy *wiphy = netdev->ieee80211_ptr->wiphy; in cfg80211_update_owe_info_event()
18229 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_update_owe_info_event()
18230 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in cfg80211_update_owe_info_event()
18231 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, owe_info->peer)) in cfg80211_update_owe_info_event()
18234 if (!owe_info->ie_len || in cfg80211_update_owe_info_event()
18235 nla_put(msg, NL80211_ATTR_IE, owe_info->ie_len, owe_info->ie)) in cfg80211_update_owe_info_event()
18240 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_update_owe_info_event()