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),
478 /* allow 3 for NUL-termination, we used to declare this NLA_STRING */
546 NLA_POLICY_MAX(NLA_U8, NUM_NL80211_PLINK_STATES - 1),
641 [NL80211_ATTR_TSID] = NLA_POLICY_MAX(NLA_U8, IEEE80211_NUM_TIDS - 1),
643 NLA_POLICY_MAX(NLA_U8, IEEE80211_NUM_UPS - 1),
655 NLA_POLICY_MAX(NLA_U8, NUM_NL80211_P2P_PS_STATUS - 1),
703 [NL80211_ATTR_VLAN_ID] = NLA_POLICY_RANGE(NLA_U16, 1, VLAN_N_VID - 2),
733 [NL80211_KEY_TYPE] = NLA_POLICY_MAX(NLA_U32, NUM_NL80211_KEYTYPES - 1),
888 if (!cb->args[0]) { in nl80211_prepare_wdev_dump()
894 return -ENOMEM; in nl80211_prepare_wdev_dump()
896 err = nlmsg_parse_deprecated(cb->nlh, in nl80211_prepare_wdev_dump()
905 *wdev = __cfg80211_wdev_from_attrs(sock_net(cb->skb->sk), in nl80211_prepare_wdev_dump()
910 *rdev = wiphy_to_rdev((*wdev)->wiphy); in nl80211_prepare_wdev_dump()
911 /* 0 is the first index - add 1 to parse only once */ in nl80211_prepare_wdev_dump()
912 cb->args[0] = (*rdev)->wiphy_idx + 1; in nl80211_prepare_wdev_dump()
913 cb->args[1] = (*wdev)->identifier; in nl80211_prepare_wdev_dump()
916 struct wiphy *wiphy = wiphy_idx_to_wiphy(cb->args[0] - 1); in nl80211_prepare_wdev_dump()
920 return -ENODEV; in nl80211_prepare_wdev_dump()
924 list_for_each_entry(tmp, &(*rdev)->wiphy.wdev_list, list) { in nl80211_prepare_wdev_dump()
925 if (tmp->identifier == cb->args[1]) { in nl80211_prepare_wdev_dump()
932 return -ENODEV; in nl80211_prepare_wdev_dump()
963 rule->wmm_rule.client[j].cw_min) || in nl80211_msg_put_wmm_rules()
965 rule->wmm_rule.client[j].cw_max) || in nl80211_msg_put_wmm_rules()
967 rule->wmm_rule.client[j].aifsn) || in nl80211_msg_put_wmm_rules()
969 rule->wmm_rule.client[j].cot)) in nl80211_msg_put_wmm_rules()
979 return -ENOBUFS; in nl80211_msg_put_wmm_rules()
987 * list to protect old user-space tools from breaking in nl80211_msg_put_channel()
989 if (!large && chan->flags & in nl80211_msg_put_channel()
992 if (!large && chan->freq_offset) in nl80211_msg_put_channel()
996 chan->center_freq)) in nl80211_msg_put_channel()
999 if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_OFFSET, chan->freq_offset)) in nl80211_msg_put_channel()
1002 if ((chan->flags & IEEE80211_CHAN_DISABLED) && in nl80211_msg_put_channel()
1005 if (chan->flags & IEEE80211_CHAN_NO_IR) { in nl80211_msg_put_channel()
1011 if (chan->flags & IEEE80211_CHAN_RADAR) { in nl80211_msg_put_channel()
1017 time = elapsed_jiffies_msecs(chan->dfs_state_entered); in nl80211_msg_put_channel()
1020 chan->dfs_state)) in nl80211_msg_put_channel()
1027 chan->dfs_cac_ms)) in nl80211_msg_put_channel()
1033 if ((chan->flags & IEEE80211_CHAN_NO_HT40MINUS) && in nl80211_msg_put_channel()
1036 if ((chan->flags & IEEE80211_CHAN_NO_HT40PLUS) && in nl80211_msg_put_channel()
1039 if ((chan->flags & IEEE80211_CHAN_NO_80MHZ) && in nl80211_msg_put_channel()
1042 if ((chan->flags & IEEE80211_CHAN_NO_160MHZ) && in nl80211_msg_put_channel()
1045 if ((chan->flags & IEEE80211_CHAN_INDOOR_ONLY) && in nl80211_msg_put_channel()
1048 if ((chan->flags & IEEE80211_CHAN_IR_CONCURRENT) && in nl80211_msg_put_channel()
1051 if ((chan->flags & IEEE80211_CHAN_NO_20MHZ) && in nl80211_msg_put_channel()
1054 if ((chan->flags & IEEE80211_CHAN_NO_10MHZ) && in nl80211_msg_put_channel()
1057 if ((chan->flags & IEEE80211_CHAN_NO_HE) && in nl80211_msg_put_channel()
1060 if ((chan->flags & IEEE80211_CHAN_1MHZ) && in nl80211_msg_put_channel()
1063 if ((chan->flags & IEEE80211_CHAN_2MHZ) && in nl80211_msg_put_channel()
1066 if ((chan->flags & IEEE80211_CHAN_4MHZ) && in nl80211_msg_put_channel()
1069 if ((chan->flags & IEEE80211_CHAN_8MHZ) && in nl80211_msg_put_channel()
1072 if ((chan->flags & IEEE80211_CHAN_16MHZ) && in nl80211_msg_put_channel()
1078 DBM_TO_MBM(chan->max_power))) in nl80211_msg_put_channel()
1083 freq_reg_info(wiphy, MHZ_TO_KHZ(chan->center_freq)); in nl80211_msg_put_channel()
1085 if (!IS_ERR_OR_NULL(rule) && rule->has_wmm) { in nl80211_msg_put_channel()
1094 return -ENOBUFS; in nl80211_msg_put_channel()
1104 if (txqstats->filled & BIT(NL80211_TXQ_STATS_ ## attr) && \ in nl80211_put_txq_stats()
1105 nla_put_u32(msg, NL80211_TXQ_STATS_ ## attr, txqstats->memb)) \ in nl80211_put_txq_stats()
1146 info->extack); in nl80211_parse_key_new()
1150 k->def = !!tb[NL80211_KEY_DEFAULT]; in nl80211_parse_key_new()
1151 k->defmgmt = !!tb[NL80211_KEY_DEFAULT_MGMT]; in nl80211_parse_key_new()
1152 k->defbeacon = !!tb[NL80211_KEY_DEFAULT_BEACON]; in nl80211_parse_key_new()
1154 if (k->def) { in nl80211_parse_key_new()
1155 k->def_uni = true; in nl80211_parse_key_new()
1156 k->def_multi = true; in nl80211_parse_key_new()
1158 if (k->defmgmt || k->defbeacon) in nl80211_parse_key_new()
1159 k->def_multi = true; in nl80211_parse_key_new()
1162 k->idx = nla_get_u8(tb[NL80211_KEY_IDX]); in nl80211_parse_key_new()
1165 k->p.key = nla_data(tb[NL80211_KEY_DATA]); in nl80211_parse_key_new()
1166 k->p.key_len = nla_len(tb[NL80211_KEY_DATA]); in nl80211_parse_key_new()
1170 k->p.seq = nla_data(tb[NL80211_KEY_SEQ]); in nl80211_parse_key_new()
1171 k->p.seq_len = nla_len(tb[NL80211_KEY_SEQ]); in nl80211_parse_key_new()
1175 k->p.cipher = nla_get_u32(tb[NL80211_KEY_CIPHER]); in nl80211_parse_key_new()
1178 k->type = nla_get_u32(tb[NL80211_KEY_TYPE]); in nl80211_parse_key_new()
1184 NUM_NL80211_KEY_DEFAULT_TYPES - 1, in nl80211_parse_key_new()
1187 info->extack); in nl80211_parse_key_new()
1191 k->def_uni = kdt[NL80211_KEY_DEFAULT_TYPE_UNICAST]; in nl80211_parse_key_new()
1192 k->def_multi = kdt[NL80211_KEY_DEFAULT_TYPE_MULTICAST]; in nl80211_parse_key_new()
1196 k->p.mode = nla_get_u8(tb[NL80211_KEY_MODE]); in nl80211_parse_key_new()
1203 if (info->attrs[NL80211_ATTR_KEY_DATA]) { in nl80211_parse_key_old()
1204 k->p.key = nla_data(info->attrs[NL80211_ATTR_KEY_DATA]); in nl80211_parse_key_old()
1205 k->p.key_len = nla_len(info->attrs[NL80211_ATTR_KEY_DATA]); in nl80211_parse_key_old()
1208 if (info->attrs[NL80211_ATTR_KEY_SEQ]) { in nl80211_parse_key_old()
1209 k->p.seq = nla_data(info->attrs[NL80211_ATTR_KEY_SEQ]); in nl80211_parse_key_old()
1210 k->p.seq_len = nla_len(info->attrs[NL80211_ATTR_KEY_SEQ]); in nl80211_parse_key_old()
1213 if (info->attrs[NL80211_ATTR_KEY_IDX]) in nl80211_parse_key_old()
1214 k->idx = nla_get_u8(info->attrs[NL80211_ATTR_KEY_IDX]); in nl80211_parse_key_old()
1216 if (info->attrs[NL80211_ATTR_KEY_CIPHER]) in nl80211_parse_key_old()
1217 k->p.cipher = nla_get_u32(info->attrs[NL80211_ATTR_KEY_CIPHER]); in nl80211_parse_key_old()
1219 k->def = !!info->attrs[NL80211_ATTR_KEY_DEFAULT]; in nl80211_parse_key_old()
1220 k->defmgmt = !!info->attrs[NL80211_ATTR_KEY_DEFAULT_MGMT]; in nl80211_parse_key_old()
1222 if (k->def) { in nl80211_parse_key_old()
1223 k->def_uni = true; in nl80211_parse_key_old()
1224 k->def_multi = true; in nl80211_parse_key_old()
1226 if (k->defmgmt) in nl80211_parse_key_old()
1227 k->def_multi = true; in nl80211_parse_key_old()
1229 if (info->attrs[NL80211_ATTR_KEY_TYPE]) in nl80211_parse_key_old()
1230 k->type = nla_get_u32(info->attrs[NL80211_ATTR_KEY_TYPE]); in nl80211_parse_key_old()
1232 if (info->attrs[NL80211_ATTR_KEY_DEFAULT_TYPES]) { in nl80211_parse_key_old()
1235 NUM_NL80211_KEY_DEFAULT_TYPES - 1, in nl80211_parse_key_old()
1236 info->attrs[NL80211_ATTR_KEY_DEFAULT_TYPES], in nl80211_parse_key_old()
1238 info->extack); in nl80211_parse_key_old()
1242 k->def_uni = kdt[NL80211_KEY_DEFAULT_TYPE_UNICAST]; in nl80211_parse_key_old()
1243 k->def_multi = kdt[NL80211_KEY_DEFAULT_TYPE_MULTICAST]; in nl80211_parse_key_old()
1254 k->idx = -1; in nl80211_parse_key()
1255 k->type = -1; in nl80211_parse_key()
1257 if (info->attrs[NL80211_ATTR_KEY]) in nl80211_parse_key()
1258 err = nl80211_parse_key_new(info, info->attrs[NL80211_ATTR_KEY], k); in nl80211_parse_key()
1265 if ((k->def ? 1 : 0) + (k->defmgmt ? 1 : 0) + in nl80211_parse_key()
1266 (k->defbeacon ? 1 : 0) > 1) { in nl80211_parse_key()
1269 return -EINVAL; in nl80211_parse_key()
1272 if (k->defmgmt || k->defbeacon) { in nl80211_parse_key()
1273 if (k->def_uni || !k->def_multi) { in nl80211_parse_key()
1276 return -EINVAL; in nl80211_parse_key()
1280 if (k->idx != -1) { in nl80211_parse_key()
1281 if (k->defmgmt) { in nl80211_parse_key()
1282 if (k->idx < 4 || k->idx > 5) { in nl80211_parse_key()
1285 return -EINVAL; in nl80211_parse_key()
1287 } else if (k->defbeacon) { in nl80211_parse_key()
1288 if (k->idx < 6 || k->idx > 7) { in nl80211_parse_key()
1291 return -EINVAL; in nl80211_parse_key()
1293 } else if (k->def) { in nl80211_parse_key()
1294 if (k->idx < 0 || k->idx > 3) { in nl80211_parse_key()
1295 GENL_SET_ERR_MSG(info, "def key idx not 0-3"); in nl80211_parse_key()
1296 return -EINVAL; in nl80211_parse_key()
1299 if (k->idx < 0 || k->idx > 7) { in nl80211_parse_key()
1300 GENL_SET_ERR_MSG(info, "key idx not 0-7"); in nl80211_parse_key()
1301 return -EINVAL; in nl80211_parse_key()
1313 struct nlattr *keys = info->attrs[NL80211_ATTR_KEYS]; in nl80211_parse_connkeys()
1330 return ERR_PTR(-ENOMEM); in nl80211_parse_connkeys()
1332 result->def = -1; in nl80211_parse_connkeys()
1336 parse.idx = -1; in nl80211_parse_connkeys()
1341 err = -EINVAL; in nl80211_parse_connkeys()
1345 GENL_SET_ERR_MSG(info, "key index out of range [0-3]"); in nl80211_parse_connkeys()
1355 result->def = parse.idx; in nl80211_parse_connkeys()
1367 err = -EINVAL; in nl80211_parse_connkeys()
1370 result->params[parse.idx].cipher = parse.p.cipher; in nl80211_parse_connkeys()
1371 result->params[parse.idx].key_len = parse.p.key_len; in nl80211_parse_connkeys()
1372 result->params[parse.idx].key = result->data[parse.idx]; in nl80211_parse_connkeys()
1373 memcpy(result->data[parse.idx], parse.p.key, parse.p.key_len); in nl80211_parse_connkeys()
1380 if (result->def < 0) { in nl80211_parse_connkeys()
1381 err = -EINVAL; in nl80211_parse_connkeys()
1396 switch (wdev->iftype) { in nl80211_key_allowed()
1405 if (!wdev->current_bss) in nl80211_key_allowed()
1406 return -ENOLINK; in nl80211_key_allowed()
1415 return -EINVAL; in nl80211_key_allowed()
1427 if (!chan || chan->flags & IEEE80211_CHAN_DISABLED) in nl80211_get_valid_chan()
1452 return -ENOBUFS; in nl80211_put_iftypes()
1467 for (i = 0; i < wiphy->n_iface_combinations; i++) { in nl80211_put_iface_combinations()
1471 c = &wiphy->iface_combinations[i]; in nl80211_put_iface_combinations()
1482 for (j = 0; j < c->n_limits; j++) { in nl80211_put_iface_combinations()
1489 c->limits[j].max)) in nl80211_put_iface_combinations()
1492 c->limits[j].types)) in nl80211_put_iface_combinations()
1499 if (c->beacon_int_infra_match && in nl80211_put_iface_combinations()
1503 c->num_different_channels) || in nl80211_put_iface_combinations()
1505 c->max_interfaces)) in nl80211_put_iface_combinations()
1509 c->radar_detect_widths) || in nl80211_put_iface_combinations()
1511 c->radar_detect_regions))) in nl80211_put_iface_combinations()
1513 if (c->beacon_int_min_gcd && in nl80211_put_iface_combinations()
1515 c->beacon_int_min_gcd)) in nl80211_put_iface_combinations()
1525 return -ENOBUFS; in nl80211_put_iface_combinations()
1532 const struct wiphy_wowlan_tcp_support *tcp = rdev->wiphy.wowlan->tcp; in nl80211_send_wowlan_tcp_caps()
1541 return -ENOBUFS; in nl80211_send_wowlan_tcp_caps()
1544 tcp->data_payload_max)) in nl80211_send_wowlan_tcp_caps()
1545 return -ENOBUFS; in nl80211_send_wowlan_tcp_caps()
1548 tcp->data_payload_max)) in nl80211_send_wowlan_tcp_caps()
1549 return -ENOBUFS; in nl80211_send_wowlan_tcp_caps()
1551 if (tcp->seq && nla_put_flag(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ)) in nl80211_send_wowlan_tcp_caps()
1552 return -ENOBUFS; in nl80211_send_wowlan_tcp_caps()
1554 if (tcp->tok && nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN, in nl80211_send_wowlan_tcp_caps()
1555 sizeof(*tcp->tok), tcp->tok)) in nl80211_send_wowlan_tcp_caps()
1556 return -ENOBUFS; in nl80211_send_wowlan_tcp_caps()
1559 tcp->data_interval_max)) in nl80211_send_wowlan_tcp_caps()
1560 return -ENOBUFS; in nl80211_send_wowlan_tcp_caps()
1563 tcp->wake_payload_max)) in nl80211_send_wowlan_tcp_caps()
1564 return -ENOBUFS; in nl80211_send_wowlan_tcp_caps()
1576 if (!rdev->wiphy.wowlan) in nl80211_send_wowlan()
1582 return -ENOBUFS; in nl80211_send_wowlan()
1584 if (((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_ANY) && in nl80211_send_wowlan()
1586 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_DISCONNECT) && in nl80211_send_wowlan()
1588 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_MAGIC_PKT) && in nl80211_send_wowlan()
1590 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_SUPPORTS_GTK_REKEY) && in nl80211_send_wowlan()
1592 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_GTK_REKEY_FAILURE) && in nl80211_send_wowlan()
1594 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_EAP_IDENTITY_REQ) && in nl80211_send_wowlan()
1596 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_4WAY_HANDSHAKE) && in nl80211_send_wowlan()
1598 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_RFKILL_RELEASE) && in nl80211_send_wowlan()
1600 return -ENOBUFS; in nl80211_send_wowlan()
1602 if (rdev->wiphy.wowlan->n_patterns) { in nl80211_send_wowlan()
1604 .max_patterns = rdev->wiphy.wowlan->n_patterns, in nl80211_send_wowlan()
1605 .min_pattern_len = rdev->wiphy.wowlan->pattern_min_len, in nl80211_send_wowlan()
1606 .max_pattern_len = rdev->wiphy.wowlan->pattern_max_len, in nl80211_send_wowlan()
1607 .max_pkt_offset = rdev->wiphy.wowlan->max_pkt_offset, in nl80211_send_wowlan()
1612 return -ENOBUFS; in nl80211_send_wowlan()
1615 if ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_NET_DETECT) && in nl80211_send_wowlan()
1617 rdev->wiphy.wowlan->max_nd_match_sets)) in nl80211_send_wowlan()
1618 return -ENOBUFS; in nl80211_send_wowlan()
1621 return -ENOBUFS; in nl80211_send_wowlan()
1634 if (!rdev->wiphy.coalesce) in nl80211_send_coalesce()
1637 rule.max_rules = rdev->wiphy.coalesce->n_rules; in nl80211_send_coalesce()
1638 rule.max_delay = rdev->wiphy.coalesce->max_delay; in nl80211_send_coalesce()
1639 rule.pat.max_patterns = rdev->wiphy.coalesce->n_patterns; in nl80211_send_coalesce()
1640 rule.pat.min_pattern_len = rdev->wiphy.coalesce->pattern_min_len; in nl80211_send_coalesce()
1641 rule.pat.max_pattern_len = rdev->wiphy.coalesce->pattern_max_len; in nl80211_send_coalesce()
1642 rule.pat.max_pkt_offset = rdev->wiphy.coalesce->max_pkt_offset; in nl80211_send_coalesce()
1645 return -ENOBUFS; in nl80211_send_coalesce()
1655 const struct ieee80211_sta_he_cap *he_cap = &iftdata->he_cap; in nl80211_send_iftype_data()
1658 iftdata->types_mask)) in nl80211_send_iftype_data()
1659 return -ENOBUFS; in nl80211_send_iftype_data()
1661 if (he_cap->has_he) { in nl80211_send_iftype_data()
1663 sizeof(he_cap->he_cap_elem.mac_cap_info), in nl80211_send_iftype_data()
1664 he_cap->he_cap_elem.mac_cap_info) || in nl80211_send_iftype_data()
1666 sizeof(he_cap->he_cap_elem.phy_cap_info), in nl80211_send_iftype_data()
1667 he_cap->he_cap_elem.phy_cap_info) || in nl80211_send_iftype_data()
1669 sizeof(he_cap->he_mcs_nss_supp), in nl80211_send_iftype_data()
1670 &he_cap->he_mcs_nss_supp) || in nl80211_send_iftype_data()
1672 sizeof(he_cap->ppe_thres), he_cap->ppe_thres)) in nl80211_send_iftype_data()
1673 return -ENOBUFS; in nl80211_send_iftype_data()
1676 if (sband->band == NL80211_BAND_6GHZ && in nl80211_send_iftype_data()
1678 sizeof(iftdata->he_6ghz_capa), in nl80211_send_iftype_data()
1679 &iftdata->he_6ghz_capa)) in nl80211_send_iftype_data()
1680 return -ENOBUFS; in nl80211_send_iftype_data()
1694 if (sband->ht_cap.ht_supported && in nl80211_send_band_rateinfo()
1696 sizeof(sband->ht_cap.mcs), in nl80211_send_band_rateinfo()
1697 &sband->ht_cap.mcs) || in nl80211_send_band_rateinfo()
1699 sband->ht_cap.cap) || in nl80211_send_band_rateinfo()
1701 sband->ht_cap.ampdu_factor) || in nl80211_send_band_rateinfo()
1703 sband->ht_cap.ampdu_density))) in nl80211_send_band_rateinfo()
1704 return -ENOBUFS; in nl80211_send_band_rateinfo()
1707 if (sband->vht_cap.vht_supported && in nl80211_send_band_rateinfo()
1709 sizeof(sband->vht_cap.vht_mcs), in nl80211_send_band_rateinfo()
1710 &sband->vht_cap.vht_mcs) || in nl80211_send_band_rateinfo()
1712 sband->vht_cap.cap))) in nl80211_send_band_rateinfo()
1713 return -ENOBUFS; in nl80211_send_band_rateinfo()
1715 if (large && sband->n_iftype_data) { in nl80211_send_band_rateinfo()
1722 return -ENOBUFS; in nl80211_send_band_rateinfo()
1724 for (i = 0; i < sband->n_iftype_data; i++) { in nl80211_send_band_rateinfo()
1729 return -ENOBUFS; in nl80211_send_band_rateinfo()
1732 &sband->iftype_data[i]); in nl80211_send_band_rateinfo()
1743 if (large && sband->edmg_cap.channels && in nl80211_send_band_rateinfo()
1745 sband->edmg_cap.channels) || in nl80211_send_band_rateinfo()
1747 sband->edmg_cap.bw_config))) in nl80211_send_band_rateinfo()
1749 return -ENOBUFS; in nl80211_send_band_rateinfo()
1754 return -ENOBUFS; in nl80211_send_band_rateinfo()
1756 for (i = 0; i < sband->n_bitrates; i++) { in nl80211_send_band_rateinfo()
1759 return -ENOBUFS; in nl80211_send_band_rateinfo()
1761 rate = &sband->bitrates[i]; in nl80211_send_band_rateinfo()
1763 rate->bitrate)) in nl80211_send_band_rateinfo()
1764 return -ENOBUFS; in nl80211_send_band_rateinfo()
1765 if ((rate->flags & IEEE80211_RATE_SHORT_PREAMBLE) && in nl80211_send_band_rateinfo()
1768 return -ENOBUFS; in nl80211_send_band_rateinfo()
1792 return -ENOBUFS; in nl80211_send_mgmt_stypes()
1797 return -ENOBUFS; in nl80211_send_mgmt_stypes()
1804 return -ENOBUFS; in nl80211_send_mgmt_stypes()
1815 return -ENOBUFS; in nl80211_send_mgmt_stypes()
1820 return -ENOBUFS; in nl80211_send_mgmt_stypes()
1827 return -ENOBUFS; in nl80211_send_mgmt_stypes()
1840 if (rdev->ops->op) { \
1874 if (rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL) in nl80211_add_commands_unsplit()
1879 if (rdev->wiphy.flags & WIPHY_FLAG_NETNS_OK) { in nl80211_add_commands_unsplit()
1884 if (rdev->ops->set_monitor_channel || rdev->ops->start_ap || in nl80211_add_commands_unsplit()
1885 rdev->ops->join_mesh) { in nl80211_add_commands_unsplit()
1891 if (rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) { in nl80211_add_commands_unsplit()
1895 if (rdev->wiphy.max_sched_scan_reqs) in nl80211_add_commands_unsplit()
1899 if (rdev->wiphy.flags & WIPHY_FLAG_REPORTS_OBSS) { in nl80211_add_commands_unsplit()
1910 if (rdev->ops->connect || rdev->ops->auth) { in nl80211_add_commands_unsplit()
1916 if (rdev->ops->disconnect || rdev->ops->deauth) { in nl80211_add_commands_unsplit()
1924 return -ENOBUFS; in nl80211_add_commands_unsplit()
1933 if (!cap->ftm.supported) in nl80211_send_pmsr_ftm_capa()
1938 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
1940 if (cap->ftm.asap && nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_ASAP)) in nl80211_send_pmsr_ftm_capa()
1941 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
1942 if (cap->ftm.non_asap && in nl80211_send_pmsr_ftm_capa()
1944 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
1945 if (cap->ftm.request_lci && in nl80211_send_pmsr_ftm_capa()
1947 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
1948 if (cap->ftm.request_civicloc && in nl80211_send_pmsr_ftm_capa()
1950 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
1952 cap->ftm.preambles)) in nl80211_send_pmsr_ftm_capa()
1953 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
1955 cap->ftm.bandwidths)) in nl80211_send_pmsr_ftm_capa()
1956 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
1957 if (cap->ftm.max_bursts_exponent >= 0 && in nl80211_send_pmsr_ftm_capa()
1959 cap->ftm.max_bursts_exponent)) in nl80211_send_pmsr_ftm_capa()
1960 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
1961 if (cap->ftm.max_ftms_per_burst && in nl80211_send_pmsr_ftm_capa()
1963 cap->ftm.max_ftms_per_burst)) in nl80211_send_pmsr_ftm_capa()
1964 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
1965 if (cap->ftm.trigger_based && in nl80211_send_pmsr_ftm_capa()
1967 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
1968 if (cap->ftm.non_trigger_based && in nl80211_send_pmsr_ftm_capa()
1970 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
1979 const struct cfg80211_pmsr_capabilities *cap = rdev->wiphy.pmsr_capa; in nl80211_send_pmsr_capa()
1992 return -ENOBUFS; in nl80211_send_pmsr_capa()
1994 if (nla_put_u32(msg, NL80211_PMSR_ATTR_MAX_PEERS, cap->max_peers)) in nl80211_send_pmsr_capa()
1995 return -ENOBUFS; in nl80211_send_pmsr_capa()
1997 if (cap->report_ap_tsf && in nl80211_send_pmsr_capa()
1999 return -ENOBUFS; in nl80211_send_pmsr_capa()
2001 if (cap->randomize_mac_addr && in nl80211_send_pmsr_capa()
2003 return -ENOBUFS; in nl80211_send_pmsr_capa()
2007 return -ENOBUFS; in nl80211_send_pmsr_capa()
2010 return -ENOBUFS; in nl80211_send_pmsr_capa()
2026 if (!rdev->wiphy.num_iftype_akm_suites || in nl80211_put_iftype_akm_suites()
2027 !rdev->wiphy.iftype_akm_suites) in nl80211_put_iftype_akm_suites()
2032 return -ENOBUFS; in nl80211_put_iftype_akm_suites()
2034 for (i = 0; i < rdev->wiphy.num_iftype_akm_suites; i++) { in nl80211_put_iftype_akm_suites()
2037 return -ENOBUFS; in nl80211_put_iftype_akm_suites()
2039 iftype_akms = &rdev->wiphy.iftype_akm_suites[i]; in nl80211_put_iftype_akm_suites()
2042 iftype_akms->iftypes_mask)) in nl80211_put_iftype_akm_suites()
2043 return -ENOBUFS; in nl80211_put_iftype_akm_suites()
2046 sizeof(u32) * iftype_akms->n_akm_suites, in nl80211_put_iftype_akm_suites()
2047 iftype_akms->akm_suites)) { in nl80211_put_iftype_akm_suites()
2048 return -ENOBUFS; in nl80211_put_iftype_akm_suites()
2064 if (!rdev->wiphy.tid_config_support.vif && in nl80211_put_tid_config_support()
2065 !rdev->wiphy.tid_config_support.peer) in nl80211_put_tid_config_support()
2070 return -ENOSPC; in nl80211_put_tid_config_support()
2072 if (rdev->wiphy.tid_config_support.vif && in nl80211_put_tid_config_support()
2074 rdev->wiphy.tid_config_support.vif, in nl80211_put_tid_config_support()
2078 if (rdev->wiphy.tid_config_support.peer && in nl80211_put_tid_config_support()
2080 rdev->wiphy.tid_config_support.peer, in nl80211_put_tid_config_support()
2084 /* for now we just use the same value ... makes more sense */ in nl80211_put_tid_config_support()
2086 rdev->wiphy.tid_config_support.max_retry)) in nl80211_put_tid_config_support()
2089 rdev->wiphy.tid_config_support.max_retry)) in nl80211_put_tid_config_support()
2097 return -ENOBUFS; in nl80211_put_tid_config_support()
2120 rdev->wiphy.mgmt_stypes; in nl80211_send_wiphy()
2125 return -ENOBUFS; in nl80211_send_wiphy()
2128 return -EINVAL; in nl80211_send_wiphy()
2130 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_wiphy()
2132 wiphy_name(&rdev->wiphy)) || in nl80211_send_wiphy()
2140 switch (state->split_start) { in nl80211_send_wiphy()
2143 rdev->wiphy.retry_short) || in nl80211_send_wiphy()
2145 rdev->wiphy.retry_long) || in nl80211_send_wiphy()
2147 rdev->wiphy.frag_threshold) || in nl80211_send_wiphy()
2149 rdev->wiphy.rts_threshold) || in nl80211_send_wiphy()
2151 rdev->wiphy.coverage_class) || in nl80211_send_wiphy()
2153 rdev->wiphy.max_scan_ssids) || in nl80211_send_wiphy()
2155 rdev->wiphy.max_sched_scan_ssids) || in nl80211_send_wiphy()
2157 rdev->wiphy.max_scan_ie_len) || in nl80211_send_wiphy()
2159 rdev->wiphy.max_sched_scan_ie_len) || in nl80211_send_wiphy()
2161 rdev->wiphy.max_match_sets)) in nl80211_send_wiphy()
2164 if ((rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN) && in nl80211_send_wiphy()
2167 if ((rdev->wiphy.flags & WIPHY_FLAG_MESH_AUTH) && in nl80211_send_wiphy()
2170 if ((rdev->wiphy.flags & WIPHY_FLAG_AP_UAPSD) && in nl80211_send_wiphy()
2173 if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_FW_ROAM) && in nl80211_send_wiphy()
2176 if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) && in nl80211_send_wiphy()
2179 if ((rdev->wiphy.flags & WIPHY_FLAG_TDLS_EXTERNAL_SETUP) && in nl80211_send_wiphy()
2182 state->split_start++; in nl80211_send_wiphy()
2183 if (state->split) in nl80211_send_wiphy()
2188 sizeof(u32) * rdev->wiphy.n_cipher_suites, in nl80211_send_wiphy()
2189 rdev->wiphy.cipher_suites)) in nl80211_send_wiphy()
2193 rdev->wiphy.max_num_pmkids)) in nl80211_send_wiphy()
2196 if ((rdev->wiphy.flags & WIPHY_FLAG_CONTROL_PORT_PROTOCOL) && in nl80211_send_wiphy()
2201 rdev->wiphy.available_antennas_tx) || in nl80211_send_wiphy()
2203 rdev->wiphy.available_antennas_rx)) in nl80211_send_wiphy()
2206 if ((rdev->wiphy.flags & WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD) && in nl80211_send_wiphy()
2208 rdev->wiphy.probe_resp_offload)) in nl80211_send_wiphy()
2211 if ((rdev->wiphy.available_antennas_tx || in nl80211_send_wiphy()
2212 rdev->wiphy.available_antennas_rx) && in nl80211_send_wiphy()
2213 rdev->ops->get_antenna) { in nl80211_send_wiphy()
2229 state->split_start++; in nl80211_send_wiphy()
2230 if (state->split) in nl80211_send_wiphy()
2235 rdev->wiphy.interface_modes)) in nl80211_send_wiphy()
2237 state->split_start++; in nl80211_send_wiphy()
2238 if (state->split) in nl80211_send_wiphy()
2247 for (band = state->band_start; in nl80211_send_wiphy()
2252 if (band > NL80211_BAND_5GHZ && !state->split) in nl80211_send_wiphy()
2255 sband = rdev->wiphy.bands[band]; in nl80211_send_wiphy()
2264 switch (state->chan_start) { in nl80211_send_wiphy()
2267 state->split)) in nl80211_send_wiphy()
2269 state->chan_start++; in nl80211_send_wiphy()
2270 if (state->split) in nl80211_send_wiphy()
2280 for (i = state->chan_start - 1; in nl80211_send_wiphy()
2281 i < sband->n_channels; in nl80211_send_wiphy()
2288 chan = &sband->channels[i]; in nl80211_send_wiphy()
2291 msg, &rdev->wiphy, chan, in nl80211_send_wiphy()
2292 state->split)) in nl80211_send_wiphy()
2296 if (state->split) in nl80211_send_wiphy()
2299 if (i < sband->n_channels) in nl80211_send_wiphy()
2300 state->chan_start = i + 2; in nl80211_send_wiphy()
2302 state->chan_start = 0; in nl80211_send_wiphy()
2308 if (state->split) { in nl80211_send_wiphy()
2310 if (state->chan_start) in nl80211_send_wiphy()
2311 band--; in nl80211_send_wiphy()
2318 state->band_start = band + 1; in nl80211_send_wiphy()
2320 state->band_start = 0; in nl80211_send_wiphy()
2323 if (state->band_start == 0 && state->chan_start == 0) in nl80211_send_wiphy()
2324 state->split_start++; in nl80211_send_wiphy()
2325 if (state->split) in nl80211_send_wiphy()
2337 if (state->split) { in nl80211_send_wiphy()
2340 if (rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH) in nl80211_send_wiphy()
2343 if (rdev->wiphy.features & in nl80211_send_wiphy()
2353 state->split_start++; in nl80211_send_wiphy()
2354 if (state->split) in nl80211_send_wiphy()
2358 if (rdev->ops->remain_on_channel && in nl80211_send_wiphy()
2359 (rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL) && in nl80211_send_wiphy()
2362 rdev->wiphy.max_remain_on_channel_duration)) in nl80211_send_wiphy()
2365 if ((rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX) && in nl80211_send_wiphy()
2369 state->split_start++; in nl80211_send_wiphy()
2370 if (state->split) in nl80211_send_wiphy()
2375 if (nl80211_send_wowlan(msg, rdev, state->split)) in nl80211_send_wiphy()
2377 state->split_start++; in nl80211_send_wiphy()
2378 if (state->split) in nl80211_send_wiphy()
2381 state->split_start++; in nl80211_send_wiphy()
2386 rdev->wiphy.software_iftypes)) in nl80211_send_wiphy()
2389 if (nl80211_put_iface_combinations(&rdev->wiphy, msg, in nl80211_send_wiphy()
2390 state->split)) in nl80211_send_wiphy()
2393 state->split_start++; in nl80211_send_wiphy()
2394 if (state->split) in nl80211_send_wiphy()
2398 if ((rdev->wiphy.flags & WIPHY_FLAG_HAVE_AP_SME) && in nl80211_send_wiphy()
2400 rdev->wiphy.ap_sme_capa)) in nl80211_send_wiphy()
2403 features = rdev->wiphy.features; in nl80211_send_wiphy()
2405 * We can only add the per-channel limit information if the in nl80211_send_wiphy()
2409 if (state->split) in nl80211_send_wiphy()
2414 if (rdev->wiphy.ht_capa_mod_mask && in nl80211_send_wiphy()
2416 sizeof(*rdev->wiphy.ht_capa_mod_mask), in nl80211_send_wiphy()
2417 rdev->wiphy.ht_capa_mod_mask)) in nl80211_send_wiphy()
2420 if (rdev->wiphy.flags & WIPHY_FLAG_HAVE_AP_SME && in nl80211_send_wiphy()
2421 rdev->wiphy.max_acl_mac_addrs && in nl80211_send_wiphy()
2423 rdev->wiphy.max_acl_mac_addrs)) in nl80211_send_wiphy()
2436 if (state->split) in nl80211_send_wiphy()
2437 state->split_start++; in nl80211_send_wiphy()
2439 state->split_start = 0; in nl80211_send_wiphy()
2446 rdev->wiphy.max_sched_scan_plans) || in nl80211_send_wiphy()
2448 rdev->wiphy.max_sched_scan_plan_interval) || in nl80211_send_wiphy()
2450 rdev->wiphy.max_sched_scan_plan_iterations)) in nl80211_send_wiphy()
2453 if (rdev->wiphy.extended_capabilities && in nl80211_send_wiphy()
2455 rdev->wiphy.extended_capabilities_len, in nl80211_send_wiphy()
2456 rdev->wiphy.extended_capabilities) || in nl80211_send_wiphy()
2458 rdev->wiphy.extended_capabilities_len, in nl80211_send_wiphy()
2459 rdev->wiphy.extended_capabilities_mask))) in nl80211_send_wiphy()
2462 if (rdev->wiphy.vht_capa_mod_mask && in nl80211_send_wiphy()
2464 sizeof(*rdev->wiphy.vht_capa_mod_mask), in nl80211_send_wiphy()
2465 rdev->wiphy.vht_capa_mod_mask)) in nl80211_send_wiphy()
2469 rdev->wiphy.perm_addr)) in nl80211_send_wiphy()
2472 if (!is_zero_ether_addr(rdev->wiphy.addr_mask) && in nl80211_send_wiphy()
2474 rdev->wiphy.addr_mask)) in nl80211_send_wiphy()
2477 if (rdev->wiphy.n_addresses > 1) { in nl80211_send_wiphy()
2484 for (i = 0; i < rdev->wiphy.n_addresses; i++) in nl80211_send_wiphy()
2486 rdev->wiphy.addresses[i].addr)) in nl80211_send_wiphy()
2492 state->split_start++; in nl80211_send_wiphy()
2498 if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_5_10_MHZ) && in nl80211_send_wiphy()
2503 if (rdev->wiphy.max_ap_assoc_sta && in nl80211_send_wiphy()
2505 rdev->wiphy.max_ap_assoc_sta)) in nl80211_send_wiphy()
2508 state->split_start++; in nl80211_send_wiphy()
2511 if (rdev->wiphy.n_vendor_commands) { in nl80211_send_wiphy()
2520 for (i = 0; i < rdev->wiphy.n_vendor_commands; i++) { in nl80211_send_wiphy()
2521 info = &rdev->wiphy.vendor_commands[i].info; in nl80211_send_wiphy()
2528 if (rdev->wiphy.n_vendor_events) { in nl80211_send_wiphy()
2537 for (i = 0; i < rdev->wiphy.n_vendor_events; i++) { in nl80211_send_wiphy()
2538 info = &rdev->wiphy.vendor_events[i]; in nl80211_send_wiphy()
2544 state->split_start++; in nl80211_send_wiphy()
2547 if (rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH && in nl80211_send_wiphy()
2549 rdev->wiphy.max_num_csa_counters)) in nl80211_send_wiphy()
2552 if (rdev->wiphy.regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED && in nl80211_send_wiphy()
2556 if (rdev->wiphy.max_sched_scan_reqs && in nl80211_send_wiphy()
2558 rdev->wiphy.max_sched_scan_reqs)) in nl80211_send_wiphy()
2562 sizeof(rdev->wiphy.ext_features), in nl80211_send_wiphy()
2563 rdev->wiphy.ext_features)) in nl80211_send_wiphy()
2566 if (rdev->wiphy.bss_select_support) { in nl80211_send_wiphy()
2568 u32 bss_select_support = rdev->wiphy.bss_select_support; in nl80211_send_wiphy()
2586 state->split_start++; in nl80211_send_wiphy()
2589 if (rdev->wiphy.num_iftype_ext_capab && in nl80211_send_wiphy()
2590 rdev->wiphy.iftype_ext_capab) { in nl80211_send_wiphy()
2598 for (i = state->capa_start; in nl80211_send_wiphy()
2599 i < rdev->wiphy.num_iftype_ext_capab; i++) { in nl80211_send_wiphy()
2602 capab = &rdev->wiphy.iftype_ext_capab[i]; in nl80211_send_wiphy()
2608 capab->iftype) || in nl80211_send_wiphy()
2610 capab->extended_capabilities_len, in nl80211_send_wiphy()
2611 capab->extended_capabilities) || in nl80211_send_wiphy()
2613 capab->extended_capabilities_len, in nl80211_send_wiphy()
2614 capab->extended_capabilities_mask)) in nl80211_send_wiphy()
2618 if (state->split) in nl80211_send_wiphy()
2622 if (i < rdev->wiphy.num_iftype_ext_capab) { in nl80211_send_wiphy()
2623 state->capa_start = i + 1; in nl80211_send_wiphy()
2629 rdev->wiphy.nan_supported_bands)) in nl80211_send_wiphy()
2632 if (wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_send_wiphy()
2644 rdev->wiphy.txq_limit)) in nl80211_send_wiphy()
2647 rdev->wiphy.txq_memory_limit)) in nl80211_send_wiphy()
2650 rdev->wiphy.txq_quantum)) in nl80211_send_wiphy()
2654 state->split_start++; in nl80211_send_wiphy()
2660 state->split_start++; in nl80211_send_wiphy()
2663 if (rdev->wiphy.akm_suites && in nl80211_send_wiphy()
2665 sizeof(u32) * rdev->wiphy.n_akm_suites, in nl80211_send_wiphy()
2666 rdev->wiphy.akm_suites)) in nl80211_send_wiphy()
2676 state->split_start = 0; in nl80211_send_wiphy()
2685 return -EMSGSIZE; in nl80211_send_wiphy()
2696 return -ENOMEM; in nl80211_dump_wiphy_parse()
2698 ret = nlmsg_parse_deprecated(cb->nlh, in nl80211_dump_wiphy_parse()
2708 state->split = tb[NL80211_ATTR_SPLIT_WIPHY_DUMP]; in nl80211_dump_wiphy_parse()
2710 state->filter_wiphy = nla_get_u32(tb[NL80211_ATTR_WIPHY]); in nl80211_dump_wiphy_parse()
2712 state->filter_wiphy = nla_get_u64(tb[NL80211_ATTR_WDEV]) >> 32; in nl80211_dump_wiphy_parse()
2718 netdev = __dev_get_by_index(sock_net(skb->sk), ifidx); in nl80211_dump_wiphy_parse()
2720 ret = -ENODEV; in nl80211_dump_wiphy_parse()
2723 if (netdev->ieee80211_ptr) { in nl80211_dump_wiphy_parse()
2725 netdev->ieee80211_ptr->wiphy); in nl80211_dump_wiphy_parse()
2726 state->filter_wiphy = rdev->wiphy_idx; in nl80211_dump_wiphy_parse()
2739 struct nl80211_dump_wiphy_state *state = (void *)cb->args[0]; in nl80211_dump_wiphy()
2747 return -ENOMEM; in nl80211_dump_wiphy()
2749 state->filter_wiphy = -1; in nl80211_dump_wiphy()
2756 cb->args[0] = (long)state; in nl80211_dump_wiphy()
2760 if (!net_eq(wiphy_net(&rdev->wiphy), sock_net(skb->sk))) in nl80211_dump_wiphy()
2762 if (++idx <= state->start) in nl80211_dump_wiphy()
2764 if (state->filter_wiphy != -1 && in nl80211_dump_wiphy()
2765 state->filter_wiphy != rdev->wiphy_idx) in nl80211_dump_wiphy()
2771 NETLINK_CB(cb->skb).portid, in nl80211_dump_wiphy()
2772 cb->nlh->nlmsg_seq, in nl80211_dump_wiphy()
2788 if ((ret == -ENOBUFS || ret == -EMSGSIZE) && in nl80211_dump_wiphy()
2789 !skb->len && !state->split && in nl80211_dump_wiphy()
2790 cb->min_dump_alloc < 4096) { in nl80211_dump_wiphy()
2791 cb->min_dump_alloc = 4096; in nl80211_dump_wiphy()
2792 state->split_start = 0; in nl80211_dump_wiphy()
2796 idx--; in nl80211_dump_wiphy()
2799 } while (state->split_start > 0); in nl80211_dump_wiphy()
2804 state->start = idx; in nl80211_dump_wiphy()
2806 return skb->len; in nl80211_dump_wiphy()
2811 kfree((void *)cb->args[0]); in nl80211_dump_wiphy_done()
2818 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_wiphy()
2823 return -ENOMEM; in nl80211_get_wiphy()
2826 info->snd_portid, info->snd_seq, 0, in nl80211_get_wiphy()
2829 return -ENOBUFS; in nl80211_get_wiphy()
2851 return -EINVAL; in parse_txq_params()
2854 txq_params->txop = nla_get_u16(tb[NL80211_TXQ_ATTR_TXOP]); in parse_txq_params()
2855 txq_params->cwmin = nla_get_u16(tb[NL80211_TXQ_ATTR_CWMIN]); in parse_txq_params()
2856 txq_params->cwmax = nla_get_u16(tb[NL80211_TXQ_ATTR_CWMAX]); in parse_txq_params()
2857 txq_params->aifs = nla_get_u8(tb[NL80211_TXQ_ATTR_AIFS]); in parse_txq_params()
2860 return -EINVAL; in parse_txq_params()
2861 txq_params->ac = array_index_nospec(ac, NL80211_NUM_ACS); in parse_txq_params()
2874 * low-level driver when the AP starts or the mesh is joined. in nl80211_can_set_dev_channel()
2876 * the channel in the start-ap or join-mesh commands instead. in nl80211_can_set_dev_channel()
2883 wdev->iftype == NL80211_IFTYPE_AP || in nl80211_can_set_dev_channel()
2884 wdev->iftype == NL80211_IFTYPE_MESH_POINT || in nl80211_can_set_dev_channel()
2885 wdev->iftype == NL80211_IFTYPE_MONITOR || in nl80211_can_set_dev_channel()
2886 wdev->iftype == NL80211_IFTYPE_P2P_GO; in nl80211_can_set_dev_channel()
2893 struct netlink_ext_ack *extack = info->extack; in nl80211_parse_chandef()
2894 struct nlattr **attrs = info->attrs; in nl80211_parse_chandef()
2898 return -EINVAL; in nl80211_parse_chandef()
2901 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ])); in nl80211_parse_chandef()
2902 if (info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]) in nl80211_parse_chandef()
2904 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]); in nl80211_parse_chandef()
2907 chandef->chan = ieee80211_get_channel_khz(&rdev->wiphy, control_freq); in nl80211_parse_chandef()
2908 chandef->width = NL80211_CHAN_WIDTH_20_NOHT; in nl80211_parse_chandef()
2909 chandef->center_freq1 = KHZ_TO_MHZ(control_freq); in nl80211_parse_chandef()
2910 chandef->freq1_offset = control_freq % 1000; in nl80211_parse_chandef()
2911 chandef->center_freq2 = 0; in nl80211_parse_chandef()
2914 if (!chandef->chan || chandef->chan->flags & IEEE80211_CHAN_DISABLED) { in nl80211_parse_chandef()
2917 return -EINVAL; in nl80211_parse_chandef()
2930 cfg80211_chandef_create(chandef, chandef->chan, in nl80211_parse_chandef()
2934 chandef->center_freq1 != nla_get_u32(attrs[NL80211_ATTR_CENTER_FREQ1])) { in nl80211_parse_chandef()
2938 return -EINVAL; in nl80211_parse_chandef()
2946 return -EINVAL; in nl80211_parse_chandef()
2953 return -EINVAL; in nl80211_parse_chandef()
2956 chandef->width = in nl80211_parse_chandef()
2958 if (chandef->chan->band == NL80211_BAND_S1GHZ) { in nl80211_parse_chandef()
2959 /* User input error for channel width doesn't match channel */ in nl80211_parse_chandef()
2960 if (chandef->width != ieee80211_s1g_channel_width(chandef->chan)) { in nl80211_parse_chandef()
2963 "bad channel width"); in nl80211_parse_chandef()
2964 return -EINVAL; in nl80211_parse_chandef()
2968 chandef->center_freq1 = in nl80211_parse_chandef()
2971 chandef->freq1_offset = nla_get_u32( in nl80211_parse_chandef()
2974 chandef->freq1_offset = 0; in nl80211_parse_chandef()
2977 chandef->center_freq2 = in nl80211_parse_chandef()
2981 if (info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]) { in nl80211_parse_chandef()
2982 chandef->edmg.channels = in nl80211_parse_chandef()
2983 nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]); in nl80211_parse_chandef()
2985 if (info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]) in nl80211_parse_chandef()
2986 chandef->edmg.bw_config = in nl80211_parse_chandef()
2987 nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]); in nl80211_parse_chandef()
2989 chandef->edmg.bw_config = 0; in nl80211_parse_chandef()
2990 chandef->edmg.channels = 0; in nl80211_parse_chandef()
2995 return -EINVAL; in nl80211_parse_chandef()
2998 if (!cfg80211_chandef_usable(&rdev->wiphy, chandef, in nl80211_parse_chandef()
3001 return -EINVAL; in nl80211_parse_chandef()
3004 if ((chandef->width == NL80211_CHAN_WIDTH_5 || in nl80211_parse_chandef()
3005 chandef->width == NL80211_CHAN_WIDTH_10) && in nl80211_parse_chandef()
3006 !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_5_10_MHZ)) { in nl80211_parse_chandef()
3008 return -EINVAL; in nl80211_parse_chandef()
3024 wdev = dev->ieee80211_ptr; in __nl80211_set_channel()
3026 return -EOPNOTSUPP; in __nl80211_set_channel()
3028 iftype = wdev->iftype; in __nl80211_set_channel()
3037 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &chandef, in __nl80211_set_channel()
3039 result = -EINVAL; in __nl80211_set_channel()
3042 if (wdev->beacon_interval) { in __nl80211_set_channel()
3043 if (!dev || !rdev->ops->set_ap_chanwidth || in __nl80211_set_channel()
3044 !(rdev->wiphy.features & in __nl80211_set_channel()
3046 result = -EBUSY; in __nl80211_set_channel()
3050 /* Only allow dynamic channel width changes */ in __nl80211_set_channel()
3051 if (chandef.chan != wdev->preset_chandef.chan) { in __nl80211_set_channel()
3052 result = -EBUSY; in __nl80211_set_channel()
3059 wdev->preset_chandef = chandef; in __nl80211_set_channel()
3069 result = -EINVAL; in __nl80211_set_channel()
3077 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_channel()
3078 struct net_device *netdev = info->user_ptr[1]; in nl80211_set_channel()
3085 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_wds_peer()
3086 struct net_device *dev = info->user_ptr[1]; in nl80211_set_wds_peer()
3087 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_wds_peer()
3090 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_set_wds_peer()
3091 return -EINVAL; in nl80211_set_wds_peer()
3094 return -EBUSY; in nl80211_set_wds_peer()
3096 if (!rdev->ops->set_wds_peer) in nl80211_set_wds_peer()
3097 return -EOPNOTSUPP; in nl80211_set_wds_peer()
3099 if (wdev->iftype != NL80211_IFTYPE_WDS) in nl80211_set_wds_peer()
3100 return -EOPNOTSUPP; in nl80211_set_wds_peer()
3102 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_set_wds_peer()
3124 * done for backward compatibility -- previously in nl80211_set_wiphy()
3131 if (info->attrs[NL80211_ATTR_IFINDEX]) { in nl80211_set_wiphy()
3132 int ifindex = nla_get_u32(info->attrs[NL80211_ATTR_IFINDEX]); in nl80211_set_wiphy()
3135 if (netdev && netdev->ieee80211_ptr) in nl80211_set_wiphy()
3136 rdev = wiphy_to_rdev(netdev->ieee80211_ptr->wiphy); in nl80211_set_wiphy()
3143 info->attrs); in nl80211_set_wiphy()
3150 wdev = netdev->ieee80211_ptr; in nl80211_set_wiphy()
3157 if (info->attrs[NL80211_ATTR_WIPHY_NAME]) in nl80211_set_wiphy()
3159 rdev, nla_data(info->attrs[NL80211_ATTR_WIPHY_NAME])); in nl80211_set_wiphy()
3164 if (info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS]) { in nl80211_set_wiphy()
3168 if (!rdev->ops->set_txq_params) in nl80211_set_wiphy()
3169 return -EOPNOTSUPP; in nl80211_set_wiphy()
3172 return -EINVAL; in nl80211_set_wiphy()
3174 if (netdev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && in nl80211_set_wiphy()
3175 netdev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_set_wiphy()
3176 return -EINVAL; in nl80211_set_wiphy()
3179 return -ENETDOWN; in nl80211_set_wiphy()
3182 info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS], in nl80211_set_wiphy()
3188 info->extack); in nl80211_set_wiphy()
3202 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { in nl80211_set_wiphy()
3211 if (info->attrs[NL80211_ATTR_WIPHY_TX_POWER_SETTING]) { in nl80211_set_wiphy()
3216 if (!(rdev->wiphy.features & NL80211_FEATURE_VIF_TXPOWER)) in nl80211_set_wiphy()
3219 if (!rdev->ops->set_tx_power) in nl80211_set_wiphy()
3220 return -EOPNOTSUPP; in nl80211_set_wiphy()
3223 type = nla_get_u32(info->attrs[idx]); in nl80211_set_wiphy()
3225 if (!info->attrs[NL80211_ATTR_WIPHY_TX_POWER_LEVEL] && in nl80211_set_wiphy()
3227 return -EINVAL; in nl80211_set_wiphy()
3231 mbm = nla_get_u32(info->attrs[idx]); in nl80211_set_wiphy()
3239 if (info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX] && in nl80211_set_wiphy()
3240 info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]) { in nl80211_set_wiphy()
3243 if ((!rdev->wiphy.available_antennas_tx && in nl80211_set_wiphy()
3244 !rdev->wiphy.available_antennas_rx) || in nl80211_set_wiphy()
3245 !rdev->ops->set_antenna) in nl80211_set_wiphy()
3246 return -EOPNOTSUPP; in nl80211_set_wiphy()
3248 tx_ant = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX]); in nl80211_set_wiphy()
3249 rx_ant = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]); in nl80211_set_wiphy()
3253 if ((~tx_ant && (tx_ant & ~rdev->wiphy.available_antennas_tx)) || in nl80211_set_wiphy()
3254 (~rx_ant && (rx_ant & ~rdev->wiphy.available_antennas_rx))) in nl80211_set_wiphy()
3255 return -EINVAL; in nl80211_set_wiphy()
3257 tx_ant = tx_ant & rdev->wiphy.available_antennas_tx; in nl80211_set_wiphy()
3258 rx_ant = rx_ant & rdev->wiphy.available_antennas_rx; in nl80211_set_wiphy()
3267 if (info->attrs[NL80211_ATTR_WIPHY_RETRY_SHORT]) { in nl80211_set_wiphy()
3269 info->attrs[NL80211_ATTR_WIPHY_RETRY_SHORT]); in nl80211_set_wiphy()
3274 if (info->attrs[NL80211_ATTR_WIPHY_RETRY_LONG]) { in nl80211_set_wiphy()
3276 info->attrs[NL80211_ATTR_WIPHY_RETRY_LONG]); in nl80211_set_wiphy()
3281 if (info->attrs[NL80211_ATTR_WIPHY_FRAG_THRESHOLD]) { in nl80211_set_wiphy()
3283 info->attrs[NL80211_ATTR_WIPHY_FRAG_THRESHOLD]); in nl80211_set_wiphy()
3285 return -EINVAL; in nl80211_set_wiphy()
3287 if (frag_threshold != (u32) -1) { in nl80211_set_wiphy()
3299 if (info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]) { in nl80211_set_wiphy()
3301 info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]); in nl80211_set_wiphy()
3305 if (info->attrs[NL80211_ATTR_WIPHY_COVERAGE_CLASS]) { in nl80211_set_wiphy()
3306 if (info->attrs[NL80211_ATTR_WIPHY_DYN_ACK]) in nl80211_set_wiphy()
3307 return -EINVAL; in nl80211_set_wiphy()
3310 info->attrs[NL80211_ATTR_WIPHY_COVERAGE_CLASS]); in nl80211_set_wiphy()
3314 if (info->attrs[NL80211_ATTR_WIPHY_DYN_ACK]) { in nl80211_set_wiphy()
3315 if (!(rdev->wiphy.features & NL80211_FEATURE_ACKTO_ESTIMATION)) in nl80211_set_wiphy()
3316 return -EOPNOTSUPP; in nl80211_set_wiphy()
3321 if (info->attrs[NL80211_ATTR_TXQ_LIMIT]) { in nl80211_set_wiphy()
3322 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_set_wiphy()
3324 return -EOPNOTSUPP; in nl80211_set_wiphy()
3326 info->attrs[NL80211_ATTR_TXQ_LIMIT]); in nl80211_set_wiphy()
3330 if (info->attrs[NL80211_ATTR_TXQ_MEMORY_LIMIT]) { in nl80211_set_wiphy()
3331 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_set_wiphy()
3333 return -EOPNOTSUPP; in nl80211_set_wiphy()
3335 info->attrs[NL80211_ATTR_TXQ_MEMORY_LIMIT]); in nl80211_set_wiphy()
3339 if (info->attrs[NL80211_ATTR_TXQ_QUANTUM]) { in nl80211_set_wiphy()
3340 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_set_wiphy()
3342 return -EOPNOTSUPP; in nl80211_set_wiphy()
3344 info->attrs[NL80211_ATTR_TXQ_QUANTUM]); in nl80211_set_wiphy()
3354 if (!rdev->ops->set_wiphy_params) in nl80211_set_wiphy()
3355 return -EOPNOTSUPP; in nl80211_set_wiphy()
3357 old_retry_short = rdev->wiphy.retry_short; in nl80211_set_wiphy()
3358 old_retry_long = rdev->wiphy.retry_long; in nl80211_set_wiphy()
3359 old_frag_threshold = rdev->wiphy.frag_threshold; in nl80211_set_wiphy()
3360 old_rts_threshold = rdev->wiphy.rts_threshold; in nl80211_set_wiphy()
3361 old_coverage_class = rdev->wiphy.coverage_class; in nl80211_set_wiphy()
3362 old_txq_limit = rdev->wiphy.txq_limit; in nl80211_set_wiphy()
3363 old_txq_memory_limit = rdev->wiphy.txq_memory_limit; in nl80211_set_wiphy()
3364 old_txq_quantum = rdev->wiphy.txq_quantum; in nl80211_set_wiphy()
3367 rdev->wiphy.retry_short = retry_short; in nl80211_set_wiphy()
3369 rdev->wiphy.retry_long = retry_long; in nl80211_set_wiphy()
3371 rdev->wiphy.frag_threshold = frag_threshold; in nl80211_set_wiphy()
3373 rdev->wiphy.rts_threshold = rts_threshold; in nl80211_set_wiphy()
3375 rdev->wiphy.coverage_class = coverage_class; in nl80211_set_wiphy()
3377 rdev->wiphy.txq_limit = txq_limit; in nl80211_set_wiphy()
3379 rdev->wiphy.txq_memory_limit = txq_memory_limit; in nl80211_set_wiphy()
3381 rdev->wiphy.txq_quantum = txq_quantum; in nl80211_set_wiphy()
3385 rdev->wiphy.retry_short = old_retry_short; in nl80211_set_wiphy()
3386 rdev->wiphy.retry_long = old_retry_long; in nl80211_set_wiphy()
3387 rdev->wiphy.frag_threshold = old_frag_threshold; in nl80211_set_wiphy()
3388 rdev->wiphy.rts_threshold = old_rts_threshold; in nl80211_set_wiphy()
3389 rdev->wiphy.coverage_class = old_coverage_class; in nl80211_set_wiphy()
3390 rdev->wiphy.txq_limit = old_txq_limit; in nl80211_set_wiphy()
3391 rdev->wiphy.txq_memory_limit = old_txq_memory_limit; in nl80211_set_wiphy()
3392 rdev->wiphy.txq_quantum = old_txq_quantum; in nl80211_set_wiphy()
3403 return -EINVAL; in nl80211_send_chandef()
3406 chandef->chan->center_freq)) in nl80211_send_chandef()
3407 return -ENOBUFS; in nl80211_send_chandef()
3409 chandef->chan->freq_offset)) in nl80211_send_chandef()
3410 return -ENOBUFS; in nl80211_send_chandef()
3411 switch (chandef->width) { in nl80211_send_chandef()
3417 return -ENOBUFS; in nl80211_send_chandef()
3422 if (nla_put_u32(msg, NL80211_ATTR_CHANNEL_WIDTH, chandef->width)) in nl80211_send_chandef()
3423 return -ENOBUFS; in nl80211_send_chandef()
3424 if (nla_put_u32(msg, NL80211_ATTR_CENTER_FREQ1, chandef->center_freq1)) in nl80211_send_chandef()
3425 return -ENOBUFS; in nl80211_send_chandef()
3426 if (chandef->center_freq2 && in nl80211_send_chandef()
3427 nla_put_u32(msg, NL80211_ATTR_CENTER_FREQ2, chandef->center_freq2)) in nl80211_send_chandef()
3428 return -ENOBUFS; in nl80211_send_chandef()
3437 struct net_device *dev = wdev->netdev; in nl80211_send_iface()
3446 return -1; in nl80211_send_iface()
3449 (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in nl80211_send_iface()
3450 nla_put_string(msg, NL80211_ATTR_IFNAME, dev->name))) in nl80211_send_iface()
3453 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_iface()
3454 nla_put_u32(msg, NL80211_ATTR_IFTYPE, wdev->iftype) || in nl80211_send_iface()
3459 rdev->devlist_generation ^ in nl80211_send_iface()
3461 nla_put_u8(msg, NL80211_ATTR_4ADDR, wdev->use_4addr)) in nl80211_send_iface()
3464 if (rdev->ops->get_channel) { in nl80211_send_iface()
3475 if (rdev->ops->get_tx_power) { in nl80211_send_iface()
3486 switch (wdev->iftype) { in nl80211_send_iface()
3489 if (wdev->ssid_len && in nl80211_send_iface()
3490 nla_put(msg, NL80211_ATTR_SSID, wdev->ssid_len, wdev->ssid)) in nl80211_send_iface()
3497 if (!wdev->current_bss) in nl80211_send_iface()
3500 ssid_ie = ieee80211_bss_get_ie(&wdev->current_bss->pub, in nl80211_send_iface()
3514 if (rdev->ops->get_txq_stats) { in nl80211_send_iface()
3533 return -EMSGSIZE; in nl80211_send_iface()
3540 int wp_start = cb->args[0]; in nl80211_dump_interface()
3541 int if_start = cb->args[1]; in nl80211_dump_interface()
3542 int filter_wiphy = -1; in nl80211_dump_interface()
3548 if (!cb->args[2]) { in nl80211_dump_interface()
3550 .filter_wiphy = -1, in nl80211_dump_interface()
3560 * if filtering, set cb->args[2] to +1 since 0 is the default in nl80211_dump_interface()
3564 cb->args[2] = filter_wiphy + 1; in nl80211_dump_interface()
3566 cb->args[2] = -1; in nl80211_dump_interface()
3567 } else if (cb->args[2] > 0) { in nl80211_dump_interface()
3568 filter_wiphy = cb->args[2] - 1; in nl80211_dump_interface()
3572 if (!net_eq(wiphy_net(&rdev->wiphy), sock_net(skb->sk))) in nl80211_dump_interface()
3579 if (filter_wiphy >= 0 && filter_wiphy != rdev->wiphy_idx) in nl80211_dump_interface()
3584 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) { in nl80211_dump_interface()
3589 if (nl80211_send_iface(skb, NETLINK_CB(cb->skb).portid, in nl80211_dump_interface()
3590 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_dump_interface()
3601 cb->args[0] = wp_idx; in nl80211_dump_interface()
3602 cb->args[1] = if_idx; in nl80211_dump_interface()
3604 ret = skb->len; in nl80211_dump_interface()
3614 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_interface()
3615 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_get_interface()
3619 return -ENOMEM; in nl80211_get_interface()
3621 if (nl80211_send_iface(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_interface()
3624 return -ENOBUFS; in nl80211_get_interface()
3647 return -EINVAL; in parse_monitor_flags()
3650 return -EINVAL; in parse_monitor_flags()
3669 if (info->attrs[NL80211_ATTR_MNTR_FLAGS]) { in nl80211_parse_mon_options()
3671 return -EINVAL; in nl80211_parse_mon_options()
3673 err = parse_monitor_flags(info->attrs[NL80211_ATTR_MNTR_FLAGS], in nl80211_parse_mon_options()
3674 ¶ms->flags); in nl80211_parse_mon_options()
3681 if (params->flags & MONITOR_FLAG_ACTIVE && in nl80211_parse_mon_options()
3682 !(rdev->wiphy.features & NL80211_FEATURE_ACTIVE_MONITOR)) in nl80211_parse_mon_options()
3683 return -EOPNOTSUPP; in nl80211_parse_mon_options()
3685 if (info->attrs[NL80211_ATTR_MU_MIMO_GROUP_DATA]) { in nl80211_parse_mon_options()
3690 return -EINVAL; in nl80211_parse_mon_options()
3692 if (!wiphy_ext_feature_isset(&rdev->wiphy, cap_flag)) in nl80211_parse_mon_options()
3693 return -EOPNOTSUPP; in nl80211_parse_mon_options()
3696 nla_data(info->attrs[NL80211_ATTR_MU_MIMO_GROUP_DATA]); in nl80211_parse_mon_options()
3700 (mumimo_groups[VHT_MUMIMO_GROUPS_DATA_LEN - 1] & BIT(7))) in nl80211_parse_mon_options()
3701 return -EINVAL; in nl80211_parse_mon_options()
3703 params->vht_mumimo_groups = mumimo_groups; in nl80211_parse_mon_options()
3707 if (info->attrs[NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR]) { in nl80211_parse_mon_options()
3711 return -EINVAL; in nl80211_parse_mon_options()
3713 if (!wiphy_ext_feature_isset(&rdev->wiphy, cap_flag)) in nl80211_parse_mon_options()
3714 return -EOPNOTSUPP; in nl80211_parse_mon_options()
3716 params->vht_mumimo_follow_addr = in nl80211_parse_mon_options()
3717 nla_data(info->attrs[NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR]); in nl80211_parse_mon_options()
3730 return -EBUSY; in nl80211_valid_4addr()
3736 if (rdev->wiphy.flags & WIPHY_FLAG_4ADDR_AP) in nl80211_valid_4addr()
3740 if (rdev->wiphy.flags & WIPHY_FLAG_4ADDR_STATION) in nl80211_valid_4addr()
3747 return -EOPNOTSUPP; in nl80211_valid_4addr()
3752 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_interface()
3756 struct net_device *dev = info->user_ptr[1]; in nl80211_set_interface()
3761 otype = ntype = dev->ieee80211_ptr->iftype; in nl80211_set_interface()
3763 if (info->attrs[NL80211_ATTR_IFTYPE]) { in nl80211_set_interface()
3764 ntype = nla_get_u32(info->attrs[NL80211_ATTR_IFTYPE]); in nl80211_set_interface()
3769 if (info->attrs[NL80211_ATTR_MESH_ID]) { in nl80211_set_interface()
3770 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_interface()
3773 return -EINVAL; in nl80211_set_interface()
3775 return -EBUSY; in nl80211_set_interface()
3780 wdev->mesh_id_up_len = in nl80211_set_interface()
3781 nla_len(info->attrs[NL80211_ATTR_MESH_ID]); in nl80211_set_interface()
3782 memcpy(wdev->ssid, nla_data(info->attrs[NL80211_ATTR_MESH_ID]), in nl80211_set_interface()
3783 wdev->mesh_id_up_len); in nl80211_set_interface()
3787 if (info->attrs[NL80211_ATTR_4ADDR]) { in nl80211_set_interface()
3788 params.use_4addr = !!nla_get_u8(info->attrs[NL80211_ATTR_4ADDR]); in nl80211_set_interface()
3794 params.use_4addr = -1; in nl80211_set_interface()
3808 if (!err && params.use_4addr != -1) in nl80211_set_interface()
3809 dev->ieee80211_ptr->use_4addr = params.use_4addr; in nl80211_set_interface()
3812 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_interface()
3822 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_new_interface()
3834 if (!info->attrs[NL80211_ATTR_IFNAME]) in nl80211_new_interface()
3835 return -EINVAL; in nl80211_new_interface()
3837 if (info->attrs[NL80211_ATTR_IFTYPE]) in nl80211_new_interface()
3838 type = nla_get_u32(info->attrs[NL80211_ATTR_IFTYPE]); in nl80211_new_interface()
3840 if (!rdev->ops->add_virtual_intf) in nl80211_new_interface()
3841 return -EOPNOTSUPP; in nl80211_new_interface()
3844 rdev->wiphy.features & NL80211_FEATURE_MAC_ON_CREATE) && in nl80211_new_interface()
3845 info->attrs[NL80211_ATTR_MAC]) { in nl80211_new_interface()
3846 nla_memcpy(params.macaddr, info->attrs[NL80211_ATTR_MAC], in nl80211_new_interface()
3849 return -EADDRNOTAVAIL; in nl80211_new_interface()
3852 if (info->attrs[NL80211_ATTR_4ADDR]) { in nl80211_new_interface()
3853 params.use_4addr = !!nla_get_u8(info->attrs[NL80211_ATTR_4ADDR]); in nl80211_new_interface()
3859 if (!cfg80211_iftype_allowed(&rdev->wiphy, type, params.use_4addr, 0)) in nl80211_new_interface()
3860 return -EOPNOTSUPP; in nl80211_new_interface()
3868 return -ENOMEM; in nl80211_new_interface()
3871 nla_data(info->attrs[NL80211_ATTR_IFNAME]), in nl80211_new_interface()
3875 return -EPROTO; in nl80211_new_interface()
3881 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) in nl80211_new_interface()
3882 wdev->owner_nlportid = info->snd_portid; in nl80211_new_interface()
3886 if (!info->attrs[NL80211_ATTR_MESH_ID]) in nl80211_new_interface()
3891 wdev->mesh_id_up_len = in nl80211_new_interface()
3892 nla_len(info->attrs[NL80211_ATTR_MESH_ID]); in nl80211_new_interface()
3893 memcpy(wdev->ssid, nla_data(info->attrs[NL80211_ATTR_MESH_ID]), in nl80211_new_interface()
3894 wdev->mesh_id_up_len); in nl80211_new_interface()
3910 if (nl80211_send_iface(msg, info->snd_portid, info->snd_seq, 0, in nl80211_new_interface()
3913 return -ENOBUFS; in nl80211_new_interface()
3921 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_del_interface()
3922 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_del_interface()
3924 if (!rdev->ops->del_virtual_intf) in nl80211_del_interface()
3925 return -EOPNOTSUPP; in nl80211_del_interface()
3934 if (!wdev->netdev) in nl80211_del_interface()
3935 info->user_ptr[1] = NULL; in nl80211_del_interface()
3942 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_noack_map()
3943 struct net_device *dev = info->user_ptr[1]; in nl80211_set_noack_map()
3946 if (!info->attrs[NL80211_ATTR_NOACK_MAP]) in nl80211_set_noack_map()
3947 return -EINVAL; in nl80211_set_noack_map()
3949 if (!rdev->ops->set_noack_map) in nl80211_set_noack_map()
3950 return -EOPNOTSUPP; in nl80211_set_noack_map()
3952 noack_map = nla_get_u16(info->attrs[NL80211_ATTR_NOACK_MAP]); in nl80211_set_noack_map()
3968 if ((params->key && in get_key_callback()
3969 nla_put(cookie->msg, NL80211_ATTR_KEY_DATA, in get_key_callback()
3970 params->key_len, params->key)) || in get_key_callback()
3971 (params->seq && in get_key_callback()
3972 nla_put(cookie->msg, NL80211_ATTR_KEY_SEQ, in get_key_callback()
3973 params->seq_len, params->seq)) || in get_key_callback()
3974 (params->cipher && in get_key_callback()
3975 nla_put_u32(cookie->msg, NL80211_ATTR_KEY_CIPHER, in get_key_callback()
3976 params->cipher))) in get_key_callback()
3979 key = nla_nest_start_noflag(cookie->msg, NL80211_ATTR_KEY); in get_key_callback()
3983 if ((params->key && in get_key_callback()
3984 nla_put(cookie->msg, NL80211_KEY_DATA, in get_key_callback()
3985 params->key_len, params->key)) || in get_key_callback()
3986 (params->seq && in get_key_callback()
3987 nla_put(cookie->msg, NL80211_KEY_SEQ, in get_key_callback()
3988 params->seq_len, params->seq)) || in get_key_callback()
3989 (params->cipher && in get_key_callback()
3990 nla_put_u32(cookie->msg, NL80211_KEY_CIPHER, in get_key_callback()
3991 params->cipher))) in get_key_callback()
3994 if (nla_put_u8(cookie->msg, NL80211_KEY_IDX, cookie->idx)) in get_key_callback()
3997 nla_nest_end(cookie->msg, key); in get_key_callback()
4001 cookie->error = 1; in get_key_callback()
4006 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_key()
4008 struct net_device *dev = info->user_ptr[1]; in nl80211_get_key()
4019 if (wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_get_key()
4023 if ((dev->ieee80211_ptr->iftype == NL80211_IFTYPE_STATION || in nl80211_get_key()
4024 dev->ieee80211_ptr->iftype == NL80211_IFTYPE_P2P_CLIENT) && in nl80211_get_key()
4025 wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_get_key()
4029 if (info->attrs[NL80211_ATTR_KEY_IDX]) { in nl80211_get_key()
4030 key_idx = nla_get_u8(info->attrs[NL80211_ATTR_KEY_IDX]); in nl80211_get_key()
4034 return -EINVAL; in nl80211_get_key()
4038 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_get_key()
4039 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_get_key()
4042 if (info->attrs[NL80211_ATTR_KEY_TYPE]) { in nl80211_get_key()
4043 u32 kt = nla_get_u32(info->attrs[NL80211_ATTR_KEY_TYPE]); in nl80211_get_key()
4047 return -EINVAL; in nl80211_get_key()
4051 if (!rdev->ops->get_key) in nl80211_get_key()
4052 return -EOPNOTSUPP; in nl80211_get_key()
4054 if (!pairwise && mac_addr && !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN)) in nl80211_get_key()
4055 return -ENOENT; in nl80211_get_key()
4059 return -ENOMEM; in nl80211_get_key()
4061 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_key()
4069 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in nl80211_get_key()
4089 err = -ENOBUFS; in nl80211_get_key()
4097 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_key()
4100 struct net_device *dev = info->user_ptr[1]; in nl80211_set_key()
4107 return -EINVAL; in nl80211_set_key()
4114 return -EINVAL; in nl80211_set_key()
4116 wdev_lock(dev->ieee80211_ptr); in nl80211_set_key()
4119 if (!rdev->ops->set_default_key) { in nl80211_set_key()
4120 err = -EOPNOTSUPP; in nl80211_set_key()
4124 err = nl80211_key_allowed(dev->ieee80211_ptr); in nl80211_set_key()
4135 dev->ieee80211_ptr->wext.default_key = key.idx; in nl80211_set_key()
4139 err = -EINVAL; in nl80211_set_key()
4143 if (!rdev->ops->set_default_mgmt_key) { in nl80211_set_key()
4144 err = -EOPNOTSUPP; in nl80211_set_key()
4148 err = nl80211_key_allowed(dev->ieee80211_ptr); in nl80211_set_key()
4157 dev->ieee80211_ptr->wext.default_mgmt_key = key.idx; in nl80211_set_key()
4161 err = -EINVAL; in nl80211_set_key()
4165 if (!rdev->ops->set_default_beacon_key) { in nl80211_set_key()
4166 err = -EOPNOTSUPP; in nl80211_set_key()
4170 err = nl80211_key_allowed(dev->ieee80211_ptr); in nl80211_set_key()
4178 wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_set_key()
4182 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_set_key()
4183 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_set_key()
4186 err = -EINVAL; in nl80211_set_key()
4194 err = -EINVAL; in nl80211_set_key()
4197 wdev_unlock(dev->ieee80211_ptr); in nl80211_set_key()
4204 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_new_key()
4206 struct net_device *dev = info->user_ptr[1]; in nl80211_new_key()
4216 return -EINVAL; in nl80211_new_key()
4219 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_new_key()
4220 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_new_key()
4222 if (key.type == -1) { in nl80211_new_key()
4233 return -EINVAL; in nl80211_new_key()
4237 info->attrs[NL80211_ATTR_VLAN_ID]) in nl80211_new_key()
4238 key.p.vlan_id = nla_get_u16(info->attrs[NL80211_ATTR_VLAN_ID]); in nl80211_new_key()
4240 if (!rdev->ops->add_key) in nl80211_new_key()
4241 return -EOPNOTSUPP; in nl80211_new_key()
4247 return -EINVAL; in nl80211_new_key()
4250 wdev_lock(dev->ieee80211_ptr); in nl80211_new_key()
4251 err = nl80211_key_allowed(dev->ieee80211_ptr); in nl80211_new_key()
4261 wdev_unlock(dev->ieee80211_ptr); in nl80211_new_key()
4268 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_del_key()
4270 struct net_device *dev = info->user_ptr[1]; in nl80211_del_key()
4278 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_del_key()
4279 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_del_key()
4281 if (key.type == -1) { in nl80211_del_key()
4291 return -EINVAL; in nl80211_del_key()
4295 return -EINVAL; in nl80211_del_key()
4297 if (!rdev->ops->del_key) in nl80211_del_key()
4298 return -EOPNOTSUPP; in nl80211_del_key()
4300 wdev_lock(dev->ieee80211_ptr); in nl80211_del_key()
4301 err = nl80211_key_allowed(dev->ieee80211_ptr); in nl80211_del_key()
4304 !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN)) in nl80211_del_key()
4305 err = -ENOENT; in nl80211_del_key()
4314 if (key.idx == dev->ieee80211_ptr->wext.default_key) in nl80211_del_key()
4315 dev->ieee80211_ptr->wext.default_key = -1; in nl80211_del_key()
4316 else if (key.idx == dev->ieee80211_ptr->wext.default_mgmt_key) in nl80211_del_key()
4317 dev->ieee80211_ptr->wext.default_mgmt_key = -1; in nl80211_del_key()
4320 wdev_unlock(dev->ieee80211_ptr); in nl80211_del_key()
4333 return -EINVAL; in validate_acl_mac_addrs()
4354 if (!wiphy->max_acl_mac_addrs) in parse_acl_data()
4355 return ERR_PTR(-EOPNOTSUPP); in parse_acl_data()
4357 if (!info->attrs[NL80211_ATTR_ACL_POLICY]) in parse_acl_data()
4358 return ERR_PTR(-EINVAL); in parse_acl_data()
4360 acl_policy = nla_get_u32(info->attrs[NL80211_ATTR_ACL_POLICY]); in parse_acl_data()
4363 return ERR_PTR(-EINVAL); in parse_acl_data()
4365 if (!info->attrs[NL80211_ATTR_MAC_ADDRS]) in parse_acl_data()
4366 return ERR_PTR(-EINVAL); in parse_acl_data()
4368 n_entries = validate_acl_mac_addrs(info->attrs[NL80211_ATTR_MAC_ADDRS]); in parse_acl_data()
4372 if (n_entries > wiphy->max_acl_mac_addrs) in parse_acl_data()
4373 return ERR_PTR(-ENOTSUPP); in parse_acl_data()
4377 return ERR_PTR(-ENOMEM); in parse_acl_data()
4379 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_MAC_ADDRS], tmp) { in parse_acl_data()
4380 memcpy(acl->mac_addrs[i].addr, nla_data(attr), ETH_ALEN); in parse_acl_data()
4384 acl->n_acl_entries = n_entries; in parse_acl_data()
4385 acl->acl_policy = acl_policy; in parse_acl_data()
4392 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_mac_acl()
4393 struct net_device *dev = info->user_ptr[1]; in nl80211_set_mac_acl()
4397 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && in nl80211_set_mac_acl()
4398 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_set_mac_acl()
4399 return -EOPNOTSUPP; in nl80211_set_mac_acl()
4401 if (!dev->ieee80211_ptr->beacon_interval) in nl80211_set_mac_acl()
4402 return -EINVAL; in nl80211_set_mac_acl()
4404 acl = parse_acl_data(&rdev->wiphy, info); in nl80211_set_mac_acl()
4425 for (ridx = 0; ridx < sband->n_bitrates; ridx++) { in rateset_to_mask()
4427 &sband->bitrates[ridx]; in rateset_to_mask()
4428 if (rate == srate->bitrate) { in rateset_to_mask()
4433 if (ridx == sband->n_bitrates) in rateset_to_mask()
4460 if (sband->ht_cap.mcs.rx_mask[ridx] & rbit) in ht_rateset_to_mask()
4507 u16 tx_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map); in vht_set_mcs_mask()
4511 if (!sband->vht_cap.vht_supported) in vht_set_mcs_mask()
4520 if ((tx_mcs_mask[i] & txrate->mcs[i]) == txrate->mcs[i]) in vht_set_mcs_mask()
4521 mcs[i] = txrate->mcs[i]; in vht_set_mcs_mask()
4560 struct net_device *dev = info->user_ptr[1]; in he_get_txmcsmap()
4561 struct wireless_dev *wdev = dev->ieee80211_ptr; in he_get_txmcsmap()
4564 switch (wdev->chandef.width) { in he_get_txmcsmap()
4566 tx_mcs = he_cap->he_mcs_nss_supp.tx_mcs_80p80; in he_get_txmcsmap()
4569 tx_mcs = he_cap->he_mcs_nss_supp.tx_mcs_160; in he_get_txmcsmap()
4572 tx_mcs = he_cap->he_mcs_nss_supp.tx_mcs_80; in he_get_txmcsmap()
4589 he_cap = ieee80211_get_he_iftype_cap(sband, wdev->iftype); in he_set_mcs_mask()
4601 if ((tx_mcs_mask[i] & txrate->mcs[i]) == txrate->mcs[i]) in he_set_mcs_mask()
4602 mcs[i] = txrate->mcs[i]; in he_set_mcs_mask()
4617 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_parse_tx_bitrate_mask()
4618 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_parse_tx_bitrate_mask()
4629 sband = rdev->wiphy.bands[i]; in nl80211_parse_tx_bitrate_mask()
4634 mask->control[i].legacy = (1 << sband->n_bitrates) - 1; in nl80211_parse_tx_bitrate_mask()
4635 memcpy(mask->control[i].ht_mcs, in nl80211_parse_tx_bitrate_mask()
4636 sband->ht_cap.mcs.rx_mask, in nl80211_parse_tx_bitrate_mask()
4637 sizeof(mask->control[i].ht_mcs)); in nl80211_parse_tx_bitrate_mask()
4639 if (sband->vht_cap.vht_supported) { in nl80211_parse_tx_bitrate_mask()
4640 vht_tx_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map); in nl80211_parse_tx_bitrate_mask()
4641 vht_build_mcs_mask(vht_tx_mcs_map, mask->control[i].vht_mcs); in nl80211_parse_tx_bitrate_mask()
4644 he_cap = ieee80211_get_he_iftype_cap(sband, wdev->iftype); in nl80211_parse_tx_bitrate_mask()
4649 he_build_mcs_mask(he_tx_mcs_map, mask->control[i].he_mcs); in nl80211_parse_tx_bitrate_mask()
4651 mask->control[i].he_gi = 0xFF; in nl80211_parse_tx_bitrate_mask()
4652 mask->control[i].he_ltf = 0xFF; in nl80211_parse_tx_bitrate_mask()
4668 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
4669 sband = rdev->wiphy.bands[band]; in nl80211_parse_tx_bitrate_mask()
4671 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
4675 info->extack); in nl80211_parse_tx_bitrate_mask()
4679 mask->control[band].legacy = rateset_to_mask( in nl80211_parse_tx_bitrate_mask()
4683 if ((mask->control[band].legacy == 0) && in nl80211_parse_tx_bitrate_mask()
4685 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
4692 mask->control[band].ht_mcs)) in nl80211_parse_tx_bitrate_mask()
4693 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
4699 mask->control[band].vht_mcs)) in nl80211_parse_tx_bitrate_mask()
4700 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
4703 mask->control[band].gi = in nl80211_parse_tx_bitrate_mask()
4705 if (mask->control[band].gi > NL80211_TXRATE_FORCE_LGI) in nl80211_parse_tx_bitrate_mask()
4706 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
4711 mask->control[band].he_mcs)) in nl80211_parse_tx_bitrate_mask()
4712 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
4714 mask->control[band].he_gi = in nl80211_parse_tx_bitrate_mask()
4717 mask->control[band].he_ltf = in nl80211_parse_tx_bitrate_mask()
4720 if (mask->control[band].legacy == 0) { in nl80211_parse_tx_bitrate_mask()
4724 if (!(rdev->wiphy.bands[band]->ht_cap.ht_supported || in nl80211_parse_tx_bitrate_mask()
4725 rdev->wiphy.bands[band]->vht_cap.vht_supported || in nl80211_parse_tx_bitrate_mask()
4726 ieee80211_get_he_iftype_cap(sband, wdev->iftype))) in nl80211_parse_tx_bitrate_mask()
4727 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
4730 if (mask->control[band].ht_mcs[i]) in nl80211_parse_tx_bitrate_mask()
4734 if (mask->control[band].vht_mcs[i]) in nl80211_parse_tx_bitrate_mask()
4738 if (mask->control[band].he_mcs[i]) in nl80211_parse_tx_bitrate_mask()
4742 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
4755 u32 rate = beacon_rate->control[band].legacy; in validate_beacon_tx_rate()
4759 return -EINVAL; in validate_beacon_tx_rate()
4763 if (hweight8(beacon_rate->control[band].ht_mcs[i]) > 1) { in validate_beacon_tx_rate()
4764 return -EINVAL; in validate_beacon_tx_rate()
4765 } else if (beacon_rate->control[band].ht_mcs[i]) { in validate_beacon_tx_rate()
4768 return -EINVAL; in validate_beacon_tx_rate()
4771 return -EINVAL; in validate_beacon_tx_rate()
4776 if (hweight16(beacon_rate->control[band].vht_mcs[i]) > 1) { in validate_beacon_tx_rate()
4777 return -EINVAL; in validate_beacon_tx_rate()
4778 } else if (beacon_rate->control[band].vht_mcs[i]) { in validate_beacon_tx_rate()
4781 return -EINVAL; in validate_beacon_tx_rate()
4784 return -EINVAL; in validate_beacon_tx_rate()
4788 return -EINVAL; in validate_beacon_tx_rate()
4791 !wiphy_ext_feature_isset(&rdev->wiphy, in validate_beacon_tx_rate()
4793 return -EINVAL; in validate_beacon_tx_rate()
4795 !wiphy_ext_feature_isset(&rdev->wiphy, in validate_beacon_tx_rate()
4797 return -EINVAL; in validate_beacon_tx_rate()
4799 !wiphy_ext_feature_isset(&rdev->wiphy, in validate_beacon_tx_rate()
4801 return -EINVAL; in validate_beacon_tx_rate()
4816 bcn->head = nla_data(attrs[NL80211_ATTR_BEACON_HEAD]); in nl80211_parse_beacon()
4817 bcn->head_len = nla_len(attrs[NL80211_ATTR_BEACON_HEAD]); in nl80211_parse_beacon()
4818 if (!bcn->head_len) in nl80211_parse_beacon()
4819 return -EINVAL; in nl80211_parse_beacon()
4824 bcn->tail = nla_data(attrs[NL80211_ATTR_BEACON_TAIL]); in nl80211_parse_beacon()
4825 bcn->tail_len = nla_len(attrs[NL80211_ATTR_BEACON_TAIL]); in nl80211_parse_beacon()
4830 return -EINVAL; in nl80211_parse_beacon()
4833 bcn->beacon_ies = nla_data(attrs[NL80211_ATTR_IE]); in nl80211_parse_beacon()
4834 bcn->beacon_ies_len = nla_len(attrs[NL80211_ATTR_IE]); in nl80211_parse_beacon()
4838 bcn->proberesp_ies = in nl80211_parse_beacon()
4840 bcn->proberesp_ies_len = in nl80211_parse_beacon()
4845 bcn->assocresp_ies = in nl80211_parse_beacon()
4847 bcn->assocresp_ies_len = in nl80211_parse_beacon()
4852 bcn->probe_resp = nla_data(attrs[NL80211_ATTR_PROBE_RESP]); in nl80211_parse_beacon()
4853 bcn->probe_resp_len = nla_len(attrs[NL80211_ATTR_PROBE_RESP]); in nl80211_parse_beacon()
4867 wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_parse_beacon()
4869 bcn->ftm_responder = 1; in nl80211_parse_beacon()
4871 return -EOPNOTSUPP; in nl80211_parse_beacon()
4874 bcn->lci = nla_data(tb[NL80211_FTM_RESP_ATTR_LCI]); in nl80211_parse_beacon()
4875 bcn->lci_len = nla_len(tb[NL80211_FTM_RESP_ATTR_LCI]); in nl80211_parse_beacon()
4879 bcn->civicloc = nla_data(tb[NL80211_FTM_RESP_ATTR_CIVICLOC]); in nl80211_parse_beacon()
4880 bcn->civicloc_len = nla_len(tb[NL80211_FTM_RESP_ATTR_CIVICLOC]); in nl80211_parse_beacon()
4883 bcn->ftm_responder = -1; in nl80211_parse_beacon()
4901 return -EINVAL; in nl80211_parse_he_obss_pd()
4903 he_obss_pd->sr_ctrl = nla_get_u8(tb[NL80211_HE_OBSS_PD_ATTR_SR_CTRL]); in nl80211_parse_he_obss_pd()
4906 he_obss_pd->min_offset = in nl80211_parse_he_obss_pd()
4909 he_obss_pd->max_offset = in nl80211_parse_he_obss_pd()
4912 he_obss_pd->non_srg_max_offset = in nl80211_parse_he_obss_pd()
4915 if (he_obss_pd->min_offset > he_obss_pd->max_offset) in nl80211_parse_he_obss_pd()
4916 return -EINVAL; in nl80211_parse_he_obss_pd()
4919 memcpy(he_obss_pd->bss_color_bitmap, in nl80211_parse_he_obss_pd()
4921 sizeof(he_obss_pd->bss_color_bitmap)); in nl80211_parse_he_obss_pd()
4924 memcpy(he_obss_pd->partial_bssid_bitmap, in nl80211_parse_he_obss_pd()
4926 sizeof(he_obss_pd->partial_bssid_bitmap)); in nl80211_parse_he_obss_pd()
4928 he_obss_pd->enable = true; in nl80211_parse_he_obss_pd()
4945 return -EINVAL; in nl80211_parse_he_bss_color()
4947 he_bss_color->color = in nl80211_parse_he_bss_color()
4949 he_bss_color->enabled = in nl80211_parse_he_bss_color()
4951 he_bss_color->partial = in nl80211_parse_he_bss_color()
4963 struct cfg80211_fils_discovery *fd = ¶ms->fils_discovery; in nl80211_parse_fils_discovery()
4965 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_parse_fils_discovery()
4967 return -EINVAL; in nl80211_parse_fils_discovery()
4977 return -EINVAL; in nl80211_parse_fils_discovery()
4979 fd->tmpl_len = nla_len(tb[NL80211_FILS_DISCOVERY_ATTR_TMPL]); in nl80211_parse_fils_discovery()
4980 fd->tmpl = nla_data(tb[NL80211_FILS_DISCOVERY_ATTR_TMPL]); in nl80211_parse_fils_discovery()
4981 fd->min_interval = nla_get_u32(tb[NL80211_FILS_DISCOVERY_ATTR_INT_MIN]); in nl80211_parse_fils_discovery()
4982 fd->max_interval = nla_get_u32(tb[NL80211_FILS_DISCOVERY_ATTR_INT_MAX]); in nl80211_parse_fils_discovery()
4995 ¶ms->unsol_bcast_probe_resp; in nl80211_parse_unsol_bcast_probe_resp()
4997 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_parse_unsol_bcast_probe_resp()
4999 return -EINVAL; in nl80211_parse_unsol_bcast_probe_resp()
5008 return -EINVAL; in nl80211_parse_unsol_bcast_probe_resp()
5010 presp->tmpl = nla_data(tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_TMPL]); in nl80211_parse_unsol_bcast_probe_resp()
5011 presp->tmpl_len = nla_len(tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_TMPL]); in nl80211_parse_unsol_bcast_probe_resp()
5012 presp->interval = nla_get_u32(tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_INT]); in nl80211_parse_unsol_bcast_probe_resp()
5026 params->ht_required = true; in nl80211_check_ap_rate_selectors()
5028 params->vht_required = true; in nl80211_check_ap_rate_selectors()
5030 params->he_required = true; in nl80211_check_ap_rate_selectors()
5041 const struct cfg80211_beacon_data *bcn = ¶ms->beacon; in nl80211_calculate_ap_params()
5042 size_t ies_len = bcn->tail_len; in nl80211_calculate_ap_params()
5043 const u8 *ies = bcn->tail; in nl80211_calculate_ap_params()
5054 if (cap && cap[1] >= sizeof(*params->ht_cap)) in nl80211_calculate_ap_params()
5055 params->ht_cap = (void *)(cap + 2); in nl80211_calculate_ap_params()
5057 if (cap && cap[1] >= sizeof(*params->vht_cap)) in nl80211_calculate_ap_params()
5058 params->vht_cap = (void *)(cap + 2); in nl80211_calculate_ap_params()
5060 if (cap && cap[1] >= sizeof(*params->he_cap) + 1) in nl80211_calculate_ap_params()
5061 params->he_cap = (void *)(cap + 3); in nl80211_calculate_ap_params()
5063 if (cap && cap[1] >= sizeof(*params->he_oper) + 1) in nl80211_calculate_ap_params()
5064 params->he_oper = (void *)(cap + 3); in nl80211_calculate_ap_params()
5073 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) { in nl80211_get_ap_channel()
5074 if (wdev->iftype != NL80211_IFTYPE_AP && in nl80211_get_ap_channel()
5075 wdev->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_get_ap_channel()
5078 if (!wdev->preset_chandef.chan) in nl80211_get_ap_channel()
5081 params->chandef = wdev->preset_chandef; in nl80211_get_ap_channel()
5098 if (!(rdev->wiphy.features & NL80211_FEATURE_SAE) && in nl80211_valid_auth_type()
5101 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_valid_auth_type()
5109 if (!(rdev->wiphy.features & NL80211_FEATURE_SAE) && in nl80211_valid_auth_type()
5110 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_valid_auth_type()
5120 &rdev->wiphy, in nl80211_valid_auth_type()
5126 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_valid_auth_type()
5143 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_start_ap()
5144 struct net_device *dev = info->user_ptr[1]; in nl80211_start_ap()
5145 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_start_ap()
5149 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && in nl80211_start_ap()
5150 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_start_ap()
5151 return -EOPNOTSUPP; in nl80211_start_ap()
5153 if (!rdev->ops->start_ap) in nl80211_start_ap()
5154 return -EOPNOTSUPP; in nl80211_start_ap()
5156 if (wdev->beacon_interval) in nl80211_start_ap()
5157 return -EALREADY; in nl80211_start_ap()
5162 if (!info->attrs[NL80211_ATTR_BEACON_INTERVAL] || in nl80211_start_ap()
5163 !info->attrs[NL80211_ATTR_DTIM_PERIOD] || in nl80211_start_ap()
5164 !info->attrs[NL80211_ATTR_BEACON_HEAD]) in nl80211_start_ap()
5165 return -EINVAL; in nl80211_start_ap()
5167 err = nl80211_parse_beacon(rdev, info->attrs, ¶ms.beacon); in nl80211_start_ap()
5172 nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]); in nl80211_start_ap()
5174 nla_get_u32(info->attrs[NL80211_ATTR_DTIM_PERIOD]); in nl80211_start_ap()
5176 err = cfg80211_validate_beacon_int(rdev, dev->ieee80211_ptr->iftype, in nl80211_start_ap()
5186 * additional information -- drivers must check! in nl80211_start_ap()
5188 if (info->attrs[NL80211_ATTR_SSID]) { in nl80211_start_ap()
5189 params.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); in nl80211_start_ap()
5191 nla_len(info->attrs[NL80211_ATTR_SSID]); in nl80211_start_ap()
5193 return -EINVAL; in nl80211_start_ap()
5196 if (info->attrs[NL80211_ATTR_HIDDEN_SSID]) in nl80211_start_ap()
5198 info->attrs[NL80211_ATTR_HIDDEN_SSID]); in nl80211_start_ap()
5200 params.privacy = !!info->attrs[NL80211_ATTR_PRIVACY]; in nl80211_start_ap()
5202 if (info->attrs[NL80211_ATTR_AUTH_TYPE]) { in nl80211_start_ap()
5204 info->attrs[NL80211_ATTR_AUTH_TYPE]); in nl80211_start_ap()
5207 return -EINVAL; in nl80211_start_ap()
5216 if (info->attrs[NL80211_ATTR_INACTIVITY_TIMEOUT]) { in nl80211_start_ap()
5217 if (!(rdev->wiphy.features & NL80211_FEATURE_INACTIVITY_TIMER)) in nl80211_start_ap()
5218 return -EOPNOTSUPP; in nl80211_start_ap()
5220 info->attrs[NL80211_ATTR_INACTIVITY_TIMEOUT]); in nl80211_start_ap()
5223 if (info->attrs[NL80211_ATTR_P2P_CTWINDOW]) { in nl80211_start_ap()
5224 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_start_ap()
5225 return -EINVAL; in nl80211_start_ap()
5227 nla_get_u8(info->attrs[NL80211_ATTR_P2P_CTWINDOW]); in nl80211_start_ap()
5229 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_CTWIN)) in nl80211_start_ap()
5230 return -EINVAL; in nl80211_start_ap()
5233 if (info->attrs[NL80211_ATTR_P2P_OPPPS]) { in nl80211_start_ap()
5236 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_start_ap()
5237 return -EINVAL; in nl80211_start_ap()
5238 tmp = nla_get_u8(info->attrs[NL80211_ATTR_P2P_OPPPS]); in nl80211_start_ap()
5241 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_OPPPS)) in nl80211_start_ap()
5242 return -EINVAL; in nl80211_start_ap()
5245 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { in nl80211_start_ap()
5249 } else if (wdev->preset_chandef.chan) { in nl80211_start_ap()
5250 params.chandef = wdev->preset_chandef; in nl80211_start_ap()
5252 return -EINVAL; in nl80211_start_ap()
5254 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, ¶ms.chandef, in nl80211_start_ap()
5255 wdev->iftype)) in nl80211_start_ap()
5256 return -EINVAL; in nl80211_start_ap()
5258 if (info->attrs[NL80211_ATTR_TX_RATES]) { in nl80211_start_ap()
5259 err = nl80211_parse_tx_bitrate_mask(info, info->attrs, in nl80211_start_ap()
5266 err = validate_beacon_tx_rate(rdev, params.chandef.chan->band, in nl80211_start_ap()
5272 if (info->attrs[NL80211_ATTR_SMPS_MODE]) { in nl80211_start_ap()
5274 nla_get_u8(info->attrs[NL80211_ATTR_SMPS_MODE]); in nl80211_start_ap()
5279 if (!(rdev->wiphy.features & in nl80211_start_ap()
5281 return -EINVAL; in nl80211_start_ap()
5284 if (!(rdev->wiphy.features & in nl80211_start_ap()
5286 return -EINVAL; in nl80211_start_ap()
5289 return -EINVAL; in nl80211_start_ap()
5295 params.pbss = nla_get_flag(info->attrs[NL80211_ATTR_PBSS]); in nl80211_start_ap()
5296 if (params.pbss && !rdev->wiphy.bands[NL80211_BAND_60GHZ]) in nl80211_start_ap()
5297 return -EOPNOTSUPP; in nl80211_start_ap()
5299 if (info->attrs[NL80211_ATTR_ACL_POLICY]) { in nl80211_start_ap()
5300 params.acl = parse_acl_data(&rdev->wiphy, info); in nl80211_start_ap()
5306 nla_get_flag(info->attrs[NL80211_ATTR_TWT_RESPONDER]); in nl80211_start_ap()
5308 if (info->attrs[NL80211_ATTR_HE_OBSS_PD]) { in nl80211_start_ap()
5310 info->attrs[NL80211_ATTR_HE_OBSS_PD], in nl80211_start_ap()
5316 if (info->attrs[NL80211_ATTR_HE_BSS_COLOR]) { in nl80211_start_ap()
5318 info->attrs[NL80211_ATTR_HE_BSS_COLOR], in nl80211_start_ap()
5324 if (info->attrs[NL80211_ATTR_FILS_DISCOVERY]) { in nl80211_start_ap()
5326 info->attrs[NL80211_ATTR_FILS_DISCOVERY], in nl80211_start_ap()
5332 if (info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP]) { in nl80211_start_ap()
5334 rdev, info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP], in nl80211_start_ap()
5342 if (info->attrs[NL80211_ATTR_EXTERNAL_AUTH_SUPPORT]) in nl80211_start_ap()
5348 wdev->preset_chandef = params.chandef; in nl80211_start_ap()
5349 wdev->beacon_interval = params.beacon_interval; in nl80211_start_ap()
5350 wdev->chandef = params.chandef; in nl80211_start_ap()
5351 wdev->ssid_len = params.ssid_len; in nl80211_start_ap()
5352 memcpy(wdev->ssid, params.ssid, wdev->ssid_len); in nl80211_start_ap()
5354 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) in nl80211_start_ap()
5355 wdev->conn_owner_nlportid = info->snd_portid; in nl80211_start_ap()
5367 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_beacon()
5368 struct net_device *dev = info->user_ptr[1]; in nl80211_set_beacon()
5369 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_beacon()
5373 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && in nl80211_set_beacon()
5374 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_set_beacon()
5375 return -EOPNOTSUPP; in nl80211_set_beacon()
5377 if (!rdev->ops->change_beacon) in nl80211_set_beacon()
5378 return -EOPNOTSUPP; in nl80211_set_beacon()
5380 if (!wdev->beacon_interval) in nl80211_set_beacon()
5381 return -EINVAL; in nl80211_set_beacon()
5383 err = nl80211_parse_beacon(rdev, info->attrs, ¶ms); in nl80211_set_beacon()
5396 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_stop_ap()
5397 struct net_device *dev = info->user_ptr[1]; in nl80211_stop_ap()
5423 nla = info->attrs[NL80211_ATTR_STA_FLAGS2]; in parse_station_flags()
5428 params->sta_flags_mask = sta_flags->mask; in parse_station_flags()
5429 params->sta_flags_set = sta_flags->set; in parse_station_flags()
5430 params->sta_flags_set &= params->sta_flags_mask; in parse_station_flags()
5431 if ((params->sta_flags_mask | in parse_station_flags()
5432 params->sta_flags_set) & BIT(__NL80211_STA_FLAG_INVALID)) in parse_station_flags()
5433 return -EINVAL; in parse_station_flags()
5439 nla = info->attrs[NL80211_ATTR_STA_FLAGS]; in parse_station_flags()
5443 if (nla_parse_nested_deprecated(flags, NL80211_STA_FLAG_MAX, nla, sta_flags_policy, info->extack)) in parse_station_flags()
5444 return -EINVAL; in parse_station_flags()
5456 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHORIZED) | in parse_station_flags()
5463 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHORIZED) | in parse_station_flags()
5467 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHENTICATED) | in parse_station_flags()
5472 return -EINVAL; in parse_station_flags()
5477 params->sta_flags_set |= (1<<flag); in parse_station_flags()
5481 return -EINVAL; in parse_station_flags()
5501 /* report 16-bit bitrate only if we can */ in nl80211_put_sta_rate()
5510 switch (info->bw) { in nl80211_put_sta_rate()
5534 WARN_ON(!(info->flags & RATE_INFO_FLAGS_HE_MCS)); in nl80211_put_sta_rate()
5540 if (info->flags & RATE_INFO_FLAGS_MCS) { in nl80211_put_sta_rate()
5541 if (nla_put_u8(msg, NL80211_RATE_INFO_MCS, info->mcs)) in nl80211_put_sta_rate()
5543 if (info->flags & RATE_INFO_FLAGS_SHORT_GI && in nl80211_put_sta_rate()
5546 } else if (info->flags & RATE_INFO_FLAGS_VHT_MCS) { in nl80211_put_sta_rate()
5547 if (nla_put_u8(msg, NL80211_RATE_INFO_VHT_MCS, info->mcs)) in nl80211_put_sta_rate()
5549 if (nla_put_u8(msg, NL80211_RATE_INFO_VHT_NSS, info->nss)) in nl80211_put_sta_rate()
5551 if (info->flags & RATE_INFO_FLAGS_SHORT_GI && in nl80211_put_sta_rate()
5554 } else if (info->flags & RATE_INFO_FLAGS_HE_MCS) { in nl80211_put_sta_rate()
5555 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_MCS, info->mcs)) in nl80211_put_sta_rate()
5557 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_NSS, info->nss)) in nl80211_put_sta_rate()
5559 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_GI, info->he_gi)) in nl80211_put_sta_rate()
5561 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_DCM, info->he_dcm)) in nl80211_put_sta_rate()
5563 if (info->bw == RATE_INFO_BW_HE_RU && in nl80211_put_sta_rate()
5565 info->he_ru_alloc)) in nl80211_put_sta_rate()
5611 return -1; in nl80211_send_station()
5614 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in nl80211_send_station()
5616 nla_put_u32(msg, NL80211_ATTR_GENERATION, sinfo->generation)) in nl80211_send_station()
5625 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_ ## attr) && \ in nl80211_send_station()
5627 sinfo->memb)) \ in nl80211_send_station()
5631 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_ ## attr) && \ in nl80211_send_station()
5633 sinfo->memb, NL80211_STA_INFO_PAD)) \ in nl80211_send_station()
5641 if (sinfo->filled & (BIT_ULL(NL80211_STA_INFO_RX_BYTES) | in nl80211_send_station()
5644 (u32)sinfo->rx_bytes)) in nl80211_send_station()
5647 if (sinfo->filled & (BIT_ULL(NL80211_STA_INFO_TX_BYTES) | in nl80211_send_station()
5650 (u32)sinfo->tx_bytes)) in nl80211_send_station()
5661 if (wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_send_station()
5665 switch (rdev->wiphy.signal_type) { in nl80211_send_station()
5673 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL)) { in nl80211_send_station()
5674 if (!nl80211_put_signal(msg, sinfo->chains, in nl80211_send_station()
5675 sinfo->chain_signal, in nl80211_send_station()
5679 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL_AVG)) { in nl80211_send_station()
5680 if (!nl80211_put_signal(msg, sinfo->chains, in nl80211_send_station()
5681 sinfo->chain_signal_avg, in nl80211_send_station()
5685 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_TX_BITRATE)) { in nl80211_send_station()
5686 if (!nl80211_put_sta_rate(msg, &sinfo->txrate, in nl80211_send_station()
5690 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_RX_BITRATE)) { in nl80211_send_station()
5691 if (!nl80211_put_sta_rate(msg, &sinfo->rxrate, in nl80211_send_station()
5709 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_BSS_PARAM)) { in nl80211_send_station()
5715 if (((sinfo->bss_param.flags & BSS_PARAM_FLAGS_CTS_PROT) && in nl80211_send_station()
5717 ((sinfo->bss_param.flags & BSS_PARAM_FLAGS_SHORT_PREAMBLE) && in nl80211_send_station()
5719 ((sinfo->bss_param.flags & BSS_PARAM_FLAGS_SHORT_SLOT_TIME) && in nl80211_send_station()
5722 sinfo->bss_param.dtim_period) || in nl80211_send_station()
5724 sinfo->bss_param.beacon_interval)) in nl80211_send_station()
5729 if ((sinfo->filled & BIT_ULL(NL80211_STA_INFO_STA_FLAGS)) && in nl80211_send_station()
5732 &sinfo->sta_flags)) in nl80211_send_station()
5741 if (wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_send_station()
5750 if (sinfo->pertid) { in nl80211_send_station()
5763 tidstats = &sinfo->pertid[tid]; in nl80211_send_station()
5765 if (!tidstats->filled) in nl80211_send_station()
5773 if (tidstats->filled & BIT(NL80211_TID_STATS_ ## attr) && \ in nl80211_send_station()
5775 tidstats->memb, NL80211_TID_STATS_PAD)) \ in nl80211_send_station()
5785 if ((tidstats->filled & in nl80211_send_station()
5787 !nl80211_put_txq_stats(msg, &tidstats->txq_stats, in nl80211_send_station()
5799 if (sinfo->assoc_req_ies_len && in nl80211_send_station()
5800 nla_put(msg, NL80211_ATTR_IE, sinfo->assoc_req_ies_len, in nl80211_send_station()
5801 sinfo->assoc_req_ies)) in nl80211_send_station()
5811 return -EMSGSIZE; in nl80211_send_station()
5821 int sta_idx = cb->args[2]; in nl80211_dump_station()
5829 if (!wdev->netdev) { in nl80211_dump_station()
5830 err = -EINVAL; in nl80211_dump_station()
5834 if (!rdev->ops->dump_station) { in nl80211_dump_station()
5835 err = -EOPNOTSUPP; in nl80211_dump_station()
5841 err = rdev_dump_station(rdev, wdev->netdev, sta_idx, in nl80211_dump_station()
5843 if (err == -ENOENT) in nl80211_dump_station()
5849 NETLINK_CB(cb->skb).portid, in nl80211_dump_station()
5850 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_dump_station()
5851 rdev, wdev->netdev, mac_addr, in nl80211_dump_station()
5859 cb->args[2] = sta_idx; in nl80211_dump_station()
5860 err = skb->len; in nl80211_dump_station()
5869 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_station()
5870 struct net_device *dev = info->user_ptr[1]; in nl80211_get_station()
5878 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_get_station()
5879 return -EINVAL; in nl80211_get_station()
5881 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_get_station()
5883 if (!rdev->ops->get_station) in nl80211_get_station()
5884 return -EOPNOTSUPP; in nl80211_get_station()
5893 return -ENOMEM; in nl80211_get_station()
5897 info->snd_portid, info->snd_seq, 0, in nl80211_get_station()
5900 return -ENOBUFS; in nl80211_get_station()
5910 if (params->listen_interval != -1 && in cfg80211_check_station_change()
5912 return -EINVAL; in cfg80211_check_station_change()
5914 if (params->support_p2p_ps != -1 && in cfg80211_check_station_change()
5916 return -EINVAL; in cfg80211_check_station_change()
5918 if (params->aid && in cfg80211_check_station_change()
5919 !(params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) && in cfg80211_check_station_change()
5921 return -EINVAL; in cfg80211_check_station_change()
5930 * No ignoring the TDLS flag here -- the userspace mesh in cfg80211_check_station_change()
5934 if (params->sta_flags_mask & in cfg80211_check_station_change()
5938 return -EINVAL; in cfg80211_check_station_change()
5942 if (!(params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER))) in cfg80211_check_station_change()
5943 return -EINVAL; in cfg80211_check_station_change()
5945 params->sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER); in cfg80211_check_station_change()
5948 /* disallow mesh-specific things */ in cfg80211_check_station_change()
5949 if (params->plink_action != NL80211_PLINK_ACTION_NO_ACTION) in cfg80211_check_station_change()
5950 return -EINVAL; in cfg80211_check_station_change()
5951 if (params->local_pm) in cfg80211_check_station_change()
5952 return -EINVAL; in cfg80211_check_station_change()
5953 if (params->sta_modify_mask & STATION_PARAM_APPLY_PLINK_STATE) in cfg80211_check_station_change()
5954 return -EINVAL; in cfg80211_check_station_change()
5960 if (params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) in cfg80211_check_station_change()
5961 return -EINVAL; in cfg80211_check_station_change()
5964 * a hostapd/wpa_supplicant issue -- it always includes the in cfg80211_check_station_change()
5967 params->sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER); in cfg80211_check_station_change()
5973 if (params->sta_modify_mask & STATION_PARAM_APPLY_UAPSD) in cfg80211_check_station_change()
5974 return -EINVAL; in cfg80211_check_station_change()
5975 if (params->sta_modify_mask & STATION_PARAM_APPLY_CAPABILITY) in cfg80211_check_station_change()
5976 return -EINVAL; in cfg80211_check_station_change()
5977 if (params->supported_rates) in cfg80211_check_station_change()
5978 return -EINVAL; in cfg80211_check_station_change()
5979 if (params->ext_capab || params->ht_capa || params->vht_capa || in cfg80211_check_station_change()
5980 params->he_capa) in cfg80211_check_station_change()
5981 return -EINVAL; in cfg80211_check_station_change()
5986 if (params->vlan) in cfg80211_check_station_change()
5987 return -EINVAL; in cfg80211_check_station_change()
5993 if (!(params->sta_flags_mask & BIT(NL80211_STA_FLAG_AUTHORIZED))) in cfg80211_check_station_change()
5994 return -EOPNOTSUPP; in cfg80211_check_station_change()
5999 if (params->sta_flags_mask & in cfg80211_check_station_change()
6006 return -EINVAL; in cfg80211_check_station_change()
6009 if (!(wiphy->features & NL80211_FEATURE_FULL_AP_CLIENT_STATE) && in cfg80211_check_station_change()
6010 params->sta_flags_mask & in cfg80211_check_station_change()
6013 return -EINVAL; in cfg80211_check_station_change()
6018 if (params->sta_flags_mask & ~BIT(NL80211_STA_FLAG_AUTHORIZED)) in cfg80211_check_station_change()
6019 return -EINVAL; in cfg80211_check_station_change()
6023 if (params->sta_flags_mask & ~(BIT(NL80211_STA_FLAG_AUTHORIZED) | in cfg80211_check_station_change()
6025 return -EINVAL; in cfg80211_check_station_change()
6027 if (params->sta_flags_set & BIT(NL80211_STA_FLAG_AUTHORIZED) && in cfg80211_check_station_change()
6028 !params->supported_rates) in cfg80211_check_station_change()
6029 return -EINVAL; in cfg80211_check_station_change()
6033 return -EINVAL; in cfg80211_check_station_change()
6035 if (params->sta_modify_mask & STATION_PARAM_APPLY_PLINK_STATE) in cfg80211_check_station_change()
6036 return -EINVAL; in cfg80211_check_station_change()
6039 if (params->plink_action != NL80211_PLINK_ACTION_NO_ACTION && in cfg80211_check_station_change()
6040 params->plink_action != NL80211_PLINK_ACTION_BLOCK) in cfg80211_check_station_change()
6041 return -EINVAL; in cfg80211_check_station_change()
6052 params->opmode_notif_used = false; in cfg80211_check_station_change()
6064 struct nlattr *vlanattr = info->attrs[NL80211_ATTR_STA_VLAN]; in get_vlan()
6073 return ERR_PTR(-ENODEV); in get_vlan()
6075 if (!v->ieee80211_ptr || v->ieee80211_ptr->wiphy != &rdev->wiphy) { in get_vlan()
6076 ret = -EINVAL; in get_vlan()
6080 if (v->ieee80211_ptr->iftype != NL80211_IFTYPE_AP_VLAN && in get_vlan()
6081 v->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && in get_vlan()
6082 v->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) { in get_vlan()
6083 ret = -EINVAL; in get_vlan()
6088 ret = -ENETDOWN; in get_vlan()
6112 if (!info->attrs[NL80211_ATTR_STA_WME]) in nl80211_parse_sta_wme()
6115 nla = info->attrs[NL80211_ATTR_STA_WME]; in nl80211_parse_sta_wme()
6118 info->extack); in nl80211_parse_sta_wme()
6123 params->uapsd_queues = nla_get_u8( in nl80211_parse_sta_wme()
6125 if (params->uapsd_queues & ~IEEE80211_WMM_IE_STA_QOSINFO_AC_MASK) in nl80211_parse_sta_wme()
6126 return -EINVAL; in nl80211_parse_sta_wme()
6129 params->max_sp = nla_get_u8(tb[NL80211_STA_WME_MAX_SP]); in nl80211_parse_sta_wme()
6131 if (params->max_sp & ~IEEE80211_WMM_IE_STA_QOSINFO_SP_MASK) in nl80211_parse_sta_wme()
6132 return -EINVAL; in nl80211_parse_sta_wme()
6134 params->sta_modify_mask |= STATION_PARAM_APPLY_UAPSD; in nl80211_parse_sta_wme()
6142 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]) { in nl80211_parse_sta_channel_info()
6143 params->supported_channels = in nl80211_parse_sta_channel_info()
6144 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]); in nl80211_parse_sta_channel_info()
6145 params->supported_channels_len = in nl80211_parse_sta_channel_info()
6146 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]); in nl80211_parse_sta_channel_info()
6152 if (params->supported_channels_len % 2) in nl80211_parse_sta_channel_info()
6153 return -EINVAL; in nl80211_parse_sta_channel_info()
6156 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]) { in nl80211_parse_sta_channel_info()
6157 params->supported_oper_classes = in nl80211_parse_sta_channel_info()
6158 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]); in nl80211_parse_sta_channel_info()
6159 params->supported_oper_classes_len = in nl80211_parse_sta_channel_info()
6160 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]); in nl80211_parse_sta_channel_info()
6170 if (info->attrs[NL80211_ATTR_PEER_AID]) in nl80211_set_station_tdls()
6171 params->aid = nla_get_u16(info->attrs[NL80211_ATTR_PEER_AID]); in nl80211_set_station_tdls()
6172 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) in nl80211_set_station_tdls()
6173 params->ht_capa = in nl80211_set_station_tdls()
6174 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]); in nl80211_set_station_tdls()
6175 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) in nl80211_set_station_tdls()
6176 params->vht_capa = in nl80211_set_station_tdls()
6177 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]); in nl80211_set_station_tdls()
6178 if (info->attrs[NL80211_ATTR_HE_CAPABILITY]) { in nl80211_set_station_tdls()
6179 params->he_capa = in nl80211_set_station_tdls()
6180 nla_data(info->attrs[NL80211_ATTR_HE_CAPABILITY]); in nl80211_set_station_tdls()
6181 params->he_capa_len = in nl80211_set_station_tdls()
6182 nla_len(info->attrs[NL80211_ATTR_HE_CAPABILITY]); in nl80211_set_station_tdls()
6195 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_parse_sta_txpower_setting()
6198 if (info->attrs[NL80211_ATTR_STA_TX_POWER_SETTING]) { in nl80211_parse_sta_txpower_setting()
6199 if (!rdev->ops->set_tx_power || in nl80211_parse_sta_txpower_setting()
6200 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_parse_sta_txpower_setting()
6202 return -EOPNOTSUPP; in nl80211_parse_sta_txpower_setting()
6205 params->txpwr.type = nla_get_u8(info->attrs[idx]); in nl80211_parse_sta_txpower_setting()
6207 if (params->txpwr.type == NL80211_TX_POWER_LIMITED) { in nl80211_parse_sta_txpower_setting()
6210 if (info->attrs[idx]) in nl80211_parse_sta_txpower_setting()
6211 params->txpwr.power = in nl80211_parse_sta_txpower_setting()
6212 nla_get_s16(info->attrs[idx]); in nl80211_parse_sta_txpower_setting()
6214 return -EINVAL; in nl80211_parse_sta_txpower_setting()
6216 params->sta_modify_mask |= STATION_PARAM_APPLY_STA_TXPOWER; in nl80211_parse_sta_txpower_setting()
6224 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_station()
6225 struct net_device *dev = info->user_ptr[1]; in nl80211_set_station()
6232 if (!rdev->ops->change_station) in nl80211_set_station()
6233 return -EOPNOTSUPP; in nl80211_set_station()
6240 if (info->attrs[NL80211_ATTR_STA_AID]) in nl80211_set_station()
6241 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_STA_AID]); in nl80211_set_station()
6243 if (info->attrs[NL80211_ATTR_VLAN_ID]) in nl80211_set_station()
6244 params.vlan_id = nla_get_u16(info->attrs[NL80211_ATTR_VLAN_ID]); in nl80211_set_station()
6246 if (info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]) in nl80211_set_station()
6248 nla_get_u16(info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]); in nl80211_set_station()
6250 params.listen_interval = -1; in nl80211_set_station()
6252 if (info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]) in nl80211_set_station()
6254 nla_get_u8(info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]); in nl80211_set_station()
6256 params.support_p2p_ps = -1; in nl80211_set_station()
6258 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_set_station()
6259 return -EINVAL; in nl80211_set_station()
6261 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_set_station()
6263 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) { in nl80211_set_station()
6265 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); in nl80211_set_station()
6267 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); in nl80211_set_station()
6270 if (info->attrs[NL80211_ATTR_STA_CAPABILITY]) { in nl80211_set_station()
6272 nla_get_u16(info->attrs[NL80211_ATTR_STA_CAPABILITY]); in nl80211_set_station()
6276 if (info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]) { in nl80211_set_station()
6278 nla_data(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); in nl80211_set_station()
6280 nla_len(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); in nl80211_set_station()
6283 if (parse_station_flags(info, dev->ieee80211_ptr->iftype, ¶ms)) in nl80211_set_station()
6284 return -EINVAL; in nl80211_set_station()
6286 if (info->attrs[NL80211_ATTR_STA_PLINK_ACTION]) in nl80211_set_station()
6288 nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_ACTION]); in nl80211_set_station()
6290 if (info->attrs[NL80211_ATTR_STA_PLINK_STATE]) { in nl80211_set_station()
6292 nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_STATE]); in nl80211_set_station()
6293 if (info->attrs[NL80211_ATTR_MESH_PEER_AID]) in nl80211_set_station()
6295 info->attrs[NL80211_ATTR_MESH_PEER_AID]); in nl80211_set_station()
6299 if (info->attrs[NL80211_ATTR_LOCAL_MESH_POWER_MODE]) in nl80211_set_station()
6301 info->attrs[NL80211_ATTR_LOCAL_MESH_POWER_MODE]); in nl80211_set_station()
6303 if (info->attrs[NL80211_ATTR_OPMODE_NOTIF]) { in nl80211_set_station()
6306 nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]); in nl80211_set_station()
6309 if (info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]) in nl80211_set_station()
6311 nla_data(info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]); in nl80211_set_station()
6313 if (info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]) in nl80211_set_station()
6315 nla_get_u16(info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]); in nl80211_set_station()
6318 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_set_station()
6320 return -EOPNOTSUPP; in nl80211_set_station()
6335 switch (dev->ieee80211_ptr->iftype) { in nl80211_set_station()
6345 err = -EOPNOTSUPP; in nl80211_set_station()
6361 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_new_station()
6363 struct net_device *dev = info->user_ptr[1]; in nl80211_new_station()
6371 if (!rdev->ops->add_station) in nl80211_new_station()
6372 return -EOPNOTSUPP; in nl80211_new_station()
6374 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_new_station()
6375 return -EINVAL; in nl80211_new_station()
6377 if (!info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]) in nl80211_new_station()
6378 return -EINVAL; in nl80211_new_station()
6380 if (!info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) in nl80211_new_station()
6381 return -EINVAL; in nl80211_new_station()
6383 if (!info->attrs[NL80211_ATTR_STA_AID] && in nl80211_new_station()
6384 !info->attrs[NL80211_ATTR_PEER_AID]) in nl80211_new_station()
6385 return -EINVAL; in nl80211_new_station()
6387 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_new_station()
6389 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); in nl80211_new_station()
6391 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); in nl80211_new_station()
6393 nla_get_u16(info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]); in nl80211_new_station()
6395 if (info->attrs[NL80211_ATTR_VLAN_ID]) in nl80211_new_station()
6396 params.vlan_id = nla_get_u16(info->attrs[NL80211_ATTR_VLAN_ID]); in nl80211_new_station()
6398 if (info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]) { in nl80211_new_station()
6400 nla_get_u8(info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]); in nl80211_new_station()
6407 dev->ieee80211_ptr->iftype == NL80211_IFTYPE_P2P_GO; in nl80211_new_station()
6410 if (info->attrs[NL80211_ATTR_PEER_AID]) in nl80211_new_station()
6411 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_PEER_AID]); in nl80211_new_station()
6413 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_STA_AID]); in nl80211_new_station()
6415 if (info->attrs[NL80211_ATTR_STA_CAPABILITY]) { in nl80211_new_station()
6417 nla_get_u16(info->attrs[NL80211_ATTR_STA_CAPABILITY]); in nl80211_new_station()
6421 if (info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]) { in nl80211_new_station()
6423 nla_data(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); in nl80211_new_station()
6425 nla_len(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); in nl80211_new_station()
6428 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) in nl80211_new_station()
6430 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]); in nl80211_new_station()
6432 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) in nl80211_new_station()
6434 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]); in nl80211_new_station()
6436 if (info->attrs[NL80211_ATTR_HE_CAPABILITY]) { in nl80211_new_station()
6438 nla_data(info->attrs[NL80211_ATTR_HE_CAPABILITY]); in nl80211_new_station()
6440 nla_len(info->attrs[NL80211_ATTR_HE_CAPABILITY]); in nl80211_new_station()
6443 if (info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]) in nl80211_new_station()
6445 nla_data(info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]); in nl80211_new_station()
6447 if (info->attrs[NL80211_ATTR_OPMODE_NOTIF]) { in nl80211_new_station()
6450 nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]); in nl80211_new_station()
6453 if (info->attrs[NL80211_ATTR_STA_PLINK_ACTION]) in nl80211_new_station()
6455 nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_ACTION]); in nl80211_new_station()
6457 if (info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]) in nl80211_new_station()
6459 nla_get_u16(info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]); in nl80211_new_station()
6462 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_new_station()
6464 return -EOPNOTSUPP; in nl80211_new_station()
6478 if (parse_station_flags(info, dev->ieee80211_ptr->iftype, ¶ms)) in nl80211_new_station()
6479 return -EINVAL; in nl80211_new_station()
6492 return -EINVAL; in nl80211_new_station()
6497 return -EINVAL; in nl80211_new_station()
6502 switch (dev->ieee80211_ptr->iftype) { in nl80211_new_station()
6507 if (!(rdev->wiphy.flags & WIPHY_FLAG_AP_UAPSD) || in nl80211_new_station()
6513 info->attrs[NL80211_ATTR_PEER_AID]) in nl80211_new_station()
6514 return -EINVAL; in nl80211_new_station()
6519 if (!(rdev->wiphy.features & in nl80211_new_station()
6522 return -EINVAL; in nl80211_new_station()
6550 return -EINVAL; in nl80211_new_station()
6553 info->attrs[NL80211_ATTR_PEER_AID]) in nl80211_new_station()
6554 return -EINVAL; in nl80211_new_station()
6565 return -EINVAL; in nl80211_new_station()
6568 return -EINVAL; in nl80211_new_station()
6570 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS)) in nl80211_new_station()
6571 return -EOPNOTSUPP; in nl80211_new_station()
6573 if (!(rdev->wiphy.flags & WIPHY_FLAG_TDLS_EXTERNAL_SETUP)) in nl80211_new_station()
6574 return -EOPNOTSUPP; in nl80211_new_station()
6582 return -EOPNOTSUPP; in nl80211_new_station()
6596 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_del_station()
6597 struct net_device *dev = info->user_ptr[1]; in nl80211_del_station()
6602 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_del_station()
6603 params.mac = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_del_station()
6605 switch (dev->ieee80211_ptr->iftype) { in nl80211_del_station()
6614 if (wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_del_station()
6617 return -EINVAL; in nl80211_del_station()
6619 return -EINVAL; in nl80211_del_station()
6622 if (!rdev->ops->del_station) in nl80211_del_station()
6623 return -EOPNOTSUPP; in nl80211_del_station()
6625 if (info->attrs[NL80211_ATTR_MGMT_SUBTYPE]) { in nl80211_del_station()
6627 nla_get_u8(info->attrs[NL80211_ATTR_MGMT_SUBTYPE]); in nl80211_del_station()
6630 return -EINVAL; in nl80211_del_station()
6636 if (info->attrs[NL80211_ATTR_REASON_CODE]) { in nl80211_del_station()
6638 nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); in nl80211_del_station()
6640 return -EINVAL; /* 0 is reserved */ in nl80211_del_station()
6659 return -1; in nl80211_send_mpath()
6661 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in nl80211_send_mpath()
6664 nla_put_u32(msg, NL80211_ATTR_GENERATION, pinfo->generation)) in nl80211_send_mpath()
6670 if ((pinfo->filled & MPATH_INFO_FRAME_QLEN) && in nl80211_send_mpath()
6672 pinfo->frame_qlen)) in nl80211_send_mpath()
6674 if (((pinfo->filled & MPATH_INFO_SN) && in nl80211_send_mpath()
6675 nla_put_u32(msg, NL80211_MPATH_INFO_SN, pinfo->sn)) || in nl80211_send_mpath()
6676 ((pinfo->filled & MPATH_INFO_METRIC) && in nl80211_send_mpath()
6678 pinfo->metric)) || in nl80211_send_mpath()
6679 ((pinfo->filled & MPATH_INFO_EXPTIME) && in nl80211_send_mpath()
6681 pinfo->exptime)) || in nl80211_send_mpath()
6682 ((pinfo->filled & MPATH_INFO_FLAGS) && in nl80211_send_mpath()
6684 pinfo->flags)) || in nl80211_send_mpath()
6685 ((pinfo->filled & MPATH_INFO_DISCOVERY_TIMEOUT) && in nl80211_send_mpath()
6687 pinfo->discovery_timeout)) || in nl80211_send_mpath()
6688 ((pinfo->filled & MPATH_INFO_DISCOVERY_RETRIES) && in nl80211_send_mpath()
6690 pinfo->discovery_retries)) || in nl80211_send_mpath()
6691 ((pinfo->filled & MPATH_INFO_HOP_COUNT) && in nl80211_send_mpath()
6693 pinfo->hop_count)) || in nl80211_send_mpath()
6694 ((pinfo->filled & MPATH_INFO_PATH_CHANGE) && in nl80211_send_mpath()
6696 pinfo->path_change_count))) in nl80211_send_mpath()
6706 return -EMSGSIZE; in nl80211_send_mpath()
6717 int path_idx = cb->args[2]; in nl80211_dump_mpath()
6725 if (!rdev->ops->dump_mpath) { in nl80211_dump_mpath()
6726 err = -EOPNOTSUPP; in nl80211_dump_mpath()
6730 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) { in nl80211_dump_mpath()
6731 err = -EOPNOTSUPP; in nl80211_dump_mpath()
6736 err = rdev_dump_mpath(rdev, wdev->netdev, path_idx, dst, in nl80211_dump_mpath()
6738 if (err == -ENOENT) in nl80211_dump_mpath()
6743 if (nl80211_send_mpath(skb, NETLINK_CB(cb->skb).portid, in nl80211_dump_mpath()
6744 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_dump_mpath()
6745 wdev->netdev, dst, next_hop, in nl80211_dump_mpath()
6753 cb->args[2] = path_idx; in nl80211_dump_mpath()
6754 err = skb->len; in nl80211_dump_mpath()
6762 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_mpath()
6764 struct net_device *dev = info->user_ptr[1]; in nl80211_get_mpath()
6772 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_get_mpath()
6773 return -EINVAL; in nl80211_get_mpath()
6775 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_get_mpath()
6777 if (!rdev->ops->get_mpath) in nl80211_get_mpath()
6778 return -EOPNOTSUPP; in nl80211_get_mpath()
6780 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_get_mpath()
6781 return -EOPNOTSUPP; in nl80211_get_mpath()
6789 return -ENOMEM; in nl80211_get_mpath()
6791 if (nl80211_send_mpath(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_mpath()
6794 return -ENOBUFS; in nl80211_get_mpath()
6802 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_mpath()
6803 struct net_device *dev = info->user_ptr[1]; in nl80211_set_mpath()
6807 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_set_mpath()
6808 return -EINVAL; in nl80211_set_mpath()
6810 if (!info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]) in nl80211_set_mpath()
6811 return -EINVAL; in nl80211_set_mpath()
6813 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_set_mpath()
6814 next_hop = nla_data(info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]); in nl80211_set_mpath()
6816 if (!rdev->ops->change_mpath) in nl80211_set_mpath()
6817 return -EOPNOTSUPP; in nl80211_set_mpath()
6819 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_set_mpath()
6820 return -EOPNOTSUPP; in nl80211_set_mpath()
6827 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_new_mpath()
6828 struct net_device *dev = info->user_ptr[1]; in nl80211_new_mpath()
6832 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_new_mpath()
6833 return -EINVAL; in nl80211_new_mpath()
6835 if (!info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]) in nl80211_new_mpath()
6836 return -EINVAL; in nl80211_new_mpath()
6838 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_new_mpath()
6839 next_hop = nla_data(info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]); in nl80211_new_mpath()
6841 if (!rdev->ops->add_mpath) in nl80211_new_mpath()
6842 return -EOPNOTSUPP; in nl80211_new_mpath()
6844 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_new_mpath()
6845 return -EOPNOTSUPP; in nl80211_new_mpath()
6852 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_del_mpath()
6853 struct net_device *dev = info->user_ptr[1]; in nl80211_del_mpath()
6856 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_del_mpath()
6857 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_del_mpath()
6859 if (!rdev->ops->del_mpath) in nl80211_del_mpath()
6860 return -EOPNOTSUPP; in nl80211_del_mpath()
6862 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_del_mpath()
6863 return -EOPNOTSUPP; in nl80211_del_mpath()
6870 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_mpp()
6872 struct net_device *dev = info->user_ptr[1]; in nl80211_get_mpp()
6880 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_get_mpp()
6881 return -EINVAL; in nl80211_get_mpp()
6883 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_get_mpp()
6885 if (!rdev->ops->get_mpp) in nl80211_get_mpp()
6886 return -EOPNOTSUPP; in nl80211_get_mpp()
6888 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_get_mpp()
6889 return -EOPNOTSUPP; in nl80211_get_mpp()
6897 return -ENOMEM; in nl80211_get_mpp()
6899 if (nl80211_send_mpath(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_mpp()
6902 return -ENOBUFS; in nl80211_get_mpp()
6916 int path_idx = cb->args[2]; in nl80211_dump_mpp()
6924 if (!rdev->ops->dump_mpp) { in nl80211_dump_mpp()
6925 err = -EOPNOTSUPP; in nl80211_dump_mpp()
6929 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) { in nl80211_dump_mpp()
6930 err = -EOPNOTSUPP; in nl80211_dump_mpp()
6935 err = rdev_dump_mpp(rdev, wdev->netdev, path_idx, dst, in nl80211_dump_mpp()
6937 if (err == -ENOENT) in nl80211_dump_mpp()
6942 if (nl80211_send_mpath(skb, NETLINK_CB(cb->skb).portid, in nl80211_dump_mpp()
6943 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_dump_mpp()
6944 wdev->netdev, dst, mpp, in nl80211_dump_mpp()
6952 cb->args[2] = path_idx; in nl80211_dump_mpp()
6953 err = skb->len; in nl80211_dump_mpp()
6961 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_bss()
6962 struct net_device *dev = info->user_ptr[1]; in nl80211_set_bss()
6963 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_bss()
6969 params.use_cts_prot = -1; in nl80211_set_bss()
6970 params.use_short_preamble = -1; in nl80211_set_bss()
6971 params.use_short_slot_time = -1; in nl80211_set_bss()
6972 params.ap_isolate = -1; in nl80211_set_bss()
6973 params.ht_opmode = -1; in nl80211_set_bss()
6974 params.p2p_ctwindow = -1; in nl80211_set_bss()
6975 params.p2p_opp_ps = -1; in nl80211_set_bss()
6977 if (info->attrs[NL80211_ATTR_BSS_CTS_PROT]) in nl80211_set_bss()
6979 nla_get_u8(info->attrs[NL80211_ATTR_BSS_CTS_PROT]); in nl80211_set_bss()
6980 if (info->attrs[NL80211_ATTR_BSS_SHORT_PREAMBLE]) in nl80211_set_bss()
6982 nla_get_u8(info->attrs[NL80211_ATTR_BSS_SHORT_PREAMBLE]); in nl80211_set_bss()
6983 if (info->attrs[NL80211_ATTR_BSS_SHORT_SLOT_TIME]) in nl80211_set_bss()
6985 nla_get_u8(info->attrs[NL80211_ATTR_BSS_SHORT_SLOT_TIME]); in nl80211_set_bss()
6986 if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) { in nl80211_set_bss()
6988 nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); in nl80211_set_bss()
6990 nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); in nl80211_set_bss()
6992 if (info->attrs[NL80211_ATTR_AP_ISOLATE]) in nl80211_set_bss()
6993 params.ap_isolate = !!nla_get_u8(info->attrs[NL80211_ATTR_AP_ISOLATE]); in nl80211_set_bss()
6994 if (info->attrs[NL80211_ATTR_BSS_HT_OPMODE]) in nl80211_set_bss()
6996 nla_get_u16(info->attrs[NL80211_ATTR_BSS_HT_OPMODE]); in nl80211_set_bss()
6998 if (info->attrs[NL80211_ATTR_P2P_CTWINDOW]) { in nl80211_set_bss()
6999 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_set_bss()
7000 return -EINVAL; in nl80211_set_bss()
7002 nla_get_u8(info->attrs[NL80211_ATTR_P2P_CTWINDOW]); in nl80211_set_bss()
7004 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_CTWIN)) in nl80211_set_bss()
7005 return -EINVAL; in nl80211_set_bss()
7008 if (info->attrs[NL80211_ATTR_P2P_OPPPS]) { in nl80211_set_bss()
7011 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_set_bss()
7012 return -EINVAL; in nl80211_set_bss()
7013 tmp = nla_get_u8(info->attrs[NL80211_ATTR_P2P_OPPPS]); in nl80211_set_bss()
7016 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_OPPPS)) in nl80211_set_bss()
7017 return -EINVAL; in nl80211_set_bss()
7020 if (!rdev->ops->change_bss) in nl80211_set_bss()
7021 return -EOPNOTSUPP; in nl80211_set_bss()
7023 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && in nl80211_set_bss()
7024 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_set_bss()
7025 return -EOPNOTSUPP; in nl80211_set_bss()
7043 * completely when built-in to the kernel right between the time in nl80211_req_set_reg()
7048 return -EINPROGRESS; in nl80211_req_set_reg()
7050 if (info->attrs[NL80211_ATTR_USER_REG_HINT_TYPE]) in nl80211_req_set_reg()
7052 nla_get_u32(info->attrs[NL80211_ATTR_USER_REG_HINT_TYPE]); in nl80211_req_set_reg()
7059 if (!info->attrs[NL80211_ATTR_REG_ALPHA2]) in nl80211_req_set_reg()
7060 return -EINVAL; in nl80211_req_set_reg()
7062 data = nla_data(info->attrs[NL80211_ATTR_REG_ALPHA2]); in nl80211_req_set_reg()
7065 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) { in nl80211_req_set_reg()
7066 owner_nlportid = info->snd_portid; in nl80211_req_set_reg()
7067 is_indoor = !!info->attrs[NL80211_ATTR_REG_INDOOR]; in nl80211_req_set_reg()
7075 return -EINVAL; in nl80211_req_set_reg()
7087 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_mesh_config()
7088 struct net_device *dev = info->user_ptr[1]; in nl80211_get_mesh_config()
7089 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_get_mesh_config()
7096 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_get_mesh_config()
7097 return -EOPNOTSUPP; in nl80211_get_mesh_config()
7099 if (!rdev->ops->get_mesh_config) in nl80211_get_mesh_config()
7100 return -EOPNOTSUPP; in nl80211_get_mesh_config()
7104 if (!wdev->mesh_id_len) in nl80211_get_mesh_config()
7116 return -ENOMEM; in nl80211_get_mesh_config()
7117 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_mesh_config()
7124 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in nl80211_get_mesh_config()
7195 return -ENOBUFS; in nl80211_get_mesh_config()
7230 NLA_POLICY_RANGE(NLA_S32, -255, 0),
7273 cfg->param = fn(tb[attr]); \ in nl80211_parse_mesh_config()
7274 mask |= BIT((attr) - 1); \ in nl80211_parse_mesh_config()
7278 if (!info->attrs[NL80211_ATTR_MESH_CONFIG]) in nl80211_parse_mesh_config()
7279 return -EINVAL; in nl80211_parse_mesh_config()
7280 …ated(tb, NL80211_MESHCONF_ATTR_MAX, info->attrs[NL80211_ATTR_MESH_CONFIG], nl80211_meshconf_params… in nl80211_parse_mesh_config()
7281 return -EINVAL; in nl80211_parse_mesh_config()
7284 * parameters (otherwise our bitfield scheme would not work.) */ in nl80211_parse_mesh_config()
7319 (cfg->path_refresh_time < 1 || cfg->path_refresh_time > 65535)) in nl80211_parse_mesh_config()
7320 return -EINVAL; in nl80211_parse_mesh_config()
7329 (cfg->dot11MeshHWMPactivePathTimeout < 1 || in nl80211_parse_mesh_config()
7330 cfg->dot11MeshHWMPactivePathTimeout > 65535)) in nl80211_parse_mesh_config()
7331 return -EINVAL; in nl80211_parse_mesh_config()
7363 * IEEE 802.11-2016 9.4.2.57 HT Operation element. in nl80211_parse_mesh_config()
7371 return -EINVAL; in nl80211_parse_mesh_config()
7376 cfg->ht_opmode = ht_opmode; in nl80211_parse_mesh_config()
7377 mask |= (1 << (NL80211_MESHCONF_HT_OPMODE - 1)); in nl80211_parse_mesh_config()
7384 (cfg->dot11MeshHWMPactivePathToRootTimeout < 1 || in nl80211_parse_mesh_config()
7385 cfg->dot11MeshHWMPactivePathToRootTimeout > 65535)) in nl80211_parse_mesh_config()
7386 return -EINVAL; in nl80211_parse_mesh_config()
7413 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_parse_mesh_setup()
7416 if (!info->attrs[NL80211_ATTR_MESH_SETUP]) in nl80211_parse_mesh_setup()
7417 return -EINVAL; in nl80211_parse_mesh_setup()
7418 …ed(tb, NL80211_MESH_SETUP_ATTR_MAX, info->attrs[NL80211_ATTR_MESH_SETUP], nl80211_mesh_setup_param… in nl80211_parse_mesh_setup()
7419 return -EINVAL; in nl80211_parse_mesh_setup()
7422 setup->sync_method = in nl80211_parse_mesh_setup()
7428 setup->path_sel_proto = in nl80211_parse_mesh_setup()
7434 setup->path_metric = in nl80211_parse_mesh_setup()
7442 setup->ie = nla_data(ieattr); in nl80211_parse_mesh_setup()
7443 setup->ie_len = nla_len(ieattr); in nl80211_parse_mesh_setup()
7446 !(rdev->wiphy.features & NL80211_FEATURE_USERSPACE_MPM)) in nl80211_parse_mesh_setup()
7447 return -EINVAL; in nl80211_parse_mesh_setup()
7448 setup->user_mpm = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_MPM]); in nl80211_parse_mesh_setup()
7449 setup->is_authenticated = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_AUTH]); in nl80211_parse_mesh_setup()
7450 setup->is_secure = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_AMPE]); in nl80211_parse_mesh_setup()
7451 if (setup->is_secure) in nl80211_parse_mesh_setup()
7452 setup->user_mpm = true; in nl80211_parse_mesh_setup()
7455 if (!setup->user_mpm) in nl80211_parse_mesh_setup()
7456 return -EINVAL; in nl80211_parse_mesh_setup()
7457 setup->auth_id = in nl80211_parse_mesh_setup()
7467 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_update_mesh_config()
7468 struct net_device *dev = info->user_ptr[1]; in nl80211_update_mesh_config()
7469 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_update_mesh_config()
7474 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_update_mesh_config()
7475 return -EOPNOTSUPP; in nl80211_update_mesh_config()
7477 if (!rdev->ops->update_mesh_config) in nl80211_update_mesh_config()
7478 return -EOPNOTSUPP; in nl80211_update_mesh_config()
7485 if (!wdev->mesh_id_len) in nl80211_update_mesh_config()
7486 err = -ENOLINK; in nl80211_update_mesh_config()
7502 if (nla_put_string(msg, NL80211_ATTR_REG_ALPHA2, regdom->alpha2) || in nl80211_put_regdom()
7503 (regdom->dfs_region && in nl80211_put_regdom()
7504 nla_put_u8(msg, NL80211_ATTR_DFS_REGION, regdom->dfs_region))) in nl80211_put_regdom()
7511 for (i = 0; i < regdom->n_reg_rules; i++) { in nl80211_put_regdom()
7518 reg_rule = ®dom->reg_rules[i]; in nl80211_put_regdom()
7519 freq_range = ®_rule->freq_range; in nl80211_put_regdom()
7520 power_rule = ®_rule->power_rule; in nl80211_put_regdom()
7526 max_bandwidth_khz = freq_range->max_bandwidth_khz; in nl80211_put_regdom()
7532 reg_rule->flags) || in nl80211_put_regdom()
7534 freq_range->start_freq_khz) || in nl80211_put_regdom()
7536 freq_range->end_freq_khz) || in nl80211_put_regdom()
7540 power_rule->max_antenna_gain) || in nl80211_put_regdom()
7542 power_rule->max_eirp) || in nl80211_put_regdom()
7544 reg_rule->dfs_cac_ms)) in nl80211_put_regdom()
7554 return -EMSGSIZE; in nl80211_put_regdom()
7567 return -ENOBUFS; in nl80211_get_reg_do()
7569 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_reg_do()
7574 if (info->attrs[NL80211_ATTR_WIPHY]) { in nl80211_get_reg_do()
7583 wiphy = &rdev->wiphy; in nl80211_get_reg_do()
7584 self_managed = wiphy->regulatory_flags & in nl80211_get_reg_do()
7588 /* a self-managed-reg device must have a private regdom */ in nl80211_get_reg_do()
7591 return -EINVAL; in nl80211_get_reg_do()
7622 return -EMSGSIZE; in nl80211_get_reg_do()
7629 void *hdr = nl80211hdr_put(msg, NETLINK_CB(cb->skb).portid, seq, flags, in nl80211_send_regdom()
7633 return -1; in nl80211_send_regdom()
7649 if (wiphy && wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED && in nl80211_send_regdom()
7658 return -EMSGSIZE; in nl80211_send_regdom()
7666 int err, reg_idx, start = cb->args[2]; in nl80211_get_reg_dump()
7671 err = nl80211_send_regdom(skb, cb, cb->nlh->nlmsg_seq, in nl80211_get_reg_dump()
7681 regdom = get_wiphy_regdom(&rdev->wiphy); in nl80211_get_reg_dump()
7688 err = nl80211_send_regdom(skb, cb, cb->nlh->nlmsg_seq, in nl80211_get_reg_dump()
7689 NLM_F_MULTI, &rdev->wiphy, regdom); in nl80211_get_reg_dump()
7691 reg_idx--; in nl80211_get_reg_dump()
7696 cb->args[2] = reg_idx; in nl80211_get_reg_dump()
7697 err = skb->len; in nl80211_get_reg_dump()
7717 struct ieee80211_freq_range *freq_range = ®_rule->freq_range; in parse_reg_rule()
7718 struct ieee80211_power_rule *power_rule = ®_rule->power_rule; in parse_reg_rule()
7721 return -EINVAL; in parse_reg_rule()
7723 return -EINVAL; in parse_reg_rule()
7725 return -EINVAL; in parse_reg_rule()
7727 return -EINVAL; in parse_reg_rule()
7729 return -EINVAL; in parse_reg_rule()
7731 reg_rule->flags = nla_get_u32(tb[NL80211_ATTR_REG_RULE_FLAGS]); in parse_reg_rule()
7733 freq_range->start_freq_khz = in parse_reg_rule()
7735 freq_range->end_freq_khz = in parse_reg_rule()
7737 freq_range->max_bandwidth_khz = in parse_reg_rule()
7740 power_rule->max_eirp = in parse_reg_rule()
7744 power_rule->max_antenna_gain = in parse_reg_rule()
7748 reg_rule->dfs_cac_ms = in parse_reg_rule()
7764 if (!info->attrs[NL80211_ATTR_REG_ALPHA2]) in nl80211_set_reg()
7765 return -EINVAL; in nl80211_set_reg()
7767 if (!info->attrs[NL80211_ATTR_REG_RULES]) in nl80211_set_reg()
7768 return -EINVAL; in nl80211_set_reg()
7770 alpha2 = nla_data(info->attrs[NL80211_ATTR_REG_ALPHA2]); in nl80211_set_reg()
7772 if (info->attrs[NL80211_ATTR_DFS_REGION]) in nl80211_set_reg()
7773 dfs_region = nla_get_u8(info->attrs[NL80211_ATTR_DFS_REGION]); in nl80211_set_reg()
7775 nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES], in nl80211_set_reg()
7779 return -EINVAL; in nl80211_set_reg()
7783 return -EINVAL; in nl80211_set_reg()
7787 return -ENOMEM; in nl80211_set_reg()
7789 rd->n_reg_rules = num_rules; in nl80211_set_reg()
7790 rd->alpha2[0] = alpha2[0]; in nl80211_set_reg()
7791 rd->alpha2[1] = alpha2[1]; in nl80211_set_reg()
7798 rd->dfs_region = dfs_region; in nl80211_set_reg()
7800 nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES], in nl80211_set_reg()
7804 info->extack); in nl80211_set_reg()
7807 r = parse_reg_rule(tb, &rd->reg_rules[rule_idx]); in nl80211_set_reg()
7814 r = -EINVAL; in nl80211_set_reg()
7858 return b < NUM_NL80211_BANDS && wiphy->bands[b]; in is_band_valid()
7873 return -EINVAL; in parse_bss_select()
7885 return -EINVAL; in parse_bss_select()
7890 bss_select->behaviour = __NL80211_BSS_SELECT_ATTR_INVALID; in parse_bss_select()
7893 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_RSSI; in parse_bss_select()
7896 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_BAND_PREF; in parse_bss_select()
7897 bss_select->param.band_pref = in parse_bss_select()
7899 if (!is_band_valid(wiphy, bss_select->param.band_pref)) in parse_bss_select()
7900 return -EINVAL; in parse_bss_select()
7907 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_RSSI_ADJUST; in parse_bss_select()
7908 bss_select->param.adjust.band = adj_param->band; in parse_bss_select()
7909 bss_select->param.adjust.delta = adj_param->delta; in parse_bss_select()
7910 if (!is_band_valid(wiphy, bss_select->param.adjust.band)) in parse_bss_select()
7911 return -EINVAL; in parse_bss_select()
7914 /* user-space did not provide behaviour attribute */ in parse_bss_select()
7915 if (bss_select->behaviour == __NL80211_BSS_SELECT_ATTR_INVALID) in parse_bss_select()
7916 return -EINVAL; in parse_bss_select()
7918 if (!(wiphy->bss_select_support & BIT(bss_select->behaviour))) in parse_bss_select()
7919 return -EINVAL; in parse_bss_select()
7940 return -EINVAL; in nl80211_parse_random_mac()
7948 return -EINVAL; in nl80211_parse_random_mac()
7968 if (!(wdev->chandef.chan->flags & IEEE80211_CHAN_RADAR)) in cfg80211_off_channel_oper_allowed()
7971 return regulatory_pre_cac_allowed(wdev->wiphy); in cfg80211_off_channel_oper_allowed()
8002 flags = &req->flags; in nl80211_check_scan_flags()
8003 mac_addr = req->mac_addr; in nl80211_check_scan_flags()
8004 mac_addr_mask = req->mac_addr_mask; in nl80211_check_scan_flags()
8009 flags = &req->flags; in nl80211_check_scan_flags()
8010 mac_addr = req->mac_addr; in nl80211_check_scan_flags()
8011 mac_addr_mask = req->mac_addr_mask; in nl80211_check_scan_flags()
8017 !(wiphy->features & NL80211_FEATURE_LOW_PRIORITY_SCAN)) || in nl80211_check_scan_flags()
8045 return -EOPNOTSUPP; in nl80211_check_scan_flags()
8050 if (!(wiphy->features & randomness_flag) || in nl80211_check_scan_flags()
8051 (wdev && wdev->current_bss)) in nl80211_check_scan_flags()
8052 return -EOPNOTSUPP; in nl80211_check_scan_flags()
8064 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_trigger_scan()
8065 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_trigger_scan()
8074 wiphy = &rdev->wiphy; in nl80211_trigger_scan()
8076 if (wdev->iftype == NL80211_IFTYPE_NAN) in nl80211_trigger_scan()
8077 return -EOPNOTSUPP; in nl80211_trigger_scan()
8079 if (!rdev->ops->scan) in nl80211_trigger_scan()
8080 return -EOPNOTSUPP; in nl80211_trigger_scan()
8082 if (rdev->scan_req || rdev->scan_msg) in nl80211_trigger_scan()
8083 return -EBUSY; in nl80211_trigger_scan()
8085 if (info->attrs[NL80211_ATTR_SCAN_FREQ_KHZ]) { in nl80211_trigger_scan()
8088 return -EOPNOTSUPP; in nl80211_trigger_scan()
8089 scan_freqs = info->attrs[NL80211_ATTR_SCAN_FREQ_KHZ]; in nl80211_trigger_scan()
8091 } else if (info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]) in nl80211_trigger_scan()
8092 scan_freqs = info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]; in nl80211_trigger_scan()
8097 return -EINVAL; in nl80211_trigger_scan()
8102 if (info->attrs[NL80211_ATTR_SCAN_SSIDS]) in nl80211_trigger_scan()
8103 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp) in nl80211_trigger_scan()
8106 if (n_ssids > wiphy->max_scan_ssids) in nl80211_trigger_scan()
8107 return -EINVAL; in nl80211_trigger_scan()
8109 if (info->attrs[NL80211_ATTR_IE]) in nl80211_trigger_scan()
8110 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_trigger_scan()
8114 if (ie_len > wiphy->max_scan_ie_len) in nl80211_trigger_scan()
8115 return -EINVAL; in nl80211_trigger_scan()
8118 + sizeof(*request->ssids) * n_ssids in nl80211_trigger_scan()
8119 + sizeof(*request->channels) * n_channels in nl80211_trigger_scan()
8122 return -ENOMEM; in nl80211_trigger_scan()
8125 request->ssids = (void *)&request->channels[n_channels]; in nl80211_trigger_scan()
8126 request->n_ssids = n_ssids; in nl80211_trigger_scan()
8129 request->ie = (void *)(request->ssids + n_ssids); in nl80211_trigger_scan()
8131 request->ie = (void *)(request->channels + n_channels); in nl80211_trigger_scan()
8146 err = -EINVAL; in nl80211_trigger_scan()
8151 if (chan->flags & IEEE80211_CHAN_DISABLED) in nl80211_trigger_scan()
8154 request->channels[i] = chan; in nl80211_trigger_scan()
8164 if (!wiphy->bands[band]) in nl80211_trigger_scan()
8166 for (j = 0; j < wiphy->bands[band]->n_channels; j++) { in nl80211_trigger_scan()
8169 chan = &wiphy->bands[band]->channels[j]; in nl80211_trigger_scan()
8171 if (chan->flags & IEEE80211_CHAN_DISABLED) in nl80211_trigger_scan()
8174 request->channels[i] = chan; in nl80211_trigger_scan()
8181 err = -EINVAL; in nl80211_trigger_scan()
8185 request->n_channels = i; in nl80211_trigger_scan()
8191 if (request->n_channels != 1) { in nl80211_trigger_scan()
8193 err = -EBUSY; in nl80211_trigger_scan()
8197 chan = request->channels[0]; in nl80211_trigger_scan()
8198 if (chan->center_freq != wdev->chandef.chan->center_freq) { in nl80211_trigger_scan()
8200 err = -EBUSY; in nl80211_trigger_scan()
8208 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp) { in nl80211_trigger_scan()
8210 err = -EINVAL; in nl80211_trigger_scan()
8213 request->ssids[i].ssid_len = nla_len(attr); in nl80211_trigger_scan()
8214 memcpy(request->ssids[i].ssid, nla_data(attr), nla_len(attr)); in nl80211_trigger_scan()
8219 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_trigger_scan()
8220 request->ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_trigger_scan()
8221 memcpy((void *)request->ie, in nl80211_trigger_scan()
8222 nla_data(info->attrs[NL80211_ATTR_IE]), in nl80211_trigger_scan()
8223 request->ie_len); in nl80211_trigger_scan()
8227 if (wiphy->bands[i]) in nl80211_trigger_scan()
8228 request->rates[i] = in nl80211_trigger_scan()
8229 (1 << wiphy->bands[i]->n_bitrates) - 1; in nl80211_trigger_scan()
8231 if (info->attrs[NL80211_ATTR_SCAN_SUPP_RATES]) { in nl80211_trigger_scan()
8233 info->attrs[NL80211_ATTR_SCAN_SUPP_RATES], in nl80211_trigger_scan()
8238 err = -EINVAL; in nl80211_trigger_scan()
8242 if (!wiphy->bands[band]) in nl80211_trigger_scan()
8245 err = ieee80211_get_ratemask(wiphy->bands[band], in nl80211_trigger_scan()
8248 &request->rates[band]); in nl80211_trigger_scan()
8254 if (info->attrs[NL80211_ATTR_MEASUREMENT_DURATION]) { in nl80211_trigger_scan()
8257 err = -EOPNOTSUPP; in nl80211_trigger_scan()
8261 request->duration = in nl80211_trigger_scan()
8262 nla_get_u16(info->attrs[NL80211_ATTR_MEASUREMENT_DURATION]); in nl80211_trigger_scan()
8263 request->duration_mandatory = in nl80211_trigger_scan()
8264 nla_get_flag(info->attrs[NL80211_ATTR_MEASUREMENT_DURATION_MANDATORY]); in nl80211_trigger_scan()
8267 err = nl80211_check_scan_flags(wiphy, wdev, request, info->attrs, in nl80211_trigger_scan()
8272 request->no_cck = in nl80211_trigger_scan()
8273 nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]); in nl80211_trigger_scan()
8284 if (info->attrs[NL80211_ATTR_BSSID]) in nl80211_trigger_scan()
8285 memcpy(request->bssid, in nl80211_trigger_scan()
8286 nla_data(info->attrs[NL80211_ATTR_BSSID]), ETH_ALEN); in nl80211_trigger_scan()
8287 else if (!(request->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) && in nl80211_trigger_scan()
8288 info->attrs[NL80211_ATTR_MAC]) in nl80211_trigger_scan()
8289 memcpy(request->bssid, nla_data(info->attrs[NL80211_ATTR_MAC]), in nl80211_trigger_scan()
8292 eth_broadcast_addr(request->bssid); in nl80211_trigger_scan()
8294 request->wdev = wdev; in nl80211_trigger_scan()
8295 request->wiphy = &rdev->wiphy; in nl80211_trigger_scan()
8296 request->scan_start = jiffies; in nl80211_trigger_scan()
8298 rdev->scan_req = request; in nl80211_trigger_scan()
8305 if (wdev->netdev) in nl80211_trigger_scan()
8306 dev_hold(wdev->netdev); in nl80211_trigger_scan()
8311 rdev->scan_req = NULL; in nl80211_trigger_scan()
8319 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_abort_scan()
8320 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_abort_scan()
8322 if (!rdev->ops->abort_scan) in nl80211_abort_scan()
8323 return -EOPNOTSUPP; in nl80211_abort_scan()
8325 if (rdev->scan_msg) in nl80211_abort_scan()
8328 if (!rdev->scan_req) in nl80211_abort_scan()
8329 return -ENOENT; in nl80211_abort_scan()
8354 return -EINVAL; in nl80211_parse_sched_scan_plans()
8356 request->scan_plans[0].interval = in nl80211_parse_sched_scan_plans()
8358 if (!request->scan_plans[0].interval) in nl80211_parse_sched_scan_plans()
8359 return -EINVAL; in nl80211_parse_sched_scan_plans()
8361 if (request->scan_plans[0].interval > in nl80211_parse_sched_scan_plans()
8362 wiphy->max_sched_scan_plan_interval) in nl80211_parse_sched_scan_plans()
8363 request->scan_plans[0].interval = in nl80211_parse_sched_scan_plans()
8364 wiphy->max_sched_scan_plan_interval; in nl80211_parse_sched_scan_plans()
8373 return -EINVAL; in nl80211_parse_sched_scan_plans()
8383 return -EINVAL; in nl80211_parse_sched_scan_plans()
8385 request->scan_plans[i].interval = in nl80211_parse_sched_scan_plans()
8387 if (!request->scan_plans[i].interval || in nl80211_parse_sched_scan_plans()
8388 request->scan_plans[i].interval > in nl80211_parse_sched_scan_plans()
8389 wiphy->max_sched_scan_plan_interval) in nl80211_parse_sched_scan_plans()
8390 return -EINVAL; in nl80211_parse_sched_scan_plans()
8393 request->scan_plans[i].iterations = in nl80211_parse_sched_scan_plans()
8395 if (!request->scan_plans[i].iterations || in nl80211_parse_sched_scan_plans()
8396 (request->scan_plans[i].iterations > in nl80211_parse_sched_scan_plans()
8397 wiphy->max_sched_scan_plan_iterations)) in nl80211_parse_sched_scan_plans()
8398 return -EINVAL; in nl80211_parse_sched_scan_plans()
8399 } else if (i < n_plans - 1) { in nl80211_parse_sched_scan_plans()
8404 return -EINVAL; in nl80211_parse_sched_scan_plans()
8414 if (request->scan_plans[n_plans - 1].iterations) in nl80211_parse_sched_scan_plans()
8415 return -EINVAL; in nl80211_parse_sched_scan_plans()
8432 ret = -EOPNOTSUPP; in nl80211_parse_sched_scan_per_band_rssi()
8435 match_sets->per_band_rssi_thold[i] = in nl80211_parse_sched_scan_per_band_rssi()
8441 match_sets->per_band_rssi_thold[i] = rssi_thold; in nl80211_parse_sched_scan_per_band_rssi()
8447 return -EINVAL; in nl80211_parse_sched_scan_per_band_rssi()
8449 match_sets->per_band_rssi_thold[band] = nla_get_s32(attr); in nl80211_parse_sched_scan_per_band_rssi()
8471 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
8481 if (n_ssids > wiphy->max_sched_scan_ssids) in nl80211_parse_sched_scan()
8482 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
8491 * global RSSI for all other matchsets - if there are other matchsets. in nl80211_parse_sched_scan()
8510 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
8529 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
8536 if (ie_len > wiphy->max_sched_scan_ie_len) in nl80211_parse_sched_scan()
8537 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
8545 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
8558 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
8563 if (!n_plans || n_plans > wiphy->max_sched_scan_plans) in nl80211_parse_sched_scan()
8564 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
8570 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
8573 + sizeof(*request->ssids) * n_ssids in nl80211_parse_sched_scan()
8574 + sizeof(*request->match_sets) * n_match_sets in nl80211_parse_sched_scan()
8575 + sizeof(*request->scan_plans) * n_plans in nl80211_parse_sched_scan()
8576 + sizeof(*request->channels) * n_channels in nl80211_parse_sched_scan()
8579 return ERR_PTR(-ENOMEM); in nl80211_parse_sched_scan()
8582 request->ssids = (void *)&request->channels[n_channels]; in nl80211_parse_sched_scan()
8583 request->n_ssids = n_ssids; in nl80211_parse_sched_scan()
8586 request->ie = (void *)(request->ssids + n_ssids); in nl80211_parse_sched_scan()
8588 request->ie = (void *)(request->channels + n_channels); in nl80211_parse_sched_scan()
8592 if (request->ie) in nl80211_parse_sched_scan()
8593 request->match_sets = (void *)(request->ie + ie_len); in nl80211_parse_sched_scan()
8595 request->match_sets = in nl80211_parse_sched_scan()
8596 (void *)(request->ssids + n_ssids); in nl80211_parse_sched_scan()
8598 request->match_sets = in nl80211_parse_sched_scan()
8599 (void *)(request->channels + n_channels); in nl80211_parse_sched_scan()
8601 request->n_match_sets = n_match_sets; in nl80211_parse_sched_scan()
8604 request->scan_plans = (void *)(request->match_sets + in nl80211_parse_sched_scan()
8606 else if (request->ie) in nl80211_parse_sched_scan()
8607 request->scan_plans = (void *)(request->ie + ie_len); in nl80211_parse_sched_scan()
8609 request->scan_plans = (void *)(request->ssids + n_ssids); in nl80211_parse_sched_scan()
8611 request->scan_plans = (void *)(request->channels + n_channels); in nl80211_parse_sched_scan()
8613 request->n_scan_plans = n_plans; in nl80211_parse_sched_scan()
8626 err = -EINVAL; in nl80211_parse_sched_scan()
8631 if (chan->flags & IEEE80211_CHAN_DISABLED) in nl80211_parse_sched_scan()
8634 request->channels[i] = chan; in nl80211_parse_sched_scan()
8642 if (!wiphy->bands[band]) in nl80211_parse_sched_scan()
8644 for (j = 0; j < wiphy->bands[band]->n_channels; j++) { in nl80211_parse_sched_scan()
8647 chan = &wiphy->bands[band]->channels[j]; in nl80211_parse_sched_scan()
8649 if (chan->flags & IEEE80211_CHAN_DISABLED) in nl80211_parse_sched_scan()
8652 request->channels[i] = chan; in nl80211_parse_sched_scan()
8659 err = -EINVAL; in nl80211_parse_sched_scan()
8663 request->n_channels = i; in nl80211_parse_sched_scan()
8670 err = -EINVAL; in nl80211_parse_sched_scan()
8673 request->ssids[i].ssid_len = nla_len(attr); in nl80211_parse_sched_scan()
8674 memcpy(request->ssids[i].ssid, nla_data(attr), in nl80211_parse_sched_scan()
8707 err = -EINVAL; in nl80211_parse_sched_scan()
8712 memcpy(request->match_sets[i].ssid.ssid, in nl80211_parse_sched_scan()
8714 request->match_sets[i].ssid.ssid_len = in nl80211_parse_sched_scan()
8718 memcpy(request->match_sets[i].bssid, in nl80211_parse_sched_scan()
8721 /* special attribute - old implementation w/a */ in nl80211_parse_sched_scan()
8722 request->match_sets[i].rssi_thold = default_match_rssi; in nl80211_parse_sched_scan()
8725 request->match_sets[i].rssi_thold = in nl80211_parse_sched_scan()
8730 &request->match_sets[i], in nl80211_parse_sched_scan()
8732 request->match_sets[i].rssi_thold); in nl80211_parse_sched_scan()
8741 request->match_sets[0].rssi_thold = default_match_rssi; in nl80211_parse_sched_scan()
8743 request->min_rssi_thold = INT_MAX; in nl80211_parse_sched_scan()
8745 request->min_rssi_thold = in nl80211_parse_sched_scan()
8746 min(request->match_sets[i].rssi_thold, in nl80211_parse_sched_scan()
8747 request->min_rssi_thold); in nl80211_parse_sched_scan()
8749 request->min_rssi_thold = NL80211_SCAN_RSSI_THOLD_OFF; in nl80211_parse_sched_scan()
8753 request->ie_len = ie_len; in nl80211_parse_sched_scan()
8754 memcpy((void *)request->ie, in nl80211_parse_sched_scan()
8756 request->ie_len); in nl80211_parse_sched_scan()
8764 request->delay = in nl80211_parse_sched_scan()
8768 request->relative_rssi = nla_get_s8( in nl80211_parse_sched_scan()
8770 request->relative_rssi_set = true; in nl80211_parse_sched_scan()
8773 if (request->relative_rssi_set && in nl80211_parse_sched_scan()
8779 request->rssi_adjust.band = rssi_adjust->band; in nl80211_parse_sched_scan()
8780 request->rssi_adjust.delta = rssi_adjust->delta; in nl80211_parse_sched_scan()
8781 if (!is_band_valid(wiphy, request->rssi_adjust.band)) { in nl80211_parse_sched_scan()
8782 err = -EINVAL; in nl80211_parse_sched_scan()
8791 request->scan_start = jiffies; in nl80211_parse_sched_scan()
8803 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_start_sched_scan()
8804 struct net_device *dev = info->user_ptr[1]; in nl80211_start_sched_scan()
8805 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_start_sched_scan()
8810 if (!rdev->wiphy.max_sched_scan_reqs || !rdev->ops->sched_scan_start) in nl80211_start_sched_scan()
8811 return -EOPNOTSUPP; in nl80211_start_sched_scan()
8813 want_multi = info->attrs[NL80211_ATTR_SCHED_SCAN_MULTI]; in nl80211_start_sched_scan()
8818 sched_scan_req = nl80211_parse_sched_scan(&rdev->wiphy, wdev, in nl80211_start_sched_scan()
8819 info->attrs, in nl80211_start_sched_scan()
8820 rdev->wiphy.max_match_sets); in nl80211_start_sched_scan()
8827 * or if driver does not support multi-scheduled scan in nl80211_start_sched_scan()
8829 if (want_multi && rdev->wiphy.max_sched_scan_reqs > 1) in nl80211_start_sched_scan()
8830 sched_scan_req->reqid = cfg80211_assign_cookie(rdev); in nl80211_start_sched_scan()
8836 sched_scan_req->dev = dev; in nl80211_start_sched_scan()
8837 sched_scan_req->wiphy = &rdev->wiphy; in nl80211_start_sched_scan()
8839 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) in nl80211_start_sched_scan()
8840 sched_scan_req->owner_nlportid = info->snd_portid; in nl80211_start_sched_scan()
8857 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_stop_sched_scan()
8860 if (!rdev->wiphy.max_sched_scan_reqs || !rdev->ops->sched_scan_stop) in nl80211_stop_sched_scan()
8861 return -EOPNOTSUPP; in nl80211_stop_sched_scan()
8863 if (info->attrs[NL80211_ATTR_COOKIE]) { in nl80211_stop_sched_scan()
8864 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); in nl80211_stop_sched_scan()
8868 req = list_first_or_null_rcu(&rdev->sched_scan_req_list, in nl80211_stop_sched_scan()
8871 if (!req || req->reqid || in nl80211_stop_sched_scan()
8872 (req->owner_nlportid && in nl80211_stop_sched_scan()
8873 req->owner_nlportid != info->snd_portid)) in nl80211_stop_sched_scan()
8874 return -ENOENT; in nl80211_stop_sched_scan()
8882 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_start_radar_detection()
8883 struct net_device *dev = info->user_ptr[1]; in nl80211_start_radar_detection()
8884 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_start_radar_detection()
8885 struct wiphy *wiphy = wdev->wiphy; in nl80211_start_radar_detection()
8893 return -EINVAL; in nl80211_start_radar_detection()
8900 return -EBUSY; in nl80211_start_radar_detection()
8902 if (wdev->cac_started) in nl80211_start_radar_detection()
8903 return -EBUSY; in nl80211_start_radar_detection()
8905 err = cfg80211_chandef_dfs_required(wiphy, &chandef, wdev->iftype); in nl80211_start_radar_detection()
8910 return -EINVAL; in nl80211_start_radar_detection()
8913 return -EINVAL; in nl80211_start_radar_detection()
8917 return -EOPNOTSUPP; in nl80211_start_radar_detection()
8919 if (!rdev->ops->start_radar_detection) in nl80211_start_radar_detection()
8920 return -EOPNOTSUPP; in nl80211_start_radar_detection()
8922 cac_time_ms = cfg80211_chandef_dfs_cac_time(&rdev->wiphy, &chandef); in nl80211_start_radar_detection()
8928 wdev->chandef = chandef; in nl80211_start_radar_detection()
8929 wdev->cac_started = true; in nl80211_start_radar_detection()
8930 wdev->cac_start_time = jiffies; in nl80211_start_radar_detection()
8931 wdev->cac_time_ms = cac_time_ms; in nl80211_start_radar_detection()
8939 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_notify_radar_detection()
8940 struct net_device *dev = info->user_ptr[1]; in nl80211_notify_radar_detection()
8941 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_notify_radar_detection()
8942 struct wiphy *wiphy = wdev->wiphy; in nl80211_notify_radar_detection()
8951 return -EINVAL; in nl80211_notify_radar_detection()
8960 err = cfg80211_chandef_dfs_required(wiphy, &chandef, wdev->iftype); in nl80211_notify_radar_detection()
8969 return -EINVAL; in nl80211_notify_radar_detection()
8975 if (chandef.chan->dfs_state == NL80211_DFS_UNAVAILABLE) in nl80211_notify_radar_detection()
8982 rdev->radar_chandef = chandef; in nl80211_notify_radar_detection()
8985 queue_work(cfg80211_wq, &rdev->propagate_radar_detect_wk); in nl80211_notify_radar_detection()
8992 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_channel_switch()
8993 struct net_device *dev = info->user_ptr[1]; in nl80211_channel_switch()
8994 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_channel_switch()
8996 /* csa_attrs is defined static to avoid waste of stack size - this in nl80211_channel_switch()
9006 if (!rdev->ops->channel_switch || in nl80211_channel_switch()
9007 !(rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH)) in nl80211_channel_switch()
9008 return -EOPNOTSUPP; in nl80211_channel_switch()
9010 switch (dev->ieee80211_ptr->iftype) { in nl80211_channel_switch()
9022 if (!wdev->beacon_interval) in nl80211_channel_switch()
9023 return -ENOTCONN; in nl80211_channel_switch()
9026 if (!wdev->ssid_len) in nl80211_channel_switch()
9027 return -ENOTCONN; in nl80211_channel_switch()
9030 if (!wdev->mesh_id_len) in nl80211_channel_switch()
9031 return -ENOTCONN; in nl80211_channel_switch()
9034 return -EOPNOTSUPP; in nl80211_channel_switch()
9038 params.beacon_csa.ftm_responder = -1; in nl80211_channel_switch()
9040 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ] || in nl80211_channel_switch()
9041 !info->attrs[NL80211_ATTR_CH_SWITCH_COUNT]) in nl80211_channel_switch()
9042 return -EINVAL; in nl80211_channel_switch()
9045 if (need_new_beacon && !info->attrs[NL80211_ATTR_CSA_IES]) in nl80211_channel_switch()
9046 return -EINVAL; in nl80211_channel_switch()
9051 cs_count = nla_get_u32(info->attrs[NL80211_ATTR_CH_SWITCH_COUNT]); in nl80211_channel_switch()
9053 return -EINVAL; in nl80211_channel_switch()
9060 err = nl80211_parse_beacon(rdev, info->attrs, ¶ms.beacon_after); in nl80211_channel_switch()
9065 info->attrs[NL80211_ATTR_CSA_IES], in nl80211_channel_switch()
9066 nl80211_policy, info->extack); in nl80211_channel_switch()
9075 return -EINVAL; in nl80211_channel_switch()
9079 return -EINVAL; in nl80211_channel_switch()
9082 if (rdev->wiphy.max_num_csa_counters && in nl80211_channel_switch()
9084 rdev->wiphy.max_num_csa_counters)) in nl80211_channel_switch()
9085 return -EINVAL; in nl80211_channel_switch()
9090 /* sanity checks - counters should fit and be the same */ in nl80211_channel_switch()
9095 return -EINVAL; in nl80211_channel_switch()
9098 return -EINVAL; in nl80211_channel_switch()
9104 return -EINVAL; in nl80211_channel_switch()
9107 if (rdev->wiphy.max_num_csa_counters && in nl80211_channel_switch()
9109 rdev->wiphy.max_num_csa_counters)) in nl80211_channel_switch()
9110 return -EINVAL; in nl80211_channel_switch()
9115 /* sanity checks - counters should fit and be the same */ in nl80211_channel_switch()
9120 return -EINVAL; in nl80211_channel_switch()
9124 return -EINVAL; in nl80211_channel_switch()
9133 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, ¶ms.chandef, in nl80211_channel_switch()
9134 wdev->iftype)) in nl80211_channel_switch()
9135 return -EINVAL; in nl80211_channel_switch()
9137 err = cfg80211_chandef_dfs_required(wdev->wiphy, in nl80211_channel_switch()
9139 wdev->iftype); in nl80211_channel_switch()
9146 !nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS])) { in nl80211_channel_switch()
9147 return -EINVAL; in nl80211_channel_switch()
9151 if (info->attrs[NL80211_ATTR_CH_SWITCH_BLOCK_TX]) in nl80211_channel_switch()
9167 struct cfg80211_bss *res = &intbss->pub; in nl80211_send_bss()
9174 hdr = nl80211hdr_put(msg, NETLINK_CB(cb->skb).portid, seq, flags, in nl80211_send_bss()
9177 return -1; in nl80211_send_bss()
9181 if (nla_put_u32(msg, NL80211_ATTR_GENERATION, rdev->bss_generation)) in nl80211_send_bss()
9183 if (wdev->netdev && in nl80211_send_bss()
9184 nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex)) in nl80211_send_bss()
9193 if ((!is_zero_ether_addr(res->bssid) && in nl80211_send_bss()
9194 nla_put(msg, NL80211_BSS_BSSID, ETH_ALEN, res->bssid))) in nl80211_send_bss()
9199 if (rcu_access_pointer(res->proberesp_ies) && in nl80211_send_bss()
9206 ies = rcu_dereference(res->ies); in nl80211_send_bss()
9208 if (nla_put_u64_64bit(msg, NL80211_BSS_TSF, ies->tsf, in nl80211_send_bss()
9211 if (ies->len && nla_put(msg, NL80211_BSS_INFORMATION_ELEMENTS, in nl80211_send_bss()
9212 ies->len, ies->data)) in nl80211_send_bss()
9217 ies = rcu_dereference(res->beacon_ies); in nl80211_send_bss()
9218 if (ies && ies->from_beacon) { in nl80211_send_bss()
9219 if (nla_put_u64_64bit(msg, NL80211_BSS_BEACON_TSF, ies->tsf, in nl80211_send_bss()
9222 if (ies->len && nla_put(msg, NL80211_BSS_BEACON_IES, in nl80211_send_bss()
9223 ies->len, ies->data)) in nl80211_send_bss()
9228 if (res->beacon_interval && in nl80211_send_bss()
9229 nla_put_u16(msg, NL80211_BSS_BEACON_INTERVAL, res->beacon_interval)) in nl80211_send_bss()
9231 if (nla_put_u16(msg, NL80211_BSS_CAPABILITY, res->capability) || in nl80211_send_bss()
9232 nla_put_u32(msg, NL80211_BSS_FREQUENCY, res->channel->center_freq) || in nl80211_send_bss()
9234 res->channel->freq_offset) || in nl80211_send_bss()
9235 nla_put_u32(msg, NL80211_BSS_CHAN_WIDTH, res->scan_width) || in nl80211_send_bss()
9237 jiffies_to_msecs(jiffies - intbss->ts))) in nl80211_send_bss()
9240 if (intbss->parent_tsf && in nl80211_send_bss()
9242 intbss->parent_tsf, NL80211_BSS_PAD) || in nl80211_send_bss()
9244 intbss->parent_bssid))) in nl80211_send_bss()
9247 if (intbss->ts_boottime && in nl80211_send_bss()
9249 intbss->ts_boottime, NL80211_BSS_PAD)) in nl80211_send_bss()
9252 if (!nl80211_put_signal(msg, intbss->pub.chains, in nl80211_send_bss()
9253 intbss->pub.chain_signal, in nl80211_send_bss()
9257 switch (rdev->wiphy.signal_type) { in nl80211_send_bss()
9259 if (nla_put_u32(msg, NL80211_BSS_SIGNAL_MBM, res->signal)) in nl80211_send_bss()
9263 if (nla_put_u8(msg, NL80211_BSS_SIGNAL_UNSPEC, res->signal)) in nl80211_send_bss()
9270 switch (wdev->iftype) { in nl80211_send_bss()
9273 if (intbss == wdev->current_bss && in nl80211_send_bss()
9279 if (intbss == wdev->current_bss && in nl80211_send_bss()
9297 return -EMSGSIZE; in nl80211_send_bss()
9305 int start = cb->args[2], idx = 0; in nl80211_dump_scan()
9316 spin_lock_bh(&rdev->bss_lock); in nl80211_dump_scan()
9320 * into multiple messages. It is unlikely that any more bss-es will be in nl80211_dump_scan()
9327 cb->seq = rdev->bss_generation; in nl80211_dump_scan()
9329 list_for_each_entry(scan, &rdev->bss_list, list) { in nl80211_dump_scan()
9333 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_dump_scan()
9335 idx--; in nl80211_dump_scan()
9340 spin_unlock_bh(&rdev->bss_lock); in nl80211_dump_scan()
9343 cb->args[2] = idx; in nl80211_dump_scan()
9346 return skb->len; in nl80211_dump_scan()
9358 if (!survey->channel && !allow_radio_stats) in nl80211_send_survey()
9364 return -ENOMEM; in nl80211_send_survey()
9366 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) in nl80211_send_survey()
9373 if (survey->channel && in nl80211_send_survey()
9375 survey->channel->center_freq)) in nl80211_send_survey()
9378 if (survey->channel && survey->channel->freq_offset && in nl80211_send_survey()
9380 survey->channel->freq_offset)) in nl80211_send_survey()
9383 if ((survey->filled & SURVEY_INFO_NOISE_DBM) && in nl80211_send_survey()
9384 nla_put_u8(msg, NL80211_SURVEY_INFO_NOISE, survey->noise)) in nl80211_send_survey()
9386 if ((survey->filled & SURVEY_INFO_IN_USE) && in nl80211_send_survey()
9389 if ((survey->filled & SURVEY_INFO_TIME) && in nl80211_send_survey()
9391 survey->time, NL80211_SURVEY_INFO_PAD)) in nl80211_send_survey()
9393 if ((survey->filled & SURVEY_INFO_TIME_BUSY) && in nl80211_send_survey()
9395 survey->time_busy, NL80211_SURVEY_INFO_PAD)) in nl80211_send_survey()
9397 if ((survey->filled & SURVEY_INFO_TIME_EXT_BUSY) && in nl80211_send_survey()
9399 survey->time_ext_busy, NL80211_SURVEY_INFO_PAD)) in nl80211_send_survey()
9401 if ((survey->filled & SURVEY_INFO_TIME_RX) && in nl80211_send_survey()
9403 survey->time_rx, NL80211_SURVEY_INFO_PAD)) in nl80211_send_survey()
9405 if ((survey->filled & SURVEY_INFO_TIME_TX) && in nl80211_send_survey()
9407 survey->time_tx, NL80211_SURVEY_INFO_PAD)) in nl80211_send_survey()
9409 if ((survey->filled & SURVEY_INFO_TIME_SCAN) && in nl80211_send_survey()
9411 survey->time_scan, NL80211_SURVEY_INFO_PAD)) in nl80211_send_survey()
9413 if ((survey->filled & SURVEY_INFO_TIME_BSS_RX) && in nl80211_send_survey()
9415 survey->time_bss_rx, NL80211_SURVEY_INFO_PAD)) in nl80211_send_survey()
9425 return -EMSGSIZE; in nl80211_send_survey()
9434 int survey_idx = cb->args[2]; in nl80211_dump_survey()
9440 return -ENOMEM; in nl80211_dump_survey()
9450 if (!wdev->netdev) { in nl80211_dump_survey()
9451 res = -EINVAL; in nl80211_dump_survey()
9455 if (!rdev->ops->dump_survey) { in nl80211_dump_survey()
9456 res = -EOPNOTSUPP; in nl80211_dump_survey()
9461 res = rdev_dump_survey(rdev, wdev->netdev, survey_idx, &survey); in nl80211_dump_survey()
9462 if (res == -ENOENT) in nl80211_dump_survey()
9467 /* don't send disabled channels, but do send non-channel data */ in nl80211_dump_survey()
9469 survey.channel->flags & IEEE80211_CHAN_DISABLED) { in nl80211_dump_survey()
9475 NETLINK_CB(cb->skb).portid, in nl80211_dump_survey()
9476 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_dump_survey()
9477 wdev->netdev, radio_stats, &survey) < 0) in nl80211_dump_survey()
9483 cb->args[2] = survey_idx; in nl80211_dump_survey()
9484 res = skb->len; in nl80211_dump_survey()
9500 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_authenticate()
9501 struct net_device *dev = info->user_ptr[1]; in nl80211_authenticate()
9510 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_authenticate()
9511 return -EINVAL; in nl80211_authenticate()
9513 if (!info->attrs[NL80211_ATTR_AUTH_TYPE]) in nl80211_authenticate()
9514 return -EINVAL; in nl80211_authenticate()
9516 if (!info->attrs[NL80211_ATTR_SSID]) in nl80211_authenticate()
9517 return -EINVAL; in nl80211_authenticate()
9519 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ]) in nl80211_authenticate()
9520 return -EINVAL; in nl80211_authenticate()
9527 if (key.type != -1 && key.type != NL80211_KEYTYPE_GROUP) in nl80211_authenticate()
9528 return -EINVAL; in nl80211_authenticate()
9530 return -EINVAL; in nl80211_authenticate()
9535 return -EINVAL; in nl80211_authenticate()
9537 return -EINVAL; in nl80211_authenticate()
9547 for (i = 0; i < rdev->wiphy.n_cipher_suites; i++) { in nl80211_authenticate()
9548 if (key.p.cipher == rdev->wiphy.cipher_suites[i]) { in nl80211_authenticate()
9554 return -EINVAL; in nl80211_authenticate()
9557 if (!rdev->ops->auth) in nl80211_authenticate()
9558 return -EOPNOTSUPP; in nl80211_authenticate()
9560 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_authenticate()
9561 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_authenticate()
9562 return -EOPNOTSUPP; in nl80211_authenticate()
9564 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_authenticate()
9565 freq = MHZ_TO_KHZ(nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ])); in nl80211_authenticate()
9566 if (info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]) in nl80211_authenticate()
9568 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]); in nl80211_authenticate()
9570 chan = nl80211_get_valid_chan(&rdev->wiphy, freq); in nl80211_authenticate()
9572 return -EINVAL; in nl80211_authenticate()
9574 ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); in nl80211_authenticate()
9575 ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); in nl80211_authenticate()
9577 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_authenticate()
9578 ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_authenticate()
9579 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_authenticate()
9582 auth_type = nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]); in nl80211_authenticate()
9584 return -EINVAL; in nl80211_authenticate()
9590 !info->attrs[NL80211_ATTR_AUTH_DATA]) in nl80211_authenticate()
9591 return -EINVAL; in nl80211_authenticate()
9593 if (info->attrs[NL80211_ATTR_AUTH_DATA]) { in nl80211_authenticate()
9598 return -EINVAL; in nl80211_authenticate()
9599 auth_data = nla_data(info->attrs[NL80211_ATTR_AUTH_DATA]); in nl80211_authenticate()
9600 auth_data_len = nla_len(info->attrs[NL80211_ATTR_AUTH_DATA]); in nl80211_authenticate()
9603 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; in nl80211_authenticate()
9612 wdev_lock(dev->ieee80211_ptr); in nl80211_authenticate()
9617 wdev_unlock(dev->ieee80211_ptr); in nl80211_authenticate()
9624 if (!info->attrs[NL80211_ATTR_SOCKET_OWNER]) { in validate_pae_over_nl80211()
9626 return -EINVAL; in validate_pae_over_nl80211()
9629 if (!rdev->ops->tx_control_port || in validate_pae_over_nl80211()
9630 !wiphy_ext_feature_isset(&rdev->wiphy, in validate_pae_over_nl80211()
9632 return -EOPNOTSUPP; in validate_pae_over_nl80211()
9644 settings->control_port = info->attrs[NL80211_ATTR_CONTROL_PORT]; in nl80211_crypto_settings()
9646 if (info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]) { in nl80211_crypto_settings()
9650 info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]); in nl80211_crypto_settings()
9651 settings->control_port_ethertype = cpu_to_be16(proto); in nl80211_crypto_settings()
9652 if (!(rdev->wiphy.flags & WIPHY_FLAG_CONTROL_PORT_PROTOCOL) && in nl80211_crypto_settings()
9654 return -EINVAL; in nl80211_crypto_settings()
9655 if (info->attrs[NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT]) in nl80211_crypto_settings()
9656 settings->control_port_no_encrypt = true; in nl80211_crypto_settings()
9658 settings->control_port_ethertype = cpu_to_be16(ETH_P_PAE); in nl80211_crypto_settings()
9660 if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) { in nl80211_crypto_settings()
9666 settings->control_port_over_nl80211 = true; in nl80211_crypto_settings()
9668 if (info->attrs[NL80211_ATTR_CONTROL_PORT_NO_PREAUTH]) in nl80211_crypto_settings()
9669 settings->control_port_no_preauth = true; in nl80211_crypto_settings()
9672 if (info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]) { in nl80211_crypto_settings()
9676 data = nla_data(info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]); in nl80211_crypto_settings()
9677 len = nla_len(info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]); in nl80211_crypto_settings()
9678 settings->n_ciphers_pairwise = len / sizeof(u32); in nl80211_crypto_settings()
9681 return -EINVAL; in nl80211_crypto_settings()
9683 if (settings->n_ciphers_pairwise > cipher_limit) in nl80211_crypto_settings()
9684 return -EINVAL; in nl80211_crypto_settings()
9686 memcpy(settings->ciphers_pairwise, data, len); in nl80211_crypto_settings()
9688 for (i = 0; i < settings->n_ciphers_pairwise; i++) in nl80211_crypto_settings()
9690 &rdev->wiphy, in nl80211_crypto_settings()
9691 settings->ciphers_pairwise[i])) in nl80211_crypto_settings()
9692 return -EINVAL; in nl80211_crypto_settings()
9695 if (info->attrs[NL80211_ATTR_CIPHER_SUITE_GROUP]) { in nl80211_crypto_settings()
9696 settings->cipher_group = in nl80211_crypto_settings()
9697 nla_get_u32(info->attrs[NL80211_ATTR_CIPHER_SUITE_GROUP]); in nl80211_crypto_settings()
9698 if (!cfg80211_supported_cipher_suite(&rdev->wiphy, in nl80211_crypto_settings()
9699 settings->cipher_group)) in nl80211_crypto_settings()
9700 return -EINVAL; in nl80211_crypto_settings()
9703 if (info->attrs[NL80211_ATTR_WPA_VERSIONS]) { in nl80211_crypto_settings()
9704 settings->wpa_versions = in nl80211_crypto_settings()
9705 nla_get_u32(info->attrs[NL80211_ATTR_WPA_VERSIONS]); in nl80211_crypto_settings()
9706 if (!nl80211_valid_wpa_versions(settings->wpa_versions)) in nl80211_crypto_settings()
9707 return -EINVAL; in nl80211_crypto_settings()
9710 if (info->attrs[NL80211_ATTR_AKM_SUITES]) { in nl80211_crypto_settings()
9714 data = nla_data(info->attrs[NL80211_ATTR_AKM_SUITES]); in nl80211_crypto_settings()
9715 len = nla_len(info->attrs[NL80211_ATTR_AKM_SUITES]); in nl80211_crypto_settings()
9716 settings->n_akm_suites = len / sizeof(u32); in nl80211_crypto_settings()
9719 return -EINVAL; in nl80211_crypto_settings()
9721 if (settings->n_akm_suites > NL80211_MAX_NR_AKM_SUITES) in nl80211_crypto_settings()
9722 return -EINVAL; in nl80211_crypto_settings()
9724 memcpy(settings->akm_suites, data, len); in nl80211_crypto_settings()
9727 if (info->attrs[NL80211_ATTR_PMK]) { in nl80211_crypto_settings()
9728 if (nla_len(info->attrs[NL80211_ATTR_PMK]) != WLAN_PMK_LEN) in nl80211_crypto_settings()
9729 return -EINVAL; in nl80211_crypto_settings()
9730 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_crypto_settings()
9732 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_crypto_settings()
9734 return -EINVAL; in nl80211_crypto_settings()
9735 settings->psk = nla_data(info->attrs[NL80211_ATTR_PMK]); in nl80211_crypto_settings()
9738 if (info->attrs[NL80211_ATTR_SAE_PASSWORD]) { in nl80211_crypto_settings()
9739 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_crypto_settings()
9741 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_crypto_settings()
9743 return -EINVAL; in nl80211_crypto_settings()
9744 settings->sae_pwd = in nl80211_crypto_settings()
9745 nla_data(info->attrs[NL80211_ATTR_SAE_PASSWORD]); in nl80211_crypto_settings()
9746 settings->sae_pwd_len = in nl80211_crypto_settings()
9747 nla_len(info->attrs[NL80211_ATTR_SAE_PASSWORD]); in nl80211_crypto_settings()
9755 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_associate()
9756 struct net_device *dev = info->user_ptr[1]; in nl80211_associate()
9763 if (dev->ieee80211_ptr->conn_owner_nlportid && in nl80211_associate()
9764 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) in nl80211_associate()
9765 return -EPERM; in nl80211_associate()
9767 if (!info->attrs[NL80211_ATTR_MAC] || in nl80211_associate()
9768 !info->attrs[NL80211_ATTR_SSID] || in nl80211_associate()
9769 !info->attrs[NL80211_ATTR_WIPHY_FREQ]) in nl80211_associate()
9770 return -EINVAL; in nl80211_associate()
9772 if (!rdev->ops->assoc) in nl80211_associate()
9773 return -EOPNOTSUPP; in nl80211_associate()
9775 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_associate()
9776 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_associate()
9777 return -EOPNOTSUPP; in nl80211_associate()
9779 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_associate()
9781 freq = MHZ_TO_KHZ(nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ])); in nl80211_associate()
9782 if (info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]) in nl80211_associate()
9784 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]); in nl80211_associate()
9785 chan = nl80211_get_valid_chan(&rdev->wiphy, freq); in nl80211_associate()
9787 return -EINVAL; in nl80211_associate()
9789 ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); in nl80211_associate()
9790 ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); in nl80211_associate()
9792 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_associate()
9793 req.ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_associate()
9794 req.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_associate()
9797 if (info->attrs[NL80211_ATTR_USE_MFP]) { in nl80211_associate()
9799 nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]); in nl80211_associate()
9803 return -EINVAL; in nl80211_associate()
9806 if (info->attrs[NL80211_ATTR_PREV_BSSID]) in nl80211_associate()
9807 req.prev_bssid = nla_data(info->attrs[NL80211_ATTR_PREV_BSSID]); in nl80211_associate()
9809 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HT])) in nl80211_associate()
9812 if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) in nl80211_associate()
9814 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]), in nl80211_associate()
9817 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) { in nl80211_associate()
9818 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) in nl80211_associate()
9819 return -EINVAL; in nl80211_associate()
9821 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]), in nl80211_associate()
9825 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_VHT])) in nl80211_associate()
9828 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) in nl80211_associate()
9830 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]), in nl80211_associate()
9833 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) { in nl80211_associate()
9834 if (!info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) in nl80211_associate()
9835 return -EINVAL; in nl80211_associate()
9837 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]), in nl80211_associate()
9841 if (nla_get_flag(info->attrs[NL80211_ATTR_USE_RRM])) { in nl80211_associate()
9842 if (!((rdev->wiphy.features & in nl80211_associate()
9844 (rdev->wiphy.features & NL80211_FEATURE_QUIET)) && in nl80211_associate()
9845 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_associate()
9847 return -EINVAL; in nl80211_associate()
9851 if (info->attrs[NL80211_ATTR_FILS_KEK]) { in nl80211_associate()
9852 req.fils_kek = nla_data(info->attrs[NL80211_ATTR_FILS_KEK]); in nl80211_associate()
9853 req.fils_kek_len = nla_len(info->attrs[NL80211_ATTR_FILS_KEK]); in nl80211_associate()
9854 if (!info->attrs[NL80211_ATTR_FILS_NONCES]) in nl80211_associate()
9855 return -EINVAL; in nl80211_associate()
9857 nla_data(info->attrs[NL80211_ATTR_FILS_NONCES]); in nl80211_associate()
9860 if (info->attrs[NL80211_ATTR_S1G_CAPABILITY_MASK]) { in nl80211_associate()
9861 if (!info->attrs[NL80211_ATTR_S1G_CAPABILITY]) in nl80211_associate()
9862 return -EINVAL; in nl80211_associate()
9864 nla_data(info->attrs[NL80211_ATTR_S1G_CAPABILITY_MASK]), in nl80211_associate()
9868 if (info->attrs[NL80211_ATTR_S1G_CAPABILITY]) { in nl80211_associate()
9869 if (!info->attrs[NL80211_ATTR_S1G_CAPABILITY_MASK]) in nl80211_associate()
9870 return -EINVAL; in nl80211_associate()
9872 nla_data(info->attrs[NL80211_ATTR_S1G_CAPABILITY]), in nl80211_associate()
9878 wdev_lock(dev->ieee80211_ptr); in nl80211_associate()
9883 if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) { in nl80211_associate()
9884 dev->ieee80211_ptr->conn_owner_nlportid = in nl80211_associate()
9885 info->snd_portid; in nl80211_associate()
9886 memcpy(dev->ieee80211_ptr->disconnect_bssid, in nl80211_associate()
9890 wdev_unlock(dev->ieee80211_ptr); in nl80211_associate()
9898 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_deauthenticate()
9899 struct net_device *dev = info->user_ptr[1]; in nl80211_deauthenticate()
9905 if (dev->ieee80211_ptr->conn_owner_nlportid && in nl80211_deauthenticate()
9906 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) in nl80211_deauthenticate()
9907 return -EPERM; in nl80211_deauthenticate()
9909 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_deauthenticate()
9910 return -EINVAL; in nl80211_deauthenticate()
9912 if (!info->attrs[NL80211_ATTR_REASON_CODE]) in nl80211_deauthenticate()
9913 return -EINVAL; in nl80211_deauthenticate()
9915 if (!rdev->ops->deauth) in nl80211_deauthenticate()
9916 return -EOPNOTSUPP; in nl80211_deauthenticate()
9918 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_deauthenticate()
9919 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_deauthenticate()
9920 return -EOPNOTSUPP; in nl80211_deauthenticate()
9922 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_deauthenticate()
9924 reason_code = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); in nl80211_deauthenticate()
9927 return -EINVAL; in nl80211_deauthenticate()
9930 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_deauthenticate()
9931 ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_deauthenticate()
9932 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_deauthenticate()
9935 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; in nl80211_deauthenticate()
9937 wdev_lock(dev->ieee80211_ptr); in nl80211_deauthenticate()
9940 wdev_unlock(dev->ieee80211_ptr); in nl80211_deauthenticate()
9946 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_disassociate()
9947 struct net_device *dev = info->user_ptr[1]; in nl80211_disassociate()
9953 if (dev->ieee80211_ptr->conn_owner_nlportid && in nl80211_disassociate()
9954 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) in nl80211_disassociate()
9955 return -EPERM; in nl80211_disassociate()
9957 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_disassociate()
9958 return -EINVAL; in nl80211_disassociate()
9960 if (!info->attrs[NL80211_ATTR_REASON_CODE]) in nl80211_disassociate()
9961 return -EINVAL; in nl80211_disassociate()
9963 if (!rdev->ops->disassoc) in nl80211_disassociate()
9964 return -EOPNOTSUPP; in nl80211_disassociate()
9966 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_disassociate()
9967 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_disassociate()
9968 return -EOPNOTSUPP; in nl80211_disassociate()
9970 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_disassociate()
9972 reason_code = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); in nl80211_disassociate()
9975 return -EINVAL; in nl80211_disassociate()
9978 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_disassociate()
9979 ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_disassociate()
9980 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_disassociate()
9983 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; in nl80211_disassociate()
9985 wdev_lock(dev->ieee80211_ptr); in nl80211_disassociate()
9988 wdev_unlock(dev->ieee80211_ptr); in nl80211_disassociate()
9997 struct wiphy *wiphy = &rdev->wiphy; in nl80211_parse_mcast_rate()
10004 sband = wiphy->bands[band]; in nl80211_parse_mcast_rate()
10008 for (i = 0; i < sband->n_bitrates; i++) { in nl80211_parse_mcast_rate()
10009 if (sband->bitrates[i].bitrate == rateval) { in nl80211_parse_mcast_rate()
10022 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_join_ibss()
10023 struct net_device *dev = info->user_ptr[1]; in nl80211_join_ibss()
10031 if (!info->attrs[NL80211_ATTR_SSID] || in nl80211_join_ibss()
10032 !nla_len(info->attrs[NL80211_ATTR_SSID])) in nl80211_join_ibss()
10033 return -EINVAL; in nl80211_join_ibss()
10037 if (info->attrs[NL80211_ATTR_BEACON_INTERVAL]) in nl80211_join_ibss()
10039 nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]); in nl80211_join_ibss()
10046 if (!rdev->ops->join_ibss) in nl80211_join_ibss()
10047 return -EOPNOTSUPP; in nl80211_join_ibss()
10049 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC) in nl80211_join_ibss()
10050 return -EOPNOTSUPP; in nl80211_join_ibss()
10052 wiphy = &rdev->wiphy; in nl80211_join_ibss()
10054 if (info->attrs[NL80211_ATTR_MAC]) { in nl80211_join_ibss()
10055 ibss.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_join_ibss()
10058 return -EINVAL; in nl80211_join_ibss()
10060 ibss.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); in nl80211_join_ibss()
10061 ibss.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); in nl80211_join_ibss()
10063 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_join_ibss()
10064 ibss.ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_join_ibss()
10065 ibss.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_join_ibss()
10072 if (!cfg80211_reg_can_beacon(&rdev->wiphy, &ibss.chandef, in nl80211_join_ibss()
10074 return -EINVAL; in nl80211_join_ibss()
10076 switch (ibss.chandef.width) { in nl80211_join_ibss()
10083 if (!(rdev->wiphy.features & NL80211_FEATURE_HT_IBSS)) in nl80211_join_ibss()
10084 return -EINVAL; in nl80211_join_ibss()
10089 if (!(rdev->wiphy.features & NL80211_FEATURE_HT_IBSS)) in nl80211_join_ibss()
10090 return -EINVAL; in nl80211_join_ibss()
10091 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_join_ibss()
10093 return -EINVAL; in nl80211_join_ibss()
10096 return -EINVAL; in nl80211_join_ibss()
10099 ibss.channel_fixed = !!info->attrs[NL80211_ATTR_FREQ_FIXED]; in nl80211_join_ibss()
10100 ibss.privacy = !!info->attrs[NL80211_ATTR_PRIVACY]; in nl80211_join_ibss()
10102 if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) { in nl80211_join_ibss()
10104 nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); in nl80211_join_ibss()
10106 nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); in nl80211_join_ibss()
10108 wiphy->bands[ibss.chandef.chan->band]; in nl80211_join_ibss()
10116 if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) in nl80211_join_ibss()
10118 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]), in nl80211_join_ibss()
10121 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) { in nl80211_join_ibss()
10122 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) in nl80211_join_ibss()
10123 return -EINVAL; in nl80211_join_ibss()
10125 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]), in nl80211_join_ibss()
10129 if (info->attrs[NL80211_ATTR_MCAST_RATE] && in nl80211_join_ibss()
10131 nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]))) in nl80211_join_ibss()
10132 return -EINVAL; in nl80211_join_ibss()
10134 if (ibss.privacy && info->attrs[NL80211_ATTR_KEYS]) { in nl80211_join_ibss()
10141 if ((ibss.chandef.width != NL80211_CHAN_WIDTH_20_NOHT) && in nl80211_join_ibss()
10144 return -EINVAL; in nl80211_join_ibss()
10149 nla_get_flag(info->attrs[NL80211_ATTR_CONTROL_PORT]); in nl80211_join_ibss()
10151 if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) { in nl80211_join_ibss()
10163 nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS]); in nl80211_join_ibss()
10165 wdev_lock(dev->ieee80211_ptr); in nl80211_join_ibss()
10169 else if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) in nl80211_join_ibss()
10170 dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid; in nl80211_join_ibss()
10171 wdev_unlock(dev->ieee80211_ptr); in nl80211_join_ibss()
10178 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_leave_ibss()
10179 struct net_device *dev = info->user_ptr[1]; in nl80211_leave_ibss()
10181 if (!rdev->ops->leave_ibss) in nl80211_leave_ibss()
10182 return -EOPNOTSUPP; in nl80211_leave_ibss()
10184 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC) in nl80211_leave_ibss()
10185 return -EOPNOTSUPP; in nl80211_leave_ibss()
10192 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_mcast_rate()
10193 struct net_device *dev = info->user_ptr[1]; in nl80211_set_mcast_rate()
10198 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC && in nl80211_set_mcast_rate()
10199 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT && in nl80211_set_mcast_rate()
10200 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_OCB) in nl80211_set_mcast_rate()
10201 return -EOPNOTSUPP; in nl80211_set_mcast_rate()
10203 if (!rdev->ops->set_mcast_rate) in nl80211_set_mcast_rate()
10204 return -EOPNOTSUPP; in nl80211_set_mcast_rate()
10208 if (!info->attrs[NL80211_ATTR_MCAST_RATE]) in nl80211_set_mcast_rate()
10209 return -EINVAL; in nl80211_set_mcast_rate()
10211 nla_rate = nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]); in nl80211_set_mcast_rate()
10213 return -EINVAL; in nl80211_set_mcast_rate()
10242 if (nla_put_u32(skb, NL80211_ATTR_WIPHY, rdev->wiphy_idx)) in __cfg80211_alloc_vendor_skb()
10247 info->vendor_id)) in __cfg80211_alloc_vendor_skb()
10250 info->subcmd)) in __cfg80211_alloc_vendor_skb()
10258 if (wdev->netdev && in __cfg80211_alloc_vendor_skb()
10260 wdev->netdev->ifindex)) in __cfg80211_alloc_vendor_skb()
10268 ((void **)skb->cb)[0] = rdev; in __cfg80211_alloc_vendor_skb()
10269 ((void **)skb->cb)[1] = hdr; in __cfg80211_alloc_vendor_skb()
10270 ((void **)skb->cb)[2] = data; in __cfg80211_alloc_vendor_skb()
10292 if (WARN_ON(vendor_event_idx != -1)) in __cfg80211_alloc_event_skb()
10298 vendor_event_idx >= wiphy->n_vendor_events)) in __cfg80211_alloc_event_skb()
10300 info = &wiphy->vendor_events[vendor_event_idx]; in __cfg80211_alloc_event_skb()
10314 struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0]; in __cfg80211_send_event_skb()
10315 void *hdr = ((void **)skb->cb)[1]; in __cfg80211_send_event_skb()
10317 struct nlattr *data = ((void **)skb->cb)[2]; in __cfg80211_send_event_skb()
10321 memset(skb->cb, 0, sizeof(skb->cb)); in __cfg80211_send_event_skb()
10326 if (nlhdr->nlmsg_pid) { in __cfg80211_send_event_skb()
10327 genlmsg_unicast(wiphy_net(&rdev->wiphy), skb, in __cfg80211_send_event_skb()
10328 nlhdr->nlmsg_pid); in __cfg80211_send_event_skb()
10330 if (data->nla_type == NL80211_ATTR_VENDOR_DATA) in __cfg80211_send_event_skb()
10333 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), in __cfg80211_send_event_skb()
10342 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_testmode_do()
10344 __cfg80211_wdev_from_attrs(genl_info_net(info), info->attrs); in nl80211_testmode_do()
10347 if (!rdev->ops->testmode_cmd) in nl80211_testmode_do()
10348 return -EOPNOTSUPP; in nl80211_testmode_do()
10352 if (err != -EINVAL) in nl80211_testmode_do()
10355 } else if (wdev->wiphy != &rdev->wiphy) { in nl80211_testmode_do()
10356 return -EINVAL; in nl80211_testmode_do()
10359 if (!info->attrs[NL80211_ATTR_TESTDATA]) in nl80211_testmode_do()
10360 return -EINVAL; in nl80211_testmode_do()
10362 rdev->cur_cmd_info = info; in nl80211_testmode_do()
10364 nla_data(info->attrs[NL80211_ATTR_TESTDATA]), in nl80211_testmode_do()
10365 nla_len(info->attrs[NL80211_ATTR_TESTDATA])); in nl80211_testmode_do()
10366 rdev->cur_cmd_info = NULL; in nl80211_testmode_do()
10383 if (cb->args[0]) { in nl80211_testmode_dump()
10388 phy_idx = cb->args[0] - 1; in nl80211_testmode_dump()
10392 err = -ENOENT; in nl80211_testmode_dump()
10399 err = -ENOMEM; in nl80211_testmode_dump()
10403 err = nlmsg_parse_deprecated(cb->nlh, in nl80211_testmode_dump()
10410 rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk), attrbuf); in nl80211_testmode_dump()
10415 phy_idx = rdev->wiphy_idx; in nl80211_testmode_dump()
10418 cb->args[1] = (long)attrbuf[NL80211_ATTR_TESTDATA]; in nl80211_testmode_dump()
10421 if (cb->args[1]) { in nl80211_testmode_dump()
10422 data = nla_data((void *)cb->args[1]); in nl80211_testmode_dump()
10423 data_len = nla_len((void *)cb->args[1]); in nl80211_testmode_dump()
10426 if (!rdev->ops->testmode_dump) { in nl80211_testmode_dump()
10427 err = -EOPNOTSUPP; in nl80211_testmode_dump()
10432 void *hdr = nl80211hdr_put(skb, NETLINK_CB(cb->skb).portid, in nl80211_testmode_dump()
10433 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_testmode_dump()
10453 if (err == -ENOBUFS || err == -ENOENT) { in nl80211_testmode_dump()
10464 err = skb->len; in nl80211_testmode_dump()
10466 cb->args[0] = phy_idx + 1; in nl80211_testmode_dump()
10476 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_connect()
10477 struct net_device *dev = info->user_ptr[1]; in nl80211_connect()
10486 if (!info->attrs[NL80211_ATTR_SSID] || in nl80211_connect()
10487 !nla_len(info->attrs[NL80211_ATTR_SSID])) in nl80211_connect()
10488 return -EINVAL; in nl80211_connect()
10490 if (info->attrs[NL80211_ATTR_AUTH_TYPE]) { in nl80211_connect()
10492 nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]); in nl80211_connect()
10495 return -EINVAL; in nl80211_connect()
10499 connect.privacy = info->attrs[NL80211_ATTR_PRIVACY]; in nl80211_connect()
10501 if (info->attrs[NL80211_ATTR_WANT_1X_4WAY_HS] && in nl80211_connect()
10502 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_connect()
10504 return -EINVAL; in nl80211_connect()
10505 connect.want_1x = info->attrs[NL80211_ATTR_WANT_1X_4WAY_HS]; in nl80211_connect()
10512 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_connect()
10513 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_connect()
10514 return -EOPNOTSUPP; in nl80211_connect()
10516 wiphy = &rdev->wiphy; in nl80211_connect()
10518 connect.bg_scan_period = -1; in nl80211_connect()
10519 if (info->attrs[NL80211_ATTR_BG_SCAN_PERIOD] && in nl80211_connect()
10520 (wiphy->flags & WIPHY_FLAG_SUPPORTS_FW_ROAM)) { in nl80211_connect()
10522 nla_get_u16(info->attrs[NL80211_ATTR_BG_SCAN_PERIOD]); in nl80211_connect()
10525 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_connect()
10526 connect.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_connect()
10527 else if (info->attrs[NL80211_ATTR_MAC_HINT]) in nl80211_connect()
10529 nla_data(info->attrs[NL80211_ATTR_MAC_HINT]); in nl80211_connect()
10530 connect.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); in nl80211_connect()
10531 connect.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); in nl80211_connect()
10533 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_connect()
10534 connect.ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_connect()
10535 connect.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_connect()
10538 if (info->attrs[NL80211_ATTR_USE_MFP]) { in nl80211_connect()
10539 connect.mfp = nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]); in nl80211_connect()
10541 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_connect()
10543 return -EOPNOTSUPP; in nl80211_connect()
10548 if (info->attrs[NL80211_ATTR_PREV_BSSID]) in nl80211_connect()
10550 nla_data(info->attrs[NL80211_ATTR_PREV_BSSID]); in nl80211_connect()
10552 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) in nl80211_connect()
10554 info->attrs[NL80211_ATTR_WIPHY_FREQ])); in nl80211_connect()
10555 if (info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]) in nl80211_connect()
10557 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]); in nl80211_connect()
10562 return -EINVAL; in nl80211_connect()
10563 } else if (info->attrs[NL80211_ATTR_WIPHY_FREQ_HINT]) { in nl80211_connect()
10564 freq = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_HINT]); in nl80211_connect()
10568 return -EINVAL; in nl80211_connect()
10571 if (info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]) { in nl80211_connect()
10573 nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]); in nl80211_connect()
10575 if (info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]) in nl80211_connect()
10577 nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]); in nl80211_connect()
10580 if (connect.privacy && info->attrs[NL80211_ATTR_KEYS]) { in nl80211_connect()
10586 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HT])) in nl80211_connect()
10589 if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) in nl80211_connect()
10591 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]), in nl80211_connect()
10594 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) { in nl80211_connect()
10595 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) { in nl80211_connect()
10597 return -EINVAL; in nl80211_connect()
10600 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]), in nl80211_connect()
10604 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_VHT])) in nl80211_connect()
10607 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) in nl80211_connect()
10609 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]), in nl80211_connect()
10612 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) { in nl80211_connect()
10613 if (!info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) { in nl80211_connect()
10615 return -EINVAL; in nl80211_connect()
10618 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]), in nl80211_connect()
10622 if (nla_get_flag(info->attrs[NL80211_ATTR_USE_RRM])) { in nl80211_connect()
10623 if (!((rdev->wiphy.features & in nl80211_connect()
10625 (rdev->wiphy.features & NL80211_FEATURE_QUIET)) && in nl80211_connect()
10626 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_connect()
10629 return -EINVAL; in nl80211_connect()
10634 connect.pbss = nla_get_flag(info->attrs[NL80211_ATTR_PBSS]); in nl80211_connect()
10635 if (connect.pbss && !rdev->wiphy.bands[NL80211_BAND_60GHZ]) { in nl80211_connect()
10637 return -EOPNOTSUPP; in nl80211_connect()
10640 if (info->attrs[NL80211_ATTR_BSS_SELECT]) { in nl80211_connect()
10641 /* bss selection makes no sense if bssid is set */ in nl80211_connect()
10644 return -EINVAL; in nl80211_connect()
10647 err = parse_bss_select(info->attrs[NL80211_ATTR_BSS_SELECT], in nl80211_connect()
10655 if (wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_connect()
10657 info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] && in nl80211_connect()
10658 info->attrs[NL80211_ATTR_FILS_ERP_REALM] && in nl80211_connect()
10659 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] && in nl80211_connect()
10660 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { in nl80211_connect()
10662 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); in nl80211_connect()
10664 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); in nl80211_connect()
10666 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); in nl80211_connect()
10668 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); in nl80211_connect()
10671 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM]); in nl80211_connect()
10673 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); in nl80211_connect()
10675 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); in nl80211_connect()
10676 } else if (info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] || in nl80211_connect()
10677 info->attrs[NL80211_ATTR_FILS_ERP_REALM] || in nl80211_connect()
10678 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] || in nl80211_connect()
10679 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { in nl80211_connect()
10681 return -EINVAL; in nl80211_connect()
10684 if (nla_get_flag(info->attrs[NL80211_ATTR_EXTERNAL_AUTH_SUPPORT])) { in nl80211_connect()
10685 if (!info->attrs[NL80211_ATTR_SOCKET_OWNER]) { in nl80211_connect()
10689 return -EINVAL; in nl80211_connect()
10694 wdev_lock(dev->ieee80211_ptr); in nl80211_connect()
10701 if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) { in nl80211_connect()
10702 dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid; in nl80211_connect()
10704 memcpy(dev->ieee80211_ptr->disconnect_bssid, in nl80211_connect()
10707 eth_zero_addr(dev->ieee80211_ptr->disconnect_bssid); in nl80211_connect()
10710 wdev_unlock(dev->ieee80211_ptr); in nl80211_connect()
10719 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_update_connect_params()
10720 struct net_device *dev = info->user_ptr[1]; in nl80211_update_connect_params()
10721 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_update_connect_params()
10727 if (!rdev->ops->update_connect_params) in nl80211_update_connect_params()
10728 return -EOPNOTSUPP; in nl80211_update_connect_params()
10730 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_update_connect_params()
10731 connect.ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_update_connect_params()
10732 connect.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_update_connect_params()
10736 fils_sk_offload = wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_update_connect_params()
10740 * when driver supports fils-sk offload all attributes must be in nl80211_update_connect_params()
10741 * provided. So the else covers "fils-sk-not-all" and in nl80211_update_connect_params()
10742 * "no-fils-sk-any". in nl80211_update_connect_params()
10745 info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] && in nl80211_update_connect_params()
10746 info->attrs[NL80211_ATTR_FILS_ERP_REALM] && in nl80211_update_connect_params()
10747 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] && in nl80211_update_connect_params()
10748 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { in nl80211_update_connect_params()
10750 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); in nl80211_update_connect_params()
10752 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); in nl80211_update_connect_params()
10754 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); in nl80211_update_connect_params()
10756 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); in nl80211_update_connect_params()
10759 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM]); in nl80211_update_connect_params()
10761 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); in nl80211_update_connect_params()
10763 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); in nl80211_update_connect_params()
10765 } else if (info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] || in nl80211_update_connect_params()
10766 info->attrs[NL80211_ATTR_FILS_ERP_REALM] || in nl80211_update_connect_params()
10767 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] || in nl80211_update_connect_params()
10768 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { in nl80211_update_connect_params()
10769 return -EINVAL; in nl80211_update_connect_params()
10772 if (info->attrs[NL80211_ATTR_AUTH_TYPE]) { in nl80211_update_connect_params()
10773 auth_type = nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]); in nl80211_update_connect_params()
10776 return -EINVAL; in nl80211_update_connect_params()
10780 return -EINVAL; in nl80211_update_connect_params()
10786 wdev_lock(dev->ieee80211_ptr); in nl80211_update_connect_params()
10787 if (!wdev->current_bss) in nl80211_update_connect_params()
10788 ret = -ENOLINK; in nl80211_update_connect_params()
10791 wdev_unlock(dev->ieee80211_ptr); in nl80211_update_connect_params()
10798 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_disconnect()
10799 struct net_device *dev = info->user_ptr[1]; in nl80211_disconnect()
10803 if (dev->ieee80211_ptr->conn_owner_nlportid && in nl80211_disconnect()
10804 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) in nl80211_disconnect()
10805 return -EPERM; in nl80211_disconnect()
10807 if (!info->attrs[NL80211_ATTR_REASON_CODE]) in nl80211_disconnect()
10810 reason = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); in nl80211_disconnect()
10813 return -EINVAL; in nl80211_disconnect()
10815 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_disconnect()
10816 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_disconnect()
10817 return -EOPNOTSUPP; in nl80211_disconnect()
10819 wdev_lock(dev->ieee80211_ptr); in nl80211_disconnect()
10821 wdev_unlock(dev->ieee80211_ptr); in nl80211_disconnect()
10827 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_wiphy_netns()
10831 if (info->attrs[NL80211_ATTR_PID]) { in nl80211_wiphy_netns()
10832 u32 pid = nla_get_u32(info->attrs[NL80211_ATTR_PID]); in nl80211_wiphy_netns()
10835 } else if (info->attrs[NL80211_ATTR_NETNS_FD]) { in nl80211_wiphy_netns()
10836 u32 fd = nla_get_u32(info->attrs[NL80211_ATTR_NETNS_FD]); in nl80211_wiphy_netns()
10840 return -EINVAL; in nl80211_wiphy_netns()
10849 if (!net_eq(wiphy_net(&rdev->wiphy), net)) in nl80211_wiphy_netns()
10858 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_setdel_pmksa()
10861 struct net_device *dev = info->user_ptr[1]; in nl80211_setdel_pmksa()
10866 if (!info->attrs[NL80211_ATTR_PMKID]) in nl80211_setdel_pmksa()
10867 return -EINVAL; in nl80211_setdel_pmksa()
10869 pmksa.pmkid = nla_data(info->attrs[NL80211_ATTR_PMKID]); in nl80211_setdel_pmksa()
10871 if (info->attrs[NL80211_ATTR_MAC]) { in nl80211_setdel_pmksa()
10872 pmksa.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_setdel_pmksa()
10873 } else if (info->attrs[NL80211_ATTR_SSID] && in nl80211_setdel_pmksa()
10874 info->attrs[NL80211_ATTR_FILS_CACHE_ID] && in nl80211_setdel_pmksa()
10875 (info->genlhdr->cmd == NL80211_CMD_DEL_PMKSA || in nl80211_setdel_pmksa()
10876 info->attrs[NL80211_ATTR_PMK])) { in nl80211_setdel_pmksa()
10877 pmksa.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); in nl80211_setdel_pmksa()
10878 pmksa.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); in nl80211_setdel_pmksa()
10880 nla_data(info->attrs[NL80211_ATTR_FILS_CACHE_ID]); in nl80211_setdel_pmksa()
10882 return -EINVAL; in nl80211_setdel_pmksa()
10884 if (info->attrs[NL80211_ATTR_PMK]) { in nl80211_setdel_pmksa()
10885 pmksa.pmk = nla_data(info->attrs[NL80211_ATTR_PMK]); in nl80211_setdel_pmksa()
10886 pmksa.pmk_len = nla_len(info->attrs[NL80211_ATTR_PMK]); in nl80211_setdel_pmksa()
10889 if (info->attrs[NL80211_ATTR_PMK_LIFETIME]) in nl80211_setdel_pmksa()
10891 nla_get_u32(info->attrs[NL80211_ATTR_PMK_LIFETIME]); in nl80211_setdel_pmksa()
10893 if (info->attrs[NL80211_ATTR_PMK_REAUTH_THRESHOLD]) in nl80211_setdel_pmksa()
10896 info->attrs[NL80211_ATTR_PMK_REAUTH_THRESHOLD]); in nl80211_setdel_pmksa()
10898 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_setdel_pmksa()
10899 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT && in nl80211_setdel_pmksa()
10900 !(dev->ieee80211_ptr->iftype == NL80211_IFTYPE_AP && in nl80211_setdel_pmksa()
10901 wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_setdel_pmksa()
10903 return -EOPNOTSUPP; in nl80211_setdel_pmksa()
10905 switch (info->genlhdr->cmd) { in nl80211_setdel_pmksa()
10907 rdev_ops = rdev->ops->set_pmksa; in nl80211_setdel_pmksa()
10910 rdev_ops = rdev->ops->del_pmksa; in nl80211_setdel_pmksa()
10918 return -EOPNOTSUPP; in nl80211_setdel_pmksa()
10920 return rdev_ops(&rdev->wiphy, dev, &pmksa); in nl80211_setdel_pmksa()
10925 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_flush_pmksa()
10926 struct net_device *dev = info->user_ptr[1]; in nl80211_flush_pmksa()
10928 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_flush_pmksa()
10929 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_flush_pmksa()
10930 return -EOPNOTSUPP; in nl80211_flush_pmksa()
10932 if (!rdev->ops->flush_pmksa) in nl80211_flush_pmksa()
10933 return -EOPNOTSUPP; in nl80211_flush_pmksa()
10940 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_tdls_mgmt()
10941 struct net_device *dev = info->user_ptr[1]; in nl80211_tdls_mgmt()
10948 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) || in nl80211_tdls_mgmt()
10949 !rdev->ops->tdls_mgmt) in nl80211_tdls_mgmt()
10950 return -EOPNOTSUPP; in nl80211_tdls_mgmt()
10952 if (!info->attrs[NL80211_ATTR_TDLS_ACTION] || in nl80211_tdls_mgmt()
10953 !info->attrs[NL80211_ATTR_STATUS_CODE] || in nl80211_tdls_mgmt()
10954 !info->attrs[NL80211_ATTR_TDLS_DIALOG_TOKEN] || in nl80211_tdls_mgmt()
10955 !info->attrs[NL80211_ATTR_IE] || in nl80211_tdls_mgmt()
10956 !info->attrs[NL80211_ATTR_MAC]) in nl80211_tdls_mgmt()
10957 return -EINVAL; in nl80211_tdls_mgmt()
10959 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_tdls_mgmt()
10960 action_code = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_ACTION]); in nl80211_tdls_mgmt()
10961 status_code = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]); in nl80211_tdls_mgmt()
10962 dialog_token = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_DIALOG_TOKEN]); in nl80211_tdls_mgmt()
10963 initiator = nla_get_flag(info->attrs[NL80211_ATTR_TDLS_INITIATOR]); in nl80211_tdls_mgmt()
10964 if (info->attrs[NL80211_ATTR_TDLS_PEER_CAPABILITY]) in nl80211_tdls_mgmt()
10966 nla_get_u32(info->attrs[NL80211_ATTR_TDLS_PEER_CAPABILITY]); in nl80211_tdls_mgmt()
10971 nla_data(info->attrs[NL80211_ATTR_IE]), in nl80211_tdls_mgmt()
10972 nla_len(info->attrs[NL80211_ATTR_IE])); in nl80211_tdls_mgmt()
10977 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_tdls_oper()
10978 struct net_device *dev = info->user_ptr[1]; in nl80211_tdls_oper()
10982 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) || in nl80211_tdls_oper()
10983 !rdev->ops->tdls_oper) in nl80211_tdls_oper()
10984 return -EOPNOTSUPP; in nl80211_tdls_oper()
10986 if (!info->attrs[NL80211_ATTR_TDLS_OPERATION] || in nl80211_tdls_oper()
10987 !info->attrs[NL80211_ATTR_MAC]) in nl80211_tdls_oper()
10988 return -EINVAL; in nl80211_tdls_oper()
10990 operation = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_OPERATION]); in nl80211_tdls_oper()
10991 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_tdls_oper()
10999 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_remain_on_channel()
11000 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_remain_on_channel()
11009 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ] || in nl80211_remain_on_channel()
11010 !info->attrs[NL80211_ATTR_DURATION]) in nl80211_remain_on_channel()
11011 return -EINVAL; in nl80211_remain_on_channel()
11013 duration = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]); in nl80211_remain_on_channel()
11015 if (!rdev->ops->remain_on_channel || in nl80211_remain_on_channel()
11016 !(rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL)) in nl80211_remain_on_channel()
11017 return -EOPNOTSUPP; in nl80211_remain_on_channel()
11024 duration > rdev->wiphy.max_remain_on_channel_duration) in nl80211_remain_on_channel()
11025 return -EINVAL; in nl80211_remain_on_channel()
11033 !cfg80211_chandef_identical(&wdev->chandef, &chandef)) { in nl80211_remain_on_channel()
11034 compat_chandef = cfg80211_chandef_compatible(&wdev->chandef, in nl80211_remain_on_channel()
11038 return -EBUSY; in nl80211_remain_on_channel()
11045 return -ENOMEM; in nl80211_remain_on_channel()
11047 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_remain_on_channel()
11050 err = -ENOBUFS; in nl80211_remain_on_channel()
11069 err = -ENOBUFS; in nl80211_remain_on_channel()
11078 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_cancel_remain_on_channel()
11079 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_cancel_remain_on_channel()
11082 if (!info->attrs[NL80211_ATTR_COOKIE]) in nl80211_cancel_remain_on_channel()
11083 return -EINVAL; in nl80211_cancel_remain_on_channel()
11085 if (!rdev->ops->cancel_remain_on_channel) in nl80211_cancel_remain_on_channel()
11086 return -EOPNOTSUPP; in nl80211_cancel_remain_on_channel()
11088 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); in nl80211_cancel_remain_on_channel()
11097 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_tx_bitrate_mask()
11098 struct net_device *dev = info->user_ptr[1]; in nl80211_set_tx_bitrate_mask()
11099 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_tx_bitrate_mask()
11102 if (!rdev->ops->set_bitrate_mask) in nl80211_set_tx_bitrate_mask()
11103 return -EOPNOTSUPP; in nl80211_set_tx_bitrate_mask()
11106 err = nl80211_parse_tx_bitrate_mask(info, info->attrs, in nl80211_set_tx_bitrate_mask()
11120 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_register_mgmt()
11121 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_register_mgmt()
11124 if (!info->attrs[NL80211_ATTR_FRAME_MATCH]) in nl80211_register_mgmt()
11125 return -EINVAL; in nl80211_register_mgmt()
11127 if (info->attrs[NL80211_ATTR_FRAME_TYPE]) in nl80211_register_mgmt()
11128 frame_type = nla_get_u16(info->attrs[NL80211_ATTR_FRAME_TYPE]); in nl80211_register_mgmt()
11130 switch (wdev->iftype) { in nl80211_register_mgmt()
11142 return -EOPNOTSUPP; in nl80211_register_mgmt()
11146 if (!rdev->ops->mgmt_tx) in nl80211_register_mgmt()
11147 return -EOPNOTSUPP; in nl80211_register_mgmt()
11149 if (info->attrs[NL80211_ATTR_RECEIVE_MULTICAST] && in nl80211_register_mgmt()
11150 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_register_mgmt()
11154 return -EOPNOTSUPP; in nl80211_register_mgmt()
11157 return cfg80211_mlme_register_mgmt(wdev, info->snd_portid, frame_type, in nl80211_register_mgmt()
11158 nla_data(info->attrs[NL80211_ATTR_FRAME_MATCH]), in nl80211_register_mgmt()
11159 nla_len(info->attrs[NL80211_ATTR_FRAME_MATCH]), in nl80211_register_mgmt()
11160 info->attrs[NL80211_ATTR_RECEIVE_MULTICAST], in nl80211_register_mgmt()
11161 info->extack); in nl80211_register_mgmt()
11166 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_tx_mgmt()
11167 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_tx_mgmt()
11175 info->attrs[NL80211_ATTR_DONT_WAIT_FOR_ACK], in nl80211_tx_mgmt()
11178 if (!info->attrs[NL80211_ATTR_FRAME]) in nl80211_tx_mgmt()
11179 return -EINVAL; in nl80211_tx_mgmt()
11181 if (!rdev->ops->mgmt_tx) in nl80211_tx_mgmt()
11182 return -EOPNOTSUPP; in nl80211_tx_mgmt()
11184 switch (wdev->iftype) { in nl80211_tx_mgmt()
11186 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ]) in nl80211_tx_mgmt()
11187 return -EINVAL; in nl80211_tx_mgmt()
11198 return -EOPNOTSUPP; in nl80211_tx_mgmt()
11201 if (info->attrs[NL80211_ATTR_DURATION]) { in nl80211_tx_mgmt()
11202 if (!(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX)) in nl80211_tx_mgmt()
11203 return -EINVAL; in nl80211_tx_mgmt()
11204 params.wait = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]); in nl80211_tx_mgmt()
11211 params.wait > rdev->wiphy.max_remain_on_channel_duration) in nl80211_tx_mgmt()
11212 return -EINVAL; in nl80211_tx_mgmt()
11215 params.offchan = info->attrs[NL80211_ATTR_OFFCHANNEL_TX_OK]; in nl80211_tx_mgmt()
11217 if (params.offchan && !(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX)) in nl80211_tx_mgmt()
11218 return -EINVAL; in nl80211_tx_mgmt()
11220 params.no_cck = nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]); in nl80211_tx_mgmt()
11226 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { in nl80211_tx_mgmt()
11233 return -EINVAL; in nl80211_tx_mgmt()
11238 return -EBUSY; in nl80211_tx_mgmt()
11242 params.buf = nla_data(info->attrs[NL80211_ATTR_FRAME]); in nl80211_tx_mgmt()
11243 params.len = nla_len(info->attrs[NL80211_ATTR_FRAME]); in nl80211_tx_mgmt()
11245 if (info->attrs[NL80211_ATTR_CSA_C_OFFSETS_TX]) { in nl80211_tx_mgmt()
11246 int len = nla_len(info->attrs[NL80211_ATTR_CSA_C_OFFSETS_TX]); in nl80211_tx_mgmt()
11250 return -EINVAL; in nl80211_tx_mgmt()
11254 nla_data(info->attrs[NL80211_ATTR_CSA_C_OFFSETS_TX]); in nl80211_tx_mgmt()
11259 return -EINVAL; in nl80211_tx_mgmt()
11266 return -ENOMEM; in nl80211_tx_mgmt()
11268 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_tx_mgmt()
11271 err = -ENOBUFS; in nl80211_tx_mgmt()
11293 err = -ENOBUFS; in nl80211_tx_mgmt()
11301 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_tx_mgmt_cancel_wait()
11302 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_tx_mgmt_cancel_wait()
11305 if (!info->attrs[NL80211_ATTR_COOKIE]) in nl80211_tx_mgmt_cancel_wait()
11306 return -EINVAL; in nl80211_tx_mgmt_cancel_wait()
11308 if (!rdev->ops->mgmt_tx_cancel_wait) in nl80211_tx_mgmt_cancel_wait()
11309 return -EOPNOTSUPP; in nl80211_tx_mgmt_cancel_wait()
11311 switch (wdev->iftype) { in nl80211_tx_mgmt_cancel_wait()
11322 return -EOPNOTSUPP; in nl80211_tx_mgmt_cancel_wait()
11325 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); in nl80211_tx_mgmt_cancel_wait()
11332 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_power_save()
11334 struct net_device *dev = info->user_ptr[1]; in nl80211_set_power_save()
11339 if (!info->attrs[NL80211_ATTR_PS_STATE]) in nl80211_set_power_save()
11340 return -EINVAL; in nl80211_set_power_save()
11342 ps_state = nla_get_u32(info->attrs[NL80211_ATTR_PS_STATE]); in nl80211_set_power_save()
11344 wdev = dev->ieee80211_ptr; in nl80211_set_power_save()
11346 if (!rdev->ops->set_power_mgmt) in nl80211_set_power_save()
11347 return -EOPNOTSUPP; in nl80211_set_power_save()
11351 if (state == wdev->ps) in nl80211_set_power_save()
11354 err = rdev_set_power_mgmt(rdev, dev, state, wdev->ps_timeout); in nl80211_set_power_save()
11356 wdev->ps = state; in nl80211_set_power_save()
11362 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_power_save()
11365 struct net_device *dev = info->user_ptr[1]; in nl80211_get_power_save()
11370 wdev = dev->ieee80211_ptr; in nl80211_get_power_save()
11372 if (!rdev->ops->set_power_mgmt) in nl80211_get_power_save()
11373 return -EOPNOTSUPP; in nl80211_get_power_save()
11377 return -ENOMEM; in nl80211_get_power_save()
11379 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_power_save()
11382 err = -ENOBUFS; in nl80211_get_power_save()
11386 if (wdev->ps) in nl80211_get_power_save()
11398 err = -ENOBUFS; in nl80211_get_power_save()
11418 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_cqm_txe()
11419 struct net_device *dev = info->user_ptr[1]; in nl80211_set_cqm_txe()
11420 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_cqm_txe()
11423 return -EINVAL; in nl80211_set_cqm_txe()
11425 if (!rdev->ops->set_cqm_txe_config) in nl80211_set_cqm_txe()
11426 return -EOPNOTSUPP; in nl80211_set_cqm_txe()
11428 if (wdev->iftype != NL80211_IFTYPE_STATION && in nl80211_set_cqm_txe()
11429 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_set_cqm_txe()
11430 return -EOPNOTSUPP; in nl80211_set_cqm_txe()
11438 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_cqm_rssi_update()
11445 if (!wdev->cqm_config) in cfg80211_cqm_rssi_update()
11454 if (!wdev->cqm_config->last_rssi_event_value && wdev->current_bss && in cfg80211_cqm_rssi_update()
11455 rdev->ops->get_station) { in cfg80211_cqm_rssi_update()
11459 mac_addr = wdev->current_bss->pub.bssid; in cfg80211_cqm_rssi_update()
11467 wdev->cqm_config->last_rssi_event_value = in cfg80211_cqm_rssi_update()
11471 last = wdev->cqm_config->last_rssi_event_value; in cfg80211_cqm_rssi_update()
11472 hyst = wdev->cqm_config->rssi_hyst; in cfg80211_cqm_rssi_update()
11473 n = wdev->cqm_config->n_rssi_thresholds; in cfg80211_cqm_rssi_update()
11477 if (last < wdev->cqm_config->rssi_thresholds[i]) in cfg80211_cqm_rssi_update()
11481 low_index = i - 1; in cfg80211_cqm_rssi_update()
11484 low = wdev->cqm_config->rssi_thresholds[low_index] - hyst; in cfg80211_cqm_rssi_update()
11490 high = wdev->cqm_config->rssi_thresholds[i] + hyst - 1; in cfg80211_cqm_rssi_update()
11502 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_cqm_rssi()
11503 struct net_device *dev = info->user_ptr[1]; in nl80211_set_cqm_rssi()
11504 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_cqm_rssi()
11511 return -EINVAL; in nl80211_set_cqm_rssi()
11516 if (wdev->iftype != NL80211_IFTYPE_STATION && in nl80211_set_cqm_rssi()
11517 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_set_cqm_rssi()
11518 return -EOPNOTSUPP; in nl80211_set_cqm_rssi()
11524 if (n_thresholds <= 1 && rdev->ops->set_cqm_rssi_config) { in nl80211_set_cqm_rssi()
11532 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_set_cqm_rssi()
11534 return -EOPNOTSUPP; in nl80211_set_cqm_rssi()
11546 err = -ENOMEM; in nl80211_set_cqm_rssi()
11550 cqm_config->rssi_hyst = hysteresis; in nl80211_set_cqm_rssi()
11551 cqm_config->n_rssi_thresholds = n_thresholds; in nl80211_set_cqm_rssi()
11552 memcpy(cqm_config->rssi_thresholds, thresholds, in nl80211_set_cqm_rssi()
11555 wdev->cqm_config = cqm_config; in nl80211_set_cqm_rssi()
11572 cqm = info->attrs[NL80211_ATTR_CQM]; in nl80211_set_cqm()
11574 return -EINVAL; in nl80211_set_cqm()
11578 info->extack); in nl80211_set_cqm()
11590 return -EINVAL; in nl80211_set_cqm()
11606 return -EINVAL; in nl80211_set_cqm()
11611 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_join_ocb()
11612 struct net_device *dev = info->user_ptr[1]; in nl80211_join_ocb()
11625 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_leave_ocb()
11626 struct net_device *dev = info->user_ptr[1]; in nl80211_leave_ocb()
11633 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_join_mesh()
11634 struct net_device *dev = info->user_ptr[1]; in nl80211_join_mesh()
11643 if (info->attrs[NL80211_ATTR_MESH_CONFIG]) { in nl80211_join_mesh()
11650 if (!info->attrs[NL80211_ATTR_MESH_ID] || in nl80211_join_mesh()
11651 !nla_len(info->attrs[NL80211_ATTR_MESH_ID])) in nl80211_join_mesh()
11652 return -EINVAL; in nl80211_join_mesh()
11654 setup.mesh_id = nla_data(info->attrs[NL80211_ATTR_MESH_ID]); in nl80211_join_mesh()
11655 setup.mesh_id_len = nla_len(info->attrs[NL80211_ATTR_MESH_ID]); in nl80211_join_mesh()
11657 if (info->attrs[NL80211_ATTR_MCAST_RATE] && in nl80211_join_mesh()
11659 nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]))) in nl80211_join_mesh()
11660 return -EINVAL; in nl80211_join_mesh()
11662 if (info->attrs[NL80211_ATTR_BEACON_INTERVAL]) { in nl80211_join_mesh()
11664 nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]); in nl80211_join_mesh()
11673 if (info->attrs[NL80211_ATTR_DTIM_PERIOD]) { in nl80211_join_mesh()
11675 nla_get_u32(info->attrs[NL80211_ATTR_DTIM_PERIOD]); in nl80211_join_mesh()
11677 return -EINVAL; in nl80211_join_mesh()
11680 if (info->attrs[NL80211_ATTR_MESH_SETUP]) { in nl80211_join_mesh()
11690 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { in nl80211_join_mesh()
11699 if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) { in nl80211_join_mesh()
11700 u8 *rates = nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); in nl80211_join_mesh()
11702 nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); in nl80211_join_mesh()
11706 return -EINVAL; in nl80211_join_mesh()
11708 sband = rdev->wiphy.bands[setup.chandef.chan->band]; in nl80211_join_mesh()
11716 if (info->attrs[NL80211_ATTR_TX_RATES]) { in nl80211_join_mesh()
11717 err = nl80211_parse_tx_bitrate_mask(info, info->attrs, in nl80211_join_mesh()
11725 return -EINVAL; in nl80211_join_mesh()
11727 err = validate_beacon_tx_rate(rdev, setup.chandef.chan->band, in nl80211_join_mesh()
11734 nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS]); in nl80211_join_mesh()
11736 if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) { in nl80211_join_mesh()
11745 wdev_lock(dev->ieee80211_ptr); in nl80211_join_mesh()
11747 if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) in nl80211_join_mesh()
11748 dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid; in nl80211_join_mesh()
11749 wdev_unlock(dev->ieee80211_ptr); in nl80211_join_mesh()
11756 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_leave_mesh()
11757 struct net_device *dev = info->user_ptr[1]; in nl80211_leave_mesh()
11766 struct cfg80211_wowlan *wowlan = rdev->wiphy.wowlan_config; in nl80211_send_wowlan_patterns()
11770 if (!wowlan->n_patterns) in nl80211_send_wowlan_patterns()
11775 return -ENOBUFS; in nl80211_send_wowlan_patterns()
11777 for (i = 0; i < wowlan->n_patterns; i++) { in nl80211_send_wowlan_patterns()
11780 return -ENOBUFS; in nl80211_send_wowlan_patterns()
11781 pat_len = wowlan->patterns[i].pattern_len; in nl80211_send_wowlan_patterns()
11783 wowlan->patterns[i].mask) || in nl80211_send_wowlan_patterns()
11785 wowlan->patterns[i].pattern) || in nl80211_send_wowlan_patterns()
11787 wowlan->patterns[i].pkt_offset)) in nl80211_send_wowlan_patterns()
11788 return -ENOBUFS; in nl80211_send_wowlan_patterns()
11807 return -ENOBUFS; in nl80211_send_wowlan_tcp()
11809 if (nla_put_in_addr(msg, NL80211_WOWLAN_TCP_SRC_IPV4, tcp->src) || in nl80211_send_wowlan_tcp()
11810 nla_put_in_addr(msg, NL80211_WOWLAN_TCP_DST_IPV4, tcp->dst) || in nl80211_send_wowlan_tcp()
11811 nla_put(msg, NL80211_WOWLAN_TCP_DST_MAC, ETH_ALEN, tcp->dst_mac) || in nl80211_send_wowlan_tcp()
11812 nla_put_u16(msg, NL80211_WOWLAN_TCP_SRC_PORT, tcp->src_port) || in nl80211_send_wowlan_tcp()
11813 nla_put_u16(msg, NL80211_WOWLAN_TCP_DST_PORT, tcp->dst_port) || in nl80211_send_wowlan_tcp()
11815 tcp->payload_len, tcp->payload) || in nl80211_send_wowlan_tcp()
11817 tcp->data_interval) || in nl80211_send_wowlan_tcp()
11819 tcp->wake_len, tcp->wake_data) || in nl80211_send_wowlan_tcp()
11821 DIV_ROUND_UP(tcp->wake_len, 8), tcp->wake_mask)) in nl80211_send_wowlan_tcp()
11822 return -ENOBUFS; in nl80211_send_wowlan_tcp()
11824 if (tcp->payload_seq.len && in nl80211_send_wowlan_tcp()
11826 sizeof(tcp->payload_seq), &tcp->payload_seq)) in nl80211_send_wowlan_tcp()
11827 return -ENOBUFS; in nl80211_send_wowlan_tcp()
11829 if (tcp->payload_tok.len && in nl80211_send_wowlan_tcp()
11831 sizeof(tcp->payload_tok) + tcp->tokens_size, in nl80211_send_wowlan_tcp()
11832 &tcp->payload_tok)) in nl80211_send_wowlan_tcp()
11833 return -ENOBUFS; in nl80211_send_wowlan_tcp()
11851 return -ENOBUFS; in nl80211_send_wowlan_nd()
11853 if (req->n_scan_plans == 1 && in nl80211_send_wowlan_nd()
11855 req->scan_plans[0].interval * 1000)) in nl80211_send_wowlan_nd()
11856 return -ENOBUFS; in nl80211_send_wowlan_nd()
11858 if (nla_put_u32(msg, NL80211_ATTR_SCHED_SCAN_DELAY, req->delay)) in nl80211_send_wowlan_nd()
11859 return -ENOBUFS; in nl80211_send_wowlan_nd()
11861 if (req->relative_rssi_set) { in nl80211_send_wowlan_nd()
11865 req->relative_rssi)) in nl80211_send_wowlan_nd()
11866 return -ENOBUFS; in nl80211_send_wowlan_nd()
11868 rssi_adjust.band = req->rssi_adjust.band; in nl80211_send_wowlan_nd()
11869 rssi_adjust.delta = req->rssi_adjust.delta; in nl80211_send_wowlan_nd()
11872 return -ENOBUFS; in nl80211_send_wowlan_nd()
11877 return -ENOBUFS; in nl80211_send_wowlan_nd()
11879 for (i = 0; i < req->n_channels; i++) { in nl80211_send_wowlan_nd()
11880 if (nla_put_u32(msg, i, req->channels[i]->center_freq)) in nl80211_send_wowlan_nd()
11881 return -ENOBUFS; in nl80211_send_wowlan_nd()
11886 if (req->n_match_sets) { in nl80211_send_wowlan_nd()
11890 return -ENOBUFS; in nl80211_send_wowlan_nd()
11892 for (i = 0; i < req->n_match_sets; i++) { in nl80211_send_wowlan_nd()
11895 return -ENOBUFS; in nl80211_send_wowlan_nd()
11898 req->match_sets[i].ssid.ssid_len, in nl80211_send_wowlan_nd()
11899 req->match_sets[i].ssid.ssid)) in nl80211_send_wowlan_nd()
11900 return -ENOBUFS; in nl80211_send_wowlan_nd()
11908 return -ENOBUFS; in nl80211_send_wowlan_nd()
11910 for (i = 0; i < req->n_scan_plans; i++) { in nl80211_send_wowlan_nd()
11913 return -ENOBUFS; in nl80211_send_wowlan_nd()
11916 req->scan_plans[i].interval) || in nl80211_send_wowlan_nd()
11917 (req->scan_plans[i].iterations && in nl80211_send_wowlan_nd()
11919 req->scan_plans[i].iterations))) in nl80211_send_wowlan_nd()
11920 return -ENOBUFS; in nl80211_send_wowlan_nd()
11932 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_wowlan()
11937 if (!rdev->wiphy.wowlan) in nl80211_get_wowlan()
11938 return -EOPNOTSUPP; in nl80211_get_wowlan()
11940 if (rdev->wiphy.wowlan_config && rdev->wiphy.wowlan_config->tcp) { in nl80211_get_wowlan()
11942 size += rdev->wiphy.wowlan_config->tcp->tokens_size + in nl80211_get_wowlan()
11943 rdev->wiphy.wowlan_config->tcp->payload_len + in nl80211_get_wowlan()
11944 rdev->wiphy.wowlan_config->tcp->wake_len + in nl80211_get_wowlan()
11945 rdev->wiphy.wowlan_config->tcp->wake_len / 8; in nl80211_get_wowlan()
11950 return -ENOMEM; in nl80211_get_wowlan()
11952 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_wowlan()
11957 if (rdev->wiphy.wowlan_config) { in nl80211_get_wowlan()
11965 if ((rdev->wiphy.wowlan_config->any && in nl80211_get_wowlan()
11967 (rdev->wiphy.wowlan_config->disconnect && in nl80211_get_wowlan()
11969 (rdev->wiphy.wowlan_config->magic_pkt && in nl80211_get_wowlan()
11971 (rdev->wiphy.wowlan_config->gtk_rekey_failure && in nl80211_get_wowlan()
11973 (rdev->wiphy.wowlan_config->eap_identity_req && in nl80211_get_wowlan()
11975 (rdev->wiphy.wowlan_config->four_way_handshake && in nl80211_get_wowlan()
11977 (rdev->wiphy.wowlan_config->rfkill_release && in nl80211_get_wowlan()
11985 rdev->wiphy.wowlan_config->tcp)) in nl80211_get_wowlan()
11990 rdev->wiphy.wowlan_config->nd_config)) in nl80211_get_wowlan()
12001 return -ENOBUFS; in nl80211_get_wowlan()
12016 if (!rdev->wiphy.wowlan->tcp) in nl80211_parse_wowlan_tcp()
12017 return -EINVAL; in nl80211_parse_wowlan_tcp()
12032 return -EINVAL; in nl80211_parse_wowlan_tcp()
12035 if (data_size > rdev->wiphy.wowlan->tcp->data_payload_max) in nl80211_parse_wowlan_tcp()
12036 return -EINVAL; in nl80211_parse_wowlan_tcp()
12039 rdev->wiphy.wowlan->tcp->data_interval_max || in nl80211_parse_wowlan_tcp()
12041 return -EINVAL; in nl80211_parse_wowlan_tcp()
12044 if (wake_size > rdev->wiphy.wowlan->tcp->wake_payload_max) in nl80211_parse_wowlan_tcp()
12045 return -EINVAL; in nl80211_parse_wowlan_tcp()
12049 return -EINVAL; in nl80211_parse_wowlan_tcp()
12055 tokens_size = tokln - sizeof(*tok); in nl80211_parse_wowlan_tcp()
12057 if (!tok->len || tokens_size % tok->len) in nl80211_parse_wowlan_tcp()
12058 return -EINVAL; in nl80211_parse_wowlan_tcp()
12059 if (!rdev->wiphy.wowlan->tcp->tok) in nl80211_parse_wowlan_tcp()
12060 return -EINVAL; in nl80211_parse_wowlan_tcp()
12061 if (tok->len > rdev->wiphy.wowlan->tcp->tok->max_len) in nl80211_parse_wowlan_tcp()
12062 return -EINVAL; in nl80211_parse_wowlan_tcp()
12063 if (tok->len < rdev->wiphy.wowlan->tcp->tok->min_len) in nl80211_parse_wowlan_tcp()
12064 return -EINVAL; in nl80211_parse_wowlan_tcp()
12065 if (tokens_size > rdev->wiphy.wowlan->tcp->tok->bufsize) in nl80211_parse_wowlan_tcp()
12066 return -EINVAL; in nl80211_parse_wowlan_tcp()
12067 if (tok->offset + tok->len > data_size) in nl80211_parse_wowlan_tcp()
12068 return -EINVAL; in nl80211_parse_wowlan_tcp()
12073 if (!rdev->wiphy.wowlan->tcp->seq) in nl80211_parse_wowlan_tcp()
12074 return -EINVAL; in nl80211_parse_wowlan_tcp()
12075 if (seq->len == 0 || seq->len > 4) in nl80211_parse_wowlan_tcp()
12076 return -EINVAL; in nl80211_parse_wowlan_tcp()
12077 if (seq->len + seq->offset > data_size) in nl80211_parse_wowlan_tcp()
12078 return -EINVAL; in nl80211_parse_wowlan_tcp()
12088 return -ENOMEM; in nl80211_parse_wowlan_tcp()
12089 cfg->src = nla_get_in_addr(tb[NL80211_WOWLAN_TCP_SRC_IPV4]); in nl80211_parse_wowlan_tcp()
12090 cfg->dst = nla_get_in_addr(tb[NL80211_WOWLAN_TCP_DST_IPV4]); in nl80211_parse_wowlan_tcp()
12091 memcpy(cfg->dst_mac, nla_data(tb[NL80211_WOWLAN_TCP_DST_MAC]), in nl80211_parse_wowlan_tcp()
12099 err = __sock_create(wiphy_net(&rdev->wiphy), PF_INET, SOCK_STREAM, in nl80211_parse_wowlan_tcp()
12100 IPPROTO_TCP, &cfg->sock, 1); in nl80211_parse_wowlan_tcp()
12105 if (inet_csk_get_port(cfg->sock->sk, port)) { in nl80211_parse_wowlan_tcp()
12106 sock_release(cfg->sock); in nl80211_parse_wowlan_tcp()
12108 return -EADDRINUSE; in nl80211_parse_wowlan_tcp()
12110 cfg->src_port = inet_sk(cfg->sock->sk)->inet_num; in nl80211_parse_wowlan_tcp()
12114 return -EINVAL; in nl80211_parse_wowlan_tcp()
12116 cfg->src_port = port; in nl80211_parse_wowlan_tcp()
12119 cfg->dst_port = nla_get_u16(tb[NL80211_WOWLAN_TCP_DST_PORT]); in nl80211_parse_wowlan_tcp()
12120 cfg->payload_len = data_size; in nl80211_parse_wowlan_tcp()
12121 cfg->payload = (u8 *)cfg + sizeof(*cfg) + tokens_size; in nl80211_parse_wowlan_tcp()
12122 memcpy((void *)cfg->payload, in nl80211_parse_wowlan_tcp()
12126 cfg->payload_seq = *seq; in nl80211_parse_wowlan_tcp()
12127 cfg->data_interval = nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]); in nl80211_parse_wowlan_tcp()
12128 cfg->wake_len = wake_size; in nl80211_parse_wowlan_tcp()
12129 cfg->wake_data = (u8 *)cfg + sizeof(*cfg) + tokens_size + data_size; in nl80211_parse_wowlan_tcp()
12130 memcpy((void *)cfg->wake_data, in nl80211_parse_wowlan_tcp()
12133 cfg->wake_mask = (u8 *)cfg + sizeof(*cfg) + tokens_size + in nl80211_parse_wowlan_tcp()
12135 memcpy((void *)cfg->wake_mask, in nl80211_parse_wowlan_tcp()
12139 cfg->tokens_size = tokens_size; in nl80211_parse_wowlan_tcp()
12140 memcpy(&cfg->payload_tok, tok, sizeof(*tok) + tokens_size); in nl80211_parse_wowlan_tcp()
12143 trig->tcp = cfg; in nl80211_parse_wowlan_tcp()
12158 return -ENOMEM; in nl80211_parse_wowlan_nd()
12160 if (!(wowlan->flags & WIPHY_WOWLAN_NET_DETECT)) { in nl80211_parse_wowlan_nd()
12161 err = -EOPNOTSUPP; in nl80211_parse_wowlan_nd()
12170 trig->nd_config = nl80211_parse_sched_scan(&rdev->wiphy, NULL, tb, in nl80211_parse_wowlan_nd()
12171 wowlan->max_nd_match_sets); in nl80211_parse_wowlan_nd()
12172 err = PTR_ERR_OR_ZERO(trig->nd_config); in nl80211_parse_wowlan_nd()
12174 trig->nd_config = NULL; in nl80211_parse_wowlan_nd()
12183 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_wowlan()
12187 const struct wiphy_wowlan_support *wowlan = rdev->wiphy.wowlan; in nl80211_set_wowlan()
12189 bool prev_enabled = rdev->wiphy.wowlan_config; in nl80211_set_wowlan()
12193 return -EOPNOTSUPP; in nl80211_set_wowlan()
12195 if (!info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS]) { in nl80211_set_wowlan()
12197 rdev->wiphy.wowlan_config = NULL; in nl80211_set_wowlan()
12202 info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS], in nl80211_set_wowlan()
12203 nl80211_wowlan_policy, info->extack); in nl80211_set_wowlan()
12208 if (!(wowlan->flags & WIPHY_WOWLAN_ANY)) in nl80211_set_wowlan()
12209 return -EINVAL; in nl80211_set_wowlan()
12214 if (!(wowlan->flags & WIPHY_WOWLAN_DISCONNECT)) in nl80211_set_wowlan()
12215 return -EINVAL; in nl80211_set_wowlan()
12221 if (!(wowlan->flags & WIPHY_WOWLAN_MAGIC_PKT)) in nl80211_set_wowlan()
12222 return -EINVAL; in nl80211_set_wowlan()
12228 return -EINVAL; in nl80211_set_wowlan()
12231 if (!(wowlan->flags & WIPHY_WOWLAN_GTK_REKEY_FAILURE)) in nl80211_set_wowlan()
12232 return -EINVAL; in nl80211_set_wowlan()
12238 if (!(wowlan->flags & WIPHY_WOWLAN_EAP_IDENTITY_REQ)) in nl80211_set_wowlan()
12239 return -EINVAL; in nl80211_set_wowlan()
12245 if (!(wowlan->flags & WIPHY_WOWLAN_4WAY_HANDSHAKE)) in nl80211_set_wowlan()
12246 return -EINVAL; in nl80211_set_wowlan()
12252 if (!(wowlan->flags & WIPHY_WOWLAN_RFKILL_RELEASE)) in nl80211_set_wowlan()
12253 return -EINVAL; in nl80211_set_wowlan()
12269 if (n_patterns > wowlan->n_patterns) in nl80211_set_wowlan()
12270 return -EINVAL; in nl80211_set_wowlan()
12276 return -ENOMEM; in nl80211_set_wowlan()
12289 info->extack); in nl80211_set_wowlan()
12293 err = -EINVAL; in nl80211_set_wowlan()
12301 if (pat_len > wowlan->pattern_max_len || in nl80211_set_wowlan()
12302 pat_len < wowlan->pattern_min_len) in nl80211_set_wowlan()
12310 if (pkt_offset > wowlan->max_pkt_offset) in nl80211_set_wowlan()
12316 err = -ENOMEM; in nl80211_set_wowlan()
12353 * It therefore makes little sense to combine with the more constrained in nl80211_set_wowlan()
12357 err = -EINVAL; in nl80211_set_wowlan()
12363 err = -ENOMEM; in nl80211_set_wowlan()
12367 rdev->wiphy.wowlan_config = ntrig; in nl80211_set_wowlan()
12370 if (rdev->ops->set_wakeup && in nl80211_set_wowlan()
12371 prev_enabled != !!rdev->wiphy.wowlan_config) in nl80211_set_wowlan()
12372 rdev_set_wakeup(rdev, rdev->wiphy.wowlan_config); in nl80211_set_wowlan()
12379 if (new_triggers.tcp && new_triggers.tcp->sock) in nl80211_set_wowlan()
12380 sock_release(new_triggers.tcp->sock); in nl80211_set_wowlan()
12394 if (!rdev->coalesce->n_rules) in nl80211_send_coalesce_rules()
12399 return -ENOBUFS; in nl80211_send_coalesce_rules()
12401 for (i = 0; i < rdev->coalesce->n_rules; i++) { in nl80211_send_coalesce_rules()
12404 return -ENOBUFS; in nl80211_send_coalesce_rules()
12406 rule = &rdev->coalesce->rules[i]; in nl80211_send_coalesce_rules()
12408 rule->delay)) in nl80211_send_coalesce_rules()
12409 return -ENOBUFS; in nl80211_send_coalesce_rules()
12412 rule->condition)) in nl80211_send_coalesce_rules()
12413 return -ENOBUFS; in nl80211_send_coalesce_rules()
12418 return -ENOBUFS; in nl80211_send_coalesce_rules()
12420 for (j = 0; j < rule->n_patterns; j++) { in nl80211_send_coalesce_rules()
12423 return -ENOBUFS; in nl80211_send_coalesce_rules()
12424 pat_len = rule->patterns[j].pattern_len; in nl80211_send_coalesce_rules()
12427 rule->patterns[j].mask) || in nl80211_send_coalesce_rules()
12429 rule->patterns[j].pattern) || in nl80211_send_coalesce_rules()
12431 rule->patterns[j].pkt_offset)) in nl80211_send_coalesce_rules()
12432 return -ENOBUFS; in nl80211_send_coalesce_rules()
12445 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_coalesce()
12449 if (!rdev->wiphy.coalesce) in nl80211_get_coalesce()
12450 return -EOPNOTSUPP; in nl80211_get_coalesce()
12454 return -ENOMEM; in nl80211_get_coalesce()
12456 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_coalesce()
12461 if (rdev->coalesce && nl80211_send_coalesce_rules(msg, rdev)) in nl80211_get_coalesce()
12469 return -ENOBUFS; in nl80211_get_coalesce()
12474 struct cfg80211_coalesce *coalesce = rdev->coalesce; in cfg80211_rdev_free_coalesce()
12481 for (i = 0; i < coalesce->n_rules; i++) { in cfg80211_rdev_free_coalesce()
12482 rule = &coalesce->rules[i]; in cfg80211_rdev_free_coalesce()
12483 for (j = 0; j < rule->n_patterns; j++) in cfg80211_rdev_free_coalesce()
12484 kfree(rule->patterns[j].mask); in cfg80211_rdev_free_coalesce()
12485 kfree(rule->patterns); in cfg80211_rdev_free_coalesce()
12487 kfree(coalesce->rules); in cfg80211_rdev_free_coalesce()
12489 rdev->coalesce = NULL; in cfg80211_rdev_free_coalesce()
12497 const struct wiphy_coalesce_support *coalesce = rdev->wiphy.coalesce; in nl80211_parse_coalesce_rule()
12508 new_rule->delay = in nl80211_parse_coalesce_rule()
12510 if (new_rule->delay > coalesce->max_delay) in nl80211_parse_coalesce_rule()
12511 return -EINVAL; in nl80211_parse_coalesce_rule()
12514 new_rule->condition = in nl80211_parse_coalesce_rule()
12518 return -EINVAL; in nl80211_parse_coalesce_rule()
12523 if (n_patterns > coalesce->n_patterns) in nl80211_parse_coalesce_rule()
12524 return -EINVAL; in nl80211_parse_coalesce_rule()
12526 new_rule->patterns = kcalloc(n_patterns, sizeof(new_rule->patterns[0]), in nl80211_parse_coalesce_rule()
12528 if (!new_rule->patterns) in nl80211_parse_coalesce_rule()
12529 return -ENOMEM; in nl80211_parse_coalesce_rule()
12531 new_rule->n_patterns = n_patterns; in nl80211_parse_coalesce_rule()
12547 return -EINVAL; in nl80211_parse_coalesce_rule()
12551 return -EINVAL; in nl80211_parse_coalesce_rule()
12552 if (pat_len > coalesce->pattern_max_len || in nl80211_parse_coalesce_rule()
12553 pat_len < coalesce->pattern_min_len) in nl80211_parse_coalesce_rule()
12554 return -EINVAL; in nl80211_parse_coalesce_rule()
12560 if (pkt_offset > coalesce->max_pkt_offset) in nl80211_parse_coalesce_rule()
12561 return -EINVAL; in nl80211_parse_coalesce_rule()
12562 new_rule->patterns[i].pkt_offset = pkt_offset; in nl80211_parse_coalesce_rule()
12566 return -ENOMEM; in nl80211_parse_coalesce_rule()
12568 new_rule->patterns[i].mask = mask_pat; in nl80211_parse_coalesce_rule()
12573 new_rule->patterns[i].pattern = mask_pat; in nl80211_parse_coalesce_rule()
12574 new_rule->patterns[i].pattern_len = pat_len; in nl80211_parse_coalesce_rule()
12585 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_coalesce()
12586 const struct wiphy_coalesce_support *coalesce = rdev->wiphy.coalesce; in nl80211_set_coalesce()
12593 if (!rdev->wiphy.coalesce || !rdev->ops->set_coalesce) in nl80211_set_coalesce()
12594 return -EOPNOTSUPP; in nl80211_set_coalesce()
12596 if (!info->attrs[NL80211_ATTR_COALESCE_RULE]) { in nl80211_set_coalesce()
12602 nla_for_each_nested(rule, info->attrs[NL80211_ATTR_COALESCE_RULE], in nl80211_set_coalesce()
12605 if (n_rules > coalesce->n_rules) in nl80211_set_coalesce()
12606 return -EINVAL; in nl80211_set_coalesce()
12611 return -ENOMEM; in nl80211_set_coalesce()
12616 nla_for_each_nested(rule, info->attrs[NL80211_ATTR_COALESCE_RULE], in nl80211_set_coalesce()
12632 err = -ENOMEM; in nl80211_set_coalesce()
12636 rdev->coalesce = n_coalesce; in nl80211_set_coalesce()
12642 for (j = 0; j < tmp_rule->n_patterns; j++) in nl80211_set_coalesce()
12643 kfree(tmp_rule->patterns[j].mask); in nl80211_set_coalesce()
12644 kfree(tmp_rule->patterns); in nl80211_set_coalesce()
12653 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_rekey_data()
12654 struct net_device *dev = info->user_ptr[1]; in nl80211_set_rekey_data()
12655 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_rekey_data()
12660 if (!info->attrs[NL80211_ATTR_REKEY_DATA]) in nl80211_set_rekey_data()
12661 return -EINVAL; in nl80211_set_rekey_data()
12664 info->attrs[NL80211_ATTR_REKEY_DATA], in nl80211_set_rekey_data()
12665 nl80211_rekey_policy, info->extack); in nl80211_set_rekey_data()
12671 return -EINVAL; in nl80211_set_rekey_data()
12673 !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_EXT_KEK_KCK && in nl80211_set_rekey_data()
12675 return -ERANGE; in nl80211_set_rekey_data()
12677 !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_EXT_KEK_KCK && in nl80211_set_rekey_data()
12679 return -ERANGE; in nl80211_set_rekey_data()
12690 if (!wdev->current_bss) { in nl80211_set_rekey_data()
12691 err = -ENOTCONN; in nl80211_set_rekey_data()
12695 if (!rdev->ops->set_rekey_data) { in nl80211_set_rekey_data()
12696 err = -EOPNOTSUPP; in nl80211_set_rekey_data()
12709 struct net_device *dev = info->user_ptr[1]; in nl80211_register_unexpected_frame()
12710 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_register_unexpected_frame()
12712 if (wdev->iftype != NL80211_IFTYPE_AP && in nl80211_register_unexpected_frame()
12713 wdev->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_register_unexpected_frame()
12714 return -EINVAL; in nl80211_register_unexpected_frame()
12716 if (wdev->ap_unexpected_nlportid) in nl80211_register_unexpected_frame()
12717 return -EBUSY; in nl80211_register_unexpected_frame()
12719 wdev->ap_unexpected_nlportid = info->snd_portid; in nl80211_register_unexpected_frame()
12726 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_probe_client()
12727 struct net_device *dev = info->user_ptr[1]; in nl80211_probe_client()
12728 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_probe_client()
12735 if (wdev->iftype != NL80211_IFTYPE_AP && in nl80211_probe_client()
12736 wdev->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_probe_client()
12737 return -EOPNOTSUPP; in nl80211_probe_client()
12739 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_probe_client()
12740 return -EINVAL; in nl80211_probe_client()
12742 if (!rdev->ops->probe_client) in nl80211_probe_client()
12743 return -EOPNOTSUPP; in nl80211_probe_client()
12747 return -ENOMEM; in nl80211_probe_client()
12749 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_probe_client()
12752 err = -ENOBUFS; in nl80211_probe_client()
12756 addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_probe_client()
12771 err = -ENOBUFS; in nl80211_probe_client()
12779 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_register_beacons()
12783 if (!(rdev->wiphy.flags & WIPHY_FLAG_REPORTS_OBSS)) in nl80211_register_beacons()
12784 return -EOPNOTSUPP; in nl80211_register_beacons()
12788 return -ENOMEM; in nl80211_register_beacons()
12791 spin_lock_bh(&rdev->beacon_registrations_lock); in nl80211_register_beacons()
12792 list_for_each_entry(reg, &rdev->beacon_registrations, list) { in nl80211_register_beacons()
12793 if (reg->nlportid == info->snd_portid) { in nl80211_register_beacons()
12794 rv = -EALREADY; in nl80211_register_beacons()
12799 nreg->nlportid = info->snd_portid; in nl80211_register_beacons()
12800 list_add(&nreg->list, &rdev->beacon_registrations); in nl80211_register_beacons()
12802 spin_unlock_bh(&rdev->beacon_registrations_lock); in nl80211_register_beacons()
12806 spin_unlock_bh(&rdev->beacon_registrations_lock); in nl80211_register_beacons()
12813 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_start_p2p_device()
12814 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_start_p2p_device()
12817 if (!rdev->ops->start_p2p_device) in nl80211_start_p2p_device()
12818 return -EOPNOTSUPP; in nl80211_start_p2p_device()
12820 if (wdev->iftype != NL80211_IFTYPE_P2P_DEVICE) in nl80211_start_p2p_device()
12821 return -EOPNOTSUPP; in nl80211_start_p2p_device()
12826 if (rfkill_blocked(rdev->rfkill)) in nl80211_start_p2p_device()
12827 return -ERFKILL; in nl80211_start_p2p_device()
12833 wdev->is_running = true; in nl80211_start_p2p_device()
12834 rdev->opencount++; in nl80211_start_p2p_device()
12841 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_stop_p2p_device()
12842 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_stop_p2p_device()
12844 if (wdev->iftype != NL80211_IFTYPE_P2P_DEVICE) in nl80211_stop_p2p_device()
12845 return -EOPNOTSUPP; in nl80211_stop_p2p_device()
12847 if (!rdev->ops->stop_p2p_device) in nl80211_stop_p2p_device()
12848 return -EOPNOTSUPP; in nl80211_stop_p2p_device()
12857 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_start_nan()
12858 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_start_nan()
12862 if (wdev->iftype != NL80211_IFTYPE_NAN) in nl80211_start_nan()
12863 return -EOPNOTSUPP; in nl80211_start_nan()
12866 return -EEXIST; in nl80211_start_nan()
12868 if (rfkill_blocked(rdev->rfkill)) in nl80211_start_nan()
12869 return -ERFKILL; in nl80211_start_nan()
12871 if (!info->attrs[NL80211_ATTR_NAN_MASTER_PREF]) in nl80211_start_nan()
12872 return -EINVAL; in nl80211_start_nan()
12875 nla_get_u8(info->attrs[NL80211_ATTR_NAN_MASTER_PREF]); in nl80211_start_nan()
12877 if (info->attrs[NL80211_ATTR_BANDS]) { in nl80211_start_nan()
12878 u32 bands = nla_get_u32(info->attrs[NL80211_ATTR_BANDS]); in nl80211_start_nan()
12880 if (bands & ~(u32)wdev->wiphy->nan_supported_bands) in nl80211_start_nan()
12881 return -EOPNOTSUPP; in nl80211_start_nan()
12884 return -EINVAL; in nl80211_start_nan()
12893 wdev->is_running = true; in nl80211_start_nan()
12894 rdev->opencount++; in nl80211_start_nan()
12901 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_stop_nan()
12902 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_stop_nan()
12904 if (wdev->iftype != NL80211_IFTYPE_NAN) in nl80211_stop_nan()
12905 return -EOPNOTSUPP; in nl80211_stop_nan()
12923 return -EINVAL; in validate_nan_filter()
12940 BUILD_BUG_ON(sizeof(*func->rx_filters) != sizeof(*func->tx_filters)); in handle_nan_filter()
12942 filter = kcalloc(n_entries, sizeof(*func->rx_filters), GFP_KERNEL); in handle_nan_filter()
12944 return -ENOMEM; in handle_nan_filter()
12956 func->num_tx_filters = n_entries; in handle_nan_filter()
12957 func->tx_filters = filter; in handle_nan_filter()
12959 func->num_rx_filters = n_entries; in handle_nan_filter()
12960 func->rx_filters = filter; in handle_nan_filter()
12972 return -ENOMEM; in handle_nan_filter()
12978 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_nan_add_func()
12979 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_nan_add_func()
12986 if (wdev->iftype != NL80211_IFTYPE_NAN) in nl80211_nan_add_func()
12987 return -EOPNOTSUPP; in nl80211_nan_add_func()
12990 return -ENOTCONN; in nl80211_nan_add_func()
12992 if (!info->attrs[NL80211_ATTR_NAN_FUNC]) in nl80211_nan_add_func()
12993 return -EINVAL; in nl80211_nan_add_func()
12996 info->attrs[NL80211_ATTR_NAN_FUNC], in nl80211_nan_add_func()
12998 info->extack); in nl80211_nan_add_func()
13004 return -ENOMEM; in nl80211_nan_add_func()
13006 func->cookie = cfg80211_assign_cookie(rdev); in nl80211_nan_add_func()
13009 err = -EINVAL; in nl80211_nan_add_func()
13014 func->type = nla_get_u8(tb[NL80211_NAN_FUNC_TYPE]); in nl80211_nan_add_func()
13017 err = -EINVAL; in nl80211_nan_add_func()
13021 memcpy(func->service_id, nla_data(tb[NL80211_NAN_FUNC_SERVICE_ID]), in nl80211_nan_add_func()
13022 sizeof(func->service_id)); in nl80211_nan_add_func()
13024 func->close_range = in nl80211_nan_add_func()
13028 func->serv_spec_info_len = in nl80211_nan_add_func()
13030 func->serv_spec_info = in nl80211_nan_add_func()
13032 func->serv_spec_info_len, in nl80211_nan_add_func()
13034 if (!func->serv_spec_info) { in nl80211_nan_add_func()
13035 err = -ENOMEM; in nl80211_nan_add_func()
13041 func->ttl = nla_get_u32(tb[NL80211_NAN_FUNC_TTL]); in nl80211_nan_add_func()
13043 switch (func->type) { in nl80211_nan_add_func()
13046 err = -EINVAL; in nl80211_nan_add_func()
13050 func->publish_type = in nl80211_nan_add_func()
13052 func->publish_bcast = in nl80211_nan_add_func()
13055 if ((!(func->publish_type & NL80211_NAN_SOLICITED_PUBLISH)) && in nl80211_nan_add_func()
13056 func->publish_bcast) { in nl80211_nan_add_func()
13057 err = -EINVAL; in nl80211_nan_add_func()
13062 func->subscribe_active = in nl80211_nan_add_func()
13069 err = -EINVAL; in nl80211_nan_add_func()
13073 func->followup_id = in nl80211_nan_add_func()
13075 func->followup_reqid = in nl80211_nan_add_func()
13077 memcpy(func->followup_dest.addr, in nl80211_nan_add_func()
13079 sizeof(func->followup_dest.addr)); in nl80211_nan_add_func()
13080 if (func->ttl) { in nl80211_nan_add_func()
13081 err = -EINVAL; in nl80211_nan_add_func()
13086 err = -EINVAL; in nl80211_nan_add_func()
13097 info->extack); in nl80211_nan_add_func()
13101 func->srf_include = in nl80211_nan_add_func()
13107 err = -EINVAL; in nl80211_nan_add_func()
13111 func->srf_bf_len = in nl80211_nan_add_func()
13113 func->srf_bf = in nl80211_nan_add_func()
13115 func->srf_bf_len, GFP_KERNEL); in nl80211_nan_add_func()
13116 if (!func->srf_bf) { in nl80211_nan_add_func()
13117 err = -ENOMEM; in nl80211_nan_add_func()
13121 func->srf_bf_idx = in nl80211_nan_add_func()
13129 err = -EINVAL; in nl80211_nan_add_func()
13135 err = -EINVAL; in nl80211_nan_add_func()
13139 func->srf_num_macs = n_entries; in nl80211_nan_add_func()
13140 func->srf_macs = in nl80211_nan_add_func()
13141 kcalloc(n_entries, sizeof(*func->srf_macs), in nl80211_nan_add_func()
13143 if (!func->srf_macs) { in nl80211_nan_add_func()
13144 err = -ENOMEM; in nl80211_nan_add_func()
13149 memcpy(func->srf_macs[i++].addr, nla_data(attr), in nl80211_nan_add_func()
13150 sizeof(*func->srf_macs)); in nl80211_nan_add_func()
13170 err = -ENOMEM; in nl80211_nan_add_func()
13174 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_nan_add_func()
13176 /* This can't really happen - we just allocated 4KB */ in nl80211_nan_add_func()
13178 err = -ENOMEM; in nl80211_nan_add_func()
13191 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, func->cookie, in nl80211_nan_add_func()
13200 func->instance_id)) in nl80211_nan_add_func()
13210 return -ENOBUFS; in nl80211_nan_add_func()
13216 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_nan_del_func()
13217 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_nan_del_func()
13220 if (wdev->iftype != NL80211_IFTYPE_NAN) in nl80211_nan_del_func()
13221 return -EOPNOTSUPP; in nl80211_nan_del_func()
13224 return -ENOTCONN; in nl80211_nan_del_func()
13226 if (!info->attrs[NL80211_ATTR_COOKIE]) in nl80211_nan_del_func()
13227 return -EINVAL; in nl80211_nan_del_func()
13229 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); in nl80211_nan_del_func()
13239 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_nan_change_config()
13240 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_nan_change_config()
13244 if (wdev->iftype != NL80211_IFTYPE_NAN) in nl80211_nan_change_config()
13245 return -EOPNOTSUPP; in nl80211_nan_change_config()
13248 return -ENOTCONN; in nl80211_nan_change_config()
13250 if (info->attrs[NL80211_ATTR_NAN_MASTER_PREF]) { in nl80211_nan_change_config()
13252 nla_get_u8(info->attrs[NL80211_ATTR_NAN_MASTER_PREF]); in nl80211_nan_change_config()
13254 return -EINVAL; in nl80211_nan_change_config()
13259 if (info->attrs[NL80211_ATTR_BANDS]) { in nl80211_nan_change_config()
13260 u32 bands = nla_get_u32(info->attrs[NL80211_ATTR_BANDS]); in nl80211_nan_change_config()
13262 if (bands & ~(u32)wdev->wiphy->nan_supported_bands) in nl80211_nan_change_config()
13263 return -EOPNOTSUPP; in nl80211_nan_change_config()
13266 return -EINVAL; in nl80211_nan_change_config()
13273 return -EINVAL; in nl80211_nan_change_config()
13281 struct wiphy *wiphy = wdev->wiphy; in cfg80211_nan_match()
13287 if (WARN_ON(!match->inst_id || !match->peer_inst_id || !match->addr)) in cfg80211_nan_match()
13300 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_nan_match()
13301 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, in cfg80211_nan_match()
13302 wdev->netdev->ifindex)) || in cfg80211_nan_match()
13307 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, match->cookie, in cfg80211_nan_match()
13309 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, match->addr)) in cfg80211_nan_match()
13321 if (nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, match->inst_id)) in cfg80211_nan_match()
13331 if (nla_put_u8(msg, NL80211_NAN_FUNC_TYPE, match->type) || in cfg80211_nan_match()
13332 nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, match->peer_inst_id)) in cfg80211_nan_match()
13335 if (match->info && match->info_len && in cfg80211_nan_match()
13336 nla_put(msg, NL80211_NAN_FUNC_SERVICE_INFO, match->info_len, in cfg80211_nan_match()
13337 match->info)) in cfg80211_nan_match()
13344 if (!wdev->owner_nlportid) in cfg80211_nan_match()
13345 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), in cfg80211_nan_match()
13348 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, in cfg80211_nan_match()
13349 wdev->owner_nlportid); in cfg80211_nan_match()
13363 struct wiphy *wiphy = wdev->wiphy; in cfg80211_nan_func_terminated()
13382 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_nan_func_terminated()
13383 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, in cfg80211_nan_func_terminated()
13384 wdev->netdev->ifindex)) || in cfg80211_nan_func_terminated()
13404 if (!wdev->owner_nlportid) in cfg80211_nan_func_terminated()
13405 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), in cfg80211_nan_func_terminated()
13408 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, in cfg80211_nan_func_terminated()
13409 wdev->owner_nlportid); in cfg80211_nan_func_terminated()
13426 return -ENOMEM; in nl80211_get_protocol_features()
13428 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_protocol_features()
13442 return -ENOBUFS; in nl80211_get_protocol_features()
13447 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_update_ft_ies()
13449 struct net_device *dev = info->user_ptr[1]; in nl80211_update_ft_ies()
13451 if (!rdev->ops->update_ft_ies) in nl80211_update_ft_ies()
13452 return -EOPNOTSUPP; in nl80211_update_ft_ies()
13454 if (!info->attrs[NL80211_ATTR_MDID] || in nl80211_update_ft_ies()
13455 !info->attrs[NL80211_ATTR_IE]) in nl80211_update_ft_ies()
13456 return -EINVAL; in nl80211_update_ft_ies()
13459 ft_params.md = nla_get_u16(info->attrs[NL80211_ATTR_MDID]); in nl80211_update_ft_ies()
13460 ft_params.ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_update_ft_ies()
13461 ft_params.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_update_ft_ies()
13469 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_crit_protocol_start()
13470 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_crit_protocol_start()
13475 if (!rdev->ops->crit_proto_start) in nl80211_crit_protocol_start()
13476 return -EOPNOTSUPP; in nl80211_crit_protocol_start()
13478 if (WARN_ON(!rdev->ops->crit_proto_stop)) in nl80211_crit_protocol_start()
13479 return -EINVAL; in nl80211_crit_protocol_start()
13481 if (rdev->crit_proto_nlportid) in nl80211_crit_protocol_start()
13482 return -EBUSY; in nl80211_crit_protocol_start()
13485 if (info->attrs[NL80211_ATTR_CRIT_PROT_ID]) in nl80211_crit_protocol_start()
13486 proto = nla_get_u16(info->attrs[NL80211_ATTR_CRIT_PROT_ID]); in nl80211_crit_protocol_start()
13489 return -EINVAL; in nl80211_crit_protocol_start()
13492 if (!info->attrs[NL80211_ATTR_MAX_CRIT_PROT_DURATION]) in nl80211_crit_protocol_start()
13493 return -EINVAL; in nl80211_crit_protocol_start()
13496 nla_get_u16(info->attrs[NL80211_ATTR_MAX_CRIT_PROT_DURATION]); in nl80211_crit_protocol_start()
13500 rdev->crit_proto_nlportid = info->snd_portid; in nl80211_crit_protocol_start()
13508 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_crit_protocol_stop()
13509 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_crit_protocol_stop()
13511 if (!rdev->ops->crit_proto_stop) in nl80211_crit_protocol_stop()
13512 return -EOPNOTSUPP; in nl80211_crit_protocol_stop()
13514 if (rdev->crit_proto_nlportid) { in nl80211_crit_protocol_stop()
13515 rdev->crit_proto_nlportid = 0; in nl80211_crit_protocol_stop()
13525 if (vcmd->policy == VENDOR_CMD_RAW_DATA) { in nl80211_vendor_check_policy()
13526 if (attr->nla_type & NLA_F_NESTED) { in nl80211_vendor_check_policy()
13529 return -EINVAL; in nl80211_vendor_check_policy()
13535 if (!(attr->nla_type & NLA_F_NESTED)) { in nl80211_vendor_check_policy()
13537 return -EINVAL; in nl80211_vendor_check_policy()
13540 return nla_validate_nested(attr, vcmd->maxattr, vcmd->policy, extack); in nl80211_vendor_check_policy()
13545 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_vendor_cmd()
13547 __cfg80211_wdev_from_attrs(genl_info_net(info), info->attrs); in nl80211_vendor_cmd()
13551 if (!rdev->wiphy.vendor_commands) in nl80211_vendor_cmd()
13552 return -EOPNOTSUPP; in nl80211_vendor_cmd()
13556 if (err != -EINVAL) in nl80211_vendor_cmd()
13559 } else if (wdev->wiphy != &rdev->wiphy) { in nl80211_vendor_cmd()
13560 return -EINVAL; in nl80211_vendor_cmd()
13563 if (!info->attrs[NL80211_ATTR_VENDOR_ID] || in nl80211_vendor_cmd()
13564 !info->attrs[NL80211_ATTR_VENDOR_SUBCMD]) in nl80211_vendor_cmd()
13565 return -EINVAL; in nl80211_vendor_cmd()
13567 vid = nla_get_u32(info->attrs[NL80211_ATTR_VENDOR_ID]); in nl80211_vendor_cmd()
13568 subcmd = nla_get_u32(info->attrs[NL80211_ATTR_VENDOR_SUBCMD]); in nl80211_vendor_cmd()
13569 for (i = 0; i < rdev->wiphy.n_vendor_commands; i++) { in nl80211_vendor_cmd()
13574 vcmd = &rdev->wiphy.vendor_commands[i]; in nl80211_vendor_cmd()
13576 if (vcmd->info.vendor_id != vid || vcmd->info.subcmd != subcmd) in nl80211_vendor_cmd()
13579 if (vcmd->flags & (WIPHY_VENDOR_CMD_NEED_WDEV | in nl80211_vendor_cmd()
13582 return -EINVAL; in nl80211_vendor_cmd()
13583 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_NETDEV && in nl80211_vendor_cmd()
13584 !wdev->netdev) in nl80211_vendor_cmd()
13585 return -EINVAL; in nl80211_vendor_cmd()
13587 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_RUNNING) { in nl80211_vendor_cmd()
13589 return -ENETDOWN; in nl80211_vendor_cmd()
13595 if (!vcmd->doit) in nl80211_vendor_cmd()
13596 return -EOPNOTSUPP; in nl80211_vendor_cmd()
13598 if (info->attrs[NL80211_ATTR_VENDOR_DATA]) { in nl80211_vendor_cmd()
13599 data = nla_data(info->attrs[NL80211_ATTR_VENDOR_DATA]); in nl80211_vendor_cmd()
13600 len = nla_len(info->attrs[NL80211_ATTR_VENDOR_DATA]); in nl80211_vendor_cmd()
13603 info->attrs[NL80211_ATTR_VENDOR_DATA], in nl80211_vendor_cmd()
13604 info->extack); in nl80211_vendor_cmd()
13609 rdev->cur_cmd_info = info; in nl80211_vendor_cmd()
13610 err = vcmd->doit(&rdev->wiphy, wdev, data, len); in nl80211_vendor_cmd()
13611 rdev->cur_cmd_info = NULL; in nl80211_vendor_cmd()
13615 return -EOPNOTSUPP; in nl80211_vendor_cmd()
13626 int vcmd_idx = -1; in nl80211_prepare_vendor_dump()
13631 if (cb->args[0]) { in nl80211_prepare_vendor_dump()
13633 struct wiphy *wiphy = wiphy_idx_to_wiphy(cb->args[0] - 1); in nl80211_prepare_vendor_dump()
13637 return -ENODEV; in nl80211_prepare_vendor_dump()
13641 if (cb->args[1]) { in nl80211_prepare_vendor_dump()
13642 list_for_each_entry(tmp, &wiphy->wdev_list, list) { in nl80211_prepare_vendor_dump()
13643 if (tmp->identifier == cb->args[1] - 1) { in nl80211_prepare_vendor_dump()
13656 return -ENOMEM; in nl80211_prepare_vendor_dump()
13658 err = nlmsg_parse_deprecated(cb->nlh, in nl80211_prepare_vendor_dump()
13667 err = -EINVAL; in nl80211_prepare_vendor_dump()
13671 *wdev = __cfg80211_wdev_from_attrs(sock_net(skb->sk), attrbuf); in nl80211_prepare_vendor_dump()
13675 *rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk), attrbuf); in nl80211_prepare_vendor_dump()
13684 for (i = 0; i < (*rdev)->wiphy.n_vendor_commands; i++) { in nl80211_prepare_vendor_dump()
13687 vcmd = &(*rdev)->wiphy.vendor_commands[i]; in nl80211_prepare_vendor_dump()
13689 if (vcmd->info.vendor_id != vid || vcmd->info.subcmd != subcmd) in nl80211_prepare_vendor_dump()
13692 if (!vcmd->dumpit) { in nl80211_prepare_vendor_dump()
13693 err = -EOPNOTSUPP; in nl80211_prepare_vendor_dump()
13702 err = -EOPNOTSUPP; in nl80211_prepare_vendor_dump()
13711 &(*rdev)->wiphy.vendor_commands[vcmd_idx], in nl80211_prepare_vendor_dump()
13713 cb->extack); in nl80211_prepare_vendor_dump()
13718 /* 0 is the first index - add 1 to parse only once */ in nl80211_prepare_vendor_dump()
13719 cb->args[0] = (*rdev)->wiphy_idx + 1; in nl80211_prepare_vendor_dump()
13721 cb->args[1] = *wdev ? (*wdev)->identifier + 1 : 0; in nl80211_prepare_vendor_dump()
13722 cb->args[2] = vcmd_idx; in nl80211_prepare_vendor_dump()
13723 cb->args[3] = (unsigned long)data; in nl80211_prepare_vendor_dump()
13724 cb->args[4] = data_len; in nl80211_prepare_vendor_dump()
13750 vcmd_idx = cb->args[2]; in nl80211_vendor_cmd_dump()
13751 data = (void *)cb->args[3]; in nl80211_vendor_cmd_dump()
13752 data_len = cb->args[4]; in nl80211_vendor_cmd_dump()
13753 vcmd = &rdev->wiphy.vendor_commands[vcmd_idx]; in nl80211_vendor_cmd_dump()
13755 if (vcmd->flags & (WIPHY_VENDOR_CMD_NEED_WDEV | in nl80211_vendor_cmd_dump()
13758 err = -EINVAL; in nl80211_vendor_cmd_dump()
13761 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_NETDEV && in nl80211_vendor_cmd_dump()
13762 !wdev->netdev) { in nl80211_vendor_cmd_dump()
13763 err = -EINVAL; in nl80211_vendor_cmd_dump()
13767 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_RUNNING) { in nl80211_vendor_cmd_dump()
13769 err = -ENETDOWN; in nl80211_vendor_cmd_dump()
13776 void *hdr = nl80211hdr_put(skb, NETLINK_CB(cb->skb).portid, in nl80211_vendor_cmd_dump()
13777 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_vendor_cmd_dump()
13782 if (nla_put_u32(skb, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_vendor_cmd_dump()
13797 err = vcmd->dumpit(&rdev->wiphy, wdev, skb, data, data_len, in nl80211_vendor_cmd_dump()
13798 (unsigned long *)&cb->args[5]); in nl80211_vendor_cmd_dump()
13801 if (err == -ENOBUFS || err == -ENOENT) { in nl80211_vendor_cmd_dump()
13812 err = skb->len; in nl80211_vendor_cmd_dump()
13825 if (WARN_ON(!rdev->cur_cmd_info)) in __cfg80211_alloc_reply_skb()
13829 rdev->cur_cmd_info->snd_portid, in __cfg80211_alloc_reply_skb()
13830 rdev->cur_cmd_info->snd_seq, in __cfg80211_alloc_reply_skb()
13837 struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0]; in cfg80211_vendor_cmd_reply()
13838 void *hdr = ((void **)skb->cb)[1]; in cfg80211_vendor_cmd_reply()
13839 struct nlattr *data = ((void **)skb->cb)[2]; in cfg80211_vendor_cmd_reply()
13842 memset(skb->cb, 0, sizeof(skb->cb)); in cfg80211_vendor_cmd_reply()
13844 if (WARN_ON(!rdev->cur_cmd_info)) { in cfg80211_vendor_cmd_reply()
13846 return -EINVAL; in cfg80211_vendor_cmd_reply()
13851 return genlmsg_reply(skb, rdev->cur_cmd_info); in cfg80211_vendor_cmd_reply()
13859 if (WARN_ON(!rdev->cur_cmd_info)) in cfg80211_vendor_cmd_get_sender()
13862 return rdev->cur_cmd_info->snd_portid; in cfg80211_vendor_cmd_get_sender()
13869 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_qos_map()
13871 struct net_device *dev = info->user_ptr[1]; in nl80211_set_qos_map()
13875 if (!rdev->ops->set_qos_map) in nl80211_set_qos_map()
13876 return -EOPNOTSUPP; in nl80211_set_qos_map()
13878 if (info->attrs[NL80211_ATTR_QOS_MAP]) { in nl80211_set_qos_map()
13879 pos = nla_data(info->attrs[NL80211_ATTR_QOS_MAP]); in nl80211_set_qos_map()
13880 len = nla_len(info->attrs[NL80211_ATTR_QOS_MAP]); in nl80211_set_qos_map()
13883 return -EINVAL; in nl80211_set_qos_map()
13887 return -ENOMEM; in nl80211_set_qos_map()
13889 num_des = (len - IEEE80211_QOS_MAP_LEN_MIN) >> 1; in nl80211_set_qos_map()
13893 memcpy(qos_map->dscp_exception, pos, des_len); in nl80211_set_qos_map()
13894 qos_map->num_des = num_des; in nl80211_set_qos_map()
13896 if (qos_map->dscp_exception[des].up > 7) { in nl80211_set_qos_map()
13898 return -EINVAL; in nl80211_set_qos_map()
13903 memcpy(qos_map->up, pos, IEEE80211_QOS_MAP_LEN_MIN); in nl80211_set_qos_map()
13906 wdev_lock(dev->ieee80211_ptr); in nl80211_set_qos_map()
13907 ret = nl80211_key_allowed(dev->ieee80211_ptr); in nl80211_set_qos_map()
13910 wdev_unlock(dev->ieee80211_ptr); in nl80211_set_qos_map()
13918 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_add_tx_ts()
13919 struct net_device *dev = info->user_ptr[1]; in nl80211_add_tx_ts()
13920 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_add_tx_ts()
13926 if (!(rdev->wiphy.features & NL80211_FEATURE_SUPPORTS_WMM_ADMISSION)) in nl80211_add_tx_ts()
13927 return -EOPNOTSUPP; in nl80211_add_tx_ts()
13929 if (!info->attrs[NL80211_ATTR_TSID] || !info->attrs[NL80211_ATTR_MAC] || in nl80211_add_tx_ts()
13930 !info->attrs[NL80211_ATTR_USER_PRIO]) in nl80211_add_tx_ts()
13931 return -EINVAL; in nl80211_add_tx_ts()
13933 tsid = nla_get_u8(info->attrs[NL80211_ATTR_TSID]); in nl80211_add_tx_ts()
13934 up = nla_get_u8(info->attrs[NL80211_ATTR_USER_PRIO]); in nl80211_add_tx_ts()
13936 /* WMM uses TIDs 0-7 even for TSPEC */ in nl80211_add_tx_ts()
13942 return -EINVAL; in nl80211_add_tx_ts()
13945 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_add_tx_ts()
13947 if (info->attrs[NL80211_ATTR_ADMITTED_TIME]) { in nl80211_add_tx_ts()
13949 nla_get_u16(info->attrs[NL80211_ATTR_ADMITTED_TIME]); in nl80211_add_tx_ts()
13951 return -EINVAL; in nl80211_add_tx_ts()
13955 switch (wdev->iftype) { in nl80211_add_tx_ts()
13958 if (wdev->current_bss) in nl80211_add_tx_ts()
13960 err = -ENOTCONN; in nl80211_add_tx_ts()
13963 err = -EOPNOTSUPP; in nl80211_add_tx_ts()
13976 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_del_tx_ts()
13977 struct net_device *dev = info->user_ptr[1]; in nl80211_del_tx_ts()
13978 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_del_tx_ts()
13983 if (!info->attrs[NL80211_ATTR_TSID] || !info->attrs[NL80211_ATTR_MAC]) in nl80211_del_tx_ts()
13984 return -EINVAL; in nl80211_del_tx_ts()
13986 tsid = nla_get_u8(info->attrs[NL80211_ATTR_TSID]); in nl80211_del_tx_ts()
13987 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_del_tx_ts()
13999 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_tdls_channel_switch()
14000 struct net_device *dev = info->user_ptr[1]; in nl80211_tdls_channel_switch()
14001 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_tdls_channel_switch()
14007 if (!rdev->ops->tdls_channel_switch || in nl80211_tdls_channel_switch()
14008 !(rdev->wiphy.features & NL80211_FEATURE_TDLS_CHANNEL_SWITCH)) in nl80211_tdls_channel_switch()
14009 return -EOPNOTSUPP; in nl80211_tdls_channel_switch()
14011 switch (dev->ieee80211_ptr->iftype) { in nl80211_tdls_channel_switch()
14016 return -EOPNOTSUPP; in nl80211_tdls_channel_switch()
14019 if (!info->attrs[NL80211_ATTR_MAC] || in nl80211_tdls_channel_switch()
14020 !info->attrs[NL80211_ATTR_OPER_CLASS]) in nl80211_tdls_channel_switch()
14021 return -EINVAL; in nl80211_tdls_channel_switch()
14028 * Don't allow wide channels on the 2.4Ghz band, as per IEEE802.11-2012 in nl80211_tdls_channel_switch()
14032 if (chandef.chan->band == NL80211_BAND_2GHZ && in nl80211_tdls_channel_switch()
14033 chandef.width != NL80211_CHAN_WIDTH_20_NOHT && in nl80211_tdls_channel_switch()
14034 chandef.width != NL80211_CHAN_WIDTH_20) in nl80211_tdls_channel_switch()
14035 return -EINVAL; in nl80211_tdls_channel_switch()
14038 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &chandef, in nl80211_tdls_channel_switch()
14039 wdev->iftype)) in nl80211_tdls_channel_switch()
14040 return -EINVAL; in nl80211_tdls_channel_switch()
14043 if (cfg80211_chandef_dfs_required(wdev->wiphy, &chandef, wdev->iftype)) in nl80211_tdls_channel_switch()
14044 return -EINVAL; in nl80211_tdls_channel_switch()
14046 addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_tdls_channel_switch()
14047 oper_class = nla_get_u8(info->attrs[NL80211_ATTR_OPER_CLASS]); in nl80211_tdls_channel_switch()
14059 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_tdls_cancel_channel_switch()
14060 struct net_device *dev = info->user_ptr[1]; in nl80211_tdls_cancel_channel_switch()
14061 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_tdls_cancel_channel_switch()
14064 if (!rdev->ops->tdls_channel_switch || in nl80211_tdls_cancel_channel_switch()
14065 !rdev->ops->tdls_cancel_channel_switch || in nl80211_tdls_cancel_channel_switch()
14066 !(rdev->wiphy.features & NL80211_FEATURE_TDLS_CHANNEL_SWITCH)) in nl80211_tdls_cancel_channel_switch()
14067 return -EOPNOTSUPP; in nl80211_tdls_cancel_channel_switch()
14069 switch (dev->ieee80211_ptr->iftype) { in nl80211_tdls_cancel_channel_switch()
14074 return -EOPNOTSUPP; in nl80211_tdls_cancel_channel_switch()
14077 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_tdls_cancel_channel_switch()
14078 return -EINVAL; in nl80211_tdls_cancel_channel_switch()
14080 addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_tdls_cancel_channel_switch()
14092 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_multicast_to_unicast()
14093 struct net_device *dev = info->user_ptr[1]; in nl80211_set_multicast_to_unicast()
14094 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_multicast_to_unicast()
14098 if (!rdev->ops->set_multicast_to_unicast) in nl80211_set_multicast_to_unicast()
14099 return -EOPNOTSUPP; in nl80211_set_multicast_to_unicast()
14101 if (wdev->iftype != NL80211_IFTYPE_AP && in nl80211_set_multicast_to_unicast()
14102 wdev->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_set_multicast_to_unicast()
14103 return -EOPNOTSUPP; in nl80211_set_multicast_to_unicast()
14105 nla = info->attrs[NL80211_ATTR_MULTICAST_TO_UNICAST_ENABLED]; in nl80211_set_multicast_to_unicast()
14113 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_pmk()
14114 struct net_device *dev = info->user_ptr[1]; in nl80211_set_pmk()
14115 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_pmk()
14119 if (wdev->iftype != NL80211_IFTYPE_STATION && in nl80211_set_pmk()
14120 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_set_pmk()
14121 return -EOPNOTSUPP; in nl80211_set_pmk()
14123 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_set_pmk()
14125 return -EOPNOTSUPP; in nl80211_set_pmk()
14127 if (!info->attrs[NL80211_ATTR_MAC] || !info->attrs[NL80211_ATTR_PMK]) in nl80211_set_pmk()
14128 return -EINVAL; in nl80211_set_pmk()
14131 if (!wdev->current_bss) { in nl80211_set_pmk()
14132 ret = -ENOTCONN; in nl80211_set_pmk()
14136 pmk_conf.aa = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_set_pmk()
14137 if (memcmp(pmk_conf.aa, wdev->current_bss->pub.bssid, ETH_ALEN)) { in nl80211_set_pmk()
14138 ret = -EINVAL; in nl80211_set_pmk()
14142 pmk_conf.pmk = nla_data(info->attrs[NL80211_ATTR_PMK]); in nl80211_set_pmk()
14143 pmk_conf.pmk_len = nla_len(info->attrs[NL80211_ATTR_PMK]); in nl80211_set_pmk()
14146 ret = -EINVAL; in nl80211_set_pmk()
14150 if (info->attrs[NL80211_ATTR_PMKR0_NAME]) in nl80211_set_pmk()
14152 nla_data(info->attrs[NL80211_ATTR_PMKR0_NAME]); in nl80211_set_pmk()
14162 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_del_pmk()
14163 struct net_device *dev = info->user_ptr[1]; in nl80211_del_pmk()
14164 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_del_pmk()
14168 if (wdev->iftype != NL80211_IFTYPE_STATION && in nl80211_del_pmk()
14169 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_del_pmk()
14170 return -EOPNOTSUPP; in nl80211_del_pmk()
14172 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_del_pmk()
14174 return -EOPNOTSUPP; in nl80211_del_pmk()
14176 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_del_pmk()
14177 return -EINVAL; in nl80211_del_pmk()
14180 aa = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_del_pmk()
14189 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_external_auth()
14190 struct net_device *dev = info->user_ptr[1]; in nl80211_external_auth()
14193 if (!rdev->ops->external_auth) in nl80211_external_auth()
14194 return -EOPNOTSUPP; in nl80211_external_auth()
14196 if (!info->attrs[NL80211_ATTR_SSID] && in nl80211_external_auth()
14197 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && in nl80211_external_auth()
14198 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_external_auth()
14199 return -EINVAL; in nl80211_external_auth()
14201 if (!info->attrs[NL80211_ATTR_BSSID]) in nl80211_external_auth()
14202 return -EINVAL; in nl80211_external_auth()
14204 if (!info->attrs[NL80211_ATTR_STATUS_CODE]) in nl80211_external_auth()
14205 return -EINVAL; in nl80211_external_auth()
14209 if (info->attrs[NL80211_ATTR_SSID]) { in nl80211_external_auth()
14210 params.ssid.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); in nl80211_external_auth()
14212 return -EINVAL; in nl80211_external_auth()
14214 nla_data(info->attrs[NL80211_ATTR_SSID]), in nl80211_external_auth()
14218 memcpy(params.bssid, nla_data(info->attrs[NL80211_ATTR_BSSID]), in nl80211_external_auth()
14221 params.status = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]); in nl80211_external_auth()
14223 if (info->attrs[NL80211_ATTR_PMKID]) in nl80211_external_auth()
14224 params.pmkid = nla_data(info->attrs[NL80211_ATTR_PMKID]); in nl80211_external_auth()
14231 bool dont_wait_for_ack = info->attrs[NL80211_ATTR_DONT_WAIT_FOR_ACK]; in nl80211_tx_control_port()
14232 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_tx_control_port()
14233 struct net_device *dev = info->user_ptr[1]; in nl80211_tx_control_port()
14234 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_tx_control_port()
14243 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_tx_control_port()
14245 return -EOPNOTSUPP; in nl80211_tx_control_port()
14247 if (!rdev->ops->tx_control_port) in nl80211_tx_control_port()
14248 return -EOPNOTSUPP; in nl80211_tx_control_port()
14250 if (!info->attrs[NL80211_ATTR_FRAME] || in nl80211_tx_control_port()
14251 !info->attrs[NL80211_ATTR_MAC] || in nl80211_tx_control_port()
14252 !info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]) { in nl80211_tx_control_port()
14254 return -EINVAL; in nl80211_tx_control_port()
14259 switch (wdev->iftype) { in nl80211_tx_control_port()
14267 if (wdev->current_bss) in nl80211_tx_control_port()
14269 err = -ENOTCONN; in nl80211_tx_control_port()
14272 err = -EOPNOTSUPP; in nl80211_tx_control_port()
14278 buf = nla_data(info->attrs[NL80211_ATTR_FRAME]); in nl80211_tx_control_port()
14279 len = nla_len(info->attrs[NL80211_ATTR_FRAME]); in nl80211_tx_control_port()
14280 dest = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_tx_control_port()
14281 proto = nla_get_u16(info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]); in nl80211_tx_control_port()
14283 nla_get_flag(info->attrs[NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT]); in nl80211_tx_control_port()
14289 nl_set_extack_cookie_u64(info->extack, cookie); in nl80211_tx_control_port()
14299 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_ftm_responder_stats()
14300 struct net_device *dev = info->user_ptr[1]; in nl80211_get_ftm_responder_stats()
14301 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_get_ftm_responder_stats()
14308 if (wdev->iftype != NL80211_IFTYPE_AP || !wdev->beacon_interval) in nl80211_get_ftm_responder_stats()
14309 return -EOPNOTSUPP; in nl80211_get_ftm_responder_stats()
14316 return -ENODATA; in nl80211_get_ftm_responder_stats()
14320 return -ENOMEM; in nl80211_get_ftm_responder_stats()
14322 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_ftm_responder_stats()
14327 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) in nl80211_get_ftm_responder_stats()
14364 return -ENOBUFS; in nl80211_get_ftm_responder_stats()
14369 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_update_owe_info()
14371 struct net_device *dev = info->user_ptr[1]; in nl80211_update_owe_info()
14373 if (!rdev->ops->update_owe_info) in nl80211_update_owe_info()
14374 return -EOPNOTSUPP; in nl80211_update_owe_info()
14376 if (!info->attrs[NL80211_ATTR_STATUS_CODE] || in nl80211_update_owe_info()
14377 !info->attrs[NL80211_ATTR_MAC]) in nl80211_update_owe_info()
14378 return -EINVAL; in nl80211_update_owe_info()
14381 owe_info.status = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]); in nl80211_update_owe_info()
14382 nla_memcpy(owe_info.peer, info->attrs[NL80211_ATTR_MAC], ETH_ALEN); in nl80211_update_owe_info()
14384 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_update_owe_info()
14385 owe_info.ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_update_owe_info()
14386 owe_info.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_update_owe_info()
14394 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_probe_mesh_link()
14395 struct net_device *dev = info->user_ptr[1]; in nl80211_probe_mesh_link()
14396 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_probe_mesh_link()
14403 if (!rdev->ops->probe_mesh_link || !rdev->ops->get_station) in nl80211_probe_mesh_link()
14404 return -EOPNOTSUPP; in nl80211_probe_mesh_link()
14406 if (!info->attrs[NL80211_ATTR_MAC] || in nl80211_probe_mesh_link()
14407 !info->attrs[NL80211_ATTR_FRAME]) { in nl80211_probe_mesh_link()
14409 return -EINVAL; in nl80211_probe_mesh_link()
14412 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_probe_mesh_link()
14413 return -EOPNOTSUPP; in nl80211_probe_mesh_link()
14415 dest = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_probe_mesh_link()
14416 buf = nla_data(info->attrs[NL80211_ATTR_FRAME]); in nl80211_probe_mesh_link()
14417 len = nla_len(info->attrs[NL80211_ATTR_FRAME]); in nl80211_probe_mesh_link()
14420 return -EINVAL; in nl80211_probe_mesh_link()
14423 !ether_addr_equal(buf + ETH_ALEN, dev->dev_addr)) in nl80211_probe_mesh_link()
14424 return -EINVAL; in nl80211_probe_mesh_link()
14440 struct netlink_ext_ack *extack = info->extack; in parse_tid_conf()
14445 return -EINVAL; in parse_tid_conf()
14447 tid_conf->config_override = in parse_tid_conf()
14449 tid_conf->tids = nla_get_u16(attrs[NL80211_TID_CONFIG_ATTR_TIDS]); in parse_tid_conf()
14451 if (tid_conf->config_override) { in parse_tid_conf()
14452 if (rdev->ops->reset_tid_config) { in parse_tid_conf()
14454 tid_conf->tids); in parse_tid_conf()
14458 return -EINVAL; in parse_tid_conf()
14463 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_NOACK); in parse_tid_conf()
14464 tid_conf->noack = in parse_tid_conf()
14469 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_RETRY_SHORT); in parse_tid_conf()
14470 tid_conf->retry_short = in parse_tid_conf()
14473 if (tid_conf->retry_short > rdev->wiphy.max_data_retry_count) in parse_tid_conf()
14474 return -EINVAL; in parse_tid_conf()
14478 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_RETRY_LONG); in parse_tid_conf()
14479 tid_conf->retry_long = in parse_tid_conf()
14482 if (tid_conf->retry_long > rdev->wiphy.max_data_retry_count) in parse_tid_conf()
14483 return -EINVAL; in parse_tid_conf()
14487 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_AMPDU_CTRL); in parse_tid_conf()
14488 tid_conf->ampdu = in parse_tid_conf()
14493 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL); in parse_tid_conf()
14494 tid_conf->rtscts = in parse_tid_conf()
14499 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_AMSDU_CTRL); in parse_tid_conf()
14500 tid_conf->amsdu = in parse_tid_conf()
14507 tid_conf->txrate_type = nla_get_u8(attrs[idx]); in parse_tid_conf()
14509 if (tid_conf->txrate_type != NL80211_TX_RATE_AUTOMATIC) { in parse_tid_conf()
14512 &tid_conf->txrate_mask, dev); in parse_tid_conf()
14516 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_TX_RATE); in parse_tid_conf()
14518 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE); in parse_tid_conf()
14522 mask = rdev->wiphy.tid_config_support.peer; in parse_tid_conf()
14524 mask = rdev->wiphy.tid_config_support.vif; in parse_tid_conf()
14526 if (tid_conf->mask & ~mask) { in parse_tid_conf()
14528 return -ENOTSUPP; in parse_tid_conf()
14537 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_tid_config()
14539 struct net_device *dev = info->user_ptr[1]; in nl80211_set_tid_config()
14543 int ret = -EINVAL; in nl80211_set_tid_config()
14546 if (!info->attrs[NL80211_ATTR_TID_CONFIG]) in nl80211_set_tid_config()
14547 return -EINVAL; in nl80211_set_tid_config()
14549 if (!rdev->ops->set_tid_config) in nl80211_set_tid_config()
14550 return -EOPNOTSUPP; in nl80211_set_tid_config()
14552 nla_for_each_nested(tid, info->attrs[NL80211_ATTR_TID_CONFIG], in nl80211_set_tid_config()
14559 return -ENOMEM; in nl80211_set_tid_config()
14561 tid_config->n_tid_conf = num_conf; in nl80211_set_tid_config()
14563 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_set_tid_config()
14564 tid_config->peer = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_set_tid_config()
14566 nla_for_each_nested(tid, info->attrs[NL80211_ATTR_TID_CONFIG], in nl80211_set_tid_config()
14575 &tid_config->tid_conf[conf_idx], in nl80211_set_tid_config()
14576 info, tid_config->peer); in nl80211_set_tid_config()
14608 bool rtnl = ops->internal_flags & NL80211_FLAG_NEED_RTNL; in nl80211_pre_doit()
14613 if (ops->internal_flags & NL80211_FLAG_NEED_WIPHY) { in nl80211_pre_doit()
14620 info->user_ptr[0] = rdev; in nl80211_pre_doit()
14621 } else if (ops->internal_flags & NL80211_FLAG_NEED_NETDEV || in nl80211_pre_doit()
14622 ops->internal_flags & NL80211_FLAG_NEED_WDEV) { in nl80211_pre_doit()
14626 info->attrs); in nl80211_pre_doit()
14633 dev = wdev->netdev; in nl80211_pre_doit()
14634 rdev = wiphy_to_rdev(wdev->wiphy); in nl80211_pre_doit()
14636 if (ops->internal_flags & NL80211_FLAG_NEED_NETDEV) { in nl80211_pre_doit()
14640 return -EINVAL; in nl80211_pre_doit()
14643 info->user_ptr[1] = dev; in nl80211_pre_doit()
14645 info->user_ptr[1] = wdev; in nl80211_pre_doit()
14648 if (ops->internal_flags & NL80211_FLAG_CHECK_NETDEV_UP && in nl80211_pre_doit()
14652 return -ENETDOWN; in nl80211_pre_doit()
14658 info->user_ptr[0] = rdev; in nl80211_pre_doit()
14667 if (info->user_ptr[1]) { in nl80211_post_doit()
14668 if (ops->internal_flags & NL80211_FLAG_NEED_WDEV) { in nl80211_post_doit()
14669 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_post_doit()
14671 if (wdev->netdev) in nl80211_post_doit()
14672 dev_put(wdev->netdev); in nl80211_post_doit()
14674 dev_put(info->user_ptr[1]); in nl80211_post_doit()
14678 if (ops->internal_flags & NL80211_FLAG_NEED_RTNL) in nl80211_post_doit()
14686 if (ops->internal_flags & NL80211_FLAG_CLEAR_SKB) { in nl80211_post_doit()
15595 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_notify_wiphy()
15614 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_notify_iface()
15621 struct cfg80211_scan_request *req = rdev->scan_req; in nl80211_add_scan_req()
15632 for (i = 0; i < req->n_ssids; i++) { in nl80211_add_scan_req()
15633 if (nla_put(msg, i, req->ssids[i].ssid_len, req->ssids[i].ssid)) in nl80211_add_scan_req()
15638 if (req->flags & NL80211_SCAN_FLAG_FREQ_KHZ) { in nl80211_add_scan_req()
15642 for (i = 0; i < req->n_channels; i++) { in nl80211_add_scan_req()
15644 ieee80211_channel_to_khz(req->channels[i]))) in nl80211_add_scan_req()
15653 for (i = 0; i < req->n_channels; i++) { in nl80211_add_scan_req()
15654 if (nla_put_u32(msg, i, req->channels[i]->center_freq)) in nl80211_add_scan_req()
15660 if (req->ie && in nl80211_add_scan_req()
15661 nla_put(msg, NL80211_ATTR_IE, req->ie_len, req->ie)) in nl80211_add_scan_req()
15664 if (req->flags && in nl80211_add_scan_req()
15665 nla_put_u32(msg, NL80211_ATTR_SCAN_FLAGS, req->flags)) in nl80211_add_scan_req()
15668 info = rdev->int_scan_req ? &rdev->int_scan_req->info : in nl80211_add_scan_req()
15669 &rdev->scan_req->info; in nl80211_add_scan_req()
15670 if (info->scan_start_tsf && in nl80211_add_scan_req()
15672 info->scan_start_tsf, NL80211_BSS_PAD) || in nl80211_add_scan_req()
15674 info->tsf_bssid))) in nl80211_add_scan_req()
15679 return -ENOBUFS; in nl80211_add_scan_req()
15692 return -1; in nl80211_prep_scan_msg()
15694 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_prep_scan_msg()
15695 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, in nl80211_prep_scan_msg()
15696 wdev->netdev->ifindex)) || in nl80211_prep_scan_msg()
15709 return -EMSGSIZE; in nl80211_prep_scan_msg()
15720 return -1; in nl80211_prep_sched_scan_msg()
15723 wiphy_to_rdev(req->wiphy)->wiphy_idx) || in nl80211_prep_sched_scan_msg()
15724 nla_put_u32(msg, NL80211_ATTR_IFINDEX, req->dev->ifindex) || in nl80211_prep_sched_scan_msg()
15725 nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, req->reqid, in nl80211_prep_sched_scan_msg()
15734 return -EMSGSIZE; in nl80211_prep_sched_scan_msg()
15752 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_scan_start()
15782 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_scan_msg()
15799 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(req->wiphy), msg, 0, in nl80211_send_sched_scan()
15807 if (nla_put_u8(msg, NL80211_ATTR_REG_INITIATOR, request->initiator)) in nl80211_reg_change_event_fill()
15810 if (request->alpha2[0] == '0' && request->alpha2[1] == '0') { in nl80211_reg_change_event_fill()
15814 } else if (request->alpha2[0] == '9' && request->alpha2[1] == '9') { in nl80211_reg_change_event_fill()
15818 } else if ((request->alpha2[0] == '9' && request->alpha2[1] == '8') || in nl80211_reg_change_event_fill()
15819 request->intersect) { in nl80211_reg_change_event_fill()
15827 request->alpha2)) in nl80211_reg_change_event_fill()
15831 if (request->wiphy_idx != WIPHY_IDX_INVALID) { in nl80211_reg_change_event_fill()
15832 struct wiphy *wiphy = wiphy_idx_to_wiphy(request->wiphy_idx); in nl80211_reg_change_event_fill()
15835 nla_put_u32(msg, NL80211_ATTR_WIPHY, request->wiphy_idx)) in nl80211_reg_change_event_fill()
15839 wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED && in nl80211_reg_change_event_fill()
15904 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_mlme_event()
15905 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_send_mlme_event()
15926 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_mlme_event()
15939 NL80211_CMD_AUTHENTICATE, gfp, -1, NULL, 0); in nl80211_send_rx_auth()
15957 NL80211_CMD_DEAUTHENTICATE, gfp, -1, NULL, 0); in nl80211_send_deauth()
15965 NL80211_CMD_DISASSOCIATE, gfp, -1, NULL, 0); in nl80211_send_disassoc()
15971 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_rx_unprot_mlme_mgmt()
15972 struct wiphy *wiphy = wdev->wiphy; in cfg80211_rx_unprot_mlme_mgmt()
15980 if (ieee80211_is_deauth(mgmt->frame_control)) { in cfg80211_rx_unprot_mlme_mgmt()
15982 } else if (ieee80211_is_disassoc(mgmt->frame_control)) { in cfg80211_rx_unprot_mlme_mgmt()
15984 } else if (ieee80211_is_beacon(mgmt->frame_control)) { in cfg80211_rx_unprot_mlme_mgmt()
15985 if (wdev->unprot_beacon_reported && in cfg80211_rx_unprot_mlme_mgmt()
15986 elapsed_jiffies_msecs(wdev->unprot_beacon_reported) < 10000) in cfg80211_rx_unprot_mlme_mgmt()
15989 wdev->unprot_beacon_reported = jiffies; in cfg80211_rx_unprot_mlme_mgmt()
15995 nl80211_send_mlme_event(rdev, dev, buf, len, cmd, GFP_ATOMIC, -1, in cfg80211_rx_unprot_mlme_mgmt()
16017 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_mlme_timeout()
16018 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_send_mlme_timeout()
16025 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_mlme_timeout()
16057 msg = nlmsg_new(100 + cr->req_ie_len + cr->resp_ie_len + in nl80211_send_connect_result()
16058 cr->fils.kek_len + cr->fils.pmk_len + in nl80211_send_connect_result()
16059 (cr->fils.pmkid ? WLAN_PMKID_LEN : 0), gfp); in nl80211_send_connect_result()
16069 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_connect_result()
16070 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_send_connect_result()
16071 (cr->bssid && in nl80211_send_connect_result()
16072 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, cr->bssid)) || in nl80211_send_connect_result()
16074 cr->status < 0 ? WLAN_STATUS_UNSPECIFIED_FAILURE : in nl80211_send_connect_result()
16075 cr->status) || in nl80211_send_connect_result()
16076 (cr->status < 0 && in nl80211_send_connect_result()
16079 cr->timeout_reason))) || in nl80211_send_connect_result()
16080 (cr->req_ie && in nl80211_send_connect_result()
16081 nla_put(msg, NL80211_ATTR_REQ_IE, cr->req_ie_len, cr->req_ie)) || in nl80211_send_connect_result()
16082 (cr->resp_ie && in nl80211_send_connect_result()
16083 nla_put(msg, NL80211_ATTR_RESP_IE, cr->resp_ie_len, in nl80211_send_connect_result()
16084 cr->resp_ie)) || in nl80211_send_connect_result()
16085 (cr->fils.update_erp_next_seq_num && in nl80211_send_connect_result()
16087 cr->fils.erp_next_seq_num)) || in nl80211_send_connect_result()
16088 (cr->status == WLAN_STATUS_SUCCESS && in nl80211_send_connect_result()
16089 ((cr->fils.kek && in nl80211_send_connect_result()
16090 nla_put(msg, NL80211_ATTR_FILS_KEK, cr->fils.kek_len, in nl80211_send_connect_result()
16091 cr->fils.kek)) || in nl80211_send_connect_result()
16092 (cr->fils.pmk && in nl80211_send_connect_result()
16093 nla_put(msg, NL80211_ATTR_PMK, cr->fils.pmk_len, cr->fils.pmk)) || in nl80211_send_connect_result()
16094 (cr->fils.pmkid && in nl80211_send_connect_result()
16095 nla_put(msg, NL80211_ATTR_PMKID, WLAN_PMKID_LEN, cr->fils.pmkid))))) in nl80211_send_connect_result()
16100 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_connect_result()
16114 const u8 *bssid = info->bss ? info->bss->bssid : info->bssid; in nl80211_send_roamed()
16116 msg = nlmsg_new(100 + info->req_ie_len + info->resp_ie_len + in nl80211_send_roamed()
16117 info->fils.kek_len + info->fils.pmk_len + in nl80211_send_roamed()
16118 (info->fils.pmkid ? WLAN_PMKID_LEN : 0), gfp); in nl80211_send_roamed()
16128 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_roamed()
16129 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_send_roamed()
16131 (info->req_ie && in nl80211_send_roamed()
16132 nla_put(msg, NL80211_ATTR_REQ_IE, info->req_ie_len, in nl80211_send_roamed()
16133 info->req_ie)) || in nl80211_send_roamed()
16134 (info->resp_ie && in nl80211_send_roamed()
16135 nla_put(msg, NL80211_ATTR_RESP_IE, info->resp_ie_len, in nl80211_send_roamed()
16136 info->resp_ie)) || in nl80211_send_roamed()
16137 (info->fils.update_erp_next_seq_num && in nl80211_send_roamed()
16139 info->fils.erp_next_seq_num)) || in nl80211_send_roamed()
16140 (info->fils.kek && in nl80211_send_roamed()
16141 nla_put(msg, NL80211_ATTR_FILS_KEK, info->fils.kek_len, in nl80211_send_roamed()
16142 info->fils.kek)) || in nl80211_send_roamed()
16143 (info->fils.pmk && in nl80211_send_roamed()
16144 nla_put(msg, NL80211_ATTR_PMK, info->fils.pmk_len, info->fils.pmk)) || in nl80211_send_roamed()
16145 (info->fils.pmkid && in nl80211_send_roamed()
16146 nla_put(msg, NL80211_ATTR_PMKID, WLAN_PMKID_LEN, info->fils.pmkid))) in nl80211_send_roamed()
16151 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_roamed()
16175 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_port_authorized()
16176 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_send_port_authorized()
16182 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_port_authorized()
16207 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_disconnected()
16208 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_send_disconnected()
16218 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_disconnected()
16243 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_ibss_bssid()
16244 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_send_ibss_bssid()
16250 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_ibss_bssid()
16262 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_notify_new_peer_candidate()
16263 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_notify_new_peer_candidate()
16267 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_MESH_POINT)) in cfg80211_notify_new_peer_candidate()
16282 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_notify_new_peer_candidate()
16283 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in cfg80211_notify_new_peer_candidate()
16293 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_notify_new_peer_candidate()
16320 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_michael_mic_failure()
16321 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_michael_mic_failure()
16324 (key_id != -1 && in nl80211_michael_mic_failure()
16331 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_michael_mic_failure()
16414 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_remain_on_chan_event()
16415 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, in nl80211_send_remain_on_chan_event()
16416 wdev->netdev->ifindex)) || in nl80211_send_remain_on_chan_event()
16419 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, chan->center_freq) || in nl80211_send_remain_on_chan_event()
16432 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_remain_on_chan_event()
16444 struct wiphy *wiphy = wdev->wiphy; in cfg80211_ready_on_channel()
16458 struct wiphy *wiphy = wdev->wiphy; in cfg80211_remain_on_channel_expired()
16471 struct wiphy *wiphy = wdev->wiphy; in cfg80211_tx_mgmt_expired()
16483 struct wiphy *wiphy = dev->ieee80211_ptr->wiphy; in cfg80211_new_sta()
16499 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_new_sta()
16507 struct wiphy *wiphy = dev->ieee80211_ptr->wiphy; in cfg80211_del_sta_sinfo()
16529 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_del_sta_sinfo()
16538 struct wiphy *wiphy = dev->ieee80211_ptr->wiphy; in cfg80211_conn_failed()
16553 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in cfg80211_conn_failed()
16560 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_conn_failed()
16572 struct wireless_dev *wdev = dev->ieee80211_ptr; in __nl80211_unexpected_frame()
16573 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in __nl80211_unexpected_frame()
16576 u32 nlportid = READ_ONCE(wdev->ap_unexpected_nlportid); in __nl80211_unexpected_frame()
16591 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in __nl80211_unexpected_frame()
16592 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in __nl80211_unexpected_frame()
16597 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); in __nl80211_unexpected_frame()
16608 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_rx_spurious_frame()
16613 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP && in cfg80211_rx_spurious_frame()
16614 wdev->iftype != NL80211_IFTYPE_P2P_GO)) { in cfg80211_rx_spurious_frame()
16628 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_rx_unexpected_4addr_frame()
16633 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP && in cfg80211_rx_unexpected_4addr_frame()
16634 wdev->iftype != NL80211_IFTYPE_P2P_GO && in cfg80211_rx_unexpected_4addr_frame()
16635 wdev->iftype != NL80211_IFTYPE_AP_VLAN)) { in cfg80211_rx_unexpected_4addr_frame()
16652 struct net_device *netdev = wdev->netdev; in nl80211_send_mgmt()
16658 return -ENOMEM; in nl80211_send_mgmt()
16663 return -ENOMEM; in nl80211_send_mgmt()
16666 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_mgmt()
16668 netdev->ifindex)) || in nl80211_send_mgmt()
16682 return genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); in nl80211_send_mgmt()
16686 return -ENOBUFS; in nl80211_send_mgmt()
16693 struct wiphy *wiphy = wdev->wiphy; in nl80211_frame_tx_status()
16695 struct net_device *netdev = wdev->netdev; in nl80211_frame_tx_status()
16714 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_frame_tx_status()
16716 netdev->ifindex)) || in nl80211_frame_tx_status()
16727 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_frame_tx_status()
16756 struct wireless_dev *wdev = dev->ieee80211_ptr; in __nl80211_rx_control_port()
16757 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in __nl80211_rx_control_port()
16759 const u8 *addr = ehdr->h_source; in __nl80211_rx_control_port()
16760 u16 proto = be16_to_cpu(skb->protocol); in __nl80211_rx_control_port()
16765 u32 nlportid = READ_ONCE(wdev->conn_owner_nlportid); in __nl80211_rx_control_port()
16768 return -ENOENT; in __nl80211_rx_control_port()
16770 msg = nlmsg_new(100 + skb->len, gfp); in __nl80211_rx_control_port()
16772 return -ENOMEM; in __nl80211_rx_control_port()
16777 return -ENOBUFS; in __nl80211_rx_control_port()
16780 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in __nl80211_rx_control_port()
16781 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in __nl80211_rx_control_port()
16790 frame = nla_reserve(msg, NL80211_ATTR_FRAME, skb->len); in __nl80211_rx_control_port()
16794 skb_copy_bits(skb, 0, nla_data(frame), skb->len); in __nl80211_rx_control_port()
16797 return genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); in __nl80211_rx_control_port()
16801 return -ENOBUFS; in __nl80211_rx_control_port()
16819 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_prepare_cqm()
16820 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_prepare_cqm()
16827 cb = (void **)msg->cb; in cfg80211_prepare_cqm()
16835 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_prepare_cqm()
16836 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) in cfg80211_prepare_cqm()
16856 void **cb = (void **)msg->cb; in cfg80211_send_cqm()
16862 memset(msg->cb, 0, sizeof(msg->cb)); in cfg80211_send_cqm()
16864 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_send_cqm()
16873 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_cqm_rssi_notify()
16874 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_cqm_rssi_notify()
16882 if (wdev->cqm_config) { in cfg80211_cqm_rssi_notify()
16883 wdev->cqm_config->last_rssi_event_value = rssi_level; in cfg80211_cqm_rssi_notify()
16888 rssi_level = wdev->cqm_config->last_rssi_event_value; in cfg80211_cqm_rssi_notify()
16998 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_gtk_rekey_notify()
16999 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_gtk_rekey_notify()
17015 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_gtk_rekey_notify()
17026 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_gtk_rekey_notify()
17027 struct wiphy *wiphy = wdev->wiphy; in cfg80211_gtk_rekey_notify()
17054 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_pmksa_candidate_notify()
17055 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex)) in nl80211_pmksa_candidate_notify()
17072 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_pmksa_candidate_notify()
17083 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_pmksa_candidate_notify()
17084 struct wiphy *wiphy = wdev->wiphy; in cfg80211_pmksa_candidate_notify()
17112 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex)) in nl80211_ch_switch_notify()
17124 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_ch_switch_notify()
17135 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_ch_switch_notify()
17136 struct wiphy *wiphy = wdev->wiphy; in cfg80211_ch_switch_notify()
17143 wdev->chandef = *chandef; in cfg80211_ch_switch_notify()
17144 wdev->preset_chandef = *chandef; in cfg80211_ch_switch_notify()
17146 if ((wdev->iftype == NL80211_IFTYPE_STATION || in cfg80211_ch_switch_notify()
17147 wdev->iftype == NL80211_IFTYPE_P2P_CLIENT) && in cfg80211_ch_switch_notify()
17148 !WARN_ON(!wdev->current_bss)) in cfg80211_ch_switch_notify()
17149 cfg80211_update_assoc_bss_entry(wdev, chandef->chan); in cfg80211_ch_switch_notify()
17162 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_ch_switch_started_notify()
17163 struct wiphy *wiphy = wdev->wiphy; in cfg80211_ch_switch_started_notify()
17192 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx)) in nl80211_radar_notify()
17197 struct wireless_dev *wdev = netdev->ieee80211_ptr; in nl80211_radar_notify()
17199 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_radar_notify()
17213 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_radar_notify()
17226 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_sta_opmode_change_notify()
17227 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_sta_opmode_change_notify()
17243 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx)) in cfg80211_sta_opmode_change_notify()
17246 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) in cfg80211_sta_opmode_change_notify()
17252 if ((sta_opmode->changed & STA_OPMODE_SMPS_MODE_CHANGED) && in cfg80211_sta_opmode_change_notify()
17253 nla_put_u8(msg, NL80211_ATTR_SMPS_MODE, sta_opmode->smps_mode)) in cfg80211_sta_opmode_change_notify()
17256 if ((sta_opmode->changed & STA_OPMODE_MAX_BW_CHANGED) && in cfg80211_sta_opmode_change_notify()
17257 nla_put_u32(msg, NL80211_ATTR_CHANNEL_WIDTH, sta_opmode->bw)) in cfg80211_sta_opmode_change_notify()
17260 if ((sta_opmode->changed & STA_OPMODE_N_SS_CHANGED) && in cfg80211_sta_opmode_change_notify()
17261 nla_put_u8(msg, NL80211_ATTR_NSS, sta_opmode->rx_nss)) in cfg80211_sta_opmode_change_notify()
17266 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_sta_opmode_change_notify()
17280 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_probe_status()
17281 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_probe_status()
17298 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_probe_status()
17299 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in cfg80211_probe_status()
17310 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_probe_status()
17329 spin_lock_bh(&rdev->beacon_registrations_lock); in cfg80211_report_obss_beacon_khz()
17330 list_for_each_entry(reg, &rdev->beacon_registrations, list) { in cfg80211_report_obss_beacon_khz()
17333 spin_unlock_bh(&rdev->beacon_registrations_lock); in cfg80211_report_obss_beacon_khz()
17341 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_report_obss_beacon_khz()
17354 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, reg->nlportid); in cfg80211_report_obss_beacon_khz()
17356 spin_unlock_bh(&rdev->beacon_registrations_lock); in cfg80211_report_obss_beacon_khz()
17360 spin_unlock_bh(&rdev->beacon_registrations_lock); in cfg80211_report_obss_beacon_khz()
17369 struct cfg80211_wowlan_nd_info *nd = wakeup->net_detect; in cfg80211_net_detect_results()
17376 return -EMSGSIZE; in cfg80211_net_detect_results()
17378 for (i = 0; i < nd->n_matches; i++) { in cfg80211_net_detect_results()
17379 struct cfg80211_wowlan_nd_match *match = nd->matches[i]; in cfg80211_net_detect_results()
17392 if (nla_put(msg, NL80211_ATTR_SSID, match->ssid.ssid_len, in cfg80211_net_detect_results()
17393 match->ssid.ssid)) { in cfg80211_net_detect_results()
17398 if (match->n_channels) { in cfg80211_net_detect_results()
17406 for (j = 0; j < match->n_channels; j++) { in cfg80211_net_detect_results()
17407 if (nla_put_u32(msg, j, match->channels[j])) { in cfg80211_net_detect_results()
17429 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_report_wowlan_wakeup()
17434 trace_cfg80211_report_wowlan_wakeup(wdev->wiphy, wdev, wakeup); in cfg80211_report_wowlan_wakeup()
17437 size += wakeup->packet_present_len; in cfg80211_report_wowlan_wakeup()
17447 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_report_wowlan_wakeup()
17452 if (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, in cfg80211_report_wowlan_wakeup()
17453 wdev->netdev->ifindex)) in cfg80211_report_wowlan_wakeup()
17464 if (wakeup->disconnect && in cfg80211_report_wowlan_wakeup()
17467 if (wakeup->magic_pkt && in cfg80211_report_wowlan_wakeup()
17470 if (wakeup->gtk_rekey_failure && in cfg80211_report_wowlan_wakeup()
17473 if (wakeup->eap_identity_req && in cfg80211_report_wowlan_wakeup()
17476 if (wakeup->four_way_handshake && in cfg80211_report_wowlan_wakeup()
17479 if (wakeup->rfkill_release && in cfg80211_report_wowlan_wakeup()
17483 if (wakeup->pattern_idx >= 0 && in cfg80211_report_wowlan_wakeup()
17485 wakeup->pattern_idx)) in cfg80211_report_wowlan_wakeup()
17488 if (wakeup->tcp_match && in cfg80211_report_wowlan_wakeup()
17492 if (wakeup->tcp_connlost && in cfg80211_report_wowlan_wakeup()
17496 if (wakeup->tcp_nomoretokens && in cfg80211_report_wowlan_wakeup()
17501 if (wakeup->packet) { in cfg80211_report_wowlan_wakeup()
17505 if (!wakeup->packet_80211) { in cfg80211_report_wowlan_wakeup()
17512 if (wakeup->packet_len && in cfg80211_report_wowlan_wakeup()
17513 nla_put_u32(msg, len_attr, wakeup->packet_len)) in cfg80211_report_wowlan_wakeup()
17516 if (nla_put(msg, pkt_attr, wakeup->packet_present_len, in cfg80211_report_wowlan_wakeup()
17517 wakeup->packet)) in cfg80211_report_wowlan_wakeup()
17521 if (wakeup->net_detect && in cfg80211_report_wowlan_wakeup()
17530 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_report_wowlan_wakeup()
17544 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_tdls_oper_request()
17545 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_tdls_oper_request()
17549 trace_cfg80211_tdls_oper_request(wdev->wiphy, dev, peer, oper, in cfg80211_tdls_oper_request()
17562 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_tdls_oper_request()
17563 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in cfg80211_tdls_oper_request()
17572 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_tdls_oper_request()
17590 if (state != NETLINK_URELEASE || notify->protocol != NETLINK_GENERIC) in nl80211_netlink_notify()
17599 &rdev->sched_scan_req_list, in nl80211_netlink_notify()
17601 if (sched_scan_req->owner_nlportid == notify->portid) { in nl80211_netlink_notify()
17602 sched_scan_req->nl_owner_dead = true; in nl80211_netlink_notify()
17603 schedule_work(&rdev->sched_scan_stop_wk); in nl80211_netlink_notify()
17607 list_for_each_entry_rcu(wdev, &rdev->wiphy.wdev_list, list) { in nl80211_netlink_notify()
17608 cfg80211_mlme_unregister_socket(wdev, notify->portid); in nl80211_netlink_notify()
17610 if (wdev->owner_nlportid == notify->portid) { in nl80211_netlink_notify()
17611 wdev->nl_owner_dead = true; in nl80211_netlink_notify()
17612 schedule_work(&rdev->destroy_work); in nl80211_netlink_notify()
17613 } else if (wdev->conn_owner_nlportid == notify->portid) { in nl80211_netlink_notify()
17614 schedule_work(&wdev->disconnect_wk); in nl80211_netlink_notify()
17617 cfg80211_release_pmsr(wdev, notify->portid); in nl80211_netlink_notify()
17620 spin_lock_bh(&rdev->beacon_registrations_lock); in nl80211_netlink_notify()
17621 list_for_each_entry_safe(reg, tmp, &rdev->beacon_registrations, in nl80211_netlink_notify()
17623 if (reg->nlportid == notify->portid) { in nl80211_netlink_notify()
17624 list_del(®->list); in nl80211_netlink_notify()
17629 spin_unlock_bh(&rdev->beacon_registrations_lock); in nl80211_netlink_notify()
17638 regulatory_netlink_notify(notify->portid); in nl80211_netlink_notify()
17649 struct wiphy *wiphy = netdev->ieee80211_ptr->wiphy; in cfg80211_ft_event()
17656 if (!ft_event->target_ap) in cfg80211_ft_event()
17659 msg = nlmsg_new(100 + ft_event->ies_len + ft_event->ric_ies_len, in cfg80211_ft_event()
17668 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_ft_event()
17669 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in cfg80211_ft_event()
17670 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, ft_event->target_ap)) in cfg80211_ft_event()
17673 if (ft_event->ies && in cfg80211_ft_event()
17674 nla_put(msg, NL80211_ATTR_IE, ft_event->ies_len, ft_event->ies)) in cfg80211_ft_event()
17676 if (ft_event->ric_ies && in cfg80211_ft_event()
17677 nla_put(msg, NL80211_ATTR_IE_RIC, ft_event->ric_ies_len, in cfg80211_ft_event()
17678 ft_event->ric_ies)) in cfg80211_ft_event()
17683 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_ft_event()
17698 rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_crit_proto_stopped()
17699 if (!rdev->crit_proto_nlportid) in cfg80211_crit_proto_stopped()
17702 nlportid = rdev->crit_proto_nlportid; in cfg80211_crit_proto_stopped()
17703 rdev->crit_proto_nlportid = 0; in cfg80211_crit_proto_stopped()
17713 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_crit_proto_stopped()
17720 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); in cfg80211_crit_proto_stopped()
17730 struct wiphy *wiphy = wdev->wiphy; in nl80211_send_ap_stopped()
17743 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_ap_stopped()
17744 nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex) || in nl80211_send_ap_stopped()
17762 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_external_auth_request()
17763 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_external_auth_request()
17767 if (!wdev->conn_owner_nlportid) in cfg80211_external_auth_request()
17768 return -EINVAL; in cfg80211_external_auth_request()
17772 return -ENOMEM; in cfg80211_external_auth_request()
17778 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_external_auth_request()
17779 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in cfg80211_external_auth_request()
17780 nla_put_u32(msg, NL80211_ATTR_AKM_SUITES, params->key_mgmt_suite) || in cfg80211_external_auth_request()
17782 params->action) || in cfg80211_external_auth_request()
17783 nla_put(msg, NL80211_ATTR_BSSID, ETH_ALEN, params->bssid) || in cfg80211_external_auth_request()
17784 nla_put(msg, NL80211_ATTR_SSID, params->ssid.ssid_len, in cfg80211_external_auth_request()
17785 params->ssid.ssid)) in cfg80211_external_auth_request()
17789 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, in cfg80211_external_auth_request()
17790 wdev->conn_owner_nlportid); in cfg80211_external_auth_request()
17795 return -ENOBUFS; in cfg80211_external_auth_request()
17803 struct wiphy *wiphy = netdev->ieee80211_ptr->wiphy; in cfg80211_update_owe_info_event()
17818 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_update_owe_info_event()
17819 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in cfg80211_update_owe_info_event()
17820 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, owe_info->peer)) in cfg80211_update_owe_info_event()
17823 if (!owe_info->ie_len || in cfg80211_update_owe_info_event()
17824 nla_put(msg, NL80211_ATTR_IE, owe_info->ie_len, owe_info->ie)) in cfg80211_update_owe_info_event()
17829 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_update_owe_info_event()