• Home
  • Raw
  • Download

Lines Matching +full:sense +full:- +full:bitfield +full:- +full:width

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()
80 return ERR_PTR(-EINVAL); in __cfg80211_wdev_from_attrs()
92 if (wiphy_net(&rdev->wiphy) != netns) in __cfg80211_wdev_from_attrs()
95 if (have_wdev_id && rdev->wiphy_idx != wiphy_idx) in __cfg80211_wdev_from_attrs()
98 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) { in __cfg80211_wdev_from_attrs()
99 if (have_ifidx && wdev->netdev && in __cfg80211_wdev_from_attrs()
100 wdev->netdev->ifindex == ifidx) { in __cfg80211_wdev_from_attrs()
104 if (have_wdev_id && wdev->identifier == (u32)wdev_id) { in __cfg80211_wdev_from_attrs()
116 return ERR_PTR(-ENODEV); in __cfg80211_wdev_from_attrs()
130 return ERR_PTR(-EINVAL); in __cfg80211_rdev_from_attrs()
144 list_for_each_entry(wdev, &tmp->wiphy.wdev_list, list) { in __cfg80211_rdev_from_attrs()
145 if (wdev->identifier != (u32)wdev_id) in __cfg80211_rdev_from_attrs()
155 return ERR_PTR(-EINVAL); in __cfg80211_rdev_from_attrs()
165 if (netdev->ieee80211_ptr) in __cfg80211_rdev_from_attrs()
167 netdev->ieee80211_ptr->wiphy); in __cfg80211_rdev_from_attrs()
171 /* not wireless device -- return error */ in __cfg80211_rdev_from_attrs()
173 return ERR_PTR(-EINVAL); in __cfg80211_rdev_from_attrs()
175 /* mismatch -- return error */ in __cfg80211_rdev_from_attrs()
177 return ERR_PTR(-EINVAL); in __cfg80211_rdev_from_attrs()
184 return ERR_PTR(-ENODEV); in __cfg80211_rdev_from_attrs()
186 if (netns != wiphy_net(&rdev->wiphy)) in __cfg80211_rdev_from_attrs()
187 return ERR_PTR(-ENODEV); in __cfg80211_rdev_from_attrs()
202 return __cfg80211_rdev_from_attrs(netns, info->attrs); in cfg80211_get_dev_from_info()
218 s1g_bcn = ieee80211_is_s1g_beacon(mgmt->frame_control); in validate_beacon_head()
232 if (ieee80211_hdrlen(mgmt->frame_control) != hdrlen) in validate_beacon_head()
236 len -= fixedlen; in validate_beacon_head()
247 return -EINVAL; in validate_beacon_head()
265 return -EINVAL; in validate_ie_attr()
410 .len = 20-1 },
436 [NL80211_ATTR_IFNAME] = { .type = NLA_NUL_STRING, .len = IFNAMSIZ-1 },
466 NLA_POLICY_MAX(NLA_U8, NUM_NL80211_PLINK_ACTIONS - 1),
545 NLA_POLICY_MAX(NLA_U8, NUM_NL80211_PLINK_STATES - 1),
640 [NL80211_ATTR_TSID] = NLA_POLICY_MAX(NLA_U8, IEEE80211_NUM_TIDS - 1),
642 NLA_POLICY_MAX(NLA_U8, IEEE80211_NUM_UPS - 1),
654 NLA_POLICY_MAX(NLA_U8, NUM_NL80211_P2P_PS_STATUS - 1),
702 [NL80211_ATTR_VLAN_ID] = NLA_POLICY_RANGE(NLA_U16, 1, VLAN_N_VID - 2),
732 [NL80211_KEY_TYPE] = NLA_POLICY_MAX(NLA_U32, NUM_NL80211_KEYTYPES - 1),
887 if (!cb->args[0]) { in nl80211_prepare_wdev_dump()
893 return -ENOMEM; in nl80211_prepare_wdev_dump()
895 err = nlmsg_parse_deprecated(cb->nlh, in nl80211_prepare_wdev_dump()
904 *wdev = __cfg80211_wdev_from_attrs(sock_net(cb->skb->sk), in nl80211_prepare_wdev_dump()
909 *rdev = wiphy_to_rdev((*wdev)->wiphy); in nl80211_prepare_wdev_dump()
910 /* 0 is the first index - add 1 to parse only once */ in nl80211_prepare_wdev_dump()
911 cb->args[0] = (*rdev)->wiphy_idx + 1; in nl80211_prepare_wdev_dump()
912 cb->args[1] = (*wdev)->identifier; in nl80211_prepare_wdev_dump()
915 struct wiphy *wiphy = wiphy_idx_to_wiphy(cb->args[0] - 1); in nl80211_prepare_wdev_dump()
919 return -ENODEV; in nl80211_prepare_wdev_dump()
923 list_for_each_entry(tmp, &(*rdev)->wiphy.wdev_list, list) { in nl80211_prepare_wdev_dump()
924 if (tmp->identifier == cb->args[1]) { in nl80211_prepare_wdev_dump()
931 return -ENODEV; in nl80211_prepare_wdev_dump()
962 rule->wmm_rule.client[j].cw_min) || in nl80211_msg_put_wmm_rules()
964 rule->wmm_rule.client[j].cw_max) || in nl80211_msg_put_wmm_rules()
966 rule->wmm_rule.client[j].aifsn) || in nl80211_msg_put_wmm_rules()
968 rule->wmm_rule.client[j].cot)) in nl80211_msg_put_wmm_rules()
978 return -ENOBUFS; in nl80211_msg_put_wmm_rules()
986 * list to protect old user-space tools from breaking in nl80211_msg_put_channel()
988 if (!large && chan->flags & in nl80211_msg_put_channel()
991 if (!large && chan->freq_offset) in nl80211_msg_put_channel()
995 chan->center_freq)) in nl80211_msg_put_channel()
998 if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_OFFSET, chan->freq_offset)) in nl80211_msg_put_channel()
1001 if ((chan->flags & IEEE80211_CHAN_DISABLED) && in nl80211_msg_put_channel()
1004 if (chan->flags & IEEE80211_CHAN_NO_IR) { in nl80211_msg_put_channel()
1010 if (chan->flags & IEEE80211_CHAN_RADAR) { in nl80211_msg_put_channel()
1016 time = elapsed_jiffies_msecs(chan->dfs_state_entered); in nl80211_msg_put_channel()
1019 chan->dfs_state)) in nl80211_msg_put_channel()
1026 chan->dfs_cac_ms)) in nl80211_msg_put_channel()
1032 if ((chan->flags & IEEE80211_CHAN_NO_HT40MINUS) && in nl80211_msg_put_channel()
1035 if ((chan->flags & IEEE80211_CHAN_NO_HT40PLUS) && in nl80211_msg_put_channel()
1038 if ((chan->flags & IEEE80211_CHAN_NO_80MHZ) && in nl80211_msg_put_channel()
1041 if ((chan->flags & IEEE80211_CHAN_NO_160MHZ) && in nl80211_msg_put_channel()
1044 if ((chan->flags & IEEE80211_CHAN_INDOOR_ONLY) && in nl80211_msg_put_channel()
1047 if ((chan->flags & IEEE80211_CHAN_IR_CONCURRENT) && in nl80211_msg_put_channel()
1050 if ((chan->flags & IEEE80211_CHAN_NO_20MHZ) && in nl80211_msg_put_channel()
1053 if ((chan->flags & IEEE80211_CHAN_NO_10MHZ) && in nl80211_msg_put_channel()
1056 if ((chan->flags & IEEE80211_CHAN_NO_HE) && in nl80211_msg_put_channel()
1059 if ((chan->flags & IEEE80211_CHAN_1MHZ) && in nl80211_msg_put_channel()
1062 if ((chan->flags & IEEE80211_CHAN_2MHZ) && in nl80211_msg_put_channel()
1065 if ((chan->flags & IEEE80211_CHAN_4MHZ) && in nl80211_msg_put_channel()
1068 if ((chan->flags & IEEE80211_CHAN_8MHZ) && in nl80211_msg_put_channel()
1071 if ((chan->flags & IEEE80211_CHAN_16MHZ) && in nl80211_msg_put_channel()
1077 DBM_TO_MBM(chan->max_power))) in nl80211_msg_put_channel()
1082 freq_reg_info(wiphy, MHZ_TO_KHZ(chan->center_freq)); in nl80211_msg_put_channel()
1084 if (!IS_ERR_OR_NULL(rule) && rule->has_wmm) { in nl80211_msg_put_channel()
1093 return -ENOBUFS; in nl80211_msg_put_channel()
1103 if (txqstats->filled & BIT(NL80211_TXQ_STATS_ ## attr) && \ in nl80211_put_txq_stats()
1104 nla_put_u32(msg, NL80211_TXQ_STATS_ ## attr, txqstats->memb)) \ in nl80211_put_txq_stats()
1145 info->extack); in nl80211_parse_key_new()
1149 k->def = !!tb[NL80211_KEY_DEFAULT]; in nl80211_parse_key_new()
1150 k->defmgmt = !!tb[NL80211_KEY_DEFAULT_MGMT]; in nl80211_parse_key_new()
1151 k->defbeacon = !!tb[NL80211_KEY_DEFAULT_BEACON]; in nl80211_parse_key_new()
1153 if (k->def) { in nl80211_parse_key_new()
1154 k->def_uni = true; in nl80211_parse_key_new()
1155 k->def_multi = true; in nl80211_parse_key_new()
1157 if (k->defmgmt || k->defbeacon) in nl80211_parse_key_new()
1158 k->def_multi = true; in nl80211_parse_key_new()
1161 k->idx = nla_get_u8(tb[NL80211_KEY_IDX]); in nl80211_parse_key_new()
1164 k->p.key = nla_data(tb[NL80211_KEY_DATA]); in nl80211_parse_key_new()
1165 k->p.key_len = nla_len(tb[NL80211_KEY_DATA]); in nl80211_parse_key_new()
1169 k->p.seq = nla_data(tb[NL80211_KEY_SEQ]); in nl80211_parse_key_new()
1170 k->p.seq_len = nla_len(tb[NL80211_KEY_SEQ]); in nl80211_parse_key_new()
1174 k->p.cipher = nla_get_u32(tb[NL80211_KEY_CIPHER]); in nl80211_parse_key_new()
1177 k->type = nla_get_u32(tb[NL80211_KEY_TYPE]); in nl80211_parse_key_new()
1183 NUM_NL80211_KEY_DEFAULT_TYPES - 1, in nl80211_parse_key_new()
1186 info->extack); in nl80211_parse_key_new()
1190 k->def_uni = kdt[NL80211_KEY_DEFAULT_TYPE_UNICAST]; in nl80211_parse_key_new()
1191 k->def_multi = kdt[NL80211_KEY_DEFAULT_TYPE_MULTICAST]; in nl80211_parse_key_new()
1195 k->p.mode = nla_get_u8(tb[NL80211_KEY_MODE]); in nl80211_parse_key_new()
1202 if (info->attrs[NL80211_ATTR_KEY_DATA]) { in nl80211_parse_key_old()
1203 k->p.key = nla_data(info->attrs[NL80211_ATTR_KEY_DATA]); in nl80211_parse_key_old()
1204 k->p.key_len = nla_len(info->attrs[NL80211_ATTR_KEY_DATA]); in nl80211_parse_key_old()
1207 if (info->attrs[NL80211_ATTR_KEY_SEQ]) { in nl80211_parse_key_old()
1208 k->p.seq = nla_data(info->attrs[NL80211_ATTR_KEY_SEQ]); in nl80211_parse_key_old()
1209 k->p.seq_len = nla_len(info->attrs[NL80211_ATTR_KEY_SEQ]); in nl80211_parse_key_old()
1212 if (info->attrs[NL80211_ATTR_KEY_IDX]) in nl80211_parse_key_old()
1213 k->idx = nla_get_u8(info->attrs[NL80211_ATTR_KEY_IDX]); in nl80211_parse_key_old()
1215 if (info->attrs[NL80211_ATTR_KEY_CIPHER]) in nl80211_parse_key_old()
1216 k->p.cipher = nla_get_u32(info->attrs[NL80211_ATTR_KEY_CIPHER]); in nl80211_parse_key_old()
1218 k->def = !!info->attrs[NL80211_ATTR_KEY_DEFAULT]; in nl80211_parse_key_old()
1219 k->defmgmt = !!info->attrs[NL80211_ATTR_KEY_DEFAULT_MGMT]; in nl80211_parse_key_old()
1221 if (k->def) { in nl80211_parse_key_old()
1222 k->def_uni = true; in nl80211_parse_key_old()
1223 k->def_multi = true; in nl80211_parse_key_old()
1225 if (k->defmgmt) in nl80211_parse_key_old()
1226 k->def_multi = true; in nl80211_parse_key_old()
1228 if (info->attrs[NL80211_ATTR_KEY_TYPE]) in nl80211_parse_key_old()
1229 k->type = nla_get_u32(info->attrs[NL80211_ATTR_KEY_TYPE]); in nl80211_parse_key_old()
1231 if (info->attrs[NL80211_ATTR_KEY_DEFAULT_TYPES]) { in nl80211_parse_key_old()
1234 NUM_NL80211_KEY_DEFAULT_TYPES - 1, in nl80211_parse_key_old()
1235 info->attrs[NL80211_ATTR_KEY_DEFAULT_TYPES], in nl80211_parse_key_old()
1237 info->extack); in nl80211_parse_key_old()
1241 k->def_uni = kdt[NL80211_KEY_DEFAULT_TYPE_UNICAST]; in nl80211_parse_key_old()
1242 k->def_multi = kdt[NL80211_KEY_DEFAULT_TYPE_MULTICAST]; in nl80211_parse_key_old()
1253 k->idx = -1; in nl80211_parse_key()
1254 k->type = -1; in nl80211_parse_key()
1256 if (info->attrs[NL80211_ATTR_KEY]) in nl80211_parse_key()
1257 err = nl80211_parse_key_new(info, info->attrs[NL80211_ATTR_KEY], k); in nl80211_parse_key()
1264 if ((k->def ? 1 : 0) + (k->defmgmt ? 1 : 0) + in nl80211_parse_key()
1265 (k->defbeacon ? 1 : 0) > 1) { in nl80211_parse_key()
1268 return -EINVAL; in nl80211_parse_key()
1271 if (k->defmgmt || k->defbeacon) { in nl80211_parse_key()
1272 if (k->def_uni || !k->def_multi) { in nl80211_parse_key()
1275 return -EINVAL; in nl80211_parse_key()
1279 if (k->idx != -1) { in nl80211_parse_key()
1280 if (k->defmgmt) { in nl80211_parse_key()
1281 if (k->idx < 4 || k->idx > 5) { in nl80211_parse_key()
1284 return -EINVAL; in nl80211_parse_key()
1286 } else if (k->defbeacon) { in nl80211_parse_key()
1287 if (k->idx < 6 || k->idx > 7) { in nl80211_parse_key()
1290 return -EINVAL; in nl80211_parse_key()
1292 } else if (k->def) { in nl80211_parse_key()
1293 if (k->idx < 0 || k->idx > 3) { in nl80211_parse_key()
1294 GENL_SET_ERR_MSG(info, "def key idx not 0-3"); in nl80211_parse_key()
1295 return -EINVAL; in nl80211_parse_key()
1298 if (k->idx < 0 || k->idx > 7) { in nl80211_parse_key()
1299 GENL_SET_ERR_MSG(info, "key idx not 0-7"); in nl80211_parse_key()
1300 return -EINVAL; in nl80211_parse_key()
1312 struct nlattr *keys = info->attrs[NL80211_ATTR_KEYS]; in nl80211_parse_connkeys()
1329 return ERR_PTR(-ENOMEM); in nl80211_parse_connkeys()
1331 result->def = -1; in nl80211_parse_connkeys()
1335 parse.idx = -1; in nl80211_parse_connkeys()
1340 err = -EINVAL; in nl80211_parse_connkeys()
1344 GENL_SET_ERR_MSG(info, "key index out of range [0-3]"); in nl80211_parse_connkeys()
1354 result->def = parse.idx; in nl80211_parse_connkeys()
1366 err = -EINVAL; in nl80211_parse_connkeys()
1369 result->params[parse.idx].cipher = parse.p.cipher; in nl80211_parse_connkeys()
1370 result->params[parse.idx].key_len = parse.p.key_len; in nl80211_parse_connkeys()
1371 result->params[parse.idx].key = result->data[parse.idx]; in nl80211_parse_connkeys()
1372 memcpy(result->data[parse.idx], parse.p.key, parse.p.key_len); in nl80211_parse_connkeys()
1379 if (result->def < 0) { in nl80211_parse_connkeys()
1380 err = -EINVAL; in nl80211_parse_connkeys()
1395 switch (wdev->iftype) { in nl80211_key_allowed()
1404 if (!wdev->current_bss) in nl80211_key_allowed()
1405 return -ENOLINK; in nl80211_key_allowed()
1414 return -EINVAL; in nl80211_key_allowed()
1426 if (!chan || chan->flags & IEEE80211_CHAN_DISABLED) in nl80211_get_valid_chan()
1451 return -ENOBUFS; in nl80211_put_iftypes()
1466 for (i = 0; i < wiphy->n_iface_combinations; i++) { in nl80211_put_iface_combinations()
1470 c = &wiphy->iface_combinations[i]; in nl80211_put_iface_combinations()
1481 for (j = 0; j < c->n_limits; j++) { in nl80211_put_iface_combinations()
1488 c->limits[j].max)) in nl80211_put_iface_combinations()
1491 c->limits[j].types)) in nl80211_put_iface_combinations()
1498 if (c->beacon_int_infra_match && in nl80211_put_iface_combinations()
1502 c->num_different_channels) || in nl80211_put_iface_combinations()
1504 c->max_interfaces)) in nl80211_put_iface_combinations()
1508 c->radar_detect_widths) || in nl80211_put_iface_combinations()
1510 c->radar_detect_regions))) in nl80211_put_iface_combinations()
1512 if (c->beacon_int_min_gcd && in nl80211_put_iface_combinations()
1514 c->beacon_int_min_gcd)) in nl80211_put_iface_combinations()
1524 return -ENOBUFS; in nl80211_put_iface_combinations()
1531 const struct wiphy_wowlan_tcp_support *tcp = rdev->wiphy.wowlan->tcp; in nl80211_send_wowlan_tcp_caps()
1540 return -ENOBUFS; in nl80211_send_wowlan_tcp_caps()
1543 tcp->data_payload_max)) in nl80211_send_wowlan_tcp_caps()
1544 return -ENOBUFS; in nl80211_send_wowlan_tcp_caps()
1547 tcp->data_payload_max)) in nl80211_send_wowlan_tcp_caps()
1548 return -ENOBUFS; in nl80211_send_wowlan_tcp_caps()
1550 if (tcp->seq && nla_put_flag(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ)) in nl80211_send_wowlan_tcp_caps()
1551 return -ENOBUFS; in nl80211_send_wowlan_tcp_caps()
1553 if (tcp->tok && nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN, in nl80211_send_wowlan_tcp_caps()
1554 sizeof(*tcp->tok), tcp->tok)) in nl80211_send_wowlan_tcp_caps()
1555 return -ENOBUFS; in nl80211_send_wowlan_tcp_caps()
1558 tcp->data_interval_max)) in nl80211_send_wowlan_tcp_caps()
1559 return -ENOBUFS; in nl80211_send_wowlan_tcp_caps()
1562 tcp->wake_payload_max)) in nl80211_send_wowlan_tcp_caps()
1563 return -ENOBUFS; in nl80211_send_wowlan_tcp_caps()
1575 if (!rdev->wiphy.wowlan) in nl80211_send_wowlan()
1581 return -ENOBUFS; in nl80211_send_wowlan()
1583 if (((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_ANY) && in nl80211_send_wowlan()
1585 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_DISCONNECT) && in nl80211_send_wowlan()
1587 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_MAGIC_PKT) && in nl80211_send_wowlan()
1589 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_SUPPORTS_GTK_REKEY) && in nl80211_send_wowlan()
1591 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_GTK_REKEY_FAILURE) && in nl80211_send_wowlan()
1593 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_EAP_IDENTITY_REQ) && in nl80211_send_wowlan()
1595 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_4WAY_HANDSHAKE) && in nl80211_send_wowlan()
1597 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_RFKILL_RELEASE) && in nl80211_send_wowlan()
1599 return -ENOBUFS; in nl80211_send_wowlan()
1601 if (rdev->wiphy.wowlan->n_patterns) { in nl80211_send_wowlan()
1603 .max_patterns = rdev->wiphy.wowlan->n_patterns, in nl80211_send_wowlan()
1604 .min_pattern_len = rdev->wiphy.wowlan->pattern_min_len, in nl80211_send_wowlan()
1605 .max_pattern_len = rdev->wiphy.wowlan->pattern_max_len, in nl80211_send_wowlan()
1606 .max_pkt_offset = rdev->wiphy.wowlan->max_pkt_offset, in nl80211_send_wowlan()
1611 return -ENOBUFS; in nl80211_send_wowlan()
1614 if ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_NET_DETECT) && in nl80211_send_wowlan()
1616 rdev->wiphy.wowlan->max_nd_match_sets)) in nl80211_send_wowlan()
1617 return -ENOBUFS; in nl80211_send_wowlan()
1620 return -ENOBUFS; in nl80211_send_wowlan()
1633 if (!rdev->wiphy.coalesce) in nl80211_send_coalesce()
1636 rule.max_rules = rdev->wiphy.coalesce->n_rules; in nl80211_send_coalesce()
1637 rule.max_delay = rdev->wiphy.coalesce->max_delay; in nl80211_send_coalesce()
1638 rule.pat.max_patterns = rdev->wiphy.coalesce->n_patterns; in nl80211_send_coalesce()
1639 rule.pat.min_pattern_len = rdev->wiphy.coalesce->pattern_min_len; in nl80211_send_coalesce()
1640 rule.pat.max_pattern_len = rdev->wiphy.coalesce->pattern_max_len; in nl80211_send_coalesce()
1641 rule.pat.max_pkt_offset = rdev->wiphy.coalesce->max_pkt_offset; in nl80211_send_coalesce()
1644 return -ENOBUFS; in nl80211_send_coalesce()
1654 const struct ieee80211_sta_he_cap *he_cap = &iftdata->he_cap; in nl80211_send_iftype_data()
1657 iftdata->types_mask)) in nl80211_send_iftype_data()
1658 return -ENOBUFS; in nl80211_send_iftype_data()
1660 if (he_cap->has_he) { in nl80211_send_iftype_data()
1662 sizeof(he_cap->he_cap_elem.mac_cap_info), in nl80211_send_iftype_data()
1663 he_cap->he_cap_elem.mac_cap_info) || in nl80211_send_iftype_data()
1665 sizeof(he_cap->he_cap_elem.phy_cap_info), in nl80211_send_iftype_data()
1666 he_cap->he_cap_elem.phy_cap_info) || in nl80211_send_iftype_data()
1668 sizeof(he_cap->he_mcs_nss_supp), in nl80211_send_iftype_data()
1669 &he_cap->he_mcs_nss_supp) || in nl80211_send_iftype_data()
1671 sizeof(he_cap->ppe_thres), he_cap->ppe_thres)) in nl80211_send_iftype_data()
1672 return -ENOBUFS; in nl80211_send_iftype_data()
1675 if (sband->band == NL80211_BAND_6GHZ && in nl80211_send_iftype_data()
1677 sizeof(iftdata->he_6ghz_capa), in nl80211_send_iftype_data()
1678 &iftdata->he_6ghz_capa)) in nl80211_send_iftype_data()
1679 return -ENOBUFS; in nl80211_send_iftype_data()
1693 if (sband->ht_cap.ht_supported && in nl80211_send_band_rateinfo()
1695 sizeof(sband->ht_cap.mcs), in nl80211_send_band_rateinfo()
1696 &sband->ht_cap.mcs) || in nl80211_send_band_rateinfo()
1698 sband->ht_cap.cap) || in nl80211_send_band_rateinfo()
1700 sband->ht_cap.ampdu_factor) || in nl80211_send_band_rateinfo()
1702 sband->ht_cap.ampdu_density))) in nl80211_send_band_rateinfo()
1703 return -ENOBUFS; in nl80211_send_band_rateinfo()
1706 if (sband->vht_cap.vht_supported && in nl80211_send_band_rateinfo()
1708 sizeof(sband->vht_cap.vht_mcs), in nl80211_send_band_rateinfo()
1709 &sband->vht_cap.vht_mcs) || in nl80211_send_band_rateinfo()
1711 sband->vht_cap.cap))) in nl80211_send_band_rateinfo()
1712 return -ENOBUFS; in nl80211_send_band_rateinfo()
1714 if (large && sband->n_iftype_data) { in nl80211_send_band_rateinfo()
1721 return -ENOBUFS; in nl80211_send_band_rateinfo()
1723 for (i = 0; i < sband->n_iftype_data; i++) { in nl80211_send_band_rateinfo()
1728 return -ENOBUFS; in nl80211_send_band_rateinfo()
1731 &sband->iftype_data[i]); in nl80211_send_band_rateinfo()
1742 if (large && sband->edmg_cap.channels && in nl80211_send_band_rateinfo()
1744 sband->edmg_cap.channels) || in nl80211_send_band_rateinfo()
1746 sband->edmg_cap.bw_config))) in nl80211_send_band_rateinfo()
1748 return -ENOBUFS; in nl80211_send_band_rateinfo()
1753 return -ENOBUFS; in nl80211_send_band_rateinfo()
1755 for (i = 0; i < sband->n_bitrates; i++) { in nl80211_send_band_rateinfo()
1758 return -ENOBUFS; in nl80211_send_band_rateinfo()
1760 rate = &sband->bitrates[i]; in nl80211_send_band_rateinfo()
1762 rate->bitrate)) in nl80211_send_band_rateinfo()
1763 return -ENOBUFS; in nl80211_send_band_rateinfo()
1764 if ((rate->flags & IEEE80211_RATE_SHORT_PREAMBLE) && in nl80211_send_band_rateinfo()
1767 return -ENOBUFS; in nl80211_send_band_rateinfo()
1791 return -ENOBUFS; in nl80211_send_mgmt_stypes()
1796 return -ENOBUFS; in nl80211_send_mgmt_stypes()
1803 return -ENOBUFS; in nl80211_send_mgmt_stypes()
1814 return -ENOBUFS; in nl80211_send_mgmt_stypes()
1819 return -ENOBUFS; in nl80211_send_mgmt_stypes()
1826 return -ENOBUFS; in nl80211_send_mgmt_stypes()
1839 if (rdev->ops->op) { \
1873 if (rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL) in nl80211_add_commands_unsplit()
1878 if (rdev->wiphy.flags & WIPHY_FLAG_NETNS_OK) { in nl80211_add_commands_unsplit()
1883 if (rdev->ops->set_monitor_channel || rdev->ops->start_ap || in nl80211_add_commands_unsplit()
1884 rdev->ops->join_mesh) { in nl80211_add_commands_unsplit()
1890 if (rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) { in nl80211_add_commands_unsplit()
1894 if (rdev->wiphy.max_sched_scan_reqs) in nl80211_add_commands_unsplit()
1898 if (rdev->wiphy.flags & WIPHY_FLAG_REPORTS_OBSS) { in nl80211_add_commands_unsplit()
1909 if (rdev->ops->connect || rdev->ops->auth) { in nl80211_add_commands_unsplit()
1915 if (rdev->ops->disconnect || rdev->ops->deauth) { in nl80211_add_commands_unsplit()
1923 return -ENOBUFS; in nl80211_add_commands_unsplit()
1932 if (!cap->ftm.supported) in nl80211_send_pmsr_ftm_capa()
1937 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
1939 if (cap->ftm.asap && nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_ASAP)) in nl80211_send_pmsr_ftm_capa()
1940 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
1941 if (cap->ftm.non_asap && in nl80211_send_pmsr_ftm_capa()
1943 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
1944 if (cap->ftm.request_lci && in nl80211_send_pmsr_ftm_capa()
1946 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
1947 if (cap->ftm.request_civicloc && in nl80211_send_pmsr_ftm_capa()
1949 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
1951 cap->ftm.preambles)) in nl80211_send_pmsr_ftm_capa()
1952 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
1954 cap->ftm.bandwidths)) in nl80211_send_pmsr_ftm_capa()
1955 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
1956 if (cap->ftm.max_bursts_exponent >= 0 && in nl80211_send_pmsr_ftm_capa()
1958 cap->ftm.max_bursts_exponent)) in nl80211_send_pmsr_ftm_capa()
1959 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
1960 if (cap->ftm.max_ftms_per_burst && in nl80211_send_pmsr_ftm_capa()
1962 cap->ftm.max_ftms_per_burst)) in nl80211_send_pmsr_ftm_capa()
1963 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
1964 if (cap->ftm.trigger_based && in nl80211_send_pmsr_ftm_capa()
1966 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
1967 if (cap->ftm.non_trigger_based && in nl80211_send_pmsr_ftm_capa()
1969 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
1978 const struct cfg80211_pmsr_capabilities *cap = rdev->wiphy.pmsr_capa; in nl80211_send_pmsr_capa()
1991 return -ENOBUFS; in nl80211_send_pmsr_capa()
1993 if (nla_put_u32(msg, NL80211_PMSR_ATTR_MAX_PEERS, cap->max_peers)) in nl80211_send_pmsr_capa()
1994 return -ENOBUFS; in nl80211_send_pmsr_capa()
1996 if (cap->report_ap_tsf && in nl80211_send_pmsr_capa()
1998 return -ENOBUFS; in nl80211_send_pmsr_capa()
2000 if (cap->randomize_mac_addr && in nl80211_send_pmsr_capa()
2002 return -ENOBUFS; in nl80211_send_pmsr_capa()
2006 return -ENOBUFS; in nl80211_send_pmsr_capa()
2009 return -ENOBUFS; in nl80211_send_pmsr_capa()
2025 if (!rdev->wiphy.num_iftype_akm_suites || in nl80211_put_iftype_akm_suites()
2026 !rdev->wiphy.iftype_akm_suites) in nl80211_put_iftype_akm_suites()
2031 return -ENOBUFS; in nl80211_put_iftype_akm_suites()
2033 for (i = 0; i < rdev->wiphy.num_iftype_akm_suites; i++) { in nl80211_put_iftype_akm_suites()
2036 return -ENOBUFS; in nl80211_put_iftype_akm_suites()
2038 iftype_akms = &rdev->wiphy.iftype_akm_suites[i]; in nl80211_put_iftype_akm_suites()
2041 iftype_akms->iftypes_mask)) in nl80211_put_iftype_akm_suites()
2042 return -ENOBUFS; in nl80211_put_iftype_akm_suites()
2045 sizeof(u32) * iftype_akms->n_akm_suites, in nl80211_put_iftype_akm_suites()
2046 iftype_akms->akm_suites)) { in nl80211_put_iftype_akm_suites()
2047 return -ENOBUFS; in nl80211_put_iftype_akm_suites()
2063 if (!rdev->wiphy.tid_config_support.vif && in nl80211_put_tid_config_support()
2064 !rdev->wiphy.tid_config_support.peer) in nl80211_put_tid_config_support()
2069 return -ENOSPC; in nl80211_put_tid_config_support()
2071 if (rdev->wiphy.tid_config_support.vif && in nl80211_put_tid_config_support()
2073 rdev->wiphy.tid_config_support.vif, in nl80211_put_tid_config_support()
2077 if (rdev->wiphy.tid_config_support.peer && in nl80211_put_tid_config_support()
2079 rdev->wiphy.tid_config_support.peer, in nl80211_put_tid_config_support()
2083 /* for now we just use the same value ... makes more sense */ in nl80211_put_tid_config_support()
2085 rdev->wiphy.tid_config_support.max_retry)) in nl80211_put_tid_config_support()
2088 rdev->wiphy.tid_config_support.max_retry)) in nl80211_put_tid_config_support()
2096 return -ENOBUFS; in nl80211_put_tid_config_support()
2119 rdev->wiphy.mgmt_stypes; in nl80211_send_wiphy()
2124 return -ENOBUFS; in nl80211_send_wiphy()
2127 return -EINVAL; in nl80211_send_wiphy()
2129 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_wiphy()
2131 wiphy_name(&rdev->wiphy)) || in nl80211_send_wiphy()
2139 switch (state->split_start) { in nl80211_send_wiphy()
2142 rdev->wiphy.retry_short) || in nl80211_send_wiphy()
2144 rdev->wiphy.retry_long) || in nl80211_send_wiphy()
2146 rdev->wiphy.frag_threshold) || in nl80211_send_wiphy()
2148 rdev->wiphy.rts_threshold) || in nl80211_send_wiphy()
2150 rdev->wiphy.coverage_class) || in nl80211_send_wiphy()
2152 rdev->wiphy.max_scan_ssids) || in nl80211_send_wiphy()
2154 rdev->wiphy.max_sched_scan_ssids) || in nl80211_send_wiphy()
2156 rdev->wiphy.max_scan_ie_len) || in nl80211_send_wiphy()
2158 rdev->wiphy.max_sched_scan_ie_len) || in nl80211_send_wiphy()
2160 rdev->wiphy.max_match_sets)) in nl80211_send_wiphy()
2163 if ((rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN) && in nl80211_send_wiphy()
2166 if ((rdev->wiphy.flags & WIPHY_FLAG_MESH_AUTH) && in nl80211_send_wiphy()
2169 if ((rdev->wiphy.flags & WIPHY_FLAG_AP_UAPSD) && in nl80211_send_wiphy()
2172 if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_FW_ROAM) && in nl80211_send_wiphy()
2175 if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) && in nl80211_send_wiphy()
2178 if ((rdev->wiphy.flags & WIPHY_FLAG_TDLS_EXTERNAL_SETUP) && in nl80211_send_wiphy()
2181 state->split_start++; in nl80211_send_wiphy()
2182 if (state->split) in nl80211_send_wiphy()
2187 sizeof(u32) * rdev->wiphy.n_cipher_suites, in nl80211_send_wiphy()
2188 rdev->wiphy.cipher_suites)) in nl80211_send_wiphy()
2192 rdev->wiphy.max_num_pmkids)) in nl80211_send_wiphy()
2195 if ((rdev->wiphy.flags & WIPHY_FLAG_CONTROL_PORT_PROTOCOL) && in nl80211_send_wiphy()
2200 rdev->wiphy.available_antennas_tx) || in nl80211_send_wiphy()
2202 rdev->wiphy.available_antennas_rx)) in nl80211_send_wiphy()
2205 if ((rdev->wiphy.flags & WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD) && in nl80211_send_wiphy()
2207 rdev->wiphy.probe_resp_offload)) in nl80211_send_wiphy()
2210 if ((rdev->wiphy.available_antennas_tx || in nl80211_send_wiphy()
2211 rdev->wiphy.available_antennas_rx) && in nl80211_send_wiphy()
2212 rdev->ops->get_antenna) { in nl80211_send_wiphy()
2228 state->split_start++; in nl80211_send_wiphy()
2229 if (state->split) in nl80211_send_wiphy()
2234 rdev->wiphy.interface_modes)) in nl80211_send_wiphy()
2236 state->split_start++; in nl80211_send_wiphy()
2237 if (state->split) in nl80211_send_wiphy()
2246 for (band = state->band_start; in nl80211_send_wiphy()
2251 if (band > NL80211_BAND_5GHZ && !state->split) in nl80211_send_wiphy()
2254 sband = rdev->wiphy.bands[band]; in nl80211_send_wiphy()
2263 switch (state->chan_start) { in nl80211_send_wiphy()
2266 state->split)) in nl80211_send_wiphy()
2268 state->chan_start++; in nl80211_send_wiphy()
2269 if (state->split) in nl80211_send_wiphy()
2279 for (i = state->chan_start - 1; in nl80211_send_wiphy()
2280 i < sband->n_channels; in nl80211_send_wiphy()
2287 chan = &sband->channels[i]; in nl80211_send_wiphy()
2290 msg, &rdev->wiphy, chan, in nl80211_send_wiphy()
2291 state->split)) in nl80211_send_wiphy()
2295 if (state->split) in nl80211_send_wiphy()
2298 if (i < sband->n_channels) in nl80211_send_wiphy()
2299 state->chan_start = i + 2; in nl80211_send_wiphy()
2301 state->chan_start = 0; in nl80211_send_wiphy()
2307 if (state->split) { in nl80211_send_wiphy()
2309 if (state->chan_start) in nl80211_send_wiphy()
2310 band--; in nl80211_send_wiphy()
2317 state->band_start = band + 1; in nl80211_send_wiphy()
2319 state->band_start = 0; in nl80211_send_wiphy()
2322 if (state->band_start == 0 && state->chan_start == 0) in nl80211_send_wiphy()
2323 state->split_start++; in nl80211_send_wiphy()
2324 if (state->split) in nl80211_send_wiphy()
2336 if (state->split) { in nl80211_send_wiphy()
2339 if (rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH) in nl80211_send_wiphy()
2342 if (rdev->wiphy.features & in nl80211_send_wiphy()
2352 state->split_start++; in nl80211_send_wiphy()
2353 if (state->split) in nl80211_send_wiphy()
2357 if (rdev->ops->remain_on_channel && in nl80211_send_wiphy()
2358 (rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL) && in nl80211_send_wiphy()
2361 rdev->wiphy.max_remain_on_channel_duration)) in nl80211_send_wiphy()
2364 if ((rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX) && in nl80211_send_wiphy()
2368 state->split_start++; in nl80211_send_wiphy()
2369 if (state->split) in nl80211_send_wiphy()
2374 if (nl80211_send_wowlan(msg, rdev, state->split)) in nl80211_send_wiphy()
2376 state->split_start++; in nl80211_send_wiphy()
2377 if (state->split) in nl80211_send_wiphy()
2380 state->split_start++; in nl80211_send_wiphy()
2385 rdev->wiphy.software_iftypes)) in nl80211_send_wiphy()
2388 if (nl80211_put_iface_combinations(&rdev->wiphy, msg, in nl80211_send_wiphy()
2389 state->split)) in nl80211_send_wiphy()
2392 state->split_start++; in nl80211_send_wiphy()
2393 if (state->split) in nl80211_send_wiphy()
2397 if ((rdev->wiphy.flags & WIPHY_FLAG_HAVE_AP_SME) && in nl80211_send_wiphy()
2399 rdev->wiphy.ap_sme_capa)) in nl80211_send_wiphy()
2402 features = rdev->wiphy.features; in nl80211_send_wiphy()
2404 * We can only add the per-channel limit information if the in nl80211_send_wiphy()
2408 if (state->split) in nl80211_send_wiphy()
2413 if (rdev->wiphy.ht_capa_mod_mask && in nl80211_send_wiphy()
2415 sizeof(*rdev->wiphy.ht_capa_mod_mask), in nl80211_send_wiphy()
2416 rdev->wiphy.ht_capa_mod_mask)) in nl80211_send_wiphy()
2419 if (rdev->wiphy.flags & WIPHY_FLAG_HAVE_AP_SME && in nl80211_send_wiphy()
2420 rdev->wiphy.max_acl_mac_addrs && in nl80211_send_wiphy()
2422 rdev->wiphy.max_acl_mac_addrs)) in nl80211_send_wiphy()
2435 if (state->split) in nl80211_send_wiphy()
2436 state->split_start++; in nl80211_send_wiphy()
2438 state->split_start = 0; in nl80211_send_wiphy()
2445 rdev->wiphy.max_sched_scan_plans) || in nl80211_send_wiphy()
2447 rdev->wiphy.max_sched_scan_plan_interval) || in nl80211_send_wiphy()
2449 rdev->wiphy.max_sched_scan_plan_iterations)) in nl80211_send_wiphy()
2452 if (rdev->wiphy.extended_capabilities && in nl80211_send_wiphy()
2454 rdev->wiphy.extended_capabilities_len, in nl80211_send_wiphy()
2455 rdev->wiphy.extended_capabilities) || in nl80211_send_wiphy()
2457 rdev->wiphy.extended_capabilities_len, in nl80211_send_wiphy()
2458 rdev->wiphy.extended_capabilities_mask))) in nl80211_send_wiphy()
2461 if (rdev->wiphy.vht_capa_mod_mask && in nl80211_send_wiphy()
2463 sizeof(*rdev->wiphy.vht_capa_mod_mask), in nl80211_send_wiphy()
2464 rdev->wiphy.vht_capa_mod_mask)) in nl80211_send_wiphy()
2468 rdev->wiphy.perm_addr)) in nl80211_send_wiphy()
2471 if (!is_zero_ether_addr(rdev->wiphy.addr_mask) && in nl80211_send_wiphy()
2473 rdev->wiphy.addr_mask)) in nl80211_send_wiphy()
2476 if (rdev->wiphy.n_addresses > 1) { in nl80211_send_wiphy()
2483 for (i = 0; i < rdev->wiphy.n_addresses; i++) in nl80211_send_wiphy()
2485 rdev->wiphy.addresses[i].addr)) in nl80211_send_wiphy()
2491 state->split_start++; in nl80211_send_wiphy()
2497 if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_5_10_MHZ) && in nl80211_send_wiphy()
2502 if (rdev->wiphy.max_ap_assoc_sta && in nl80211_send_wiphy()
2504 rdev->wiphy.max_ap_assoc_sta)) in nl80211_send_wiphy()
2507 state->split_start++; in nl80211_send_wiphy()
2510 if (rdev->wiphy.n_vendor_commands) { in nl80211_send_wiphy()
2519 for (i = 0; i < rdev->wiphy.n_vendor_commands; i++) { in nl80211_send_wiphy()
2520 info = &rdev->wiphy.vendor_commands[i].info; in nl80211_send_wiphy()
2527 if (rdev->wiphy.n_vendor_events) { in nl80211_send_wiphy()
2536 for (i = 0; i < rdev->wiphy.n_vendor_events; i++) { in nl80211_send_wiphy()
2537 info = &rdev->wiphy.vendor_events[i]; in nl80211_send_wiphy()
2543 state->split_start++; in nl80211_send_wiphy()
2546 if (rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH && in nl80211_send_wiphy()
2548 rdev->wiphy.max_num_csa_counters)) in nl80211_send_wiphy()
2551 if (rdev->wiphy.regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED && in nl80211_send_wiphy()
2555 if (rdev->wiphy.max_sched_scan_reqs && in nl80211_send_wiphy()
2557 rdev->wiphy.max_sched_scan_reqs)) in nl80211_send_wiphy()
2561 sizeof(rdev->wiphy.ext_features), in nl80211_send_wiphy()
2562 rdev->wiphy.ext_features)) in nl80211_send_wiphy()
2565 if (rdev->wiphy.bss_select_support) { in nl80211_send_wiphy()
2567 u32 bss_select_support = rdev->wiphy.bss_select_support; in nl80211_send_wiphy()
2585 state->split_start++; in nl80211_send_wiphy()
2588 if (rdev->wiphy.num_iftype_ext_capab && in nl80211_send_wiphy()
2589 rdev->wiphy.iftype_ext_capab) { in nl80211_send_wiphy()
2597 for (i = state->capa_start; in nl80211_send_wiphy()
2598 i < rdev->wiphy.num_iftype_ext_capab; i++) { in nl80211_send_wiphy()
2601 capab = &rdev->wiphy.iftype_ext_capab[i]; in nl80211_send_wiphy()
2607 capab->iftype) || in nl80211_send_wiphy()
2609 capab->extended_capabilities_len, in nl80211_send_wiphy()
2610 capab->extended_capabilities) || in nl80211_send_wiphy()
2612 capab->extended_capabilities_len, in nl80211_send_wiphy()
2613 capab->extended_capabilities_mask)) in nl80211_send_wiphy()
2617 if (state->split) in nl80211_send_wiphy()
2621 if (i < rdev->wiphy.num_iftype_ext_capab) { in nl80211_send_wiphy()
2622 state->capa_start = i + 1; in nl80211_send_wiphy()
2628 rdev->wiphy.nan_supported_bands)) in nl80211_send_wiphy()
2631 if (wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_send_wiphy()
2643 rdev->wiphy.txq_limit)) in nl80211_send_wiphy()
2646 rdev->wiphy.txq_memory_limit)) in nl80211_send_wiphy()
2649 rdev->wiphy.txq_quantum)) in nl80211_send_wiphy()
2653 state->split_start++; in nl80211_send_wiphy()
2659 state->split_start++; in nl80211_send_wiphy()
2662 if (rdev->wiphy.akm_suites && in nl80211_send_wiphy()
2664 sizeof(u32) * rdev->wiphy.n_akm_suites, in nl80211_send_wiphy()
2665 rdev->wiphy.akm_suites)) in nl80211_send_wiphy()
2675 state->split_start = 0; in nl80211_send_wiphy()
2684 return -EMSGSIZE; in nl80211_send_wiphy()
2695 return -ENOMEM; in nl80211_dump_wiphy_parse()
2697 ret = nlmsg_parse_deprecated(cb->nlh, in nl80211_dump_wiphy_parse()
2707 state->split = tb[NL80211_ATTR_SPLIT_WIPHY_DUMP]; in nl80211_dump_wiphy_parse()
2709 state->filter_wiphy = nla_get_u32(tb[NL80211_ATTR_WIPHY]); in nl80211_dump_wiphy_parse()
2711 state->filter_wiphy = nla_get_u64(tb[NL80211_ATTR_WDEV]) >> 32; in nl80211_dump_wiphy_parse()
2717 netdev = __dev_get_by_index(sock_net(skb->sk), ifidx); in nl80211_dump_wiphy_parse()
2719 ret = -ENODEV; in nl80211_dump_wiphy_parse()
2722 if (netdev->ieee80211_ptr) { in nl80211_dump_wiphy_parse()
2724 netdev->ieee80211_ptr->wiphy); in nl80211_dump_wiphy_parse()
2725 state->filter_wiphy = rdev->wiphy_idx; in nl80211_dump_wiphy_parse()
2738 struct nl80211_dump_wiphy_state *state = (void *)cb->args[0]; in nl80211_dump_wiphy()
2746 return -ENOMEM; in nl80211_dump_wiphy()
2748 state->filter_wiphy = -1; in nl80211_dump_wiphy()
2755 cb->args[0] = (long)state; in nl80211_dump_wiphy()
2759 if (!net_eq(wiphy_net(&rdev->wiphy), sock_net(skb->sk))) in nl80211_dump_wiphy()
2761 if (++idx <= state->start) in nl80211_dump_wiphy()
2763 if (state->filter_wiphy != -1 && in nl80211_dump_wiphy()
2764 state->filter_wiphy != rdev->wiphy_idx) in nl80211_dump_wiphy()
2770 NETLINK_CB(cb->skb).portid, in nl80211_dump_wiphy()
2771 cb->nlh->nlmsg_seq, in nl80211_dump_wiphy()
2787 if ((ret == -ENOBUFS || ret == -EMSGSIZE) && in nl80211_dump_wiphy()
2788 !skb->len && !state->split && in nl80211_dump_wiphy()
2789 cb->min_dump_alloc < 4096) { in nl80211_dump_wiphy()
2790 cb->min_dump_alloc = 4096; in nl80211_dump_wiphy()
2791 state->split_start = 0; in nl80211_dump_wiphy()
2795 idx--; in nl80211_dump_wiphy()
2798 } while (state->split_start > 0); in nl80211_dump_wiphy()
2803 state->start = idx; in nl80211_dump_wiphy()
2805 return skb->len; in nl80211_dump_wiphy()
2810 kfree((void *)cb->args[0]); in nl80211_dump_wiphy_done()
2817 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_wiphy()
2822 return -ENOMEM; in nl80211_get_wiphy()
2825 info->snd_portid, info->snd_seq, 0, in nl80211_get_wiphy()
2828 return -ENOBUFS; in nl80211_get_wiphy()
2850 return -EINVAL; in parse_txq_params()
2853 txq_params->txop = nla_get_u16(tb[NL80211_TXQ_ATTR_TXOP]); in parse_txq_params()
2854 txq_params->cwmin = nla_get_u16(tb[NL80211_TXQ_ATTR_CWMIN]); in parse_txq_params()
2855 txq_params->cwmax = nla_get_u16(tb[NL80211_TXQ_ATTR_CWMAX]); in parse_txq_params()
2856 txq_params->aifs = nla_get_u8(tb[NL80211_TXQ_ATTR_AIFS]); in parse_txq_params()
2859 return -EINVAL; in parse_txq_params()
2860 txq_params->ac = array_index_nospec(ac, NL80211_NUM_ACS); in parse_txq_params()
2873 * low-level driver when the AP starts or the mesh is joined. in nl80211_can_set_dev_channel()
2875 * the channel in the start-ap or join-mesh commands instead. in nl80211_can_set_dev_channel()
2882 wdev->iftype == NL80211_IFTYPE_AP || in nl80211_can_set_dev_channel()
2883 wdev->iftype == NL80211_IFTYPE_MESH_POINT || in nl80211_can_set_dev_channel()
2884 wdev->iftype == NL80211_IFTYPE_MONITOR || in nl80211_can_set_dev_channel()
2885 wdev->iftype == NL80211_IFTYPE_P2P_GO; in nl80211_can_set_dev_channel()
2892 struct netlink_ext_ack *extack = info->extack; in nl80211_parse_chandef()
2893 struct nlattr **attrs = info->attrs; in nl80211_parse_chandef()
2897 return -EINVAL; in nl80211_parse_chandef()
2900 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ])); in nl80211_parse_chandef()
2901 if (info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]) in nl80211_parse_chandef()
2903 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]); in nl80211_parse_chandef()
2906 chandef->chan = ieee80211_get_channel_khz(&rdev->wiphy, control_freq); in nl80211_parse_chandef()
2907 chandef->width = NL80211_CHAN_WIDTH_20_NOHT; in nl80211_parse_chandef()
2908 chandef->center_freq1 = KHZ_TO_MHZ(control_freq); in nl80211_parse_chandef()
2909 chandef->freq1_offset = control_freq % 1000; in nl80211_parse_chandef()
2910 chandef->center_freq2 = 0; in nl80211_parse_chandef()
2913 if (!chandef->chan || chandef->chan->flags & IEEE80211_CHAN_DISABLED) { in nl80211_parse_chandef()
2916 return -EINVAL; in nl80211_parse_chandef()
2929 cfg80211_chandef_create(chandef, chandef->chan, in nl80211_parse_chandef()
2933 chandef->center_freq1 != nla_get_u32(attrs[NL80211_ATTR_CENTER_FREQ1])) { in nl80211_parse_chandef()
2937 return -EINVAL; in nl80211_parse_chandef()
2945 return -EINVAL; in nl80211_parse_chandef()
2952 return -EINVAL; in nl80211_parse_chandef()
2955 chandef->width = in nl80211_parse_chandef()
2958 chandef->center_freq1 = in nl80211_parse_chandef()
2961 chandef->freq1_offset = nla_get_u32( in nl80211_parse_chandef()
2964 chandef->freq1_offset = 0; in nl80211_parse_chandef()
2967 chandef->center_freq2 = in nl80211_parse_chandef()
2971 if (info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]) { in nl80211_parse_chandef()
2972 chandef->edmg.channels = in nl80211_parse_chandef()
2973 nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]); in nl80211_parse_chandef()
2975 if (info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]) in nl80211_parse_chandef()
2976 chandef->edmg.bw_config = in nl80211_parse_chandef()
2977 nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]); in nl80211_parse_chandef()
2979 chandef->edmg.bw_config = 0; in nl80211_parse_chandef()
2980 chandef->edmg.channels = 0; in nl80211_parse_chandef()
2985 return -EINVAL; in nl80211_parse_chandef()
2988 if (!cfg80211_chandef_usable(&rdev->wiphy, chandef, in nl80211_parse_chandef()
2991 return -EINVAL; in nl80211_parse_chandef()
2994 if ((chandef->width == NL80211_CHAN_WIDTH_5 || in nl80211_parse_chandef()
2995 chandef->width == NL80211_CHAN_WIDTH_10) && in nl80211_parse_chandef()
2996 !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_5_10_MHZ)) { in nl80211_parse_chandef()
2998 return -EINVAL; in nl80211_parse_chandef()
3014 wdev = dev->ieee80211_ptr; in __nl80211_set_channel()
3016 return -EOPNOTSUPP; in __nl80211_set_channel()
3018 iftype = wdev->iftype; in __nl80211_set_channel()
3027 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &chandef, in __nl80211_set_channel()
3029 result = -EINVAL; in __nl80211_set_channel()
3032 if (wdev->beacon_interval) { in __nl80211_set_channel()
3033 if (!dev || !rdev->ops->set_ap_chanwidth || in __nl80211_set_channel()
3034 !(rdev->wiphy.features & in __nl80211_set_channel()
3036 result = -EBUSY; in __nl80211_set_channel()
3040 /* Only allow dynamic channel width changes */ in __nl80211_set_channel()
3041 if (chandef.chan != wdev->preset_chandef.chan) { in __nl80211_set_channel()
3042 result = -EBUSY; in __nl80211_set_channel()
3049 wdev->preset_chandef = chandef; in __nl80211_set_channel()
3059 result = -EINVAL; in __nl80211_set_channel()
3067 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_channel()
3068 struct net_device *netdev = info->user_ptr[1]; in nl80211_set_channel()
3075 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_wds_peer()
3076 struct net_device *dev = info->user_ptr[1]; in nl80211_set_wds_peer()
3077 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_wds_peer()
3080 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_set_wds_peer()
3081 return -EINVAL; in nl80211_set_wds_peer()
3084 return -EBUSY; in nl80211_set_wds_peer()
3086 if (!rdev->ops->set_wds_peer) in nl80211_set_wds_peer()
3087 return -EOPNOTSUPP; in nl80211_set_wds_peer()
3089 if (wdev->iftype != NL80211_IFTYPE_WDS) in nl80211_set_wds_peer()
3090 return -EOPNOTSUPP; in nl80211_set_wds_peer()
3092 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_set_wds_peer()
3114 * done for backward compatibility -- previously in nl80211_set_wiphy()
3121 if (info->attrs[NL80211_ATTR_IFINDEX]) { in nl80211_set_wiphy()
3122 int ifindex = nla_get_u32(info->attrs[NL80211_ATTR_IFINDEX]); in nl80211_set_wiphy()
3125 if (netdev && netdev->ieee80211_ptr) in nl80211_set_wiphy()
3126 rdev = wiphy_to_rdev(netdev->ieee80211_ptr->wiphy); in nl80211_set_wiphy()
3133 info->attrs); in nl80211_set_wiphy()
3140 wdev = netdev->ieee80211_ptr; in nl80211_set_wiphy()
3147 if (info->attrs[NL80211_ATTR_WIPHY_NAME]) in nl80211_set_wiphy()
3149 rdev, nla_data(info->attrs[NL80211_ATTR_WIPHY_NAME])); in nl80211_set_wiphy()
3154 if (info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS]) { in nl80211_set_wiphy()
3158 if (!rdev->ops->set_txq_params) in nl80211_set_wiphy()
3159 return -EOPNOTSUPP; in nl80211_set_wiphy()
3162 return -EINVAL; in nl80211_set_wiphy()
3164 if (netdev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && in nl80211_set_wiphy()
3165 netdev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_set_wiphy()
3166 return -EINVAL; in nl80211_set_wiphy()
3169 return -ENETDOWN; in nl80211_set_wiphy()
3172 info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS], in nl80211_set_wiphy()
3178 info->extack); in nl80211_set_wiphy()
3192 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { in nl80211_set_wiphy()
3201 if (info->attrs[NL80211_ATTR_WIPHY_TX_POWER_SETTING]) { in nl80211_set_wiphy()
3206 if (!(rdev->wiphy.features & NL80211_FEATURE_VIF_TXPOWER)) in nl80211_set_wiphy()
3209 if (!rdev->ops->set_tx_power) in nl80211_set_wiphy()
3210 return -EOPNOTSUPP; in nl80211_set_wiphy()
3213 type = nla_get_u32(info->attrs[idx]); in nl80211_set_wiphy()
3215 if (!info->attrs[NL80211_ATTR_WIPHY_TX_POWER_LEVEL] && in nl80211_set_wiphy()
3217 return -EINVAL; in nl80211_set_wiphy()
3221 mbm = nla_get_u32(info->attrs[idx]); in nl80211_set_wiphy()
3229 if (info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX] && in nl80211_set_wiphy()
3230 info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]) { in nl80211_set_wiphy()
3233 if ((!rdev->wiphy.available_antennas_tx && in nl80211_set_wiphy()
3234 !rdev->wiphy.available_antennas_rx) || in nl80211_set_wiphy()
3235 !rdev->ops->set_antenna) in nl80211_set_wiphy()
3236 return -EOPNOTSUPP; in nl80211_set_wiphy()
3238 tx_ant = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX]); in nl80211_set_wiphy()
3239 rx_ant = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]); in nl80211_set_wiphy()
3243 if ((~tx_ant && (tx_ant & ~rdev->wiphy.available_antennas_tx)) || in nl80211_set_wiphy()
3244 (~rx_ant && (rx_ant & ~rdev->wiphy.available_antennas_rx))) in nl80211_set_wiphy()
3245 return -EINVAL; in nl80211_set_wiphy()
3247 tx_ant = tx_ant & rdev->wiphy.available_antennas_tx; in nl80211_set_wiphy()
3248 rx_ant = rx_ant & rdev->wiphy.available_antennas_rx; in nl80211_set_wiphy()
3257 if (info->attrs[NL80211_ATTR_WIPHY_RETRY_SHORT]) { in nl80211_set_wiphy()
3259 info->attrs[NL80211_ATTR_WIPHY_RETRY_SHORT]); in nl80211_set_wiphy()
3264 if (info->attrs[NL80211_ATTR_WIPHY_RETRY_LONG]) { in nl80211_set_wiphy()
3266 info->attrs[NL80211_ATTR_WIPHY_RETRY_LONG]); in nl80211_set_wiphy()
3271 if (info->attrs[NL80211_ATTR_WIPHY_FRAG_THRESHOLD]) { in nl80211_set_wiphy()
3273 info->attrs[NL80211_ATTR_WIPHY_FRAG_THRESHOLD]); in nl80211_set_wiphy()
3275 return -EINVAL; in nl80211_set_wiphy()
3277 if (frag_threshold != (u32) -1) { in nl80211_set_wiphy()
3289 if (info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]) { in nl80211_set_wiphy()
3291 info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]); in nl80211_set_wiphy()
3295 if (info->attrs[NL80211_ATTR_WIPHY_COVERAGE_CLASS]) { in nl80211_set_wiphy()
3296 if (info->attrs[NL80211_ATTR_WIPHY_DYN_ACK]) in nl80211_set_wiphy()
3297 return -EINVAL; in nl80211_set_wiphy()
3300 info->attrs[NL80211_ATTR_WIPHY_COVERAGE_CLASS]); in nl80211_set_wiphy()
3304 if (info->attrs[NL80211_ATTR_WIPHY_DYN_ACK]) { in nl80211_set_wiphy()
3305 if (!(rdev->wiphy.features & NL80211_FEATURE_ACKTO_ESTIMATION)) in nl80211_set_wiphy()
3306 return -EOPNOTSUPP; in nl80211_set_wiphy()
3311 if (info->attrs[NL80211_ATTR_TXQ_LIMIT]) { in nl80211_set_wiphy()
3312 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_set_wiphy()
3314 return -EOPNOTSUPP; in nl80211_set_wiphy()
3316 info->attrs[NL80211_ATTR_TXQ_LIMIT]); in nl80211_set_wiphy()
3320 if (info->attrs[NL80211_ATTR_TXQ_MEMORY_LIMIT]) { in nl80211_set_wiphy()
3321 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_set_wiphy()
3323 return -EOPNOTSUPP; in nl80211_set_wiphy()
3325 info->attrs[NL80211_ATTR_TXQ_MEMORY_LIMIT]); in nl80211_set_wiphy()
3329 if (info->attrs[NL80211_ATTR_TXQ_QUANTUM]) { in nl80211_set_wiphy()
3330 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_set_wiphy()
3332 return -EOPNOTSUPP; in nl80211_set_wiphy()
3334 info->attrs[NL80211_ATTR_TXQ_QUANTUM]); in nl80211_set_wiphy()
3344 if (!rdev->ops->set_wiphy_params) in nl80211_set_wiphy()
3345 return -EOPNOTSUPP; in nl80211_set_wiphy()
3347 old_retry_short = rdev->wiphy.retry_short; in nl80211_set_wiphy()
3348 old_retry_long = rdev->wiphy.retry_long; in nl80211_set_wiphy()
3349 old_frag_threshold = rdev->wiphy.frag_threshold; in nl80211_set_wiphy()
3350 old_rts_threshold = rdev->wiphy.rts_threshold; in nl80211_set_wiphy()
3351 old_coverage_class = rdev->wiphy.coverage_class; in nl80211_set_wiphy()
3352 old_txq_limit = rdev->wiphy.txq_limit; in nl80211_set_wiphy()
3353 old_txq_memory_limit = rdev->wiphy.txq_memory_limit; in nl80211_set_wiphy()
3354 old_txq_quantum = rdev->wiphy.txq_quantum; in nl80211_set_wiphy()
3357 rdev->wiphy.retry_short = retry_short; in nl80211_set_wiphy()
3359 rdev->wiphy.retry_long = retry_long; in nl80211_set_wiphy()
3361 rdev->wiphy.frag_threshold = frag_threshold; in nl80211_set_wiphy()
3363 rdev->wiphy.rts_threshold = rts_threshold; in nl80211_set_wiphy()
3365 rdev->wiphy.coverage_class = coverage_class; in nl80211_set_wiphy()
3367 rdev->wiphy.txq_limit = txq_limit; in nl80211_set_wiphy()
3369 rdev->wiphy.txq_memory_limit = txq_memory_limit; in nl80211_set_wiphy()
3371 rdev->wiphy.txq_quantum = txq_quantum; in nl80211_set_wiphy()
3375 rdev->wiphy.retry_short = old_retry_short; in nl80211_set_wiphy()
3376 rdev->wiphy.retry_long = old_retry_long; in nl80211_set_wiphy()
3377 rdev->wiphy.frag_threshold = old_frag_threshold; in nl80211_set_wiphy()
3378 rdev->wiphy.rts_threshold = old_rts_threshold; in nl80211_set_wiphy()
3379 rdev->wiphy.coverage_class = old_coverage_class; in nl80211_set_wiphy()
3380 rdev->wiphy.txq_limit = old_txq_limit; in nl80211_set_wiphy()
3381 rdev->wiphy.txq_memory_limit = old_txq_memory_limit; in nl80211_set_wiphy()
3382 rdev->wiphy.txq_quantum = old_txq_quantum; in nl80211_set_wiphy()
3393 return -EINVAL; in nl80211_send_chandef()
3396 chandef->chan->center_freq)) in nl80211_send_chandef()
3397 return -ENOBUFS; in nl80211_send_chandef()
3399 chandef->chan->freq_offset)) in nl80211_send_chandef()
3400 return -ENOBUFS; in nl80211_send_chandef()
3401 switch (chandef->width) { in nl80211_send_chandef()
3407 return -ENOBUFS; in nl80211_send_chandef()
3412 if (nla_put_u32(msg, NL80211_ATTR_CHANNEL_WIDTH, chandef->width)) in nl80211_send_chandef()
3413 return -ENOBUFS; in nl80211_send_chandef()
3414 if (nla_put_u32(msg, NL80211_ATTR_CENTER_FREQ1, chandef->center_freq1)) in nl80211_send_chandef()
3415 return -ENOBUFS; in nl80211_send_chandef()
3416 if (chandef->center_freq2 && in nl80211_send_chandef()
3417 nla_put_u32(msg, NL80211_ATTR_CENTER_FREQ2, chandef->center_freq2)) in nl80211_send_chandef()
3418 return -ENOBUFS; in nl80211_send_chandef()
3427 struct net_device *dev = wdev->netdev; in nl80211_send_iface()
3436 return -1; in nl80211_send_iface()
3439 (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in nl80211_send_iface()
3440 nla_put_string(msg, NL80211_ATTR_IFNAME, dev->name))) in nl80211_send_iface()
3443 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_iface()
3444 nla_put_u32(msg, NL80211_ATTR_IFTYPE, wdev->iftype) || in nl80211_send_iface()
3449 rdev->devlist_generation ^ in nl80211_send_iface()
3451 nla_put_u8(msg, NL80211_ATTR_4ADDR, wdev->use_4addr)) in nl80211_send_iface()
3454 if (rdev->ops->get_channel) { in nl80211_send_iface()
3465 if (rdev->ops->get_tx_power) { in nl80211_send_iface()
3476 switch (wdev->iftype) { in nl80211_send_iface()
3478 if (wdev->ssid_len && in nl80211_send_iface()
3479 nla_put(msg, NL80211_ATTR_SSID, wdev->ssid_len, wdev->ssid)) in nl80211_send_iface()
3486 if (!wdev->current_bss) in nl80211_send_iface()
3489 ssid_ie = ieee80211_bss_get_ie(&wdev->current_bss->pub, in nl80211_send_iface()
3503 if (rdev->ops->get_txq_stats) { in nl80211_send_iface()
3522 return -EMSGSIZE; in nl80211_send_iface()
3529 int wp_start = cb->args[0]; in nl80211_dump_interface()
3530 int if_start = cb->args[1]; in nl80211_dump_interface()
3531 int filter_wiphy = -1; in nl80211_dump_interface()
3537 if (!cb->args[2]) { in nl80211_dump_interface()
3539 .filter_wiphy = -1, in nl80211_dump_interface()
3549 * if filtering, set cb->args[2] to +1 since 0 is the default in nl80211_dump_interface()
3553 cb->args[2] = filter_wiphy + 1; in nl80211_dump_interface()
3555 cb->args[2] = -1; in nl80211_dump_interface()
3556 } else if (cb->args[2] > 0) { in nl80211_dump_interface()
3557 filter_wiphy = cb->args[2] - 1; in nl80211_dump_interface()
3561 if (!net_eq(wiphy_net(&rdev->wiphy), sock_net(skb->sk))) in nl80211_dump_interface()
3568 if (filter_wiphy >= 0 && filter_wiphy != rdev->wiphy_idx) in nl80211_dump_interface()
3573 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) { in nl80211_dump_interface()
3578 if (nl80211_send_iface(skb, NETLINK_CB(cb->skb).portid, in nl80211_dump_interface()
3579 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_dump_interface()
3590 cb->args[0] = wp_idx; in nl80211_dump_interface()
3591 cb->args[1] = if_idx; in nl80211_dump_interface()
3593 ret = skb->len; in nl80211_dump_interface()
3603 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_interface()
3604 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_get_interface()
3608 return -ENOMEM; in nl80211_get_interface()
3610 if (nl80211_send_iface(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_interface()
3613 return -ENOBUFS; in nl80211_get_interface()
3636 return -EINVAL; in parse_monitor_flags()
3639 return -EINVAL; in parse_monitor_flags()
3658 if (info->attrs[NL80211_ATTR_MNTR_FLAGS]) { in nl80211_parse_mon_options()
3660 return -EINVAL; in nl80211_parse_mon_options()
3662 err = parse_monitor_flags(info->attrs[NL80211_ATTR_MNTR_FLAGS], in nl80211_parse_mon_options()
3663 &params->flags); in nl80211_parse_mon_options()
3670 if (params->flags & MONITOR_FLAG_ACTIVE && in nl80211_parse_mon_options()
3671 !(rdev->wiphy.features & NL80211_FEATURE_ACTIVE_MONITOR)) in nl80211_parse_mon_options()
3672 return -EOPNOTSUPP; in nl80211_parse_mon_options()
3674 if (info->attrs[NL80211_ATTR_MU_MIMO_GROUP_DATA]) { in nl80211_parse_mon_options()
3679 return -EINVAL; in nl80211_parse_mon_options()
3681 if (!wiphy_ext_feature_isset(&rdev->wiphy, cap_flag)) in nl80211_parse_mon_options()
3682 return -EOPNOTSUPP; in nl80211_parse_mon_options()
3685 nla_data(info->attrs[NL80211_ATTR_MU_MIMO_GROUP_DATA]); in nl80211_parse_mon_options()
3689 (mumimo_groups[VHT_MUMIMO_GROUPS_DATA_LEN - 1] & BIT(7))) in nl80211_parse_mon_options()
3690 return -EINVAL; in nl80211_parse_mon_options()
3692 params->vht_mumimo_groups = mumimo_groups; in nl80211_parse_mon_options()
3696 if (info->attrs[NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR]) { in nl80211_parse_mon_options()
3700 return -EINVAL; in nl80211_parse_mon_options()
3702 if (!wiphy_ext_feature_isset(&rdev->wiphy, cap_flag)) in nl80211_parse_mon_options()
3703 return -EOPNOTSUPP; in nl80211_parse_mon_options()
3705 params->vht_mumimo_follow_addr = in nl80211_parse_mon_options()
3706 nla_data(info->attrs[NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR]); in nl80211_parse_mon_options()
3719 return -EBUSY; in nl80211_valid_4addr()
3725 if (rdev->wiphy.flags & WIPHY_FLAG_4ADDR_AP) in nl80211_valid_4addr()
3729 if (rdev->wiphy.flags & WIPHY_FLAG_4ADDR_STATION) in nl80211_valid_4addr()
3736 return -EOPNOTSUPP; in nl80211_valid_4addr()
3741 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_interface()
3745 struct net_device *dev = info->user_ptr[1]; in nl80211_set_interface()
3750 otype = ntype = dev->ieee80211_ptr->iftype; in nl80211_set_interface()
3752 if (info->attrs[NL80211_ATTR_IFTYPE]) { in nl80211_set_interface()
3753 ntype = nla_get_u32(info->attrs[NL80211_ATTR_IFTYPE]); in nl80211_set_interface()
3758 if (info->attrs[NL80211_ATTR_MESH_ID]) { in nl80211_set_interface()
3759 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_interface()
3762 return -EINVAL; in nl80211_set_interface()
3764 return -EBUSY; in nl80211_set_interface()
3769 wdev->mesh_id_up_len = in nl80211_set_interface()
3770 nla_len(info->attrs[NL80211_ATTR_MESH_ID]); in nl80211_set_interface()
3771 memcpy(wdev->ssid, nla_data(info->attrs[NL80211_ATTR_MESH_ID]), in nl80211_set_interface()
3772 wdev->mesh_id_up_len); in nl80211_set_interface()
3776 if (info->attrs[NL80211_ATTR_4ADDR]) { in nl80211_set_interface()
3777 params.use_4addr = !!nla_get_u8(info->attrs[NL80211_ATTR_4ADDR]); in nl80211_set_interface()
3783 params.use_4addr = -1; in nl80211_set_interface()
3797 if (!err && params.use_4addr != -1) in nl80211_set_interface()
3798 dev->ieee80211_ptr->use_4addr = params.use_4addr; in nl80211_set_interface()
3801 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_interface()
3811 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_new_interface()
3823 if (!info->attrs[NL80211_ATTR_IFNAME]) in nl80211_new_interface()
3824 return -EINVAL; in nl80211_new_interface()
3826 if (info->attrs[NL80211_ATTR_IFTYPE]) in nl80211_new_interface()
3827 type = nla_get_u32(info->attrs[NL80211_ATTR_IFTYPE]); in nl80211_new_interface()
3829 if (!rdev->ops->add_virtual_intf) in nl80211_new_interface()
3830 return -EOPNOTSUPP; in nl80211_new_interface()
3833 rdev->wiphy.features & NL80211_FEATURE_MAC_ON_CREATE) && in nl80211_new_interface()
3834 info->attrs[NL80211_ATTR_MAC]) { in nl80211_new_interface()
3835 nla_memcpy(params.macaddr, info->attrs[NL80211_ATTR_MAC], in nl80211_new_interface()
3838 return -EADDRNOTAVAIL; in nl80211_new_interface()
3841 if (info->attrs[NL80211_ATTR_4ADDR]) { in nl80211_new_interface()
3842 params.use_4addr = !!nla_get_u8(info->attrs[NL80211_ATTR_4ADDR]); in nl80211_new_interface()
3848 if (!cfg80211_iftype_allowed(&rdev->wiphy, type, params.use_4addr, 0)) in nl80211_new_interface()
3849 return -EOPNOTSUPP; in nl80211_new_interface()
3857 return -ENOMEM; in nl80211_new_interface()
3860 nla_data(info->attrs[NL80211_ATTR_IFNAME]), in nl80211_new_interface()
3864 return -EPROTO; in nl80211_new_interface()
3870 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) in nl80211_new_interface()
3871 wdev->owner_nlportid = info->snd_portid; in nl80211_new_interface()
3875 if (!info->attrs[NL80211_ATTR_MESH_ID]) in nl80211_new_interface()
3880 wdev->mesh_id_up_len = in nl80211_new_interface()
3881 nla_len(info->attrs[NL80211_ATTR_MESH_ID]); in nl80211_new_interface()
3882 memcpy(wdev->ssid, nla_data(info->attrs[NL80211_ATTR_MESH_ID]), in nl80211_new_interface()
3883 wdev->mesh_id_up_len); in nl80211_new_interface()
3899 if (nl80211_send_iface(msg, info->snd_portid, info->snd_seq, 0, in nl80211_new_interface()
3902 return -ENOBUFS; in nl80211_new_interface()
3910 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_del_interface()
3911 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_del_interface()
3913 if (!rdev->ops->del_virtual_intf) in nl80211_del_interface()
3914 return -EOPNOTSUPP; in nl80211_del_interface()
3923 if (!wdev->netdev) in nl80211_del_interface()
3924 info->user_ptr[1] = NULL; in nl80211_del_interface()
3931 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_noack_map()
3932 struct net_device *dev = info->user_ptr[1]; in nl80211_set_noack_map()
3935 if (!info->attrs[NL80211_ATTR_NOACK_MAP]) in nl80211_set_noack_map()
3936 return -EINVAL; in nl80211_set_noack_map()
3938 if (!rdev->ops->set_noack_map) in nl80211_set_noack_map()
3939 return -EOPNOTSUPP; in nl80211_set_noack_map()
3941 noack_map = nla_get_u16(info->attrs[NL80211_ATTR_NOACK_MAP]); in nl80211_set_noack_map()
3957 if ((params->key && in get_key_callback()
3958 nla_put(cookie->msg, NL80211_ATTR_KEY_DATA, in get_key_callback()
3959 params->key_len, params->key)) || in get_key_callback()
3960 (params->seq && in get_key_callback()
3961 nla_put(cookie->msg, NL80211_ATTR_KEY_SEQ, in get_key_callback()
3962 params->seq_len, params->seq)) || in get_key_callback()
3963 (params->cipher && in get_key_callback()
3964 nla_put_u32(cookie->msg, NL80211_ATTR_KEY_CIPHER, in get_key_callback()
3965 params->cipher))) in get_key_callback()
3968 key = nla_nest_start_noflag(cookie->msg, NL80211_ATTR_KEY); in get_key_callback()
3972 if ((params->key && in get_key_callback()
3973 nla_put(cookie->msg, NL80211_KEY_DATA, in get_key_callback()
3974 params->key_len, params->key)) || in get_key_callback()
3975 (params->seq && in get_key_callback()
3976 nla_put(cookie->msg, NL80211_KEY_SEQ, in get_key_callback()
3977 params->seq_len, params->seq)) || in get_key_callback()
3978 (params->cipher && in get_key_callback()
3979 nla_put_u32(cookie->msg, NL80211_KEY_CIPHER, in get_key_callback()
3980 params->cipher))) in get_key_callback()
3983 if (nla_put_u8(cookie->msg, NL80211_KEY_IDX, cookie->idx)) in get_key_callback()
3986 nla_nest_end(cookie->msg, key); in get_key_callback()
3990 cookie->error = 1; in get_key_callback()
3995 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_key()
3997 struct net_device *dev = info->user_ptr[1]; in nl80211_get_key()
4008 if (wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_get_key()
4012 if ((dev->ieee80211_ptr->iftype == NL80211_IFTYPE_STATION || in nl80211_get_key()
4013 dev->ieee80211_ptr->iftype == NL80211_IFTYPE_P2P_CLIENT) && in nl80211_get_key()
4014 wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_get_key()
4018 if (info->attrs[NL80211_ATTR_KEY_IDX]) { in nl80211_get_key()
4019 key_idx = nla_get_u8(info->attrs[NL80211_ATTR_KEY_IDX]); in nl80211_get_key()
4023 return -EINVAL; in nl80211_get_key()
4027 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_get_key()
4028 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_get_key()
4031 if (info->attrs[NL80211_ATTR_KEY_TYPE]) { in nl80211_get_key()
4032 u32 kt = nla_get_u32(info->attrs[NL80211_ATTR_KEY_TYPE]); in nl80211_get_key()
4036 return -EINVAL; in nl80211_get_key()
4040 if (!rdev->ops->get_key) in nl80211_get_key()
4041 return -EOPNOTSUPP; in nl80211_get_key()
4043 if (!pairwise && mac_addr && !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN)) in nl80211_get_key()
4044 return -ENOENT; in nl80211_get_key()
4048 return -ENOMEM; in nl80211_get_key()
4050 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_key()
4058 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in nl80211_get_key()
4078 err = -ENOBUFS; in nl80211_get_key()
4086 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_key()
4089 struct net_device *dev = info->user_ptr[1]; in nl80211_set_key()
4096 return -EINVAL; in nl80211_set_key()
4103 return -EINVAL; in nl80211_set_key()
4105 wdev_lock(dev->ieee80211_ptr); in nl80211_set_key()
4108 if (!rdev->ops->set_default_key) { in nl80211_set_key()
4109 err = -EOPNOTSUPP; in nl80211_set_key()
4113 err = nl80211_key_allowed(dev->ieee80211_ptr); in nl80211_set_key()
4124 dev->ieee80211_ptr->wext.default_key = key.idx; in nl80211_set_key()
4128 err = -EINVAL; in nl80211_set_key()
4132 if (!rdev->ops->set_default_mgmt_key) { in nl80211_set_key()
4133 err = -EOPNOTSUPP; in nl80211_set_key()
4137 err = nl80211_key_allowed(dev->ieee80211_ptr); in nl80211_set_key()
4146 dev->ieee80211_ptr->wext.default_mgmt_key = key.idx; in nl80211_set_key()
4150 err = -EINVAL; in nl80211_set_key()
4154 if (!rdev->ops->set_default_beacon_key) { in nl80211_set_key()
4155 err = -EOPNOTSUPP; in nl80211_set_key()
4159 err = nl80211_key_allowed(dev->ieee80211_ptr); in nl80211_set_key()
4167 wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_set_key()
4171 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_set_key()
4172 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_set_key()
4175 err = -EINVAL; in nl80211_set_key()
4183 err = -EINVAL; in nl80211_set_key()
4186 wdev_unlock(dev->ieee80211_ptr); in nl80211_set_key()
4193 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_new_key()
4195 struct net_device *dev = info->user_ptr[1]; in nl80211_new_key()
4205 return -EINVAL; in nl80211_new_key()
4208 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_new_key()
4209 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_new_key()
4211 if (key.type == -1) { in nl80211_new_key()
4222 return -EINVAL; in nl80211_new_key()
4226 info->attrs[NL80211_ATTR_VLAN_ID]) in nl80211_new_key()
4227 key.p.vlan_id = nla_get_u16(info->attrs[NL80211_ATTR_VLAN_ID]); in nl80211_new_key()
4229 if (!rdev->ops->add_key) in nl80211_new_key()
4230 return -EOPNOTSUPP; in nl80211_new_key()
4236 return -EINVAL; in nl80211_new_key()
4239 wdev_lock(dev->ieee80211_ptr); in nl80211_new_key()
4240 err = nl80211_key_allowed(dev->ieee80211_ptr); in nl80211_new_key()
4250 wdev_unlock(dev->ieee80211_ptr); in nl80211_new_key()
4257 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_del_key()
4259 struct net_device *dev = info->user_ptr[1]; in nl80211_del_key()
4267 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_del_key()
4268 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_del_key()
4270 if (key.type == -1) { in nl80211_del_key()
4280 return -EINVAL; in nl80211_del_key()
4284 return -EINVAL; in nl80211_del_key()
4286 if (!rdev->ops->del_key) in nl80211_del_key()
4287 return -EOPNOTSUPP; in nl80211_del_key()
4289 wdev_lock(dev->ieee80211_ptr); in nl80211_del_key()
4290 err = nl80211_key_allowed(dev->ieee80211_ptr); in nl80211_del_key()
4293 !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN)) in nl80211_del_key()
4294 err = -ENOENT; in nl80211_del_key()
4303 if (key.idx == dev->ieee80211_ptr->wext.default_key) in nl80211_del_key()
4304 dev->ieee80211_ptr->wext.default_key = -1; in nl80211_del_key()
4305 else if (key.idx == dev->ieee80211_ptr->wext.default_mgmt_key) in nl80211_del_key()
4306 dev->ieee80211_ptr->wext.default_mgmt_key = -1; in nl80211_del_key()
4309 wdev_unlock(dev->ieee80211_ptr); in nl80211_del_key()
4322 return -EINVAL; in validate_acl_mac_addrs()
4343 if (!wiphy->max_acl_mac_addrs) in parse_acl_data()
4344 return ERR_PTR(-EOPNOTSUPP); in parse_acl_data()
4346 if (!info->attrs[NL80211_ATTR_ACL_POLICY]) in parse_acl_data()
4347 return ERR_PTR(-EINVAL); in parse_acl_data()
4349 acl_policy = nla_get_u32(info->attrs[NL80211_ATTR_ACL_POLICY]); in parse_acl_data()
4352 return ERR_PTR(-EINVAL); in parse_acl_data()
4354 if (!info->attrs[NL80211_ATTR_MAC_ADDRS]) in parse_acl_data()
4355 return ERR_PTR(-EINVAL); in parse_acl_data()
4357 n_entries = validate_acl_mac_addrs(info->attrs[NL80211_ATTR_MAC_ADDRS]); in parse_acl_data()
4361 if (n_entries > wiphy->max_acl_mac_addrs) in parse_acl_data()
4362 return ERR_PTR(-ENOTSUPP); in parse_acl_data()
4366 return ERR_PTR(-ENOMEM); in parse_acl_data()
4368 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_MAC_ADDRS], tmp) { in parse_acl_data()
4369 memcpy(acl->mac_addrs[i].addr, nla_data(attr), ETH_ALEN); in parse_acl_data()
4373 acl->n_acl_entries = n_entries; in parse_acl_data()
4374 acl->acl_policy = acl_policy; in parse_acl_data()
4381 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_mac_acl()
4382 struct net_device *dev = info->user_ptr[1]; in nl80211_set_mac_acl()
4386 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && in nl80211_set_mac_acl()
4387 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_set_mac_acl()
4388 return -EOPNOTSUPP; in nl80211_set_mac_acl()
4390 if (!dev->ieee80211_ptr->beacon_interval) in nl80211_set_mac_acl()
4391 return -EINVAL; in nl80211_set_mac_acl()
4393 acl = parse_acl_data(&rdev->wiphy, info); in nl80211_set_mac_acl()
4414 for (ridx = 0; ridx < sband->n_bitrates; ridx++) { in rateset_to_mask()
4416 &sband->bitrates[ridx]; in rateset_to_mask()
4417 if (rate == srate->bitrate) { in rateset_to_mask()
4422 if (ridx == sband->n_bitrates) in rateset_to_mask()
4449 if (sband->ht_cap.mcs.rx_mask[ridx] & rbit) in ht_rateset_to_mask()
4496 u16 tx_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map); in vht_set_mcs_mask()
4500 if (!sband->vht_cap.vht_supported) in vht_set_mcs_mask()
4509 if ((tx_mcs_mask[i] & txrate->mcs[i]) == txrate->mcs[i]) in vht_set_mcs_mask()
4510 mcs[i] = txrate->mcs[i]; in vht_set_mcs_mask()
4549 struct net_device *dev = info->user_ptr[1]; in he_get_txmcsmap()
4550 struct wireless_dev *wdev = dev->ieee80211_ptr; in he_get_txmcsmap()
4553 switch (wdev->chandef.width) { in he_get_txmcsmap()
4555 tx_mcs = he_cap->he_mcs_nss_supp.tx_mcs_80p80; in he_get_txmcsmap()
4558 tx_mcs = he_cap->he_mcs_nss_supp.tx_mcs_160; in he_get_txmcsmap()
4561 tx_mcs = he_cap->he_mcs_nss_supp.tx_mcs_80; in he_get_txmcsmap()
4578 he_cap = ieee80211_get_he_iftype_cap(sband, wdev->iftype); in he_set_mcs_mask()
4590 if ((tx_mcs_mask[i] & txrate->mcs[i]) == txrate->mcs[i]) in he_set_mcs_mask()
4591 mcs[i] = txrate->mcs[i]; in he_set_mcs_mask()
4606 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_parse_tx_bitrate_mask()
4607 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_parse_tx_bitrate_mask()
4618 sband = rdev->wiphy.bands[i]; in nl80211_parse_tx_bitrate_mask()
4623 mask->control[i].legacy = (1 << sband->n_bitrates) - 1; in nl80211_parse_tx_bitrate_mask()
4624 memcpy(mask->control[i].ht_mcs, in nl80211_parse_tx_bitrate_mask()
4625 sband->ht_cap.mcs.rx_mask, in nl80211_parse_tx_bitrate_mask()
4626 sizeof(mask->control[i].ht_mcs)); in nl80211_parse_tx_bitrate_mask()
4628 if (sband->vht_cap.vht_supported) { in nl80211_parse_tx_bitrate_mask()
4629 vht_tx_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map); in nl80211_parse_tx_bitrate_mask()
4630 vht_build_mcs_mask(vht_tx_mcs_map, mask->control[i].vht_mcs); in nl80211_parse_tx_bitrate_mask()
4633 he_cap = ieee80211_get_he_iftype_cap(sband, wdev->iftype); in nl80211_parse_tx_bitrate_mask()
4638 he_build_mcs_mask(he_tx_mcs_map, mask->control[i].he_mcs); in nl80211_parse_tx_bitrate_mask()
4640 mask->control[i].he_gi = 0xFF; in nl80211_parse_tx_bitrate_mask()
4641 mask->control[i].he_ltf = 0xFF; in nl80211_parse_tx_bitrate_mask()
4657 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
4658 sband = rdev->wiphy.bands[band]; in nl80211_parse_tx_bitrate_mask()
4660 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
4664 info->extack); in nl80211_parse_tx_bitrate_mask()
4668 mask->control[band].legacy = rateset_to_mask( in nl80211_parse_tx_bitrate_mask()
4672 if ((mask->control[band].legacy == 0) && in nl80211_parse_tx_bitrate_mask()
4674 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
4681 mask->control[band].ht_mcs)) in nl80211_parse_tx_bitrate_mask()
4682 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
4688 mask->control[band].vht_mcs)) in nl80211_parse_tx_bitrate_mask()
4689 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
4692 mask->control[band].gi = in nl80211_parse_tx_bitrate_mask()
4694 if (mask->control[band].gi > NL80211_TXRATE_FORCE_LGI) in nl80211_parse_tx_bitrate_mask()
4695 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
4700 mask->control[band].he_mcs)) in nl80211_parse_tx_bitrate_mask()
4701 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
4703 mask->control[band].he_gi = in nl80211_parse_tx_bitrate_mask()
4706 mask->control[band].he_ltf = in nl80211_parse_tx_bitrate_mask()
4709 if (mask->control[band].legacy == 0) { in nl80211_parse_tx_bitrate_mask()
4713 if (!(rdev->wiphy.bands[band]->ht_cap.ht_supported || in nl80211_parse_tx_bitrate_mask()
4714 rdev->wiphy.bands[band]->vht_cap.vht_supported || in nl80211_parse_tx_bitrate_mask()
4715 ieee80211_get_he_iftype_cap(sband, wdev->iftype))) in nl80211_parse_tx_bitrate_mask()
4716 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
4719 if (mask->control[band].ht_mcs[i]) in nl80211_parse_tx_bitrate_mask()
4723 if (mask->control[band].vht_mcs[i]) in nl80211_parse_tx_bitrate_mask()
4727 if (mask->control[band].he_mcs[i]) in nl80211_parse_tx_bitrate_mask()
4731 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
4744 u32 rate = beacon_rate->control[band].legacy; in validate_beacon_tx_rate()
4748 return -EINVAL; in validate_beacon_tx_rate()
4752 if (hweight8(beacon_rate->control[band].ht_mcs[i]) > 1) { in validate_beacon_tx_rate()
4753 return -EINVAL; in validate_beacon_tx_rate()
4754 } else if (beacon_rate->control[band].ht_mcs[i]) { in validate_beacon_tx_rate()
4757 return -EINVAL; in validate_beacon_tx_rate()
4760 return -EINVAL; in validate_beacon_tx_rate()
4765 if (hweight16(beacon_rate->control[band].vht_mcs[i]) > 1) { in validate_beacon_tx_rate()
4766 return -EINVAL; in validate_beacon_tx_rate()
4767 } else if (beacon_rate->control[band].vht_mcs[i]) { in validate_beacon_tx_rate()
4770 return -EINVAL; in validate_beacon_tx_rate()
4773 return -EINVAL; in validate_beacon_tx_rate()
4777 return -EINVAL; in validate_beacon_tx_rate()
4780 !wiphy_ext_feature_isset(&rdev->wiphy, in validate_beacon_tx_rate()
4782 return -EINVAL; in validate_beacon_tx_rate()
4784 !wiphy_ext_feature_isset(&rdev->wiphy, in validate_beacon_tx_rate()
4786 return -EINVAL; in validate_beacon_tx_rate()
4788 !wiphy_ext_feature_isset(&rdev->wiphy, in validate_beacon_tx_rate()
4790 return -EINVAL; in validate_beacon_tx_rate()
4805 bcn->head = nla_data(attrs[NL80211_ATTR_BEACON_HEAD]); in nl80211_parse_beacon()
4806 bcn->head_len = nla_len(attrs[NL80211_ATTR_BEACON_HEAD]); in nl80211_parse_beacon()
4807 if (!bcn->head_len) in nl80211_parse_beacon()
4808 return -EINVAL; in nl80211_parse_beacon()
4813 bcn->tail = nla_data(attrs[NL80211_ATTR_BEACON_TAIL]); in nl80211_parse_beacon()
4814 bcn->tail_len = nla_len(attrs[NL80211_ATTR_BEACON_TAIL]); in nl80211_parse_beacon()
4819 return -EINVAL; in nl80211_parse_beacon()
4822 bcn->beacon_ies = nla_data(attrs[NL80211_ATTR_IE]); in nl80211_parse_beacon()
4823 bcn->beacon_ies_len = nla_len(attrs[NL80211_ATTR_IE]); in nl80211_parse_beacon()
4827 bcn->proberesp_ies = in nl80211_parse_beacon()
4829 bcn->proberesp_ies_len = in nl80211_parse_beacon()
4834 bcn->assocresp_ies = in nl80211_parse_beacon()
4836 bcn->assocresp_ies_len = in nl80211_parse_beacon()
4841 bcn->probe_resp = nla_data(attrs[NL80211_ATTR_PROBE_RESP]); in nl80211_parse_beacon()
4842 bcn->probe_resp_len = nla_len(attrs[NL80211_ATTR_PROBE_RESP]); in nl80211_parse_beacon()
4856 wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_parse_beacon()
4858 bcn->ftm_responder = 1; in nl80211_parse_beacon()
4860 return -EOPNOTSUPP; in nl80211_parse_beacon()
4863 bcn->lci = nla_data(tb[NL80211_FTM_RESP_ATTR_LCI]); in nl80211_parse_beacon()
4864 bcn->lci_len = nla_len(tb[NL80211_FTM_RESP_ATTR_LCI]); in nl80211_parse_beacon()
4868 bcn->civicloc = nla_data(tb[NL80211_FTM_RESP_ATTR_CIVICLOC]); in nl80211_parse_beacon()
4869 bcn->civicloc_len = nla_len(tb[NL80211_FTM_RESP_ATTR_CIVICLOC]); in nl80211_parse_beacon()
4872 bcn->ftm_responder = -1; in nl80211_parse_beacon()
4890 return -EINVAL; in nl80211_parse_he_obss_pd()
4892 he_obss_pd->sr_ctrl = nla_get_u8(tb[NL80211_HE_OBSS_PD_ATTR_SR_CTRL]); in nl80211_parse_he_obss_pd()
4895 he_obss_pd->min_offset = in nl80211_parse_he_obss_pd()
4898 he_obss_pd->max_offset = in nl80211_parse_he_obss_pd()
4901 he_obss_pd->non_srg_max_offset = in nl80211_parse_he_obss_pd()
4904 if (he_obss_pd->min_offset > he_obss_pd->max_offset) in nl80211_parse_he_obss_pd()
4905 return -EINVAL; in nl80211_parse_he_obss_pd()
4908 memcpy(he_obss_pd->bss_color_bitmap, in nl80211_parse_he_obss_pd()
4910 sizeof(he_obss_pd->bss_color_bitmap)); in nl80211_parse_he_obss_pd()
4913 memcpy(he_obss_pd->partial_bssid_bitmap, in nl80211_parse_he_obss_pd()
4915 sizeof(he_obss_pd->partial_bssid_bitmap)); in nl80211_parse_he_obss_pd()
4917 he_obss_pd->enable = true; in nl80211_parse_he_obss_pd()
4934 return -EINVAL; in nl80211_parse_he_bss_color()
4936 he_bss_color->color = in nl80211_parse_he_bss_color()
4938 he_bss_color->enabled = in nl80211_parse_he_bss_color()
4940 he_bss_color->partial = in nl80211_parse_he_bss_color()
4952 struct cfg80211_fils_discovery *fd = &params->fils_discovery; in nl80211_parse_fils_discovery()
4954 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_parse_fils_discovery()
4956 return -EINVAL; in nl80211_parse_fils_discovery()
4966 return -EINVAL; in nl80211_parse_fils_discovery()
4968 fd->tmpl_len = nla_len(tb[NL80211_FILS_DISCOVERY_ATTR_TMPL]); in nl80211_parse_fils_discovery()
4969 fd->tmpl = nla_data(tb[NL80211_FILS_DISCOVERY_ATTR_TMPL]); in nl80211_parse_fils_discovery()
4970 fd->min_interval = nla_get_u32(tb[NL80211_FILS_DISCOVERY_ATTR_INT_MIN]); in nl80211_parse_fils_discovery()
4971 fd->max_interval = nla_get_u32(tb[NL80211_FILS_DISCOVERY_ATTR_INT_MAX]); in nl80211_parse_fils_discovery()
4984 &params->unsol_bcast_probe_resp; in nl80211_parse_unsol_bcast_probe_resp()
4986 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_parse_unsol_bcast_probe_resp()
4988 return -EINVAL; in nl80211_parse_unsol_bcast_probe_resp()
4997 return -EINVAL; in nl80211_parse_unsol_bcast_probe_resp()
4999 presp->tmpl = nla_data(tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_TMPL]); in nl80211_parse_unsol_bcast_probe_resp()
5000 presp->tmpl_len = nla_len(tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_TMPL]); in nl80211_parse_unsol_bcast_probe_resp()
5001 presp->interval = nla_get_u32(tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_INT]); in nl80211_parse_unsol_bcast_probe_resp()
5015 params->ht_required = true; in nl80211_check_ap_rate_selectors()
5017 params->vht_required = true; in nl80211_check_ap_rate_selectors()
5019 params->he_required = true; in nl80211_check_ap_rate_selectors()
5030 const struct cfg80211_beacon_data *bcn = &params->beacon; in nl80211_calculate_ap_params()
5031 size_t ies_len = bcn->tail_len; in nl80211_calculate_ap_params()
5032 const u8 *ies = bcn->tail; in nl80211_calculate_ap_params()
5043 if (cap && cap[1] >= sizeof(*params->ht_cap)) in nl80211_calculate_ap_params()
5044 params->ht_cap = (void *)(cap + 2); in nl80211_calculate_ap_params()
5046 if (cap && cap[1] >= sizeof(*params->vht_cap)) in nl80211_calculate_ap_params()
5047 params->vht_cap = (void *)(cap + 2); in nl80211_calculate_ap_params()
5049 if (cap && cap[1] >= sizeof(*params->he_cap) + 1) in nl80211_calculate_ap_params()
5050 params->he_cap = (void *)(cap + 3); in nl80211_calculate_ap_params()
5052 if (cap && cap[1] >= sizeof(*params->he_oper) + 1) in nl80211_calculate_ap_params()
5053 params->he_oper = (void *)(cap + 3); in nl80211_calculate_ap_params()
5062 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) { in nl80211_get_ap_channel()
5063 if (wdev->iftype != NL80211_IFTYPE_AP && in nl80211_get_ap_channel()
5064 wdev->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_get_ap_channel()
5067 if (!wdev->preset_chandef.chan) in nl80211_get_ap_channel()
5070 params->chandef = wdev->preset_chandef; in nl80211_get_ap_channel()
5087 if (!(rdev->wiphy.features & NL80211_FEATURE_SAE) && in nl80211_valid_auth_type()
5090 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_valid_auth_type()
5098 if (!(rdev->wiphy.features & NL80211_FEATURE_SAE) && in nl80211_valid_auth_type()
5099 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_valid_auth_type()
5109 &rdev->wiphy, in nl80211_valid_auth_type()
5115 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_valid_auth_type()
5132 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_start_ap()
5133 struct net_device *dev = info->user_ptr[1]; in nl80211_start_ap()
5134 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_start_ap()
5138 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && in nl80211_start_ap()
5139 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_start_ap()
5140 return -EOPNOTSUPP; in nl80211_start_ap()
5142 if (!rdev->ops->start_ap) in nl80211_start_ap()
5143 return -EOPNOTSUPP; in nl80211_start_ap()
5145 if (wdev->beacon_interval) in nl80211_start_ap()
5146 return -EALREADY; in nl80211_start_ap()
5151 if (!info->attrs[NL80211_ATTR_BEACON_INTERVAL] || in nl80211_start_ap()
5152 !info->attrs[NL80211_ATTR_DTIM_PERIOD] || in nl80211_start_ap()
5153 !info->attrs[NL80211_ATTR_BEACON_HEAD]) in nl80211_start_ap()
5154 return -EINVAL; in nl80211_start_ap()
5156 err = nl80211_parse_beacon(rdev, info->attrs, &params.beacon); in nl80211_start_ap()
5161 nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]); in nl80211_start_ap()
5163 nla_get_u32(info->attrs[NL80211_ATTR_DTIM_PERIOD]); in nl80211_start_ap()
5165 err = cfg80211_validate_beacon_int(rdev, dev->ieee80211_ptr->iftype, in nl80211_start_ap()
5175 * additional information -- drivers must check! in nl80211_start_ap()
5177 if (info->attrs[NL80211_ATTR_SSID]) { in nl80211_start_ap()
5178 params.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); in nl80211_start_ap()
5180 nla_len(info->attrs[NL80211_ATTR_SSID]); in nl80211_start_ap()
5182 return -EINVAL; in nl80211_start_ap()
5185 if (info->attrs[NL80211_ATTR_HIDDEN_SSID]) in nl80211_start_ap()
5187 info->attrs[NL80211_ATTR_HIDDEN_SSID]); in nl80211_start_ap()
5189 params.privacy = !!info->attrs[NL80211_ATTR_PRIVACY]; in nl80211_start_ap()
5191 if (info->attrs[NL80211_ATTR_AUTH_TYPE]) { in nl80211_start_ap()
5193 info->attrs[NL80211_ATTR_AUTH_TYPE]); in nl80211_start_ap()
5196 return -EINVAL; in nl80211_start_ap()
5205 if (info->attrs[NL80211_ATTR_INACTIVITY_TIMEOUT]) { in nl80211_start_ap()
5206 if (!(rdev->wiphy.features & NL80211_FEATURE_INACTIVITY_TIMER)) in nl80211_start_ap()
5207 return -EOPNOTSUPP; in nl80211_start_ap()
5209 info->attrs[NL80211_ATTR_INACTIVITY_TIMEOUT]); in nl80211_start_ap()
5212 if (info->attrs[NL80211_ATTR_P2P_CTWINDOW]) { in nl80211_start_ap()
5213 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_start_ap()
5214 return -EINVAL; in nl80211_start_ap()
5216 nla_get_u8(info->attrs[NL80211_ATTR_P2P_CTWINDOW]); in nl80211_start_ap()
5218 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_CTWIN)) in nl80211_start_ap()
5219 return -EINVAL; in nl80211_start_ap()
5222 if (info->attrs[NL80211_ATTR_P2P_OPPPS]) { in nl80211_start_ap()
5225 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_start_ap()
5226 return -EINVAL; in nl80211_start_ap()
5227 tmp = nla_get_u8(info->attrs[NL80211_ATTR_P2P_OPPPS]); in nl80211_start_ap()
5230 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_OPPPS)) in nl80211_start_ap()
5231 return -EINVAL; in nl80211_start_ap()
5234 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { in nl80211_start_ap()
5238 } else if (wdev->preset_chandef.chan) { in nl80211_start_ap()
5239 params.chandef = wdev->preset_chandef; in nl80211_start_ap()
5241 return -EINVAL; in nl80211_start_ap()
5243 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &params.chandef, in nl80211_start_ap()
5244 wdev->iftype)) in nl80211_start_ap()
5245 return -EINVAL; in nl80211_start_ap()
5247 if (info->attrs[NL80211_ATTR_TX_RATES]) { in nl80211_start_ap()
5248 err = nl80211_parse_tx_bitrate_mask(info, info->attrs, in nl80211_start_ap()
5255 err = validate_beacon_tx_rate(rdev, params.chandef.chan->band, in nl80211_start_ap()
5261 if (info->attrs[NL80211_ATTR_SMPS_MODE]) { in nl80211_start_ap()
5263 nla_get_u8(info->attrs[NL80211_ATTR_SMPS_MODE]); in nl80211_start_ap()
5268 if (!(rdev->wiphy.features & in nl80211_start_ap()
5270 return -EINVAL; in nl80211_start_ap()
5273 if (!(rdev->wiphy.features & in nl80211_start_ap()
5275 return -EINVAL; in nl80211_start_ap()
5278 return -EINVAL; in nl80211_start_ap()
5284 params.pbss = nla_get_flag(info->attrs[NL80211_ATTR_PBSS]); in nl80211_start_ap()
5285 if (params.pbss && !rdev->wiphy.bands[NL80211_BAND_60GHZ]) in nl80211_start_ap()
5286 return -EOPNOTSUPP; in nl80211_start_ap()
5288 if (info->attrs[NL80211_ATTR_ACL_POLICY]) { in nl80211_start_ap()
5289 params.acl = parse_acl_data(&rdev->wiphy, info); in nl80211_start_ap()
5295 nla_get_flag(info->attrs[NL80211_ATTR_TWT_RESPONDER]); in nl80211_start_ap()
5297 if (info->attrs[NL80211_ATTR_HE_OBSS_PD]) { in nl80211_start_ap()
5299 info->attrs[NL80211_ATTR_HE_OBSS_PD], in nl80211_start_ap()
5305 if (info->attrs[NL80211_ATTR_HE_BSS_COLOR]) { in nl80211_start_ap()
5307 info->attrs[NL80211_ATTR_HE_BSS_COLOR], in nl80211_start_ap()
5313 if (info->attrs[NL80211_ATTR_FILS_DISCOVERY]) { in nl80211_start_ap()
5315 info->attrs[NL80211_ATTR_FILS_DISCOVERY], in nl80211_start_ap()
5321 if (info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP]) { in nl80211_start_ap()
5323 rdev, info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP], in nl80211_start_ap()
5331 if (info->attrs[NL80211_ATTR_EXTERNAL_AUTH_SUPPORT]) in nl80211_start_ap()
5337 wdev->preset_chandef = params.chandef; in nl80211_start_ap()
5338 wdev->beacon_interval = params.beacon_interval; in nl80211_start_ap()
5339 wdev->chandef = params.chandef; in nl80211_start_ap()
5340 wdev->ssid_len = params.ssid_len; in nl80211_start_ap()
5341 memcpy(wdev->ssid, params.ssid, wdev->ssid_len); in nl80211_start_ap()
5343 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) in nl80211_start_ap()
5344 wdev->conn_owner_nlportid = info->snd_portid; in nl80211_start_ap()
5356 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_beacon()
5357 struct net_device *dev = info->user_ptr[1]; in nl80211_set_beacon()
5358 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_beacon()
5362 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && in nl80211_set_beacon()
5363 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_set_beacon()
5364 return -EOPNOTSUPP; in nl80211_set_beacon()
5366 if (!rdev->ops->change_beacon) in nl80211_set_beacon()
5367 return -EOPNOTSUPP; in nl80211_set_beacon()
5369 if (!wdev->beacon_interval) in nl80211_set_beacon()
5370 return -EINVAL; in nl80211_set_beacon()
5372 err = nl80211_parse_beacon(rdev, info->attrs, &params); in nl80211_set_beacon()
5385 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_stop_ap()
5386 struct net_device *dev = info->user_ptr[1]; in nl80211_stop_ap()
5412 nla = info->attrs[NL80211_ATTR_STA_FLAGS2]; in parse_station_flags()
5417 params->sta_flags_mask = sta_flags->mask; in parse_station_flags()
5418 params->sta_flags_set = sta_flags->set; in parse_station_flags()
5419 params->sta_flags_set &= params->sta_flags_mask; in parse_station_flags()
5420 if ((params->sta_flags_mask | in parse_station_flags()
5421 params->sta_flags_set) & BIT(__NL80211_STA_FLAG_INVALID)) in parse_station_flags()
5422 return -EINVAL; in parse_station_flags()
5428 nla = info->attrs[NL80211_ATTR_STA_FLAGS]; in parse_station_flags()
5432 if (nla_parse_nested_deprecated(flags, NL80211_STA_FLAG_MAX, nla, sta_flags_policy, info->extack)) in parse_station_flags()
5433 return -EINVAL; in parse_station_flags()
5445 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHORIZED) | in parse_station_flags()
5452 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHORIZED) | in parse_station_flags()
5456 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHENTICATED) | in parse_station_flags()
5461 return -EINVAL; in parse_station_flags()
5466 params->sta_flags_set |= (1<<flag); in parse_station_flags()
5470 return -EINVAL; in parse_station_flags()
5490 /* report 16-bit bitrate only if we can */ in nl80211_put_sta_rate()
5499 switch (info->bw) { in nl80211_put_sta_rate()
5523 WARN_ON(!(info->flags & RATE_INFO_FLAGS_HE_MCS)); in nl80211_put_sta_rate()
5529 if (info->flags & RATE_INFO_FLAGS_MCS) { in nl80211_put_sta_rate()
5530 if (nla_put_u8(msg, NL80211_RATE_INFO_MCS, info->mcs)) in nl80211_put_sta_rate()
5532 if (info->flags & RATE_INFO_FLAGS_SHORT_GI && in nl80211_put_sta_rate()
5535 } else if (info->flags & RATE_INFO_FLAGS_VHT_MCS) { in nl80211_put_sta_rate()
5536 if (nla_put_u8(msg, NL80211_RATE_INFO_VHT_MCS, info->mcs)) in nl80211_put_sta_rate()
5538 if (nla_put_u8(msg, NL80211_RATE_INFO_VHT_NSS, info->nss)) in nl80211_put_sta_rate()
5540 if (info->flags & RATE_INFO_FLAGS_SHORT_GI && in nl80211_put_sta_rate()
5543 } else if (info->flags & RATE_INFO_FLAGS_HE_MCS) { in nl80211_put_sta_rate()
5544 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_MCS, info->mcs)) in nl80211_put_sta_rate()
5546 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_NSS, info->nss)) in nl80211_put_sta_rate()
5548 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_GI, info->he_gi)) in nl80211_put_sta_rate()
5550 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_DCM, info->he_dcm)) in nl80211_put_sta_rate()
5552 if (info->bw == RATE_INFO_BW_HE_RU && in nl80211_put_sta_rate()
5554 info->he_ru_alloc)) in nl80211_put_sta_rate()
5600 return -1; in nl80211_send_station()
5603 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in nl80211_send_station()
5605 nla_put_u32(msg, NL80211_ATTR_GENERATION, sinfo->generation)) in nl80211_send_station()
5614 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_ ## attr) && \ in nl80211_send_station()
5616 sinfo->memb)) \ in nl80211_send_station()
5620 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_ ## attr) && \ in nl80211_send_station()
5622 sinfo->memb, NL80211_STA_INFO_PAD)) \ in nl80211_send_station()
5630 if (sinfo->filled & (BIT_ULL(NL80211_STA_INFO_RX_BYTES) | in nl80211_send_station()
5633 (u32)sinfo->rx_bytes)) in nl80211_send_station()
5636 if (sinfo->filled & (BIT_ULL(NL80211_STA_INFO_TX_BYTES) | in nl80211_send_station()
5639 (u32)sinfo->tx_bytes)) in nl80211_send_station()
5650 if (wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_send_station()
5654 switch (rdev->wiphy.signal_type) { in nl80211_send_station()
5662 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL)) { in nl80211_send_station()
5663 if (!nl80211_put_signal(msg, sinfo->chains, in nl80211_send_station()
5664 sinfo->chain_signal, in nl80211_send_station()
5668 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL_AVG)) { in nl80211_send_station()
5669 if (!nl80211_put_signal(msg, sinfo->chains, in nl80211_send_station()
5670 sinfo->chain_signal_avg, in nl80211_send_station()
5674 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_TX_BITRATE)) { in nl80211_send_station()
5675 if (!nl80211_put_sta_rate(msg, &sinfo->txrate, in nl80211_send_station()
5679 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_RX_BITRATE)) { in nl80211_send_station()
5680 if (!nl80211_put_sta_rate(msg, &sinfo->rxrate, in nl80211_send_station()
5698 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_BSS_PARAM)) { in nl80211_send_station()
5704 if (((sinfo->bss_param.flags & BSS_PARAM_FLAGS_CTS_PROT) && in nl80211_send_station()
5706 ((sinfo->bss_param.flags & BSS_PARAM_FLAGS_SHORT_PREAMBLE) && in nl80211_send_station()
5708 ((sinfo->bss_param.flags & BSS_PARAM_FLAGS_SHORT_SLOT_TIME) && in nl80211_send_station()
5711 sinfo->bss_param.dtim_period) || in nl80211_send_station()
5713 sinfo->bss_param.beacon_interval)) in nl80211_send_station()
5718 if ((sinfo->filled & BIT_ULL(NL80211_STA_INFO_STA_FLAGS)) && in nl80211_send_station()
5721 &sinfo->sta_flags)) in nl80211_send_station()
5730 if (wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_send_station()
5739 if (sinfo->pertid) { in nl80211_send_station()
5752 tidstats = &sinfo->pertid[tid]; in nl80211_send_station()
5754 if (!tidstats->filled) in nl80211_send_station()
5762 if (tidstats->filled & BIT(NL80211_TID_STATS_ ## attr) && \ in nl80211_send_station()
5764 tidstats->memb, NL80211_TID_STATS_PAD)) \ in nl80211_send_station()
5774 if ((tidstats->filled & in nl80211_send_station()
5776 !nl80211_put_txq_stats(msg, &tidstats->txq_stats, in nl80211_send_station()
5788 if (sinfo->assoc_req_ies_len && in nl80211_send_station()
5789 nla_put(msg, NL80211_ATTR_IE, sinfo->assoc_req_ies_len, in nl80211_send_station()
5790 sinfo->assoc_req_ies)) in nl80211_send_station()
5800 return -EMSGSIZE; in nl80211_send_station()
5810 int sta_idx = cb->args[2]; in nl80211_dump_station()
5818 if (!wdev->netdev) { in nl80211_dump_station()
5819 err = -EINVAL; in nl80211_dump_station()
5823 if (!rdev->ops->dump_station) { in nl80211_dump_station()
5824 err = -EOPNOTSUPP; in nl80211_dump_station()
5830 err = rdev_dump_station(rdev, wdev->netdev, sta_idx, in nl80211_dump_station()
5832 if (err == -ENOENT) in nl80211_dump_station()
5838 NETLINK_CB(cb->skb).portid, in nl80211_dump_station()
5839 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_dump_station()
5840 rdev, wdev->netdev, mac_addr, in nl80211_dump_station()
5848 cb->args[2] = sta_idx; in nl80211_dump_station()
5849 err = skb->len; in nl80211_dump_station()
5858 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_station()
5859 struct net_device *dev = info->user_ptr[1]; in nl80211_get_station()
5867 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_get_station()
5868 return -EINVAL; in nl80211_get_station()
5870 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_get_station()
5872 if (!rdev->ops->get_station) in nl80211_get_station()
5873 return -EOPNOTSUPP; in nl80211_get_station()
5882 return -ENOMEM; in nl80211_get_station()
5886 info->snd_portid, info->snd_seq, 0, in nl80211_get_station()
5889 return -ENOBUFS; in nl80211_get_station()
5899 if (params->listen_interval != -1 && in cfg80211_check_station_change()
5901 return -EINVAL; in cfg80211_check_station_change()
5903 if (params->support_p2p_ps != -1 && in cfg80211_check_station_change()
5905 return -EINVAL; in cfg80211_check_station_change()
5907 if (params->aid && in cfg80211_check_station_change()
5908 !(params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) && in cfg80211_check_station_change()
5910 return -EINVAL; in cfg80211_check_station_change()
5919 * No ignoring the TDLS flag here -- the userspace mesh in cfg80211_check_station_change()
5923 if (params->sta_flags_mask & in cfg80211_check_station_change()
5927 return -EINVAL; in cfg80211_check_station_change()
5931 if (!(params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER))) in cfg80211_check_station_change()
5932 return -EINVAL; in cfg80211_check_station_change()
5934 params->sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER); in cfg80211_check_station_change()
5937 /* disallow mesh-specific things */ in cfg80211_check_station_change()
5938 if (params->plink_action != NL80211_PLINK_ACTION_NO_ACTION) in cfg80211_check_station_change()
5939 return -EINVAL; in cfg80211_check_station_change()
5940 if (params->local_pm) in cfg80211_check_station_change()
5941 return -EINVAL; in cfg80211_check_station_change()
5942 if (params->sta_modify_mask & STATION_PARAM_APPLY_PLINK_STATE) in cfg80211_check_station_change()
5943 return -EINVAL; in cfg80211_check_station_change()
5949 if (params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) in cfg80211_check_station_change()
5950 return -EINVAL; in cfg80211_check_station_change()
5953 * a hostapd/wpa_supplicant issue -- it always includes the in cfg80211_check_station_change()
5956 params->sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER); in cfg80211_check_station_change()
5962 if (params->sta_modify_mask & STATION_PARAM_APPLY_UAPSD) in cfg80211_check_station_change()
5963 return -EINVAL; in cfg80211_check_station_change()
5964 if (params->sta_modify_mask & STATION_PARAM_APPLY_CAPABILITY) in cfg80211_check_station_change()
5965 return -EINVAL; in cfg80211_check_station_change()
5966 if (params->supported_rates) in cfg80211_check_station_change()
5967 return -EINVAL; in cfg80211_check_station_change()
5968 if (params->ext_capab || params->ht_capa || params->vht_capa || in cfg80211_check_station_change()
5969 params->he_capa) in cfg80211_check_station_change()
5970 return -EINVAL; in cfg80211_check_station_change()
5975 if (params->vlan) in cfg80211_check_station_change()
5976 return -EINVAL; in cfg80211_check_station_change()
5982 if (!(params->sta_flags_mask & BIT(NL80211_STA_FLAG_AUTHORIZED))) in cfg80211_check_station_change()
5983 return -EOPNOTSUPP; in cfg80211_check_station_change()
5988 if (params->sta_flags_mask & in cfg80211_check_station_change()
5995 return -EINVAL; in cfg80211_check_station_change()
5998 if (!(wiphy->features & NL80211_FEATURE_FULL_AP_CLIENT_STATE) && in cfg80211_check_station_change()
5999 params->sta_flags_mask & in cfg80211_check_station_change()
6002 return -EINVAL; in cfg80211_check_station_change()
6007 if (params->sta_flags_mask & ~BIT(NL80211_STA_FLAG_AUTHORIZED)) in cfg80211_check_station_change()
6008 return -EINVAL; in cfg80211_check_station_change()
6012 if (params->sta_flags_mask & ~(BIT(NL80211_STA_FLAG_AUTHORIZED) | in cfg80211_check_station_change()
6014 return -EINVAL; in cfg80211_check_station_change()
6016 if (params->sta_flags_set & BIT(NL80211_STA_FLAG_AUTHORIZED) && in cfg80211_check_station_change()
6017 !params->supported_rates) in cfg80211_check_station_change()
6018 return -EINVAL; in cfg80211_check_station_change()
6022 return -EINVAL; in cfg80211_check_station_change()
6024 if (params->sta_modify_mask & STATION_PARAM_APPLY_PLINK_STATE) in cfg80211_check_station_change()
6025 return -EINVAL; in cfg80211_check_station_change()
6028 if (params->plink_action != NL80211_PLINK_ACTION_NO_ACTION && in cfg80211_check_station_change()
6029 params->plink_action != NL80211_PLINK_ACTION_BLOCK) in cfg80211_check_station_change()
6030 return -EINVAL; in cfg80211_check_station_change()
6041 params->opmode_notif_used = false; in cfg80211_check_station_change()
6053 struct nlattr *vlanattr = info->attrs[NL80211_ATTR_STA_VLAN]; in get_vlan()
6062 return ERR_PTR(-ENODEV); in get_vlan()
6064 if (!v->ieee80211_ptr || v->ieee80211_ptr->wiphy != &rdev->wiphy) { in get_vlan()
6065 ret = -EINVAL; in get_vlan()
6069 if (v->ieee80211_ptr->iftype != NL80211_IFTYPE_AP_VLAN && in get_vlan()
6070 v->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && in get_vlan()
6071 v->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) { in get_vlan()
6072 ret = -EINVAL; in get_vlan()
6077 ret = -ENETDOWN; in get_vlan()
6101 if (!info->attrs[NL80211_ATTR_STA_WME]) in nl80211_parse_sta_wme()
6104 nla = info->attrs[NL80211_ATTR_STA_WME]; in nl80211_parse_sta_wme()
6107 info->extack); in nl80211_parse_sta_wme()
6112 params->uapsd_queues = nla_get_u8( in nl80211_parse_sta_wme()
6114 if (params->uapsd_queues & ~IEEE80211_WMM_IE_STA_QOSINFO_AC_MASK) in nl80211_parse_sta_wme()
6115 return -EINVAL; in nl80211_parse_sta_wme()
6118 params->max_sp = nla_get_u8(tb[NL80211_STA_WME_MAX_SP]); in nl80211_parse_sta_wme()
6120 if (params->max_sp & ~IEEE80211_WMM_IE_STA_QOSINFO_SP_MASK) in nl80211_parse_sta_wme()
6121 return -EINVAL; in nl80211_parse_sta_wme()
6123 params->sta_modify_mask |= STATION_PARAM_APPLY_UAPSD; in nl80211_parse_sta_wme()
6131 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]) { in nl80211_parse_sta_channel_info()
6132 params->supported_channels = in nl80211_parse_sta_channel_info()
6133 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]); in nl80211_parse_sta_channel_info()
6134 params->supported_channels_len = in nl80211_parse_sta_channel_info()
6135 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]); in nl80211_parse_sta_channel_info()
6141 if (params->supported_channels_len % 2) in nl80211_parse_sta_channel_info()
6142 return -EINVAL; in nl80211_parse_sta_channel_info()
6145 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]) { in nl80211_parse_sta_channel_info()
6146 params->supported_oper_classes = in nl80211_parse_sta_channel_info()
6147 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]); in nl80211_parse_sta_channel_info()
6148 params->supported_oper_classes_len = in nl80211_parse_sta_channel_info()
6149 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]); in nl80211_parse_sta_channel_info()
6159 if (info->attrs[NL80211_ATTR_PEER_AID]) in nl80211_set_station_tdls()
6160 params->aid = nla_get_u16(info->attrs[NL80211_ATTR_PEER_AID]); in nl80211_set_station_tdls()
6161 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) in nl80211_set_station_tdls()
6162 params->ht_capa = in nl80211_set_station_tdls()
6163 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]); in nl80211_set_station_tdls()
6164 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) in nl80211_set_station_tdls()
6165 params->vht_capa = in nl80211_set_station_tdls()
6166 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]); in nl80211_set_station_tdls()
6167 if (info->attrs[NL80211_ATTR_HE_CAPABILITY]) { in nl80211_set_station_tdls()
6168 params->he_capa = in nl80211_set_station_tdls()
6169 nla_data(info->attrs[NL80211_ATTR_HE_CAPABILITY]); in nl80211_set_station_tdls()
6170 params->he_capa_len = in nl80211_set_station_tdls()
6171 nla_len(info->attrs[NL80211_ATTR_HE_CAPABILITY]); in nl80211_set_station_tdls()
6184 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_parse_sta_txpower_setting()
6187 if (info->attrs[NL80211_ATTR_STA_TX_POWER_SETTING]) { in nl80211_parse_sta_txpower_setting()
6188 if (!rdev->ops->set_tx_power || in nl80211_parse_sta_txpower_setting()
6189 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_parse_sta_txpower_setting()
6191 return -EOPNOTSUPP; in nl80211_parse_sta_txpower_setting()
6194 params->txpwr.type = nla_get_u8(info->attrs[idx]); in nl80211_parse_sta_txpower_setting()
6196 if (params->txpwr.type == NL80211_TX_POWER_LIMITED) { in nl80211_parse_sta_txpower_setting()
6199 if (info->attrs[idx]) in nl80211_parse_sta_txpower_setting()
6200 params->txpwr.power = in nl80211_parse_sta_txpower_setting()
6201 nla_get_s16(info->attrs[idx]); in nl80211_parse_sta_txpower_setting()
6203 return -EINVAL; in nl80211_parse_sta_txpower_setting()
6205 params->sta_modify_mask |= STATION_PARAM_APPLY_STA_TXPOWER; in nl80211_parse_sta_txpower_setting()
6213 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_station()
6214 struct net_device *dev = info->user_ptr[1]; in nl80211_set_station()
6221 if (!rdev->ops->change_station) in nl80211_set_station()
6222 return -EOPNOTSUPP; in nl80211_set_station()
6229 if (info->attrs[NL80211_ATTR_STA_AID]) in nl80211_set_station()
6230 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_STA_AID]); in nl80211_set_station()
6232 if (info->attrs[NL80211_ATTR_VLAN_ID]) in nl80211_set_station()
6233 params.vlan_id = nla_get_u16(info->attrs[NL80211_ATTR_VLAN_ID]); in nl80211_set_station()
6235 if (info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]) in nl80211_set_station()
6237 nla_get_u16(info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]); in nl80211_set_station()
6239 params.listen_interval = -1; in nl80211_set_station()
6241 if (info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]) in nl80211_set_station()
6243 nla_get_u8(info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]); in nl80211_set_station()
6245 params.support_p2p_ps = -1; in nl80211_set_station()
6247 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_set_station()
6248 return -EINVAL; in nl80211_set_station()
6250 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_set_station()
6252 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) { in nl80211_set_station()
6254 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); in nl80211_set_station()
6256 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); in nl80211_set_station()
6259 if (info->attrs[NL80211_ATTR_STA_CAPABILITY]) { in nl80211_set_station()
6261 nla_get_u16(info->attrs[NL80211_ATTR_STA_CAPABILITY]); in nl80211_set_station()
6265 if (info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]) { in nl80211_set_station()
6267 nla_data(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); in nl80211_set_station()
6269 nla_len(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); in nl80211_set_station()
6272 if (parse_station_flags(info, dev->ieee80211_ptr->iftype, &params)) in nl80211_set_station()
6273 return -EINVAL; in nl80211_set_station()
6275 if (info->attrs[NL80211_ATTR_STA_PLINK_ACTION]) in nl80211_set_station()
6277 nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_ACTION]); in nl80211_set_station()
6279 if (info->attrs[NL80211_ATTR_STA_PLINK_STATE]) { in nl80211_set_station()
6281 nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_STATE]); in nl80211_set_station()
6282 if (info->attrs[NL80211_ATTR_MESH_PEER_AID]) in nl80211_set_station()
6284 info->attrs[NL80211_ATTR_MESH_PEER_AID]); in nl80211_set_station()
6288 if (info->attrs[NL80211_ATTR_LOCAL_MESH_POWER_MODE]) in nl80211_set_station()
6290 info->attrs[NL80211_ATTR_LOCAL_MESH_POWER_MODE]); in nl80211_set_station()
6292 if (info->attrs[NL80211_ATTR_OPMODE_NOTIF]) { in nl80211_set_station()
6295 nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]); in nl80211_set_station()
6298 if (info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]) in nl80211_set_station()
6300 nla_data(info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]); in nl80211_set_station()
6302 if (info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]) in nl80211_set_station()
6304 nla_get_u16(info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]); in nl80211_set_station()
6307 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_set_station()
6309 return -EOPNOTSUPP; in nl80211_set_station()
6324 switch (dev->ieee80211_ptr->iftype) { in nl80211_set_station()
6334 err = -EOPNOTSUPP; in nl80211_set_station()
6350 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_new_station()
6352 struct net_device *dev = info->user_ptr[1]; in nl80211_new_station()
6360 if (!rdev->ops->add_station) in nl80211_new_station()
6361 return -EOPNOTSUPP; in nl80211_new_station()
6363 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_new_station()
6364 return -EINVAL; in nl80211_new_station()
6366 if (!info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]) in nl80211_new_station()
6367 return -EINVAL; in nl80211_new_station()
6369 if (!info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) in nl80211_new_station()
6370 return -EINVAL; in nl80211_new_station()
6372 if (!info->attrs[NL80211_ATTR_STA_AID] && in nl80211_new_station()
6373 !info->attrs[NL80211_ATTR_PEER_AID]) in nl80211_new_station()
6374 return -EINVAL; in nl80211_new_station()
6376 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_new_station()
6378 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); in nl80211_new_station()
6380 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); in nl80211_new_station()
6382 nla_get_u16(info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]); in nl80211_new_station()
6384 if (info->attrs[NL80211_ATTR_VLAN_ID]) in nl80211_new_station()
6385 params.vlan_id = nla_get_u16(info->attrs[NL80211_ATTR_VLAN_ID]); in nl80211_new_station()
6387 if (info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]) { in nl80211_new_station()
6389 nla_get_u8(info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]); in nl80211_new_station()
6396 dev->ieee80211_ptr->iftype == NL80211_IFTYPE_P2P_GO; in nl80211_new_station()
6399 if (info->attrs[NL80211_ATTR_PEER_AID]) in nl80211_new_station()
6400 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_PEER_AID]); in nl80211_new_station()
6402 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_STA_AID]); in nl80211_new_station()
6404 if (info->attrs[NL80211_ATTR_STA_CAPABILITY]) { in nl80211_new_station()
6406 nla_get_u16(info->attrs[NL80211_ATTR_STA_CAPABILITY]); in nl80211_new_station()
6410 if (info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]) { in nl80211_new_station()
6412 nla_data(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); in nl80211_new_station()
6414 nla_len(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); in nl80211_new_station()
6417 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) in nl80211_new_station()
6419 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]); in nl80211_new_station()
6421 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) in nl80211_new_station()
6423 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]); in nl80211_new_station()
6425 if (info->attrs[NL80211_ATTR_HE_CAPABILITY]) { in nl80211_new_station()
6427 nla_data(info->attrs[NL80211_ATTR_HE_CAPABILITY]); in nl80211_new_station()
6429 nla_len(info->attrs[NL80211_ATTR_HE_CAPABILITY]); in nl80211_new_station()
6432 if (info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]) in nl80211_new_station()
6434 nla_data(info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]); in nl80211_new_station()
6436 if (info->attrs[NL80211_ATTR_OPMODE_NOTIF]) { in nl80211_new_station()
6439 nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]); in nl80211_new_station()
6442 if (info->attrs[NL80211_ATTR_STA_PLINK_ACTION]) in nl80211_new_station()
6444 nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_ACTION]); in nl80211_new_station()
6446 if (info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]) in nl80211_new_station()
6448 nla_get_u16(info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]); in nl80211_new_station()
6451 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_new_station()
6453 return -EOPNOTSUPP; in nl80211_new_station()
6467 if (parse_station_flags(info, dev->ieee80211_ptr->iftype, &params)) in nl80211_new_station()
6468 return -EINVAL; in nl80211_new_station()
6481 return -EINVAL; in nl80211_new_station()
6486 return -EINVAL; in nl80211_new_station()
6491 switch (dev->ieee80211_ptr->iftype) { in nl80211_new_station()
6496 if (!(rdev->wiphy.flags & WIPHY_FLAG_AP_UAPSD) || in nl80211_new_station()
6502 info->attrs[NL80211_ATTR_PEER_AID]) in nl80211_new_station()
6503 return -EINVAL; in nl80211_new_station()
6508 if (!(rdev->wiphy.features & in nl80211_new_station()
6511 return -EINVAL; in nl80211_new_station()
6539 return -EINVAL; in nl80211_new_station()
6542 info->attrs[NL80211_ATTR_PEER_AID]) in nl80211_new_station()
6543 return -EINVAL; in nl80211_new_station()
6554 return -EINVAL; in nl80211_new_station()
6557 return -EINVAL; in nl80211_new_station()
6559 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS)) in nl80211_new_station()
6560 return -EOPNOTSUPP; in nl80211_new_station()
6562 if (!(rdev->wiphy.flags & WIPHY_FLAG_TDLS_EXTERNAL_SETUP)) in nl80211_new_station()
6563 return -EOPNOTSUPP; in nl80211_new_station()
6571 return -EOPNOTSUPP; in nl80211_new_station()
6585 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_del_station()
6586 struct net_device *dev = info->user_ptr[1]; in nl80211_del_station()
6591 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_del_station()
6592 params.mac = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_del_station()
6594 switch (dev->ieee80211_ptr->iftype) { in nl80211_del_station()
6603 if (wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_del_station()
6606 return -EINVAL; in nl80211_del_station()
6608 return -EINVAL; in nl80211_del_station()
6611 if (!rdev->ops->del_station) in nl80211_del_station()
6612 return -EOPNOTSUPP; in nl80211_del_station()
6614 if (info->attrs[NL80211_ATTR_MGMT_SUBTYPE]) { in nl80211_del_station()
6616 nla_get_u8(info->attrs[NL80211_ATTR_MGMT_SUBTYPE]); in nl80211_del_station()
6619 return -EINVAL; in nl80211_del_station()
6625 if (info->attrs[NL80211_ATTR_REASON_CODE]) { in nl80211_del_station()
6627 nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); in nl80211_del_station()
6629 return -EINVAL; /* 0 is reserved */ in nl80211_del_station()
6648 return -1; in nl80211_send_mpath()
6650 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in nl80211_send_mpath()
6653 nla_put_u32(msg, NL80211_ATTR_GENERATION, pinfo->generation)) in nl80211_send_mpath()
6659 if ((pinfo->filled & MPATH_INFO_FRAME_QLEN) && in nl80211_send_mpath()
6661 pinfo->frame_qlen)) in nl80211_send_mpath()
6663 if (((pinfo->filled & MPATH_INFO_SN) && in nl80211_send_mpath()
6664 nla_put_u32(msg, NL80211_MPATH_INFO_SN, pinfo->sn)) || in nl80211_send_mpath()
6665 ((pinfo->filled & MPATH_INFO_METRIC) && in nl80211_send_mpath()
6667 pinfo->metric)) || in nl80211_send_mpath()
6668 ((pinfo->filled & MPATH_INFO_EXPTIME) && in nl80211_send_mpath()
6670 pinfo->exptime)) || in nl80211_send_mpath()
6671 ((pinfo->filled & MPATH_INFO_FLAGS) && in nl80211_send_mpath()
6673 pinfo->flags)) || in nl80211_send_mpath()
6674 ((pinfo->filled & MPATH_INFO_DISCOVERY_TIMEOUT) && in nl80211_send_mpath()
6676 pinfo->discovery_timeout)) || in nl80211_send_mpath()
6677 ((pinfo->filled & MPATH_INFO_DISCOVERY_RETRIES) && in nl80211_send_mpath()
6679 pinfo->discovery_retries)) || in nl80211_send_mpath()
6680 ((pinfo->filled & MPATH_INFO_HOP_COUNT) && in nl80211_send_mpath()
6682 pinfo->hop_count)) || in nl80211_send_mpath()
6683 ((pinfo->filled & MPATH_INFO_PATH_CHANGE) && in nl80211_send_mpath()
6685 pinfo->path_change_count))) in nl80211_send_mpath()
6695 return -EMSGSIZE; in nl80211_send_mpath()
6706 int path_idx = cb->args[2]; in nl80211_dump_mpath()
6714 if (!rdev->ops->dump_mpath) { in nl80211_dump_mpath()
6715 err = -EOPNOTSUPP; in nl80211_dump_mpath()
6719 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) { in nl80211_dump_mpath()
6720 err = -EOPNOTSUPP; in nl80211_dump_mpath()
6725 err = rdev_dump_mpath(rdev, wdev->netdev, path_idx, dst, in nl80211_dump_mpath()
6727 if (err == -ENOENT) in nl80211_dump_mpath()
6732 if (nl80211_send_mpath(skb, NETLINK_CB(cb->skb).portid, in nl80211_dump_mpath()
6733 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_dump_mpath()
6734 wdev->netdev, dst, next_hop, in nl80211_dump_mpath()
6742 cb->args[2] = path_idx; in nl80211_dump_mpath()
6743 err = skb->len; in nl80211_dump_mpath()
6751 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_mpath()
6753 struct net_device *dev = info->user_ptr[1]; in nl80211_get_mpath()
6761 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_get_mpath()
6762 return -EINVAL; in nl80211_get_mpath()
6764 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_get_mpath()
6766 if (!rdev->ops->get_mpath) in nl80211_get_mpath()
6767 return -EOPNOTSUPP; in nl80211_get_mpath()
6769 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_get_mpath()
6770 return -EOPNOTSUPP; in nl80211_get_mpath()
6778 return -ENOMEM; in nl80211_get_mpath()
6780 if (nl80211_send_mpath(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_mpath()
6783 return -ENOBUFS; in nl80211_get_mpath()
6791 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_mpath()
6792 struct net_device *dev = info->user_ptr[1]; in nl80211_set_mpath()
6796 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_set_mpath()
6797 return -EINVAL; in nl80211_set_mpath()
6799 if (!info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]) in nl80211_set_mpath()
6800 return -EINVAL; in nl80211_set_mpath()
6802 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_set_mpath()
6803 next_hop = nla_data(info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]); in nl80211_set_mpath()
6805 if (!rdev->ops->change_mpath) in nl80211_set_mpath()
6806 return -EOPNOTSUPP; in nl80211_set_mpath()
6808 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_set_mpath()
6809 return -EOPNOTSUPP; in nl80211_set_mpath()
6816 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_new_mpath()
6817 struct net_device *dev = info->user_ptr[1]; in nl80211_new_mpath()
6821 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_new_mpath()
6822 return -EINVAL; in nl80211_new_mpath()
6824 if (!info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]) in nl80211_new_mpath()
6825 return -EINVAL; in nl80211_new_mpath()
6827 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_new_mpath()
6828 next_hop = nla_data(info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]); in nl80211_new_mpath()
6830 if (!rdev->ops->add_mpath) in nl80211_new_mpath()
6831 return -EOPNOTSUPP; in nl80211_new_mpath()
6833 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_new_mpath()
6834 return -EOPNOTSUPP; in nl80211_new_mpath()
6841 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_del_mpath()
6842 struct net_device *dev = info->user_ptr[1]; in nl80211_del_mpath()
6845 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_del_mpath()
6846 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_del_mpath()
6848 if (!rdev->ops->del_mpath) in nl80211_del_mpath()
6849 return -EOPNOTSUPP; in nl80211_del_mpath()
6851 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_del_mpath()
6852 return -EOPNOTSUPP; in nl80211_del_mpath()
6859 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_mpp()
6861 struct net_device *dev = info->user_ptr[1]; in nl80211_get_mpp()
6869 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_get_mpp()
6870 return -EINVAL; in nl80211_get_mpp()
6872 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_get_mpp()
6874 if (!rdev->ops->get_mpp) in nl80211_get_mpp()
6875 return -EOPNOTSUPP; in nl80211_get_mpp()
6877 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_get_mpp()
6878 return -EOPNOTSUPP; in nl80211_get_mpp()
6886 return -ENOMEM; in nl80211_get_mpp()
6888 if (nl80211_send_mpath(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_mpp()
6891 return -ENOBUFS; in nl80211_get_mpp()
6905 int path_idx = cb->args[2]; in nl80211_dump_mpp()
6913 if (!rdev->ops->dump_mpp) { in nl80211_dump_mpp()
6914 err = -EOPNOTSUPP; in nl80211_dump_mpp()
6918 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) { in nl80211_dump_mpp()
6919 err = -EOPNOTSUPP; in nl80211_dump_mpp()
6924 err = rdev_dump_mpp(rdev, wdev->netdev, path_idx, dst, in nl80211_dump_mpp()
6926 if (err == -ENOENT) in nl80211_dump_mpp()
6931 if (nl80211_send_mpath(skb, NETLINK_CB(cb->skb).portid, in nl80211_dump_mpp()
6932 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_dump_mpp()
6933 wdev->netdev, dst, mpp, in nl80211_dump_mpp()
6941 cb->args[2] = path_idx; in nl80211_dump_mpp()
6942 err = skb->len; in nl80211_dump_mpp()
6950 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_bss()
6951 struct net_device *dev = info->user_ptr[1]; in nl80211_set_bss()
6952 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_bss()
6958 params.use_cts_prot = -1; in nl80211_set_bss()
6959 params.use_short_preamble = -1; in nl80211_set_bss()
6960 params.use_short_slot_time = -1; in nl80211_set_bss()
6961 params.ap_isolate = -1; in nl80211_set_bss()
6962 params.ht_opmode = -1; in nl80211_set_bss()
6963 params.p2p_ctwindow = -1; in nl80211_set_bss()
6964 params.p2p_opp_ps = -1; in nl80211_set_bss()
6966 if (info->attrs[NL80211_ATTR_BSS_CTS_PROT]) in nl80211_set_bss()
6968 nla_get_u8(info->attrs[NL80211_ATTR_BSS_CTS_PROT]); in nl80211_set_bss()
6969 if (info->attrs[NL80211_ATTR_BSS_SHORT_PREAMBLE]) in nl80211_set_bss()
6971 nla_get_u8(info->attrs[NL80211_ATTR_BSS_SHORT_PREAMBLE]); in nl80211_set_bss()
6972 if (info->attrs[NL80211_ATTR_BSS_SHORT_SLOT_TIME]) in nl80211_set_bss()
6974 nla_get_u8(info->attrs[NL80211_ATTR_BSS_SHORT_SLOT_TIME]); in nl80211_set_bss()
6975 if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) { in nl80211_set_bss()
6977 nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); in nl80211_set_bss()
6979 nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); in nl80211_set_bss()
6981 if (info->attrs[NL80211_ATTR_AP_ISOLATE]) in nl80211_set_bss()
6982 params.ap_isolate = !!nla_get_u8(info->attrs[NL80211_ATTR_AP_ISOLATE]); in nl80211_set_bss()
6983 if (info->attrs[NL80211_ATTR_BSS_HT_OPMODE]) in nl80211_set_bss()
6985 nla_get_u16(info->attrs[NL80211_ATTR_BSS_HT_OPMODE]); in nl80211_set_bss()
6987 if (info->attrs[NL80211_ATTR_P2P_CTWINDOW]) { in nl80211_set_bss()
6988 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_set_bss()
6989 return -EINVAL; in nl80211_set_bss()
6991 nla_get_u8(info->attrs[NL80211_ATTR_P2P_CTWINDOW]); in nl80211_set_bss()
6993 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_CTWIN)) in nl80211_set_bss()
6994 return -EINVAL; in nl80211_set_bss()
6997 if (info->attrs[NL80211_ATTR_P2P_OPPPS]) { in nl80211_set_bss()
7000 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_set_bss()
7001 return -EINVAL; in nl80211_set_bss()
7002 tmp = nla_get_u8(info->attrs[NL80211_ATTR_P2P_OPPPS]); in nl80211_set_bss()
7005 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_OPPPS)) in nl80211_set_bss()
7006 return -EINVAL; in nl80211_set_bss()
7009 if (!rdev->ops->change_bss) in nl80211_set_bss()
7010 return -EOPNOTSUPP; in nl80211_set_bss()
7012 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && in nl80211_set_bss()
7013 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_set_bss()
7014 return -EOPNOTSUPP; in nl80211_set_bss()
7032 * completely when built-in to the kernel right between the time in nl80211_req_set_reg()
7037 return -EINPROGRESS; in nl80211_req_set_reg()
7039 if (info->attrs[NL80211_ATTR_USER_REG_HINT_TYPE]) in nl80211_req_set_reg()
7041 nla_get_u32(info->attrs[NL80211_ATTR_USER_REG_HINT_TYPE]); in nl80211_req_set_reg()
7048 if (!info->attrs[NL80211_ATTR_REG_ALPHA2]) in nl80211_req_set_reg()
7049 return -EINVAL; in nl80211_req_set_reg()
7051 data = nla_data(info->attrs[NL80211_ATTR_REG_ALPHA2]); in nl80211_req_set_reg()
7054 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) { in nl80211_req_set_reg()
7055 owner_nlportid = info->snd_portid; in nl80211_req_set_reg()
7056 is_indoor = !!info->attrs[NL80211_ATTR_REG_INDOOR]; in nl80211_req_set_reg()
7064 return -EINVAL; in nl80211_req_set_reg()
7076 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_mesh_config()
7077 struct net_device *dev = info->user_ptr[1]; in nl80211_get_mesh_config()
7078 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_get_mesh_config()
7085 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_get_mesh_config()
7086 return -EOPNOTSUPP; in nl80211_get_mesh_config()
7088 if (!rdev->ops->get_mesh_config) in nl80211_get_mesh_config()
7089 return -EOPNOTSUPP; in nl80211_get_mesh_config()
7093 if (!wdev->mesh_id_len) in nl80211_get_mesh_config()
7105 return -ENOMEM; in nl80211_get_mesh_config()
7106 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_mesh_config()
7113 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in nl80211_get_mesh_config()
7184 return -ENOBUFS; in nl80211_get_mesh_config()
7219 NLA_POLICY_RANGE(NLA_S32, -255, 0),
7262 cfg->param = fn(tb[attr]); \ in nl80211_parse_mesh_config()
7263 mask |= BIT((attr) - 1); \ in nl80211_parse_mesh_config()
7267 if (!info->attrs[NL80211_ATTR_MESH_CONFIG]) in nl80211_parse_mesh_config()
7268 return -EINVAL; in nl80211_parse_mesh_config()
7269 …ated(tb, NL80211_MESHCONF_ATTR_MAX, info->attrs[NL80211_ATTR_MESH_CONFIG], nl80211_meshconf_params… in nl80211_parse_mesh_config()
7270 return -EINVAL; in nl80211_parse_mesh_config()
7273 * parameters (otherwise our bitfield scheme would not work.) */ in nl80211_parse_mesh_config()
7308 (cfg->path_refresh_time < 1 || cfg->path_refresh_time > 65535)) in nl80211_parse_mesh_config()
7309 return -EINVAL; in nl80211_parse_mesh_config()
7318 (cfg->dot11MeshHWMPactivePathTimeout < 1 || in nl80211_parse_mesh_config()
7319 cfg->dot11MeshHWMPactivePathTimeout > 65535)) in nl80211_parse_mesh_config()
7320 return -EINVAL; in nl80211_parse_mesh_config()
7352 * IEEE 802.11-2016 9.4.2.57 HT Operation element. in nl80211_parse_mesh_config()
7360 return -EINVAL; in nl80211_parse_mesh_config()
7365 cfg->ht_opmode = ht_opmode; in nl80211_parse_mesh_config()
7366 mask |= (1 << (NL80211_MESHCONF_HT_OPMODE - 1)); in nl80211_parse_mesh_config()
7373 (cfg->dot11MeshHWMPactivePathToRootTimeout < 1 || in nl80211_parse_mesh_config()
7374 cfg->dot11MeshHWMPactivePathToRootTimeout > 65535)) in nl80211_parse_mesh_config()
7375 return -EINVAL; in nl80211_parse_mesh_config()
7402 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_parse_mesh_setup()
7405 if (!info->attrs[NL80211_ATTR_MESH_SETUP]) in nl80211_parse_mesh_setup()
7406 return -EINVAL; in nl80211_parse_mesh_setup()
7407 …ed(tb, NL80211_MESH_SETUP_ATTR_MAX, info->attrs[NL80211_ATTR_MESH_SETUP], nl80211_mesh_setup_param… in nl80211_parse_mesh_setup()
7408 return -EINVAL; in nl80211_parse_mesh_setup()
7411 setup->sync_method = in nl80211_parse_mesh_setup()
7417 setup->path_sel_proto = in nl80211_parse_mesh_setup()
7423 setup->path_metric = in nl80211_parse_mesh_setup()
7431 setup->ie = nla_data(ieattr); in nl80211_parse_mesh_setup()
7432 setup->ie_len = nla_len(ieattr); in nl80211_parse_mesh_setup()
7435 !(rdev->wiphy.features & NL80211_FEATURE_USERSPACE_MPM)) in nl80211_parse_mesh_setup()
7436 return -EINVAL; in nl80211_parse_mesh_setup()
7437 setup->user_mpm = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_MPM]); in nl80211_parse_mesh_setup()
7438 setup->is_authenticated = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_AUTH]); in nl80211_parse_mesh_setup()
7439 setup->is_secure = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_AMPE]); in nl80211_parse_mesh_setup()
7440 if (setup->is_secure) in nl80211_parse_mesh_setup()
7441 setup->user_mpm = true; in nl80211_parse_mesh_setup()
7444 if (!setup->user_mpm) in nl80211_parse_mesh_setup()
7445 return -EINVAL; in nl80211_parse_mesh_setup()
7446 setup->auth_id = in nl80211_parse_mesh_setup()
7456 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_update_mesh_config()
7457 struct net_device *dev = info->user_ptr[1]; in nl80211_update_mesh_config()
7458 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_update_mesh_config()
7463 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_update_mesh_config()
7464 return -EOPNOTSUPP; in nl80211_update_mesh_config()
7466 if (!rdev->ops->update_mesh_config) in nl80211_update_mesh_config()
7467 return -EOPNOTSUPP; in nl80211_update_mesh_config()
7474 if (!wdev->mesh_id_len) in nl80211_update_mesh_config()
7475 err = -ENOLINK; in nl80211_update_mesh_config()
7491 if (nla_put_string(msg, NL80211_ATTR_REG_ALPHA2, regdom->alpha2) || in nl80211_put_regdom()
7492 (regdom->dfs_region && in nl80211_put_regdom()
7493 nla_put_u8(msg, NL80211_ATTR_DFS_REGION, regdom->dfs_region))) in nl80211_put_regdom()
7500 for (i = 0; i < regdom->n_reg_rules; i++) { in nl80211_put_regdom()
7507 reg_rule = &regdom->reg_rules[i]; in nl80211_put_regdom()
7508 freq_range = &reg_rule->freq_range; in nl80211_put_regdom()
7509 power_rule = &reg_rule->power_rule; in nl80211_put_regdom()
7515 max_bandwidth_khz = freq_range->max_bandwidth_khz; in nl80211_put_regdom()
7521 reg_rule->flags) || in nl80211_put_regdom()
7523 freq_range->start_freq_khz) || in nl80211_put_regdom()
7525 freq_range->end_freq_khz) || in nl80211_put_regdom()
7529 power_rule->max_antenna_gain) || in nl80211_put_regdom()
7531 power_rule->max_eirp) || in nl80211_put_regdom()
7533 reg_rule->dfs_cac_ms)) in nl80211_put_regdom()
7543 return -EMSGSIZE; in nl80211_put_regdom()
7556 return -ENOBUFS; in nl80211_get_reg_do()
7558 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_reg_do()
7563 if (info->attrs[NL80211_ATTR_WIPHY]) { in nl80211_get_reg_do()
7572 wiphy = &rdev->wiphy; in nl80211_get_reg_do()
7573 self_managed = wiphy->regulatory_flags & in nl80211_get_reg_do()
7577 /* a self-managed-reg device must have a private regdom */ in nl80211_get_reg_do()
7580 return -EINVAL; in nl80211_get_reg_do()
7611 return -EMSGSIZE; in nl80211_get_reg_do()
7618 void *hdr = nl80211hdr_put(msg, NETLINK_CB(cb->skb).portid, seq, flags, in nl80211_send_regdom()
7622 return -1; in nl80211_send_regdom()
7638 if (wiphy && wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED && in nl80211_send_regdom()
7647 return -EMSGSIZE; in nl80211_send_regdom()
7655 int err, reg_idx, start = cb->args[2]; in nl80211_get_reg_dump()
7660 err = nl80211_send_regdom(skb, cb, cb->nlh->nlmsg_seq, in nl80211_get_reg_dump()
7670 regdom = get_wiphy_regdom(&rdev->wiphy); in nl80211_get_reg_dump()
7677 err = nl80211_send_regdom(skb, cb, cb->nlh->nlmsg_seq, in nl80211_get_reg_dump()
7678 NLM_F_MULTI, &rdev->wiphy, regdom); in nl80211_get_reg_dump()
7680 reg_idx--; in nl80211_get_reg_dump()
7685 cb->args[2] = reg_idx; in nl80211_get_reg_dump()
7686 err = skb->len; in nl80211_get_reg_dump()
7706 struct ieee80211_freq_range *freq_range = &reg_rule->freq_range; in parse_reg_rule()
7707 struct ieee80211_power_rule *power_rule = &reg_rule->power_rule; in parse_reg_rule()
7710 return -EINVAL; in parse_reg_rule()
7712 return -EINVAL; in parse_reg_rule()
7714 return -EINVAL; in parse_reg_rule()
7716 return -EINVAL; in parse_reg_rule()
7718 return -EINVAL; in parse_reg_rule()
7720 reg_rule->flags = nla_get_u32(tb[NL80211_ATTR_REG_RULE_FLAGS]); in parse_reg_rule()
7722 freq_range->start_freq_khz = in parse_reg_rule()
7724 freq_range->end_freq_khz = in parse_reg_rule()
7726 freq_range->max_bandwidth_khz = in parse_reg_rule()
7729 power_rule->max_eirp = in parse_reg_rule()
7733 power_rule->max_antenna_gain = in parse_reg_rule()
7737 reg_rule->dfs_cac_ms = in parse_reg_rule()
7753 if (!info->attrs[NL80211_ATTR_REG_ALPHA2]) in nl80211_set_reg()
7754 return -EINVAL; in nl80211_set_reg()
7756 if (!info->attrs[NL80211_ATTR_REG_RULES]) in nl80211_set_reg()
7757 return -EINVAL; in nl80211_set_reg()
7759 alpha2 = nla_data(info->attrs[NL80211_ATTR_REG_ALPHA2]); in nl80211_set_reg()
7761 if (info->attrs[NL80211_ATTR_DFS_REGION]) in nl80211_set_reg()
7762 dfs_region = nla_get_u8(info->attrs[NL80211_ATTR_DFS_REGION]); in nl80211_set_reg()
7764 nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES], in nl80211_set_reg()
7768 return -EINVAL; in nl80211_set_reg()
7772 return -EINVAL; in nl80211_set_reg()
7776 return -ENOMEM; in nl80211_set_reg()
7778 rd->n_reg_rules = num_rules; in nl80211_set_reg()
7779 rd->alpha2[0] = alpha2[0]; in nl80211_set_reg()
7780 rd->alpha2[1] = alpha2[1]; in nl80211_set_reg()
7787 rd->dfs_region = dfs_region; in nl80211_set_reg()
7789 nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES], in nl80211_set_reg()
7793 info->extack); in nl80211_set_reg()
7796 r = parse_reg_rule(tb, &rd->reg_rules[rule_idx]); in nl80211_set_reg()
7803 r = -EINVAL; in nl80211_set_reg()
7847 return b < NUM_NL80211_BANDS && wiphy->bands[b]; in is_band_valid()
7862 return -EINVAL; in parse_bss_select()
7874 return -EINVAL; in parse_bss_select()
7879 bss_select->behaviour = __NL80211_BSS_SELECT_ATTR_INVALID; in parse_bss_select()
7882 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_RSSI; in parse_bss_select()
7885 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_BAND_PREF; in parse_bss_select()
7886 bss_select->param.band_pref = in parse_bss_select()
7888 if (!is_band_valid(wiphy, bss_select->param.band_pref)) in parse_bss_select()
7889 return -EINVAL; in parse_bss_select()
7896 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_RSSI_ADJUST; in parse_bss_select()
7897 bss_select->param.adjust.band = adj_param->band; in parse_bss_select()
7898 bss_select->param.adjust.delta = adj_param->delta; in parse_bss_select()
7899 if (!is_band_valid(wiphy, bss_select->param.adjust.band)) in parse_bss_select()
7900 return -EINVAL; in parse_bss_select()
7903 /* user-space did not provide behaviour attribute */ in parse_bss_select()
7904 if (bss_select->behaviour == __NL80211_BSS_SELECT_ATTR_INVALID) in parse_bss_select()
7905 return -EINVAL; in parse_bss_select()
7907 if (!(wiphy->bss_select_support & BIT(bss_select->behaviour))) in parse_bss_select()
7908 return -EINVAL; in parse_bss_select()
7929 return -EINVAL; in nl80211_parse_random_mac()
7937 return -EINVAL; in nl80211_parse_random_mac()
7957 if (!(wdev->chandef.chan->flags & IEEE80211_CHAN_RADAR)) in cfg80211_off_channel_oper_allowed()
7960 return regulatory_pre_cac_allowed(wdev->wiphy); in cfg80211_off_channel_oper_allowed()
7991 flags = &req->flags; in nl80211_check_scan_flags()
7992 mac_addr = req->mac_addr; in nl80211_check_scan_flags()
7993 mac_addr_mask = req->mac_addr_mask; in nl80211_check_scan_flags()
7998 flags = &req->flags; in nl80211_check_scan_flags()
7999 mac_addr = req->mac_addr; in nl80211_check_scan_flags()
8000 mac_addr_mask = req->mac_addr_mask; in nl80211_check_scan_flags()
8006 !(wiphy->features & NL80211_FEATURE_LOW_PRIORITY_SCAN)) || in nl80211_check_scan_flags()
8034 return -EOPNOTSUPP; in nl80211_check_scan_flags()
8039 if (!(wiphy->features & randomness_flag) || in nl80211_check_scan_flags()
8040 (wdev && wdev->current_bss)) in nl80211_check_scan_flags()
8041 return -EOPNOTSUPP; in nl80211_check_scan_flags()
8053 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_trigger_scan()
8054 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_trigger_scan()
8063 wiphy = &rdev->wiphy; in nl80211_trigger_scan()
8065 if (wdev->iftype == NL80211_IFTYPE_NAN) in nl80211_trigger_scan()
8066 return -EOPNOTSUPP; in nl80211_trigger_scan()
8068 if (!rdev->ops->scan) in nl80211_trigger_scan()
8069 return -EOPNOTSUPP; in nl80211_trigger_scan()
8071 if (rdev->scan_req || rdev->scan_msg) in nl80211_trigger_scan()
8072 return -EBUSY; in nl80211_trigger_scan()
8074 if (info->attrs[NL80211_ATTR_SCAN_FREQ_KHZ]) { in nl80211_trigger_scan()
8077 return -EOPNOTSUPP; in nl80211_trigger_scan()
8078 scan_freqs = info->attrs[NL80211_ATTR_SCAN_FREQ_KHZ]; in nl80211_trigger_scan()
8080 } else if (info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]) in nl80211_trigger_scan()
8081 scan_freqs = info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]; in nl80211_trigger_scan()
8086 return -EINVAL; in nl80211_trigger_scan()
8091 if (info->attrs[NL80211_ATTR_SCAN_SSIDS]) in nl80211_trigger_scan()
8092 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp) in nl80211_trigger_scan()
8095 if (n_ssids > wiphy->max_scan_ssids) in nl80211_trigger_scan()
8096 return -EINVAL; in nl80211_trigger_scan()
8098 if (info->attrs[NL80211_ATTR_IE]) in nl80211_trigger_scan()
8099 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_trigger_scan()
8103 if (ie_len > wiphy->max_scan_ie_len) in nl80211_trigger_scan()
8104 return -EINVAL; in nl80211_trigger_scan()
8107 + sizeof(*request->ssids) * n_ssids in nl80211_trigger_scan()
8108 + sizeof(*request->channels) * n_channels in nl80211_trigger_scan()
8111 return -ENOMEM; in nl80211_trigger_scan()
8114 request->ssids = (void *)&request->channels[n_channels]; in nl80211_trigger_scan()
8115 request->n_ssids = n_ssids; in nl80211_trigger_scan()
8118 request->ie = (void *)(request->ssids + n_ssids); in nl80211_trigger_scan()
8120 request->ie = (void *)(request->channels + n_channels); in nl80211_trigger_scan()
8135 err = -EINVAL; in nl80211_trigger_scan()
8140 if (chan->flags & IEEE80211_CHAN_DISABLED) in nl80211_trigger_scan()
8143 request->channels[i] = chan; in nl80211_trigger_scan()
8153 if (!wiphy->bands[band]) in nl80211_trigger_scan()
8155 for (j = 0; j < wiphy->bands[band]->n_channels; j++) { in nl80211_trigger_scan()
8158 chan = &wiphy->bands[band]->channels[j]; in nl80211_trigger_scan()
8160 if (chan->flags & IEEE80211_CHAN_DISABLED) in nl80211_trigger_scan()
8163 request->channels[i] = chan; in nl80211_trigger_scan()
8170 err = -EINVAL; in nl80211_trigger_scan()
8174 request->n_channels = i; in nl80211_trigger_scan()
8180 if (request->n_channels != 1) { in nl80211_trigger_scan()
8182 err = -EBUSY; in nl80211_trigger_scan()
8186 chan = request->channels[0]; in nl80211_trigger_scan()
8187 if (chan->center_freq != wdev->chandef.chan->center_freq) { in nl80211_trigger_scan()
8189 err = -EBUSY; in nl80211_trigger_scan()
8197 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp) { in nl80211_trigger_scan()
8199 err = -EINVAL; in nl80211_trigger_scan()
8202 request->ssids[i].ssid_len = nla_len(attr); in nl80211_trigger_scan()
8203 memcpy(request->ssids[i].ssid, nla_data(attr), nla_len(attr)); in nl80211_trigger_scan()
8208 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_trigger_scan()
8209 request->ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_trigger_scan()
8210 memcpy((void *)request->ie, in nl80211_trigger_scan()
8211 nla_data(info->attrs[NL80211_ATTR_IE]), in nl80211_trigger_scan()
8212 request->ie_len); in nl80211_trigger_scan()
8216 if (wiphy->bands[i]) in nl80211_trigger_scan()
8217 request->rates[i] = in nl80211_trigger_scan()
8218 (1 << wiphy->bands[i]->n_bitrates) - 1; in nl80211_trigger_scan()
8220 if (info->attrs[NL80211_ATTR_SCAN_SUPP_RATES]) { in nl80211_trigger_scan()
8222 info->attrs[NL80211_ATTR_SCAN_SUPP_RATES], in nl80211_trigger_scan()
8227 err = -EINVAL; in nl80211_trigger_scan()
8231 if (!wiphy->bands[band]) in nl80211_trigger_scan()
8234 err = ieee80211_get_ratemask(wiphy->bands[band], in nl80211_trigger_scan()
8237 &request->rates[band]); in nl80211_trigger_scan()
8243 if (info->attrs[NL80211_ATTR_MEASUREMENT_DURATION]) { in nl80211_trigger_scan()
8246 err = -EOPNOTSUPP; in nl80211_trigger_scan()
8250 request->duration = in nl80211_trigger_scan()
8251 nla_get_u16(info->attrs[NL80211_ATTR_MEASUREMENT_DURATION]); in nl80211_trigger_scan()
8252 request->duration_mandatory = in nl80211_trigger_scan()
8253 nla_get_flag(info->attrs[NL80211_ATTR_MEASUREMENT_DURATION_MANDATORY]); in nl80211_trigger_scan()
8256 err = nl80211_check_scan_flags(wiphy, wdev, request, info->attrs, in nl80211_trigger_scan()
8261 request->no_cck = in nl80211_trigger_scan()
8262 nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]); in nl80211_trigger_scan()
8273 if (info->attrs[NL80211_ATTR_BSSID]) in nl80211_trigger_scan()
8274 memcpy(request->bssid, in nl80211_trigger_scan()
8275 nla_data(info->attrs[NL80211_ATTR_BSSID]), ETH_ALEN); in nl80211_trigger_scan()
8276 else if (!(request->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) && in nl80211_trigger_scan()
8277 info->attrs[NL80211_ATTR_MAC]) in nl80211_trigger_scan()
8278 memcpy(request->bssid, nla_data(info->attrs[NL80211_ATTR_MAC]), in nl80211_trigger_scan()
8281 eth_broadcast_addr(request->bssid); in nl80211_trigger_scan()
8283 request->wdev = wdev; in nl80211_trigger_scan()
8284 request->wiphy = &rdev->wiphy; in nl80211_trigger_scan()
8285 request->scan_start = jiffies; in nl80211_trigger_scan()
8287 rdev->scan_req = request; in nl80211_trigger_scan()
8294 if (wdev->netdev) in nl80211_trigger_scan()
8295 dev_hold(wdev->netdev); in nl80211_trigger_scan()
8300 rdev->scan_req = NULL; in nl80211_trigger_scan()
8308 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_abort_scan()
8309 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_abort_scan()
8311 if (!rdev->ops->abort_scan) in nl80211_abort_scan()
8312 return -EOPNOTSUPP; in nl80211_abort_scan()
8314 if (rdev->scan_msg) in nl80211_abort_scan()
8317 if (!rdev->scan_req) in nl80211_abort_scan()
8318 return -ENOENT; in nl80211_abort_scan()
8343 return -EINVAL; in nl80211_parse_sched_scan_plans()
8345 request->scan_plans[0].interval = in nl80211_parse_sched_scan_plans()
8347 if (!request->scan_plans[0].interval) in nl80211_parse_sched_scan_plans()
8348 return -EINVAL; in nl80211_parse_sched_scan_plans()
8350 if (request->scan_plans[0].interval > in nl80211_parse_sched_scan_plans()
8351 wiphy->max_sched_scan_plan_interval) in nl80211_parse_sched_scan_plans()
8352 request->scan_plans[0].interval = in nl80211_parse_sched_scan_plans()
8353 wiphy->max_sched_scan_plan_interval; in nl80211_parse_sched_scan_plans()
8362 return -EINVAL; in nl80211_parse_sched_scan_plans()
8372 return -EINVAL; in nl80211_parse_sched_scan_plans()
8374 request->scan_plans[i].interval = in nl80211_parse_sched_scan_plans()
8376 if (!request->scan_plans[i].interval || in nl80211_parse_sched_scan_plans()
8377 request->scan_plans[i].interval > in nl80211_parse_sched_scan_plans()
8378 wiphy->max_sched_scan_plan_interval) in nl80211_parse_sched_scan_plans()
8379 return -EINVAL; in nl80211_parse_sched_scan_plans()
8382 request->scan_plans[i].iterations = in nl80211_parse_sched_scan_plans()
8384 if (!request->scan_plans[i].iterations || in nl80211_parse_sched_scan_plans()
8385 (request->scan_plans[i].iterations > in nl80211_parse_sched_scan_plans()
8386 wiphy->max_sched_scan_plan_iterations)) in nl80211_parse_sched_scan_plans()
8387 return -EINVAL; in nl80211_parse_sched_scan_plans()
8388 } else if (i < n_plans - 1) { in nl80211_parse_sched_scan_plans()
8393 return -EINVAL; in nl80211_parse_sched_scan_plans()
8403 if (request->scan_plans[n_plans - 1].iterations) in nl80211_parse_sched_scan_plans()
8404 return -EINVAL; in nl80211_parse_sched_scan_plans()
8421 ret = -EOPNOTSUPP; in nl80211_parse_sched_scan_per_band_rssi()
8424 match_sets->per_band_rssi_thold[i] = in nl80211_parse_sched_scan_per_band_rssi()
8430 match_sets->per_band_rssi_thold[i] = rssi_thold; in nl80211_parse_sched_scan_per_band_rssi()
8436 return -EINVAL; in nl80211_parse_sched_scan_per_band_rssi()
8438 match_sets->per_band_rssi_thold[band] = nla_get_s32(attr); in nl80211_parse_sched_scan_per_band_rssi()
8460 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
8470 if (n_ssids > wiphy->max_sched_scan_ssids) in nl80211_parse_sched_scan()
8471 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
8480 * global RSSI for all other matchsets - if there are other matchsets. in nl80211_parse_sched_scan()
8499 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
8518 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
8525 if (ie_len > wiphy->max_sched_scan_ie_len) in nl80211_parse_sched_scan()
8526 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
8534 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
8547 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
8552 if (!n_plans || n_plans > wiphy->max_sched_scan_plans) in nl80211_parse_sched_scan()
8553 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
8559 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
8562 + sizeof(*request->ssids) * n_ssids in nl80211_parse_sched_scan()
8563 + sizeof(*request->match_sets) * n_match_sets in nl80211_parse_sched_scan()
8564 + sizeof(*request->scan_plans) * n_plans in nl80211_parse_sched_scan()
8565 + sizeof(*request->channels) * n_channels in nl80211_parse_sched_scan()
8568 return ERR_PTR(-ENOMEM); in nl80211_parse_sched_scan()
8571 request->ssids = (void *)&request->channels[n_channels]; in nl80211_parse_sched_scan()
8572 request->n_ssids = n_ssids; in nl80211_parse_sched_scan()
8575 request->ie = (void *)(request->ssids + n_ssids); in nl80211_parse_sched_scan()
8577 request->ie = (void *)(request->channels + n_channels); in nl80211_parse_sched_scan()
8581 if (request->ie) in nl80211_parse_sched_scan()
8582 request->match_sets = (void *)(request->ie + ie_len); in nl80211_parse_sched_scan()
8584 request->match_sets = in nl80211_parse_sched_scan()
8585 (void *)(request->ssids + n_ssids); in nl80211_parse_sched_scan()
8587 request->match_sets = in nl80211_parse_sched_scan()
8588 (void *)(request->channels + n_channels); in nl80211_parse_sched_scan()
8590 request->n_match_sets = n_match_sets; in nl80211_parse_sched_scan()
8593 request->scan_plans = (void *)(request->match_sets + in nl80211_parse_sched_scan()
8595 else if (request->ie) in nl80211_parse_sched_scan()
8596 request->scan_plans = (void *)(request->ie + ie_len); in nl80211_parse_sched_scan()
8598 request->scan_plans = (void *)(request->ssids + n_ssids); in nl80211_parse_sched_scan()
8600 request->scan_plans = (void *)(request->channels + n_channels); in nl80211_parse_sched_scan()
8602 request->n_scan_plans = n_plans; in nl80211_parse_sched_scan()
8615 err = -EINVAL; in nl80211_parse_sched_scan()
8620 if (chan->flags & IEEE80211_CHAN_DISABLED) in nl80211_parse_sched_scan()
8623 request->channels[i] = chan; in nl80211_parse_sched_scan()
8631 if (!wiphy->bands[band]) in nl80211_parse_sched_scan()
8633 for (j = 0; j < wiphy->bands[band]->n_channels; j++) { in nl80211_parse_sched_scan()
8636 chan = &wiphy->bands[band]->channels[j]; in nl80211_parse_sched_scan()
8638 if (chan->flags & IEEE80211_CHAN_DISABLED) in nl80211_parse_sched_scan()
8641 request->channels[i] = chan; in nl80211_parse_sched_scan()
8648 err = -EINVAL; in nl80211_parse_sched_scan()
8652 request->n_channels = i; in nl80211_parse_sched_scan()
8659 err = -EINVAL; in nl80211_parse_sched_scan()
8662 request->ssids[i].ssid_len = nla_len(attr); in nl80211_parse_sched_scan()
8663 memcpy(request->ssids[i].ssid, nla_data(attr), in nl80211_parse_sched_scan()
8696 err = -EINVAL; in nl80211_parse_sched_scan()
8701 memcpy(request->match_sets[i].ssid.ssid, in nl80211_parse_sched_scan()
8703 request->match_sets[i].ssid.ssid_len = in nl80211_parse_sched_scan()
8707 memcpy(request->match_sets[i].bssid, in nl80211_parse_sched_scan()
8710 /* special attribute - old implementation w/a */ in nl80211_parse_sched_scan()
8711 request->match_sets[i].rssi_thold = default_match_rssi; in nl80211_parse_sched_scan()
8714 request->match_sets[i].rssi_thold = in nl80211_parse_sched_scan()
8719 &request->match_sets[i], in nl80211_parse_sched_scan()
8721 request->match_sets[i].rssi_thold); in nl80211_parse_sched_scan()
8730 request->match_sets[0].rssi_thold = default_match_rssi; in nl80211_parse_sched_scan()
8732 request->min_rssi_thold = INT_MAX; in nl80211_parse_sched_scan()
8734 request->min_rssi_thold = in nl80211_parse_sched_scan()
8735 min(request->match_sets[i].rssi_thold, in nl80211_parse_sched_scan()
8736 request->min_rssi_thold); in nl80211_parse_sched_scan()
8738 request->min_rssi_thold = NL80211_SCAN_RSSI_THOLD_OFF; in nl80211_parse_sched_scan()
8742 request->ie_len = ie_len; in nl80211_parse_sched_scan()
8743 memcpy((void *)request->ie, in nl80211_parse_sched_scan()
8745 request->ie_len); in nl80211_parse_sched_scan()
8753 request->delay = in nl80211_parse_sched_scan()
8757 request->relative_rssi = nla_get_s8( in nl80211_parse_sched_scan()
8759 request->relative_rssi_set = true; in nl80211_parse_sched_scan()
8762 if (request->relative_rssi_set && in nl80211_parse_sched_scan()
8768 request->rssi_adjust.band = rssi_adjust->band; in nl80211_parse_sched_scan()
8769 request->rssi_adjust.delta = rssi_adjust->delta; in nl80211_parse_sched_scan()
8770 if (!is_band_valid(wiphy, request->rssi_adjust.band)) { in nl80211_parse_sched_scan()
8771 err = -EINVAL; in nl80211_parse_sched_scan()
8780 request->scan_start = jiffies; in nl80211_parse_sched_scan()
8792 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_start_sched_scan()
8793 struct net_device *dev = info->user_ptr[1]; in nl80211_start_sched_scan()
8794 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_start_sched_scan()
8799 if (!rdev->wiphy.max_sched_scan_reqs || !rdev->ops->sched_scan_start) in nl80211_start_sched_scan()
8800 return -EOPNOTSUPP; in nl80211_start_sched_scan()
8802 want_multi = info->attrs[NL80211_ATTR_SCHED_SCAN_MULTI]; in nl80211_start_sched_scan()
8807 sched_scan_req = nl80211_parse_sched_scan(&rdev->wiphy, wdev, in nl80211_start_sched_scan()
8808 info->attrs, in nl80211_start_sched_scan()
8809 rdev->wiphy.max_match_sets); in nl80211_start_sched_scan()
8816 * or if driver does not support multi-scheduled scan in nl80211_start_sched_scan()
8818 if (want_multi && rdev->wiphy.max_sched_scan_reqs > 1) in nl80211_start_sched_scan()
8819 sched_scan_req->reqid = cfg80211_assign_cookie(rdev); in nl80211_start_sched_scan()
8825 sched_scan_req->dev = dev; in nl80211_start_sched_scan()
8826 sched_scan_req->wiphy = &rdev->wiphy; in nl80211_start_sched_scan()
8828 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) in nl80211_start_sched_scan()
8829 sched_scan_req->owner_nlportid = info->snd_portid; in nl80211_start_sched_scan()
8846 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_stop_sched_scan()
8849 if (!rdev->wiphy.max_sched_scan_reqs || !rdev->ops->sched_scan_stop) in nl80211_stop_sched_scan()
8850 return -EOPNOTSUPP; in nl80211_stop_sched_scan()
8852 if (info->attrs[NL80211_ATTR_COOKIE]) { in nl80211_stop_sched_scan()
8853 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); in nl80211_stop_sched_scan()
8857 req = list_first_or_null_rcu(&rdev->sched_scan_req_list, in nl80211_stop_sched_scan()
8860 if (!req || req->reqid || in nl80211_stop_sched_scan()
8861 (req->owner_nlportid && in nl80211_stop_sched_scan()
8862 req->owner_nlportid != info->snd_portid)) in nl80211_stop_sched_scan()
8863 return -ENOENT; in nl80211_stop_sched_scan()
8871 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_start_radar_detection()
8872 struct net_device *dev = info->user_ptr[1]; in nl80211_start_radar_detection()
8873 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_start_radar_detection()
8874 struct wiphy *wiphy = wdev->wiphy; in nl80211_start_radar_detection()
8882 return -EINVAL; in nl80211_start_radar_detection()
8889 return -EBUSY; in nl80211_start_radar_detection()
8891 if (wdev->cac_started) in nl80211_start_radar_detection()
8892 return -EBUSY; in nl80211_start_radar_detection()
8894 err = cfg80211_chandef_dfs_required(wiphy, &chandef, wdev->iftype); in nl80211_start_radar_detection()
8899 return -EINVAL; in nl80211_start_radar_detection()
8902 return -EINVAL; in nl80211_start_radar_detection()
8906 return -EOPNOTSUPP; in nl80211_start_radar_detection()
8908 if (!rdev->ops->start_radar_detection) in nl80211_start_radar_detection()
8909 return -EOPNOTSUPP; in nl80211_start_radar_detection()
8911 cac_time_ms = cfg80211_chandef_dfs_cac_time(&rdev->wiphy, &chandef); in nl80211_start_radar_detection()
8917 wdev->chandef = chandef; in nl80211_start_radar_detection()
8918 wdev->cac_started = true; in nl80211_start_radar_detection()
8919 wdev->cac_start_time = jiffies; in nl80211_start_radar_detection()
8920 wdev->cac_time_ms = cac_time_ms; in nl80211_start_radar_detection()
8928 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_notify_radar_detection()
8929 struct net_device *dev = info->user_ptr[1]; in nl80211_notify_radar_detection()
8930 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_notify_radar_detection()
8931 struct wiphy *wiphy = wdev->wiphy; in nl80211_notify_radar_detection()
8940 return -EINVAL; in nl80211_notify_radar_detection()
8949 err = cfg80211_chandef_dfs_required(wiphy, &chandef, wdev->iftype); in nl80211_notify_radar_detection()
8958 return -EINVAL; in nl80211_notify_radar_detection()
8964 if (chandef.chan->dfs_state == NL80211_DFS_UNAVAILABLE) in nl80211_notify_radar_detection()
8971 rdev->radar_chandef = chandef; in nl80211_notify_radar_detection()
8974 queue_work(cfg80211_wq, &rdev->propagate_radar_detect_wk); in nl80211_notify_radar_detection()
8981 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_channel_switch()
8982 struct net_device *dev = info->user_ptr[1]; in nl80211_channel_switch()
8983 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_channel_switch()
8985 /* csa_attrs is defined static to avoid waste of stack size - this in nl80211_channel_switch()
8995 if (!rdev->ops->channel_switch || in nl80211_channel_switch()
8996 !(rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH)) in nl80211_channel_switch()
8997 return -EOPNOTSUPP; in nl80211_channel_switch()
8999 switch (dev->ieee80211_ptr->iftype) { in nl80211_channel_switch()
9011 if (!wdev->beacon_interval) in nl80211_channel_switch()
9012 return -ENOTCONN; in nl80211_channel_switch()
9015 if (!wdev->ssid_len) in nl80211_channel_switch()
9016 return -ENOTCONN; in nl80211_channel_switch()
9019 if (!wdev->mesh_id_len) in nl80211_channel_switch()
9020 return -ENOTCONN; in nl80211_channel_switch()
9023 return -EOPNOTSUPP; in nl80211_channel_switch()
9027 params.beacon_csa.ftm_responder = -1; in nl80211_channel_switch()
9029 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ] || in nl80211_channel_switch()
9030 !info->attrs[NL80211_ATTR_CH_SWITCH_COUNT]) in nl80211_channel_switch()
9031 return -EINVAL; in nl80211_channel_switch()
9034 if (need_new_beacon && !info->attrs[NL80211_ATTR_CSA_IES]) in nl80211_channel_switch()
9035 return -EINVAL; in nl80211_channel_switch()
9040 cs_count = nla_get_u32(info->attrs[NL80211_ATTR_CH_SWITCH_COUNT]); in nl80211_channel_switch()
9042 return -EINVAL; in nl80211_channel_switch()
9049 err = nl80211_parse_beacon(rdev, info->attrs, &params.beacon_after); in nl80211_channel_switch()
9054 info->attrs[NL80211_ATTR_CSA_IES], in nl80211_channel_switch()
9055 nl80211_policy, info->extack); in nl80211_channel_switch()
9064 return -EINVAL; in nl80211_channel_switch()
9068 return -EINVAL; in nl80211_channel_switch()
9071 if (rdev->wiphy.max_num_csa_counters && in nl80211_channel_switch()
9073 rdev->wiphy.max_num_csa_counters)) in nl80211_channel_switch()
9074 return -EINVAL; in nl80211_channel_switch()
9079 /* sanity checks - counters should fit and be the same */ in nl80211_channel_switch()
9084 return -EINVAL; in nl80211_channel_switch()
9087 return -EINVAL; in nl80211_channel_switch()
9093 return -EINVAL; in nl80211_channel_switch()
9096 if (rdev->wiphy.max_num_csa_counters && in nl80211_channel_switch()
9098 rdev->wiphy.max_num_csa_counters)) in nl80211_channel_switch()
9099 return -EINVAL; in nl80211_channel_switch()
9104 /* sanity checks - counters should fit and be the same */ in nl80211_channel_switch()
9109 return -EINVAL; in nl80211_channel_switch()
9113 return -EINVAL; in nl80211_channel_switch()
9122 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &params.chandef, in nl80211_channel_switch()
9123 wdev->iftype)) in nl80211_channel_switch()
9124 return -EINVAL; in nl80211_channel_switch()
9126 err = cfg80211_chandef_dfs_required(wdev->wiphy, in nl80211_channel_switch()
9128 wdev->iftype); in nl80211_channel_switch()
9135 !nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS])) { in nl80211_channel_switch()
9136 return -EINVAL; in nl80211_channel_switch()
9140 if (info->attrs[NL80211_ATTR_CH_SWITCH_BLOCK_TX]) in nl80211_channel_switch()
9156 struct cfg80211_bss *res = &intbss->pub; in nl80211_send_bss()
9163 hdr = nl80211hdr_put(msg, NETLINK_CB(cb->skb).portid, seq, flags, in nl80211_send_bss()
9166 return -1; in nl80211_send_bss()
9170 if (nla_put_u32(msg, NL80211_ATTR_GENERATION, rdev->bss_generation)) in nl80211_send_bss()
9172 if (wdev->netdev && in nl80211_send_bss()
9173 nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex)) in nl80211_send_bss()
9182 if ((!is_zero_ether_addr(res->bssid) && in nl80211_send_bss()
9183 nla_put(msg, NL80211_BSS_BSSID, ETH_ALEN, res->bssid))) in nl80211_send_bss()
9188 if (rcu_access_pointer(res->proberesp_ies) && in nl80211_send_bss()
9195 ies = rcu_dereference(res->ies); in nl80211_send_bss()
9197 if (nla_put_u64_64bit(msg, NL80211_BSS_TSF, ies->tsf, in nl80211_send_bss()
9200 if (ies->len && nla_put(msg, NL80211_BSS_INFORMATION_ELEMENTS, in nl80211_send_bss()
9201 ies->len, ies->data)) in nl80211_send_bss()
9206 ies = rcu_dereference(res->beacon_ies); in nl80211_send_bss()
9207 if (ies && ies->from_beacon) { in nl80211_send_bss()
9208 if (nla_put_u64_64bit(msg, NL80211_BSS_BEACON_TSF, ies->tsf, in nl80211_send_bss()
9211 if (ies->len && nla_put(msg, NL80211_BSS_BEACON_IES, in nl80211_send_bss()
9212 ies->len, ies->data)) in nl80211_send_bss()
9217 if (res->beacon_interval && in nl80211_send_bss()
9218 nla_put_u16(msg, NL80211_BSS_BEACON_INTERVAL, res->beacon_interval)) in nl80211_send_bss()
9220 if (nla_put_u16(msg, NL80211_BSS_CAPABILITY, res->capability) || in nl80211_send_bss()
9221 nla_put_u32(msg, NL80211_BSS_FREQUENCY, res->channel->center_freq) || in nl80211_send_bss()
9223 res->channel->freq_offset) || in nl80211_send_bss()
9224 nla_put_u32(msg, NL80211_BSS_CHAN_WIDTH, res->scan_width) || in nl80211_send_bss()
9226 jiffies_to_msecs(jiffies - intbss->ts))) in nl80211_send_bss()
9229 if (intbss->parent_tsf && in nl80211_send_bss()
9231 intbss->parent_tsf, NL80211_BSS_PAD) || in nl80211_send_bss()
9233 intbss->parent_bssid))) in nl80211_send_bss()
9236 if (intbss->ts_boottime && in nl80211_send_bss()
9238 intbss->ts_boottime, NL80211_BSS_PAD)) in nl80211_send_bss()
9241 if (!nl80211_put_signal(msg, intbss->pub.chains, in nl80211_send_bss()
9242 intbss->pub.chain_signal, in nl80211_send_bss()
9246 switch (rdev->wiphy.signal_type) { in nl80211_send_bss()
9248 if (nla_put_u32(msg, NL80211_BSS_SIGNAL_MBM, res->signal)) in nl80211_send_bss()
9252 if (nla_put_u8(msg, NL80211_BSS_SIGNAL_UNSPEC, res->signal)) in nl80211_send_bss()
9259 switch (wdev->iftype) { in nl80211_send_bss()
9262 if (intbss == wdev->current_bss && in nl80211_send_bss()
9268 if (intbss == wdev->current_bss && in nl80211_send_bss()
9286 return -EMSGSIZE; in nl80211_send_bss()
9294 int start = cb->args[2], idx = 0; in nl80211_dump_scan()
9305 spin_lock_bh(&rdev->bss_lock); in nl80211_dump_scan()
9309 * into multiple messages. It is unlikely that any more bss-es will be in nl80211_dump_scan()
9316 cb->seq = rdev->bss_generation; in nl80211_dump_scan()
9318 list_for_each_entry(scan, &rdev->bss_list, list) { in nl80211_dump_scan()
9322 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_dump_scan()
9324 idx--; in nl80211_dump_scan()
9329 spin_unlock_bh(&rdev->bss_lock); in nl80211_dump_scan()
9332 cb->args[2] = idx; in nl80211_dump_scan()
9335 return skb->len; in nl80211_dump_scan()
9347 if (!survey->channel && !allow_radio_stats) in nl80211_send_survey()
9353 return -ENOMEM; in nl80211_send_survey()
9355 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) in nl80211_send_survey()
9362 if (survey->channel && in nl80211_send_survey()
9364 survey->channel->center_freq)) in nl80211_send_survey()
9367 if (survey->channel && survey->channel->freq_offset && in nl80211_send_survey()
9369 survey->channel->freq_offset)) in nl80211_send_survey()
9372 if ((survey->filled & SURVEY_INFO_NOISE_DBM) && in nl80211_send_survey()
9373 nla_put_u8(msg, NL80211_SURVEY_INFO_NOISE, survey->noise)) in nl80211_send_survey()
9375 if ((survey->filled & SURVEY_INFO_IN_USE) && in nl80211_send_survey()
9378 if ((survey->filled & SURVEY_INFO_TIME) && in nl80211_send_survey()
9380 survey->time, NL80211_SURVEY_INFO_PAD)) in nl80211_send_survey()
9382 if ((survey->filled & SURVEY_INFO_TIME_BUSY) && in nl80211_send_survey()
9384 survey->time_busy, NL80211_SURVEY_INFO_PAD)) in nl80211_send_survey()
9386 if ((survey->filled & SURVEY_INFO_TIME_EXT_BUSY) && in nl80211_send_survey()
9388 survey->time_ext_busy, NL80211_SURVEY_INFO_PAD)) in nl80211_send_survey()
9390 if ((survey->filled & SURVEY_INFO_TIME_RX) && in nl80211_send_survey()
9392 survey->time_rx, NL80211_SURVEY_INFO_PAD)) in nl80211_send_survey()
9394 if ((survey->filled & SURVEY_INFO_TIME_TX) && in nl80211_send_survey()
9396 survey->time_tx, NL80211_SURVEY_INFO_PAD)) in nl80211_send_survey()
9398 if ((survey->filled & SURVEY_INFO_TIME_SCAN) && in nl80211_send_survey()
9400 survey->time_scan, NL80211_SURVEY_INFO_PAD)) in nl80211_send_survey()
9402 if ((survey->filled & SURVEY_INFO_TIME_BSS_RX) && in nl80211_send_survey()
9404 survey->time_bss_rx, NL80211_SURVEY_INFO_PAD)) in nl80211_send_survey()
9414 return -EMSGSIZE; in nl80211_send_survey()
9423 int survey_idx = cb->args[2]; in nl80211_dump_survey()
9429 return -ENOMEM; in nl80211_dump_survey()
9439 if (!wdev->netdev) { in nl80211_dump_survey()
9440 res = -EINVAL; in nl80211_dump_survey()
9444 if (!rdev->ops->dump_survey) { in nl80211_dump_survey()
9445 res = -EOPNOTSUPP; in nl80211_dump_survey()
9450 res = rdev_dump_survey(rdev, wdev->netdev, survey_idx, &survey); in nl80211_dump_survey()
9451 if (res == -ENOENT) in nl80211_dump_survey()
9456 /* don't send disabled channels, but do send non-channel data */ in nl80211_dump_survey()
9458 survey.channel->flags & IEEE80211_CHAN_DISABLED) { in nl80211_dump_survey()
9464 NETLINK_CB(cb->skb).portid, in nl80211_dump_survey()
9465 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_dump_survey()
9466 wdev->netdev, radio_stats, &survey) < 0) in nl80211_dump_survey()
9472 cb->args[2] = survey_idx; in nl80211_dump_survey()
9473 res = skb->len; in nl80211_dump_survey()
9489 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_authenticate()
9490 struct net_device *dev = info->user_ptr[1]; in nl80211_authenticate()
9499 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_authenticate()
9500 return -EINVAL; in nl80211_authenticate()
9502 if (!info->attrs[NL80211_ATTR_AUTH_TYPE]) in nl80211_authenticate()
9503 return -EINVAL; in nl80211_authenticate()
9505 if (!info->attrs[NL80211_ATTR_SSID]) in nl80211_authenticate()
9506 return -EINVAL; in nl80211_authenticate()
9508 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ]) in nl80211_authenticate()
9509 return -EINVAL; in nl80211_authenticate()
9516 if (key.type != -1 && key.type != NL80211_KEYTYPE_GROUP) in nl80211_authenticate()
9517 return -EINVAL; in nl80211_authenticate()
9519 return -EINVAL; in nl80211_authenticate()
9524 return -EINVAL; in nl80211_authenticate()
9526 return -EINVAL; in nl80211_authenticate()
9536 for (i = 0; i < rdev->wiphy.n_cipher_suites; i++) { in nl80211_authenticate()
9537 if (key.p.cipher == rdev->wiphy.cipher_suites[i]) { in nl80211_authenticate()
9543 return -EINVAL; in nl80211_authenticate()
9546 if (!rdev->ops->auth) in nl80211_authenticate()
9547 return -EOPNOTSUPP; in nl80211_authenticate()
9549 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_authenticate()
9550 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_authenticate()
9551 return -EOPNOTSUPP; in nl80211_authenticate()
9553 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_authenticate()
9554 freq = MHZ_TO_KHZ(nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ])); in nl80211_authenticate()
9555 if (info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]) in nl80211_authenticate()
9557 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]); in nl80211_authenticate()
9559 chan = nl80211_get_valid_chan(&rdev->wiphy, freq); in nl80211_authenticate()
9561 return -EINVAL; in nl80211_authenticate()
9563 ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); in nl80211_authenticate()
9564 ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); in nl80211_authenticate()
9566 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_authenticate()
9567 ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_authenticate()
9568 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_authenticate()
9571 auth_type = nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]); in nl80211_authenticate()
9573 return -EINVAL; in nl80211_authenticate()
9579 !info->attrs[NL80211_ATTR_AUTH_DATA]) in nl80211_authenticate()
9580 return -EINVAL; in nl80211_authenticate()
9582 if (info->attrs[NL80211_ATTR_AUTH_DATA]) { in nl80211_authenticate()
9587 return -EINVAL; in nl80211_authenticate()
9588 auth_data = nla_data(info->attrs[NL80211_ATTR_AUTH_DATA]); in nl80211_authenticate()
9589 auth_data_len = nla_len(info->attrs[NL80211_ATTR_AUTH_DATA]); in nl80211_authenticate()
9592 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; in nl80211_authenticate()
9601 wdev_lock(dev->ieee80211_ptr); in nl80211_authenticate()
9606 wdev_unlock(dev->ieee80211_ptr); in nl80211_authenticate()
9613 if (!info->attrs[NL80211_ATTR_SOCKET_OWNER]) { in validate_pae_over_nl80211()
9615 return -EINVAL; in validate_pae_over_nl80211()
9618 if (!rdev->ops->tx_control_port || in validate_pae_over_nl80211()
9619 !wiphy_ext_feature_isset(&rdev->wiphy, in validate_pae_over_nl80211()
9621 return -EOPNOTSUPP; in validate_pae_over_nl80211()
9633 settings->control_port = info->attrs[NL80211_ATTR_CONTROL_PORT]; in nl80211_crypto_settings()
9635 if (info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]) { in nl80211_crypto_settings()
9639 info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]); in nl80211_crypto_settings()
9640 settings->control_port_ethertype = cpu_to_be16(proto); in nl80211_crypto_settings()
9641 if (!(rdev->wiphy.flags & WIPHY_FLAG_CONTROL_PORT_PROTOCOL) && in nl80211_crypto_settings()
9643 return -EINVAL; in nl80211_crypto_settings()
9644 if (info->attrs[NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT]) in nl80211_crypto_settings()
9645 settings->control_port_no_encrypt = true; in nl80211_crypto_settings()
9647 settings->control_port_ethertype = cpu_to_be16(ETH_P_PAE); in nl80211_crypto_settings()
9649 if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) { in nl80211_crypto_settings()
9655 settings->control_port_over_nl80211 = true; in nl80211_crypto_settings()
9657 if (info->attrs[NL80211_ATTR_CONTROL_PORT_NO_PREAUTH]) in nl80211_crypto_settings()
9658 settings->control_port_no_preauth = true; in nl80211_crypto_settings()
9661 if (info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]) { in nl80211_crypto_settings()
9665 data = nla_data(info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]); in nl80211_crypto_settings()
9666 len = nla_len(info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]); in nl80211_crypto_settings()
9667 settings->n_ciphers_pairwise = len / sizeof(u32); in nl80211_crypto_settings()
9670 return -EINVAL; in nl80211_crypto_settings()
9672 if (settings->n_ciphers_pairwise > cipher_limit) in nl80211_crypto_settings()
9673 return -EINVAL; in nl80211_crypto_settings()
9675 memcpy(settings->ciphers_pairwise, data, len); in nl80211_crypto_settings()
9677 for (i = 0; i < settings->n_ciphers_pairwise; i++) in nl80211_crypto_settings()
9679 &rdev->wiphy, in nl80211_crypto_settings()
9680 settings->ciphers_pairwise[i])) in nl80211_crypto_settings()
9681 return -EINVAL; in nl80211_crypto_settings()
9684 if (info->attrs[NL80211_ATTR_CIPHER_SUITE_GROUP]) { in nl80211_crypto_settings()
9685 settings->cipher_group = in nl80211_crypto_settings()
9686 nla_get_u32(info->attrs[NL80211_ATTR_CIPHER_SUITE_GROUP]); in nl80211_crypto_settings()
9687 if (!cfg80211_supported_cipher_suite(&rdev->wiphy, in nl80211_crypto_settings()
9688 settings->cipher_group)) in nl80211_crypto_settings()
9689 return -EINVAL; in nl80211_crypto_settings()
9692 if (info->attrs[NL80211_ATTR_WPA_VERSIONS]) { in nl80211_crypto_settings()
9693 settings->wpa_versions = in nl80211_crypto_settings()
9694 nla_get_u32(info->attrs[NL80211_ATTR_WPA_VERSIONS]); in nl80211_crypto_settings()
9695 if (!nl80211_valid_wpa_versions(settings->wpa_versions)) in nl80211_crypto_settings()
9696 return -EINVAL; in nl80211_crypto_settings()
9699 if (info->attrs[NL80211_ATTR_AKM_SUITES]) { in nl80211_crypto_settings()
9703 data = nla_data(info->attrs[NL80211_ATTR_AKM_SUITES]); in nl80211_crypto_settings()
9704 len = nla_len(info->attrs[NL80211_ATTR_AKM_SUITES]); in nl80211_crypto_settings()
9705 settings->n_akm_suites = len / sizeof(u32); in nl80211_crypto_settings()
9708 return -EINVAL; in nl80211_crypto_settings()
9710 if (settings->n_akm_suites > NL80211_MAX_NR_AKM_SUITES) in nl80211_crypto_settings()
9711 return -EINVAL; in nl80211_crypto_settings()
9713 memcpy(settings->akm_suites, data, len); in nl80211_crypto_settings()
9716 if (info->attrs[NL80211_ATTR_PMK]) { in nl80211_crypto_settings()
9717 if (nla_len(info->attrs[NL80211_ATTR_PMK]) != WLAN_PMK_LEN) in nl80211_crypto_settings()
9718 return -EINVAL; in nl80211_crypto_settings()
9719 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_crypto_settings()
9721 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_crypto_settings()
9723 return -EINVAL; in nl80211_crypto_settings()
9724 settings->psk = nla_data(info->attrs[NL80211_ATTR_PMK]); in nl80211_crypto_settings()
9727 if (info->attrs[NL80211_ATTR_SAE_PASSWORD]) { in nl80211_crypto_settings()
9728 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_crypto_settings()
9730 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_crypto_settings()
9732 return -EINVAL; in nl80211_crypto_settings()
9733 settings->sae_pwd = in nl80211_crypto_settings()
9734 nla_data(info->attrs[NL80211_ATTR_SAE_PASSWORD]); in nl80211_crypto_settings()
9735 settings->sae_pwd_len = in nl80211_crypto_settings()
9736 nla_len(info->attrs[NL80211_ATTR_SAE_PASSWORD]); in nl80211_crypto_settings()
9744 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_associate()
9745 struct net_device *dev = info->user_ptr[1]; in nl80211_associate()
9752 if (dev->ieee80211_ptr->conn_owner_nlportid && in nl80211_associate()
9753 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) in nl80211_associate()
9754 return -EPERM; in nl80211_associate()
9756 if (!info->attrs[NL80211_ATTR_MAC] || in nl80211_associate()
9757 !info->attrs[NL80211_ATTR_SSID] || in nl80211_associate()
9758 !info->attrs[NL80211_ATTR_WIPHY_FREQ]) in nl80211_associate()
9759 return -EINVAL; in nl80211_associate()
9761 if (!rdev->ops->assoc) in nl80211_associate()
9762 return -EOPNOTSUPP; in nl80211_associate()
9764 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_associate()
9765 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_associate()
9766 return -EOPNOTSUPP; in nl80211_associate()
9768 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_associate()
9770 freq = MHZ_TO_KHZ(nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ])); in nl80211_associate()
9771 if (info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]) in nl80211_associate()
9773 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]); in nl80211_associate()
9774 chan = nl80211_get_valid_chan(&rdev->wiphy, freq); in nl80211_associate()
9776 return -EINVAL; in nl80211_associate()
9778 ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); in nl80211_associate()
9779 ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); in nl80211_associate()
9781 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_associate()
9782 req.ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_associate()
9783 req.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_associate()
9786 if (info->attrs[NL80211_ATTR_USE_MFP]) { in nl80211_associate()
9788 nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]); in nl80211_associate()
9792 return -EINVAL; in nl80211_associate()
9795 if (info->attrs[NL80211_ATTR_PREV_BSSID]) in nl80211_associate()
9796 req.prev_bssid = nla_data(info->attrs[NL80211_ATTR_PREV_BSSID]); in nl80211_associate()
9798 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HT])) in nl80211_associate()
9801 if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) in nl80211_associate()
9803 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]), in nl80211_associate()
9806 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) { in nl80211_associate()
9807 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) in nl80211_associate()
9808 return -EINVAL; in nl80211_associate()
9810 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]), in nl80211_associate()
9814 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_VHT])) in nl80211_associate()
9817 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) in nl80211_associate()
9819 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]), in nl80211_associate()
9822 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) { in nl80211_associate()
9823 if (!info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) in nl80211_associate()
9824 return -EINVAL; in nl80211_associate()
9826 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]), in nl80211_associate()
9830 if (nla_get_flag(info->attrs[NL80211_ATTR_USE_RRM])) { in nl80211_associate()
9831 if (!((rdev->wiphy.features & in nl80211_associate()
9833 (rdev->wiphy.features & NL80211_FEATURE_QUIET)) && in nl80211_associate()
9834 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_associate()
9836 return -EINVAL; in nl80211_associate()
9840 if (info->attrs[NL80211_ATTR_FILS_KEK]) { in nl80211_associate()
9841 req.fils_kek = nla_data(info->attrs[NL80211_ATTR_FILS_KEK]); in nl80211_associate()
9842 req.fils_kek_len = nla_len(info->attrs[NL80211_ATTR_FILS_KEK]); in nl80211_associate()
9843 if (!info->attrs[NL80211_ATTR_FILS_NONCES]) in nl80211_associate()
9844 return -EINVAL; in nl80211_associate()
9846 nla_data(info->attrs[NL80211_ATTR_FILS_NONCES]); in nl80211_associate()
9849 if (info->attrs[NL80211_ATTR_S1G_CAPABILITY_MASK]) { in nl80211_associate()
9850 if (!info->attrs[NL80211_ATTR_S1G_CAPABILITY]) in nl80211_associate()
9851 return -EINVAL; in nl80211_associate()
9853 nla_data(info->attrs[NL80211_ATTR_S1G_CAPABILITY_MASK]), in nl80211_associate()
9857 if (info->attrs[NL80211_ATTR_S1G_CAPABILITY]) { in nl80211_associate()
9858 if (!info->attrs[NL80211_ATTR_S1G_CAPABILITY_MASK]) in nl80211_associate()
9859 return -EINVAL; in nl80211_associate()
9861 nla_data(info->attrs[NL80211_ATTR_S1G_CAPABILITY]), in nl80211_associate()
9867 wdev_lock(dev->ieee80211_ptr); in nl80211_associate()
9872 if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) { in nl80211_associate()
9873 dev->ieee80211_ptr->conn_owner_nlportid = in nl80211_associate()
9874 info->snd_portid; in nl80211_associate()
9875 memcpy(dev->ieee80211_ptr->disconnect_bssid, in nl80211_associate()
9879 wdev_unlock(dev->ieee80211_ptr); in nl80211_associate()
9887 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_deauthenticate()
9888 struct net_device *dev = info->user_ptr[1]; in nl80211_deauthenticate()
9894 if (dev->ieee80211_ptr->conn_owner_nlportid && in nl80211_deauthenticate()
9895 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) in nl80211_deauthenticate()
9896 return -EPERM; in nl80211_deauthenticate()
9898 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_deauthenticate()
9899 return -EINVAL; in nl80211_deauthenticate()
9901 if (!info->attrs[NL80211_ATTR_REASON_CODE]) in nl80211_deauthenticate()
9902 return -EINVAL; in nl80211_deauthenticate()
9904 if (!rdev->ops->deauth) in nl80211_deauthenticate()
9905 return -EOPNOTSUPP; in nl80211_deauthenticate()
9907 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_deauthenticate()
9908 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_deauthenticate()
9909 return -EOPNOTSUPP; in nl80211_deauthenticate()
9911 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_deauthenticate()
9913 reason_code = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); in nl80211_deauthenticate()
9916 return -EINVAL; in nl80211_deauthenticate()
9919 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_deauthenticate()
9920 ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_deauthenticate()
9921 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_deauthenticate()
9924 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; in nl80211_deauthenticate()
9926 wdev_lock(dev->ieee80211_ptr); in nl80211_deauthenticate()
9929 wdev_unlock(dev->ieee80211_ptr); in nl80211_deauthenticate()
9935 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_disassociate()
9936 struct net_device *dev = info->user_ptr[1]; in nl80211_disassociate()
9942 if (dev->ieee80211_ptr->conn_owner_nlportid && in nl80211_disassociate()
9943 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) in nl80211_disassociate()
9944 return -EPERM; in nl80211_disassociate()
9946 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_disassociate()
9947 return -EINVAL; in nl80211_disassociate()
9949 if (!info->attrs[NL80211_ATTR_REASON_CODE]) in nl80211_disassociate()
9950 return -EINVAL; in nl80211_disassociate()
9952 if (!rdev->ops->disassoc) in nl80211_disassociate()
9953 return -EOPNOTSUPP; in nl80211_disassociate()
9955 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_disassociate()
9956 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_disassociate()
9957 return -EOPNOTSUPP; in nl80211_disassociate()
9959 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_disassociate()
9961 reason_code = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); in nl80211_disassociate()
9964 return -EINVAL; in nl80211_disassociate()
9967 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_disassociate()
9968 ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_disassociate()
9969 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_disassociate()
9972 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; in nl80211_disassociate()
9974 wdev_lock(dev->ieee80211_ptr); in nl80211_disassociate()
9977 wdev_unlock(dev->ieee80211_ptr); in nl80211_disassociate()
9986 struct wiphy *wiphy = &rdev->wiphy; in nl80211_parse_mcast_rate()
9993 sband = wiphy->bands[band]; in nl80211_parse_mcast_rate()
9997 for (i = 0; i < sband->n_bitrates; i++) { in nl80211_parse_mcast_rate()
9998 if (sband->bitrates[i].bitrate == rateval) { in nl80211_parse_mcast_rate()
10011 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_join_ibss()
10012 struct net_device *dev = info->user_ptr[1]; in nl80211_join_ibss()
10020 if (!info->attrs[NL80211_ATTR_SSID] || in nl80211_join_ibss()
10021 !nla_len(info->attrs[NL80211_ATTR_SSID])) in nl80211_join_ibss()
10022 return -EINVAL; in nl80211_join_ibss()
10026 if (info->attrs[NL80211_ATTR_BEACON_INTERVAL]) in nl80211_join_ibss()
10028 nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]); in nl80211_join_ibss()
10035 if (!rdev->ops->join_ibss) in nl80211_join_ibss()
10036 return -EOPNOTSUPP; in nl80211_join_ibss()
10038 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC) in nl80211_join_ibss()
10039 return -EOPNOTSUPP; in nl80211_join_ibss()
10041 wiphy = &rdev->wiphy; in nl80211_join_ibss()
10043 if (info->attrs[NL80211_ATTR_MAC]) { in nl80211_join_ibss()
10044 ibss.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_join_ibss()
10047 return -EINVAL; in nl80211_join_ibss()
10049 ibss.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); in nl80211_join_ibss()
10050 ibss.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); in nl80211_join_ibss()
10052 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_join_ibss()
10053 ibss.ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_join_ibss()
10054 ibss.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_join_ibss()
10061 if (!cfg80211_reg_can_beacon(&rdev->wiphy, &ibss.chandef, in nl80211_join_ibss()
10063 return -EINVAL; in nl80211_join_ibss()
10065 switch (ibss.chandef.width) { in nl80211_join_ibss()
10072 if (!(rdev->wiphy.features & NL80211_FEATURE_HT_IBSS)) in nl80211_join_ibss()
10073 return -EINVAL; in nl80211_join_ibss()
10078 if (!(rdev->wiphy.features & NL80211_FEATURE_HT_IBSS)) in nl80211_join_ibss()
10079 return -EINVAL; in nl80211_join_ibss()
10080 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_join_ibss()
10082 return -EINVAL; in nl80211_join_ibss()
10085 return -EINVAL; in nl80211_join_ibss()
10088 ibss.channel_fixed = !!info->attrs[NL80211_ATTR_FREQ_FIXED]; in nl80211_join_ibss()
10089 ibss.privacy = !!info->attrs[NL80211_ATTR_PRIVACY]; in nl80211_join_ibss()
10091 if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) { in nl80211_join_ibss()
10093 nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); in nl80211_join_ibss()
10095 nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); in nl80211_join_ibss()
10097 wiphy->bands[ibss.chandef.chan->band]; in nl80211_join_ibss()
10105 if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) in nl80211_join_ibss()
10107 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]), in nl80211_join_ibss()
10110 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) { in nl80211_join_ibss()
10111 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) in nl80211_join_ibss()
10112 return -EINVAL; in nl80211_join_ibss()
10114 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]), in nl80211_join_ibss()
10118 if (info->attrs[NL80211_ATTR_MCAST_RATE] && in nl80211_join_ibss()
10120 nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]))) in nl80211_join_ibss()
10121 return -EINVAL; in nl80211_join_ibss()
10123 if (ibss.privacy && info->attrs[NL80211_ATTR_KEYS]) { in nl80211_join_ibss()
10130 if ((ibss.chandef.width != NL80211_CHAN_WIDTH_20_NOHT) && in nl80211_join_ibss()
10133 return -EINVAL; in nl80211_join_ibss()
10138 nla_get_flag(info->attrs[NL80211_ATTR_CONTROL_PORT]); in nl80211_join_ibss()
10140 if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) { in nl80211_join_ibss()
10152 nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS]); in nl80211_join_ibss()
10154 wdev_lock(dev->ieee80211_ptr); in nl80211_join_ibss()
10158 else if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) in nl80211_join_ibss()
10159 dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid; in nl80211_join_ibss()
10160 wdev_unlock(dev->ieee80211_ptr); in nl80211_join_ibss()
10167 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_leave_ibss()
10168 struct net_device *dev = info->user_ptr[1]; in nl80211_leave_ibss()
10170 if (!rdev->ops->leave_ibss) in nl80211_leave_ibss()
10171 return -EOPNOTSUPP; in nl80211_leave_ibss()
10173 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC) in nl80211_leave_ibss()
10174 return -EOPNOTSUPP; in nl80211_leave_ibss()
10181 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_mcast_rate()
10182 struct net_device *dev = info->user_ptr[1]; in nl80211_set_mcast_rate()
10187 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC && in nl80211_set_mcast_rate()
10188 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT && in nl80211_set_mcast_rate()
10189 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_OCB) in nl80211_set_mcast_rate()
10190 return -EOPNOTSUPP; in nl80211_set_mcast_rate()
10192 if (!rdev->ops->set_mcast_rate) in nl80211_set_mcast_rate()
10193 return -EOPNOTSUPP; in nl80211_set_mcast_rate()
10197 if (!info->attrs[NL80211_ATTR_MCAST_RATE]) in nl80211_set_mcast_rate()
10198 return -EINVAL; in nl80211_set_mcast_rate()
10200 nla_rate = nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]); in nl80211_set_mcast_rate()
10202 return -EINVAL; in nl80211_set_mcast_rate()
10231 if (nla_put_u32(skb, NL80211_ATTR_WIPHY, rdev->wiphy_idx)) in __cfg80211_alloc_vendor_skb()
10236 info->vendor_id)) in __cfg80211_alloc_vendor_skb()
10239 info->subcmd)) in __cfg80211_alloc_vendor_skb()
10247 if (wdev->netdev && in __cfg80211_alloc_vendor_skb()
10249 wdev->netdev->ifindex)) in __cfg80211_alloc_vendor_skb()
10257 ((void **)skb->cb)[0] = rdev; in __cfg80211_alloc_vendor_skb()
10258 ((void **)skb->cb)[1] = hdr; in __cfg80211_alloc_vendor_skb()
10259 ((void **)skb->cb)[2] = data; in __cfg80211_alloc_vendor_skb()
10281 if (WARN_ON(vendor_event_idx != -1)) in __cfg80211_alloc_event_skb()
10287 vendor_event_idx >= wiphy->n_vendor_events)) in __cfg80211_alloc_event_skb()
10289 info = &wiphy->vendor_events[vendor_event_idx]; in __cfg80211_alloc_event_skb()
10303 struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0]; in __cfg80211_send_event_skb()
10304 void *hdr = ((void **)skb->cb)[1]; in __cfg80211_send_event_skb()
10306 struct nlattr *data = ((void **)skb->cb)[2]; in __cfg80211_send_event_skb()
10310 memset(skb->cb, 0, sizeof(skb->cb)); in __cfg80211_send_event_skb()
10315 if (nlhdr->nlmsg_pid) { in __cfg80211_send_event_skb()
10316 genlmsg_unicast(wiphy_net(&rdev->wiphy), skb, in __cfg80211_send_event_skb()
10317 nlhdr->nlmsg_pid); in __cfg80211_send_event_skb()
10319 if (data->nla_type == NL80211_ATTR_VENDOR_DATA) in __cfg80211_send_event_skb()
10322 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), in __cfg80211_send_event_skb()
10331 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_testmode_do()
10333 __cfg80211_wdev_from_attrs(genl_info_net(info), info->attrs); in nl80211_testmode_do()
10336 if (!rdev->ops->testmode_cmd) in nl80211_testmode_do()
10337 return -EOPNOTSUPP; in nl80211_testmode_do()
10341 if (err != -EINVAL) in nl80211_testmode_do()
10344 } else if (wdev->wiphy != &rdev->wiphy) { in nl80211_testmode_do()
10345 return -EINVAL; in nl80211_testmode_do()
10348 if (!info->attrs[NL80211_ATTR_TESTDATA]) in nl80211_testmode_do()
10349 return -EINVAL; in nl80211_testmode_do()
10351 rdev->cur_cmd_info = info; in nl80211_testmode_do()
10353 nla_data(info->attrs[NL80211_ATTR_TESTDATA]), in nl80211_testmode_do()
10354 nla_len(info->attrs[NL80211_ATTR_TESTDATA])); in nl80211_testmode_do()
10355 rdev->cur_cmd_info = NULL; in nl80211_testmode_do()
10372 if (cb->args[0]) { in nl80211_testmode_dump()
10377 phy_idx = cb->args[0] - 1; in nl80211_testmode_dump()
10381 err = -ENOENT; in nl80211_testmode_dump()
10388 err = -ENOMEM; in nl80211_testmode_dump()
10392 err = nlmsg_parse_deprecated(cb->nlh, in nl80211_testmode_dump()
10399 rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk), attrbuf); in nl80211_testmode_dump()
10404 phy_idx = rdev->wiphy_idx; in nl80211_testmode_dump()
10407 cb->args[1] = (long)attrbuf[NL80211_ATTR_TESTDATA]; in nl80211_testmode_dump()
10410 if (cb->args[1]) { in nl80211_testmode_dump()
10411 data = nla_data((void *)cb->args[1]); in nl80211_testmode_dump()
10412 data_len = nla_len((void *)cb->args[1]); in nl80211_testmode_dump()
10415 if (!rdev->ops->testmode_dump) { in nl80211_testmode_dump()
10416 err = -EOPNOTSUPP; in nl80211_testmode_dump()
10421 void *hdr = nl80211hdr_put(skb, NETLINK_CB(cb->skb).portid, in nl80211_testmode_dump()
10422 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_testmode_dump()
10442 if (err == -ENOBUFS || err == -ENOENT) { in nl80211_testmode_dump()
10453 err = skb->len; in nl80211_testmode_dump()
10455 cb->args[0] = phy_idx + 1; in nl80211_testmode_dump()
10465 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_connect()
10466 struct net_device *dev = info->user_ptr[1]; in nl80211_connect()
10475 if (!info->attrs[NL80211_ATTR_SSID] || in nl80211_connect()
10476 !nla_len(info->attrs[NL80211_ATTR_SSID])) in nl80211_connect()
10477 return -EINVAL; in nl80211_connect()
10479 if (info->attrs[NL80211_ATTR_AUTH_TYPE]) { in nl80211_connect()
10481 nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]); in nl80211_connect()
10484 return -EINVAL; in nl80211_connect()
10488 connect.privacy = info->attrs[NL80211_ATTR_PRIVACY]; in nl80211_connect()
10490 if (info->attrs[NL80211_ATTR_WANT_1X_4WAY_HS] && in nl80211_connect()
10491 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_connect()
10493 return -EINVAL; in nl80211_connect()
10494 connect.want_1x = info->attrs[NL80211_ATTR_WANT_1X_4WAY_HS]; in nl80211_connect()
10501 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_connect()
10502 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_connect()
10503 return -EOPNOTSUPP; in nl80211_connect()
10505 wiphy = &rdev->wiphy; in nl80211_connect()
10507 connect.bg_scan_period = -1; in nl80211_connect()
10508 if (info->attrs[NL80211_ATTR_BG_SCAN_PERIOD] && in nl80211_connect()
10509 (wiphy->flags & WIPHY_FLAG_SUPPORTS_FW_ROAM)) { in nl80211_connect()
10511 nla_get_u16(info->attrs[NL80211_ATTR_BG_SCAN_PERIOD]); in nl80211_connect()
10514 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_connect()
10515 connect.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_connect()
10516 else if (info->attrs[NL80211_ATTR_MAC_HINT]) in nl80211_connect()
10518 nla_data(info->attrs[NL80211_ATTR_MAC_HINT]); in nl80211_connect()
10519 connect.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); in nl80211_connect()
10520 connect.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); in nl80211_connect()
10522 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_connect()
10523 connect.ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_connect()
10524 connect.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_connect()
10527 if (info->attrs[NL80211_ATTR_USE_MFP]) { in nl80211_connect()
10528 connect.mfp = nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]); in nl80211_connect()
10530 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_connect()
10532 return -EOPNOTSUPP; in nl80211_connect()
10537 if (info->attrs[NL80211_ATTR_PREV_BSSID]) in nl80211_connect()
10539 nla_data(info->attrs[NL80211_ATTR_PREV_BSSID]); in nl80211_connect()
10541 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) in nl80211_connect()
10543 info->attrs[NL80211_ATTR_WIPHY_FREQ])); in nl80211_connect()
10544 if (info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]) in nl80211_connect()
10546 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]); in nl80211_connect()
10551 return -EINVAL; in nl80211_connect()
10552 } else if (info->attrs[NL80211_ATTR_WIPHY_FREQ_HINT]) { in nl80211_connect()
10553 freq = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_HINT]); in nl80211_connect()
10557 return -EINVAL; in nl80211_connect()
10560 if (info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]) { in nl80211_connect()
10562 nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]); in nl80211_connect()
10564 if (info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]) in nl80211_connect()
10566 nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]); in nl80211_connect()
10569 if (connect.privacy && info->attrs[NL80211_ATTR_KEYS]) { in nl80211_connect()
10575 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HT])) in nl80211_connect()
10578 if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) in nl80211_connect()
10580 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]), in nl80211_connect()
10583 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) { in nl80211_connect()
10584 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) { in nl80211_connect()
10586 return -EINVAL; in nl80211_connect()
10589 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]), in nl80211_connect()
10593 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_VHT])) in nl80211_connect()
10596 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) in nl80211_connect()
10598 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]), in nl80211_connect()
10601 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) { in nl80211_connect()
10602 if (!info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) { in nl80211_connect()
10604 return -EINVAL; in nl80211_connect()
10607 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]), in nl80211_connect()
10611 if (nla_get_flag(info->attrs[NL80211_ATTR_USE_RRM])) { in nl80211_connect()
10612 if (!((rdev->wiphy.features & in nl80211_connect()
10614 (rdev->wiphy.features & NL80211_FEATURE_QUIET)) && in nl80211_connect()
10615 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_connect()
10618 return -EINVAL; in nl80211_connect()
10623 connect.pbss = nla_get_flag(info->attrs[NL80211_ATTR_PBSS]); in nl80211_connect()
10624 if (connect.pbss && !rdev->wiphy.bands[NL80211_BAND_60GHZ]) { in nl80211_connect()
10626 return -EOPNOTSUPP; in nl80211_connect()
10629 if (info->attrs[NL80211_ATTR_BSS_SELECT]) { in nl80211_connect()
10630 /* bss selection makes no sense if bssid is set */ in nl80211_connect()
10633 return -EINVAL; in nl80211_connect()
10636 err = parse_bss_select(info->attrs[NL80211_ATTR_BSS_SELECT], in nl80211_connect()
10644 if (wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_connect()
10646 info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] && in nl80211_connect()
10647 info->attrs[NL80211_ATTR_FILS_ERP_REALM] && in nl80211_connect()
10648 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] && in nl80211_connect()
10649 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { in nl80211_connect()
10651 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); in nl80211_connect()
10653 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); in nl80211_connect()
10655 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); in nl80211_connect()
10657 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); in nl80211_connect()
10660 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM]); in nl80211_connect()
10662 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); in nl80211_connect()
10664 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); in nl80211_connect()
10665 } else if (info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] || in nl80211_connect()
10666 info->attrs[NL80211_ATTR_FILS_ERP_REALM] || in nl80211_connect()
10667 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] || in nl80211_connect()
10668 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { in nl80211_connect()
10670 return -EINVAL; in nl80211_connect()
10673 if (nla_get_flag(info->attrs[NL80211_ATTR_EXTERNAL_AUTH_SUPPORT])) { in nl80211_connect()
10674 if (!info->attrs[NL80211_ATTR_SOCKET_OWNER]) { in nl80211_connect()
10678 return -EINVAL; in nl80211_connect()
10683 wdev_lock(dev->ieee80211_ptr); in nl80211_connect()
10690 if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) { in nl80211_connect()
10691 dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid; in nl80211_connect()
10693 memcpy(dev->ieee80211_ptr->disconnect_bssid, in nl80211_connect()
10696 eth_zero_addr(dev->ieee80211_ptr->disconnect_bssid); in nl80211_connect()
10699 wdev_unlock(dev->ieee80211_ptr); in nl80211_connect()
10708 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_update_connect_params()
10709 struct net_device *dev = info->user_ptr[1]; in nl80211_update_connect_params()
10710 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_update_connect_params()
10716 if (!rdev->ops->update_connect_params) in nl80211_update_connect_params()
10717 return -EOPNOTSUPP; in nl80211_update_connect_params()
10719 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_update_connect_params()
10720 connect.ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_update_connect_params()
10721 connect.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_update_connect_params()
10725 fils_sk_offload = wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_update_connect_params()
10729 * when driver supports fils-sk offload all attributes must be in nl80211_update_connect_params()
10730 * provided. So the else covers "fils-sk-not-all" and in nl80211_update_connect_params()
10731 * "no-fils-sk-any". in nl80211_update_connect_params()
10734 info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] && in nl80211_update_connect_params()
10735 info->attrs[NL80211_ATTR_FILS_ERP_REALM] && in nl80211_update_connect_params()
10736 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] && in nl80211_update_connect_params()
10737 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { in nl80211_update_connect_params()
10739 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); in nl80211_update_connect_params()
10741 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); in nl80211_update_connect_params()
10743 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); in nl80211_update_connect_params()
10745 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); in nl80211_update_connect_params()
10748 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM]); in nl80211_update_connect_params()
10750 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); in nl80211_update_connect_params()
10752 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); in nl80211_update_connect_params()
10754 } else if (info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] || in nl80211_update_connect_params()
10755 info->attrs[NL80211_ATTR_FILS_ERP_REALM] || in nl80211_update_connect_params()
10756 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] || in nl80211_update_connect_params()
10757 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { in nl80211_update_connect_params()
10758 return -EINVAL; in nl80211_update_connect_params()
10761 if (info->attrs[NL80211_ATTR_AUTH_TYPE]) { in nl80211_update_connect_params()
10762 auth_type = nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]); in nl80211_update_connect_params()
10765 return -EINVAL; in nl80211_update_connect_params()
10769 return -EINVAL; in nl80211_update_connect_params()
10775 wdev_lock(dev->ieee80211_ptr); in nl80211_update_connect_params()
10776 if (!wdev->current_bss) in nl80211_update_connect_params()
10777 ret = -ENOLINK; in nl80211_update_connect_params()
10780 wdev_unlock(dev->ieee80211_ptr); in nl80211_update_connect_params()
10787 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_disconnect()
10788 struct net_device *dev = info->user_ptr[1]; in nl80211_disconnect()
10792 if (dev->ieee80211_ptr->conn_owner_nlportid && in nl80211_disconnect()
10793 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) in nl80211_disconnect()
10794 return -EPERM; in nl80211_disconnect()
10796 if (!info->attrs[NL80211_ATTR_REASON_CODE]) in nl80211_disconnect()
10799 reason = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); in nl80211_disconnect()
10802 return -EINVAL; in nl80211_disconnect()
10804 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_disconnect()
10805 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_disconnect()
10806 return -EOPNOTSUPP; in nl80211_disconnect()
10808 wdev_lock(dev->ieee80211_ptr); in nl80211_disconnect()
10810 wdev_unlock(dev->ieee80211_ptr); in nl80211_disconnect()
10816 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_wiphy_netns()
10820 if (info->attrs[NL80211_ATTR_PID]) { in nl80211_wiphy_netns()
10821 u32 pid = nla_get_u32(info->attrs[NL80211_ATTR_PID]); in nl80211_wiphy_netns()
10824 } else if (info->attrs[NL80211_ATTR_NETNS_FD]) { in nl80211_wiphy_netns()
10825 u32 fd = nla_get_u32(info->attrs[NL80211_ATTR_NETNS_FD]); in nl80211_wiphy_netns()
10829 return -EINVAL; in nl80211_wiphy_netns()
10838 if (!net_eq(wiphy_net(&rdev->wiphy), net)) in nl80211_wiphy_netns()
10847 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_setdel_pmksa()
10850 struct net_device *dev = info->user_ptr[1]; in nl80211_setdel_pmksa()
10855 if (!info->attrs[NL80211_ATTR_PMKID]) in nl80211_setdel_pmksa()
10856 return -EINVAL; in nl80211_setdel_pmksa()
10858 pmksa.pmkid = nla_data(info->attrs[NL80211_ATTR_PMKID]); in nl80211_setdel_pmksa()
10860 if (info->attrs[NL80211_ATTR_MAC]) { in nl80211_setdel_pmksa()
10861 pmksa.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_setdel_pmksa()
10862 } else if (info->attrs[NL80211_ATTR_SSID] && in nl80211_setdel_pmksa()
10863 info->attrs[NL80211_ATTR_FILS_CACHE_ID] && in nl80211_setdel_pmksa()
10864 (info->genlhdr->cmd == NL80211_CMD_DEL_PMKSA || in nl80211_setdel_pmksa()
10865 info->attrs[NL80211_ATTR_PMK])) { in nl80211_setdel_pmksa()
10866 pmksa.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); in nl80211_setdel_pmksa()
10867 pmksa.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); in nl80211_setdel_pmksa()
10869 nla_data(info->attrs[NL80211_ATTR_FILS_CACHE_ID]); in nl80211_setdel_pmksa()
10871 return -EINVAL; in nl80211_setdel_pmksa()
10873 if (info->attrs[NL80211_ATTR_PMK]) { in nl80211_setdel_pmksa()
10874 pmksa.pmk = nla_data(info->attrs[NL80211_ATTR_PMK]); in nl80211_setdel_pmksa()
10875 pmksa.pmk_len = nla_len(info->attrs[NL80211_ATTR_PMK]); in nl80211_setdel_pmksa()
10878 if (info->attrs[NL80211_ATTR_PMK_LIFETIME]) in nl80211_setdel_pmksa()
10880 nla_get_u32(info->attrs[NL80211_ATTR_PMK_LIFETIME]); in nl80211_setdel_pmksa()
10882 if (info->attrs[NL80211_ATTR_PMK_REAUTH_THRESHOLD]) in nl80211_setdel_pmksa()
10885 info->attrs[NL80211_ATTR_PMK_REAUTH_THRESHOLD]); in nl80211_setdel_pmksa()
10887 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_setdel_pmksa()
10888 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT && in nl80211_setdel_pmksa()
10889 !(dev->ieee80211_ptr->iftype == NL80211_IFTYPE_AP && in nl80211_setdel_pmksa()
10890 wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_setdel_pmksa()
10892 return -EOPNOTSUPP; in nl80211_setdel_pmksa()
10894 switch (info->genlhdr->cmd) { in nl80211_setdel_pmksa()
10896 rdev_ops = rdev->ops->set_pmksa; in nl80211_setdel_pmksa()
10899 rdev_ops = rdev->ops->del_pmksa; in nl80211_setdel_pmksa()
10907 return -EOPNOTSUPP; in nl80211_setdel_pmksa()
10909 return rdev_ops(&rdev->wiphy, dev, &pmksa); in nl80211_setdel_pmksa()
10914 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_flush_pmksa()
10915 struct net_device *dev = info->user_ptr[1]; in nl80211_flush_pmksa()
10917 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_flush_pmksa()
10918 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_flush_pmksa()
10919 return -EOPNOTSUPP; in nl80211_flush_pmksa()
10921 if (!rdev->ops->flush_pmksa) in nl80211_flush_pmksa()
10922 return -EOPNOTSUPP; in nl80211_flush_pmksa()
10929 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_tdls_mgmt()
10930 struct net_device *dev = info->user_ptr[1]; in nl80211_tdls_mgmt()
10937 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) || in nl80211_tdls_mgmt()
10938 !rdev->ops->tdls_mgmt) in nl80211_tdls_mgmt()
10939 return -EOPNOTSUPP; in nl80211_tdls_mgmt()
10941 if (!info->attrs[NL80211_ATTR_TDLS_ACTION] || in nl80211_tdls_mgmt()
10942 !info->attrs[NL80211_ATTR_STATUS_CODE] || in nl80211_tdls_mgmt()
10943 !info->attrs[NL80211_ATTR_TDLS_DIALOG_TOKEN] || in nl80211_tdls_mgmt()
10944 !info->attrs[NL80211_ATTR_IE] || in nl80211_tdls_mgmt()
10945 !info->attrs[NL80211_ATTR_MAC]) in nl80211_tdls_mgmt()
10946 return -EINVAL; in nl80211_tdls_mgmt()
10948 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_tdls_mgmt()
10949 action_code = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_ACTION]); in nl80211_tdls_mgmt()
10950 status_code = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]); in nl80211_tdls_mgmt()
10951 dialog_token = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_DIALOG_TOKEN]); in nl80211_tdls_mgmt()
10952 initiator = nla_get_flag(info->attrs[NL80211_ATTR_TDLS_INITIATOR]); in nl80211_tdls_mgmt()
10953 if (info->attrs[NL80211_ATTR_TDLS_PEER_CAPABILITY]) in nl80211_tdls_mgmt()
10955 nla_get_u32(info->attrs[NL80211_ATTR_TDLS_PEER_CAPABILITY]); in nl80211_tdls_mgmt()
10960 nla_data(info->attrs[NL80211_ATTR_IE]), in nl80211_tdls_mgmt()
10961 nla_len(info->attrs[NL80211_ATTR_IE])); in nl80211_tdls_mgmt()
10966 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_tdls_oper()
10967 struct net_device *dev = info->user_ptr[1]; in nl80211_tdls_oper()
10971 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) || in nl80211_tdls_oper()
10972 !rdev->ops->tdls_oper) in nl80211_tdls_oper()
10973 return -EOPNOTSUPP; in nl80211_tdls_oper()
10975 if (!info->attrs[NL80211_ATTR_TDLS_OPERATION] || in nl80211_tdls_oper()
10976 !info->attrs[NL80211_ATTR_MAC]) in nl80211_tdls_oper()
10977 return -EINVAL; in nl80211_tdls_oper()
10979 operation = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_OPERATION]); in nl80211_tdls_oper()
10980 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_tdls_oper()
10988 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_remain_on_channel()
10989 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_remain_on_channel()
10998 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ] || in nl80211_remain_on_channel()
10999 !info->attrs[NL80211_ATTR_DURATION]) in nl80211_remain_on_channel()
11000 return -EINVAL; in nl80211_remain_on_channel()
11002 duration = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]); in nl80211_remain_on_channel()
11004 if (!rdev->ops->remain_on_channel || in nl80211_remain_on_channel()
11005 !(rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL)) in nl80211_remain_on_channel()
11006 return -EOPNOTSUPP; in nl80211_remain_on_channel()
11013 duration > rdev->wiphy.max_remain_on_channel_duration) in nl80211_remain_on_channel()
11014 return -EINVAL; in nl80211_remain_on_channel()
11022 !cfg80211_chandef_identical(&wdev->chandef, &chandef)) { in nl80211_remain_on_channel()
11023 compat_chandef = cfg80211_chandef_compatible(&wdev->chandef, in nl80211_remain_on_channel()
11027 return -EBUSY; in nl80211_remain_on_channel()
11034 return -ENOMEM; in nl80211_remain_on_channel()
11036 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_remain_on_channel()
11039 err = -ENOBUFS; in nl80211_remain_on_channel()
11058 err = -ENOBUFS; in nl80211_remain_on_channel()
11067 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_cancel_remain_on_channel()
11068 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_cancel_remain_on_channel()
11071 if (!info->attrs[NL80211_ATTR_COOKIE]) in nl80211_cancel_remain_on_channel()
11072 return -EINVAL; in nl80211_cancel_remain_on_channel()
11074 if (!rdev->ops->cancel_remain_on_channel) in nl80211_cancel_remain_on_channel()
11075 return -EOPNOTSUPP; in nl80211_cancel_remain_on_channel()
11077 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); in nl80211_cancel_remain_on_channel()
11086 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_tx_bitrate_mask()
11087 struct net_device *dev = info->user_ptr[1]; in nl80211_set_tx_bitrate_mask()
11090 if (!rdev->ops->set_bitrate_mask) in nl80211_set_tx_bitrate_mask()
11091 return -EOPNOTSUPP; in nl80211_set_tx_bitrate_mask()
11093 err = nl80211_parse_tx_bitrate_mask(info, info->attrs, in nl80211_set_tx_bitrate_mask()
11104 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_register_mgmt()
11105 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_register_mgmt()
11108 if (!info->attrs[NL80211_ATTR_FRAME_MATCH]) in nl80211_register_mgmt()
11109 return -EINVAL; in nl80211_register_mgmt()
11111 if (info->attrs[NL80211_ATTR_FRAME_TYPE]) in nl80211_register_mgmt()
11112 frame_type = nla_get_u16(info->attrs[NL80211_ATTR_FRAME_TYPE]); in nl80211_register_mgmt()
11114 switch (wdev->iftype) { in nl80211_register_mgmt()
11126 return -EOPNOTSUPP; in nl80211_register_mgmt()
11130 if (!rdev->ops->mgmt_tx) in nl80211_register_mgmt()
11131 return -EOPNOTSUPP; in nl80211_register_mgmt()
11133 if (info->attrs[NL80211_ATTR_RECEIVE_MULTICAST] && in nl80211_register_mgmt()
11134 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_register_mgmt()
11138 return -EOPNOTSUPP; in nl80211_register_mgmt()
11141 return cfg80211_mlme_register_mgmt(wdev, info->snd_portid, frame_type, in nl80211_register_mgmt()
11142 nla_data(info->attrs[NL80211_ATTR_FRAME_MATCH]), in nl80211_register_mgmt()
11143 nla_len(info->attrs[NL80211_ATTR_FRAME_MATCH]), in nl80211_register_mgmt()
11144 info->attrs[NL80211_ATTR_RECEIVE_MULTICAST], in nl80211_register_mgmt()
11145 info->extack); in nl80211_register_mgmt()
11150 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_tx_mgmt()
11151 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_tx_mgmt()
11159 info->attrs[NL80211_ATTR_DONT_WAIT_FOR_ACK], in nl80211_tx_mgmt()
11162 if (!info->attrs[NL80211_ATTR_FRAME]) in nl80211_tx_mgmt()
11163 return -EINVAL; in nl80211_tx_mgmt()
11165 if (!rdev->ops->mgmt_tx) in nl80211_tx_mgmt()
11166 return -EOPNOTSUPP; in nl80211_tx_mgmt()
11168 switch (wdev->iftype) { in nl80211_tx_mgmt()
11170 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ]) in nl80211_tx_mgmt()
11171 return -EINVAL; in nl80211_tx_mgmt()
11182 return -EOPNOTSUPP; in nl80211_tx_mgmt()
11185 if (info->attrs[NL80211_ATTR_DURATION]) { in nl80211_tx_mgmt()
11186 if (!(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX)) in nl80211_tx_mgmt()
11187 return -EINVAL; in nl80211_tx_mgmt()
11188 params.wait = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]); in nl80211_tx_mgmt()
11195 params.wait > rdev->wiphy.max_remain_on_channel_duration) in nl80211_tx_mgmt()
11196 return -EINVAL; in nl80211_tx_mgmt()
11199 params.offchan = info->attrs[NL80211_ATTR_OFFCHANNEL_TX_OK]; in nl80211_tx_mgmt()
11201 if (params.offchan && !(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX)) in nl80211_tx_mgmt()
11202 return -EINVAL; in nl80211_tx_mgmt()
11204 params.no_cck = nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]); in nl80211_tx_mgmt()
11210 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { in nl80211_tx_mgmt()
11217 return -EINVAL; in nl80211_tx_mgmt()
11222 return -EBUSY; in nl80211_tx_mgmt()
11226 params.buf = nla_data(info->attrs[NL80211_ATTR_FRAME]); in nl80211_tx_mgmt()
11227 params.len = nla_len(info->attrs[NL80211_ATTR_FRAME]); in nl80211_tx_mgmt()
11229 if (info->attrs[NL80211_ATTR_CSA_C_OFFSETS_TX]) { in nl80211_tx_mgmt()
11230 int len = nla_len(info->attrs[NL80211_ATTR_CSA_C_OFFSETS_TX]); in nl80211_tx_mgmt()
11234 return -EINVAL; in nl80211_tx_mgmt()
11238 nla_data(info->attrs[NL80211_ATTR_CSA_C_OFFSETS_TX]); in nl80211_tx_mgmt()
11243 return -EINVAL; in nl80211_tx_mgmt()
11250 return -ENOMEM; in nl80211_tx_mgmt()
11252 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_tx_mgmt()
11255 err = -ENOBUFS; in nl80211_tx_mgmt()
11277 err = -ENOBUFS; in nl80211_tx_mgmt()
11285 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_tx_mgmt_cancel_wait()
11286 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_tx_mgmt_cancel_wait()
11289 if (!info->attrs[NL80211_ATTR_COOKIE]) in nl80211_tx_mgmt_cancel_wait()
11290 return -EINVAL; in nl80211_tx_mgmt_cancel_wait()
11292 if (!rdev->ops->mgmt_tx_cancel_wait) in nl80211_tx_mgmt_cancel_wait()
11293 return -EOPNOTSUPP; in nl80211_tx_mgmt_cancel_wait()
11295 switch (wdev->iftype) { in nl80211_tx_mgmt_cancel_wait()
11306 return -EOPNOTSUPP; in nl80211_tx_mgmt_cancel_wait()
11309 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); in nl80211_tx_mgmt_cancel_wait()
11316 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_power_save()
11318 struct net_device *dev = info->user_ptr[1]; in nl80211_set_power_save()
11323 if (!info->attrs[NL80211_ATTR_PS_STATE]) in nl80211_set_power_save()
11324 return -EINVAL; in nl80211_set_power_save()
11326 ps_state = nla_get_u32(info->attrs[NL80211_ATTR_PS_STATE]); in nl80211_set_power_save()
11328 wdev = dev->ieee80211_ptr; in nl80211_set_power_save()
11330 if (!rdev->ops->set_power_mgmt) in nl80211_set_power_save()
11331 return -EOPNOTSUPP; in nl80211_set_power_save()
11335 if (state == wdev->ps) in nl80211_set_power_save()
11338 err = rdev_set_power_mgmt(rdev, dev, state, wdev->ps_timeout); in nl80211_set_power_save()
11340 wdev->ps = state; in nl80211_set_power_save()
11346 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_power_save()
11349 struct net_device *dev = info->user_ptr[1]; in nl80211_get_power_save()
11354 wdev = dev->ieee80211_ptr; in nl80211_get_power_save()
11356 if (!rdev->ops->set_power_mgmt) in nl80211_get_power_save()
11357 return -EOPNOTSUPP; in nl80211_get_power_save()
11361 return -ENOMEM; in nl80211_get_power_save()
11363 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_power_save()
11366 err = -ENOBUFS; in nl80211_get_power_save()
11370 if (wdev->ps) in nl80211_get_power_save()
11382 err = -ENOBUFS; in nl80211_get_power_save()
11402 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_cqm_txe()
11403 struct net_device *dev = info->user_ptr[1]; in nl80211_set_cqm_txe()
11404 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_cqm_txe()
11407 return -EINVAL; in nl80211_set_cqm_txe()
11409 if (!rdev->ops->set_cqm_txe_config) in nl80211_set_cqm_txe()
11410 return -EOPNOTSUPP; in nl80211_set_cqm_txe()
11412 if (wdev->iftype != NL80211_IFTYPE_STATION && in nl80211_set_cqm_txe()
11413 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_set_cqm_txe()
11414 return -EOPNOTSUPP; in nl80211_set_cqm_txe()
11422 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_cqm_rssi_update()
11429 if (!wdev->cqm_config) in cfg80211_cqm_rssi_update()
11438 if (!wdev->cqm_config->last_rssi_event_value && wdev->current_bss && in cfg80211_cqm_rssi_update()
11439 rdev->ops->get_station) { in cfg80211_cqm_rssi_update()
11443 mac_addr = wdev->current_bss->pub.bssid; in cfg80211_cqm_rssi_update()
11451 wdev->cqm_config->last_rssi_event_value = in cfg80211_cqm_rssi_update()
11455 last = wdev->cqm_config->last_rssi_event_value; in cfg80211_cqm_rssi_update()
11456 hyst = wdev->cqm_config->rssi_hyst; in cfg80211_cqm_rssi_update()
11457 n = wdev->cqm_config->n_rssi_thresholds; in cfg80211_cqm_rssi_update()
11461 if (last < wdev->cqm_config->rssi_thresholds[i]) in cfg80211_cqm_rssi_update()
11465 low_index = i - 1; in cfg80211_cqm_rssi_update()
11468 low = wdev->cqm_config->rssi_thresholds[low_index] - hyst; in cfg80211_cqm_rssi_update()
11474 high = wdev->cqm_config->rssi_thresholds[i] + hyst - 1; in cfg80211_cqm_rssi_update()
11486 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_cqm_rssi()
11487 struct net_device *dev = info->user_ptr[1]; in nl80211_set_cqm_rssi()
11488 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_cqm_rssi()
11495 return -EINVAL; in nl80211_set_cqm_rssi()
11500 if (wdev->iftype != NL80211_IFTYPE_STATION && in nl80211_set_cqm_rssi()
11501 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_set_cqm_rssi()
11502 return -EOPNOTSUPP; in nl80211_set_cqm_rssi()
11508 if (n_thresholds <= 1 && rdev->ops->set_cqm_rssi_config) { in nl80211_set_cqm_rssi()
11516 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_set_cqm_rssi()
11518 return -EOPNOTSUPP; in nl80211_set_cqm_rssi()
11530 err = -ENOMEM; in nl80211_set_cqm_rssi()
11534 cqm_config->rssi_hyst = hysteresis; in nl80211_set_cqm_rssi()
11535 cqm_config->n_rssi_thresholds = n_thresholds; in nl80211_set_cqm_rssi()
11536 memcpy(cqm_config->rssi_thresholds, thresholds, in nl80211_set_cqm_rssi()
11539 wdev->cqm_config = cqm_config; in nl80211_set_cqm_rssi()
11556 cqm = info->attrs[NL80211_ATTR_CQM]; in nl80211_set_cqm()
11558 return -EINVAL; in nl80211_set_cqm()
11562 info->extack); in nl80211_set_cqm()
11574 return -EINVAL; in nl80211_set_cqm()
11590 return -EINVAL; in nl80211_set_cqm()
11595 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_join_ocb()
11596 struct net_device *dev = info->user_ptr[1]; in nl80211_join_ocb()
11609 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_leave_ocb()
11610 struct net_device *dev = info->user_ptr[1]; in nl80211_leave_ocb()
11617 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_join_mesh()
11618 struct net_device *dev = info->user_ptr[1]; in nl80211_join_mesh()
11627 if (info->attrs[NL80211_ATTR_MESH_CONFIG]) { in nl80211_join_mesh()
11634 if (!info->attrs[NL80211_ATTR_MESH_ID] || in nl80211_join_mesh()
11635 !nla_len(info->attrs[NL80211_ATTR_MESH_ID])) in nl80211_join_mesh()
11636 return -EINVAL; in nl80211_join_mesh()
11638 setup.mesh_id = nla_data(info->attrs[NL80211_ATTR_MESH_ID]); in nl80211_join_mesh()
11639 setup.mesh_id_len = nla_len(info->attrs[NL80211_ATTR_MESH_ID]); in nl80211_join_mesh()
11641 if (info->attrs[NL80211_ATTR_MCAST_RATE] && in nl80211_join_mesh()
11643 nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]))) in nl80211_join_mesh()
11644 return -EINVAL; in nl80211_join_mesh()
11646 if (info->attrs[NL80211_ATTR_BEACON_INTERVAL]) { in nl80211_join_mesh()
11648 nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]); in nl80211_join_mesh()
11657 if (info->attrs[NL80211_ATTR_DTIM_PERIOD]) { in nl80211_join_mesh()
11659 nla_get_u32(info->attrs[NL80211_ATTR_DTIM_PERIOD]); in nl80211_join_mesh()
11661 return -EINVAL; in nl80211_join_mesh()
11664 if (info->attrs[NL80211_ATTR_MESH_SETUP]) { in nl80211_join_mesh()
11674 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { in nl80211_join_mesh()
11683 if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) { in nl80211_join_mesh()
11684 u8 *rates = nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); in nl80211_join_mesh()
11686 nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); in nl80211_join_mesh()
11690 return -EINVAL; in nl80211_join_mesh()
11692 sband = rdev->wiphy.bands[setup.chandef.chan->band]; in nl80211_join_mesh()
11700 if (info->attrs[NL80211_ATTR_TX_RATES]) { in nl80211_join_mesh()
11701 err = nl80211_parse_tx_bitrate_mask(info, info->attrs, in nl80211_join_mesh()
11709 return -EINVAL; in nl80211_join_mesh()
11711 err = validate_beacon_tx_rate(rdev, setup.chandef.chan->band, in nl80211_join_mesh()
11718 nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS]); in nl80211_join_mesh()
11720 if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) { in nl80211_join_mesh()
11729 wdev_lock(dev->ieee80211_ptr); in nl80211_join_mesh()
11731 if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) in nl80211_join_mesh()
11732 dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid; in nl80211_join_mesh()
11733 wdev_unlock(dev->ieee80211_ptr); in nl80211_join_mesh()
11740 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_leave_mesh()
11741 struct net_device *dev = info->user_ptr[1]; in nl80211_leave_mesh()
11750 struct cfg80211_wowlan *wowlan = rdev->wiphy.wowlan_config; in nl80211_send_wowlan_patterns()
11754 if (!wowlan->n_patterns) in nl80211_send_wowlan_patterns()
11759 return -ENOBUFS; in nl80211_send_wowlan_patterns()
11761 for (i = 0; i < wowlan->n_patterns; i++) { in nl80211_send_wowlan_patterns()
11764 return -ENOBUFS; in nl80211_send_wowlan_patterns()
11765 pat_len = wowlan->patterns[i].pattern_len; in nl80211_send_wowlan_patterns()
11767 wowlan->patterns[i].mask) || in nl80211_send_wowlan_patterns()
11769 wowlan->patterns[i].pattern) || in nl80211_send_wowlan_patterns()
11771 wowlan->patterns[i].pkt_offset)) in nl80211_send_wowlan_patterns()
11772 return -ENOBUFS; in nl80211_send_wowlan_patterns()
11791 return -ENOBUFS; in nl80211_send_wowlan_tcp()
11793 if (nla_put_in_addr(msg, NL80211_WOWLAN_TCP_SRC_IPV4, tcp->src) || in nl80211_send_wowlan_tcp()
11794 nla_put_in_addr(msg, NL80211_WOWLAN_TCP_DST_IPV4, tcp->dst) || in nl80211_send_wowlan_tcp()
11795 nla_put(msg, NL80211_WOWLAN_TCP_DST_MAC, ETH_ALEN, tcp->dst_mac) || in nl80211_send_wowlan_tcp()
11796 nla_put_u16(msg, NL80211_WOWLAN_TCP_SRC_PORT, tcp->src_port) || in nl80211_send_wowlan_tcp()
11797 nla_put_u16(msg, NL80211_WOWLAN_TCP_DST_PORT, tcp->dst_port) || in nl80211_send_wowlan_tcp()
11799 tcp->payload_len, tcp->payload) || in nl80211_send_wowlan_tcp()
11801 tcp->data_interval) || in nl80211_send_wowlan_tcp()
11803 tcp->wake_len, tcp->wake_data) || in nl80211_send_wowlan_tcp()
11805 DIV_ROUND_UP(tcp->wake_len, 8), tcp->wake_mask)) in nl80211_send_wowlan_tcp()
11806 return -ENOBUFS; in nl80211_send_wowlan_tcp()
11808 if (tcp->payload_seq.len && in nl80211_send_wowlan_tcp()
11810 sizeof(tcp->payload_seq), &tcp->payload_seq)) in nl80211_send_wowlan_tcp()
11811 return -ENOBUFS; in nl80211_send_wowlan_tcp()
11813 if (tcp->payload_tok.len && in nl80211_send_wowlan_tcp()
11815 sizeof(tcp->payload_tok) + tcp->tokens_size, in nl80211_send_wowlan_tcp()
11816 &tcp->payload_tok)) in nl80211_send_wowlan_tcp()
11817 return -ENOBUFS; in nl80211_send_wowlan_tcp()
11835 return -ENOBUFS; in nl80211_send_wowlan_nd()
11837 if (req->n_scan_plans == 1 && in nl80211_send_wowlan_nd()
11839 req->scan_plans[0].interval * 1000)) in nl80211_send_wowlan_nd()
11840 return -ENOBUFS; in nl80211_send_wowlan_nd()
11842 if (nla_put_u32(msg, NL80211_ATTR_SCHED_SCAN_DELAY, req->delay)) in nl80211_send_wowlan_nd()
11843 return -ENOBUFS; in nl80211_send_wowlan_nd()
11845 if (req->relative_rssi_set) { in nl80211_send_wowlan_nd()
11849 req->relative_rssi)) in nl80211_send_wowlan_nd()
11850 return -ENOBUFS; in nl80211_send_wowlan_nd()
11852 rssi_adjust.band = req->rssi_adjust.band; in nl80211_send_wowlan_nd()
11853 rssi_adjust.delta = req->rssi_adjust.delta; in nl80211_send_wowlan_nd()
11856 return -ENOBUFS; in nl80211_send_wowlan_nd()
11861 return -ENOBUFS; in nl80211_send_wowlan_nd()
11863 for (i = 0; i < req->n_channels; i++) { in nl80211_send_wowlan_nd()
11864 if (nla_put_u32(msg, i, req->channels[i]->center_freq)) in nl80211_send_wowlan_nd()
11865 return -ENOBUFS; in nl80211_send_wowlan_nd()
11870 if (req->n_match_sets) { in nl80211_send_wowlan_nd()
11874 return -ENOBUFS; in nl80211_send_wowlan_nd()
11876 for (i = 0; i < req->n_match_sets; i++) { in nl80211_send_wowlan_nd()
11879 return -ENOBUFS; in nl80211_send_wowlan_nd()
11882 req->match_sets[i].ssid.ssid_len, in nl80211_send_wowlan_nd()
11883 req->match_sets[i].ssid.ssid)) in nl80211_send_wowlan_nd()
11884 return -ENOBUFS; in nl80211_send_wowlan_nd()
11892 return -ENOBUFS; in nl80211_send_wowlan_nd()
11894 for (i = 0; i < req->n_scan_plans; i++) { in nl80211_send_wowlan_nd()
11897 return -ENOBUFS; in nl80211_send_wowlan_nd()
11900 req->scan_plans[i].interval) || in nl80211_send_wowlan_nd()
11901 (req->scan_plans[i].iterations && in nl80211_send_wowlan_nd()
11903 req->scan_plans[i].iterations))) in nl80211_send_wowlan_nd()
11904 return -ENOBUFS; in nl80211_send_wowlan_nd()
11916 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_wowlan()
11921 if (!rdev->wiphy.wowlan) in nl80211_get_wowlan()
11922 return -EOPNOTSUPP; in nl80211_get_wowlan()
11924 if (rdev->wiphy.wowlan_config && rdev->wiphy.wowlan_config->tcp) { in nl80211_get_wowlan()
11926 size += rdev->wiphy.wowlan_config->tcp->tokens_size + in nl80211_get_wowlan()
11927 rdev->wiphy.wowlan_config->tcp->payload_len + in nl80211_get_wowlan()
11928 rdev->wiphy.wowlan_config->tcp->wake_len + in nl80211_get_wowlan()
11929 rdev->wiphy.wowlan_config->tcp->wake_len / 8; in nl80211_get_wowlan()
11934 return -ENOMEM; in nl80211_get_wowlan()
11936 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_wowlan()
11941 if (rdev->wiphy.wowlan_config) { in nl80211_get_wowlan()
11949 if ((rdev->wiphy.wowlan_config->any && in nl80211_get_wowlan()
11951 (rdev->wiphy.wowlan_config->disconnect && in nl80211_get_wowlan()
11953 (rdev->wiphy.wowlan_config->magic_pkt && in nl80211_get_wowlan()
11955 (rdev->wiphy.wowlan_config->gtk_rekey_failure && in nl80211_get_wowlan()
11957 (rdev->wiphy.wowlan_config->eap_identity_req && in nl80211_get_wowlan()
11959 (rdev->wiphy.wowlan_config->four_way_handshake && in nl80211_get_wowlan()
11961 (rdev->wiphy.wowlan_config->rfkill_release && in nl80211_get_wowlan()
11969 rdev->wiphy.wowlan_config->tcp)) in nl80211_get_wowlan()
11974 rdev->wiphy.wowlan_config->nd_config)) in nl80211_get_wowlan()
11985 return -ENOBUFS; in nl80211_get_wowlan()
12000 if (!rdev->wiphy.wowlan->tcp) in nl80211_parse_wowlan_tcp()
12001 return -EINVAL; in nl80211_parse_wowlan_tcp()
12016 return -EINVAL; in nl80211_parse_wowlan_tcp()
12019 if (data_size > rdev->wiphy.wowlan->tcp->data_payload_max) in nl80211_parse_wowlan_tcp()
12020 return -EINVAL; in nl80211_parse_wowlan_tcp()
12023 rdev->wiphy.wowlan->tcp->data_interval_max || in nl80211_parse_wowlan_tcp()
12025 return -EINVAL; in nl80211_parse_wowlan_tcp()
12028 if (wake_size > rdev->wiphy.wowlan->tcp->wake_payload_max) in nl80211_parse_wowlan_tcp()
12029 return -EINVAL; in nl80211_parse_wowlan_tcp()
12033 return -EINVAL; in nl80211_parse_wowlan_tcp()
12039 tokens_size = tokln - sizeof(*tok); in nl80211_parse_wowlan_tcp()
12041 if (!tok->len || tokens_size % tok->len) in nl80211_parse_wowlan_tcp()
12042 return -EINVAL; in nl80211_parse_wowlan_tcp()
12043 if (!rdev->wiphy.wowlan->tcp->tok) in nl80211_parse_wowlan_tcp()
12044 return -EINVAL; in nl80211_parse_wowlan_tcp()
12045 if (tok->len > rdev->wiphy.wowlan->tcp->tok->max_len) in nl80211_parse_wowlan_tcp()
12046 return -EINVAL; in nl80211_parse_wowlan_tcp()
12047 if (tok->len < rdev->wiphy.wowlan->tcp->tok->min_len) in nl80211_parse_wowlan_tcp()
12048 return -EINVAL; in nl80211_parse_wowlan_tcp()
12049 if (tokens_size > rdev->wiphy.wowlan->tcp->tok->bufsize) in nl80211_parse_wowlan_tcp()
12050 return -EINVAL; in nl80211_parse_wowlan_tcp()
12051 if (tok->offset + tok->len > data_size) in nl80211_parse_wowlan_tcp()
12052 return -EINVAL; in nl80211_parse_wowlan_tcp()
12057 if (!rdev->wiphy.wowlan->tcp->seq) in nl80211_parse_wowlan_tcp()
12058 return -EINVAL; in nl80211_parse_wowlan_tcp()
12059 if (seq->len == 0 || seq->len > 4) in nl80211_parse_wowlan_tcp()
12060 return -EINVAL; in nl80211_parse_wowlan_tcp()
12061 if (seq->len + seq->offset > data_size) in nl80211_parse_wowlan_tcp()
12062 return -EINVAL; in nl80211_parse_wowlan_tcp()
12072 return -ENOMEM; in nl80211_parse_wowlan_tcp()
12073 cfg->src = nla_get_in_addr(tb[NL80211_WOWLAN_TCP_SRC_IPV4]); in nl80211_parse_wowlan_tcp()
12074 cfg->dst = nla_get_in_addr(tb[NL80211_WOWLAN_TCP_DST_IPV4]); in nl80211_parse_wowlan_tcp()
12075 memcpy(cfg->dst_mac, nla_data(tb[NL80211_WOWLAN_TCP_DST_MAC]), in nl80211_parse_wowlan_tcp()
12083 err = __sock_create(wiphy_net(&rdev->wiphy), PF_INET, SOCK_STREAM, in nl80211_parse_wowlan_tcp()
12084 IPPROTO_TCP, &cfg->sock, 1); in nl80211_parse_wowlan_tcp()
12089 if (inet_csk_get_port(cfg->sock->sk, port)) { in nl80211_parse_wowlan_tcp()
12090 sock_release(cfg->sock); in nl80211_parse_wowlan_tcp()
12092 return -EADDRINUSE; in nl80211_parse_wowlan_tcp()
12094 cfg->src_port = inet_sk(cfg->sock->sk)->inet_num; in nl80211_parse_wowlan_tcp()
12098 return -EINVAL; in nl80211_parse_wowlan_tcp()
12100 cfg->src_port = port; in nl80211_parse_wowlan_tcp()
12103 cfg->dst_port = nla_get_u16(tb[NL80211_WOWLAN_TCP_DST_PORT]); in nl80211_parse_wowlan_tcp()
12104 cfg->payload_len = data_size; in nl80211_parse_wowlan_tcp()
12105 cfg->payload = (u8 *)cfg + sizeof(*cfg) + tokens_size; in nl80211_parse_wowlan_tcp()
12106 memcpy((void *)cfg->payload, in nl80211_parse_wowlan_tcp()
12110 cfg->payload_seq = *seq; in nl80211_parse_wowlan_tcp()
12111 cfg->data_interval = nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]); in nl80211_parse_wowlan_tcp()
12112 cfg->wake_len = wake_size; in nl80211_parse_wowlan_tcp()
12113 cfg->wake_data = (u8 *)cfg + sizeof(*cfg) + tokens_size + data_size; in nl80211_parse_wowlan_tcp()
12114 memcpy((void *)cfg->wake_data, in nl80211_parse_wowlan_tcp()
12117 cfg->wake_mask = (u8 *)cfg + sizeof(*cfg) + tokens_size + in nl80211_parse_wowlan_tcp()
12119 memcpy((void *)cfg->wake_mask, in nl80211_parse_wowlan_tcp()
12123 cfg->tokens_size = tokens_size; in nl80211_parse_wowlan_tcp()
12124 memcpy(&cfg->payload_tok, tok, sizeof(*tok) + tokens_size); in nl80211_parse_wowlan_tcp()
12127 trig->tcp = cfg; in nl80211_parse_wowlan_tcp()
12142 return -ENOMEM; in nl80211_parse_wowlan_nd()
12144 if (!(wowlan->flags & WIPHY_WOWLAN_NET_DETECT)) { in nl80211_parse_wowlan_nd()
12145 err = -EOPNOTSUPP; in nl80211_parse_wowlan_nd()
12154 trig->nd_config = nl80211_parse_sched_scan(&rdev->wiphy, NULL, tb, in nl80211_parse_wowlan_nd()
12155 wowlan->max_nd_match_sets); in nl80211_parse_wowlan_nd()
12156 err = PTR_ERR_OR_ZERO(trig->nd_config); in nl80211_parse_wowlan_nd()
12158 trig->nd_config = NULL; in nl80211_parse_wowlan_nd()
12167 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_wowlan()
12171 const struct wiphy_wowlan_support *wowlan = rdev->wiphy.wowlan; in nl80211_set_wowlan()
12173 bool prev_enabled = rdev->wiphy.wowlan_config; in nl80211_set_wowlan()
12177 return -EOPNOTSUPP; in nl80211_set_wowlan()
12179 if (!info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS]) { in nl80211_set_wowlan()
12181 rdev->wiphy.wowlan_config = NULL; in nl80211_set_wowlan()
12186 info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS], in nl80211_set_wowlan()
12187 nl80211_wowlan_policy, info->extack); in nl80211_set_wowlan()
12192 if (!(wowlan->flags & WIPHY_WOWLAN_ANY)) in nl80211_set_wowlan()
12193 return -EINVAL; in nl80211_set_wowlan()
12198 if (!(wowlan->flags & WIPHY_WOWLAN_DISCONNECT)) in nl80211_set_wowlan()
12199 return -EINVAL; in nl80211_set_wowlan()
12205 if (!(wowlan->flags & WIPHY_WOWLAN_MAGIC_PKT)) in nl80211_set_wowlan()
12206 return -EINVAL; in nl80211_set_wowlan()
12212 return -EINVAL; in nl80211_set_wowlan()
12215 if (!(wowlan->flags & WIPHY_WOWLAN_GTK_REKEY_FAILURE)) in nl80211_set_wowlan()
12216 return -EINVAL; in nl80211_set_wowlan()
12222 if (!(wowlan->flags & WIPHY_WOWLAN_EAP_IDENTITY_REQ)) in nl80211_set_wowlan()
12223 return -EINVAL; in nl80211_set_wowlan()
12229 if (!(wowlan->flags & WIPHY_WOWLAN_4WAY_HANDSHAKE)) in nl80211_set_wowlan()
12230 return -EINVAL; in nl80211_set_wowlan()
12236 if (!(wowlan->flags & WIPHY_WOWLAN_RFKILL_RELEASE)) in nl80211_set_wowlan()
12237 return -EINVAL; in nl80211_set_wowlan()
12253 if (n_patterns > wowlan->n_patterns) in nl80211_set_wowlan()
12254 return -EINVAL; in nl80211_set_wowlan()
12260 return -ENOMEM; in nl80211_set_wowlan()
12273 info->extack); in nl80211_set_wowlan()
12277 err = -EINVAL; in nl80211_set_wowlan()
12285 if (pat_len > wowlan->pattern_max_len || in nl80211_set_wowlan()
12286 pat_len < wowlan->pattern_min_len) in nl80211_set_wowlan()
12294 if (pkt_offset > wowlan->max_pkt_offset) in nl80211_set_wowlan()
12300 err = -ENOMEM; in nl80211_set_wowlan()
12337 * It therefore makes little sense to combine with the more constrained in nl80211_set_wowlan()
12341 err = -EINVAL; in nl80211_set_wowlan()
12347 err = -ENOMEM; in nl80211_set_wowlan()
12351 rdev->wiphy.wowlan_config = ntrig; in nl80211_set_wowlan()
12354 if (rdev->ops->set_wakeup && in nl80211_set_wowlan()
12355 prev_enabled != !!rdev->wiphy.wowlan_config) in nl80211_set_wowlan()
12356 rdev_set_wakeup(rdev, rdev->wiphy.wowlan_config); in nl80211_set_wowlan()
12363 if (new_triggers.tcp && new_triggers.tcp->sock) in nl80211_set_wowlan()
12364 sock_release(new_triggers.tcp->sock); in nl80211_set_wowlan()
12378 if (!rdev->coalesce->n_rules) in nl80211_send_coalesce_rules()
12383 return -ENOBUFS; in nl80211_send_coalesce_rules()
12385 for (i = 0; i < rdev->coalesce->n_rules; i++) { in nl80211_send_coalesce_rules()
12388 return -ENOBUFS; in nl80211_send_coalesce_rules()
12390 rule = &rdev->coalesce->rules[i]; in nl80211_send_coalesce_rules()
12392 rule->delay)) in nl80211_send_coalesce_rules()
12393 return -ENOBUFS; in nl80211_send_coalesce_rules()
12396 rule->condition)) in nl80211_send_coalesce_rules()
12397 return -ENOBUFS; in nl80211_send_coalesce_rules()
12402 return -ENOBUFS; in nl80211_send_coalesce_rules()
12404 for (j = 0; j < rule->n_patterns; j++) { in nl80211_send_coalesce_rules()
12407 return -ENOBUFS; in nl80211_send_coalesce_rules()
12408 pat_len = rule->patterns[j].pattern_len; in nl80211_send_coalesce_rules()
12411 rule->patterns[j].mask) || in nl80211_send_coalesce_rules()
12413 rule->patterns[j].pattern) || in nl80211_send_coalesce_rules()
12415 rule->patterns[j].pkt_offset)) in nl80211_send_coalesce_rules()
12416 return -ENOBUFS; in nl80211_send_coalesce_rules()
12429 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_coalesce()
12433 if (!rdev->wiphy.coalesce) in nl80211_get_coalesce()
12434 return -EOPNOTSUPP; in nl80211_get_coalesce()
12438 return -ENOMEM; in nl80211_get_coalesce()
12440 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_coalesce()
12445 if (rdev->coalesce && nl80211_send_coalesce_rules(msg, rdev)) in nl80211_get_coalesce()
12453 return -ENOBUFS; in nl80211_get_coalesce()
12458 struct cfg80211_coalesce *coalesce = rdev->coalesce; in cfg80211_rdev_free_coalesce()
12465 for (i = 0; i < coalesce->n_rules; i++) { in cfg80211_rdev_free_coalesce()
12466 rule = &coalesce->rules[i]; in cfg80211_rdev_free_coalesce()
12467 for (j = 0; j < rule->n_patterns; j++) in cfg80211_rdev_free_coalesce()
12468 kfree(rule->patterns[j].mask); in cfg80211_rdev_free_coalesce()
12469 kfree(rule->patterns); in cfg80211_rdev_free_coalesce()
12471 kfree(coalesce->rules); in cfg80211_rdev_free_coalesce()
12473 rdev->coalesce = NULL; in cfg80211_rdev_free_coalesce()
12481 const struct wiphy_coalesce_support *coalesce = rdev->wiphy.coalesce; in nl80211_parse_coalesce_rule()
12492 new_rule->delay = in nl80211_parse_coalesce_rule()
12494 if (new_rule->delay > coalesce->max_delay) in nl80211_parse_coalesce_rule()
12495 return -EINVAL; in nl80211_parse_coalesce_rule()
12498 new_rule->condition = in nl80211_parse_coalesce_rule()
12502 return -EINVAL; in nl80211_parse_coalesce_rule()
12507 if (n_patterns > coalesce->n_patterns) in nl80211_parse_coalesce_rule()
12508 return -EINVAL; in nl80211_parse_coalesce_rule()
12510 new_rule->patterns = kcalloc(n_patterns, sizeof(new_rule->patterns[0]), in nl80211_parse_coalesce_rule()
12512 if (!new_rule->patterns) in nl80211_parse_coalesce_rule()
12513 return -ENOMEM; in nl80211_parse_coalesce_rule()
12515 new_rule->n_patterns = n_patterns; in nl80211_parse_coalesce_rule()
12531 return -EINVAL; in nl80211_parse_coalesce_rule()
12535 return -EINVAL; in nl80211_parse_coalesce_rule()
12536 if (pat_len > coalesce->pattern_max_len || in nl80211_parse_coalesce_rule()
12537 pat_len < coalesce->pattern_min_len) in nl80211_parse_coalesce_rule()
12538 return -EINVAL; in nl80211_parse_coalesce_rule()
12544 if (pkt_offset > coalesce->max_pkt_offset) in nl80211_parse_coalesce_rule()
12545 return -EINVAL; in nl80211_parse_coalesce_rule()
12546 new_rule->patterns[i].pkt_offset = pkt_offset; in nl80211_parse_coalesce_rule()
12550 return -ENOMEM; in nl80211_parse_coalesce_rule()
12552 new_rule->patterns[i].mask = mask_pat; in nl80211_parse_coalesce_rule()
12557 new_rule->patterns[i].pattern = mask_pat; in nl80211_parse_coalesce_rule()
12558 new_rule->patterns[i].pattern_len = pat_len; in nl80211_parse_coalesce_rule()
12569 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_coalesce()
12570 const struct wiphy_coalesce_support *coalesce = rdev->wiphy.coalesce; in nl80211_set_coalesce()
12577 if (!rdev->wiphy.coalesce || !rdev->ops->set_coalesce) in nl80211_set_coalesce()
12578 return -EOPNOTSUPP; in nl80211_set_coalesce()
12580 if (!info->attrs[NL80211_ATTR_COALESCE_RULE]) { in nl80211_set_coalesce()
12586 nla_for_each_nested(rule, info->attrs[NL80211_ATTR_COALESCE_RULE], in nl80211_set_coalesce()
12589 if (n_rules > coalesce->n_rules) in nl80211_set_coalesce()
12590 return -EINVAL; in nl80211_set_coalesce()
12595 return -ENOMEM; in nl80211_set_coalesce()
12600 nla_for_each_nested(rule, info->attrs[NL80211_ATTR_COALESCE_RULE], in nl80211_set_coalesce()
12616 err = -ENOMEM; in nl80211_set_coalesce()
12620 rdev->coalesce = n_coalesce; in nl80211_set_coalesce()
12626 for (j = 0; j < tmp_rule->n_patterns; j++) in nl80211_set_coalesce()
12627 kfree(tmp_rule->patterns[j].mask); in nl80211_set_coalesce()
12628 kfree(tmp_rule->patterns); in nl80211_set_coalesce()
12637 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_rekey_data()
12638 struct net_device *dev = info->user_ptr[1]; in nl80211_set_rekey_data()
12639 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_rekey_data()
12644 if (!info->attrs[NL80211_ATTR_REKEY_DATA]) in nl80211_set_rekey_data()
12645 return -EINVAL; in nl80211_set_rekey_data()
12648 info->attrs[NL80211_ATTR_REKEY_DATA], in nl80211_set_rekey_data()
12649 nl80211_rekey_policy, info->extack); in nl80211_set_rekey_data()
12655 return -EINVAL; in nl80211_set_rekey_data()
12657 !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_EXT_KEK_KCK && in nl80211_set_rekey_data()
12659 return -ERANGE; in nl80211_set_rekey_data()
12661 !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_EXT_KEK_KCK && in nl80211_set_rekey_data()
12663 return -ERANGE; in nl80211_set_rekey_data()
12674 if (!wdev->current_bss) { in nl80211_set_rekey_data()
12675 err = -ENOTCONN; in nl80211_set_rekey_data()
12679 if (!rdev->ops->set_rekey_data) { in nl80211_set_rekey_data()
12680 err = -EOPNOTSUPP; in nl80211_set_rekey_data()
12693 struct net_device *dev = info->user_ptr[1]; in nl80211_register_unexpected_frame()
12694 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_register_unexpected_frame()
12696 if (wdev->iftype != NL80211_IFTYPE_AP && in nl80211_register_unexpected_frame()
12697 wdev->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_register_unexpected_frame()
12698 return -EINVAL; in nl80211_register_unexpected_frame()
12700 if (wdev->ap_unexpected_nlportid) in nl80211_register_unexpected_frame()
12701 return -EBUSY; in nl80211_register_unexpected_frame()
12703 wdev->ap_unexpected_nlportid = info->snd_portid; in nl80211_register_unexpected_frame()
12710 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_probe_client()
12711 struct net_device *dev = info->user_ptr[1]; in nl80211_probe_client()
12712 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_probe_client()
12719 if (wdev->iftype != NL80211_IFTYPE_AP && in nl80211_probe_client()
12720 wdev->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_probe_client()
12721 return -EOPNOTSUPP; in nl80211_probe_client()
12723 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_probe_client()
12724 return -EINVAL; in nl80211_probe_client()
12726 if (!rdev->ops->probe_client) in nl80211_probe_client()
12727 return -EOPNOTSUPP; in nl80211_probe_client()
12731 return -ENOMEM; in nl80211_probe_client()
12733 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_probe_client()
12736 err = -ENOBUFS; in nl80211_probe_client()
12740 addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_probe_client()
12755 err = -ENOBUFS; in nl80211_probe_client()
12763 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_register_beacons()
12767 if (!(rdev->wiphy.flags & WIPHY_FLAG_REPORTS_OBSS)) in nl80211_register_beacons()
12768 return -EOPNOTSUPP; in nl80211_register_beacons()
12772 return -ENOMEM; in nl80211_register_beacons()
12775 spin_lock_bh(&rdev->beacon_registrations_lock); in nl80211_register_beacons()
12776 list_for_each_entry(reg, &rdev->beacon_registrations, list) { in nl80211_register_beacons()
12777 if (reg->nlportid == info->snd_portid) { in nl80211_register_beacons()
12778 rv = -EALREADY; in nl80211_register_beacons()
12783 nreg->nlportid = info->snd_portid; in nl80211_register_beacons()
12784 list_add(&nreg->list, &rdev->beacon_registrations); in nl80211_register_beacons()
12786 spin_unlock_bh(&rdev->beacon_registrations_lock); in nl80211_register_beacons()
12790 spin_unlock_bh(&rdev->beacon_registrations_lock); in nl80211_register_beacons()
12797 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_start_p2p_device()
12798 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_start_p2p_device()
12801 if (!rdev->ops->start_p2p_device) in nl80211_start_p2p_device()
12802 return -EOPNOTSUPP; in nl80211_start_p2p_device()
12804 if (wdev->iftype != NL80211_IFTYPE_P2P_DEVICE) in nl80211_start_p2p_device()
12805 return -EOPNOTSUPP; in nl80211_start_p2p_device()
12810 if (rfkill_blocked(rdev->rfkill)) in nl80211_start_p2p_device()
12811 return -ERFKILL; in nl80211_start_p2p_device()
12817 wdev->is_running = true; in nl80211_start_p2p_device()
12818 rdev->opencount++; in nl80211_start_p2p_device()
12825 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_stop_p2p_device()
12826 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_stop_p2p_device()
12828 if (wdev->iftype != NL80211_IFTYPE_P2P_DEVICE) in nl80211_stop_p2p_device()
12829 return -EOPNOTSUPP; in nl80211_stop_p2p_device()
12831 if (!rdev->ops->stop_p2p_device) in nl80211_stop_p2p_device()
12832 return -EOPNOTSUPP; in nl80211_stop_p2p_device()
12841 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_start_nan()
12842 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_start_nan()
12846 if (wdev->iftype != NL80211_IFTYPE_NAN) in nl80211_start_nan()
12847 return -EOPNOTSUPP; in nl80211_start_nan()
12850 return -EEXIST; in nl80211_start_nan()
12852 if (rfkill_blocked(rdev->rfkill)) in nl80211_start_nan()
12853 return -ERFKILL; in nl80211_start_nan()
12855 if (!info->attrs[NL80211_ATTR_NAN_MASTER_PREF]) in nl80211_start_nan()
12856 return -EINVAL; in nl80211_start_nan()
12859 nla_get_u8(info->attrs[NL80211_ATTR_NAN_MASTER_PREF]); in nl80211_start_nan()
12861 if (info->attrs[NL80211_ATTR_BANDS]) { in nl80211_start_nan()
12862 u32 bands = nla_get_u32(info->attrs[NL80211_ATTR_BANDS]); in nl80211_start_nan()
12864 if (bands & ~(u32)wdev->wiphy->nan_supported_bands) in nl80211_start_nan()
12865 return -EOPNOTSUPP; in nl80211_start_nan()
12868 return -EINVAL; in nl80211_start_nan()
12877 wdev->is_running = true; in nl80211_start_nan()
12878 rdev->opencount++; in nl80211_start_nan()
12885 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_stop_nan()
12886 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_stop_nan()
12888 if (wdev->iftype != NL80211_IFTYPE_NAN) in nl80211_stop_nan()
12889 return -EOPNOTSUPP; in nl80211_stop_nan()
12907 return -EINVAL; in validate_nan_filter()
12924 BUILD_BUG_ON(sizeof(*func->rx_filters) != sizeof(*func->tx_filters)); in handle_nan_filter()
12926 filter = kcalloc(n_entries, sizeof(*func->rx_filters), GFP_KERNEL); in handle_nan_filter()
12928 return -ENOMEM; in handle_nan_filter()
12937 func->num_tx_filters = n_entries; in handle_nan_filter()
12938 func->tx_filters = filter; in handle_nan_filter()
12940 func->num_rx_filters = n_entries; in handle_nan_filter()
12941 func->rx_filters = filter; in handle_nan_filter()
12950 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_nan_add_func()
12951 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_nan_add_func()
12958 if (wdev->iftype != NL80211_IFTYPE_NAN) in nl80211_nan_add_func()
12959 return -EOPNOTSUPP; in nl80211_nan_add_func()
12962 return -ENOTCONN; in nl80211_nan_add_func()
12964 if (!info->attrs[NL80211_ATTR_NAN_FUNC]) in nl80211_nan_add_func()
12965 return -EINVAL; in nl80211_nan_add_func()
12968 info->attrs[NL80211_ATTR_NAN_FUNC], in nl80211_nan_add_func()
12970 info->extack); in nl80211_nan_add_func()
12976 return -ENOMEM; in nl80211_nan_add_func()
12978 func->cookie = cfg80211_assign_cookie(rdev); in nl80211_nan_add_func()
12981 err = -EINVAL; in nl80211_nan_add_func()
12986 func->type = nla_get_u8(tb[NL80211_NAN_FUNC_TYPE]); in nl80211_nan_add_func()
12989 err = -EINVAL; in nl80211_nan_add_func()
12993 memcpy(func->service_id, nla_data(tb[NL80211_NAN_FUNC_SERVICE_ID]), in nl80211_nan_add_func()
12994 sizeof(func->service_id)); in nl80211_nan_add_func()
12996 func->close_range = in nl80211_nan_add_func()
13000 func->serv_spec_info_len = in nl80211_nan_add_func()
13002 func->serv_spec_info = in nl80211_nan_add_func()
13004 func->serv_spec_info_len, in nl80211_nan_add_func()
13006 if (!func->serv_spec_info) { in nl80211_nan_add_func()
13007 err = -ENOMEM; in nl80211_nan_add_func()
13013 func->ttl = nla_get_u32(tb[NL80211_NAN_FUNC_TTL]); in nl80211_nan_add_func()
13015 switch (func->type) { in nl80211_nan_add_func()
13018 err = -EINVAL; in nl80211_nan_add_func()
13022 func->publish_type = in nl80211_nan_add_func()
13024 func->publish_bcast = in nl80211_nan_add_func()
13027 if ((!(func->publish_type & NL80211_NAN_SOLICITED_PUBLISH)) && in nl80211_nan_add_func()
13028 func->publish_bcast) { in nl80211_nan_add_func()
13029 err = -EINVAL; in nl80211_nan_add_func()
13034 func->subscribe_active = in nl80211_nan_add_func()
13041 err = -EINVAL; in nl80211_nan_add_func()
13045 func->followup_id = in nl80211_nan_add_func()
13047 func->followup_reqid = in nl80211_nan_add_func()
13049 memcpy(func->followup_dest.addr, in nl80211_nan_add_func()
13051 sizeof(func->followup_dest.addr)); in nl80211_nan_add_func()
13052 if (func->ttl) { in nl80211_nan_add_func()
13053 err = -EINVAL; in nl80211_nan_add_func()
13058 err = -EINVAL; in nl80211_nan_add_func()
13069 info->extack); in nl80211_nan_add_func()
13073 func->srf_include = in nl80211_nan_add_func()
13079 err = -EINVAL; in nl80211_nan_add_func()
13083 func->srf_bf_len = in nl80211_nan_add_func()
13085 func->srf_bf = in nl80211_nan_add_func()
13087 func->srf_bf_len, GFP_KERNEL); in nl80211_nan_add_func()
13088 if (!func->srf_bf) { in nl80211_nan_add_func()
13089 err = -ENOMEM; in nl80211_nan_add_func()
13093 func->srf_bf_idx = in nl80211_nan_add_func()
13101 err = -EINVAL; in nl80211_nan_add_func()
13107 err = -EINVAL; in nl80211_nan_add_func()
13111 func->srf_num_macs = n_entries; in nl80211_nan_add_func()
13112 func->srf_macs = in nl80211_nan_add_func()
13113 kcalloc(n_entries, sizeof(*func->srf_macs), in nl80211_nan_add_func()
13115 if (!func->srf_macs) { in nl80211_nan_add_func()
13116 err = -ENOMEM; in nl80211_nan_add_func()
13121 memcpy(func->srf_macs[i++].addr, nla_data(attr), in nl80211_nan_add_func()
13122 sizeof(*func->srf_macs)); in nl80211_nan_add_func()
13142 err = -ENOMEM; in nl80211_nan_add_func()
13146 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_nan_add_func()
13148 /* This can't really happen - we just allocated 4KB */ in nl80211_nan_add_func()
13150 err = -ENOMEM; in nl80211_nan_add_func()
13163 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, func->cookie, in nl80211_nan_add_func()
13172 func->instance_id)) in nl80211_nan_add_func()
13182 return -ENOBUFS; in nl80211_nan_add_func()
13188 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_nan_del_func()
13189 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_nan_del_func()
13192 if (wdev->iftype != NL80211_IFTYPE_NAN) in nl80211_nan_del_func()
13193 return -EOPNOTSUPP; in nl80211_nan_del_func()
13196 return -ENOTCONN; in nl80211_nan_del_func()
13198 if (!info->attrs[NL80211_ATTR_COOKIE]) in nl80211_nan_del_func()
13199 return -EINVAL; in nl80211_nan_del_func()
13201 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); in nl80211_nan_del_func()
13211 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_nan_change_config()
13212 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_nan_change_config()
13216 if (wdev->iftype != NL80211_IFTYPE_NAN) in nl80211_nan_change_config()
13217 return -EOPNOTSUPP; in nl80211_nan_change_config()
13220 return -ENOTCONN; in nl80211_nan_change_config()
13222 if (info->attrs[NL80211_ATTR_NAN_MASTER_PREF]) { in nl80211_nan_change_config()
13224 nla_get_u8(info->attrs[NL80211_ATTR_NAN_MASTER_PREF]); in nl80211_nan_change_config()
13226 return -EINVAL; in nl80211_nan_change_config()
13231 if (info->attrs[NL80211_ATTR_BANDS]) { in nl80211_nan_change_config()
13232 u32 bands = nla_get_u32(info->attrs[NL80211_ATTR_BANDS]); in nl80211_nan_change_config()
13234 if (bands & ~(u32)wdev->wiphy->nan_supported_bands) in nl80211_nan_change_config()
13235 return -EOPNOTSUPP; in nl80211_nan_change_config()
13238 return -EINVAL; in nl80211_nan_change_config()
13245 return -EINVAL; in nl80211_nan_change_config()
13253 struct wiphy *wiphy = wdev->wiphy; in cfg80211_nan_match()
13259 if (WARN_ON(!match->inst_id || !match->peer_inst_id || !match->addr)) in cfg80211_nan_match()
13272 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_nan_match()
13273 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, in cfg80211_nan_match()
13274 wdev->netdev->ifindex)) || in cfg80211_nan_match()
13279 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, match->cookie, in cfg80211_nan_match()
13281 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, match->addr)) in cfg80211_nan_match()
13293 if (nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, match->inst_id)) in cfg80211_nan_match()
13303 if (nla_put_u8(msg, NL80211_NAN_FUNC_TYPE, match->type) || in cfg80211_nan_match()
13304 nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, match->peer_inst_id)) in cfg80211_nan_match()
13307 if (match->info && match->info_len && in cfg80211_nan_match()
13308 nla_put(msg, NL80211_NAN_FUNC_SERVICE_INFO, match->info_len, in cfg80211_nan_match()
13309 match->info)) in cfg80211_nan_match()
13316 if (!wdev->owner_nlportid) in cfg80211_nan_match()
13317 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), in cfg80211_nan_match()
13320 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, in cfg80211_nan_match()
13321 wdev->owner_nlportid); in cfg80211_nan_match()
13335 struct wiphy *wiphy = wdev->wiphy; in cfg80211_nan_func_terminated()
13354 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_nan_func_terminated()
13355 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, in cfg80211_nan_func_terminated()
13356 wdev->netdev->ifindex)) || in cfg80211_nan_func_terminated()
13376 if (!wdev->owner_nlportid) in cfg80211_nan_func_terminated()
13377 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), in cfg80211_nan_func_terminated()
13380 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, in cfg80211_nan_func_terminated()
13381 wdev->owner_nlportid); in cfg80211_nan_func_terminated()
13398 return -ENOMEM; in nl80211_get_protocol_features()
13400 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_protocol_features()
13414 return -ENOBUFS; in nl80211_get_protocol_features()
13419 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_update_ft_ies()
13421 struct net_device *dev = info->user_ptr[1]; in nl80211_update_ft_ies()
13423 if (!rdev->ops->update_ft_ies) in nl80211_update_ft_ies()
13424 return -EOPNOTSUPP; in nl80211_update_ft_ies()
13426 if (!info->attrs[NL80211_ATTR_MDID] || in nl80211_update_ft_ies()
13427 !info->attrs[NL80211_ATTR_IE]) in nl80211_update_ft_ies()
13428 return -EINVAL; in nl80211_update_ft_ies()
13431 ft_params.md = nla_get_u16(info->attrs[NL80211_ATTR_MDID]); in nl80211_update_ft_ies()
13432 ft_params.ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_update_ft_ies()
13433 ft_params.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_update_ft_ies()
13441 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_crit_protocol_start()
13442 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_crit_protocol_start()
13447 if (!rdev->ops->crit_proto_start) in nl80211_crit_protocol_start()
13448 return -EOPNOTSUPP; in nl80211_crit_protocol_start()
13450 if (WARN_ON(!rdev->ops->crit_proto_stop)) in nl80211_crit_protocol_start()
13451 return -EINVAL; in nl80211_crit_protocol_start()
13453 if (rdev->crit_proto_nlportid) in nl80211_crit_protocol_start()
13454 return -EBUSY; in nl80211_crit_protocol_start()
13457 if (info->attrs[NL80211_ATTR_CRIT_PROT_ID]) in nl80211_crit_protocol_start()
13458 proto = nla_get_u16(info->attrs[NL80211_ATTR_CRIT_PROT_ID]); in nl80211_crit_protocol_start()
13461 return -EINVAL; in nl80211_crit_protocol_start()
13464 if (!info->attrs[NL80211_ATTR_MAX_CRIT_PROT_DURATION]) in nl80211_crit_protocol_start()
13465 return -EINVAL; in nl80211_crit_protocol_start()
13468 nla_get_u16(info->attrs[NL80211_ATTR_MAX_CRIT_PROT_DURATION]); in nl80211_crit_protocol_start()
13472 rdev->crit_proto_nlportid = info->snd_portid; in nl80211_crit_protocol_start()
13480 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_crit_protocol_stop()
13481 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_crit_protocol_stop()
13483 if (!rdev->ops->crit_proto_stop) in nl80211_crit_protocol_stop()
13484 return -EOPNOTSUPP; in nl80211_crit_protocol_stop()
13486 if (rdev->crit_proto_nlportid) { in nl80211_crit_protocol_stop()
13487 rdev->crit_proto_nlportid = 0; in nl80211_crit_protocol_stop()
13497 if (vcmd->policy == VENDOR_CMD_RAW_DATA) { in nl80211_vendor_check_policy()
13498 if (attr->nla_type & NLA_F_NESTED) { in nl80211_vendor_check_policy()
13501 return -EINVAL; in nl80211_vendor_check_policy()
13507 if (!(attr->nla_type & NLA_F_NESTED)) { in nl80211_vendor_check_policy()
13509 return -EINVAL; in nl80211_vendor_check_policy()
13512 return nla_validate_nested(attr, vcmd->maxattr, vcmd->policy, extack); in nl80211_vendor_check_policy()
13517 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_vendor_cmd()
13519 __cfg80211_wdev_from_attrs(genl_info_net(info), info->attrs); in nl80211_vendor_cmd()
13523 if (!rdev->wiphy.vendor_commands) in nl80211_vendor_cmd()
13524 return -EOPNOTSUPP; in nl80211_vendor_cmd()
13528 if (err != -EINVAL) in nl80211_vendor_cmd()
13531 } else if (wdev->wiphy != &rdev->wiphy) { in nl80211_vendor_cmd()
13532 return -EINVAL; in nl80211_vendor_cmd()
13535 if (!info->attrs[NL80211_ATTR_VENDOR_ID] || in nl80211_vendor_cmd()
13536 !info->attrs[NL80211_ATTR_VENDOR_SUBCMD]) in nl80211_vendor_cmd()
13537 return -EINVAL; in nl80211_vendor_cmd()
13539 vid = nla_get_u32(info->attrs[NL80211_ATTR_VENDOR_ID]); in nl80211_vendor_cmd()
13540 subcmd = nla_get_u32(info->attrs[NL80211_ATTR_VENDOR_SUBCMD]); in nl80211_vendor_cmd()
13541 for (i = 0; i < rdev->wiphy.n_vendor_commands; i++) { in nl80211_vendor_cmd()
13546 vcmd = &rdev->wiphy.vendor_commands[i]; in nl80211_vendor_cmd()
13548 if (vcmd->info.vendor_id != vid || vcmd->info.subcmd != subcmd) in nl80211_vendor_cmd()
13551 if (vcmd->flags & (WIPHY_VENDOR_CMD_NEED_WDEV | in nl80211_vendor_cmd()
13554 return -EINVAL; in nl80211_vendor_cmd()
13555 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_NETDEV && in nl80211_vendor_cmd()
13556 !wdev->netdev) in nl80211_vendor_cmd()
13557 return -EINVAL; in nl80211_vendor_cmd()
13559 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_RUNNING) { in nl80211_vendor_cmd()
13561 return -ENETDOWN; in nl80211_vendor_cmd()
13567 if (!vcmd->doit) in nl80211_vendor_cmd()
13568 return -EOPNOTSUPP; in nl80211_vendor_cmd()
13570 if (info->attrs[NL80211_ATTR_VENDOR_DATA]) { in nl80211_vendor_cmd()
13571 data = nla_data(info->attrs[NL80211_ATTR_VENDOR_DATA]); in nl80211_vendor_cmd()
13572 len = nla_len(info->attrs[NL80211_ATTR_VENDOR_DATA]); in nl80211_vendor_cmd()
13575 info->attrs[NL80211_ATTR_VENDOR_DATA], in nl80211_vendor_cmd()
13576 info->extack); in nl80211_vendor_cmd()
13581 rdev->cur_cmd_info = info; in nl80211_vendor_cmd()
13582 err = vcmd->doit(&rdev->wiphy, wdev, data, len); in nl80211_vendor_cmd()
13583 rdev->cur_cmd_info = NULL; in nl80211_vendor_cmd()
13587 return -EOPNOTSUPP; in nl80211_vendor_cmd()
13598 int vcmd_idx = -1; in nl80211_prepare_vendor_dump()
13603 if (cb->args[0]) { in nl80211_prepare_vendor_dump()
13605 struct wiphy *wiphy = wiphy_idx_to_wiphy(cb->args[0] - 1); in nl80211_prepare_vendor_dump()
13609 return -ENODEV; in nl80211_prepare_vendor_dump()
13613 if (cb->args[1]) { in nl80211_prepare_vendor_dump()
13614 list_for_each_entry(tmp, &wiphy->wdev_list, list) { in nl80211_prepare_vendor_dump()
13615 if (tmp->identifier == cb->args[1] - 1) { in nl80211_prepare_vendor_dump()
13628 return -ENOMEM; in nl80211_prepare_vendor_dump()
13630 err = nlmsg_parse_deprecated(cb->nlh, in nl80211_prepare_vendor_dump()
13639 err = -EINVAL; in nl80211_prepare_vendor_dump()
13643 *wdev = __cfg80211_wdev_from_attrs(sock_net(skb->sk), attrbuf); in nl80211_prepare_vendor_dump()
13647 *rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk), attrbuf); in nl80211_prepare_vendor_dump()
13656 for (i = 0; i < (*rdev)->wiphy.n_vendor_commands; i++) { in nl80211_prepare_vendor_dump()
13659 vcmd = &(*rdev)->wiphy.vendor_commands[i]; in nl80211_prepare_vendor_dump()
13661 if (vcmd->info.vendor_id != vid || vcmd->info.subcmd != subcmd) in nl80211_prepare_vendor_dump()
13664 if (!vcmd->dumpit) { in nl80211_prepare_vendor_dump()
13665 err = -EOPNOTSUPP; in nl80211_prepare_vendor_dump()
13674 err = -EOPNOTSUPP; in nl80211_prepare_vendor_dump()
13683 &(*rdev)->wiphy.vendor_commands[vcmd_idx], in nl80211_prepare_vendor_dump()
13685 cb->extack); in nl80211_prepare_vendor_dump()
13690 /* 0 is the first index - add 1 to parse only once */ in nl80211_prepare_vendor_dump()
13691 cb->args[0] = (*rdev)->wiphy_idx + 1; in nl80211_prepare_vendor_dump()
13693 cb->args[1] = *wdev ? (*wdev)->identifier + 1 : 0; in nl80211_prepare_vendor_dump()
13694 cb->args[2] = vcmd_idx; in nl80211_prepare_vendor_dump()
13695 cb->args[3] = (unsigned long)data; in nl80211_prepare_vendor_dump()
13696 cb->args[4] = data_len; in nl80211_prepare_vendor_dump()
13722 vcmd_idx = cb->args[2]; in nl80211_vendor_cmd_dump()
13723 data = (void *)cb->args[3]; in nl80211_vendor_cmd_dump()
13724 data_len = cb->args[4]; in nl80211_vendor_cmd_dump()
13725 vcmd = &rdev->wiphy.vendor_commands[vcmd_idx]; in nl80211_vendor_cmd_dump()
13727 if (vcmd->flags & (WIPHY_VENDOR_CMD_NEED_WDEV | in nl80211_vendor_cmd_dump()
13730 err = -EINVAL; in nl80211_vendor_cmd_dump()
13733 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_NETDEV && in nl80211_vendor_cmd_dump()
13734 !wdev->netdev) { in nl80211_vendor_cmd_dump()
13735 err = -EINVAL; in nl80211_vendor_cmd_dump()
13739 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_RUNNING) { in nl80211_vendor_cmd_dump()
13741 err = -ENETDOWN; in nl80211_vendor_cmd_dump()
13748 void *hdr = nl80211hdr_put(skb, NETLINK_CB(cb->skb).portid, in nl80211_vendor_cmd_dump()
13749 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_vendor_cmd_dump()
13754 if (nla_put_u32(skb, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_vendor_cmd_dump()
13769 err = vcmd->dumpit(&rdev->wiphy, wdev, skb, data, data_len, in nl80211_vendor_cmd_dump()
13770 (unsigned long *)&cb->args[5]); in nl80211_vendor_cmd_dump()
13773 if (err == -ENOBUFS || err == -ENOENT) { in nl80211_vendor_cmd_dump()
13784 err = skb->len; in nl80211_vendor_cmd_dump()
13797 if (WARN_ON(!rdev->cur_cmd_info)) in __cfg80211_alloc_reply_skb()
13801 rdev->cur_cmd_info->snd_portid, in __cfg80211_alloc_reply_skb()
13802 rdev->cur_cmd_info->snd_seq, in __cfg80211_alloc_reply_skb()
13809 struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0]; in cfg80211_vendor_cmd_reply()
13810 void *hdr = ((void **)skb->cb)[1]; in cfg80211_vendor_cmd_reply()
13811 struct nlattr *data = ((void **)skb->cb)[2]; in cfg80211_vendor_cmd_reply()
13814 memset(skb->cb, 0, sizeof(skb->cb)); in cfg80211_vendor_cmd_reply()
13816 if (WARN_ON(!rdev->cur_cmd_info)) { in cfg80211_vendor_cmd_reply()
13818 return -EINVAL; in cfg80211_vendor_cmd_reply()
13823 return genlmsg_reply(skb, rdev->cur_cmd_info); in cfg80211_vendor_cmd_reply()
13831 if (WARN_ON(!rdev->cur_cmd_info)) in cfg80211_vendor_cmd_get_sender()
13834 return rdev->cur_cmd_info->snd_portid; in cfg80211_vendor_cmd_get_sender()
13841 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_qos_map()
13843 struct net_device *dev = info->user_ptr[1]; in nl80211_set_qos_map()
13847 if (!rdev->ops->set_qos_map) in nl80211_set_qos_map()
13848 return -EOPNOTSUPP; in nl80211_set_qos_map()
13850 if (info->attrs[NL80211_ATTR_QOS_MAP]) { in nl80211_set_qos_map()
13851 pos = nla_data(info->attrs[NL80211_ATTR_QOS_MAP]); in nl80211_set_qos_map()
13852 len = nla_len(info->attrs[NL80211_ATTR_QOS_MAP]); in nl80211_set_qos_map()
13855 return -EINVAL; in nl80211_set_qos_map()
13859 return -ENOMEM; in nl80211_set_qos_map()
13861 num_des = (len - IEEE80211_QOS_MAP_LEN_MIN) >> 1; in nl80211_set_qos_map()
13865 memcpy(qos_map->dscp_exception, pos, des_len); in nl80211_set_qos_map()
13866 qos_map->num_des = num_des; in nl80211_set_qos_map()
13868 if (qos_map->dscp_exception[des].up > 7) { in nl80211_set_qos_map()
13870 return -EINVAL; in nl80211_set_qos_map()
13875 memcpy(qos_map->up, pos, IEEE80211_QOS_MAP_LEN_MIN); in nl80211_set_qos_map()
13878 wdev_lock(dev->ieee80211_ptr); in nl80211_set_qos_map()
13879 ret = nl80211_key_allowed(dev->ieee80211_ptr); in nl80211_set_qos_map()
13882 wdev_unlock(dev->ieee80211_ptr); in nl80211_set_qos_map()
13890 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_add_tx_ts()
13891 struct net_device *dev = info->user_ptr[1]; in nl80211_add_tx_ts()
13892 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_add_tx_ts()
13898 if (!(rdev->wiphy.features & NL80211_FEATURE_SUPPORTS_WMM_ADMISSION)) in nl80211_add_tx_ts()
13899 return -EOPNOTSUPP; in nl80211_add_tx_ts()
13901 if (!info->attrs[NL80211_ATTR_TSID] || !info->attrs[NL80211_ATTR_MAC] || in nl80211_add_tx_ts()
13902 !info->attrs[NL80211_ATTR_USER_PRIO]) in nl80211_add_tx_ts()
13903 return -EINVAL; in nl80211_add_tx_ts()
13905 tsid = nla_get_u8(info->attrs[NL80211_ATTR_TSID]); in nl80211_add_tx_ts()
13906 up = nla_get_u8(info->attrs[NL80211_ATTR_USER_PRIO]); in nl80211_add_tx_ts()
13908 /* WMM uses TIDs 0-7 even for TSPEC */ in nl80211_add_tx_ts()
13914 return -EINVAL; in nl80211_add_tx_ts()
13917 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_add_tx_ts()
13919 if (info->attrs[NL80211_ATTR_ADMITTED_TIME]) { in nl80211_add_tx_ts()
13921 nla_get_u16(info->attrs[NL80211_ATTR_ADMITTED_TIME]); in nl80211_add_tx_ts()
13923 return -EINVAL; in nl80211_add_tx_ts()
13927 switch (wdev->iftype) { in nl80211_add_tx_ts()
13930 if (wdev->current_bss) in nl80211_add_tx_ts()
13932 err = -ENOTCONN; in nl80211_add_tx_ts()
13935 err = -EOPNOTSUPP; in nl80211_add_tx_ts()
13948 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_del_tx_ts()
13949 struct net_device *dev = info->user_ptr[1]; in nl80211_del_tx_ts()
13950 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_del_tx_ts()
13955 if (!info->attrs[NL80211_ATTR_TSID] || !info->attrs[NL80211_ATTR_MAC]) in nl80211_del_tx_ts()
13956 return -EINVAL; in nl80211_del_tx_ts()
13958 tsid = nla_get_u8(info->attrs[NL80211_ATTR_TSID]); in nl80211_del_tx_ts()
13959 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_del_tx_ts()
13971 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_tdls_channel_switch()
13972 struct net_device *dev = info->user_ptr[1]; in nl80211_tdls_channel_switch()
13973 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_tdls_channel_switch()
13979 if (!rdev->ops->tdls_channel_switch || in nl80211_tdls_channel_switch()
13980 !(rdev->wiphy.features & NL80211_FEATURE_TDLS_CHANNEL_SWITCH)) in nl80211_tdls_channel_switch()
13981 return -EOPNOTSUPP; in nl80211_tdls_channel_switch()
13983 switch (dev->ieee80211_ptr->iftype) { in nl80211_tdls_channel_switch()
13988 return -EOPNOTSUPP; in nl80211_tdls_channel_switch()
13991 if (!info->attrs[NL80211_ATTR_MAC] || in nl80211_tdls_channel_switch()
13992 !info->attrs[NL80211_ATTR_OPER_CLASS]) in nl80211_tdls_channel_switch()
13993 return -EINVAL; in nl80211_tdls_channel_switch()
14000 * Don't allow wide channels on the 2.4Ghz band, as per IEEE802.11-2012 in nl80211_tdls_channel_switch()
14004 if (chandef.chan->band == NL80211_BAND_2GHZ && in nl80211_tdls_channel_switch()
14005 chandef.width != NL80211_CHAN_WIDTH_20_NOHT && in nl80211_tdls_channel_switch()
14006 chandef.width != NL80211_CHAN_WIDTH_20) in nl80211_tdls_channel_switch()
14007 return -EINVAL; in nl80211_tdls_channel_switch()
14010 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &chandef, in nl80211_tdls_channel_switch()
14011 wdev->iftype)) in nl80211_tdls_channel_switch()
14012 return -EINVAL; in nl80211_tdls_channel_switch()
14015 if (cfg80211_chandef_dfs_required(wdev->wiphy, &chandef, wdev->iftype)) in nl80211_tdls_channel_switch()
14016 return -EINVAL; in nl80211_tdls_channel_switch()
14018 addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_tdls_channel_switch()
14019 oper_class = nla_get_u8(info->attrs[NL80211_ATTR_OPER_CLASS]); in nl80211_tdls_channel_switch()
14031 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_tdls_cancel_channel_switch()
14032 struct net_device *dev = info->user_ptr[1]; in nl80211_tdls_cancel_channel_switch()
14033 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_tdls_cancel_channel_switch()
14036 if (!rdev->ops->tdls_channel_switch || in nl80211_tdls_cancel_channel_switch()
14037 !rdev->ops->tdls_cancel_channel_switch || in nl80211_tdls_cancel_channel_switch()
14038 !(rdev->wiphy.features & NL80211_FEATURE_TDLS_CHANNEL_SWITCH)) in nl80211_tdls_cancel_channel_switch()
14039 return -EOPNOTSUPP; in nl80211_tdls_cancel_channel_switch()
14041 switch (dev->ieee80211_ptr->iftype) { in nl80211_tdls_cancel_channel_switch()
14046 return -EOPNOTSUPP; in nl80211_tdls_cancel_channel_switch()
14049 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_tdls_cancel_channel_switch()
14050 return -EINVAL; in nl80211_tdls_cancel_channel_switch()
14052 addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_tdls_cancel_channel_switch()
14064 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_multicast_to_unicast()
14065 struct net_device *dev = info->user_ptr[1]; in nl80211_set_multicast_to_unicast()
14066 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_multicast_to_unicast()
14070 if (!rdev->ops->set_multicast_to_unicast) in nl80211_set_multicast_to_unicast()
14071 return -EOPNOTSUPP; in nl80211_set_multicast_to_unicast()
14073 if (wdev->iftype != NL80211_IFTYPE_AP && in nl80211_set_multicast_to_unicast()
14074 wdev->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_set_multicast_to_unicast()
14075 return -EOPNOTSUPP; in nl80211_set_multicast_to_unicast()
14077 nla = info->attrs[NL80211_ATTR_MULTICAST_TO_UNICAST_ENABLED]; in nl80211_set_multicast_to_unicast()
14085 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_pmk()
14086 struct net_device *dev = info->user_ptr[1]; in nl80211_set_pmk()
14087 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_pmk()
14091 if (wdev->iftype != NL80211_IFTYPE_STATION && in nl80211_set_pmk()
14092 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_set_pmk()
14093 return -EOPNOTSUPP; in nl80211_set_pmk()
14095 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_set_pmk()
14097 return -EOPNOTSUPP; in nl80211_set_pmk()
14099 if (!info->attrs[NL80211_ATTR_MAC] || !info->attrs[NL80211_ATTR_PMK]) in nl80211_set_pmk()
14100 return -EINVAL; in nl80211_set_pmk()
14103 if (!wdev->current_bss) { in nl80211_set_pmk()
14104 ret = -ENOTCONN; in nl80211_set_pmk()
14108 pmk_conf.aa = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_set_pmk()
14109 if (memcmp(pmk_conf.aa, wdev->current_bss->pub.bssid, ETH_ALEN)) { in nl80211_set_pmk()
14110 ret = -EINVAL; in nl80211_set_pmk()
14114 pmk_conf.pmk = nla_data(info->attrs[NL80211_ATTR_PMK]); in nl80211_set_pmk()
14115 pmk_conf.pmk_len = nla_len(info->attrs[NL80211_ATTR_PMK]); in nl80211_set_pmk()
14118 ret = -EINVAL; in nl80211_set_pmk()
14122 if (info->attrs[NL80211_ATTR_PMKR0_NAME]) in nl80211_set_pmk()
14124 nla_data(info->attrs[NL80211_ATTR_PMKR0_NAME]); in nl80211_set_pmk()
14134 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_del_pmk()
14135 struct net_device *dev = info->user_ptr[1]; in nl80211_del_pmk()
14136 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_del_pmk()
14140 if (wdev->iftype != NL80211_IFTYPE_STATION && in nl80211_del_pmk()
14141 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_del_pmk()
14142 return -EOPNOTSUPP; in nl80211_del_pmk()
14144 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_del_pmk()
14146 return -EOPNOTSUPP; in nl80211_del_pmk()
14148 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_del_pmk()
14149 return -EINVAL; in nl80211_del_pmk()
14152 aa = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_del_pmk()
14161 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_external_auth()
14162 struct net_device *dev = info->user_ptr[1]; in nl80211_external_auth()
14165 if (!rdev->ops->external_auth) in nl80211_external_auth()
14166 return -EOPNOTSUPP; in nl80211_external_auth()
14168 if (!info->attrs[NL80211_ATTR_SSID] && in nl80211_external_auth()
14169 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && in nl80211_external_auth()
14170 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_external_auth()
14171 return -EINVAL; in nl80211_external_auth()
14173 if (!info->attrs[NL80211_ATTR_BSSID]) in nl80211_external_auth()
14174 return -EINVAL; in nl80211_external_auth()
14176 if (!info->attrs[NL80211_ATTR_STATUS_CODE]) in nl80211_external_auth()
14177 return -EINVAL; in nl80211_external_auth()
14181 if (info->attrs[NL80211_ATTR_SSID]) { in nl80211_external_auth()
14182 params.ssid.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); in nl80211_external_auth()
14184 return -EINVAL; in nl80211_external_auth()
14186 nla_data(info->attrs[NL80211_ATTR_SSID]), in nl80211_external_auth()
14190 memcpy(params.bssid, nla_data(info->attrs[NL80211_ATTR_BSSID]), in nl80211_external_auth()
14193 params.status = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]); in nl80211_external_auth()
14195 if (info->attrs[NL80211_ATTR_PMKID]) in nl80211_external_auth()
14196 params.pmkid = nla_data(info->attrs[NL80211_ATTR_PMKID]); in nl80211_external_auth()
14203 bool dont_wait_for_ack = info->attrs[NL80211_ATTR_DONT_WAIT_FOR_ACK]; in nl80211_tx_control_port()
14204 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_tx_control_port()
14205 struct net_device *dev = info->user_ptr[1]; in nl80211_tx_control_port()
14206 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_tx_control_port()
14215 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_tx_control_port()
14217 return -EOPNOTSUPP; in nl80211_tx_control_port()
14219 if (!rdev->ops->tx_control_port) in nl80211_tx_control_port()
14220 return -EOPNOTSUPP; in nl80211_tx_control_port()
14222 if (!info->attrs[NL80211_ATTR_FRAME] || in nl80211_tx_control_port()
14223 !info->attrs[NL80211_ATTR_MAC] || in nl80211_tx_control_port()
14224 !info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]) { in nl80211_tx_control_port()
14226 return -EINVAL; in nl80211_tx_control_port()
14231 switch (wdev->iftype) { in nl80211_tx_control_port()
14239 if (wdev->current_bss) in nl80211_tx_control_port()
14241 err = -ENOTCONN; in nl80211_tx_control_port()
14244 err = -EOPNOTSUPP; in nl80211_tx_control_port()
14250 buf = nla_data(info->attrs[NL80211_ATTR_FRAME]); in nl80211_tx_control_port()
14251 len = nla_len(info->attrs[NL80211_ATTR_FRAME]); in nl80211_tx_control_port()
14252 dest = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_tx_control_port()
14253 proto = nla_get_u16(info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]); in nl80211_tx_control_port()
14255 nla_get_flag(info->attrs[NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT]); in nl80211_tx_control_port()
14261 nl_set_extack_cookie_u64(info->extack, cookie); in nl80211_tx_control_port()
14271 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_ftm_responder_stats()
14272 struct net_device *dev = info->user_ptr[1]; in nl80211_get_ftm_responder_stats()
14273 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_get_ftm_responder_stats()
14280 if (wdev->iftype != NL80211_IFTYPE_AP || !wdev->beacon_interval) in nl80211_get_ftm_responder_stats()
14281 return -EOPNOTSUPP; in nl80211_get_ftm_responder_stats()
14288 return -ENODATA; in nl80211_get_ftm_responder_stats()
14292 return -ENOMEM; in nl80211_get_ftm_responder_stats()
14294 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_ftm_responder_stats()
14299 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) in nl80211_get_ftm_responder_stats()
14336 return -ENOBUFS; in nl80211_get_ftm_responder_stats()
14341 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_update_owe_info()
14343 struct net_device *dev = info->user_ptr[1]; in nl80211_update_owe_info()
14345 if (!rdev->ops->update_owe_info) in nl80211_update_owe_info()
14346 return -EOPNOTSUPP; in nl80211_update_owe_info()
14348 if (!info->attrs[NL80211_ATTR_STATUS_CODE] || in nl80211_update_owe_info()
14349 !info->attrs[NL80211_ATTR_MAC]) in nl80211_update_owe_info()
14350 return -EINVAL; in nl80211_update_owe_info()
14353 owe_info.status = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]); in nl80211_update_owe_info()
14354 nla_memcpy(owe_info.peer, info->attrs[NL80211_ATTR_MAC], ETH_ALEN); in nl80211_update_owe_info()
14356 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_update_owe_info()
14357 owe_info.ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_update_owe_info()
14358 owe_info.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_update_owe_info()
14366 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_probe_mesh_link()
14367 struct net_device *dev = info->user_ptr[1]; in nl80211_probe_mesh_link()
14368 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_probe_mesh_link()
14375 if (!rdev->ops->probe_mesh_link || !rdev->ops->get_station) in nl80211_probe_mesh_link()
14376 return -EOPNOTSUPP; in nl80211_probe_mesh_link()
14378 if (!info->attrs[NL80211_ATTR_MAC] || in nl80211_probe_mesh_link()
14379 !info->attrs[NL80211_ATTR_FRAME]) { in nl80211_probe_mesh_link()
14381 return -EINVAL; in nl80211_probe_mesh_link()
14384 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_probe_mesh_link()
14385 return -EOPNOTSUPP; in nl80211_probe_mesh_link()
14387 dest = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_probe_mesh_link()
14388 buf = nla_data(info->attrs[NL80211_ATTR_FRAME]); in nl80211_probe_mesh_link()
14389 len = nla_len(info->attrs[NL80211_ATTR_FRAME]); in nl80211_probe_mesh_link()
14392 return -EINVAL; in nl80211_probe_mesh_link()
14395 !ether_addr_equal(buf + ETH_ALEN, dev->dev_addr)) in nl80211_probe_mesh_link()
14396 return -EINVAL; in nl80211_probe_mesh_link()
14412 struct netlink_ext_ack *extack = info->extack; in parse_tid_conf()
14417 return -EINVAL; in parse_tid_conf()
14419 tid_conf->config_override = in parse_tid_conf()
14421 tid_conf->tids = nla_get_u16(attrs[NL80211_TID_CONFIG_ATTR_TIDS]); in parse_tid_conf()
14423 if (tid_conf->config_override) { in parse_tid_conf()
14424 if (rdev->ops->reset_tid_config) { in parse_tid_conf()
14426 tid_conf->tids); in parse_tid_conf()
14430 return -EINVAL; in parse_tid_conf()
14435 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_NOACK); in parse_tid_conf()
14436 tid_conf->noack = in parse_tid_conf()
14441 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_RETRY_SHORT); in parse_tid_conf()
14442 tid_conf->retry_short = in parse_tid_conf()
14445 if (tid_conf->retry_short > rdev->wiphy.max_data_retry_count) in parse_tid_conf()
14446 return -EINVAL; in parse_tid_conf()
14450 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_RETRY_LONG); in parse_tid_conf()
14451 tid_conf->retry_long = in parse_tid_conf()
14454 if (tid_conf->retry_long > rdev->wiphy.max_data_retry_count) in parse_tid_conf()
14455 return -EINVAL; in parse_tid_conf()
14459 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_AMPDU_CTRL); in parse_tid_conf()
14460 tid_conf->ampdu = in parse_tid_conf()
14465 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL); in parse_tid_conf()
14466 tid_conf->rtscts = in parse_tid_conf()
14471 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_AMSDU_CTRL); in parse_tid_conf()
14472 tid_conf->amsdu = in parse_tid_conf()
14479 tid_conf->txrate_type = nla_get_u8(attrs[idx]); in parse_tid_conf()
14481 if (tid_conf->txrate_type != NL80211_TX_RATE_AUTOMATIC) { in parse_tid_conf()
14484 &tid_conf->txrate_mask, dev); in parse_tid_conf()
14488 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_TX_RATE); in parse_tid_conf()
14490 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE); in parse_tid_conf()
14494 mask = rdev->wiphy.tid_config_support.peer; in parse_tid_conf()
14496 mask = rdev->wiphy.tid_config_support.vif; in parse_tid_conf()
14498 if (tid_conf->mask & ~mask) { in parse_tid_conf()
14500 return -ENOTSUPP; in parse_tid_conf()
14509 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_tid_config()
14511 struct net_device *dev = info->user_ptr[1]; in nl80211_set_tid_config()
14515 int ret = -EINVAL; in nl80211_set_tid_config()
14518 if (!info->attrs[NL80211_ATTR_TID_CONFIG]) in nl80211_set_tid_config()
14519 return -EINVAL; in nl80211_set_tid_config()
14521 if (!rdev->ops->set_tid_config) in nl80211_set_tid_config()
14522 return -EOPNOTSUPP; in nl80211_set_tid_config()
14524 nla_for_each_nested(tid, info->attrs[NL80211_ATTR_TID_CONFIG], in nl80211_set_tid_config()
14531 return -ENOMEM; in nl80211_set_tid_config()
14533 tid_config->n_tid_conf = num_conf; in nl80211_set_tid_config()
14535 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_set_tid_config()
14536 tid_config->peer = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_set_tid_config()
14538 nla_for_each_nested(tid, info->attrs[NL80211_ATTR_TID_CONFIG], in nl80211_set_tid_config()
14547 &tid_config->tid_conf[conf_idx], in nl80211_set_tid_config()
14548 info, tid_config->peer); in nl80211_set_tid_config()
14580 bool rtnl = ops->internal_flags & NL80211_FLAG_NEED_RTNL; in nl80211_pre_doit()
14585 if (ops->internal_flags & NL80211_FLAG_NEED_WIPHY) { in nl80211_pre_doit()
14592 info->user_ptr[0] = rdev; in nl80211_pre_doit()
14593 } else if (ops->internal_flags & NL80211_FLAG_NEED_NETDEV || in nl80211_pre_doit()
14594 ops->internal_flags & NL80211_FLAG_NEED_WDEV) { in nl80211_pre_doit()
14598 info->attrs); in nl80211_pre_doit()
14605 dev = wdev->netdev; in nl80211_pre_doit()
14606 rdev = wiphy_to_rdev(wdev->wiphy); in nl80211_pre_doit()
14608 if (ops->internal_flags & NL80211_FLAG_NEED_NETDEV) { in nl80211_pre_doit()
14612 return -EINVAL; in nl80211_pre_doit()
14615 info->user_ptr[1] = dev; in nl80211_pre_doit()
14617 info->user_ptr[1] = wdev; in nl80211_pre_doit()
14620 if (ops->internal_flags & NL80211_FLAG_CHECK_NETDEV_UP && in nl80211_pre_doit()
14624 return -ENETDOWN; in nl80211_pre_doit()
14630 info->user_ptr[0] = rdev; in nl80211_pre_doit()
14639 if (info->user_ptr[1]) { in nl80211_post_doit()
14640 if (ops->internal_flags & NL80211_FLAG_NEED_WDEV) { in nl80211_post_doit()
14641 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_post_doit()
14643 if (wdev->netdev) in nl80211_post_doit()
14644 dev_put(wdev->netdev); in nl80211_post_doit()
14646 dev_put(info->user_ptr[1]); in nl80211_post_doit()
14650 if (ops->internal_flags & NL80211_FLAG_NEED_RTNL) in nl80211_post_doit()
14658 if (ops->internal_flags & NL80211_FLAG_CLEAR_SKB) { in nl80211_post_doit()
15567 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_notify_wiphy()
15586 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_notify_iface()
15593 struct cfg80211_scan_request *req = rdev->scan_req; in nl80211_add_scan_req()
15604 for (i = 0; i < req->n_ssids; i++) { in nl80211_add_scan_req()
15605 if (nla_put(msg, i, req->ssids[i].ssid_len, req->ssids[i].ssid)) in nl80211_add_scan_req()
15610 if (req->flags & NL80211_SCAN_FLAG_FREQ_KHZ) { in nl80211_add_scan_req()
15614 for (i = 0; i < req->n_channels; i++) { in nl80211_add_scan_req()
15616 ieee80211_channel_to_khz(req->channels[i]))) in nl80211_add_scan_req()
15625 for (i = 0; i < req->n_channels; i++) { in nl80211_add_scan_req()
15626 if (nla_put_u32(msg, i, req->channels[i]->center_freq)) in nl80211_add_scan_req()
15632 if (req->ie && in nl80211_add_scan_req()
15633 nla_put(msg, NL80211_ATTR_IE, req->ie_len, req->ie)) in nl80211_add_scan_req()
15636 if (req->flags && in nl80211_add_scan_req()
15637 nla_put_u32(msg, NL80211_ATTR_SCAN_FLAGS, req->flags)) in nl80211_add_scan_req()
15640 info = rdev->int_scan_req ? &rdev->int_scan_req->info : in nl80211_add_scan_req()
15641 &rdev->scan_req->info; in nl80211_add_scan_req()
15642 if (info->scan_start_tsf && in nl80211_add_scan_req()
15644 info->scan_start_tsf, NL80211_BSS_PAD) || in nl80211_add_scan_req()
15646 info->tsf_bssid))) in nl80211_add_scan_req()
15651 return -ENOBUFS; in nl80211_add_scan_req()
15664 return -1; in nl80211_prep_scan_msg()
15666 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_prep_scan_msg()
15667 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, in nl80211_prep_scan_msg()
15668 wdev->netdev->ifindex)) || in nl80211_prep_scan_msg()
15681 return -EMSGSIZE; in nl80211_prep_scan_msg()
15692 return -1; in nl80211_prep_sched_scan_msg()
15695 wiphy_to_rdev(req->wiphy)->wiphy_idx) || in nl80211_prep_sched_scan_msg()
15696 nla_put_u32(msg, NL80211_ATTR_IFINDEX, req->dev->ifindex) || in nl80211_prep_sched_scan_msg()
15697 nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, req->reqid, in nl80211_prep_sched_scan_msg()
15706 return -EMSGSIZE; in nl80211_prep_sched_scan_msg()
15724 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_scan_start()
15754 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_scan_msg()
15771 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(req->wiphy), msg, 0, in nl80211_send_sched_scan()
15779 if (nla_put_u8(msg, NL80211_ATTR_REG_INITIATOR, request->initiator)) in nl80211_reg_change_event_fill()
15782 if (request->alpha2[0] == '0' && request->alpha2[1] == '0') { in nl80211_reg_change_event_fill()
15786 } else if (request->alpha2[0] == '9' && request->alpha2[1] == '9') { in nl80211_reg_change_event_fill()
15790 } else if ((request->alpha2[0] == '9' && request->alpha2[1] == '8') || in nl80211_reg_change_event_fill()
15791 request->intersect) { in nl80211_reg_change_event_fill()
15799 request->alpha2)) in nl80211_reg_change_event_fill()
15803 if (request->wiphy_idx != WIPHY_IDX_INVALID) { in nl80211_reg_change_event_fill()
15804 struct wiphy *wiphy = wiphy_idx_to_wiphy(request->wiphy_idx); in nl80211_reg_change_event_fill()
15807 nla_put_u32(msg, NL80211_ATTR_WIPHY, request->wiphy_idx)) in nl80211_reg_change_event_fill()
15811 wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED && in nl80211_reg_change_event_fill()
15876 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_mlme_event()
15877 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_send_mlme_event()
15898 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_mlme_event()
15911 NL80211_CMD_AUTHENTICATE, gfp, -1, NULL, 0); in nl80211_send_rx_auth()
15929 NL80211_CMD_DEAUTHENTICATE, gfp, -1, NULL, 0); in nl80211_send_deauth()
15937 NL80211_CMD_DISASSOCIATE, gfp, -1, NULL, 0); in nl80211_send_disassoc()
15943 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_rx_unprot_mlme_mgmt()
15944 struct wiphy *wiphy = wdev->wiphy; in cfg80211_rx_unprot_mlme_mgmt()
15952 if (ieee80211_is_deauth(mgmt->frame_control)) { in cfg80211_rx_unprot_mlme_mgmt()
15954 } else if (ieee80211_is_disassoc(mgmt->frame_control)) { in cfg80211_rx_unprot_mlme_mgmt()
15956 } else if (ieee80211_is_beacon(mgmt->frame_control)) { in cfg80211_rx_unprot_mlme_mgmt()
15957 if (wdev->unprot_beacon_reported && in cfg80211_rx_unprot_mlme_mgmt()
15958 elapsed_jiffies_msecs(wdev->unprot_beacon_reported) < 10000) in cfg80211_rx_unprot_mlme_mgmt()
15961 wdev->unprot_beacon_reported = jiffies; in cfg80211_rx_unprot_mlme_mgmt()
15967 nl80211_send_mlme_event(rdev, dev, buf, len, cmd, GFP_ATOMIC, -1, in cfg80211_rx_unprot_mlme_mgmt()
15989 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_mlme_timeout()
15990 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_send_mlme_timeout()
15997 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_mlme_timeout()
16029 msg = nlmsg_new(100 + cr->req_ie_len + cr->resp_ie_len + in nl80211_send_connect_result()
16030 cr->fils.kek_len + cr->fils.pmk_len + in nl80211_send_connect_result()
16031 (cr->fils.pmkid ? WLAN_PMKID_LEN : 0), gfp); in nl80211_send_connect_result()
16041 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_connect_result()
16042 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_send_connect_result()
16043 (cr->bssid && in nl80211_send_connect_result()
16044 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, cr->bssid)) || in nl80211_send_connect_result()
16046 cr->status < 0 ? WLAN_STATUS_UNSPECIFIED_FAILURE : in nl80211_send_connect_result()
16047 cr->status) || in nl80211_send_connect_result()
16048 (cr->status < 0 && in nl80211_send_connect_result()
16051 cr->timeout_reason))) || in nl80211_send_connect_result()
16052 (cr->req_ie && in nl80211_send_connect_result()
16053 nla_put(msg, NL80211_ATTR_REQ_IE, cr->req_ie_len, cr->req_ie)) || in nl80211_send_connect_result()
16054 (cr->resp_ie && in nl80211_send_connect_result()
16055 nla_put(msg, NL80211_ATTR_RESP_IE, cr->resp_ie_len, in nl80211_send_connect_result()
16056 cr->resp_ie)) || in nl80211_send_connect_result()
16057 (cr->fils.update_erp_next_seq_num && in nl80211_send_connect_result()
16059 cr->fils.erp_next_seq_num)) || in nl80211_send_connect_result()
16060 (cr->status == WLAN_STATUS_SUCCESS && in nl80211_send_connect_result()
16061 ((cr->fils.kek && in nl80211_send_connect_result()
16062 nla_put(msg, NL80211_ATTR_FILS_KEK, cr->fils.kek_len, in nl80211_send_connect_result()
16063 cr->fils.kek)) || in nl80211_send_connect_result()
16064 (cr->fils.pmk && in nl80211_send_connect_result()
16065 nla_put(msg, NL80211_ATTR_PMK, cr->fils.pmk_len, cr->fils.pmk)) || in nl80211_send_connect_result()
16066 (cr->fils.pmkid && in nl80211_send_connect_result()
16067 nla_put(msg, NL80211_ATTR_PMKID, WLAN_PMKID_LEN, cr->fils.pmkid))))) in nl80211_send_connect_result()
16072 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_connect_result()
16086 const u8 *bssid = info->bss ? info->bss->bssid : info->bssid; in nl80211_send_roamed()
16088 msg = nlmsg_new(100 + info->req_ie_len + info->resp_ie_len + in nl80211_send_roamed()
16089 info->fils.kek_len + info->fils.pmk_len + in nl80211_send_roamed()
16090 (info->fils.pmkid ? WLAN_PMKID_LEN : 0), gfp); in nl80211_send_roamed()
16100 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_roamed()
16101 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_send_roamed()
16103 (info->req_ie && in nl80211_send_roamed()
16104 nla_put(msg, NL80211_ATTR_REQ_IE, info->req_ie_len, in nl80211_send_roamed()
16105 info->req_ie)) || in nl80211_send_roamed()
16106 (info->resp_ie && in nl80211_send_roamed()
16107 nla_put(msg, NL80211_ATTR_RESP_IE, info->resp_ie_len, in nl80211_send_roamed()
16108 info->resp_ie)) || in nl80211_send_roamed()
16109 (info->fils.update_erp_next_seq_num && in nl80211_send_roamed()
16111 info->fils.erp_next_seq_num)) || in nl80211_send_roamed()
16112 (info->fils.kek && in nl80211_send_roamed()
16113 nla_put(msg, NL80211_ATTR_FILS_KEK, info->fils.kek_len, in nl80211_send_roamed()
16114 info->fils.kek)) || in nl80211_send_roamed()
16115 (info->fils.pmk && in nl80211_send_roamed()
16116 nla_put(msg, NL80211_ATTR_PMK, info->fils.pmk_len, info->fils.pmk)) || in nl80211_send_roamed()
16117 (info->fils.pmkid && in nl80211_send_roamed()
16118 nla_put(msg, NL80211_ATTR_PMKID, WLAN_PMKID_LEN, info->fils.pmkid))) in nl80211_send_roamed()
16123 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_roamed()
16147 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_port_authorized()
16148 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_send_port_authorized()
16154 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_port_authorized()
16179 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_disconnected()
16180 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_send_disconnected()
16190 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_disconnected()
16215 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_ibss_bssid()
16216 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_send_ibss_bssid()
16222 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_ibss_bssid()
16234 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_notify_new_peer_candidate()
16235 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_notify_new_peer_candidate()
16239 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_MESH_POINT)) in cfg80211_notify_new_peer_candidate()
16254 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_notify_new_peer_candidate()
16255 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in cfg80211_notify_new_peer_candidate()
16265 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_notify_new_peer_candidate()
16292 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_michael_mic_failure()
16293 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_michael_mic_failure()
16296 (key_id != -1 && in nl80211_michael_mic_failure()
16303 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_michael_mic_failure()
16386 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_remain_on_chan_event()
16387 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, in nl80211_send_remain_on_chan_event()
16388 wdev->netdev->ifindex)) || in nl80211_send_remain_on_chan_event()
16391 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, chan->center_freq) || in nl80211_send_remain_on_chan_event()
16404 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_remain_on_chan_event()
16416 struct wiphy *wiphy = wdev->wiphy; in cfg80211_ready_on_channel()
16430 struct wiphy *wiphy = wdev->wiphy; in cfg80211_remain_on_channel_expired()
16443 struct wiphy *wiphy = wdev->wiphy; in cfg80211_tx_mgmt_expired()
16455 struct wiphy *wiphy = dev->ieee80211_ptr->wiphy; in cfg80211_new_sta()
16471 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_new_sta()
16479 struct wiphy *wiphy = dev->ieee80211_ptr->wiphy; in cfg80211_del_sta_sinfo()
16501 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_del_sta_sinfo()
16510 struct wiphy *wiphy = dev->ieee80211_ptr->wiphy; in cfg80211_conn_failed()
16525 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in cfg80211_conn_failed()
16532 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_conn_failed()
16544 struct wireless_dev *wdev = dev->ieee80211_ptr; in __nl80211_unexpected_frame()
16545 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in __nl80211_unexpected_frame()
16548 u32 nlportid = READ_ONCE(wdev->ap_unexpected_nlportid); in __nl80211_unexpected_frame()
16563 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in __nl80211_unexpected_frame()
16564 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in __nl80211_unexpected_frame()
16569 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); in __nl80211_unexpected_frame()
16580 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_rx_spurious_frame()
16585 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP && in cfg80211_rx_spurious_frame()
16586 wdev->iftype != NL80211_IFTYPE_P2P_GO)) { in cfg80211_rx_spurious_frame()
16600 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_rx_unexpected_4addr_frame()
16605 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP && in cfg80211_rx_unexpected_4addr_frame()
16606 wdev->iftype != NL80211_IFTYPE_P2P_GO && in cfg80211_rx_unexpected_4addr_frame()
16607 wdev->iftype != NL80211_IFTYPE_AP_VLAN)) { in cfg80211_rx_unexpected_4addr_frame()
16624 struct net_device *netdev = wdev->netdev; in nl80211_send_mgmt()
16630 return -ENOMEM; in nl80211_send_mgmt()
16635 return -ENOMEM; in nl80211_send_mgmt()
16638 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_mgmt()
16640 netdev->ifindex)) || in nl80211_send_mgmt()
16654 return genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); in nl80211_send_mgmt()
16658 return -ENOBUFS; in nl80211_send_mgmt()
16665 struct wiphy *wiphy = wdev->wiphy; in nl80211_frame_tx_status()
16667 struct net_device *netdev = wdev->netdev; in nl80211_frame_tx_status()
16686 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_frame_tx_status()
16688 netdev->ifindex)) || in nl80211_frame_tx_status()
16699 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_frame_tx_status()
16728 struct wireless_dev *wdev = dev->ieee80211_ptr; in __nl80211_rx_control_port()
16729 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in __nl80211_rx_control_port()
16731 const u8 *addr = ehdr->h_source; in __nl80211_rx_control_port()
16732 u16 proto = be16_to_cpu(skb->protocol); in __nl80211_rx_control_port()
16737 u32 nlportid = READ_ONCE(wdev->conn_owner_nlportid); in __nl80211_rx_control_port()
16740 return -ENOENT; in __nl80211_rx_control_port()
16742 msg = nlmsg_new(100 + skb->len, gfp); in __nl80211_rx_control_port()
16744 return -ENOMEM; in __nl80211_rx_control_port()
16749 return -ENOBUFS; in __nl80211_rx_control_port()
16752 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in __nl80211_rx_control_port()
16753 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in __nl80211_rx_control_port()
16762 frame = nla_reserve(msg, NL80211_ATTR_FRAME, skb->len); in __nl80211_rx_control_port()
16766 skb_copy_bits(skb, 0, nla_data(frame), skb->len); in __nl80211_rx_control_port()
16769 return genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); in __nl80211_rx_control_port()
16773 return -ENOBUFS; in __nl80211_rx_control_port()
16791 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_prepare_cqm()
16792 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_prepare_cqm()
16799 cb = (void **)msg->cb; in cfg80211_prepare_cqm()
16807 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_prepare_cqm()
16808 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) in cfg80211_prepare_cqm()
16828 void **cb = (void **)msg->cb; in cfg80211_send_cqm()
16834 memset(msg->cb, 0, sizeof(msg->cb)); in cfg80211_send_cqm()
16836 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_send_cqm()
16845 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_cqm_rssi_notify()
16846 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_cqm_rssi_notify()
16854 if (wdev->cqm_config) { in cfg80211_cqm_rssi_notify()
16855 wdev->cqm_config->last_rssi_event_value = rssi_level; in cfg80211_cqm_rssi_notify()
16860 rssi_level = wdev->cqm_config->last_rssi_event_value; in cfg80211_cqm_rssi_notify()
16970 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_gtk_rekey_notify()
16971 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_gtk_rekey_notify()
16987 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_gtk_rekey_notify()
16998 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_gtk_rekey_notify()
16999 struct wiphy *wiphy = wdev->wiphy; in cfg80211_gtk_rekey_notify()
17026 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_pmksa_candidate_notify()
17027 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex)) in nl80211_pmksa_candidate_notify()
17044 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_pmksa_candidate_notify()
17055 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_pmksa_candidate_notify()
17056 struct wiphy *wiphy = wdev->wiphy; in cfg80211_pmksa_candidate_notify()
17084 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex)) in nl80211_ch_switch_notify()
17096 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_ch_switch_notify()
17107 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_ch_switch_notify()
17108 struct wiphy *wiphy = wdev->wiphy; in cfg80211_ch_switch_notify()
17115 wdev->chandef = *chandef; in cfg80211_ch_switch_notify()
17116 wdev->preset_chandef = *chandef; in cfg80211_ch_switch_notify()
17118 if (wdev->iftype == NL80211_IFTYPE_STATION && in cfg80211_ch_switch_notify()
17119 !WARN_ON(!wdev->current_bss)) in cfg80211_ch_switch_notify()
17120 cfg80211_update_assoc_bss_entry(wdev, chandef->chan); in cfg80211_ch_switch_notify()
17133 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_ch_switch_started_notify()
17134 struct wiphy *wiphy = wdev->wiphy; in cfg80211_ch_switch_started_notify()
17163 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx)) in nl80211_radar_notify()
17168 struct wireless_dev *wdev = netdev->ieee80211_ptr; in nl80211_radar_notify()
17170 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_radar_notify()
17184 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_radar_notify()
17197 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_sta_opmode_change_notify()
17198 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_sta_opmode_change_notify()
17214 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx)) in cfg80211_sta_opmode_change_notify()
17217 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) in cfg80211_sta_opmode_change_notify()
17223 if ((sta_opmode->changed & STA_OPMODE_SMPS_MODE_CHANGED) && in cfg80211_sta_opmode_change_notify()
17224 nla_put_u8(msg, NL80211_ATTR_SMPS_MODE, sta_opmode->smps_mode)) in cfg80211_sta_opmode_change_notify()
17227 if ((sta_opmode->changed & STA_OPMODE_MAX_BW_CHANGED) && in cfg80211_sta_opmode_change_notify()
17228 nla_put_u32(msg, NL80211_ATTR_CHANNEL_WIDTH, sta_opmode->bw)) in cfg80211_sta_opmode_change_notify()
17231 if ((sta_opmode->changed & STA_OPMODE_N_SS_CHANGED) && in cfg80211_sta_opmode_change_notify()
17232 nla_put_u8(msg, NL80211_ATTR_NSS, sta_opmode->rx_nss)) in cfg80211_sta_opmode_change_notify()
17237 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_sta_opmode_change_notify()
17251 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_probe_status()
17252 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_probe_status()
17269 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_probe_status()
17270 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in cfg80211_probe_status()
17281 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_probe_status()
17300 spin_lock_bh(&rdev->beacon_registrations_lock); in cfg80211_report_obss_beacon_khz()
17301 list_for_each_entry(reg, &rdev->beacon_registrations, list) { in cfg80211_report_obss_beacon_khz()
17304 spin_unlock_bh(&rdev->beacon_registrations_lock); in cfg80211_report_obss_beacon_khz()
17312 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_report_obss_beacon_khz()
17325 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, reg->nlportid); in cfg80211_report_obss_beacon_khz()
17327 spin_unlock_bh(&rdev->beacon_registrations_lock); in cfg80211_report_obss_beacon_khz()
17331 spin_unlock_bh(&rdev->beacon_registrations_lock); in cfg80211_report_obss_beacon_khz()
17340 struct cfg80211_wowlan_nd_info *nd = wakeup->net_detect; in cfg80211_net_detect_results()
17347 return -EMSGSIZE; in cfg80211_net_detect_results()
17349 for (i = 0; i < nd->n_matches; i++) { in cfg80211_net_detect_results()
17350 struct cfg80211_wowlan_nd_match *match = nd->matches[i]; in cfg80211_net_detect_results()
17363 if (nla_put(msg, NL80211_ATTR_SSID, match->ssid.ssid_len, in cfg80211_net_detect_results()
17364 match->ssid.ssid)) { in cfg80211_net_detect_results()
17369 if (match->n_channels) { in cfg80211_net_detect_results()
17377 for (j = 0; j < match->n_channels; j++) { in cfg80211_net_detect_results()
17378 if (nla_put_u32(msg, j, match->channels[j])) { in cfg80211_net_detect_results()
17400 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_report_wowlan_wakeup()
17405 trace_cfg80211_report_wowlan_wakeup(wdev->wiphy, wdev, wakeup); in cfg80211_report_wowlan_wakeup()
17408 size += wakeup->packet_present_len; in cfg80211_report_wowlan_wakeup()
17418 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_report_wowlan_wakeup()
17423 if (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, in cfg80211_report_wowlan_wakeup()
17424 wdev->netdev->ifindex)) in cfg80211_report_wowlan_wakeup()
17435 if (wakeup->disconnect && in cfg80211_report_wowlan_wakeup()
17438 if (wakeup->magic_pkt && in cfg80211_report_wowlan_wakeup()
17441 if (wakeup->gtk_rekey_failure && in cfg80211_report_wowlan_wakeup()
17444 if (wakeup->eap_identity_req && in cfg80211_report_wowlan_wakeup()
17447 if (wakeup->four_way_handshake && in cfg80211_report_wowlan_wakeup()
17450 if (wakeup->rfkill_release && in cfg80211_report_wowlan_wakeup()
17454 if (wakeup->pattern_idx >= 0 && in cfg80211_report_wowlan_wakeup()
17456 wakeup->pattern_idx)) in cfg80211_report_wowlan_wakeup()
17459 if (wakeup->tcp_match && in cfg80211_report_wowlan_wakeup()
17463 if (wakeup->tcp_connlost && in cfg80211_report_wowlan_wakeup()
17467 if (wakeup->tcp_nomoretokens && in cfg80211_report_wowlan_wakeup()
17472 if (wakeup->packet) { in cfg80211_report_wowlan_wakeup()
17476 if (!wakeup->packet_80211) { in cfg80211_report_wowlan_wakeup()
17483 if (wakeup->packet_len && in cfg80211_report_wowlan_wakeup()
17484 nla_put_u32(msg, len_attr, wakeup->packet_len)) in cfg80211_report_wowlan_wakeup()
17487 if (nla_put(msg, pkt_attr, wakeup->packet_present_len, in cfg80211_report_wowlan_wakeup()
17488 wakeup->packet)) in cfg80211_report_wowlan_wakeup()
17492 if (wakeup->net_detect && in cfg80211_report_wowlan_wakeup()
17501 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_report_wowlan_wakeup()
17515 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_tdls_oper_request()
17516 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_tdls_oper_request()
17520 trace_cfg80211_tdls_oper_request(wdev->wiphy, dev, peer, oper, in cfg80211_tdls_oper_request()
17533 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_tdls_oper_request()
17534 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in cfg80211_tdls_oper_request()
17543 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_tdls_oper_request()
17561 if (state != NETLINK_URELEASE || notify->protocol != NETLINK_GENERIC) in nl80211_netlink_notify()
17570 &rdev->sched_scan_req_list, in nl80211_netlink_notify()
17572 if (sched_scan_req->owner_nlportid == notify->portid) { in nl80211_netlink_notify()
17573 sched_scan_req->nl_owner_dead = true; in nl80211_netlink_notify()
17574 schedule_work(&rdev->sched_scan_stop_wk); in nl80211_netlink_notify()
17578 list_for_each_entry_rcu(wdev, &rdev->wiphy.wdev_list, list) { in nl80211_netlink_notify()
17579 cfg80211_mlme_unregister_socket(wdev, notify->portid); in nl80211_netlink_notify()
17581 if (wdev->owner_nlportid == notify->portid) { in nl80211_netlink_notify()
17582 wdev->nl_owner_dead = true; in nl80211_netlink_notify()
17583 schedule_work(&rdev->destroy_work); in nl80211_netlink_notify()
17584 } else if (wdev->conn_owner_nlportid == notify->portid) { in nl80211_netlink_notify()
17585 schedule_work(&wdev->disconnect_wk); in nl80211_netlink_notify()
17588 cfg80211_release_pmsr(wdev, notify->portid); in nl80211_netlink_notify()
17591 spin_lock_bh(&rdev->beacon_registrations_lock); in nl80211_netlink_notify()
17592 list_for_each_entry_safe(reg, tmp, &rdev->beacon_registrations, in nl80211_netlink_notify()
17594 if (reg->nlportid == notify->portid) { in nl80211_netlink_notify()
17595 list_del(&reg->list); in nl80211_netlink_notify()
17600 spin_unlock_bh(&rdev->beacon_registrations_lock); in nl80211_netlink_notify()
17609 regulatory_netlink_notify(notify->portid); in nl80211_netlink_notify()
17620 struct wiphy *wiphy = netdev->ieee80211_ptr->wiphy; in cfg80211_ft_event()
17627 if (!ft_event->target_ap) in cfg80211_ft_event()
17630 msg = nlmsg_new(100 + ft_event->ies_len + ft_event->ric_ies_len, in cfg80211_ft_event()
17639 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_ft_event()
17640 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in cfg80211_ft_event()
17641 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, ft_event->target_ap)) in cfg80211_ft_event()
17644 if (ft_event->ies && in cfg80211_ft_event()
17645 nla_put(msg, NL80211_ATTR_IE, ft_event->ies_len, ft_event->ies)) in cfg80211_ft_event()
17647 if (ft_event->ric_ies && in cfg80211_ft_event()
17648 nla_put(msg, NL80211_ATTR_IE_RIC, ft_event->ric_ies_len, in cfg80211_ft_event()
17649 ft_event->ric_ies)) in cfg80211_ft_event()
17654 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_ft_event()
17669 rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_crit_proto_stopped()
17670 if (!rdev->crit_proto_nlportid) in cfg80211_crit_proto_stopped()
17673 nlportid = rdev->crit_proto_nlportid; in cfg80211_crit_proto_stopped()
17674 rdev->crit_proto_nlportid = 0; in cfg80211_crit_proto_stopped()
17684 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_crit_proto_stopped()
17691 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); in cfg80211_crit_proto_stopped()
17701 struct wiphy *wiphy = wdev->wiphy; in nl80211_send_ap_stopped()
17714 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_ap_stopped()
17715 nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex) || in nl80211_send_ap_stopped()
17733 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_external_auth_request()
17734 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_external_auth_request()
17738 if (!wdev->conn_owner_nlportid) in cfg80211_external_auth_request()
17739 return -EINVAL; in cfg80211_external_auth_request()
17743 return -ENOMEM; in cfg80211_external_auth_request()
17749 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_external_auth_request()
17750 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in cfg80211_external_auth_request()
17751 nla_put_u32(msg, NL80211_ATTR_AKM_SUITES, params->key_mgmt_suite) || in cfg80211_external_auth_request()
17753 params->action) || in cfg80211_external_auth_request()
17754 nla_put(msg, NL80211_ATTR_BSSID, ETH_ALEN, params->bssid) || in cfg80211_external_auth_request()
17755 nla_put(msg, NL80211_ATTR_SSID, params->ssid.ssid_len, in cfg80211_external_auth_request()
17756 params->ssid.ssid)) in cfg80211_external_auth_request()
17760 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, in cfg80211_external_auth_request()
17761 wdev->conn_owner_nlportid); in cfg80211_external_auth_request()
17766 return -ENOBUFS; in cfg80211_external_auth_request()
17774 struct wiphy *wiphy = netdev->ieee80211_ptr->wiphy; in cfg80211_update_owe_info_event()
17789 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_update_owe_info_event()
17790 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in cfg80211_update_owe_info_event()
17791 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, owe_info->peer)) in cfg80211_update_owe_info_event()
17794 if (!owe_info->ie_len || in cfg80211_update_owe_info_event()
17795 nla_put(msg, NL80211_ATTR_IE, owe_info->ie_len, owe_info->ie)) in cfg80211_update_owe_info_event()
17800 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_update_owe_info_event()