Lines Matching +full:tx +full:- +full:level +full:- +full:trig

1 // SPDX-License-Identifier: GPL-2.0-only
3 * This is the new netlink-based wireless configuration interface.
5 * Copyright 2006-2010 Johannes Berg <johannes@sipsolutions.net>
6 * Copyright 2013-2014 Intel Mobile Communications GmbH
7 * Copyright 2015-2017 Intel Deutschland GmbH
8 * Copyright (C) 2018-2020 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()
212 bool s1g_bcn = ieee80211_is_s1g_beacon(mgmt->frame_control); in validate_beacon_head()
228 if (ieee80211_hdrlen(mgmt->frame_control) != hdrlen) in validate_beacon_head()
232 len -= fixedlen; in validate_beacon_head()
243 return -EINVAL; in validate_beacon_head()
261 return -EINVAL; in validate_ie_attr()
406 .len = 20-1 },
432 [NL80211_ATTR_IFNAME] = { .type = NLA_NUL_STRING, .len = IFNAMSIZ-1 },
462 NLA_POLICY_MAX(NLA_U8, NUM_NL80211_PLINK_ACTIONS - 1),
541 NLA_POLICY_MAX(NLA_U8, NUM_NL80211_PLINK_STATES - 1),
636 [NL80211_ATTR_TSID] = NLA_POLICY_MAX(NLA_U8, IEEE80211_NUM_TIDS - 1),
638 NLA_POLICY_MAX(NLA_U8, IEEE80211_NUM_UPS - 1),
650 NLA_POLICY_MAX(NLA_U8, NUM_NL80211_P2P_PS_STATUS - 1),
698 [NL80211_ATTR_VLAN_ID] = NLA_POLICY_RANGE(NLA_U16, 1, VLAN_N_VID - 2),
728 [NL80211_KEY_TYPE] = NLA_POLICY_MAX(NLA_U32, NUM_NL80211_KEYTYPES - 1),
883 if (!cb->args[0]) { in nl80211_prepare_wdev_dump()
889 return -ENOMEM; in nl80211_prepare_wdev_dump()
891 err = nlmsg_parse_deprecated(cb->nlh, in nl80211_prepare_wdev_dump()
900 *wdev = __cfg80211_wdev_from_attrs(sock_net(cb->skb->sk), in nl80211_prepare_wdev_dump()
905 *rdev = wiphy_to_rdev((*wdev)->wiphy); in nl80211_prepare_wdev_dump()
906 /* 0 is the first index - add 1 to parse only once */ in nl80211_prepare_wdev_dump()
907 cb->args[0] = (*rdev)->wiphy_idx + 1; in nl80211_prepare_wdev_dump()
908 cb->args[1] = (*wdev)->identifier; in nl80211_prepare_wdev_dump()
911 struct wiphy *wiphy = wiphy_idx_to_wiphy(cb->args[0] - 1); in nl80211_prepare_wdev_dump()
915 return -ENODEV; in nl80211_prepare_wdev_dump()
919 list_for_each_entry(tmp, &(*rdev)->wiphy.wdev_list, list) { in nl80211_prepare_wdev_dump()
920 if (tmp->identifier == cb->args[1]) { in nl80211_prepare_wdev_dump()
927 return -ENODEV; in nl80211_prepare_wdev_dump()
958 rule->wmm_rule.client[j].cw_min) || in nl80211_msg_put_wmm_rules()
960 rule->wmm_rule.client[j].cw_max) || in nl80211_msg_put_wmm_rules()
962 rule->wmm_rule.client[j].aifsn) || in nl80211_msg_put_wmm_rules()
964 rule->wmm_rule.client[j].cot)) in nl80211_msg_put_wmm_rules()
974 return -ENOBUFS; in nl80211_msg_put_wmm_rules()
982 * list to protect old user-space tools from breaking in nl80211_msg_put_channel()
984 if (!large && chan->flags & in nl80211_msg_put_channel()
987 if (!large && chan->freq_offset) in nl80211_msg_put_channel()
991 chan->center_freq)) in nl80211_msg_put_channel()
994 if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_OFFSET, chan->freq_offset)) in nl80211_msg_put_channel()
997 if ((chan->flags & IEEE80211_CHAN_DISABLED) && in nl80211_msg_put_channel()
1000 if (chan->flags & IEEE80211_CHAN_NO_IR) { in nl80211_msg_put_channel()
1006 if (chan->flags & IEEE80211_CHAN_RADAR) { in nl80211_msg_put_channel()
1012 time = elapsed_jiffies_msecs(chan->dfs_state_entered); in nl80211_msg_put_channel()
1015 chan->dfs_state)) in nl80211_msg_put_channel()
1022 chan->dfs_cac_ms)) in nl80211_msg_put_channel()
1028 if ((chan->flags & IEEE80211_CHAN_NO_HT40MINUS) && in nl80211_msg_put_channel()
1031 if ((chan->flags & IEEE80211_CHAN_NO_HT40PLUS) && in nl80211_msg_put_channel()
1034 if ((chan->flags & IEEE80211_CHAN_NO_80MHZ) && in nl80211_msg_put_channel()
1037 if ((chan->flags & IEEE80211_CHAN_NO_160MHZ) && in nl80211_msg_put_channel()
1040 if ((chan->flags & IEEE80211_CHAN_INDOOR_ONLY) && in nl80211_msg_put_channel()
1043 if ((chan->flags & IEEE80211_CHAN_IR_CONCURRENT) && in nl80211_msg_put_channel()
1046 if ((chan->flags & IEEE80211_CHAN_NO_20MHZ) && in nl80211_msg_put_channel()
1049 if ((chan->flags & IEEE80211_CHAN_NO_10MHZ) && in nl80211_msg_put_channel()
1052 if ((chan->flags & IEEE80211_CHAN_NO_HE) && in nl80211_msg_put_channel()
1055 if ((chan->flags & IEEE80211_CHAN_1MHZ) && in nl80211_msg_put_channel()
1058 if ((chan->flags & IEEE80211_CHAN_2MHZ) && in nl80211_msg_put_channel()
1061 if ((chan->flags & IEEE80211_CHAN_4MHZ) && in nl80211_msg_put_channel()
1064 if ((chan->flags & IEEE80211_CHAN_8MHZ) && in nl80211_msg_put_channel()
1067 if ((chan->flags & IEEE80211_CHAN_16MHZ) && in nl80211_msg_put_channel()
1073 DBM_TO_MBM(chan->max_power))) in nl80211_msg_put_channel()
1078 freq_reg_info(wiphy, MHZ_TO_KHZ(chan->center_freq)); in nl80211_msg_put_channel()
1080 if (!IS_ERR_OR_NULL(rule) && rule->has_wmm) { in nl80211_msg_put_channel()
1089 return -ENOBUFS; in nl80211_msg_put_channel()
1099 if (txqstats->filled & BIT(NL80211_TXQ_STATS_ ## attr) && \ in nl80211_put_txq_stats()
1100 nla_put_u32(msg, NL80211_TXQ_STATS_ ## attr, txqstats->memb)) \ in nl80211_put_txq_stats()
1141 info->extack); in nl80211_parse_key_new()
1145 k->def = !!tb[NL80211_KEY_DEFAULT]; in nl80211_parse_key_new()
1146 k->defmgmt = !!tb[NL80211_KEY_DEFAULT_MGMT]; in nl80211_parse_key_new()
1147 k->defbeacon = !!tb[NL80211_KEY_DEFAULT_BEACON]; in nl80211_parse_key_new()
1149 if (k->def) { in nl80211_parse_key_new()
1150 k->def_uni = true; in nl80211_parse_key_new()
1151 k->def_multi = true; in nl80211_parse_key_new()
1153 if (k->defmgmt || k->defbeacon) in nl80211_parse_key_new()
1154 k->def_multi = true; in nl80211_parse_key_new()
1157 k->idx = nla_get_u8(tb[NL80211_KEY_IDX]); in nl80211_parse_key_new()
1160 k->p.key = nla_data(tb[NL80211_KEY_DATA]); in nl80211_parse_key_new()
1161 k->p.key_len = nla_len(tb[NL80211_KEY_DATA]); in nl80211_parse_key_new()
1165 k->p.seq = nla_data(tb[NL80211_KEY_SEQ]); in nl80211_parse_key_new()
1166 k->p.seq_len = nla_len(tb[NL80211_KEY_SEQ]); in nl80211_parse_key_new()
1170 k->p.cipher = nla_get_u32(tb[NL80211_KEY_CIPHER]); in nl80211_parse_key_new()
1173 k->type = nla_get_u32(tb[NL80211_KEY_TYPE]); in nl80211_parse_key_new()
1179 NUM_NL80211_KEY_DEFAULT_TYPES - 1, in nl80211_parse_key_new()
1182 info->extack); in nl80211_parse_key_new()
1186 k->def_uni = kdt[NL80211_KEY_DEFAULT_TYPE_UNICAST]; in nl80211_parse_key_new()
1187 k->def_multi = kdt[NL80211_KEY_DEFAULT_TYPE_MULTICAST]; in nl80211_parse_key_new()
1191 k->p.mode = nla_get_u8(tb[NL80211_KEY_MODE]); in nl80211_parse_key_new()
1198 if (info->attrs[NL80211_ATTR_KEY_DATA]) { in nl80211_parse_key_old()
1199 k->p.key = nla_data(info->attrs[NL80211_ATTR_KEY_DATA]); in nl80211_parse_key_old()
1200 k->p.key_len = nla_len(info->attrs[NL80211_ATTR_KEY_DATA]); in nl80211_parse_key_old()
1203 if (info->attrs[NL80211_ATTR_KEY_SEQ]) { in nl80211_parse_key_old()
1204 k->p.seq = nla_data(info->attrs[NL80211_ATTR_KEY_SEQ]); in nl80211_parse_key_old()
1205 k->p.seq_len = nla_len(info->attrs[NL80211_ATTR_KEY_SEQ]); in nl80211_parse_key_old()
1208 if (info->attrs[NL80211_ATTR_KEY_IDX]) in nl80211_parse_key_old()
1209 k->idx = nla_get_u8(info->attrs[NL80211_ATTR_KEY_IDX]); in nl80211_parse_key_old()
1211 if (info->attrs[NL80211_ATTR_KEY_CIPHER]) in nl80211_parse_key_old()
1212 k->p.cipher = nla_get_u32(info->attrs[NL80211_ATTR_KEY_CIPHER]); in nl80211_parse_key_old()
1214 k->def = !!info->attrs[NL80211_ATTR_KEY_DEFAULT]; in nl80211_parse_key_old()
1215 k->defmgmt = !!info->attrs[NL80211_ATTR_KEY_DEFAULT_MGMT]; in nl80211_parse_key_old()
1217 if (k->def) { in nl80211_parse_key_old()
1218 k->def_uni = true; in nl80211_parse_key_old()
1219 k->def_multi = true; in nl80211_parse_key_old()
1221 if (k->defmgmt) in nl80211_parse_key_old()
1222 k->def_multi = true; in nl80211_parse_key_old()
1224 if (info->attrs[NL80211_ATTR_KEY_TYPE]) in nl80211_parse_key_old()
1225 k->type = nla_get_u32(info->attrs[NL80211_ATTR_KEY_TYPE]); in nl80211_parse_key_old()
1227 if (info->attrs[NL80211_ATTR_KEY_DEFAULT_TYPES]) { in nl80211_parse_key_old()
1230 NUM_NL80211_KEY_DEFAULT_TYPES - 1, in nl80211_parse_key_old()
1231 info->attrs[NL80211_ATTR_KEY_DEFAULT_TYPES], in nl80211_parse_key_old()
1233 info->extack); in nl80211_parse_key_old()
1237 k->def_uni = kdt[NL80211_KEY_DEFAULT_TYPE_UNICAST]; in nl80211_parse_key_old()
1238 k->def_multi = kdt[NL80211_KEY_DEFAULT_TYPE_MULTICAST]; in nl80211_parse_key_old()
1249 k->idx = -1; in nl80211_parse_key()
1250 k->type = -1; in nl80211_parse_key()
1252 if (info->attrs[NL80211_ATTR_KEY]) in nl80211_parse_key()
1253 err = nl80211_parse_key_new(info, info->attrs[NL80211_ATTR_KEY], k); in nl80211_parse_key()
1260 if ((k->def ? 1 : 0) + (k->defmgmt ? 1 : 0) + in nl80211_parse_key()
1261 (k->defbeacon ? 1 : 0) > 1) { in nl80211_parse_key()
1264 return -EINVAL; in nl80211_parse_key()
1267 if (k->defmgmt || k->defbeacon) { in nl80211_parse_key()
1268 if (k->def_uni || !k->def_multi) { in nl80211_parse_key()
1271 return -EINVAL; in nl80211_parse_key()
1275 if (k->idx != -1) { in nl80211_parse_key()
1276 if (k->defmgmt) { in nl80211_parse_key()
1277 if (k->idx < 4 || k->idx > 5) { in nl80211_parse_key()
1280 return -EINVAL; in nl80211_parse_key()
1282 } else if (k->defbeacon) { in nl80211_parse_key()
1283 if (k->idx < 6 || k->idx > 7) { in nl80211_parse_key()
1286 return -EINVAL; in nl80211_parse_key()
1288 } else if (k->def) { in nl80211_parse_key()
1289 if (k->idx < 0 || k->idx > 3) { in nl80211_parse_key()
1290 GENL_SET_ERR_MSG(info, "def key idx not 0-3"); in nl80211_parse_key()
1291 return -EINVAL; in nl80211_parse_key()
1294 if (k->idx < 0 || k->idx > 7) { in nl80211_parse_key()
1295 GENL_SET_ERR_MSG(info, "key idx not 0-7"); in nl80211_parse_key()
1296 return -EINVAL; in nl80211_parse_key()
1308 struct nlattr *keys = info->attrs[NL80211_ATTR_KEYS]; in nl80211_parse_connkeys()
1325 return ERR_PTR(-ENOMEM); in nl80211_parse_connkeys()
1327 result->def = -1; in nl80211_parse_connkeys()
1331 parse.idx = -1; in nl80211_parse_connkeys()
1336 err = -EINVAL; in nl80211_parse_connkeys()
1340 GENL_SET_ERR_MSG(info, "key index out of range [0-3]"); in nl80211_parse_connkeys()
1350 result->def = parse.idx; in nl80211_parse_connkeys()
1362 err = -EINVAL; in nl80211_parse_connkeys()
1365 result->params[parse.idx].cipher = parse.p.cipher; in nl80211_parse_connkeys()
1366 result->params[parse.idx].key_len = parse.p.key_len; in nl80211_parse_connkeys()
1367 result->params[parse.idx].key = result->data[parse.idx]; in nl80211_parse_connkeys()
1368 memcpy(result->data[parse.idx], parse.p.key, parse.p.key_len); in nl80211_parse_connkeys()
1375 if (result->def < 0) { in nl80211_parse_connkeys()
1376 err = -EINVAL; in nl80211_parse_connkeys()
1377 GENL_SET_ERR_MSG(info, "need a default/TX key"); in nl80211_parse_connkeys()
1391 switch (wdev->iftype) { in nl80211_key_allowed()
1400 if (!wdev->current_bss) in nl80211_key_allowed()
1401 return -ENOLINK; in nl80211_key_allowed()
1410 return -EINVAL; in nl80211_key_allowed()
1422 if (!chan || chan->flags & IEEE80211_CHAN_DISABLED) in nl80211_get_valid_chan()
1447 return -ENOBUFS; in nl80211_put_iftypes()
1462 for (i = 0; i < wiphy->n_iface_combinations; i++) { in nl80211_put_iface_combinations()
1466 c = &wiphy->iface_combinations[i]; in nl80211_put_iface_combinations()
1477 for (j = 0; j < c->n_limits; j++) { in nl80211_put_iface_combinations()
1484 c->limits[j].max)) in nl80211_put_iface_combinations()
1487 c->limits[j].types)) in nl80211_put_iface_combinations()
1494 if (c->beacon_int_infra_match && in nl80211_put_iface_combinations()
1498 c->num_different_channels) || in nl80211_put_iface_combinations()
1500 c->max_interfaces)) in nl80211_put_iface_combinations()
1504 c->radar_detect_widths) || in nl80211_put_iface_combinations()
1506 c->radar_detect_regions))) in nl80211_put_iface_combinations()
1508 if (c->beacon_int_min_gcd && in nl80211_put_iface_combinations()
1510 c->beacon_int_min_gcd)) in nl80211_put_iface_combinations()
1520 return -ENOBUFS; in nl80211_put_iface_combinations()
1527 const struct wiphy_wowlan_tcp_support *tcp = rdev->wiphy.wowlan->tcp; in nl80211_send_wowlan_tcp_caps()
1536 return -ENOBUFS; in nl80211_send_wowlan_tcp_caps()
1539 tcp->data_payload_max)) in nl80211_send_wowlan_tcp_caps()
1540 return -ENOBUFS; in nl80211_send_wowlan_tcp_caps()
1543 tcp->data_payload_max)) in nl80211_send_wowlan_tcp_caps()
1544 return -ENOBUFS; in nl80211_send_wowlan_tcp_caps()
1546 if (tcp->seq && nla_put_flag(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ)) in nl80211_send_wowlan_tcp_caps()
1547 return -ENOBUFS; in nl80211_send_wowlan_tcp_caps()
1549 if (tcp->tok && nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN, in nl80211_send_wowlan_tcp_caps()
1550 sizeof(*tcp->tok), tcp->tok)) in nl80211_send_wowlan_tcp_caps()
1551 return -ENOBUFS; in nl80211_send_wowlan_tcp_caps()
1554 tcp->data_interval_max)) in nl80211_send_wowlan_tcp_caps()
1555 return -ENOBUFS; in nl80211_send_wowlan_tcp_caps()
1558 tcp->wake_payload_max)) in nl80211_send_wowlan_tcp_caps()
1559 return -ENOBUFS; in nl80211_send_wowlan_tcp_caps()
1571 if (!rdev->wiphy.wowlan) in nl80211_send_wowlan()
1577 return -ENOBUFS; in nl80211_send_wowlan()
1579 if (((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_ANY) && in nl80211_send_wowlan()
1581 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_DISCONNECT) && in nl80211_send_wowlan()
1583 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_MAGIC_PKT) && in nl80211_send_wowlan()
1585 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_SUPPORTS_GTK_REKEY) && in nl80211_send_wowlan()
1587 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_GTK_REKEY_FAILURE) && in nl80211_send_wowlan()
1589 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_EAP_IDENTITY_REQ) && in nl80211_send_wowlan()
1591 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_4WAY_HANDSHAKE) && in nl80211_send_wowlan()
1593 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_RFKILL_RELEASE) && in nl80211_send_wowlan()
1595 return -ENOBUFS; in nl80211_send_wowlan()
1597 if (rdev->wiphy.wowlan->n_patterns) { in nl80211_send_wowlan()
1599 .max_patterns = rdev->wiphy.wowlan->n_patterns, in nl80211_send_wowlan()
1600 .min_pattern_len = rdev->wiphy.wowlan->pattern_min_len, in nl80211_send_wowlan()
1601 .max_pattern_len = rdev->wiphy.wowlan->pattern_max_len, in nl80211_send_wowlan()
1602 .max_pkt_offset = rdev->wiphy.wowlan->max_pkt_offset, in nl80211_send_wowlan()
1607 return -ENOBUFS; in nl80211_send_wowlan()
1610 if ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_NET_DETECT) && in nl80211_send_wowlan()
1612 rdev->wiphy.wowlan->max_nd_match_sets)) in nl80211_send_wowlan()
1613 return -ENOBUFS; in nl80211_send_wowlan()
1616 return -ENOBUFS; in nl80211_send_wowlan()
1629 if (!rdev->wiphy.coalesce) in nl80211_send_coalesce()
1632 rule.max_rules = rdev->wiphy.coalesce->n_rules; in nl80211_send_coalesce()
1633 rule.max_delay = rdev->wiphy.coalesce->max_delay; in nl80211_send_coalesce()
1634 rule.pat.max_patterns = rdev->wiphy.coalesce->n_patterns; in nl80211_send_coalesce()
1635 rule.pat.min_pattern_len = rdev->wiphy.coalesce->pattern_min_len; in nl80211_send_coalesce()
1636 rule.pat.max_pattern_len = rdev->wiphy.coalesce->pattern_max_len; in nl80211_send_coalesce()
1637 rule.pat.max_pkt_offset = rdev->wiphy.coalesce->max_pkt_offset; in nl80211_send_coalesce()
1640 return -ENOBUFS; in nl80211_send_coalesce()
1650 const struct ieee80211_sta_he_cap *he_cap = &iftdata->he_cap; in nl80211_send_iftype_data()
1653 iftdata->types_mask)) in nl80211_send_iftype_data()
1654 return -ENOBUFS; in nl80211_send_iftype_data()
1656 if (he_cap->has_he) { in nl80211_send_iftype_data()
1658 sizeof(he_cap->he_cap_elem.mac_cap_info), in nl80211_send_iftype_data()
1659 he_cap->he_cap_elem.mac_cap_info) || in nl80211_send_iftype_data()
1661 sizeof(he_cap->he_cap_elem.phy_cap_info), in nl80211_send_iftype_data()
1662 he_cap->he_cap_elem.phy_cap_info) || in nl80211_send_iftype_data()
1664 sizeof(he_cap->he_mcs_nss_supp), in nl80211_send_iftype_data()
1665 &he_cap->he_mcs_nss_supp) || in nl80211_send_iftype_data()
1667 sizeof(he_cap->ppe_thres), he_cap->ppe_thres)) in nl80211_send_iftype_data()
1668 return -ENOBUFS; in nl80211_send_iftype_data()
1671 if (sband->band == NL80211_BAND_6GHZ && in nl80211_send_iftype_data()
1673 sizeof(iftdata->he_6ghz_capa), in nl80211_send_iftype_data()
1674 &iftdata->he_6ghz_capa)) in nl80211_send_iftype_data()
1675 return -ENOBUFS; in nl80211_send_iftype_data()
1689 if (sband->ht_cap.ht_supported && in nl80211_send_band_rateinfo()
1691 sizeof(sband->ht_cap.mcs), in nl80211_send_band_rateinfo()
1692 &sband->ht_cap.mcs) || in nl80211_send_band_rateinfo()
1694 sband->ht_cap.cap) || in nl80211_send_band_rateinfo()
1696 sband->ht_cap.ampdu_factor) || in nl80211_send_band_rateinfo()
1698 sband->ht_cap.ampdu_density))) in nl80211_send_band_rateinfo()
1699 return -ENOBUFS; in nl80211_send_band_rateinfo()
1702 if (sband->vht_cap.vht_supported && in nl80211_send_band_rateinfo()
1704 sizeof(sband->vht_cap.vht_mcs), in nl80211_send_band_rateinfo()
1705 &sband->vht_cap.vht_mcs) || in nl80211_send_band_rateinfo()
1707 sband->vht_cap.cap))) in nl80211_send_band_rateinfo()
1708 return -ENOBUFS; in nl80211_send_band_rateinfo()
1710 if (large && sband->n_iftype_data) { in nl80211_send_band_rateinfo()
1717 return -ENOBUFS; in nl80211_send_band_rateinfo()
1719 for (i = 0; i < sband->n_iftype_data; i++) { in nl80211_send_band_rateinfo()
1724 return -ENOBUFS; in nl80211_send_band_rateinfo()
1727 &sband->iftype_data[i]); in nl80211_send_band_rateinfo()
1738 if (large && sband->edmg_cap.channels && in nl80211_send_band_rateinfo()
1740 sband->edmg_cap.channels) || in nl80211_send_band_rateinfo()
1742 sband->edmg_cap.bw_config))) in nl80211_send_band_rateinfo()
1744 return -ENOBUFS; in nl80211_send_band_rateinfo()
1749 return -ENOBUFS; in nl80211_send_band_rateinfo()
1751 for (i = 0; i < sband->n_bitrates; i++) { in nl80211_send_band_rateinfo()
1754 return -ENOBUFS; in nl80211_send_band_rateinfo()
1756 rate = &sband->bitrates[i]; in nl80211_send_band_rateinfo()
1758 rate->bitrate)) in nl80211_send_band_rateinfo()
1759 return -ENOBUFS; in nl80211_send_band_rateinfo()
1760 if ((rate->flags & IEEE80211_RATE_SHORT_PREAMBLE) && in nl80211_send_band_rateinfo()
1763 return -ENOBUFS; in nl80211_send_band_rateinfo()
1787 return -ENOBUFS; in nl80211_send_mgmt_stypes()
1792 return -ENOBUFS; in nl80211_send_mgmt_stypes()
1794 stypes = mgmt_stypes[ift].tx; in nl80211_send_mgmt_stypes()
1799 return -ENOBUFS; in nl80211_send_mgmt_stypes()
1810 return -ENOBUFS; in nl80211_send_mgmt_stypes()
1815 return -ENOBUFS; in nl80211_send_mgmt_stypes()
1822 return -ENOBUFS; in nl80211_send_mgmt_stypes()
1835 if (rdev->ops->op) { \
1869 if (rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL) in nl80211_add_commands_unsplit()
1874 if (rdev->wiphy.flags & WIPHY_FLAG_NETNS_OK) { in nl80211_add_commands_unsplit()
1879 if (rdev->ops->set_monitor_channel || rdev->ops->start_ap || in nl80211_add_commands_unsplit()
1880 rdev->ops->join_mesh) { in nl80211_add_commands_unsplit()
1886 if (rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) { in nl80211_add_commands_unsplit()
1890 if (rdev->wiphy.max_sched_scan_reqs) in nl80211_add_commands_unsplit()
1894 if (rdev->wiphy.flags & WIPHY_FLAG_REPORTS_OBSS) { in nl80211_add_commands_unsplit()
1905 if (rdev->ops->connect || rdev->ops->auth) { in nl80211_add_commands_unsplit()
1911 if (rdev->ops->disconnect || rdev->ops->deauth) { in nl80211_add_commands_unsplit()
1919 return -ENOBUFS; in nl80211_add_commands_unsplit()
1928 if (!cap->ftm.supported) in nl80211_send_pmsr_ftm_capa()
1933 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
1935 if (cap->ftm.asap && nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_ASAP)) in nl80211_send_pmsr_ftm_capa()
1936 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
1937 if (cap->ftm.non_asap && in nl80211_send_pmsr_ftm_capa()
1939 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
1940 if (cap->ftm.request_lci && in nl80211_send_pmsr_ftm_capa()
1942 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
1943 if (cap->ftm.request_civicloc && in nl80211_send_pmsr_ftm_capa()
1945 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
1947 cap->ftm.preambles)) in nl80211_send_pmsr_ftm_capa()
1948 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
1950 cap->ftm.bandwidths)) in nl80211_send_pmsr_ftm_capa()
1951 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
1952 if (cap->ftm.max_bursts_exponent >= 0 && in nl80211_send_pmsr_ftm_capa()
1954 cap->ftm.max_bursts_exponent)) in nl80211_send_pmsr_ftm_capa()
1955 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
1956 if (cap->ftm.max_ftms_per_burst && in nl80211_send_pmsr_ftm_capa()
1958 cap->ftm.max_ftms_per_burst)) in nl80211_send_pmsr_ftm_capa()
1959 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
1960 if (cap->ftm.trigger_based && in nl80211_send_pmsr_ftm_capa()
1962 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
1963 if (cap->ftm.non_trigger_based && in nl80211_send_pmsr_ftm_capa()
1965 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
1974 const struct cfg80211_pmsr_capabilities *cap = rdev->wiphy.pmsr_capa; in nl80211_send_pmsr_capa()
1987 return -ENOBUFS; in nl80211_send_pmsr_capa()
1989 if (nla_put_u32(msg, NL80211_PMSR_ATTR_MAX_PEERS, cap->max_peers)) in nl80211_send_pmsr_capa()
1990 return -ENOBUFS; in nl80211_send_pmsr_capa()
1992 if (cap->report_ap_tsf && in nl80211_send_pmsr_capa()
1994 return -ENOBUFS; in nl80211_send_pmsr_capa()
1996 if (cap->randomize_mac_addr && in nl80211_send_pmsr_capa()
1998 return -ENOBUFS; in nl80211_send_pmsr_capa()
2002 return -ENOBUFS; in nl80211_send_pmsr_capa()
2005 return -ENOBUFS; in nl80211_send_pmsr_capa()
2021 if (!rdev->wiphy.num_iftype_akm_suites || in nl80211_put_iftype_akm_suites()
2022 !rdev->wiphy.iftype_akm_suites) in nl80211_put_iftype_akm_suites()
2027 return -ENOBUFS; in nl80211_put_iftype_akm_suites()
2029 for (i = 0; i < rdev->wiphy.num_iftype_akm_suites; i++) { in nl80211_put_iftype_akm_suites()
2032 return -ENOBUFS; in nl80211_put_iftype_akm_suites()
2034 iftype_akms = &rdev->wiphy.iftype_akm_suites[i]; in nl80211_put_iftype_akm_suites()
2037 iftype_akms->iftypes_mask)) in nl80211_put_iftype_akm_suites()
2038 return -ENOBUFS; in nl80211_put_iftype_akm_suites()
2041 sizeof(u32) * iftype_akms->n_akm_suites, in nl80211_put_iftype_akm_suites()
2042 iftype_akms->akm_suites)) { in nl80211_put_iftype_akm_suites()
2043 return -ENOBUFS; in nl80211_put_iftype_akm_suites()
2059 if (!rdev->wiphy.tid_config_support.vif && in nl80211_put_tid_config_support()
2060 !rdev->wiphy.tid_config_support.peer) in nl80211_put_tid_config_support()
2065 return -ENOSPC; in nl80211_put_tid_config_support()
2067 if (rdev->wiphy.tid_config_support.vif && in nl80211_put_tid_config_support()
2069 rdev->wiphy.tid_config_support.vif, in nl80211_put_tid_config_support()
2073 if (rdev->wiphy.tid_config_support.peer && in nl80211_put_tid_config_support()
2075 rdev->wiphy.tid_config_support.peer, in nl80211_put_tid_config_support()
2081 rdev->wiphy.tid_config_support.max_retry)) in nl80211_put_tid_config_support()
2084 rdev->wiphy.tid_config_support.max_retry)) in nl80211_put_tid_config_support()
2092 return -ENOBUFS; in nl80211_put_tid_config_support()
2115 rdev->wiphy.mgmt_stypes; in nl80211_send_wiphy()
2120 return -ENOBUFS; in nl80211_send_wiphy()
2123 return -EINVAL; in nl80211_send_wiphy()
2125 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_wiphy()
2127 wiphy_name(&rdev->wiphy)) || in nl80211_send_wiphy()
2135 switch (state->split_start) { in nl80211_send_wiphy()
2138 rdev->wiphy.retry_short) || in nl80211_send_wiphy()
2140 rdev->wiphy.retry_long) || in nl80211_send_wiphy()
2142 rdev->wiphy.frag_threshold) || in nl80211_send_wiphy()
2144 rdev->wiphy.rts_threshold) || in nl80211_send_wiphy()
2146 rdev->wiphy.coverage_class) || in nl80211_send_wiphy()
2148 rdev->wiphy.max_scan_ssids) || in nl80211_send_wiphy()
2150 rdev->wiphy.max_sched_scan_ssids) || in nl80211_send_wiphy()
2152 rdev->wiphy.max_scan_ie_len) || in nl80211_send_wiphy()
2154 rdev->wiphy.max_sched_scan_ie_len) || in nl80211_send_wiphy()
2156 rdev->wiphy.max_match_sets)) in nl80211_send_wiphy()
2159 if ((rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN) && in nl80211_send_wiphy()
2162 if ((rdev->wiphy.flags & WIPHY_FLAG_MESH_AUTH) && in nl80211_send_wiphy()
2165 if ((rdev->wiphy.flags & WIPHY_FLAG_AP_UAPSD) && in nl80211_send_wiphy()
2168 if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_FW_ROAM) && in nl80211_send_wiphy()
2171 if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) && in nl80211_send_wiphy()
2174 if ((rdev->wiphy.flags & WIPHY_FLAG_TDLS_EXTERNAL_SETUP) && in nl80211_send_wiphy()
2177 state->split_start++; in nl80211_send_wiphy()
2178 if (state->split) in nl80211_send_wiphy()
2183 sizeof(u32) * rdev->wiphy.n_cipher_suites, in nl80211_send_wiphy()
2184 rdev->wiphy.cipher_suites)) in nl80211_send_wiphy()
2188 rdev->wiphy.max_num_pmkids)) in nl80211_send_wiphy()
2191 if ((rdev->wiphy.flags & WIPHY_FLAG_CONTROL_PORT_PROTOCOL) && in nl80211_send_wiphy()
2196 rdev->wiphy.available_antennas_tx) || in nl80211_send_wiphy()
2198 rdev->wiphy.available_antennas_rx)) in nl80211_send_wiphy()
2201 if ((rdev->wiphy.flags & WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD) && in nl80211_send_wiphy()
2203 rdev->wiphy.probe_resp_offload)) in nl80211_send_wiphy()
2206 if ((rdev->wiphy.available_antennas_tx || in nl80211_send_wiphy()
2207 rdev->wiphy.available_antennas_rx) && in nl80211_send_wiphy()
2208 rdev->ops->get_antenna) { in nl80211_send_wiphy()
2224 state->split_start++; in nl80211_send_wiphy()
2225 if (state->split) in nl80211_send_wiphy()
2230 rdev->wiphy.interface_modes)) in nl80211_send_wiphy()
2232 state->split_start++; in nl80211_send_wiphy()
2233 if (state->split) in nl80211_send_wiphy()
2242 for (band = state->band_start; in nl80211_send_wiphy()
2247 if (band > NL80211_BAND_5GHZ && !state->split) in nl80211_send_wiphy()
2250 sband = rdev->wiphy.bands[band]; in nl80211_send_wiphy()
2259 switch (state->chan_start) { in nl80211_send_wiphy()
2262 state->split)) in nl80211_send_wiphy()
2264 state->chan_start++; in nl80211_send_wiphy()
2265 if (state->split) in nl80211_send_wiphy()
2275 for (i = state->chan_start - 1; in nl80211_send_wiphy()
2276 i < sband->n_channels; in nl80211_send_wiphy()
2283 chan = &sband->channels[i]; in nl80211_send_wiphy()
2286 msg, &rdev->wiphy, chan, in nl80211_send_wiphy()
2287 state->split)) in nl80211_send_wiphy()
2291 if (state->split) in nl80211_send_wiphy()
2294 if (i < sband->n_channels) in nl80211_send_wiphy()
2295 state->chan_start = i + 2; in nl80211_send_wiphy()
2297 state->chan_start = 0; in nl80211_send_wiphy()
2303 if (state->split) { in nl80211_send_wiphy()
2305 if (state->chan_start) in nl80211_send_wiphy()
2306 band--; in nl80211_send_wiphy()
2313 state->band_start = band + 1; in nl80211_send_wiphy()
2315 state->band_start = 0; in nl80211_send_wiphy()
2318 if (state->band_start == 0 && state->chan_start == 0) in nl80211_send_wiphy()
2319 state->split_start++; in nl80211_send_wiphy()
2320 if (state->split) in nl80211_send_wiphy()
2332 if (state->split) { in nl80211_send_wiphy()
2335 if (rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH) in nl80211_send_wiphy()
2338 if (rdev->wiphy.features & in nl80211_send_wiphy()
2348 state->split_start++; in nl80211_send_wiphy()
2349 if (state->split) in nl80211_send_wiphy()
2353 if (rdev->ops->remain_on_channel && in nl80211_send_wiphy()
2354 (rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL) && in nl80211_send_wiphy()
2357 rdev->wiphy.max_remain_on_channel_duration)) in nl80211_send_wiphy()
2360 if ((rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX) && in nl80211_send_wiphy()
2364 state->split_start++; in nl80211_send_wiphy()
2365 if (state->split) in nl80211_send_wiphy()
2370 if (nl80211_send_wowlan(msg, rdev, state->split)) in nl80211_send_wiphy()
2372 state->split_start++; in nl80211_send_wiphy()
2373 if (state->split) in nl80211_send_wiphy()
2376 state->split_start++; in nl80211_send_wiphy()
2381 rdev->wiphy.software_iftypes)) in nl80211_send_wiphy()
2384 if (nl80211_put_iface_combinations(&rdev->wiphy, msg, in nl80211_send_wiphy()
2385 state->split)) in nl80211_send_wiphy()
2388 state->split_start++; in nl80211_send_wiphy()
2389 if (state->split) in nl80211_send_wiphy()
2393 if ((rdev->wiphy.flags & WIPHY_FLAG_HAVE_AP_SME) && in nl80211_send_wiphy()
2395 rdev->wiphy.ap_sme_capa)) in nl80211_send_wiphy()
2398 features = rdev->wiphy.features; in nl80211_send_wiphy()
2400 * We can only add the per-channel limit information if the in nl80211_send_wiphy()
2404 if (state->split) in nl80211_send_wiphy()
2409 if (rdev->wiphy.ht_capa_mod_mask && in nl80211_send_wiphy()
2411 sizeof(*rdev->wiphy.ht_capa_mod_mask), in nl80211_send_wiphy()
2412 rdev->wiphy.ht_capa_mod_mask)) in nl80211_send_wiphy()
2415 if (rdev->wiphy.flags & WIPHY_FLAG_HAVE_AP_SME && in nl80211_send_wiphy()
2416 rdev->wiphy.max_acl_mac_addrs && in nl80211_send_wiphy()
2418 rdev->wiphy.max_acl_mac_addrs)) in nl80211_send_wiphy()
2431 if (state->split) in nl80211_send_wiphy()
2432 state->split_start++; in nl80211_send_wiphy()
2434 state->split_start = 0; in nl80211_send_wiphy()
2441 rdev->wiphy.max_sched_scan_plans) || in nl80211_send_wiphy()
2443 rdev->wiphy.max_sched_scan_plan_interval) || in nl80211_send_wiphy()
2445 rdev->wiphy.max_sched_scan_plan_iterations)) in nl80211_send_wiphy()
2448 if (rdev->wiphy.extended_capabilities && in nl80211_send_wiphy()
2450 rdev->wiphy.extended_capabilities_len, in nl80211_send_wiphy()
2451 rdev->wiphy.extended_capabilities) || in nl80211_send_wiphy()
2453 rdev->wiphy.extended_capabilities_len, in nl80211_send_wiphy()
2454 rdev->wiphy.extended_capabilities_mask))) in nl80211_send_wiphy()
2457 if (rdev->wiphy.vht_capa_mod_mask && in nl80211_send_wiphy()
2459 sizeof(*rdev->wiphy.vht_capa_mod_mask), in nl80211_send_wiphy()
2460 rdev->wiphy.vht_capa_mod_mask)) in nl80211_send_wiphy()
2464 rdev->wiphy.perm_addr)) in nl80211_send_wiphy()
2467 if (!is_zero_ether_addr(rdev->wiphy.addr_mask) && in nl80211_send_wiphy()
2469 rdev->wiphy.addr_mask)) in nl80211_send_wiphy()
2472 if (rdev->wiphy.n_addresses > 1) { in nl80211_send_wiphy()
2479 for (i = 0; i < rdev->wiphy.n_addresses; i++) in nl80211_send_wiphy()
2481 rdev->wiphy.addresses[i].addr)) in nl80211_send_wiphy()
2487 state->split_start++; in nl80211_send_wiphy()
2493 if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_5_10_MHZ) && in nl80211_send_wiphy()
2498 if (rdev->wiphy.max_ap_assoc_sta && in nl80211_send_wiphy()
2500 rdev->wiphy.max_ap_assoc_sta)) in nl80211_send_wiphy()
2503 state->split_start++; in nl80211_send_wiphy()
2506 if (rdev->wiphy.n_vendor_commands) { in nl80211_send_wiphy()
2515 for (i = 0; i < rdev->wiphy.n_vendor_commands; i++) { in nl80211_send_wiphy()
2516 info = &rdev->wiphy.vendor_commands[i].info; in nl80211_send_wiphy()
2523 if (rdev->wiphy.n_vendor_events) { in nl80211_send_wiphy()
2532 for (i = 0; i < rdev->wiphy.n_vendor_events; i++) { in nl80211_send_wiphy()
2533 info = &rdev->wiphy.vendor_events[i]; in nl80211_send_wiphy()
2539 state->split_start++; in nl80211_send_wiphy()
2542 if (rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH && in nl80211_send_wiphy()
2544 rdev->wiphy.max_num_csa_counters)) in nl80211_send_wiphy()
2547 if (rdev->wiphy.regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED && in nl80211_send_wiphy()
2551 if (rdev->wiphy.max_sched_scan_reqs && in nl80211_send_wiphy()
2553 rdev->wiphy.max_sched_scan_reqs)) in nl80211_send_wiphy()
2557 sizeof(rdev->wiphy.ext_features), in nl80211_send_wiphy()
2558 rdev->wiphy.ext_features)) in nl80211_send_wiphy()
2561 if (rdev->wiphy.bss_select_support) { in nl80211_send_wiphy()
2563 u32 bss_select_support = rdev->wiphy.bss_select_support; in nl80211_send_wiphy()
2581 state->split_start++; in nl80211_send_wiphy()
2584 if (rdev->wiphy.num_iftype_ext_capab && in nl80211_send_wiphy()
2585 rdev->wiphy.iftype_ext_capab) { in nl80211_send_wiphy()
2593 for (i = state->capa_start; in nl80211_send_wiphy()
2594 i < rdev->wiphy.num_iftype_ext_capab; i++) { in nl80211_send_wiphy()
2597 capab = &rdev->wiphy.iftype_ext_capab[i]; in nl80211_send_wiphy()
2603 capab->iftype) || in nl80211_send_wiphy()
2605 capab->extended_capabilities_len, in nl80211_send_wiphy()
2606 capab->extended_capabilities) || in nl80211_send_wiphy()
2608 capab->extended_capabilities_len, in nl80211_send_wiphy()
2609 capab->extended_capabilities_mask)) in nl80211_send_wiphy()
2613 if (state->split) in nl80211_send_wiphy()
2617 if (i < rdev->wiphy.num_iftype_ext_capab) { in nl80211_send_wiphy()
2618 state->capa_start = i + 1; in nl80211_send_wiphy()
2624 rdev->wiphy.nan_supported_bands)) in nl80211_send_wiphy()
2627 if (wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_send_wiphy()
2639 rdev->wiphy.txq_limit)) in nl80211_send_wiphy()
2642 rdev->wiphy.txq_memory_limit)) in nl80211_send_wiphy()
2645 rdev->wiphy.txq_quantum)) in nl80211_send_wiphy()
2649 state->split_start++; in nl80211_send_wiphy()
2655 state->split_start++; in nl80211_send_wiphy()
2658 if (rdev->wiphy.akm_suites && in nl80211_send_wiphy()
2660 sizeof(u32) * rdev->wiphy.n_akm_suites, in nl80211_send_wiphy()
2661 rdev->wiphy.akm_suites)) in nl80211_send_wiphy()
2671 state->split_start = 0; in nl80211_send_wiphy()
2680 return -EMSGSIZE; in nl80211_send_wiphy()
2691 return -ENOMEM; in nl80211_dump_wiphy_parse()
2693 ret = nlmsg_parse_deprecated(cb->nlh, in nl80211_dump_wiphy_parse()
2703 state->split = tb[NL80211_ATTR_SPLIT_WIPHY_DUMP]; in nl80211_dump_wiphy_parse()
2705 state->filter_wiphy = nla_get_u32(tb[NL80211_ATTR_WIPHY]); in nl80211_dump_wiphy_parse()
2707 state->filter_wiphy = nla_get_u64(tb[NL80211_ATTR_WDEV]) >> 32; in nl80211_dump_wiphy_parse()
2713 netdev = __dev_get_by_index(sock_net(skb->sk), ifidx); in nl80211_dump_wiphy_parse()
2715 ret = -ENODEV; in nl80211_dump_wiphy_parse()
2718 if (netdev->ieee80211_ptr) { in nl80211_dump_wiphy_parse()
2720 netdev->ieee80211_ptr->wiphy); in nl80211_dump_wiphy_parse()
2721 state->filter_wiphy = rdev->wiphy_idx; in nl80211_dump_wiphy_parse()
2734 struct nl80211_dump_wiphy_state *state = (void *)cb->args[0]; in nl80211_dump_wiphy()
2742 return -ENOMEM; in nl80211_dump_wiphy()
2744 state->filter_wiphy = -1; in nl80211_dump_wiphy()
2751 cb->args[0] = (long)state; in nl80211_dump_wiphy()
2755 if (!net_eq(wiphy_net(&rdev->wiphy), sock_net(skb->sk))) in nl80211_dump_wiphy()
2757 if (++idx <= state->start) in nl80211_dump_wiphy()
2759 if (state->filter_wiphy != -1 && in nl80211_dump_wiphy()
2760 state->filter_wiphy != rdev->wiphy_idx) in nl80211_dump_wiphy()
2766 NETLINK_CB(cb->skb).portid, in nl80211_dump_wiphy()
2767 cb->nlh->nlmsg_seq, in nl80211_dump_wiphy()
2783 if ((ret == -ENOBUFS || ret == -EMSGSIZE) && in nl80211_dump_wiphy()
2784 !skb->len && !state->split && in nl80211_dump_wiphy()
2785 cb->min_dump_alloc < 4096) { in nl80211_dump_wiphy()
2786 cb->min_dump_alloc = 4096; in nl80211_dump_wiphy()
2787 state->split_start = 0; in nl80211_dump_wiphy()
2791 idx--; in nl80211_dump_wiphy()
2794 } while (state->split_start > 0); in nl80211_dump_wiphy()
2799 state->start = idx; in nl80211_dump_wiphy()
2801 return skb->len; in nl80211_dump_wiphy()
2806 kfree((void *)cb->args[0]); in nl80211_dump_wiphy_done()
2813 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_wiphy()
2818 return -ENOMEM; in nl80211_get_wiphy()
2821 info->snd_portid, info->snd_seq, 0, in nl80211_get_wiphy()
2824 return -ENOBUFS; in nl80211_get_wiphy()
2846 return -EINVAL; in parse_txq_params()
2849 txq_params->txop = nla_get_u16(tb[NL80211_TXQ_ATTR_TXOP]); in parse_txq_params()
2850 txq_params->cwmin = nla_get_u16(tb[NL80211_TXQ_ATTR_CWMIN]); in parse_txq_params()
2851 txq_params->cwmax = nla_get_u16(tb[NL80211_TXQ_ATTR_CWMAX]); in parse_txq_params()
2852 txq_params->aifs = nla_get_u8(tb[NL80211_TXQ_ATTR_AIFS]); in parse_txq_params()
2855 return -EINVAL; in parse_txq_params()
2856 txq_params->ac = array_index_nospec(ac, NL80211_NUM_ACS); in parse_txq_params()
2869 * low-level driver when the AP starts or the mesh is joined. in nl80211_can_set_dev_channel()
2871 * the channel in the start-ap or join-mesh commands instead. in nl80211_can_set_dev_channel()
2878 wdev->iftype == NL80211_IFTYPE_AP || in nl80211_can_set_dev_channel()
2879 wdev->iftype == NL80211_IFTYPE_MESH_POINT || in nl80211_can_set_dev_channel()
2880 wdev->iftype == NL80211_IFTYPE_MONITOR || in nl80211_can_set_dev_channel()
2881 wdev->iftype == NL80211_IFTYPE_P2P_GO; in nl80211_can_set_dev_channel()
2888 struct netlink_ext_ack *extack = info->extack; in nl80211_parse_chandef()
2889 struct nlattr **attrs = info->attrs; in nl80211_parse_chandef()
2893 return -EINVAL; in nl80211_parse_chandef()
2896 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ])); in nl80211_parse_chandef()
2897 if (info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]) in nl80211_parse_chandef()
2899 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]); in nl80211_parse_chandef()
2902 chandef->chan = ieee80211_get_channel_khz(&rdev->wiphy, control_freq); in nl80211_parse_chandef()
2903 chandef->width = NL80211_CHAN_WIDTH_20_NOHT; in nl80211_parse_chandef()
2904 chandef->center_freq1 = KHZ_TO_MHZ(control_freq); in nl80211_parse_chandef()
2905 chandef->freq1_offset = control_freq % 1000; in nl80211_parse_chandef()
2906 chandef->center_freq2 = 0; in nl80211_parse_chandef()
2909 if (!chandef->chan || chandef->chan->flags & IEEE80211_CHAN_DISABLED) { in nl80211_parse_chandef()
2912 return -EINVAL; in nl80211_parse_chandef()
2925 cfg80211_chandef_create(chandef, chandef->chan, in nl80211_parse_chandef()
2929 chandef->center_freq1 != nla_get_u32(attrs[NL80211_ATTR_CENTER_FREQ1])) { in nl80211_parse_chandef()
2933 return -EINVAL; in nl80211_parse_chandef()
2941 return -EINVAL; in nl80211_parse_chandef()
2948 return -EINVAL; in nl80211_parse_chandef()
2951 chandef->width = in nl80211_parse_chandef()
2954 chandef->center_freq1 = in nl80211_parse_chandef()
2957 chandef->freq1_offset = nla_get_u32( in nl80211_parse_chandef()
2960 chandef->freq1_offset = 0; in nl80211_parse_chandef()
2963 chandef->center_freq2 = in nl80211_parse_chandef()
2967 if (info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]) { in nl80211_parse_chandef()
2968 chandef->edmg.channels = in nl80211_parse_chandef()
2969 nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]); in nl80211_parse_chandef()
2971 if (info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]) in nl80211_parse_chandef()
2972 chandef->edmg.bw_config = in nl80211_parse_chandef()
2973 nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]); in nl80211_parse_chandef()
2975 chandef->edmg.bw_config = 0; in nl80211_parse_chandef()
2976 chandef->edmg.channels = 0; in nl80211_parse_chandef()
2981 return -EINVAL; in nl80211_parse_chandef()
2984 if (!cfg80211_chandef_usable(&rdev->wiphy, chandef, in nl80211_parse_chandef()
2987 return -EINVAL; in nl80211_parse_chandef()
2990 if ((chandef->width == NL80211_CHAN_WIDTH_5 || in nl80211_parse_chandef()
2991 chandef->width == NL80211_CHAN_WIDTH_10) && in nl80211_parse_chandef()
2992 !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_5_10_MHZ)) { in nl80211_parse_chandef()
2994 return -EINVAL; in nl80211_parse_chandef()
3010 wdev = dev->ieee80211_ptr; in __nl80211_set_channel()
3012 return -EOPNOTSUPP; in __nl80211_set_channel()
3014 iftype = wdev->iftype; in __nl80211_set_channel()
3023 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &chandef, in __nl80211_set_channel()
3025 result = -EINVAL; in __nl80211_set_channel()
3028 if (wdev->beacon_interval) { in __nl80211_set_channel()
3029 if (!dev || !rdev->ops->set_ap_chanwidth || in __nl80211_set_channel()
3030 !(rdev->wiphy.features & in __nl80211_set_channel()
3032 result = -EBUSY; in __nl80211_set_channel()
3037 if (chandef.chan != wdev->preset_chandef.chan) { in __nl80211_set_channel()
3038 result = -EBUSY; in __nl80211_set_channel()
3045 wdev->preset_chandef = chandef; in __nl80211_set_channel()
3055 result = -EINVAL; in __nl80211_set_channel()
3063 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_channel()
3064 struct net_device *netdev = info->user_ptr[1]; in nl80211_set_channel()
3071 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_wds_peer()
3072 struct net_device *dev = info->user_ptr[1]; in nl80211_set_wds_peer()
3073 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_wds_peer()
3076 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_set_wds_peer()
3077 return -EINVAL; in nl80211_set_wds_peer()
3080 return -EBUSY; in nl80211_set_wds_peer()
3082 if (!rdev->ops->set_wds_peer) in nl80211_set_wds_peer()
3083 return -EOPNOTSUPP; in nl80211_set_wds_peer()
3085 if (wdev->iftype != NL80211_IFTYPE_WDS) in nl80211_set_wds_peer()
3086 return -EOPNOTSUPP; in nl80211_set_wds_peer()
3088 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_set_wds_peer()
3110 * done for backward compatibility -- previously in nl80211_set_wiphy()
3117 if (info->attrs[NL80211_ATTR_IFINDEX]) { in nl80211_set_wiphy()
3118 int ifindex = nla_get_u32(info->attrs[NL80211_ATTR_IFINDEX]); in nl80211_set_wiphy()
3121 if (netdev && netdev->ieee80211_ptr) in nl80211_set_wiphy()
3122 rdev = wiphy_to_rdev(netdev->ieee80211_ptr->wiphy); in nl80211_set_wiphy()
3129 info->attrs); in nl80211_set_wiphy()
3136 wdev = netdev->ieee80211_ptr; in nl80211_set_wiphy()
3143 if (info->attrs[NL80211_ATTR_WIPHY_NAME]) in nl80211_set_wiphy()
3145 rdev, nla_data(info->attrs[NL80211_ATTR_WIPHY_NAME])); in nl80211_set_wiphy()
3150 if (info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS]) { in nl80211_set_wiphy()
3154 if (!rdev->ops->set_txq_params) in nl80211_set_wiphy()
3155 return -EOPNOTSUPP; in nl80211_set_wiphy()
3158 return -EINVAL; in nl80211_set_wiphy()
3160 if (netdev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && in nl80211_set_wiphy()
3161 netdev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_set_wiphy()
3162 return -EINVAL; in nl80211_set_wiphy()
3165 return -ENETDOWN; in nl80211_set_wiphy()
3168 info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS], in nl80211_set_wiphy()
3174 info->extack); in nl80211_set_wiphy()
3188 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { in nl80211_set_wiphy()
3197 if (info->attrs[NL80211_ATTR_WIPHY_TX_POWER_SETTING]) { in nl80211_set_wiphy()
3202 if (!(rdev->wiphy.features & NL80211_FEATURE_VIF_TXPOWER)) in nl80211_set_wiphy()
3205 if (!rdev->ops->set_tx_power) in nl80211_set_wiphy()
3206 return -EOPNOTSUPP; in nl80211_set_wiphy()
3209 type = nla_get_u32(info->attrs[idx]); in nl80211_set_wiphy()
3211 if (!info->attrs[NL80211_ATTR_WIPHY_TX_POWER_LEVEL] && in nl80211_set_wiphy()
3213 return -EINVAL; in nl80211_set_wiphy()
3217 mbm = nla_get_u32(info->attrs[idx]); in nl80211_set_wiphy()
3225 if (info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX] && in nl80211_set_wiphy()
3226 info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]) { in nl80211_set_wiphy()
3229 if ((!rdev->wiphy.available_antennas_tx && in nl80211_set_wiphy()
3230 !rdev->wiphy.available_antennas_rx) || in nl80211_set_wiphy()
3231 !rdev->ops->set_antenna) in nl80211_set_wiphy()
3232 return -EOPNOTSUPP; in nl80211_set_wiphy()
3234 tx_ant = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX]); in nl80211_set_wiphy()
3235 rx_ant = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]); in nl80211_set_wiphy()
3239 if ((~tx_ant && (tx_ant & ~rdev->wiphy.available_antennas_tx)) || in nl80211_set_wiphy()
3240 (~rx_ant && (rx_ant & ~rdev->wiphy.available_antennas_rx))) in nl80211_set_wiphy()
3241 return -EINVAL; in nl80211_set_wiphy()
3243 tx_ant = tx_ant & rdev->wiphy.available_antennas_tx; in nl80211_set_wiphy()
3244 rx_ant = rx_ant & rdev->wiphy.available_antennas_rx; in nl80211_set_wiphy()
3253 if (info->attrs[NL80211_ATTR_WIPHY_RETRY_SHORT]) { in nl80211_set_wiphy()
3255 info->attrs[NL80211_ATTR_WIPHY_RETRY_SHORT]); in nl80211_set_wiphy()
3260 if (info->attrs[NL80211_ATTR_WIPHY_RETRY_LONG]) { in nl80211_set_wiphy()
3262 info->attrs[NL80211_ATTR_WIPHY_RETRY_LONG]); in nl80211_set_wiphy()
3267 if (info->attrs[NL80211_ATTR_WIPHY_FRAG_THRESHOLD]) { in nl80211_set_wiphy()
3269 info->attrs[NL80211_ATTR_WIPHY_FRAG_THRESHOLD]); in nl80211_set_wiphy()
3271 return -EINVAL; in nl80211_set_wiphy()
3273 if (frag_threshold != (u32) -1) { in nl80211_set_wiphy()
3285 if (info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]) { in nl80211_set_wiphy()
3287 info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]); in nl80211_set_wiphy()
3291 if (info->attrs[NL80211_ATTR_WIPHY_COVERAGE_CLASS]) { in nl80211_set_wiphy()
3292 if (info->attrs[NL80211_ATTR_WIPHY_DYN_ACK]) in nl80211_set_wiphy()
3293 return -EINVAL; in nl80211_set_wiphy()
3296 info->attrs[NL80211_ATTR_WIPHY_COVERAGE_CLASS]); in nl80211_set_wiphy()
3300 if (info->attrs[NL80211_ATTR_WIPHY_DYN_ACK]) { in nl80211_set_wiphy()
3301 if (!(rdev->wiphy.features & NL80211_FEATURE_ACKTO_ESTIMATION)) in nl80211_set_wiphy()
3302 return -EOPNOTSUPP; in nl80211_set_wiphy()
3307 if (info->attrs[NL80211_ATTR_TXQ_LIMIT]) { in nl80211_set_wiphy()
3308 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_set_wiphy()
3310 return -EOPNOTSUPP; in nl80211_set_wiphy()
3312 info->attrs[NL80211_ATTR_TXQ_LIMIT]); in nl80211_set_wiphy()
3316 if (info->attrs[NL80211_ATTR_TXQ_MEMORY_LIMIT]) { in nl80211_set_wiphy()
3317 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_set_wiphy()
3319 return -EOPNOTSUPP; in nl80211_set_wiphy()
3321 info->attrs[NL80211_ATTR_TXQ_MEMORY_LIMIT]); in nl80211_set_wiphy()
3325 if (info->attrs[NL80211_ATTR_TXQ_QUANTUM]) { in nl80211_set_wiphy()
3326 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_set_wiphy()
3328 return -EOPNOTSUPP; in nl80211_set_wiphy()
3330 info->attrs[NL80211_ATTR_TXQ_QUANTUM]); in nl80211_set_wiphy()
3340 if (!rdev->ops->set_wiphy_params) in nl80211_set_wiphy()
3341 return -EOPNOTSUPP; in nl80211_set_wiphy()
3343 old_retry_short = rdev->wiphy.retry_short; in nl80211_set_wiphy()
3344 old_retry_long = rdev->wiphy.retry_long; in nl80211_set_wiphy()
3345 old_frag_threshold = rdev->wiphy.frag_threshold; in nl80211_set_wiphy()
3346 old_rts_threshold = rdev->wiphy.rts_threshold; in nl80211_set_wiphy()
3347 old_coverage_class = rdev->wiphy.coverage_class; in nl80211_set_wiphy()
3348 old_txq_limit = rdev->wiphy.txq_limit; in nl80211_set_wiphy()
3349 old_txq_memory_limit = rdev->wiphy.txq_memory_limit; in nl80211_set_wiphy()
3350 old_txq_quantum = rdev->wiphy.txq_quantum; in nl80211_set_wiphy()
3353 rdev->wiphy.retry_short = retry_short; in nl80211_set_wiphy()
3355 rdev->wiphy.retry_long = retry_long; in nl80211_set_wiphy()
3357 rdev->wiphy.frag_threshold = frag_threshold; in nl80211_set_wiphy()
3359 rdev->wiphy.rts_threshold = rts_threshold; in nl80211_set_wiphy()
3361 rdev->wiphy.coverage_class = coverage_class; in nl80211_set_wiphy()
3363 rdev->wiphy.txq_limit = txq_limit; in nl80211_set_wiphy()
3365 rdev->wiphy.txq_memory_limit = txq_memory_limit; in nl80211_set_wiphy()
3367 rdev->wiphy.txq_quantum = txq_quantum; in nl80211_set_wiphy()
3371 rdev->wiphy.retry_short = old_retry_short; in nl80211_set_wiphy()
3372 rdev->wiphy.retry_long = old_retry_long; in nl80211_set_wiphy()
3373 rdev->wiphy.frag_threshold = old_frag_threshold; in nl80211_set_wiphy()
3374 rdev->wiphy.rts_threshold = old_rts_threshold; in nl80211_set_wiphy()
3375 rdev->wiphy.coverage_class = old_coverage_class; in nl80211_set_wiphy()
3376 rdev->wiphy.txq_limit = old_txq_limit; in nl80211_set_wiphy()
3377 rdev->wiphy.txq_memory_limit = old_txq_memory_limit; in nl80211_set_wiphy()
3378 rdev->wiphy.txq_quantum = old_txq_quantum; in nl80211_set_wiphy()
3389 return -EINVAL; in nl80211_send_chandef()
3392 chandef->chan->center_freq)) in nl80211_send_chandef()
3393 return -ENOBUFS; in nl80211_send_chandef()
3395 chandef->chan->freq_offset)) in nl80211_send_chandef()
3396 return -ENOBUFS; in nl80211_send_chandef()
3397 switch (chandef->width) { in nl80211_send_chandef()
3403 return -ENOBUFS; in nl80211_send_chandef()
3408 if (nla_put_u32(msg, NL80211_ATTR_CHANNEL_WIDTH, chandef->width)) in nl80211_send_chandef()
3409 return -ENOBUFS; in nl80211_send_chandef()
3410 if (nla_put_u32(msg, NL80211_ATTR_CENTER_FREQ1, chandef->center_freq1)) in nl80211_send_chandef()
3411 return -ENOBUFS; in nl80211_send_chandef()
3412 if (chandef->center_freq2 && in nl80211_send_chandef()
3413 nla_put_u32(msg, NL80211_ATTR_CENTER_FREQ2, chandef->center_freq2)) in nl80211_send_chandef()
3414 return -ENOBUFS; in nl80211_send_chandef()
3423 struct net_device *dev = wdev->netdev; in nl80211_send_iface()
3432 return -1; in nl80211_send_iface()
3435 (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in nl80211_send_iface()
3436 nla_put_string(msg, NL80211_ATTR_IFNAME, dev->name))) in nl80211_send_iface()
3439 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_iface()
3440 nla_put_u32(msg, NL80211_ATTR_IFTYPE, wdev->iftype) || in nl80211_send_iface()
3445 rdev->devlist_generation ^ in nl80211_send_iface()
3447 nla_put_u8(msg, NL80211_ATTR_4ADDR, wdev->use_4addr)) in nl80211_send_iface()
3450 if (rdev->ops->get_channel) { in nl80211_send_iface()
3461 if (rdev->ops->get_tx_power) { in nl80211_send_iface()
3472 switch (wdev->iftype) { in nl80211_send_iface()
3474 if (wdev->ssid_len && in nl80211_send_iface()
3475 nla_put(msg, NL80211_ATTR_SSID, wdev->ssid_len, wdev->ssid)) in nl80211_send_iface()
3482 if (!wdev->current_bss) in nl80211_send_iface()
3485 ssid_ie = ieee80211_bss_get_ie(&wdev->current_bss->pub, in nl80211_send_iface()
3499 if (rdev->ops->get_txq_stats) { in nl80211_send_iface()
3518 return -EMSGSIZE; in nl80211_send_iface()
3525 int wp_start = cb->args[0]; in nl80211_dump_interface()
3526 int if_start = cb->args[1]; in nl80211_dump_interface()
3527 int filter_wiphy = -1; in nl80211_dump_interface()
3533 if (!cb->args[2]) { in nl80211_dump_interface()
3535 .filter_wiphy = -1, in nl80211_dump_interface()
3545 * if filtering, set cb->args[2] to +1 since 0 is the default in nl80211_dump_interface()
3549 cb->args[2] = filter_wiphy + 1; in nl80211_dump_interface()
3551 cb->args[2] = -1; in nl80211_dump_interface()
3552 } else if (cb->args[2] > 0) { in nl80211_dump_interface()
3553 filter_wiphy = cb->args[2] - 1; in nl80211_dump_interface()
3557 if (!net_eq(wiphy_net(&rdev->wiphy), sock_net(skb->sk))) in nl80211_dump_interface()
3564 if (filter_wiphy >= 0 && filter_wiphy != rdev->wiphy_idx) in nl80211_dump_interface()
3569 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) { in nl80211_dump_interface()
3574 if (nl80211_send_iface(skb, NETLINK_CB(cb->skb).portid, in nl80211_dump_interface()
3575 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_dump_interface()
3586 cb->args[0] = wp_idx; in nl80211_dump_interface()
3587 cb->args[1] = if_idx; in nl80211_dump_interface()
3589 ret = skb->len; in nl80211_dump_interface()
3599 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_interface()
3600 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_get_interface()
3604 return -ENOMEM; in nl80211_get_interface()
3606 if (nl80211_send_iface(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_interface()
3609 return -ENOBUFS; in nl80211_get_interface()
3632 return -EINVAL; in parse_monitor_flags()
3635 return -EINVAL; in parse_monitor_flags()
3654 if (info->attrs[NL80211_ATTR_MNTR_FLAGS]) { in nl80211_parse_mon_options()
3656 return -EINVAL; in nl80211_parse_mon_options()
3658 err = parse_monitor_flags(info->attrs[NL80211_ATTR_MNTR_FLAGS], in nl80211_parse_mon_options()
3659 &params->flags); in nl80211_parse_mon_options()
3666 if (params->flags & MONITOR_FLAG_ACTIVE && in nl80211_parse_mon_options()
3667 !(rdev->wiphy.features & NL80211_FEATURE_ACTIVE_MONITOR)) in nl80211_parse_mon_options()
3668 return -EOPNOTSUPP; in nl80211_parse_mon_options()
3670 if (info->attrs[NL80211_ATTR_MU_MIMO_GROUP_DATA]) { in nl80211_parse_mon_options()
3675 return -EINVAL; in nl80211_parse_mon_options()
3677 if (!wiphy_ext_feature_isset(&rdev->wiphy, cap_flag)) in nl80211_parse_mon_options()
3678 return -EOPNOTSUPP; in nl80211_parse_mon_options()
3681 nla_data(info->attrs[NL80211_ATTR_MU_MIMO_GROUP_DATA]); in nl80211_parse_mon_options()
3685 (mumimo_groups[VHT_MUMIMO_GROUPS_DATA_LEN - 1] & BIT(7))) in nl80211_parse_mon_options()
3686 return -EINVAL; in nl80211_parse_mon_options()
3688 params->vht_mumimo_groups = mumimo_groups; in nl80211_parse_mon_options()
3692 if (info->attrs[NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR]) { in nl80211_parse_mon_options()
3696 return -EINVAL; in nl80211_parse_mon_options()
3698 if (!wiphy_ext_feature_isset(&rdev->wiphy, cap_flag)) in nl80211_parse_mon_options()
3699 return -EOPNOTSUPP; in nl80211_parse_mon_options()
3701 params->vht_mumimo_follow_addr = in nl80211_parse_mon_options()
3702 nla_data(info->attrs[NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR]); in nl80211_parse_mon_options()
3715 return -EBUSY; in nl80211_valid_4addr()
3721 if (rdev->wiphy.flags & WIPHY_FLAG_4ADDR_AP) in nl80211_valid_4addr()
3725 if (rdev->wiphy.flags & WIPHY_FLAG_4ADDR_STATION) in nl80211_valid_4addr()
3732 return -EOPNOTSUPP; in nl80211_valid_4addr()
3737 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_interface()
3741 struct net_device *dev = info->user_ptr[1]; in nl80211_set_interface()
3746 otype = ntype = dev->ieee80211_ptr->iftype; in nl80211_set_interface()
3748 if (info->attrs[NL80211_ATTR_IFTYPE]) { in nl80211_set_interface()
3749 ntype = nla_get_u32(info->attrs[NL80211_ATTR_IFTYPE]); in nl80211_set_interface()
3754 if (info->attrs[NL80211_ATTR_MESH_ID]) { in nl80211_set_interface()
3755 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_interface()
3758 return -EINVAL; in nl80211_set_interface()
3760 return -EBUSY; in nl80211_set_interface()
3765 wdev->mesh_id_up_len = in nl80211_set_interface()
3766 nla_len(info->attrs[NL80211_ATTR_MESH_ID]); in nl80211_set_interface()
3767 memcpy(wdev->ssid, nla_data(info->attrs[NL80211_ATTR_MESH_ID]), in nl80211_set_interface()
3768 wdev->mesh_id_up_len); in nl80211_set_interface()
3772 if (info->attrs[NL80211_ATTR_4ADDR]) { in nl80211_set_interface()
3773 params.use_4addr = !!nla_get_u8(info->attrs[NL80211_ATTR_4ADDR]); in nl80211_set_interface()
3779 params.use_4addr = -1; in nl80211_set_interface()
3793 if (!err && params.use_4addr != -1) in nl80211_set_interface()
3794 dev->ieee80211_ptr->use_4addr = params.use_4addr; in nl80211_set_interface()
3797 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_interface()
3807 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_new_interface()
3819 if (!info->attrs[NL80211_ATTR_IFNAME]) in nl80211_new_interface()
3820 return -EINVAL; in nl80211_new_interface()
3822 if (info->attrs[NL80211_ATTR_IFTYPE]) in nl80211_new_interface()
3823 type = nla_get_u32(info->attrs[NL80211_ATTR_IFTYPE]); in nl80211_new_interface()
3825 if (!rdev->ops->add_virtual_intf) in nl80211_new_interface()
3826 return -EOPNOTSUPP; in nl80211_new_interface()
3829 rdev->wiphy.features & NL80211_FEATURE_MAC_ON_CREATE) && in nl80211_new_interface()
3830 info->attrs[NL80211_ATTR_MAC]) { in nl80211_new_interface()
3831 nla_memcpy(params.macaddr, info->attrs[NL80211_ATTR_MAC], in nl80211_new_interface()
3834 return -EADDRNOTAVAIL; in nl80211_new_interface()
3837 if (info->attrs[NL80211_ATTR_4ADDR]) { in nl80211_new_interface()
3838 params.use_4addr = !!nla_get_u8(info->attrs[NL80211_ATTR_4ADDR]); in nl80211_new_interface()
3844 if (!cfg80211_iftype_allowed(&rdev->wiphy, type, params.use_4addr, 0)) in nl80211_new_interface()
3845 return -EOPNOTSUPP; in nl80211_new_interface()
3853 return -ENOMEM; in nl80211_new_interface()
3856 nla_data(info->attrs[NL80211_ATTR_IFNAME]), in nl80211_new_interface()
3860 return -EPROTO; in nl80211_new_interface()
3866 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) in nl80211_new_interface()
3867 wdev->owner_nlportid = info->snd_portid; in nl80211_new_interface()
3871 if (!info->attrs[NL80211_ATTR_MESH_ID]) in nl80211_new_interface()
3876 wdev->mesh_id_up_len = in nl80211_new_interface()
3877 nla_len(info->attrs[NL80211_ATTR_MESH_ID]); in nl80211_new_interface()
3878 memcpy(wdev->ssid, nla_data(info->attrs[NL80211_ATTR_MESH_ID]), in nl80211_new_interface()
3879 wdev->mesh_id_up_len); in nl80211_new_interface()
3895 if (nl80211_send_iface(msg, info->snd_portid, info->snd_seq, 0, in nl80211_new_interface()
3898 return -ENOBUFS; in nl80211_new_interface()
3906 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_del_interface()
3907 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_del_interface()
3909 if (!rdev->ops->del_virtual_intf) in nl80211_del_interface()
3910 return -EOPNOTSUPP; in nl80211_del_interface()
3919 if (!wdev->netdev) in nl80211_del_interface()
3920 info->user_ptr[1] = NULL; in nl80211_del_interface()
3927 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_noack_map()
3928 struct net_device *dev = info->user_ptr[1]; in nl80211_set_noack_map()
3931 if (!info->attrs[NL80211_ATTR_NOACK_MAP]) in nl80211_set_noack_map()
3932 return -EINVAL; in nl80211_set_noack_map()
3934 if (!rdev->ops->set_noack_map) in nl80211_set_noack_map()
3935 return -EOPNOTSUPP; in nl80211_set_noack_map()
3937 noack_map = nla_get_u16(info->attrs[NL80211_ATTR_NOACK_MAP]); in nl80211_set_noack_map()
3953 if ((params->key && in get_key_callback()
3954 nla_put(cookie->msg, NL80211_ATTR_KEY_DATA, in get_key_callback()
3955 params->key_len, params->key)) || in get_key_callback()
3956 (params->seq && in get_key_callback()
3957 nla_put(cookie->msg, NL80211_ATTR_KEY_SEQ, in get_key_callback()
3958 params->seq_len, params->seq)) || in get_key_callback()
3959 (params->cipher && in get_key_callback()
3960 nla_put_u32(cookie->msg, NL80211_ATTR_KEY_CIPHER, in get_key_callback()
3961 params->cipher))) in get_key_callback()
3964 key = nla_nest_start_noflag(cookie->msg, NL80211_ATTR_KEY); in get_key_callback()
3968 if ((params->key && in get_key_callback()
3969 nla_put(cookie->msg, NL80211_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_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_KEY_CIPHER, in get_key_callback()
3976 params->cipher))) in get_key_callback()
3979 if (nla_put_u8(cookie->msg, NL80211_KEY_IDX, cookie->idx)) in get_key_callback()
3982 nla_nest_end(cookie->msg, key); in get_key_callback()
3986 cookie->error = 1; in get_key_callback()
3991 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_key()
3993 struct net_device *dev = info->user_ptr[1]; in nl80211_get_key()
4004 if (wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_get_key()
4008 if ((dev->ieee80211_ptr->iftype == NL80211_IFTYPE_STATION || in nl80211_get_key()
4009 dev->ieee80211_ptr->iftype == NL80211_IFTYPE_P2P_CLIENT) && in nl80211_get_key()
4010 wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_get_key()
4014 if (info->attrs[NL80211_ATTR_KEY_IDX]) { in nl80211_get_key()
4015 key_idx = nla_get_u8(info->attrs[NL80211_ATTR_KEY_IDX]); in nl80211_get_key()
4019 return -EINVAL; in nl80211_get_key()
4023 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_get_key()
4024 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_get_key()
4027 if (info->attrs[NL80211_ATTR_KEY_TYPE]) { in nl80211_get_key()
4028 u32 kt = nla_get_u32(info->attrs[NL80211_ATTR_KEY_TYPE]); in nl80211_get_key()
4032 return -EINVAL; in nl80211_get_key()
4036 if (!rdev->ops->get_key) in nl80211_get_key()
4037 return -EOPNOTSUPP; in nl80211_get_key()
4039 if (!pairwise && mac_addr && !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN)) in nl80211_get_key()
4040 return -ENOENT; in nl80211_get_key()
4044 return -ENOMEM; in nl80211_get_key()
4046 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_key()
4054 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in nl80211_get_key()
4074 err = -ENOBUFS; in nl80211_get_key()
4082 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_key()
4085 struct net_device *dev = info->user_ptr[1]; in nl80211_set_key()
4092 return -EINVAL; in nl80211_set_key()
4099 return -EINVAL; in nl80211_set_key()
4101 wdev_lock(dev->ieee80211_ptr); in nl80211_set_key()
4104 if (!rdev->ops->set_default_key) { in nl80211_set_key()
4105 err = -EOPNOTSUPP; in nl80211_set_key()
4109 err = nl80211_key_allowed(dev->ieee80211_ptr); in nl80211_set_key()
4120 dev->ieee80211_ptr->wext.default_key = key.idx; in nl80211_set_key()
4124 err = -EINVAL; in nl80211_set_key()
4128 if (!rdev->ops->set_default_mgmt_key) { in nl80211_set_key()
4129 err = -EOPNOTSUPP; in nl80211_set_key()
4133 err = nl80211_key_allowed(dev->ieee80211_ptr); in nl80211_set_key()
4142 dev->ieee80211_ptr->wext.default_mgmt_key = key.idx; in nl80211_set_key()
4146 err = -EINVAL; in nl80211_set_key()
4150 if (!rdev->ops->set_default_beacon_key) { in nl80211_set_key()
4151 err = -EOPNOTSUPP; in nl80211_set_key()
4155 err = nl80211_key_allowed(dev->ieee80211_ptr); in nl80211_set_key()
4163 wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_set_key()
4167 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_set_key()
4168 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_set_key()
4171 err = -EINVAL; in nl80211_set_key()
4179 err = -EINVAL; in nl80211_set_key()
4182 wdev_unlock(dev->ieee80211_ptr); in nl80211_set_key()
4189 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_new_key()
4191 struct net_device *dev = info->user_ptr[1]; in nl80211_new_key()
4201 return -EINVAL; in nl80211_new_key()
4204 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_new_key()
4205 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_new_key()
4207 if (key.type == -1) { in nl80211_new_key()
4218 return -EINVAL; in nl80211_new_key()
4222 info->attrs[NL80211_ATTR_VLAN_ID]) in nl80211_new_key()
4223 key.p.vlan_id = nla_get_u16(info->attrs[NL80211_ATTR_VLAN_ID]); in nl80211_new_key()
4225 if (!rdev->ops->add_key) in nl80211_new_key()
4226 return -EOPNOTSUPP; in nl80211_new_key()
4232 return -EINVAL; in nl80211_new_key()
4235 wdev_lock(dev->ieee80211_ptr); in nl80211_new_key()
4236 err = nl80211_key_allowed(dev->ieee80211_ptr); in nl80211_new_key()
4246 wdev_unlock(dev->ieee80211_ptr); in nl80211_new_key()
4253 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_del_key()
4255 struct net_device *dev = info->user_ptr[1]; in nl80211_del_key()
4264 return -EINVAL; in nl80211_del_key()
4266 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_del_key()
4267 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_del_key()
4269 if (key.type == -1) { in nl80211_del_key()
4279 return -EINVAL; in nl80211_del_key()
4281 if (!rdev->ops->del_key) in nl80211_del_key()
4282 return -EOPNOTSUPP; in nl80211_del_key()
4284 wdev_lock(dev->ieee80211_ptr); in nl80211_del_key()
4285 err = nl80211_key_allowed(dev->ieee80211_ptr); in nl80211_del_key()
4288 !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN)) in nl80211_del_key()
4289 err = -ENOENT; in nl80211_del_key()
4298 if (key.idx == dev->ieee80211_ptr->wext.default_key) in nl80211_del_key()
4299 dev->ieee80211_ptr->wext.default_key = -1; in nl80211_del_key()
4300 else if (key.idx == dev->ieee80211_ptr->wext.default_mgmt_key) in nl80211_del_key()
4301 dev->ieee80211_ptr->wext.default_mgmt_key = -1; in nl80211_del_key()
4304 wdev_unlock(dev->ieee80211_ptr); in nl80211_del_key()
4317 return -EINVAL; in validate_acl_mac_addrs()
4338 if (!wiphy->max_acl_mac_addrs) in parse_acl_data()
4339 return ERR_PTR(-EOPNOTSUPP); in parse_acl_data()
4341 if (!info->attrs[NL80211_ATTR_ACL_POLICY]) in parse_acl_data()
4342 return ERR_PTR(-EINVAL); in parse_acl_data()
4344 acl_policy = nla_get_u32(info->attrs[NL80211_ATTR_ACL_POLICY]); in parse_acl_data()
4347 return ERR_PTR(-EINVAL); in parse_acl_data()
4349 if (!info->attrs[NL80211_ATTR_MAC_ADDRS]) in parse_acl_data()
4350 return ERR_PTR(-EINVAL); in parse_acl_data()
4352 n_entries = validate_acl_mac_addrs(info->attrs[NL80211_ATTR_MAC_ADDRS]); in parse_acl_data()
4356 if (n_entries > wiphy->max_acl_mac_addrs) in parse_acl_data()
4357 return ERR_PTR(-ENOTSUPP); in parse_acl_data()
4361 return ERR_PTR(-ENOMEM); in parse_acl_data()
4363 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_MAC_ADDRS], tmp) { in parse_acl_data()
4364 memcpy(acl->mac_addrs[i].addr, nla_data(attr), ETH_ALEN); in parse_acl_data()
4368 acl->n_acl_entries = n_entries; in parse_acl_data()
4369 acl->acl_policy = acl_policy; in parse_acl_data()
4376 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_mac_acl()
4377 struct net_device *dev = info->user_ptr[1]; in nl80211_set_mac_acl()
4381 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && in nl80211_set_mac_acl()
4382 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_set_mac_acl()
4383 return -EOPNOTSUPP; in nl80211_set_mac_acl()
4385 if (!dev->ieee80211_ptr->beacon_interval) in nl80211_set_mac_acl()
4386 return -EINVAL; in nl80211_set_mac_acl()
4388 acl = parse_acl_data(&rdev->wiphy, info); in nl80211_set_mac_acl()
4409 for (ridx = 0; ridx < sband->n_bitrates; ridx++) { in rateset_to_mask()
4411 &sband->bitrates[ridx]; in rateset_to_mask()
4412 if (rate == srate->bitrate) { in rateset_to_mask()
4417 if (ridx == sband->n_bitrates) in rateset_to_mask()
4444 if (sband->ht_cap.mcs.rx_mask[ridx] & rbit) in ht_rateset_to_mask()
4491 u16 tx_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map); in vht_set_mcs_mask()
4495 if (!sband->vht_cap.vht_supported) in vht_set_mcs_mask()
4504 if ((tx_mcs_mask[i] & txrate->mcs[i]) == txrate->mcs[i]) in vht_set_mcs_mask()
4505 mcs[i] = txrate->mcs[i]; in vht_set_mcs_mask()
4544 struct net_device *dev = info->user_ptr[1]; in he_get_txmcsmap()
4545 struct wireless_dev *wdev = dev->ieee80211_ptr; in he_get_txmcsmap()
4548 switch (wdev->chandef.width) { in he_get_txmcsmap()
4550 tx_mcs = he_cap->he_mcs_nss_supp.tx_mcs_80p80; in he_get_txmcsmap()
4553 tx_mcs = he_cap->he_mcs_nss_supp.tx_mcs_160; in he_get_txmcsmap()
4556 tx_mcs = he_cap->he_mcs_nss_supp.tx_mcs_80; in he_get_txmcsmap()
4573 he_cap = ieee80211_get_he_iftype_cap(sband, wdev->iftype); in he_set_mcs_mask()
4585 if ((tx_mcs_mask[i] & txrate->mcs[i]) == txrate->mcs[i]) in he_set_mcs_mask()
4586 mcs[i] = txrate->mcs[i]; in he_set_mcs_mask()
4601 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_parse_tx_bitrate_mask()
4602 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_parse_tx_bitrate_mask()
4613 sband = rdev->wiphy.bands[i]; in nl80211_parse_tx_bitrate_mask()
4618 mask->control[i].legacy = (1 << sband->n_bitrates) - 1; in nl80211_parse_tx_bitrate_mask()
4619 memcpy(mask->control[i].ht_mcs, in nl80211_parse_tx_bitrate_mask()
4620 sband->ht_cap.mcs.rx_mask, in nl80211_parse_tx_bitrate_mask()
4621 sizeof(mask->control[i].ht_mcs)); in nl80211_parse_tx_bitrate_mask()
4623 if (!sband->vht_cap.vht_supported) in nl80211_parse_tx_bitrate_mask()
4626 vht_tx_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map); in nl80211_parse_tx_bitrate_mask()
4627 vht_build_mcs_mask(vht_tx_mcs_map, mask->control[i].vht_mcs); in nl80211_parse_tx_bitrate_mask()
4629 he_cap = ieee80211_get_he_iftype_cap(sband, wdev->iftype); in nl80211_parse_tx_bitrate_mask()
4634 he_build_mcs_mask(he_tx_mcs_map, mask->control[i].he_mcs); in nl80211_parse_tx_bitrate_mask()
4636 mask->control[i].he_gi = 0xFF; in nl80211_parse_tx_bitrate_mask()
4637 mask->control[i].he_ltf = 0xFF; in nl80211_parse_tx_bitrate_mask()
4653 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
4654 sband = rdev->wiphy.bands[band]; in nl80211_parse_tx_bitrate_mask()
4656 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
4660 info->extack); in nl80211_parse_tx_bitrate_mask()
4664 mask->control[band].legacy = rateset_to_mask( in nl80211_parse_tx_bitrate_mask()
4668 if ((mask->control[band].legacy == 0) && in nl80211_parse_tx_bitrate_mask()
4670 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
4677 mask->control[band].ht_mcs)) in nl80211_parse_tx_bitrate_mask()
4678 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
4684 mask->control[band].vht_mcs)) in nl80211_parse_tx_bitrate_mask()
4685 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
4688 mask->control[band].gi = in nl80211_parse_tx_bitrate_mask()
4690 if (mask->control[band].gi > NL80211_TXRATE_FORCE_LGI) in nl80211_parse_tx_bitrate_mask()
4691 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
4696 mask->control[band].he_mcs)) in nl80211_parse_tx_bitrate_mask()
4697 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
4699 mask->control[band].he_gi = in nl80211_parse_tx_bitrate_mask()
4702 mask->control[band].he_ltf = in nl80211_parse_tx_bitrate_mask()
4705 if (mask->control[band].legacy == 0) { in nl80211_parse_tx_bitrate_mask()
4709 if (!(rdev->wiphy.bands[band]->ht_cap.ht_supported || in nl80211_parse_tx_bitrate_mask()
4710 rdev->wiphy.bands[band]->vht_cap.vht_supported || in nl80211_parse_tx_bitrate_mask()
4711 ieee80211_get_he_iftype_cap(sband, wdev->iftype))) in nl80211_parse_tx_bitrate_mask()
4712 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
4715 if (mask->control[band].ht_mcs[i]) in nl80211_parse_tx_bitrate_mask()
4719 if (mask->control[band].vht_mcs[i]) in nl80211_parse_tx_bitrate_mask()
4723 if (mask->control[band].he_mcs[i]) in nl80211_parse_tx_bitrate_mask()
4727 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
4740 u32 rate = beacon_rate->control[band].legacy; in validate_beacon_tx_rate()
4744 return -EINVAL; in validate_beacon_tx_rate()
4748 if (hweight8(beacon_rate->control[band].ht_mcs[i]) > 1) { in validate_beacon_tx_rate()
4749 return -EINVAL; in validate_beacon_tx_rate()
4750 } else if (beacon_rate->control[band].ht_mcs[i]) { in validate_beacon_tx_rate()
4753 return -EINVAL; in validate_beacon_tx_rate()
4756 return -EINVAL; in validate_beacon_tx_rate()
4761 if (hweight16(beacon_rate->control[band].vht_mcs[i]) > 1) { in validate_beacon_tx_rate()
4762 return -EINVAL; in validate_beacon_tx_rate()
4763 } else if (beacon_rate->control[band].vht_mcs[i]) { in validate_beacon_tx_rate()
4766 return -EINVAL; in validate_beacon_tx_rate()
4769 return -EINVAL; in validate_beacon_tx_rate()
4773 return -EINVAL; in validate_beacon_tx_rate()
4776 !wiphy_ext_feature_isset(&rdev->wiphy, in validate_beacon_tx_rate()
4778 return -EINVAL; in validate_beacon_tx_rate()
4780 !wiphy_ext_feature_isset(&rdev->wiphy, in validate_beacon_tx_rate()
4782 return -EINVAL; in validate_beacon_tx_rate()
4784 !wiphy_ext_feature_isset(&rdev->wiphy, in validate_beacon_tx_rate()
4786 return -EINVAL; in validate_beacon_tx_rate()
4801 bcn->head = nla_data(attrs[NL80211_ATTR_BEACON_HEAD]); in nl80211_parse_beacon()
4802 bcn->head_len = nla_len(attrs[NL80211_ATTR_BEACON_HEAD]); in nl80211_parse_beacon()
4803 if (!bcn->head_len) in nl80211_parse_beacon()
4804 return -EINVAL; in nl80211_parse_beacon()
4809 bcn->tail = nla_data(attrs[NL80211_ATTR_BEACON_TAIL]); in nl80211_parse_beacon()
4810 bcn->tail_len = nla_len(attrs[NL80211_ATTR_BEACON_TAIL]); in nl80211_parse_beacon()
4815 return -EINVAL; in nl80211_parse_beacon()
4818 bcn->beacon_ies = nla_data(attrs[NL80211_ATTR_IE]); in nl80211_parse_beacon()
4819 bcn->beacon_ies_len = nla_len(attrs[NL80211_ATTR_IE]); in nl80211_parse_beacon()
4823 bcn->proberesp_ies = in nl80211_parse_beacon()
4825 bcn->proberesp_ies_len = in nl80211_parse_beacon()
4830 bcn->assocresp_ies = in nl80211_parse_beacon()
4832 bcn->assocresp_ies_len = in nl80211_parse_beacon()
4837 bcn->probe_resp = nla_data(attrs[NL80211_ATTR_PROBE_RESP]); in nl80211_parse_beacon()
4838 bcn->probe_resp_len = nla_len(attrs[NL80211_ATTR_PROBE_RESP]); in nl80211_parse_beacon()
4852 wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_parse_beacon()
4854 bcn->ftm_responder = 1; in nl80211_parse_beacon()
4856 return -EOPNOTSUPP; in nl80211_parse_beacon()
4859 bcn->lci = nla_data(tb[NL80211_FTM_RESP_ATTR_LCI]); in nl80211_parse_beacon()
4860 bcn->lci_len = nla_len(tb[NL80211_FTM_RESP_ATTR_LCI]); in nl80211_parse_beacon()
4864 bcn->civicloc = nla_data(tb[NL80211_FTM_RESP_ATTR_CIVICLOC]); in nl80211_parse_beacon()
4865 bcn->civicloc_len = nla_len(tb[NL80211_FTM_RESP_ATTR_CIVICLOC]); in nl80211_parse_beacon()
4868 bcn->ftm_responder = -1; in nl80211_parse_beacon()
4886 return -EINVAL; in nl80211_parse_he_obss_pd()
4888 he_obss_pd->sr_ctrl = nla_get_u8(tb[NL80211_HE_OBSS_PD_ATTR_SR_CTRL]); in nl80211_parse_he_obss_pd()
4891 he_obss_pd->min_offset = in nl80211_parse_he_obss_pd()
4894 he_obss_pd->max_offset = in nl80211_parse_he_obss_pd()
4897 he_obss_pd->non_srg_max_offset = in nl80211_parse_he_obss_pd()
4900 if (he_obss_pd->min_offset > he_obss_pd->max_offset) in nl80211_parse_he_obss_pd()
4901 return -EINVAL; in nl80211_parse_he_obss_pd()
4904 memcpy(he_obss_pd->bss_color_bitmap, in nl80211_parse_he_obss_pd()
4906 sizeof(he_obss_pd->bss_color_bitmap)); in nl80211_parse_he_obss_pd()
4909 memcpy(he_obss_pd->partial_bssid_bitmap, in nl80211_parse_he_obss_pd()
4911 sizeof(he_obss_pd->partial_bssid_bitmap)); in nl80211_parse_he_obss_pd()
4913 he_obss_pd->enable = true; in nl80211_parse_he_obss_pd()
4930 return -EINVAL; in nl80211_parse_he_bss_color()
4932 he_bss_color->color = in nl80211_parse_he_bss_color()
4934 he_bss_color->enabled = in nl80211_parse_he_bss_color()
4936 he_bss_color->partial = in nl80211_parse_he_bss_color()
4948 struct cfg80211_fils_discovery *fd = &params->fils_discovery; in nl80211_parse_fils_discovery()
4950 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_parse_fils_discovery()
4952 return -EINVAL; in nl80211_parse_fils_discovery()
4962 return -EINVAL; in nl80211_parse_fils_discovery()
4964 fd->tmpl_len = nla_len(tb[NL80211_FILS_DISCOVERY_ATTR_TMPL]); in nl80211_parse_fils_discovery()
4965 fd->tmpl = nla_data(tb[NL80211_FILS_DISCOVERY_ATTR_TMPL]); in nl80211_parse_fils_discovery()
4966 fd->min_interval = nla_get_u32(tb[NL80211_FILS_DISCOVERY_ATTR_INT_MIN]); in nl80211_parse_fils_discovery()
4967 fd->max_interval = nla_get_u32(tb[NL80211_FILS_DISCOVERY_ATTR_INT_MAX]); in nl80211_parse_fils_discovery()
4980 &params->unsol_bcast_probe_resp; in nl80211_parse_unsol_bcast_probe_resp()
4982 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_parse_unsol_bcast_probe_resp()
4984 return -EINVAL; in nl80211_parse_unsol_bcast_probe_resp()
4993 return -EINVAL; in nl80211_parse_unsol_bcast_probe_resp()
4995 presp->tmpl = nla_data(tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_TMPL]); in nl80211_parse_unsol_bcast_probe_resp()
4996 presp->tmpl_len = nla_len(tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_TMPL]); in nl80211_parse_unsol_bcast_probe_resp()
4997 presp->interval = nla_get_u32(tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_INT]); in nl80211_parse_unsol_bcast_probe_resp()
5011 params->ht_required = true; in nl80211_check_ap_rate_selectors()
5013 params->vht_required = true; in nl80211_check_ap_rate_selectors()
5015 params->he_required = true; in nl80211_check_ap_rate_selectors()
5026 const struct cfg80211_beacon_data *bcn = &params->beacon; in nl80211_calculate_ap_params()
5027 size_t ies_len = bcn->tail_len; in nl80211_calculate_ap_params()
5028 const u8 *ies = bcn->tail; in nl80211_calculate_ap_params()
5039 if (cap && cap[1] >= sizeof(*params->ht_cap)) in nl80211_calculate_ap_params()
5040 params->ht_cap = (void *)(cap + 2); in nl80211_calculate_ap_params()
5042 if (cap && cap[1] >= sizeof(*params->vht_cap)) in nl80211_calculate_ap_params()
5043 params->vht_cap = (void *)(cap + 2); in nl80211_calculate_ap_params()
5045 if (cap && cap[1] >= sizeof(*params->he_cap) + 1) in nl80211_calculate_ap_params()
5046 params->he_cap = (void *)(cap + 3); in nl80211_calculate_ap_params()
5048 if (cap && cap[1] >= sizeof(*params->he_oper) + 1) in nl80211_calculate_ap_params()
5049 params->he_oper = (void *)(cap + 3); in nl80211_calculate_ap_params()
5058 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) { in nl80211_get_ap_channel()
5059 if (wdev->iftype != NL80211_IFTYPE_AP && in nl80211_get_ap_channel()
5060 wdev->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_get_ap_channel()
5063 if (!wdev->preset_chandef.chan) in nl80211_get_ap_channel()
5066 params->chandef = wdev->preset_chandef; in nl80211_get_ap_channel()
5083 if (!(rdev->wiphy.features & NL80211_FEATURE_SAE) && in nl80211_valid_auth_type()
5086 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_valid_auth_type()
5094 if (!(rdev->wiphy.features & NL80211_FEATURE_SAE) && in nl80211_valid_auth_type()
5095 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_valid_auth_type()
5105 &rdev->wiphy, in nl80211_valid_auth_type()
5111 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_valid_auth_type()
5128 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_start_ap()
5129 struct net_device *dev = info->user_ptr[1]; in nl80211_start_ap()
5130 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_start_ap()
5134 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && in nl80211_start_ap()
5135 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_start_ap()
5136 return -EOPNOTSUPP; in nl80211_start_ap()
5138 if (!rdev->ops->start_ap) in nl80211_start_ap()
5139 return -EOPNOTSUPP; in nl80211_start_ap()
5141 if (wdev->beacon_interval) in nl80211_start_ap()
5142 return -EALREADY; in nl80211_start_ap()
5147 if (!info->attrs[NL80211_ATTR_BEACON_INTERVAL] || in nl80211_start_ap()
5148 !info->attrs[NL80211_ATTR_DTIM_PERIOD] || in nl80211_start_ap()
5149 !info->attrs[NL80211_ATTR_BEACON_HEAD]) in nl80211_start_ap()
5150 return -EINVAL; in nl80211_start_ap()
5152 err = nl80211_parse_beacon(rdev, info->attrs, &params.beacon); in nl80211_start_ap()
5157 nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]); in nl80211_start_ap()
5159 nla_get_u32(info->attrs[NL80211_ATTR_DTIM_PERIOD]); in nl80211_start_ap()
5161 err = cfg80211_validate_beacon_int(rdev, dev->ieee80211_ptr->iftype, in nl80211_start_ap()
5171 * additional information -- drivers must check! in nl80211_start_ap()
5173 if (info->attrs[NL80211_ATTR_SSID]) { in nl80211_start_ap()
5174 params.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); in nl80211_start_ap()
5176 nla_len(info->attrs[NL80211_ATTR_SSID]); in nl80211_start_ap()
5178 return -EINVAL; in nl80211_start_ap()
5181 if (info->attrs[NL80211_ATTR_HIDDEN_SSID]) in nl80211_start_ap()
5183 info->attrs[NL80211_ATTR_HIDDEN_SSID]); in nl80211_start_ap()
5185 params.privacy = !!info->attrs[NL80211_ATTR_PRIVACY]; in nl80211_start_ap()
5187 if (info->attrs[NL80211_ATTR_AUTH_TYPE]) { in nl80211_start_ap()
5189 info->attrs[NL80211_ATTR_AUTH_TYPE]); in nl80211_start_ap()
5192 return -EINVAL; in nl80211_start_ap()
5201 if (info->attrs[NL80211_ATTR_INACTIVITY_TIMEOUT]) { in nl80211_start_ap()
5202 if (!(rdev->wiphy.features & NL80211_FEATURE_INACTIVITY_TIMER)) in nl80211_start_ap()
5203 return -EOPNOTSUPP; in nl80211_start_ap()
5205 info->attrs[NL80211_ATTR_INACTIVITY_TIMEOUT]); in nl80211_start_ap()
5208 if (info->attrs[NL80211_ATTR_P2P_CTWINDOW]) { in nl80211_start_ap()
5209 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_start_ap()
5210 return -EINVAL; in nl80211_start_ap()
5212 nla_get_u8(info->attrs[NL80211_ATTR_P2P_CTWINDOW]); in nl80211_start_ap()
5214 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_CTWIN)) in nl80211_start_ap()
5215 return -EINVAL; in nl80211_start_ap()
5218 if (info->attrs[NL80211_ATTR_P2P_OPPPS]) { in nl80211_start_ap()
5221 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_start_ap()
5222 return -EINVAL; in nl80211_start_ap()
5223 tmp = nla_get_u8(info->attrs[NL80211_ATTR_P2P_OPPPS]); in nl80211_start_ap()
5226 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_OPPPS)) in nl80211_start_ap()
5227 return -EINVAL; in nl80211_start_ap()
5230 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { in nl80211_start_ap()
5234 } else if (wdev->preset_chandef.chan) { in nl80211_start_ap()
5235 params.chandef = wdev->preset_chandef; in nl80211_start_ap()
5237 return -EINVAL; in nl80211_start_ap()
5239 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &params.chandef, in nl80211_start_ap()
5240 wdev->iftype)) in nl80211_start_ap()
5241 return -EINVAL; in nl80211_start_ap()
5243 if (info->attrs[NL80211_ATTR_TX_RATES]) { in nl80211_start_ap()
5244 err = nl80211_parse_tx_bitrate_mask(info, info->attrs, in nl80211_start_ap()
5251 err = validate_beacon_tx_rate(rdev, params.chandef.chan->band, in nl80211_start_ap()
5257 if (info->attrs[NL80211_ATTR_SMPS_MODE]) { in nl80211_start_ap()
5259 nla_get_u8(info->attrs[NL80211_ATTR_SMPS_MODE]); in nl80211_start_ap()
5264 if (!(rdev->wiphy.features & in nl80211_start_ap()
5266 return -EINVAL; in nl80211_start_ap()
5269 if (!(rdev->wiphy.features & in nl80211_start_ap()
5271 return -EINVAL; in nl80211_start_ap()
5274 return -EINVAL; in nl80211_start_ap()
5280 params.pbss = nla_get_flag(info->attrs[NL80211_ATTR_PBSS]); in nl80211_start_ap()
5281 if (params.pbss && !rdev->wiphy.bands[NL80211_BAND_60GHZ]) in nl80211_start_ap()
5282 return -EOPNOTSUPP; in nl80211_start_ap()
5284 if (info->attrs[NL80211_ATTR_ACL_POLICY]) { in nl80211_start_ap()
5285 params.acl = parse_acl_data(&rdev->wiphy, info); in nl80211_start_ap()
5291 nla_get_flag(info->attrs[NL80211_ATTR_TWT_RESPONDER]); in nl80211_start_ap()
5293 if (info->attrs[NL80211_ATTR_HE_OBSS_PD]) { in nl80211_start_ap()
5295 info->attrs[NL80211_ATTR_HE_OBSS_PD], in nl80211_start_ap()
5301 if (info->attrs[NL80211_ATTR_HE_BSS_COLOR]) { in nl80211_start_ap()
5303 info->attrs[NL80211_ATTR_HE_BSS_COLOR], in nl80211_start_ap()
5309 if (info->attrs[NL80211_ATTR_FILS_DISCOVERY]) { in nl80211_start_ap()
5311 info->attrs[NL80211_ATTR_FILS_DISCOVERY], in nl80211_start_ap()
5317 if (info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP]) { in nl80211_start_ap()
5319 rdev, info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP], in nl80211_start_ap()
5327 if (info->attrs[NL80211_ATTR_EXTERNAL_AUTH_SUPPORT]) in nl80211_start_ap()
5333 wdev->preset_chandef = params.chandef; in nl80211_start_ap()
5334 wdev->beacon_interval = params.beacon_interval; in nl80211_start_ap()
5335 wdev->chandef = params.chandef; in nl80211_start_ap()
5336 wdev->ssid_len = params.ssid_len; in nl80211_start_ap()
5337 memcpy(wdev->ssid, params.ssid, wdev->ssid_len); in nl80211_start_ap()
5339 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) in nl80211_start_ap()
5340 wdev->conn_owner_nlportid = info->snd_portid; in nl80211_start_ap()
5352 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_beacon()
5353 struct net_device *dev = info->user_ptr[1]; in nl80211_set_beacon()
5354 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_beacon()
5358 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && in nl80211_set_beacon()
5359 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_set_beacon()
5360 return -EOPNOTSUPP; in nl80211_set_beacon()
5362 if (!rdev->ops->change_beacon) in nl80211_set_beacon()
5363 return -EOPNOTSUPP; in nl80211_set_beacon()
5365 if (!wdev->beacon_interval) in nl80211_set_beacon()
5366 return -EINVAL; in nl80211_set_beacon()
5368 err = nl80211_parse_beacon(rdev, info->attrs, &params); in nl80211_set_beacon()
5381 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_stop_ap()
5382 struct net_device *dev = info->user_ptr[1]; in nl80211_stop_ap()
5408 nla = info->attrs[NL80211_ATTR_STA_FLAGS2]; in parse_station_flags()
5413 params->sta_flags_mask = sta_flags->mask; in parse_station_flags()
5414 params->sta_flags_set = sta_flags->set; in parse_station_flags()
5415 params->sta_flags_set &= params->sta_flags_mask; in parse_station_flags()
5416 if ((params->sta_flags_mask | in parse_station_flags()
5417 params->sta_flags_set) & BIT(__NL80211_STA_FLAG_INVALID)) in parse_station_flags()
5418 return -EINVAL; in parse_station_flags()
5424 nla = info->attrs[NL80211_ATTR_STA_FLAGS]; in parse_station_flags()
5428 if (nla_parse_nested_deprecated(flags, NL80211_STA_FLAG_MAX, nla, sta_flags_policy, info->extack)) in parse_station_flags()
5429 return -EINVAL; in parse_station_flags()
5441 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHORIZED) | in parse_station_flags()
5448 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHORIZED) | in parse_station_flags()
5452 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHENTICATED) | in parse_station_flags()
5457 return -EINVAL; in parse_station_flags()
5462 params->sta_flags_set |= (1<<flag); in parse_station_flags()
5466 return -EINVAL; in parse_station_flags()
5486 /* report 16-bit bitrate only if we can */ in nl80211_put_sta_rate()
5495 switch (info->bw) { in nl80211_put_sta_rate()
5519 WARN_ON(!(info->flags & RATE_INFO_FLAGS_HE_MCS)); in nl80211_put_sta_rate()
5525 if (info->flags & RATE_INFO_FLAGS_MCS) { in nl80211_put_sta_rate()
5526 if (nla_put_u8(msg, NL80211_RATE_INFO_MCS, info->mcs)) in nl80211_put_sta_rate()
5528 if (info->flags & RATE_INFO_FLAGS_SHORT_GI && in nl80211_put_sta_rate()
5531 } else if (info->flags & RATE_INFO_FLAGS_VHT_MCS) { in nl80211_put_sta_rate()
5532 if (nla_put_u8(msg, NL80211_RATE_INFO_VHT_MCS, info->mcs)) in nl80211_put_sta_rate()
5534 if (nla_put_u8(msg, NL80211_RATE_INFO_VHT_NSS, info->nss)) in nl80211_put_sta_rate()
5536 if (info->flags & RATE_INFO_FLAGS_SHORT_GI && in nl80211_put_sta_rate()
5539 } else if (info->flags & RATE_INFO_FLAGS_HE_MCS) { in nl80211_put_sta_rate()
5540 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_MCS, info->mcs)) in nl80211_put_sta_rate()
5542 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_NSS, info->nss)) in nl80211_put_sta_rate()
5544 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_GI, info->he_gi)) in nl80211_put_sta_rate()
5546 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_DCM, info->he_dcm)) in nl80211_put_sta_rate()
5548 if (info->bw == RATE_INFO_BW_HE_RU && in nl80211_put_sta_rate()
5550 info->he_ru_alloc)) in nl80211_put_sta_rate()
5596 return -1; in nl80211_send_station()
5599 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in nl80211_send_station()
5601 nla_put_u32(msg, NL80211_ATTR_GENERATION, sinfo->generation)) in nl80211_send_station()
5610 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_ ## attr) && \ in nl80211_send_station()
5612 sinfo->memb)) \ in nl80211_send_station()
5616 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_ ## attr) && \ in nl80211_send_station()
5618 sinfo->memb, NL80211_STA_INFO_PAD)) \ in nl80211_send_station()
5626 if (sinfo->filled & (BIT_ULL(NL80211_STA_INFO_RX_BYTES) | in nl80211_send_station()
5629 (u32)sinfo->rx_bytes)) in nl80211_send_station()
5632 if (sinfo->filled & (BIT_ULL(NL80211_STA_INFO_TX_BYTES) | in nl80211_send_station()
5635 (u32)sinfo->tx_bytes)) in nl80211_send_station()
5646 if (wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_send_station()
5650 switch (rdev->wiphy.signal_type) { in nl80211_send_station()
5658 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL)) { in nl80211_send_station()
5659 if (!nl80211_put_signal(msg, sinfo->chains, in nl80211_send_station()
5660 sinfo->chain_signal, in nl80211_send_station()
5664 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL_AVG)) { in nl80211_send_station()
5665 if (!nl80211_put_signal(msg, sinfo->chains, in nl80211_send_station()
5666 sinfo->chain_signal_avg, in nl80211_send_station()
5670 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_TX_BITRATE)) { in nl80211_send_station()
5671 if (!nl80211_put_sta_rate(msg, &sinfo->txrate, in nl80211_send_station()
5675 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_RX_BITRATE)) { in nl80211_send_station()
5676 if (!nl80211_put_sta_rate(msg, &sinfo->rxrate, in nl80211_send_station()
5694 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_BSS_PARAM)) { in nl80211_send_station()
5700 if (((sinfo->bss_param.flags & BSS_PARAM_FLAGS_CTS_PROT) && in nl80211_send_station()
5702 ((sinfo->bss_param.flags & BSS_PARAM_FLAGS_SHORT_PREAMBLE) && in nl80211_send_station()
5704 ((sinfo->bss_param.flags & BSS_PARAM_FLAGS_SHORT_SLOT_TIME) && in nl80211_send_station()
5707 sinfo->bss_param.dtim_period) || in nl80211_send_station()
5709 sinfo->bss_param.beacon_interval)) in nl80211_send_station()
5714 if ((sinfo->filled & BIT_ULL(NL80211_STA_INFO_STA_FLAGS)) && in nl80211_send_station()
5717 &sinfo->sta_flags)) in nl80211_send_station()
5726 if (wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_send_station()
5735 if (sinfo->pertid) { in nl80211_send_station()
5748 tidstats = &sinfo->pertid[tid]; in nl80211_send_station()
5750 if (!tidstats->filled) in nl80211_send_station()
5758 if (tidstats->filled & BIT(NL80211_TID_STATS_ ## attr) && \ in nl80211_send_station()
5760 tidstats->memb, NL80211_TID_STATS_PAD)) \ in nl80211_send_station()
5770 if ((tidstats->filled & in nl80211_send_station()
5772 !nl80211_put_txq_stats(msg, &tidstats->txq_stats, in nl80211_send_station()
5784 if (sinfo->assoc_req_ies_len && in nl80211_send_station()
5785 nla_put(msg, NL80211_ATTR_IE, sinfo->assoc_req_ies_len, in nl80211_send_station()
5786 sinfo->assoc_req_ies)) in nl80211_send_station()
5796 return -EMSGSIZE; in nl80211_send_station()
5806 int sta_idx = cb->args[2]; in nl80211_dump_station()
5814 if (!wdev->netdev) { in nl80211_dump_station()
5815 err = -EINVAL; in nl80211_dump_station()
5819 if (!rdev->ops->dump_station) { in nl80211_dump_station()
5820 err = -EOPNOTSUPP; in nl80211_dump_station()
5826 err = rdev_dump_station(rdev, wdev->netdev, sta_idx, in nl80211_dump_station()
5828 if (err == -ENOENT) in nl80211_dump_station()
5834 NETLINK_CB(cb->skb).portid, in nl80211_dump_station()
5835 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_dump_station()
5836 rdev, wdev->netdev, mac_addr, in nl80211_dump_station()
5844 cb->args[2] = sta_idx; in nl80211_dump_station()
5845 err = skb->len; in nl80211_dump_station()
5854 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_station()
5855 struct net_device *dev = info->user_ptr[1]; in nl80211_get_station()
5863 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_get_station()
5864 return -EINVAL; in nl80211_get_station()
5866 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_get_station()
5868 if (!rdev->ops->get_station) in nl80211_get_station()
5869 return -EOPNOTSUPP; in nl80211_get_station()
5878 return -ENOMEM; in nl80211_get_station()
5882 info->snd_portid, info->snd_seq, 0, in nl80211_get_station()
5885 return -ENOBUFS; in nl80211_get_station()
5895 if (params->listen_interval != -1 && in cfg80211_check_station_change()
5897 return -EINVAL; in cfg80211_check_station_change()
5899 if (params->support_p2p_ps != -1 && in cfg80211_check_station_change()
5901 return -EINVAL; in cfg80211_check_station_change()
5903 if (params->aid && in cfg80211_check_station_change()
5904 !(params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) && in cfg80211_check_station_change()
5906 return -EINVAL; in cfg80211_check_station_change()
5915 * No ignoring the TDLS flag here -- the userspace mesh in cfg80211_check_station_change()
5919 if (params->sta_flags_mask & in cfg80211_check_station_change()
5923 return -EINVAL; in cfg80211_check_station_change()
5927 if (!(params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER))) in cfg80211_check_station_change()
5928 return -EINVAL; in cfg80211_check_station_change()
5930 params->sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER); in cfg80211_check_station_change()
5933 /* disallow mesh-specific things */ in cfg80211_check_station_change()
5934 if (params->plink_action != NL80211_PLINK_ACTION_NO_ACTION) in cfg80211_check_station_change()
5935 return -EINVAL; in cfg80211_check_station_change()
5936 if (params->local_pm) in cfg80211_check_station_change()
5937 return -EINVAL; in cfg80211_check_station_change()
5938 if (params->sta_modify_mask & STATION_PARAM_APPLY_PLINK_STATE) in cfg80211_check_station_change()
5939 return -EINVAL; in cfg80211_check_station_change()
5945 if (params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) in cfg80211_check_station_change()
5946 return -EINVAL; in cfg80211_check_station_change()
5949 * a hostapd/wpa_supplicant issue -- it always includes the in cfg80211_check_station_change()
5952 params->sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER); in cfg80211_check_station_change()
5958 if (params->sta_modify_mask & STATION_PARAM_APPLY_UAPSD) in cfg80211_check_station_change()
5959 return -EINVAL; in cfg80211_check_station_change()
5960 if (params->sta_modify_mask & STATION_PARAM_APPLY_CAPABILITY) in cfg80211_check_station_change()
5961 return -EINVAL; in cfg80211_check_station_change()
5962 if (params->supported_rates) in cfg80211_check_station_change()
5963 return -EINVAL; in cfg80211_check_station_change()
5964 if (params->ext_capab || params->ht_capa || params->vht_capa || in cfg80211_check_station_change()
5965 params->he_capa) in cfg80211_check_station_change()
5966 return -EINVAL; in cfg80211_check_station_change()
5971 if (params->vlan) in cfg80211_check_station_change()
5972 return -EINVAL; in cfg80211_check_station_change()
5978 if (!(params->sta_flags_mask & BIT(NL80211_STA_FLAG_AUTHORIZED))) in cfg80211_check_station_change()
5979 return -EOPNOTSUPP; in cfg80211_check_station_change()
5984 if (params->sta_flags_mask & in cfg80211_check_station_change()
5991 return -EINVAL; in cfg80211_check_station_change()
5994 if (!(wiphy->features & NL80211_FEATURE_FULL_AP_CLIENT_STATE) && in cfg80211_check_station_change()
5995 params->sta_flags_mask & in cfg80211_check_station_change()
5998 return -EINVAL; in cfg80211_check_station_change()
6003 if (params->sta_flags_mask & ~BIT(NL80211_STA_FLAG_AUTHORIZED)) in cfg80211_check_station_change()
6004 return -EINVAL; in cfg80211_check_station_change()
6008 if (params->sta_flags_mask & ~(BIT(NL80211_STA_FLAG_AUTHORIZED) | in cfg80211_check_station_change()
6010 return -EINVAL; in cfg80211_check_station_change()
6012 if (params->sta_flags_set & BIT(NL80211_STA_FLAG_AUTHORIZED) && in cfg80211_check_station_change()
6013 !params->supported_rates) in cfg80211_check_station_change()
6014 return -EINVAL; in cfg80211_check_station_change()
6018 return -EINVAL; in cfg80211_check_station_change()
6020 if (params->sta_modify_mask & STATION_PARAM_APPLY_PLINK_STATE) in cfg80211_check_station_change()
6021 return -EINVAL; in cfg80211_check_station_change()
6024 if (params->plink_action != NL80211_PLINK_ACTION_NO_ACTION && in cfg80211_check_station_change()
6025 params->plink_action != NL80211_PLINK_ACTION_BLOCK) in cfg80211_check_station_change()
6026 return -EINVAL; in cfg80211_check_station_change()
6037 params->opmode_notif_used = false; in cfg80211_check_station_change()
6049 struct nlattr *vlanattr = info->attrs[NL80211_ATTR_STA_VLAN]; in get_vlan()
6058 return ERR_PTR(-ENODEV); in get_vlan()
6060 if (!v->ieee80211_ptr || v->ieee80211_ptr->wiphy != &rdev->wiphy) { in get_vlan()
6061 ret = -EINVAL; in get_vlan()
6065 if (v->ieee80211_ptr->iftype != NL80211_IFTYPE_AP_VLAN && in get_vlan()
6066 v->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && in get_vlan()
6067 v->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) { in get_vlan()
6068 ret = -EINVAL; in get_vlan()
6073 ret = -ENETDOWN; in get_vlan()
6097 if (!info->attrs[NL80211_ATTR_STA_WME]) in nl80211_parse_sta_wme()
6100 nla = info->attrs[NL80211_ATTR_STA_WME]; in nl80211_parse_sta_wme()
6103 info->extack); in nl80211_parse_sta_wme()
6108 params->uapsd_queues = nla_get_u8( in nl80211_parse_sta_wme()
6110 if (params->uapsd_queues & ~IEEE80211_WMM_IE_STA_QOSINFO_AC_MASK) in nl80211_parse_sta_wme()
6111 return -EINVAL; in nl80211_parse_sta_wme()
6114 params->max_sp = nla_get_u8(tb[NL80211_STA_WME_MAX_SP]); in nl80211_parse_sta_wme()
6116 if (params->max_sp & ~IEEE80211_WMM_IE_STA_QOSINFO_SP_MASK) in nl80211_parse_sta_wme()
6117 return -EINVAL; in nl80211_parse_sta_wme()
6119 params->sta_modify_mask |= STATION_PARAM_APPLY_UAPSD; in nl80211_parse_sta_wme()
6127 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]) { in nl80211_parse_sta_channel_info()
6128 params->supported_channels = in nl80211_parse_sta_channel_info()
6129 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]); in nl80211_parse_sta_channel_info()
6130 params->supported_channels_len = in nl80211_parse_sta_channel_info()
6131 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]); in nl80211_parse_sta_channel_info()
6137 if (params->supported_channels_len % 2) in nl80211_parse_sta_channel_info()
6138 return -EINVAL; in nl80211_parse_sta_channel_info()
6141 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]) { in nl80211_parse_sta_channel_info()
6142 params->supported_oper_classes = in nl80211_parse_sta_channel_info()
6143 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]); in nl80211_parse_sta_channel_info()
6144 params->supported_oper_classes_len = in nl80211_parse_sta_channel_info()
6145 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]); in nl80211_parse_sta_channel_info()
6155 if (info->attrs[NL80211_ATTR_PEER_AID]) in nl80211_set_station_tdls()
6156 params->aid = nla_get_u16(info->attrs[NL80211_ATTR_PEER_AID]); in nl80211_set_station_tdls()
6157 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) in nl80211_set_station_tdls()
6158 params->ht_capa = in nl80211_set_station_tdls()
6159 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]); in nl80211_set_station_tdls()
6160 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) in nl80211_set_station_tdls()
6161 params->vht_capa = in nl80211_set_station_tdls()
6162 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]); in nl80211_set_station_tdls()
6163 if (info->attrs[NL80211_ATTR_HE_CAPABILITY]) { in nl80211_set_station_tdls()
6164 params->he_capa = in nl80211_set_station_tdls()
6165 nla_data(info->attrs[NL80211_ATTR_HE_CAPABILITY]); in nl80211_set_station_tdls()
6166 params->he_capa_len = in nl80211_set_station_tdls()
6167 nla_len(info->attrs[NL80211_ATTR_HE_CAPABILITY]); in nl80211_set_station_tdls()
6180 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_parse_sta_txpower_setting()
6183 if (info->attrs[NL80211_ATTR_STA_TX_POWER_SETTING]) { in nl80211_parse_sta_txpower_setting()
6184 if (!rdev->ops->set_tx_power || in nl80211_parse_sta_txpower_setting()
6185 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_parse_sta_txpower_setting()
6187 return -EOPNOTSUPP; in nl80211_parse_sta_txpower_setting()
6190 params->txpwr.type = nla_get_u8(info->attrs[idx]); in nl80211_parse_sta_txpower_setting()
6192 if (params->txpwr.type == NL80211_TX_POWER_LIMITED) { in nl80211_parse_sta_txpower_setting()
6195 if (info->attrs[idx]) in nl80211_parse_sta_txpower_setting()
6196 params->txpwr.power = in nl80211_parse_sta_txpower_setting()
6197 nla_get_s16(info->attrs[idx]); in nl80211_parse_sta_txpower_setting()
6199 return -EINVAL; in nl80211_parse_sta_txpower_setting()
6201 params->sta_modify_mask |= STATION_PARAM_APPLY_STA_TXPOWER; in nl80211_parse_sta_txpower_setting()
6209 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_station()
6210 struct net_device *dev = info->user_ptr[1]; in nl80211_set_station()
6217 if (!rdev->ops->change_station) in nl80211_set_station()
6218 return -EOPNOTSUPP; in nl80211_set_station()
6225 if (info->attrs[NL80211_ATTR_STA_AID]) in nl80211_set_station()
6226 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_STA_AID]); in nl80211_set_station()
6228 if (info->attrs[NL80211_ATTR_VLAN_ID]) in nl80211_set_station()
6229 params.vlan_id = nla_get_u16(info->attrs[NL80211_ATTR_VLAN_ID]); in nl80211_set_station()
6231 if (info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]) in nl80211_set_station()
6233 nla_get_u16(info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]); in nl80211_set_station()
6235 params.listen_interval = -1; in nl80211_set_station()
6237 if (info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]) in nl80211_set_station()
6239 nla_get_u8(info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]); in nl80211_set_station()
6241 params.support_p2p_ps = -1; in nl80211_set_station()
6243 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_set_station()
6244 return -EINVAL; in nl80211_set_station()
6246 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_set_station()
6248 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) { in nl80211_set_station()
6250 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); in nl80211_set_station()
6252 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); in nl80211_set_station()
6255 if (info->attrs[NL80211_ATTR_STA_CAPABILITY]) { in nl80211_set_station()
6257 nla_get_u16(info->attrs[NL80211_ATTR_STA_CAPABILITY]); in nl80211_set_station()
6261 if (info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]) { in nl80211_set_station()
6263 nla_data(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); in nl80211_set_station()
6265 nla_len(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); in nl80211_set_station()
6268 if (parse_station_flags(info, dev->ieee80211_ptr->iftype, &params)) in nl80211_set_station()
6269 return -EINVAL; in nl80211_set_station()
6271 if (info->attrs[NL80211_ATTR_STA_PLINK_ACTION]) in nl80211_set_station()
6273 nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_ACTION]); in nl80211_set_station()
6275 if (info->attrs[NL80211_ATTR_STA_PLINK_STATE]) { in nl80211_set_station()
6277 nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_STATE]); in nl80211_set_station()
6278 if (info->attrs[NL80211_ATTR_MESH_PEER_AID]) in nl80211_set_station()
6280 info->attrs[NL80211_ATTR_MESH_PEER_AID]); in nl80211_set_station()
6284 if (info->attrs[NL80211_ATTR_LOCAL_MESH_POWER_MODE]) in nl80211_set_station()
6286 info->attrs[NL80211_ATTR_LOCAL_MESH_POWER_MODE]); in nl80211_set_station()
6288 if (info->attrs[NL80211_ATTR_OPMODE_NOTIF]) { in nl80211_set_station()
6291 nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]); in nl80211_set_station()
6294 if (info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]) in nl80211_set_station()
6296 nla_data(info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]); in nl80211_set_station()
6298 if (info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]) in nl80211_set_station()
6300 nla_get_u16(info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]); in nl80211_set_station()
6303 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_set_station()
6305 return -EOPNOTSUPP; in nl80211_set_station()
6320 switch (dev->ieee80211_ptr->iftype) { in nl80211_set_station()
6330 err = -EOPNOTSUPP; in nl80211_set_station()
6346 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_new_station()
6348 struct net_device *dev = info->user_ptr[1]; in nl80211_new_station()
6356 if (!rdev->ops->add_station) in nl80211_new_station()
6357 return -EOPNOTSUPP; in nl80211_new_station()
6359 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_new_station()
6360 return -EINVAL; in nl80211_new_station()
6362 if (!info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]) in nl80211_new_station()
6363 return -EINVAL; in nl80211_new_station()
6365 if (!info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) in nl80211_new_station()
6366 return -EINVAL; in nl80211_new_station()
6368 if (!info->attrs[NL80211_ATTR_STA_AID] && in nl80211_new_station()
6369 !info->attrs[NL80211_ATTR_PEER_AID]) in nl80211_new_station()
6370 return -EINVAL; in nl80211_new_station()
6372 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_new_station()
6374 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); in nl80211_new_station()
6376 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); in nl80211_new_station()
6378 nla_get_u16(info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]); in nl80211_new_station()
6380 if (info->attrs[NL80211_ATTR_VLAN_ID]) in nl80211_new_station()
6381 params.vlan_id = nla_get_u16(info->attrs[NL80211_ATTR_VLAN_ID]); in nl80211_new_station()
6383 if (info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]) { in nl80211_new_station()
6385 nla_get_u8(info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]); in nl80211_new_station()
6392 dev->ieee80211_ptr->iftype == NL80211_IFTYPE_P2P_GO; in nl80211_new_station()
6395 if (info->attrs[NL80211_ATTR_PEER_AID]) in nl80211_new_station()
6396 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_PEER_AID]); in nl80211_new_station()
6398 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_STA_AID]); in nl80211_new_station()
6400 if (info->attrs[NL80211_ATTR_STA_CAPABILITY]) { in nl80211_new_station()
6402 nla_get_u16(info->attrs[NL80211_ATTR_STA_CAPABILITY]); in nl80211_new_station()
6406 if (info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]) { in nl80211_new_station()
6408 nla_data(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); in nl80211_new_station()
6410 nla_len(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); in nl80211_new_station()
6413 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) in nl80211_new_station()
6415 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]); in nl80211_new_station()
6417 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) in nl80211_new_station()
6419 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]); in nl80211_new_station()
6421 if (info->attrs[NL80211_ATTR_HE_CAPABILITY]) { in nl80211_new_station()
6423 nla_data(info->attrs[NL80211_ATTR_HE_CAPABILITY]); in nl80211_new_station()
6425 nla_len(info->attrs[NL80211_ATTR_HE_CAPABILITY]); in nl80211_new_station()
6428 if (info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]) in nl80211_new_station()
6430 nla_data(info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]); in nl80211_new_station()
6432 if (info->attrs[NL80211_ATTR_OPMODE_NOTIF]) { in nl80211_new_station()
6435 nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]); in nl80211_new_station()
6438 if (info->attrs[NL80211_ATTR_STA_PLINK_ACTION]) in nl80211_new_station()
6440 nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_ACTION]); in nl80211_new_station()
6442 if (info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]) in nl80211_new_station()
6444 nla_get_u16(info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]); in nl80211_new_station()
6447 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_new_station()
6449 return -EOPNOTSUPP; in nl80211_new_station()
6463 if (parse_station_flags(info, dev->ieee80211_ptr->iftype, &params)) in nl80211_new_station()
6464 return -EINVAL; in nl80211_new_station()
6477 return -EINVAL; in nl80211_new_station()
6482 return -EINVAL; in nl80211_new_station()
6487 switch (dev->ieee80211_ptr->iftype) { in nl80211_new_station()
6492 if (!(rdev->wiphy.flags & WIPHY_FLAG_AP_UAPSD) || in nl80211_new_station()
6498 info->attrs[NL80211_ATTR_PEER_AID]) in nl80211_new_station()
6499 return -EINVAL; in nl80211_new_station()
6504 if (!(rdev->wiphy.features & in nl80211_new_station()
6507 return -EINVAL; in nl80211_new_station()
6535 return -EINVAL; in nl80211_new_station()
6538 info->attrs[NL80211_ATTR_PEER_AID]) in nl80211_new_station()
6539 return -EINVAL; in nl80211_new_station()
6550 return -EINVAL; in nl80211_new_station()
6553 return -EINVAL; in nl80211_new_station()
6555 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS)) in nl80211_new_station()
6556 return -EOPNOTSUPP; in nl80211_new_station()
6558 if (!(rdev->wiphy.flags & WIPHY_FLAG_TDLS_EXTERNAL_SETUP)) in nl80211_new_station()
6559 return -EOPNOTSUPP; in nl80211_new_station()
6567 return -EOPNOTSUPP; in nl80211_new_station()
6581 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_del_station()
6582 struct net_device *dev = info->user_ptr[1]; in nl80211_del_station()
6587 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_del_station()
6588 params.mac = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_del_station()
6590 switch (dev->ieee80211_ptr->iftype) { in nl80211_del_station()
6599 if (wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_del_station()
6602 return -EINVAL; in nl80211_del_station()
6604 return -EINVAL; in nl80211_del_station()
6607 if (!rdev->ops->del_station) in nl80211_del_station()
6608 return -EOPNOTSUPP; in nl80211_del_station()
6610 if (info->attrs[NL80211_ATTR_MGMT_SUBTYPE]) { in nl80211_del_station()
6612 nla_get_u8(info->attrs[NL80211_ATTR_MGMT_SUBTYPE]); in nl80211_del_station()
6615 return -EINVAL; in nl80211_del_station()
6621 if (info->attrs[NL80211_ATTR_REASON_CODE]) { in nl80211_del_station()
6623 nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); in nl80211_del_station()
6625 return -EINVAL; /* 0 is reserved */ in nl80211_del_station()
6644 return -1; in nl80211_send_mpath()
6646 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in nl80211_send_mpath()
6649 nla_put_u32(msg, NL80211_ATTR_GENERATION, pinfo->generation)) in nl80211_send_mpath()
6655 if ((pinfo->filled & MPATH_INFO_FRAME_QLEN) && in nl80211_send_mpath()
6657 pinfo->frame_qlen)) in nl80211_send_mpath()
6659 if (((pinfo->filled & MPATH_INFO_SN) && in nl80211_send_mpath()
6660 nla_put_u32(msg, NL80211_MPATH_INFO_SN, pinfo->sn)) || in nl80211_send_mpath()
6661 ((pinfo->filled & MPATH_INFO_METRIC) && in nl80211_send_mpath()
6663 pinfo->metric)) || in nl80211_send_mpath()
6664 ((pinfo->filled & MPATH_INFO_EXPTIME) && in nl80211_send_mpath()
6666 pinfo->exptime)) || in nl80211_send_mpath()
6667 ((pinfo->filled & MPATH_INFO_FLAGS) && in nl80211_send_mpath()
6669 pinfo->flags)) || in nl80211_send_mpath()
6670 ((pinfo->filled & MPATH_INFO_DISCOVERY_TIMEOUT) && in nl80211_send_mpath()
6672 pinfo->discovery_timeout)) || in nl80211_send_mpath()
6673 ((pinfo->filled & MPATH_INFO_DISCOVERY_RETRIES) && in nl80211_send_mpath()
6675 pinfo->discovery_retries)) || in nl80211_send_mpath()
6676 ((pinfo->filled & MPATH_INFO_HOP_COUNT) && in nl80211_send_mpath()
6678 pinfo->hop_count)) || in nl80211_send_mpath()
6679 ((pinfo->filled & MPATH_INFO_PATH_CHANGE) && in nl80211_send_mpath()
6681 pinfo->path_change_count))) in nl80211_send_mpath()
6691 return -EMSGSIZE; in nl80211_send_mpath()
6702 int path_idx = cb->args[2]; in nl80211_dump_mpath()
6710 if (!rdev->ops->dump_mpath) { in nl80211_dump_mpath()
6711 err = -EOPNOTSUPP; in nl80211_dump_mpath()
6715 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) { in nl80211_dump_mpath()
6716 err = -EOPNOTSUPP; in nl80211_dump_mpath()
6721 err = rdev_dump_mpath(rdev, wdev->netdev, path_idx, dst, in nl80211_dump_mpath()
6723 if (err == -ENOENT) in nl80211_dump_mpath()
6728 if (nl80211_send_mpath(skb, NETLINK_CB(cb->skb).portid, in nl80211_dump_mpath()
6729 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_dump_mpath()
6730 wdev->netdev, dst, next_hop, in nl80211_dump_mpath()
6738 cb->args[2] = path_idx; in nl80211_dump_mpath()
6739 err = skb->len; in nl80211_dump_mpath()
6747 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_mpath()
6749 struct net_device *dev = info->user_ptr[1]; in nl80211_get_mpath()
6757 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_get_mpath()
6758 return -EINVAL; in nl80211_get_mpath()
6760 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_get_mpath()
6762 if (!rdev->ops->get_mpath) in nl80211_get_mpath()
6763 return -EOPNOTSUPP; in nl80211_get_mpath()
6765 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_get_mpath()
6766 return -EOPNOTSUPP; in nl80211_get_mpath()
6774 return -ENOMEM; in nl80211_get_mpath()
6776 if (nl80211_send_mpath(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_mpath()
6779 return -ENOBUFS; in nl80211_get_mpath()
6787 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_mpath()
6788 struct net_device *dev = info->user_ptr[1]; in nl80211_set_mpath()
6792 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_set_mpath()
6793 return -EINVAL; in nl80211_set_mpath()
6795 if (!info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]) in nl80211_set_mpath()
6796 return -EINVAL; in nl80211_set_mpath()
6798 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_set_mpath()
6799 next_hop = nla_data(info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]); in nl80211_set_mpath()
6801 if (!rdev->ops->change_mpath) in nl80211_set_mpath()
6802 return -EOPNOTSUPP; in nl80211_set_mpath()
6804 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_set_mpath()
6805 return -EOPNOTSUPP; in nl80211_set_mpath()
6812 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_new_mpath()
6813 struct net_device *dev = info->user_ptr[1]; in nl80211_new_mpath()
6817 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_new_mpath()
6818 return -EINVAL; in nl80211_new_mpath()
6820 if (!info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]) in nl80211_new_mpath()
6821 return -EINVAL; in nl80211_new_mpath()
6823 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_new_mpath()
6824 next_hop = nla_data(info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]); in nl80211_new_mpath()
6826 if (!rdev->ops->add_mpath) in nl80211_new_mpath()
6827 return -EOPNOTSUPP; in nl80211_new_mpath()
6829 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_new_mpath()
6830 return -EOPNOTSUPP; in nl80211_new_mpath()
6837 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_del_mpath()
6838 struct net_device *dev = info->user_ptr[1]; in nl80211_del_mpath()
6841 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_del_mpath()
6842 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_del_mpath()
6844 if (!rdev->ops->del_mpath) in nl80211_del_mpath()
6845 return -EOPNOTSUPP; in nl80211_del_mpath()
6847 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_del_mpath()
6848 return -EOPNOTSUPP; in nl80211_del_mpath()
6855 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_mpp()
6857 struct net_device *dev = info->user_ptr[1]; in nl80211_get_mpp()
6865 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_get_mpp()
6866 return -EINVAL; in nl80211_get_mpp()
6868 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_get_mpp()
6870 if (!rdev->ops->get_mpp) in nl80211_get_mpp()
6871 return -EOPNOTSUPP; in nl80211_get_mpp()
6873 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_get_mpp()
6874 return -EOPNOTSUPP; in nl80211_get_mpp()
6882 return -ENOMEM; in nl80211_get_mpp()
6884 if (nl80211_send_mpath(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_mpp()
6887 return -ENOBUFS; in nl80211_get_mpp()
6901 int path_idx = cb->args[2]; in nl80211_dump_mpp()
6909 if (!rdev->ops->dump_mpp) { in nl80211_dump_mpp()
6910 err = -EOPNOTSUPP; in nl80211_dump_mpp()
6914 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) { in nl80211_dump_mpp()
6915 err = -EOPNOTSUPP; in nl80211_dump_mpp()
6920 err = rdev_dump_mpp(rdev, wdev->netdev, path_idx, dst, in nl80211_dump_mpp()
6922 if (err == -ENOENT) in nl80211_dump_mpp()
6927 if (nl80211_send_mpath(skb, NETLINK_CB(cb->skb).portid, in nl80211_dump_mpp()
6928 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_dump_mpp()
6929 wdev->netdev, dst, mpp, in nl80211_dump_mpp()
6937 cb->args[2] = path_idx; in nl80211_dump_mpp()
6938 err = skb->len; in nl80211_dump_mpp()
6946 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_bss()
6947 struct net_device *dev = info->user_ptr[1]; in nl80211_set_bss()
6948 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_bss()
6954 params.use_cts_prot = -1; in nl80211_set_bss()
6955 params.use_short_preamble = -1; in nl80211_set_bss()
6956 params.use_short_slot_time = -1; in nl80211_set_bss()
6957 params.ap_isolate = -1; in nl80211_set_bss()
6958 params.ht_opmode = -1; in nl80211_set_bss()
6959 params.p2p_ctwindow = -1; in nl80211_set_bss()
6960 params.p2p_opp_ps = -1; in nl80211_set_bss()
6962 if (info->attrs[NL80211_ATTR_BSS_CTS_PROT]) in nl80211_set_bss()
6964 nla_get_u8(info->attrs[NL80211_ATTR_BSS_CTS_PROT]); in nl80211_set_bss()
6965 if (info->attrs[NL80211_ATTR_BSS_SHORT_PREAMBLE]) in nl80211_set_bss()
6967 nla_get_u8(info->attrs[NL80211_ATTR_BSS_SHORT_PREAMBLE]); in nl80211_set_bss()
6968 if (info->attrs[NL80211_ATTR_BSS_SHORT_SLOT_TIME]) in nl80211_set_bss()
6970 nla_get_u8(info->attrs[NL80211_ATTR_BSS_SHORT_SLOT_TIME]); in nl80211_set_bss()
6971 if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) { in nl80211_set_bss()
6973 nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); in nl80211_set_bss()
6975 nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); in nl80211_set_bss()
6977 if (info->attrs[NL80211_ATTR_AP_ISOLATE]) in nl80211_set_bss()
6978 params.ap_isolate = !!nla_get_u8(info->attrs[NL80211_ATTR_AP_ISOLATE]); in nl80211_set_bss()
6979 if (info->attrs[NL80211_ATTR_BSS_HT_OPMODE]) in nl80211_set_bss()
6981 nla_get_u16(info->attrs[NL80211_ATTR_BSS_HT_OPMODE]); in nl80211_set_bss()
6983 if (info->attrs[NL80211_ATTR_P2P_CTWINDOW]) { in nl80211_set_bss()
6984 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_set_bss()
6985 return -EINVAL; in nl80211_set_bss()
6987 nla_get_u8(info->attrs[NL80211_ATTR_P2P_CTWINDOW]); in nl80211_set_bss()
6989 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_CTWIN)) in nl80211_set_bss()
6990 return -EINVAL; in nl80211_set_bss()
6993 if (info->attrs[NL80211_ATTR_P2P_OPPPS]) { in nl80211_set_bss()
6996 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_set_bss()
6997 return -EINVAL; in nl80211_set_bss()
6998 tmp = nla_get_u8(info->attrs[NL80211_ATTR_P2P_OPPPS]); in nl80211_set_bss()
7001 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_OPPPS)) in nl80211_set_bss()
7002 return -EINVAL; in nl80211_set_bss()
7005 if (!rdev->ops->change_bss) in nl80211_set_bss()
7006 return -EOPNOTSUPP; in nl80211_set_bss()
7008 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && in nl80211_set_bss()
7009 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_set_bss()
7010 return -EOPNOTSUPP; in nl80211_set_bss()
7028 * completely when built-in to the kernel right between the time in nl80211_req_set_reg()
7033 return -EINPROGRESS; in nl80211_req_set_reg()
7035 if (info->attrs[NL80211_ATTR_USER_REG_HINT_TYPE]) in nl80211_req_set_reg()
7037 nla_get_u32(info->attrs[NL80211_ATTR_USER_REG_HINT_TYPE]); in nl80211_req_set_reg()
7044 if (!info->attrs[NL80211_ATTR_REG_ALPHA2]) in nl80211_req_set_reg()
7045 return -EINVAL; in nl80211_req_set_reg()
7047 data = nla_data(info->attrs[NL80211_ATTR_REG_ALPHA2]); in nl80211_req_set_reg()
7050 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) { in nl80211_req_set_reg()
7051 owner_nlportid = info->snd_portid; in nl80211_req_set_reg()
7052 is_indoor = !!info->attrs[NL80211_ATTR_REG_INDOOR]; in nl80211_req_set_reg()
7060 return -EINVAL; in nl80211_req_set_reg()
7072 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_mesh_config()
7073 struct net_device *dev = info->user_ptr[1]; in nl80211_get_mesh_config()
7074 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_get_mesh_config()
7081 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_get_mesh_config()
7082 return -EOPNOTSUPP; in nl80211_get_mesh_config()
7084 if (!rdev->ops->get_mesh_config) in nl80211_get_mesh_config()
7085 return -EOPNOTSUPP; in nl80211_get_mesh_config()
7089 if (!wdev->mesh_id_len) in nl80211_get_mesh_config()
7101 return -ENOMEM; in nl80211_get_mesh_config()
7102 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_mesh_config()
7109 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in nl80211_get_mesh_config()
7180 return -ENOBUFS; in nl80211_get_mesh_config()
7215 NLA_POLICY_RANGE(NLA_S32, -255, 0),
7258 cfg->param = fn(tb[attr]); \ in nl80211_parse_mesh_config()
7259 mask |= BIT((attr) - 1); \ in nl80211_parse_mesh_config()
7263 if (!info->attrs[NL80211_ATTR_MESH_CONFIG]) in nl80211_parse_mesh_config()
7264 return -EINVAL; in nl80211_parse_mesh_config()
7265 …ated(tb, NL80211_MESHCONF_ATTR_MAX, info->attrs[NL80211_ATTR_MESH_CONFIG], nl80211_meshconf_params… in nl80211_parse_mesh_config()
7266 return -EINVAL; in nl80211_parse_mesh_config()
7304 (cfg->path_refresh_time < 1 || cfg->path_refresh_time > 65535)) in nl80211_parse_mesh_config()
7305 return -EINVAL; in nl80211_parse_mesh_config()
7314 (cfg->dot11MeshHWMPactivePathTimeout < 1 || in nl80211_parse_mesh_config()
7315 cfg->dot11MeshHWMPactivePathTimeout > 65535)) in nl80211_parse_mesh_config()
7316 return -EINVAL; in nl80211_parse_mesh_config()
7348 * IEEE 802.11-2016 9.4.2.57 HT Operation element. in nl80211_parse_mesh_config()
7356 return -EINVAL; in nl80211_parse_mesh_config()
7361 cfg->ht_opmode = ht_opmode; in nl80211_parse_mesh_config()
7362 mask |= (1 << (NL80211_MESHCONF_HT_OPMODE - 1)); in nl80211_parse_mesh_config()
7369 (cfg->dot11MeshHWMPactivePathToRootTimeout < 1 || in nl80211_parse_mesh_config()
7370 cfg->dot11MeshHWMPactivePathToRootTimeout > 65535)) in nl80211_parse_mesh_config()
7371 return -EINVAL; in nl80211_parse_mesh_config()
7398 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_parse_mesh_setup()
7401 if (!info->attrs[NL80211_ATTR_MESH_SETUP]) in nl80211_parse_mesh_setup()
7402 return -EINVAL; in nl80211_parse_mesh_setup()
7403 …ed(tb, NL80211_MESH_SETUP_ATTR_MAX, info->attrs[NL80211_ATTR_MESH_SETUP], nl80211_mesh_setup_param… in nl80211_parse_mesh_setup()
7404 return -EINVAL; in nl80211_parse_mesh_setup()
7407 setup->sync_method = in nl80211_parse_mesh_setup()
7413 setup->path_sel_proto = in nl80211_parse_mesh_setup()
7419 setup->path_metric = in nl80211_parse_mesh_setup()
7427 setup->ie = nla_data(ieattr); in nl80211_parse_mesh_setup()
7428 setup->ie_len = nla_len(ieattr); in nl80211_parse_mesh_setup()
7431 !(rdev->wiphy.features & NL80211_FEATURE_USERSPACE_MPM)) in nl80211_parse_mesh_setup()
7432 return -EINVAL; in nl80211_parse_mesh_setup()
7433 setup->user_mpm = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_MPM]); in nl80211_parse_mesh_setup()
7434 setup->is_authenticated = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_AUTH]); in nl80211_parse_mesh_setup()
7435 setup->is_secure = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_AMPE]); in nl80211_parse_mesh_setup()
7436 if (setup->is_secure) in nl80211_parse_mesh_setup()
7437 setup->user_mpm = true; in nl80211_parse_mesh_setup()
7440 if (!setup->user_mpm) in nl80211_parse_mesh_setup()
7441 return -EINVAL; in nl80211_parse_mesh_setup()
7442 setup->auth_id = in nl80211_parse_mesh_setup()
7452 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_update_mesh_config()
7453 struct net_device *dev = info->user_ptr[1]; in nl80211_update_mesh_config()
7454 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_update_mesh_config()
7459 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_update_mesh_config()
7460 return -EOPNOTSUPP; in nl80211_update_mesh_config()
7462 if (!rdev->ops->update_mesh_config) in nl80211_update_mesh_config()
7463 return -EOPNOTSUPP; in nl80211_update_mesh_config()
7470 if (!wdev->mesh_id_len) in nl80211_update_mesh_config()
7471 err = -ENOLINK; in nl80211_update_mesh_config()
7487 if (nla_put_string(msg, NL80211_ATTR_REG_ALPHA2, regdom->alpha2) || in nl80211_put_regdom()
7488 (regdom->dfs_region && in nl80211_put_regdom()
7489 nla_put_u8(msg, NL80211_ATTR_DFS_REGION, regdom->dfs_region))) in nl80211_put_regdom()
7496 for (i = 0; i < regdom->n_reg_rules; i++) { in nl80211_put_regdom()
7503 reg_rule = &regdom->reg_rules[i]; in nl80211_put_regdom()
7504 freq_range = &reg_rule->freq_range; in nl80211_put_regdom()
7505 power_rule = &reg_rule->power_rule; in nl80211_put_regdom()
7511 max_bandwidth_khz = freq_range->max_bandwidth_khz; in nl80211_put_regdom()
7517 reg_rule->flags) || in nl80211_put_regdom()
7519 freq_range->start_freq_khz) || in nl80211_put_regdom()
7521 freq_range->end_freq_khz) || in nl80211_put_regdom()
7525 power_rule->max_antenna_gain) || in nl80211_put_regdom()
7527 power_rule->max_eirp) || in nl80211_put_regdom()
7529 reg_rule->dfs_cac_ms)) in nl80211_put_regdom()
7539 return -EMSGSIZE; in nl80211_put_regdom()
7552 return -ENOBUFS; in nl80211_get_reg_do()
7554 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_reg_do()
7559 if (info->attrs[NL80211_ATTR_WIPHY]) { in nl80211_get_reg_do()
7568 wiphy = &rdev->wiphy; in nl80211_get_reg_do()
7569 self_managed = wiphy->regulatory_flags & in nl80211_get_reg_do()
7573 /* a self-managed-reg device must have a private regdom */ in nl80211_get_reg_do()
7576 return -EINVAL; in nl80211_get_reg_do()
7607 return -EMSGSIZE; in nl80211_get_reg_do()
7614 void *hdr = nl80211hdr_put(msg, NETLINK_CB(cb->skb).portid, seq, flags, in nl80211_send_regdom()
7618 return -1; in nl80211_send_regdom()
7634 if (wiphy && wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED && in nl80211_send_regdom()
7643 return -EMSGSIZE; in nl80211_send_regdom()
7651 int err, reg_idx, start = cb->args[2]; in nl80211_get_reg_dump()
7656 err = nl80211_send_regdom(skb, cb, cb->nlh->nlmsg_seq, in nl80211_get_reg_dump()
7666 regdom = get_wiphy_regdom(&rdev->wiphy); in nl80211_get_reg_dump()
7673 err = nl80211_send_regdom(skb, cb, cb->nlh->nlmsg_seq, in nl80211_get_reg_dump()
7674 NLM_F_MULTI, &rdev->wiphy, regdom); in nl80211_get_reg_dump()
7676 reg_idx--; in nl80211_get_reg_dump()
7681 cb->args[2] = reg_idx; in nl80211_get_reg_dump()
7682 err = skb->len; in nl80211_get_reg_dump()
7702 struct ieee80211_freq_range *freq_range = &reg_rule->freq_range; in parse_reg_rule()
7703 struct ieee80211_power_rule *power_rule = &reg_rule->power_rule; in parse_reg_rule()
7706 return -EINVAL; in parse_reg_rule()
7708 return -EINVAL; in parse_reg_rule()
7710 return -EINVAL; in parse_reg_rule()
7712 return -EINVAL; in parse_reg_rule()
7714 return -EINVAL; in parse_reg_rule()
7716 reg_rule->flags = nla_get_u32(tb[NL80211_ATTR_REG_RULE_FLAGS]); in parse_reg_rule()
7718 freq_range->start_freq_khz = in parse_reg_rule()
7720 freq_range->end_freq_khz = in parse_reg_rule()
7722 freq_range->max_bandwidth_khz = in parse_reg_rule()
7725 power_rule->max_eirp = in parse_reg_rule()
7729 power_rule->max_antenna_gain = in parse_reg_rule()
7733 reg_rule->dfs_cac_ms = in parse_reg_rule()
7749 if (!info->attrs[NL80211_ATTR_REG_ALPHA2]) in nl80211_set_reg()
7750 return -EINVAL; in nl80211_set_reg()
7752 if (!info->attrs[NL80211_ATTR_REG_RULES]) in nl80211_set_reg()
7753 return -EINVAL; in nl80211_set_reg()
7755 alpha2 = nla_data(info->attrs[NL80211_ATTR_REG_ALPHA2]); in nl80211_set_reg()
7757 if (info->attrs[NL80211_ATTR_DFS_REGION]) in nl80211_set_reg()
7758 dfs_region = nla_get_u8(info->attrs[NL80211_ATTR_DFS_REGION]); in nl80211_set_reg()
7760 nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES], in nl80211_set_reg()
7764 return -EINVAL; in nl80211_set_reg()
7768 return -EINVAL; in nl80211_set_reg()
7772 return -ENOMEM; in nl80211_set_reg()
7774 rd->n_reg_rules = num_rules; in nl80211_set_reg()
7775 rd->alpha2[0] = alpha2[0]; in nl80211_set_reg()
7776 rd->alpha2[1] = alpha2[1]; in nl80211_set_reg()
7783 rd->dfs_region = dfs_region; in nl80211_set_reg()
7785 nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES], in nl80211_set_reg()
7789 info->extack); in nl80211_set_reg()
7792 r = parse_reg_rule(tb, &rd->reg_rules[rule_idx]); in nl80211_set_reg()
7799 r = -EINVAL; in nl80211_set_reg()
7843 return b < NUM_NL80211_BANDS && wiphy->bands[b]; in is_band_valid()
7858 return -EINVAL; in parse_bss_select()
7870 return -EINVAL; in parse_bss_select()
7875 bss_select->behaviour = __NL80211_BSS_SELECT_ATTR_INVALID; in parse_bss_select()
7878 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_RSSI; in parse_bss_select()
7881 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_BAND_PREF; in parse_bss_select()
7882 bss_select->param.band_pref = in parse_bss_select()
7884 if (!is_band_valid(wiphy, bss_select->param.band_pref)) in parse_bss_select()
7885 return -EINVAL; in parse_bss_select()
7892 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_RSSI_ADJUST; in parse_bss_select()
7893 bss_select->param.adjust.band = adj_param->band; in parse_bss_select()
7894 bss_select->param.adjust.delta = adj_param->delta; in parse_bss_select()
7895 if (!is_band_valid(wiphy, bss_select->param.adjust.band)) in parse_bss_select()
7896 return -EINVAL; in parse_bss_select()
7899 /* user-space did not provide behaviour attribute */ in parse_bss_select()
7900 if (bss_select->behaviour == __NL80211_BSS_SELECT_ATTR_INVALID) in parse_bss_select()
7901 return -EINVAL; in parse_bss_select()
7903 if (!(wiphy->bss_select_support & BIT(bss_select->behaviour))) in parse_bss_select()
7904 return -EINVAL; in parse_bss_select()
7925 return -EINVAL; in nl80211_parse_random_mac()
7933 return -EINVAL; in nl80211_parse_random_mac()
7953 if (!(wdev->chandef.chan->flags & IEEE80211_CHAN_RADAR)) in cfg80211_off_channel_oper_allowed()
7956 return regulatory_pre_cac_allowed(wdev->wiphy); in cfg80211_off_channel_oper_allowed()
7987 flags = &req->flags; in nl80211_check_scan_flags()
7988 mac_addr = req->mac_addr; in nl80211_check_scan_flags()
7989 mac_addr_mask = req->mac_addr_mask; in nl80211_check_scan_flags()
7994 flags = &req->flags; in nl80211_check_scan_flags()
7995 mac_addr = req->mac_addr; in nl80211_check_scan_flags()
7996 mac_addr_mask = req->mac_addr_mask; in nl80211_check_scan_flags()
8002 !(wiphy->features & NL80211_FEATURE_LOW_PRIORITY_SCAN)) || in nl80211_check_scan_flags()
8030 return -EOPNOTSUPP; in nl80211_check_scan_flags()
8035 if (!(wiphy->features & randomness_flag) || in nl80211_check_scan_flags()
8036 (wdev && wdev->current_bss)) in nl80211_check_scan_flags()
8037 return -EOPNOTSUPP; in nl80211_check_scan_flags()
8049 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_trigger_scan()
8050 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_trigger_scan()
8059 wiphy = &rdev->wiphy; in nl80211_trigger_scan()
8061 if (wdev->iftype == NL80211_IFTYPE_NAN) in nl80211_trigger_scan()
8062 return -EOPNOTSUPP; in nl80211_trigger_scan()
8064 if (!rdev->ops->scan) in nl80211_trigger_scan()
8065 return -EOPNOTSUPP; in nl80211_trigger_scan()
8067 if (rdev->scan_req || rdev->scan_msg) in nl80211_trigger_scan()
8068 return -EBUSY; in nl80211_trigger_scan()
8070 if (info->attrs[NL80211_ATTR_SCAN_FREQ_KHZ]) { in nl80211_trigger_scan()
8073 return -EOPNOTSUPP; in nl80211_trigger_scan()
8074 scan_freqs = info->attrs[NL80211_ATTR_SCAN_FREQ_KHZ]; in nl80211_trigger_scan()
8076 } else if (info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]) in nl80211_trigger_scan()
8077 scan_freqs = info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]; in nl80211_trigger_scan()
8082 return -EINVAL; in nl80211_trigger_scan()
8087 if (info->attrs[NL80211_ATTR_SCAN_SSIDS]) in nl80211_trigger_scan()
8088 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp) in nl80211_trigger_scan()
8091 if (n_ssids > wiphy->max_scan_ssids) in nl80211_trigger_scan()
8092 return -EINVAL; in nl80211_trigger_scan()
8094 if (info->attrs[NL80211_ATTR_IE]) in nl80211_trigger_scan()
8095 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_trigger_scan()
8099 if (ie_len > wiphy->max_scan_ie_len) in nl80211_trigger_scan()
8100 return -EINVAL; in nl80211_trigger_scan()
8103 + sizeof(*request->ssids) * n_ssids in nl80211_trigger_scan()
8104 + sizeof(*request->channels) * n_channels in nl80211_trigger_scan()
8107 return -ENOMEM; in nl80211_trigger_scan()
8110 request->ssids = (void *)&request->channels[n_channels]; in nl80211_trigger_scan()
8111 request->n_ssids = n_ssids; in nl80211_trigger_scan()
8114 request->ie = (void *)(request->ssids + n_ssids); in nl80211_trigger_scan()
8116 request->ie = (void *)(request->channels + n_channels); in nl80211_trigger_scan()
8131 err = -EINVAL; in nl80211_trigger_scan()
8136 if (chan->flags & IEEE80211_CHAN_DISABLED) in nl80211_trigger_scan()
8139 request->channels[i] = chan; in nl80211_trigger_scan()
8149 if (!wiphy->bands[band]) in nl80211_trigger_scan()
8151 for (j = 0; j < wiphy->bands[band]->n_channels; j++) { in nl80211_trigger_scan()
8154 chan = &wiphy->bands[band]->channels[j]; in nl80211_trigger_scan()
8156 if (chan->flags & IEEE80211_CHAN_DISABLED) in nl80211_trigger_scan()
8159 request->channels[i] = chan; in nl80211_trigger_scan()
8166 err = -EINVAL; in nl80211_trigger_scan()
8170 request->n_channels = i; in nl80211_trigger_scan()
8176 if (request->n_channels != 1) { in nl80211_trigger_scan()
8178 err = -EBUSY; in nl80211_trigger_scan()
8182 chan = request->channels[0]; in nl80211_trigger_scan()
8183 if (chan->center_freq != wdev->chandef.chan->center_freq) { in nl80211_trigger_scan()
8185 err = -EBUSY; in nl80211_trigger_scan()
8193 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp) { in nl80211_trigger_scan()
8195 err = -EINVAL; in nl80211_trigger_scan()
8198 request->ssids[i].ssid_len = nla_len(attr); in nl80211_trigger_scan()
8199 memcpy(request->ssids[i].ssid, nla_data(attr), nla_len(attr)); in nl80211_trigger_scan()
8204 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_trigger_scan()
8205 request->ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_trigger_scan()
8206 memcpy((void *)request->ie, in nl80211_trigger_scan()
8207 nla_data(info->attrs[NL80211_ATTR_IE]), in nl80211_trigger_scan()
8208 request->ie_len); in nl80211_trigger_scan()
8212 if (wiphy->bands[i]) in nl80211_trigger_scan()
8213 request->rates[i] = in nl80211_trigger_scan()
8214 (1 << wiphy->bands[i]->n_bitrates) - 1; in nl80211_trigger_scan()
8216 if (info->attrs[NL80211_ATTR_SCAN_SUPP_RATES]) { in nl80211_trigger_scan()
8218 info->attrs[NL80211_ATTR_SCAN_SUPP_RATES], in nl80211_trigger_scan()
8223 err = -EINVAL; in nl80211_trigger_scan()
8227 if (!wiphy->bands[band]) in nl80211_trigger_scan()
8230 err = ieee80211_get_ratemask(wiphy->bands[band], in nl80211_trigger_scan()
8233 &request->rates[band]); in nl80211_trigger_scan()
8239 if (info->attrs[NL80211_ATTR_MEASUREMENT_DURATION]) { in nl80211_trigger_scan()
8242 err = -EOPNOTSUPP; in nl80211_trigger_scan()
8246 request->duration = in nl80211_trigger_scan()
8247 nla_get_u16(info->attrs[NL80211_ATTR_MEASUREMENT_DURATION]); in nl80211_trigger_scan()
8248 request->duration_mandatory = in nl80211_trigger_scan()
8249 nla_get_flag(info->attrs[NL80211_ATTR_MEASUREMENT_DURATION_MANDATORY]); in nl80211_trigger_scan()
8252 err = nl80211_check_scan_flags(wiphy, wdev, request, info->attrs, in nl80211_trigger_scan()
8257 request->no_cck = in nl80211_trigger_scan()
8258 nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]); in nl80211_trigger_scan()
8269 if (info->attrs[NL80211_ATTR_BSSID]) in nl80211_trigger_scan()
8270 memcpy(request->bssid, in nl80211_trigger_scan()
8271 nla_data(info->attrs[NL80211_ATTR_BSSID]), ETH_ALEN); in nl80211_trigger_scan()
8272 else if (!(request->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) && in nl80211_trigger_scan()
8273 info->attrs[NL80211_ATTR_MAC]) in nl80211_trigger_scan()
8274 memcpy(request->bssid, nla_data(info->attrs[NL80211_ATTR_MAC]), in nl80211_trigger_scan()
8277 eth_broadcast_addr(request->bssid); in nl80211_trigger_scan()
8279 request->wdev = wdev; in nl80211_trigger_scan()
8280 request->wiphy = &rdev->wiphy; in nl80211_trigger_scan()
8281 request->scan_start = jiffies; in nl80211_trigger_scan()
8283 rdev->scan_req = request; in nl80211_trigger_scan()
8290 if (wdev->netdev) in nl80211_trigger_scan()
8291 dev_hold(wdev->netdev); in nl80211_trigger_scan()
8296 rdev->scan_req = NULL; in nl80211_trigger_scan()
8304 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_abort_scan()
8305 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_abort_scan()
8307 if (!rdev->ops->abort_scan) in nl80211_abort_scan()
8308 return -EOPNOTSUPP; in nl80211_abort_scan()
8310 if (rdev->scan_msg) in nl80211_abort_scan()
8313 if (!rdev->scan_req) in nl80211_abort_scan()
8314 return -ENOENT; in nl80211_abort_scan()
8339 return -EINVAL; in nl80211_parse_sched_scan_plans()
8341 request->scan_plans[0].interval = in nl80211_parse_sched_scan_plans()
8343 if (!request->scan_plans[0].interval) in nl80211_parse_sched_scan_plans()
8344 return -EINVAL; in nl80211_parse_sched_scan_plans()
8346 if (request->scan_plans[0].interval > in nl80211_parse_sched_scan_plans()
8347 wiphy->max_sched_scan_plan_interval) in nl80211_parse_sched_scan_plans()
8348 request->scan_plans[0].interval = in nl80211_parse_sched_scan_plans()
8349 wiphy->max_sched_scan_plan_interval; in nl80211_parse_sched_scan_plans()
8358 return -EINVAL; in nl80211_parse_sched_scan_plans()
8368 return -EINVAL; in nl80211_parse_sched_scan_plans()
8370 request->scan_plans[i].interval = in nl80211_parse_sched_scan_plans()
8372 if (!request->scan_plans[i].interval || in nl80211_parse_sched_scan_plans()
8373 request->scan_plans[i].interval > in nl80211_parse_sched_scan_plans()
8374 wiphy->max_sched_scan_plan_interval) in nl80211_parse_sched_scan_plans()
8375 return -EINVAL; in nl80211_parse_sched_scan_plans()
8378 request->scan_plans[i].iterations = in nl80211_parse_sched_scan_plans()
8380 if (!request->scan_plans[i].iterations || in nl80211_parse_sched_scan_plans()
8381 (request->scan_plans[i].iterations > in nl80211_parse_sched_scan_plans()
8382 wiphy->max_sched_scan_plan_iterations)) in nl80211_parse_sched_scan_plans()
8383 return -EINVAL; in nl80211_parse_sched_scan_plans()
8384 } else if (i < n_plans - 1) { in nl80211_parse_sched_scan_plans()
8389 return -EINVAL; in nl80211_parse_sched_scan_plans()
8399 if (request->scan_plans[n_plans - 1].iterations) in nl80211_parse_sched_scan_plans()
8400 return -EINVAL; in nl80211_parse_sched_scan_plans()
8417 ret = -EOPNOTSUPP; in nl80211_parse_sched_scan_per_band_rssi()
8420 match_sets->per_band_rssi_thold[i] = in nl80211_parse_sched_scan_per_band_rssi()
8426 match_sets->per_band_rssi_thold[i] = rssi_thold; in nl80211_parse_sched_scan_per_band_rssi()
8432 return -EINVAL; in nl80211_parse_sched_scan_per_band_rssi()
8434 match_sets->per_band_rssi_thold[band] = nla_get_s32(attr); in nl80211_parse_sched_scan_per_band_rssi()
8456 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
8466 if (n_ssids > wiphy->max_sched_scan_ssids) in nl80211_parse_sched_scan()
8467 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
8476 * global RSSI for all other matchsets - if there are other matchsets. in nl80211_parse_sched_scan()
8495 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
8514 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
8521 if (ie_len > wiphy->max_sched_scan_ie_len) in nl80211_parse_sched_scan()
8522 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
8530 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
8543 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
8548 if (!n_plans || n_plans > wiphy->max_sched_scan_plans) in nl80211_parse_sched_scan()
8549 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
8555 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
8558 + sizeof(*request->ssids) * n_ssids in nl80211_parse_sched_scan()
8559 + sizeof(*request->match_sets) * n_match_sets in nl80211_parse_sched_scan()
8560 + sizeof(*request->scan_plans) * n_plans in nl80211_parse_sched_scan()
8561 + sizeof(*request->channels) * n_channels in nl80211_parse_sched_scan()
8564 return ERR_PTR(-ENOMEM); in nl80211_parse_sched_scan()
8567 request->ssids = (void *)&request->channels[n_channels]; in nl80211_parse_sched_scan()
8568 request->n_ssids = n_ssids; in nl80211_parse_sched_scan()
8571 request->ie = (void *)(request->ssids + n_ssids); in nl80211_parse_sched_scan()
8573 request->ie = (void *)(request->channels + n_channels); in nl80211_parse_sched_scan()
8577 if (request->ie) in nl80211_parse_sched_scan()
8578 request->match_sets = (void *)(request->ie + ie_len); in nl80211_parse_sched_scan()
8580 request->match_sets = in nl80211_parse_sched_scan()
8581 (void *)(request->ssids + n_ssids); in nl80211_parse_sched_scan()
8583 request->match_sets = in nl80211_parse_sched_scan()
8584 (void *)(request->channels + n_channels); in nl80211_parse_sched_scan()
8586 request->n_match_sets = n_match_sets; in nl80211_parse_sched_scan()
8589 request->scan_plans = (void *)(request->match_sets + in nl80211_parse_sched_scan()
8591 else if (request->ie) in nl80211_parse_sched_scan()
8592 request->scan_plans = (void *)(request->ie + ie_len); in nl80211_parse_sched_scan()
8594 request->scan_plans = (void *)(request->ssids + n_ssids); in nl80211_parse_sched_scan()
8596 request->scan_plans = (void *)(request->channels + n_channels); in nl80211_parse_sched_scan()
8598 request->n_scan_plans = n_plans; in nl80211_parse_sched_scan()
8611 err = -EINVAL; in nl80211_parse_sched_scan()
8616 if (chan->flags & IEEE80211_CHAN_DISABLED) in nl80211_parse_sched_scan()
8619 request->channels[i] = chan; in nl80211_parse_sched_scan()
8627 if (!wiphy->bands[band]) in nl80211_parse_sched_scan()
8629 for (j = 0; j < wiphy->bands[band]->n_channels; j++) { in nl80211_parse_sched_scan()
8632 chan = &wiphy->bands[band]->channels[j]; in nl80211_parse_sched_scan()
8634 if (chan->flags & IEEE80211_CHAN_DISABLED) in nl80211_parse_sched_scan()
8637 request->channels[i] = chan; in nl80211_parse_sched_scan()
8644 err = -EINVAL; in nl80211_parse_sched_scan()
8648 request->n_channels = i; in nl80211_parse_sched_scan()
8655 err = -EINVAL; in nl80211_parse_sched_scan()
8658 request->ssids[i].ssid_len = nla_len(attr); in nl80211_parse_sched_scan()
8659 memcpy(request->ssids[i].ssid, nla_data(attr), in nl80211_parse_sched_scan()
8692 err = -EINVAL; in nl80211_parse_sched_scan()
8697 memcpy(request->match_sets[i].ssid.ssid, in nl80211_parse_sched_scan()
8699 request->match_sets[i].ssid.ssid_len = in nl80211_parse_sched_scan()
8703 memcpy(request->match_sets[i].bssid, in nl80211_parse_sched_scan()
8706 /* special attribute - old implementation w/a */ in nl80211_parse_sched_scan()
8707 request->match_sets[i].rssi_thold = default_match_rssi; in nl80211_parse_sched_scan()
8710 request->match_sets[i].rssi_thold = in nl80211_parse_sched_scan()
8715 &request->match_sets[i], in nl80211_parse_sched_scan()
8717 request->match_sets[i].rssi_thold); in nl80211_parse_sched_scan()
8726 request->match_sets[0].rssi_thold = default_match_rssi; in nl80211_parse_sched_scan()
8728 request->min_rssi_thold = INT_MAX; in nl80211_parse_sched_scan()
8730 request->min_rssi_thold = in nl80211_parse_sched_scan()
8731 min(request->match_sets[i].rssi_thold, in nl80211_parse_sched_scan()
8732 request->min_rssi_thold); in nl80211_parse_sched_scan()
8734 request->min_rssi_thold = NL80211_SCAN_RSSI_THOLD_OFF; in nl80211_parse_sched_scan()
8738 request->ie_len = ie_len; in nl80211_parse_sched_scan()
8739 memcpy((void *)request->ie, in nl80211_parse_sched_scan()
8741 request->ie_len); in nl80211_parse_sched_scan()
8749 request->delay = in nl80211_parse_sched_scan()
8753 request->relative_rssi = nla_get_s8( in nl80211_parse_sched_scan()
8755 request->relative_rssi_set = true; in nl80211_parse_sched_scan()
8758 if (request->relative_rssi_set && in nl80211_parse_sched_scan()
8764 request->rssi_adjust.band = rssi_adjust->band; in nl80211_parse_sched_scan()
8765 request->rssi_adjust.delta = rssi_adjust->delta; in nl80211_parse_sched_scan()
8766 if (!is_band_valid(wiphy, request->rssi_adjust.band)) { in nl80211_parse_sched_scan()
8767 err = -EINVAL; in nl80211_parse_sched_scan()
8776 request->scan_start = jiffies; in nl80211_parse_sched_scan()
8788 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_start_sched_scan()
8789 struct net_device *dev = info->user_ptr[1]; in nl80211_start_sched_scan()
8790 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_start_sched_scan()
8795 if (!rdev->wiphy.max_sched_scan_reqs || !rdev->ops->sched_scan_start) in nl80211_start_sched_scan()
8796 return -EOPNOTSUPP; in nl80211_start_sched_scan()
8798 want_multi = info->attrs[NL80211_ATTR_SCHED_SCAN_MULTI]; in nl80211_start_sched_scan()
8803 sched_scan_req = nl80211_parse_sched_scan(&rdev->wiphy, wdev, in nl80211_start_sched_scan()
8804 info->attrs, in nl80211_start_sched_scan()
8805 rdev->wiphy.max_match_sets); in nl80211_start_sched_scan()
8812 * or if driver does not support multi-scheduled scan in nl80211_start_sched_scan()
8814 if (want_multi && rdev->wiphy.max_sched_scan_reqs > 1) in nl80211_start_sched_scan()
8815 sched_scan_req->reqid = cfg80211_assign_cookie(rdev); in nl80211_start_sched_scan()
8821 sched_scan_req->dev = dev; in nl80211_start_sched_scan()
8822 sched_scan_req->wiphy = &rdev->wiphy; in nl80211_start_sched_scan()
8824 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) in nl80211_start_sched_scan()
8825 sched_scan_req->owner_nlportid = info->snd_portid; in nl80211_start_sched_scan()
8842 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_stop_sched_scan()
8845 if (!rdev->wiphy.max_sched_scan_reqs || !rdev->ops->sched_scan_stop) in nl80211_stop_sched_scan()
8846 return -EOPNOTSUPP; in nl80211_stop_sched_scan()
8848 if (info->attrs[NL80211_ATTR_COOKIE]) { in nl80211_stop_sched_scan()
8849 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); in nl80211_stop_sched_scan()
8853 req = list_first_or_null_rcu(&rdev->sched_scan_req_list, in nl80211_stop_sched_scan()
8856 if (!req || req->reqid || in nl80211_stop_sched_scan()
8857 (req->owner_nlportid && in nl80211_stop_sched_scan()
8858 req->owner_nlportid != info->snd_portid)) in nl80211_stop_sched_scan()
8859 return -ENOENT; in nl80211_stop_sched_scan()
8867 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_start_radar_detection()
8868 struct net_device *dev = info->user_ptr[1]; in nl80211_start_radar_detection()
8869 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_start_radar_detection()
8870 struct wiphy *wiphy = wdev->wiphy; in nl80211_start_radar_detection()
8878 return -EINVAL; in nl80211_start_radar_detection()
8885 return -EBUSY; in nl80211_start_radar_detection()
8887 if (wdev->cac_started) in nl80211_start_radar_detection()
8888 return -EBUSY; in nl80211_start_radar_detection()
8890 err = cfg80211_chandef_dfs_required(wiphy, &chandef, wdev->iftype); in nl80211_start_radar_detection()
8895 return -EINVAL; in nl80211_start_radar_detection()
8898 return -EINVAL; in nl80211_start_radar_detection()
8902 return -EOPNOTSUPP; in nl80211_start_radar_detection()
8904 if (!rdev->ops->start_radar_detection) in nl80211_start_radar_detection()
8905 return -EOPNOTSUPP; in nl80211_start_radar_detection()
8907 cac_time_ms = cfg80211_chandef_dfs_cac_time(&rdev->wiphy, &chandef); in nl80211_start_radar_detection()
8913 wdev->chandef = chandef; in nl80211_start_radar_detection()
8914 wdev->cac_started = true; in nl80211_start_radar_detection()
8915 wdev->cac_start_time = jiffies; in nl80211_start_radar_detection()
8916 wdev->cac_time_ms = cac_time_ms; in nl80211_start_radar_detection()
8924 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_notify_radar_detection()
8925 struct net_device *dev = info->user_ptr[1]; in nl80211_notify_radar_detection()
8926 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_notify_radar_detection()
8927 struct wiphy *wiphy = wdev->wiphy; in nl80211_notify_radar_detection()
8936 return -EINVAL; in nl80211_notify_radar_detection()
8945 err = cfg80211_chandef_dfs_required(wiphy, &chandef, wdev->iftype); in nl80211_notify_radar_detection()
8954 return -EINVAL; in nl80211_notify_radar_detection()
8960 if (chandef.chan->dfs_state == NL80211_DFS_UNAVAILABLE) in nl80211_notify_radar_detection()
8967 rdev->radar_chandef = chandef; in nl80211_notify_radar_detection()
8970 queue_work(cfg80211_wq, &rdev->propagate_radar_detect_wk); in nl80211_notify_radar_detection()
8977 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_channel_switch()
8978 struct net_device *dev = info->user_ptr[1]; in nl80211_channel_switch()
8979 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_channel_switch()
8981 /* csa_attrs is defined static to avoid waste of stack size - this in nl80211_channel_switch()
8991 if (!rdev->ops->channel_switch || in nl80211_channel_switch()
8992 !(rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH)) in nl80211_channel_switch()
8993 return -EOPNOTSUPP; in nl80211_channel_switch()
8995 switch (dev->ieee80211_ptr->iftype) { in nl80211_channel_switch()
9007 if (!wdev->beacon_interval) in nl80211_channel_switch()
9008 return -ENOTCONN; in nl80211_channel_switch()
9011 if (!wdev->ssid_len) in nl80211_channel_switch()
9012 return -ENOTCONN; in nl80211_channel_switch()
9015 if (!wdev->mesh_id_len) in nl80211_channel_switch()
9016 return -ENOTCONN; in nl80211_channel_switch()
9019 return -EOPNOTSUPP; in nl80211_channel_switch()
9023 params.beacon_csa.ftm_responder = -1; in nl80211_channel_switch()
9025 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ] || in nl80211_channel_switch()
9026 !info->attrs[NL80211_ATTR_CH_SWITCH_COUNT]) in nl80211_channel_switch()
9027 return -EINVAL; in nl80211_channel_switch()
9030 if (need_new_beacon && !info->attrs[NL80211_ATTR_CSA_IES]) in nl80211_channel_switch()
9031 return -EINVAL; in nl80211_channel_switch()
9036 cs_count = nla_get_u32(info->attrs[NL80211_ATTR_CH_SWITCH_COUNT]); in nl80211_channel_switch()
9038 return -EINVAL; in nl80211_channel_switch()
9045 err = nl80211_parse_beacon(rdev, info->attrs, &params.beacon_after); in nl80211_channel_switch()
9050 info->attrs[NL80211_ATTR_CSA_IES], in nl80211_channel_switch()
9051 nl80211_policy, info->extack); in nl80211_channel_switch()
9060 return -EINVAL; in nl80211_channel_switch()
9064 return -EINVAL; in nl80211_channel_switch()
9067 if (rdev->wiphy.max_num_csa_counters && in nl80211_channel_switch()
9069 rdev->wiphy.max_num_csa_counters)) in nl80211_channel_switch()
9070 return -EINVAL; in nl80211_channel_switch()
9075 /* sanity checks - counters should fit and be the same */ in nl80211_channel_switch()
9080 return -EINVAL; in nl80211_channel_switch()
9083 return -EINVAL; in nl80211_channel_switch()
9089 return -EINVAL; in nl80211_channel_switch()
9092 if (rdev->wiphy.max_num_csa_counters && in nl80211_channel_switch()
9094 rdev->wiphy.max_num_csa_counters)) in nl80211_channel_switch()
9095 return -EINVAL; in nl80211_channel_switch()
9100 /* sanity checks - counters should fit and be the same */ in nl80211_channel_switch()
9105 return -EINVAL; in nl80211_channel_switch()
9109 return -EINVAL; in nl80211_channel_switch()
9118 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &params.chandef, in nl80211_channel_switch()
9119 wdev->iftype)) in nl80211_channel_switch()
9120 return -EINVAL; in nl80211_channel_switch()
9122 err = cfg80211_chandef_dfs_required(wdev->wiphy, in nl80211_channel_switch()
9124 wdev->iftype); in nl80211_channel_switch()
9131 !nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS])) { in nl80211_channel_switch()
9132 return -EINVAL; in nl80211_channel_switch()
9136 if (info->attrs[NL80211_ATTR_CH_SWITCH_BLOCK_TX]) in nl80211_channel_switch()
9152 struct cfg80211_bss *res = &intbss->pub; in nl80211_send_bss()
9159 hdr = nl80211hdr_put(msg, NETLINK_CB(cb->skb).portid, seq, flags, in nl80211_send_bss()
9162 return -1; in nl80211_send_bss()
9166 if (nla_put_u32(msg, NL80211_ATTR_GENERATION, rdev->bss_generation)) in nl80211_send_bss()
9168 if (wdev->netdev && in nl80211_send_bss()
9169 nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex)) in nl80211_send_bss()
9178 if ((!is_zero_ether_addr(res->bssid) && in nl80211_send_bss()
9179 nla_put(msg, NL80211_BSS_BSSID, ETH_ALEN, res->bssid))) in nl80211_send_bss()
9184 if (rcu_access_pointer(res->proberesp_ies) && in nl80211_send_bss()
9191 ies = rcu_dereference(res->ies); in nl80211_send_bss()
9193 if (nla_put_u64_64bit(msg, NL80211_BSS_TSF, ies->tsf, in nl80211_send_bss()
9196 if (ies->len && nla_put(msg, NL80211_BSS_INFORMATION_ELEMENTS, in nl80211_send_bss()
9197 ies->len, ies->data)) in nl80211_send_bss()
9202 ies = rcu_dereference(res->beacon_ies); in nl80211_send_bss()
9203 if (ies && ies->from_beacon) { in nl80211_send_bss()
9204 if (nla_put_u64_64bit(msg, NL80211_BSS_BEACON_TSF, ies->tsf, in nl80211_send_bss()
9207 if (ies->len && nla_put(msg, NL80211_BSS_BEACON_IES, in nl80211_send_bss()
9208 ies->len, ies->data)) in nl80211_send_bss()
9213 if (res->beacon_interval && in nl80211_send_bss()
9214 nla_put_u16(msg, NL80211_BSS_BEACON_INTERVAL, res->beacon_interval)) in nl80211_send_bss()
9216 if (nla_put_u16(msg, NL80211_BSS_CAPABILITY, res->capability) || in nl80211_send_bss()
9217 nla_put_u32(msg, NL80211_BSS_FREQUENCY, res->channel->center_freq) || in nl80211_send_bss()
9219 res->channel->freq_offset) || in nl80211_send_bss()
9220 nla_put_u32(msg, NL80211_BSS_CHAN_WIDTH, res->scan_width) || in nl80211_send_bss()
9222 jiffies_to_msecs(jiffies - intbss->ts))) in nl80211_send_bss()
9225 if (intbss->parent_tsf && in nl80211_send_bss()
9227 intbss->parent_tsf, NL80211_BSS_PAD) || in nl80211_send_bss()
9229 intbss->parent_bssid))) in nl80211_send_bss()
9232 if (intbss->ts_boottime && in nl80211_send_bss()
9234 intbss->ts_boottime, NL80211_BSS_PAD)) in nl80211_send_bss()
9237 if (!nl80211_put_signal(msg, intbss->pub.chains, in nl80211_send_bss()
9238 intbss->pub.chain_signal, in nl80211_send_bss()
9242 switch (rdev->wiphy.signal_type) { in nl80211_send_bss()
9244 if (nla_put_u32(msg, NL80211_BSS_SIGNAL_MBM, res->signal)) in nl80211_send_bss()
9248 if (nla_put_u8(msg, NL80211_BSS_SIGNAL_UNSPEC, res->signal)) in nl80211_send_bss()
9255 switch (wdev->iftype) { in nl80211_send_bss()
9258 if (intbss == wdev->current_bss && in nl80211_send_bss()
9264 if (intbss == wdev->current_bss && in nl80211_send_bss()
9282 return -EMSGSIZE; in nl80211_send_bss()
9290 int start = cb->args[2], idx = 0; in nl80211_dump_scan()
9301 spin_lock_bh(&rdev->bss_lock); in nl80211_dump_scan()
9305 * into multiple messages. It is unlikely that any more bss-es will be in nl80211_dump_scan()
9312 cb->seq = rdev->bss_generation; in nl80211_dump_scan()
9314 list_for_each_entry(scan, &rdev->bss_list, list) { in nl80211_dump_scan()
9318 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_dump_scan()
9320 idx--; in nl80211_dump_scan()
9325 spin_unlock_bh(&rdev->bss_lock); in nl80211_dump_scan()
9328 cb->args[2] = idx; in nl80211_dump_scan()
9331 return skb->len; in nl80211_dump_scan()
9343 if (!survey->channel && !allow_radio_stats) in nl80211_send_survey()
9349 return -ENOMEM; in nl80211_send_survey()
9351 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) in nl80211_send_survey()
9358 if (survey->channel && in nl80211_send_survey()
9360 survey->channel->center_freq)) in nl80211_send_survey()
9363 if (survey->channel && survey->channel->freq_offset && in nl80211_send_survey()
9365 survey->channel->freq_offset)) in nl80211_send_survey()
9368 if ((survey->filled & SURVEY_INFO_NOISE_DBM) && in nl80211_send_survey()
9369 nla_put_u8(msg, NL80211_SURVEY_INFO_NOISE, survey->noise)) in nl80211_send_survey()
9371 if ((survey->filled & SURVEY_INFO_IN_USE) && in nl80211_send_survey()
9374 if ((survey->filled & SURVEY_INFO_TIME) && in nl80211_send_survey()
9376 survey->time, NL80211_SURVEY_INFO_PAD)) in nl80211_send_survey()
9378 if ((survey->filled & SURVEY_INFO_TIME_BUSY) && in nl80211_send_survey()
9380 survey->time_busy, NL80211_SURVEY_INFO_PAD)) in nl80211_send_survey()
9382 if ((survey->filled & SURVEY_INFO_TIME_EXT_BUSY) && in nl80211_send_survey()
9384 survey->time_ext_busy, NL80211_SURVEY_INFO_PAD)) in nl80211_send_survey()
9386 if ((survey->filled & SURVEY_INFO_TIME_RX) && in nl80211_send_survey()
9388 survey->time_rx, NL80211_SURVEY_INFO_PAD)) in nl80211_send_survey()
9390 if ((survey->filled & SURVEY_INFO_TIME_TX) && in nl80211_send_survey()
9392 survey->time_tx, NL80211_SURVEY_INFO_PAD)) in nl80211_send_survey()
9394 if ((survey->filled & SURVEY_INFO_TIME_SCAN) && in nl80211_send_survey()
9396 survey->time_scan, NL80211_SURVEY_INFO_PAD)) in nl80211_send_survey()
9398 if ((survey->filled & SURVEY_INFO_TIME_BSS_RX) && in nl80211_send_survey()
9400 survey->time_bss_rx, NL80211_SURVEY_INFO_PAD)) in nl80211_send_survey()
9410 return -EMSGSIZE; in nl80211_send_survey()
9419 int survey_idx = cb->args[2]; in nl80211_dump_survey()
9425 return -ENOMEM; in nl80211_dump_survey()
9435 if (!wdev->netdev) { in nl80211_dump_survey()
9436 res = -EINVAL; in nl80211_dump_survey()
9440 if (!rdev->ops->dump_survey) { in nl80211_dump_survey()
9441 res = -EOPNOTSUPP; in nl80211_dump_survey()
9446 res = rdev_dump_survey(rdev, wdev->netdev, survey_idx, &survey); in nl80211_dump_survey()
9447 if (res == -ENOENT) in nl80211_dump_survey()
9452 /* don't send disabled channels, but do send non-channel data */ in nl80211_dump_survey()
9454 survey.channel->flags & IEEE80211_CHAN_DISABLED) { in nl80211_dump_survey()
9460 NETLINK_CB(cb->skb).portid, in nl80211_dump_survey()
9461 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_dump_survey()
9462 wdev->netdev, radio_stats, &survey) < 0) in nl80211_dump_survey()
9468 cb->args[2] = survey_idx; in nl80211_dump_survey()
9469 res = skb->len; in nl80211_dump_survey()
9485 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_authenticate()
9486 struct net_device *dev = info->user_ptr[1]; in nl80211_authenticate()
9495 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_authenticate()
9496 return -EINVAL; in nl80211_authenticate()
9498 if (!info->attrs[NL80211_ATTR_AUTH_TYPE]) in nl80211_authenticate()
9499 return -EINVAL; in nl80211_authenticate()
9501 if (!info->attrs[NL80211_ATTR_SSID]) in nl80211_authenticate()
9502 return -EINVAL; in nl80211_authenticate()
9504 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ]) in nl80211_authenticate()
9505 return -EINVAL; in nl80211_authenticate()
9512 if (key.type != -1 && key.type != NL80211_KEYTYPE_GROUP) in nl80211_authenticate()
9513 return -EINVAL; in nl80211_authenticate()
9515 return -EINVAL; in nl80211_authenticate()
9520 return -EINVAL; in nl80211_authenticate()
9522 return -EINVAL; in nl80211_authenticate()
9532 for (i = 0; i < rdev->wiphy.n_cipher_suites; i++) { in nl80211_authenticate()
9533 if (key.p.cipher == rdev->wiphy.cipher_suites[i]) { in nl80211_authenticate()
9539 return -EINVAL; in nl80211_authenticate()
9542 if (!rdev->ops->auth) in nl80211_authenticate()
9543 return -EOPNOTSUPP; in nl80211_authenticate()
9545 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_authenticate()
9546 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_authenticate()
9547 return -EOPNOTSUPP; in nl80211_authenticate()
9549 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_authenticate()
9550 freq = MHZ_TO_KHZ(nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ])); in nl80211_authenticate()
9551 if (info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]) in nl80211_authenticate()
9553 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]); in nl80211_authenticate()
9555 chan = nl80211_get_valid_chan(&rdev->wiphy, freq); in nl80211_authenticate()
9557 return -EINVAL; in nl80211_authenticate()
9559 ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); in nl80211_authenticate()
9560 ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); in nl80211_authenticate()
9562 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_authenticate()
9563 ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_authenticate()
9564 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_authenticate()
9567 auth_type = nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]); in nl80211_authenticate()
9569 return -EINVAL; in nl80211_authenticate()
9575 !info->attrs[NL80211_ATTR_AUTH_DATA]) in nl80211_authenticate()
9576 return -EINVAL; in nl80211_authenticate()
9578 if (info->attrs[NL80211_ATTR_AUTH_DATA]) { in nl80211_authenticate()
9583 return -EINVAL; in nl80211_authenticate()
9584 auth_data = nla_data(info->attrs[NL80211_ATTR_AUTH_DATA]); in nl80211_authenticate()
9585 auth_data_len = nla_len(info->attrs[NL80211_ATTR_AUTH_DATA]); in nl80211_authenticate()
9588 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; in nl80211_authenticate()
9597 wdev_lock(dev->ieee80211_ptr); in nl80211_authenticate()
9602 wdev_unlock(dev->ieee80211_ptr); in nl80211_authenticate()
9609 if (!info->attrs[NL80211_ATTR_SOCKET_OWNER]) { in validate_pae_over_nl80211()
9611 return -EINVAL; in validate_pae_over_nl80211()
9614 if (!rdev->ops->tx_control_port || in validate_pae_over_nl80211()
9615 !wiphy_ext_feature_isset(&rdev->wiphy, in validate_pae_over_nl80211()
9617 return -EOPNOTSUPP; in validate_pae_over_nl80211()
9629 settings->control_port = info->attrs[NL80211_ATTR_CONTROL_PORT]; in nl80211_crypto_settings()
9631 if (info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]) { in nl80211_crypto_settings()
9635 info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]); in nl80211_crypto_settings()
9636 settings->control_port_ethertype = cpu_to_be16(proto); in nl80211_crypto_settings()
9637 if (!(rdev->wiphy.flags & WIPHY_FLAG_CONTROL_PORT_PROTOCOL) && in nl80211_crypto_settings()
9639 return -EINVAL; in nl80211_crypto_settings()
9640 if (info->attrs[NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT]) in nl80211_crypto_settings()
9641 settings->control_port_no_encrypt = true; in nl80211_crypto_settings()
9643 settings->control_port_ethertype = cpu_to_be16(ETH_P_PAE); in nl80211_crypto_settings()
9645 if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) { in nl80211_crypto_settings()
9651 settings->control_port_over_nl80211 = true; in nl80211_crypto_settings()
9653 if (info->attrs[NL80211_ATTR_CONTROL_PORT_NO_PREAUTH]) in nl80211_crypto_settings()
9654 settings->control_port_no_preauth = true; in nl80211_crypto_settings()
9657 if (info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]) { in nl80211_crypto_settings()
9661 data = nla_data(info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]); in nl80211_crypto_settings()
9662 len = nla_len(info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]); in nl80211_crypto_settings()
9663 settings->n_ciphers_pairwise = len / sizeof(u32); in nl80211_crypto_settings()
9666 return -EINVAL; in nl80211_crypto_settings()
9668 if (settings->n_ciphers_pairwise > cipher_limit) in nl80211_crypto_settings()
9669 return -EINVAL; in nl80211_crypto_settings()
9671 memcpy(settings->ciphers_pairwise, data, len); in nl80211_crypto_settings()
9673 for (i = 0; i < settings->n_ciphers_pairwise; i++) in nl80211_crypto_settings()
9675 &rdev->wiphy, in nl80211_crypto_settings()
9676 settings->ciphers_pairwise[i])) in nl80211_crypto_settings()
9677 return -EINVAL; in nl80211_crypto_settings()
9680 if (info->attrs[NL80211_ATTR_CIPHER_SUITE_GROUP]) { in nl80211_crypto_settings()
9681 settings->cipher_group = in nl80211_crypto_settings()
9682 nla_get_u32(info->attrs[NL80211_ATTR_CIPHER_SUITE_GROUP]); in nl80211_crypto_settings()
9683 if (!cfg80211_supported_cipher_suite(&rdev->wiphy, in nl80211_crypto_settings()
9684 settings->cipher_group)) in nl80211_crypto_settings()
9685 return -EINVAL; in nl80211_crypto_settings()
9688 if (info->attrs[NL80211_ATTR_WPA_VERSIONS]) { in nl80211_crypto_settings()
9689 settings->wpa_versions = in nl80211_crypto_settings()
9690 nla_get_u32(info->attrs[NL80211_ATTR_WPA_VERSIONS]); in nl80211_crypto_settings()
9691 if (!nl80211_valid_wpa_versions(settings->wpa_versions)) in nl80211_crypto_settings()
9692 return -EINVAL; in nl80211_crypto_settings()
9695 if (info->attrs[NL80211_ATTR_AKM_SUITES]) { in nl80211_crypto_settings()
9699 data = nla_data(info->attrs[NL80211_ATTR_AKM_SUITES]); in nl80211_crypto_settings()
9700 len = nla_len(info->attrs[NL80211_ATTR_AKM_SUITES]); in nl80211_crypto_settings()
9701 settings->n_akm_suites = len / sizeof(u32); in nl80211_crypto_settings()
9704 return -EINVAL; in nl80211_crypto_settings()
9706 if (settings->n_akm_suites > NL80211_MAX_NR_AKM_SUITES) in nl80211_crypto_settings()
9707 return -EINVAL; in nl80211_crypto_settings()
9709 memcpy(settings->akm_suites, data, len); in nl80211_crypto_settings()
9712 if (info->attrs[NL80211_ATTR_PMK]) { in nl80211_crypto_settings()
9713 if (nla_len(info->attrs[NL80211_ATTR_PMK]) != WLAN_PMK_LEN) in nl80211_crypto_settings()
9714 return -EINVAL; in nl80211_crypto_settings()
9715 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_crypto_settings()
9717 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_crypto_settings()
9719 return -EINVAL; in nl80211_crypto_settings()
9720 settings->psk = nla_data(info->attrs[NL80211_ATTR_PMK]); in nl80211_crypto_settings()
9723 if (info->attrs[NL80211_ATTR_SAE_PASSWORD]) { in nl80211_crypto_settings()
9724 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_crypto_settings()
9726 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_crypto_settings()
9728 return -EINVAL; in nl80211_crypto_settings()
9729 settings->sae_pwd = in nl80211_crypto_settings()
9730 nla_data(info->attrs[NL80211_ATTR_SAE_PASSWORD]); in nl80211_crypto_settings()
9731 settings->sae_pwd_len = in nl80211_crypto_settings()
9732 nla_len(info->attrs[NL80211_ATTR_SAE_PASSWORD]); in nl80211_crypto_settings()
9740 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_associate()
9741 struct net_device *dev = info->user_ptr[1]; in nl80211_associate()
9748 if (dev->ieee80211_ptr->conn_owner_nlportid && in nl80211_associate()
9749 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) in nl80211_associate()
9750 return -EPERM; in nl80211_associate()
9752 if (!info->attrs[NL80211_ATTR_MAC] || in nl80211_associate()
9753 !info->attrs[NL80211_ATTR_SSID] || in nl80211_associate()
9754 !info->attrs[NL80211_ATTR_WIPHY_FREQ]) in nl80211_associate()
9755 return -EINVAL; in nl80211_associate()
9757 if (!rdev->ops->assoc) in nl80211_associate()
9758 return -EOPNOTSUPP; in nl80211_associate()
9760 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_associate()
9761 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_associate()
9762 return -EOPNOTSUPP; in nl80211_associate()
9764 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_associate()
9766 freq = MHZ_TO_KHZ(nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ])); in nl80211_associate()
9767 if (info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]) in nl80211_associate()
9769 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]); in nl80211_associate()
9770 chan = nl80211_get_valid_chan(&rdev->wiphy, freq); in nl80211_associate()
9772 return -EINVAL; in nl80211_associate()
9774 ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); in nl80211_associate()
9775 ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); in nl80211_associate()
9777 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_associate()
9778 req.ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_associate()
9779 req.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_associate()
9782 if (info->attrs[NL80211_ATTR_USE_MFP]) { in nl80211_associate()
9784 nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]); in nl80211_associate()
9788 return -EINVAL; in nl80211_associate()
9791 if (info->attrs[NL80211_ATTR_PREV_BSSID]) in nl80211_associate()
9792 req.prev_bssid = nla_data(info->attrs[NL80211_ATTR_PREV_BSSID]); in nl80211_associate()
9794 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HT])) in nl80211_associate()
9797 if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) in nl80211_associate()
9799 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]), in nl80211_associate()
9802 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) { in nl80211_associate()
9803 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) in nl80211_associate()
9804 return -EINVAL; in nl80211_associate()
9806 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]), in nl80211_associate()
9810 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_VHT])) in nl80211_associate()
9813 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) in nl80211_associate()
9815 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]), in nl80211_associate()
9818 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) { in nl80211_associate()
9819 if (!info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) in nl80211_associate()
9820 return -EINVAL; in nl80211_associate()
9822 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]), in nl80211_associate()
9826 if (nla_get_flag(info->attrs[NL80211_ATTR_USE_RRM])) { in nl80211_associate()
9827 if (!((rdev->wiphy.features & in nl80211_associate()
9829 (rdev->wiphy.features & NL80211_FEATURE_QUIET)) && in nl80211_associate()
9830 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_associate()
9832 return -EINVAL; in nl80211_associate()
9836 if (info->attrs[NL80211_ATTR_FILS_KEK]) { in nl80211_associate()
9837 req.fils_kek = nla_data(info->attrs[NL80211_ATTR_FILS_KEK]); in nl80211_associate()
9838 req.fils_kek_len = nla_len(info->attrs[NL80211_ATTR_FILS_KEK]); in nl80211_associate()
9839 if (!info->attrs[NL80211_ATTR_FILS_NONCES]) in nl80211_associate()
9840 return -EINVAL; in nl80211_associate()
9842 nla_data(info->attrs[NL80211_ATTR_FILS_NONCES]); in nl80211_associate()
9845 if (info->attrs[NL80211_ATTR_S1G_CAPABILITY_MASK]) { in nl80211_associate()
9846 if (!info->attrs[NL80211_ATTR_S1G_CAPABILITY]) in nl80211_associate()
9847 return -EINVAL; in nl80211_associate()
9849 nla_data(info->attrs[NL80211_ATTR_S1G_CAPABILITY_MASK]), in nl80211_associate()
9853 if (info->attrs[NL80211_ATTR_S1G_CAPABILITY]) { in nl80211_associate()
9854 if (!info->attrs[NL80211_ATTR_S1G_CAPABILITY_MASK]) in nl80211_associate()
9855 return -EINVAL; in nl80211_associate()
9857 nla_data(info->attrs[NL80211_ATTR_S1G_CAPABILITY]), in nl80211_associate()
9863 wdev_lock(dev->ieee80211_ptr); in nl80211_associate()
9868 if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) { in nl80211_associate()
9869 dev->ieee80211_ptr->conn_owner_nlportid = in nl80211_associate()
9870 info->snd_portid; in nl80211_associate()
9871 memcpy(dev->ieee80211_ptr->disconnect_bssid, in nl80211_associate()
9875 wdev_unlock(dev->ieee80211_ptr); in nl80211_associate()
9883 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_deauthenticate()
9884 struct net_device *dev = info->user_ptr[1]; in nl80211_deauthenticate()
9890 if (dev->ieee80211_ptr->conn_owner_nlportid && in nl80211_deauthenticate()
9891 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) in nl80211_deauthenticate()
9892 return -EPERM; in nl80211_deauthenticate()
9894 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_deauthenticate()
9895 return -EINVAL; in nl80211_deauthenticate()
9897 if (!info->attrs[NL80211_ATTR_REASON_CODE]) in nl80211_deauthenticate()
9898 return -EINVAL; in nl80211_deauthenticate()
9900 if (!rdev->ops->deauth) in nl80211_deauthenticate()
9901 return -EOPNOTSUPP; in nl80211_deauthenticate()
9903 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_deauthenticate()
9904 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_deauthenticate()
9905 return -EOPNOTSUPP; in nl80211_deauthenticate()
9907 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_deauthenticate()
9909 reason_code = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); in nl80211_deauthenticate()
9912 return -EINVAL; in nl80211_deauthenticate()
9915 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_deauthenticate()
9916 ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_deauthenticate()
9917 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_deauthenticate()
9920 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; in nl80211_deauthenticate()
9922 wdev_lock(dev->ieee80211_ptr); in nl80211_deauthenticate()
9925 wdev_unlock(dev->ieee80211_ptr); in nl80211_deauthenticate()
9931 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_disassociate()
9932 struct net_device *dev = info->user_ptr[1]; in nl80211_disassociate()
9938 if (dev->ieee80211_ptr->conn_owner_nlportid && in nl80211_disassociate()
9939 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) in nl80211_disassociate()
9940 return -EPERM; in nl80211_disassociate()
9942 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_disassociate()
9943 return -EINVAL; in nl80211_disassociate()
9945 if (!info->attrs[NL80211_ATTR_REASON_CODE]) in nl80211_disassociate()
9946 return -EINVAL; in nl80211_disassociate()
9948 if (!rdev->ops->disassoc) in nl80211_disassociate()
9949 return -EOPNOTSUPP; in nl80211_disassociate()
9951 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_disassociate()
9952 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_disassociate()
9953 return -EOPNOTSUPP; in nl80211_disassociate()
9955 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_disassociate()
9957 reason_code = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); in nl80211_disassociate()
9960 return -EINVAL; in nl80211_disassociate()
9963 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_disassociate()
9964 ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_disassociate()
9965 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_disassociate()
9968 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; in nl80211_disassociate()
9970 wdev_lock(dev->ieee80211_ptr); in nl80211_disassociate()
9973 wdev_unlock(dev->ieee80211_ptr); in nl80211_disassociate()
9982 struct wiphy *wiphy = &rdev->wiphy; in nl80211_parse_mcast_rate()
9989 sband = wiphy->bands[band]; in nl80211_parse_mcast_rate()
9993 for (i = 0; i < sband->n_bitrates; i++) { in nl80211_parse_mcast_rate()
9994 if (sband->bitrates[i].bitrate == rateval) { in nl80211_parse_mcast_rate()
10007 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_join_ibss()
10008 struct net_device *dev = info->user_ptr[1]; in nl80211_join_ibss()
10016 if (!info->attrs[NL80211_ATTR_SSID] || in nl80211_join_ibss()
10017 !nla_len(info->attrs[NL80211_ATTR_SSID])) in nl80211_join_ibss()
10018 return -EINVAL; in nl80211_join_ibss()
10022 if (info->attrs[NL80211_ATTR_BEACON_INTERVAL]) in nl80211_join_ibss()
10024 nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]); in nl80211_join_ibss()
10031 if (!rdev->ops->join_ibss) in nl80211_join_ibss()
10032 return -EOPNOTSUPP; in nl80211_join_ibss()
10034 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC) in nl80211_join_ibss()
10035 return -EOPNOTSUPP; in nl80211_join_ibss()
10037 wiphy = &rdev->wiphy; in nl80211_join_ibss()
10039 if (info->attrs[NL80211_ATTR_MAC]) { in nl80211_join_ibss()
10040 ibss.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_join_ibss()
10043 return -EINVAL; in nl80211_join_ibss()
10045 ibss.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); in nl80211_join_ibss()
10046 ibss.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); in nl80211_join_ibss()
10048 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_join_ibss()
10049 ibss.ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_join_ibss()
10050 ibss.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_join_ibss()
10057 if (!cfg80211_reg_can_beacon(&rdev->wiphy, &ibss.chandef, in nl80211_join_ibss()
10059 return -EINVAL; in nl80211_join_ibss()
10068 if (!(rdev->wiphy.features & NL80211_FEATURE_HT_IBSS)) in nl80211_join_ibss()
10069 return -EINVAL; in nl80211_join_ibss()
10074 if (!(rdev->wiphy.features & NL80211_FEATURE_HT_IBSS)) in nl80211_join_ibss()
10075 return -EINVAL; in nl80211_join_ibss()
10076 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_join_ibss()
10078 return -EINVAL; in nl80211_join_ibss()
10081 return -EINVAL; in nl80211_join_ibss()
10084 ibss.channel_fixed = !!info->attrs[NL80211_ATTR_FREQ_FIXED]; in nl80211_join_ibss()
10085 ibss.privacy = !!info->attrs[NL80211_ATTR_PRIVACY]; in nl80211_join_ibss()
10087 if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) { in nl80211_join_ibss()
10089 nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); in nl80211_join_ibss()
10091 nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); in nl80211_join_ibss()
10093 wiphy->bands[ibss.chandef.chan->band]; in nl80211_join_ibss()
10101 if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) in nl80211_join_ibss()
10103 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]), in nl80211_join_ibss()
10106 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) { in nl80211_join_ibss()
10107 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) in nl80211_join_ibss()
10108 return -EINVAL; in nl80211_join_ibss()
10110 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]), in nl80211_join_ibss()
10114 if (info->attrs[NL80211_ATTR_MCAST_RATE] && in nl80211_join_ibss()
10116 nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]))) in nl80211_join_ibss()
10117 return -EINVAL; in nl80211_join_ibss()
10119 if (ibss.privacy && info->attrs[NL80211_ATTR_KEYS]) { in nl80211_join_ibss()
10129 return -EINVAL; in nl80211_join_ibss()
10134 nla_get_flag(info->attrs[NL80211_ATTR_CONTROL_PORT]); in nl80211_join_ibss()
10136 if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) { in nl80211_join_ibss()
10148 nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS]); in nl80211_join_ibss()
10150 wdev_lock(dev->ieee80211_ptr); in nl80211_join_ibss()
10154 else if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) in nl80211_join_ibss()
10155 dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid; in nl80211_join_ibss()
10156 wdev_unlock(dev->ieee80211_ptr); in nl80211_join_ibss()
10163 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_leave_ibss()
10164 struct net_device *dev = info->user_ptr[1]; in nl80211_leave_ibss()
10166 if (!rdev->ops->leave_ibss) in nl80211_leave_ibss()
10167 return -EOPNOTSUPP; in nl80211_leave_ibss()
10169 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC) in nl80211_leave_ibss()
10170 return -EOPNOTSUPP; in nl80211_leave_ibss()
10177 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_mcast_rate()
10178 struct net_device *dev = info->user_ptr[1]; in nl80211_set_mcast_rate()
10183 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC && in nl80211_set_mcast_rate()
10184 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT && in nl80211_set_mcast_rate()
10185 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_OCB) in nl80211_set_mcast_rate()
10186 return -EOPNOTSUPP; in nl80211_set_mcast_rate()
10188 if (!rdev->ops->set_mcast_rate) in nl80211_set_mcast_rate()
10189 return -EOPNOTSUPP; in nl80211_set_mcast_rate()
10193 if (!info->attrs[NL80211_ATTR_MCAST_RATE]) in nl80211_set_mcast_rate()
10194 return -EINVAL; in nl80211_set_mcast_rate()
10196 nla_rate = nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]); in nl80211_set_mcast_rate()
10198 return -EINVAL; in nl80211_set_mcast_rate()
10227 if (nla_put_u32(skb, NL80211_ATTR_WIPHY, rdev->wiphy_idx)) in __cfg80211_alloc_vendor_skb()
10232 info->vendor_id)) in __cfg80211_alloc_vendor_skb()
10235 info->subcmd)) in __cfg80211_alloc_vendor_skb()
10243 if (wdev->netdev && in __cfg80211_alloc_vendor_skb()
10245 wdev->netdev->ifindex)) in __cfg80211_alloc_vendor_skb()
10253 ((void **)skb->cb)[0] = rdev; in __cfg80211_alloc_vendor_skb()
10254 ((void **)skb->cb)[1] = hdr; in __cfg80211_alloc_vendor_skb()
10255 ((void **)skb->cb)[2] = data; in __cfg80211_alloc_vendor_skb()
10277 if (WARN_ON(vendor_event_idx != -1)) in __cfg80211_alloc_event_skb()
10283 vendor_event_idx >= wiphy->n_vendor_events)) in __cfg80211_alloc_event_skb()
10285 info = &wiphy->vendor_events[vendor_event_idx]; in __cfg80211_alloc_event_skb()
10299 struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0]; in __cfg80211_send_event_skb()
10300 void *hdr = ((void **)skb->cb)[1]; in __cfg80211_send_event_skb()
10302 struct nlattr *data = ((void **)skb->cb)[2]; in __cfg80211_send_event_skb()
10306 memset(skb->cb, 0, sizeof(skb->cb)); in __cfg80211_send_event_skb()
10311 if (nlhdr->nlmsg_pid) { in __cfg80211_send_event_skb()
10312 genlmsg_unicast(wiphy_net(&rdev->wiphy), skb, in __cfg80211_send_event_skb()
10313 nlhdr->nlmsg_pid); in __cfg80211_send_event_skb()
10315 if (data->nla_type == NL80211_ATTR_VENDOR_DATA) in __cfg80211_send_event_skb()
10318 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), in __cfg80211_send_event_skb()
10327 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_testmode_do()
10329 __cfg80211_wdev_from_attrs(genl_info_net(info), info->attrs); in nl80211_testmode_do()
10332 if (!rdev->ops->testmode_cmd) in nl80211_testmode_do()
10333 return -EOPNOTSUPP; in nl80211_testmode_do()
10337 if (err != -EINVAL) in nl80211_testmode_do()
10340 } else if (wdev->wiphy != &rdev->wiphy) { in nl80211_testmode_do()
10341 return -EINVAL; in nl80211_testmode_do()
10344 if (!info->attrs[NL80211_ATTR_TESTDATA]) in nl80211_testmode_do()
10345 return -EINVAL; in nl80211_testmode_do()
10347 rdev->cur_cmd_info = info; in nl80211_testmode_do()
10349 nla_data(info->attrs[NL80211_ATTR_TESTDATA]), in nl80211_testmode_do()
10350 nla_len(info->attrs[NL80211_ATTR_TESTDATA])); in nl80211_testmode_do()
10351 rdev->cur_cmd_info = NULL; in nl80211_testmode_do()
10368 if (cb->args[0]) { in nl80211_testmode_dump()
10373 phy_idx = cb->args[0] - 1; in nl80211_testmode_dump()
10377 err = -ENOENT; in nl80211_testmode_dump()
10384 err = -ENOMEM; in nl80211_testmode_dump()
10388 err = nlmsg_parse_deprecated(cb->nlh, in nl80211_testmode_dump()
10395 rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk), attrbuf); in nl80211_testmode_dump()
10400 phy_idx = rdev->wiphy_idx; in nl80211_testmode_dump()
10403 cb->args[1] = (long)attrbuf[NL80211_ATTR_TESTDATA]; in nl80211_testmode_dump()
10406 if (cb->args[1]) { in nl80211_testmode_dump()
10407 data = nla_data((void *)cb->args[1]); in nl80211_testmode_dump()
10408 data_len = nla_len((void *)cb->args[1]); in nl80211_testmode_dump()
10411 if (!rdev->ops->testmode_dump) { in nl80211_testmode_dump()
10412 err = -EOPNOTSUPP; in nl80211_testmode_dump()
10417 void *hdr = nl80211hdr_put(skb, NETLINK_CB(cb->skb).portid, in nl80211_testmode_dump()
10418 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_testmode_dump()
10438 if (err == -ENOBUFS || err == -ENOENT) { in nl80211_testmode_dump()
10449 err = skb->len; in nl80211_testmode_dump()
10451 cb->args[0] = phy_idx + 1; in nl80211_testmode_dump()
10461 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_connect()
10462 struct net_device *dev = info->user_ptr[1]; in nl80211_connect()
10471 if (!info->attrs[NL80211_ATTR_SSID] || in nl80211_connect()
10472 !nla_len(info->attrs[NL80211_ATTR_SSID])) in nl80211_connect()
10473 return -EINVAL; in nl80211_connect()
10475 if (info->attrs[NL80211_ATTR_AUTH_TYPE]) { in nl80211_connect()
10477 nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]); in nl80211_connect()
10480 return -EINVAL; in nl80211_connect()
10484 connect.privacy = info->attrs[NL80211_ATTR_PRIVACY]; in nl80211_connect()
10486 if (info->attrs[NL80211_ATTR_WANT_1X_4WAY_HS] && in nl80211_connect()
10487 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_connect()
10489 return -EINVAL; in nl80211_connect()
10490 connect.want_1x = info->attrs[NL80211_ATTR_WANT_1X_4WAY_HS]; in nl80211_connect()
10497 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_connect()
10498 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_connect()
10499 return -EOPNOTSUPP; in nl80211_connect()
10501 wiphy = &rdev->wiphy; in nl80211_connect()
10503 connect.bg_scan_period = -1; in nl80211_connect()
10504 if (info->attrs[NL80211_ATTR_BG_SCAN_PERIOD] && in nl80211_connect()
10505 (wiphy->flags & WIPHY_FLAG_SUPPORTS_FW_ROAM)) { in nl80211_connect()
10507 nla_get_u16(info->attrs[NL80211_ATTR_BG_SCAN_PERIOD]); in nl80211_connect()
10510 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_connect()
10511 connect.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_connect()
10512 else if (info->attrs[NL80211_ATTR_MAC_HINT]) in nl80211_connect()
10514 nla_data(info->attrs[NL80211_ATTR_MAC_HINT]); in nl80211_connect()
10515 connect.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); in nl80211_connect()
10516 connect.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); in nl80211_connect()
10518 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_connect()
10519 connect.ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_connect()
10520 connect.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_connect()
10523 if (info->attrs[NL80211_ATTR_USE_MFP]) { in nl80211_connect()
10524 connect.mfp = nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]); in nl80211_connect()
10526 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_connect()
10528 return -EOPNOTSUPP; in nl80211_connect()
10533 if (info->attrs[NL80211_ATTR_PREV_BSSID]) in nl80211_connect()
10535 nla_data(info->attrs[NL80211_ATTR_PREV_BSSID]); in nl80211_connect()
10537 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) in nl80211_connect()
10539 info->attrs[NL80211_ATTR_WIPHY_FREQ])); in nl80211_connect()
10540 if (info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]) in nl80211_connect()
10542 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]); in nl80211_connect()
10547 return -EINVAL; in nl80211_connect()
10548 } else if (info->attrs[NL80211_ATTR_WIPHY_FREQ_HINT]) { in nl80211_connect()
10549 freq = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_HINT]); in nl80211_connect()
10553 return -EINVAL; in nl80211_connect()
10556 if (info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]) { in nl80211_connect()
10558 nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]); in nl80211_connect()
10560 if (info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]) in nl80211_connect()
10562 nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]); in nl80211_connect()
10565 if (connect.privacy && info->attrs[NL80211_ATTR_KEYS]) { in nl80211_connect()
10571 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HT])) in nl80211_connect()
10574 if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) in nl80211_connect()
10576 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]), in nl80211_connect()
10579 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) { in nl80211_connect()
10580 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) { in nl80211_connect()
10582 return -EINVAL; in nl80211_connect()
10585 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]), in nl80211_connect()
10589 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_VHT])) in nl80211_connect()
10592 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) in nl80211_connect()
10594 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]), in nl80211_connect()
10597 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) { in nl80211_connect()
10598 if (!info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) { in nl80211_connect()
10600 return -EINVAL; in nl80211_connect()
10603 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]), in nl80211_connect()
10607 if (nla_get_flag(info->attrs[NL80211_ATTR_USE_RRM])) { in nl80211_connect()
10608 if (!((rdev->wiphy.features & in nl80211_connect()
10610 (rdev->wiphy.features & NL80211_FEATURE_QUIET)) && in nl80211_connect()
10611 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_connect()
10614 return -EINVAL; in nl80211_connect()
10619 connect.pbss = nla_get_flag(info->attrs[NL80211_ATTR_PBSS]); in nl80211_connect()
10620 if (connect.pbss && !rdev->wiphy.bands[NL80211_BAND_60GHZ]) { in nl80211_connect()
10622 return -EOPNOTSUPP; in nl80211_connect()
10625 if (info->attrs[NL80211_ATTR_BSS_SELECT]) { in nl80211_connect()
10629 return -EINVAL; in nl80211_connect()
10632 err = parse_bss_select(info->attrs[NL80211_ATTR_BSS_SELECT], in nl80211_connect()
10640 if (wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_connect()
10642 info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] && in nl80211_connect()
10643 info->attrs[NL80211_ATTR_FILS_ERP_REALM] && in nl80211_connect()
10644 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] && in nl80211_connect()
10645 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { in nl80211_connect()
10647 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); in nl80211_connect()
10649 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); in nl80211_connect()
10651 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); in nl80211_connect()
10653 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); in nl80211_connect()
10656 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM]); in nl80211_connect()
10658 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); in nl80211_connect()
10660 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); in nl80211_connect()
10661 } else if (info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] || in nl80211_connect()
10662 info->attrs[NL80211_ATTR_FILS_ERP_REALM] || in nl80211_connect()
10663 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] || in nl80211_connect()
10664 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { in nl80211_connect()
10666 return -EINVAL; in nl80211_connect()
10669 if (nla_get_flag(info->attrs[NL80211_ATTR_EXTERNAL_AUTH_SUPPORT])) { in nl80211_connect()
10670 if (!info->attrs[NL80211_ATTR_SOCKET_OWNER]) { in nl80211_connect()
10674 return -EINVAL; in nl80211_connect()
10679 wdev_lock(dev->ieee80211_ptr); in nl80211_connect()
10686 if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) { in nl80211_connect()
10687 dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid; in nl80211_connect()
10689 memcpy(dev->ieee80211_ptr->disconnect_bssid, in nl80211_connect()
10692 eth_zero_addr(dev->ieee80211_ptr->disconnect_bssid); in nl80211_connect()
10695 wdev_unlock(dev->ieee80211_ptr); in nl80211_connect()
10704 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_update_connect_params()
10705 struct net_device *dev = info->user_ptr[1]; in nl80211_update_connect_params()
10706 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_update_connect_params()
10712 if (!rdev->ops->update_connect_params) in nl80211_update_connect_params()
10713 return -EOPNOTSUPP; in nl80211_update_connect_params()
10715 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_update_connect_params()
10716 connect.ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_update_connect_params()
10717 connect.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_update_connect_params()
10721 fils_sk_offload = wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_update_connect_params()
10725 * when driver supports fils-sk offload all attributes must be in nl80211_update_connect_params()
10726 * provided. So the else covers "fils-sk-not-all" and in nl80211_update_connect_params()
10727 * "no-fils-sk-any". in nl80211_update_connect_params()
10730 info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] && in nl80211_update_connect_params()
10731 info->attrs[NL80211_ATTR_FILS_ERP_REALM] && in nl80211_update_connect_params()
10732 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] && in nl80211_update_connect_params()
10733 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { in nl80211_update_connect_params()
10735 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); in nl80211_update_connect_params()
10737 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); in nl80211_update_connect_params()
10739 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); in nl80211_update_connect_params()
10741 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); in nl80211_update_connect_params()
10744 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM]); in nl80211_update_connect_params()
10746 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); in nl80211_update_connect_params()
10748 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); in nl80211_update_connect_params()
10750 } else if (info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] || in nl80211_update_connect_params()
10751 info->attrs[NL80211_ATTR_FILS_ERP_REALM] || in nl80211_update_connect_params()
10752 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] || in nl80211_update_connect_params()
10753 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { in nl80211_update_connect_params()
10754 return -EINVAL; in nl80211_update_connect_params()
10757 if (info->attrs[NL80211_ATTR_AUTH_TYPE]) { in nl80211_update_connect_params()
10758 auth_type = nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]); in nl80211_update_connect_params()
10761 return -EINVAL; in nl80211_update_connect_params()
10765 return -EINVAL; in nl80211_update_connect_params()
10771 wdev_lock(dev->ieee80211_ptr); in nl80211_update_connect_params()
10772 if (!wdev->current_bss) in nl80211_update_connect_params()
10773 ret = -ENOLINK; in nl80211_update_connect_params()
10776 wdev_unlock(dev->ieee80211_ptr); in nl80211_update_connect_params()
10783 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_disconnect()
10784 struct net_device *dev = info->user_ptr[1]; in nl80211_disconnect()
10788 if (dev->ieee80211_ptr->conn_owner_nlportid && in nl80211_disconnect()
10789 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) in nl80211_disconnect()
10790 return -EPERM; in nl80211_disconnect()
10792 if (!info->attrs[NL80211_ATTR_REASON_CODE]) in nl80211_disconnect()
10795 reason = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); in nl80211_disconnect()
10798 return -EINVAL; in nl80211_disconnect()
10800 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_disconnect()
10801 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_disconnect()
10802 return -EOPNOTSUPP; in nl80211_disconnect()
10804 wdev_lock(dev->ieee80211_ptr); in nl80211_disconnect()
10806 wdev_unlock(dev->ieee80211_ptr); in nl80211_disconnect()
10812 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_wiphy_netns()
10816 if (info->attrs[NL80211_ATTR_PID]) { in nl80211_wiphy_netns()
10817 u32 pid = nla_get_u32(info->attrs[NL80211_ATTR_PID]); in nl80211_wiphy_netns()
10820 } else if (info->attrs[NL80211_ATTR_NETNS_FD]) { in nl80211_wiphy_netns()
10821 u32 fd = nla_get_u32(info->attrs[NL80211_ATTR_NETNS_FD]); in nl80211_wiphy_netns()
10825 return -EINVAL; in nl80211_wiphy_netns()
10834 if (!net_eq(wiphy_net(&rdev->wiphy), net)) in nl80211_wiphy_netns()
10843 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_setdel_pmksa()
10846 struct net_device *dev = info->user_ptr[1]; in nl80211_setdel_pmksa()
10851 if (!info->attrs[NL80211_ATTR_PMKID]) in nl80211_setdel_pmksa()
10852 return -EINVAL; in nl80211_setdel_pmksa()
10854 pmksa.pmkid = nla_data(info->attrs[NL80211_ATTR_PMKID]); in nl80211_setdel_pmksa()
10856 if (info->attrs[NL80211_ATTR_MAC]) { in nl80211_setdel_pmksa()
10857 pmksa.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_setdel_pmksa()
10858 } else if (info->attrs[NL80211_ATTR_SSID] && in nl80211_setdel_pmksa()
10859 info->attrs[NL80211_ATTR_FILS_CACHE_ID] && in nl80211_setdel_pmksa()
10860 (info->genlhdr->cmd == NL80211_CMD_DEL_PMKSA || in nl80211_setdel_pmksa()
10861 info->attrs[NL80211_ATTR_PMK])) { in nl80211_setdel_pmksa()
10862 pmksa.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); in nl80211_setdel_pmksa()
10863 pmksa.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); in nl80211_setdel_pmksa()
10865 nla_data(info->attrs[NL80211_ATTR_FILS_CACHE_ID]); in nl80211_setdel_pmksa()
10867 return -EINVAL; in nl80211_setdel_pmksa()
10869 if (info->attrs[NL80211_ATTR_PMK]) { in nl80211_setdel_pmksa()
10870 pmksa.pmk = nla_data(info->attrs[NL80211_ATTR_PMK]); in nl80211_setdel_pmksa()
10871 pmksa.pmk_len = nla_len(info->attrs[NL80211_ATTR_PMK]); in nl80211_setdel_pmksa()
10874 if (info->attrs[NL80211_ATTR_PMK_LIFETIME]) in nl80211_setdel_pmksa()
10876 nla_get_u32(info->attrs[NL80211_ATTR_PMK_LIFETIME]); in nl80211_setdel_pmksa()
10878 if (info->attrs[NL80211_ATTR_PMK_REAUTH_THRESHOLD]) in nl80211_setdel_pmksa()
10881 info->attrs[NL80211_ATTR_PMK_REAUTH_THRESHOLD]); in nl80211_setdel_pmksa()
10883 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_setdel_pmksa()
10884 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT && in nl80211_setdel_pmksa()
10885 !(dev->ieee80211_ptr->iftype == NL80211_IFTYPE_AP && in nl80211_setdel_pmksa()
10886 wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_setdel_pmksa()
10888 return -EOPNOTSUPP; in nl80211_setdel_pmksa()
10890 switch (info->genlhdr->cmd) { in nl80211_setdel_pmksa()
10892 rdev_ops = rdev->ops->set_pmksa; in nl80211_setdel_pmksa()
10895 rdev_ops = rdev->ops->del_pmksa; in nl80211_setdel_pmksa()
10903 return -EOPNOTSUPP; in nl80211_setdel_pmksa()
10905 return rdev_ops(&rdev->wiphy, dev, &pmksa); in nl80211_setdel_pmksa()
10910 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_flush_pmksa()
10911 struct net_device *dev = info->user_ptr[1]; in nl80211_flush_pmksa()
10913 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_flush_pmksa()
10914 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_flush_pmksa()
10915 return -EOPNOTSUPP; in nl80211_flush_pmksa()
10917 if (!rdev->ops->flush_pmksa) in nl80211_flush_pmksa()
10918 return -EOPNOTSUPP; in nl80211_flush_pmksa()
10925 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_tdls_mgmt()
10926 struct net_device *dev = info->user_ptr[1]; in nl80211_tdls_mgmt()
10933 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) || in nl80211_tdls_mgmt()
10934 !rdev->ops->tdls_mgmt) in nl80211_tdls_mgmt()
10935 return -EOPNOTSUPP; in nl80211_tdls_mgmt()
10937 if (!info->attrs[NL80211_ATTR_TDLS_ACTION] || in nl80211_tdls_mgmt()
10938 !info->attrs[NL80211_ATTR_STATUS_CODE] || in nl80211_tdls_mgmt()
10939 !info->attrs[NL80211_ATTR_TDLS_DIALOG_TOKEN] || in nl80211_tdls_mgmt()
10940 !info->attrs[NL80211_ATTR_IE] || in nl80211_tdls_mgmt()
10941 !info->attrs[NL80211_ATTR_MAC]) in nl80211_tdls_mgmt()
10942 return -EINVAL; in nl80211_tdls_mgmt()
10944 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_tdls_mgmt()
10945 action_code = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_ACTION]); in nl80211_tdls_mgmt()
10946 status_code = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]); in nl80211_tdls_mgmt()
10947 dialog_token = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_DIALOG_TOKEN]); in nl80211_tdls_mgmt()
10948 initiator = nla_get_flag(info->attrs[NL80211_ATTR_TDLS_INITIATOR]); in nl80211_tdls_mgmt()
10949 if (info->attrs[NL80211_ATTR_TDLS_PEER_CAPABILITY]) in nl80211_tdls_mgmt()
10951 nla_get_u32(info->attrs[NL80211_ATTR_TDLS_PEER_CAPABILITY]); in nl80211_tdls_mgmt()
10956 nla_data(info->attrs[NL80211_ATTR_IE]), in nl80211_tdls_mgmt()
10957 nla_len(info->attrs[NL80211_ATTR_IE])); in nl80211_tdls_mgmt()
10962 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_tdls_oper()
10963 struct net_device *dev = info->user_ptr[1]; in nl80211_tdls_oper()
10967 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) || in nl80211_tdls_oper()
10968 !rdev->ops->tdls_oper) in nl80211_tdls_oper()
10969 return -EOPNOTSUPP; in nl80211_tdls_oper()
10971 if (!info->attrs[NL80211_ATTR_TDLS_OPERATION] || in nl80211_tdls_oper()
10972 !info->attrs[NL80211_ATTR_MAC]) in nl80211_tdls_oper()
10973 return -EINVAL; in nl80211_tdls_oper()
10975 operation = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_OPERATION]); in nl80211_tdls_oper()
10976 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_tdls_oper()
10984 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_remain_on_channel()
10985 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_remain_on_channel()
10994 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ] || in nl80211_remain_on_channel()
10995 !info->attrs[NL80211_ATTR_DURATION]) in nl80211_remain_on_channel()
10996 return -EINVAL; in nl80211_remain_on_channel()
10998 duration = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]); in nl80211_remain_on_channel()
11000 if (!rdev->ops->remain_on_channel || in nl80211_remain_on_channel()
11001 !(rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL)) in nl80211_remain_on_channel()
11002 return -EOPNOTSUPP; in nl80211_remain_on_channel()
11009 duration > rdev->wiphy.max_remain_on_channel_duration) in nl80211_remain_on_channel()
11010 return -EINVAL; in nl80211_remain_on_channel()
11018 !cfg80211_chandef_identical(&wdev->chandef, &chandef)) { in nl80211_remain_on_channel()
11019 compat_chandef = cfg80211_chandef_compatible(&wdev->chandef, in nl80211_remain_on_channel()
11023 return -EBUSY; in nl80211_remain_on_channel()
11030 return -ENOMEM; in nl80211_remain_on_channel()
11032 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_remain_on_channel()
11035 err = -ENOBUFS; in nl80211_remain_on_channel()
11054 err = -ENOBUFS; in nl80211_remain_on_channel()
11063 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_cancel_remain_on_channel()
11064 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_cancel_remain_on_channel()
11067 if (!info->attrs[NL80211_ATTR_COOKIE]) in nl80211_cancel_remain_on_channel()
11068 return -EINVAL; in nl80211_cancel_remain_on_channel()
11070 if (!rdev->ops->cancel_remain_on_channel) in nl80211_cancel_remain_on_channel()
11071 return -EOPNOTSUPP; in nl80211_cancel_remain_on_channel()
11073 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); in nl80211_cancel_remain_on_channel()
11082 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_tx_bitrate_mask()
11083 struct net_device *dev = info->user_ptr[1]; in nl80211_set_tx_bitrate_mask()
11086 if (!rdev->ops->set_bitrate_mask) in nl80211_set_tx_bitrate_mask()
11087 return -EOPNOTSUPP; in nl80211_set_tx_bitrate_mask()
11089 err = nl80211_parse_tx_bitrate_mask(info, info->attrs, in nl80211_set_tx_bitrate_mask()
11100 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_register_mgmt()
11101 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_register_mgmt()
11104 if (!info->attrs[NL80211_ATTR_FRAME_MATCH]) in nl80211_register_mgmt()
11105 return -EINVAL; in nl80211_register_mgmt()
11107 if (info->attrs[NL80211_ATTR_FRAME_TYPE]) in nl80211_register_mgmt()
11108 frame_type = nla_get_u16(info->attrs[NL80211_ATTR_FRAME_TYPE]); in nl80211_register_mgmt()
11110 switch (wdev->iftype) { in nl80211_register_mgmt()
11122 return -EOPNOTSUPP; in nl80211_register_mgmt()
11126 if (!rdev->ops->mgmt_tx) in nl80211_register_mgmt()
11127 return -EOPNOTSUPP; in nl80211_register_mgmt()
11129 if (info->attrs[NL80211_ATTR_RECEIVE_MULTICAST] && in nl80211_register_mgmt()
11130 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_register_mgmt()
11134 return -EOPNOTSUPP; in nl80211_register_mgmt()
11137 return cfg80211_mlme_register_mgmt(wdev, info->snd_portid, frame_type, in nl80211_register_mgmt()
11138 nla_data(info->attrs[NL80211_ATTR_FRAME_MATCH]), in nl80211_register_mgmt()
11139 nla_len(info->attrs[NL80211_ATTR_FRAME_MATCH]), in nl80211_register_mgmt()
11140 info->attrs[NL80211_ATTR_RECEIVE_MULTICAST], in nl80211_register_mgmt()
11141 info->extack); in nl80211_register_mgmt()
11146 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_tx_mgmt()
11147 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_tx_mgmt()
11155 info->attrs[NL80211_ATTR_DONT_WAIT_FOR_ACK], in nl80211_tx_mgmt()
11158 if (!info->attrs[NL80211_ATTR_FRAME]) in nl80211_tx_mgmt()
11159 return -EINVAL; in nl80211_tx_mgmt()
11161 if (!rdev->ops->mgmt_tx) in nl80211_tx_mgmt()
11162 return -EOPNOTSUPP; in nl80211_tx_mgmt()
11164 switch (wdev->iftype) { in nl80211_tx_mgmt()
11166 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ]) in nl80211_tx_mgmt()
11167 return -EINVAL; in nl80211_tx_mgmt()
11178 return -EOPNOTSUPP; in nl80211_tx_mgmt()
11181 if (info->attrs[NL80211_ATTR_DURATION]) { in nl80211_tx_mgmt()
11182 if (!(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX)) in nl80211_tx_mgmt()
11183 return -EINVAL; in nl80211_tx_mgmt()
11184 params.wait = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]); in nl80211_tx_mgmt()
11191 params.wait > rdev->wiphy.max_remain_on_channel_duration) in nl80211_tx_mgmt()
11192 return -EINVAL; in nl80211_tx_mgmt()
11195 params.offchan = info->attrs[NL80211_ATTR_OFFCHANNEL_TX_OK]; in nl80211_tx_mgmt()
11197 if (params.offchan && !(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX)) in nl80211_tx_mgmt()
11198 return -EINVAL; in nl80211_tx_mgmt()
11200 params.no_cck = nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]); in nl80211_tx_mgmt()
11206 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { in nl80211_tx_mgmt()
11213 return -EINVAL; in nl80211_tx_mgmt()
11218 return -EBUSY; in nl80211_tx_mgmt()
11222 params.buf = nla_data(info->attrs[NL80211_ATTR_FRAME]); in nl80211_tx_mgmt()
11223 params.len = nla_len(info->attrs[NL80211_ATTR_FRAME]); in nl80211_tx_mgmt()
11225 if (info->attrs[NL80211_ATTR_CSA_C_OFFSETS_TX]) { in nl80211_tx_mgmt()
11226 int len = nla_len(info->attrs[NL80211_ATTR_CSA_C_OFFSETS_TX]); in nl80211_tx_mgmt()
11230 return -EINVAL; in nl80211_tx_mgmt()
11234 nla_data(info->attrs[NL80211_ATTR_CSA_C_OFFSETS_TX]); in nl80211_tx_mgmt()
11239 return -EINVAL; in nl80211_tx_mgmt()
11246 return -ENOMEM; in nl80211_tx_mgmt()
11248 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_tx_mgmt()
11251 err = -ENOBUFS; in nl80211_tx_mgmt()
11273 err = -ENOBUFS; in nl80211_tx_mgmt()
11281 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_tx_mgmt_cancel_wait()
11282 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_tx_mgmt_cancel_wait()
11285 if (!info->attrs[NL80211_ATTR_COOKIE]) in nl80211_tx_mgmt_cancel_wait()
11286 return -EINVAL; in nl80211_tx_mgmt_cancel_wait()
11288 if (!rdev->ops->mgmt_tx_cancel_wait) in nl80211_tx_mgmt_cancel_wait()
11289 return -EOPNOTSUPP; in nl80211_tx_mgmt_cancel_wait()
11291 switch (wdev->iftype) { in nl80211_tx_mgmt_cancel_wait()
11302 return -EOPNOTSUPP; in nl80211_tx_mgmt_cancel_wait()
11305 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); in nl80211_tx_mgmt_cancel_wait()
11312 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_power_save()
11314 struct net_device *dev = info->user_ptr[1]; in nl80211_set_power_save()
11319 if (!info->attrs[NL80211_ATTR_PS_STATE]) in nl80211_set_power_save()
11320 return -EINVAL; in nl80211_set_power_save()
11322 ps_state = nla_get_u32(info->attrs[NL80211_ATTR_PS_STATE]); in nl80211_set_power_save()
11324 wdev = dev->ieee80211_ptr; in nl80211_set_power_save()
11326 if (!rdev->ops->set_power_mgmt) in nl80211_set_power_save()
11327 return -EOPNOTSUPP; in nl80211_set_power_save()
11331 if (state == wdev->ps) in nl80211_set_power_save()
11334 err = rdev_set_power_mgmt(rdev, dev, state, wdev->ps_timeout); in nl80211_set_power_save()
11336 wdev->ps = state; in nl80211_set_power_save()
11342 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_power_save()
11345 struct net_device *dev = info->user_ptr[1]; in nl80211_get_power_save()
11350 wdev = dev->ieee80211_ptr; in nl80211_get_power_save()
11352 if (!rdev->ops->set_power_mgmt) in nl80211_get_power_save()
11353 return -EOPNOTSUPP; in nl80211_get_power_save()
11357 return -ENOMEM; in nl80211_get_power_save()
11359 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_power_save()
11362 err = -ENOBUFS; in nl80211_get_power_save()
11366 if (wdev->ps) in nl80211_get_power_save()
11378 err = -ENOBUFS; in nl80211_get_power_save()
11398 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_cqm_txe()
11399 struct net_device *dev = info->user_ptr[1]; in nl80211_set_cqm_txe()
11400 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_cqm_txe()
11403 return -EINVAL; in nl80211_set_cqm_txe()
11405 if (!rdev->ops->set_cqm_txe_config) in nl80211_set_cqm_txe()
11406 return -EOPNOTSUPP; in nl80211_set_cqm_txe()
11408 if (wdev->iftype != NL80211_IFTYPE_STATION && in nl80211_set_cqm_txe()
11409 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_set_cqm_txe()
11410 return -EOPNOTSUPP; in nl80211_set_cqm_txe()
11418 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_cqm_rssi_update()
11425 if (!wdev->cqm_config) in cfg80211_cqm_rssi_update()
11434 if (!wdev->cqm_config->last_rssi_event_value && wdev->current_bss && in cfg80211_cqm_rssi_update()
11435 rdev->ops->get_station) { in cfg80211_cqm_rssi_update()
11439 mac_addr = wdev->current_bss->pub.bssid; in cfg80211_cqm_rssi_update()
11447 wdev->cqm_config->last_rssi_event_value = in cfg80211_cqm_rssi_update()
11451 last = wdev->cqm_config->last_rssi_event_value; in cfg80211_cqm_rssi_update()
11452 hyst = wdev->cqm_config->rssi_hyst; in cfg80211_cqm_rssi_update()
11453 n = wdev->cqm_config->n_rssi_thresholds; in cfg80211_cqm_rssi_update()
11457 if (last < wdev->cqm_config->rssi_thresholds[i]) in cfg80211_cqm_rssi_update()
11461 low_index = i - 1; in cfg80211_cqm_rssi_update()
11464 low = wdev->cqm_config->rssi_thresholds[low_index] - hyst; in cfg80211_cqm_rssi_update()
11470 high = wdev->cqm_config->rssi_thresholds[i] + hyst - 1; in cfg80211_cqm_rssi_update()
11482 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_cqm_rssi()
11483 struct net_device *dev = info->user_ptr[1]; in nl80211_set_cqm_rssi()
11484 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_cqm_rssi()
11491 return -EINVAL; in nl80211_set_cqm_rssi()
11496 if (wdev->iftype != NL80211_IFTYPE_STATION && in nl80211_set_cqm_rssi()
11497 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_set_cqm_rssi()
11498 return -EOPNOTSUPP; in nl80211_set_cqm_rssi()
11504 if (n_thresholds <= 1 && rdev->ops->set_cqm_rssi_config) { in nl80211_set_cqm_rssi()
11512 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_set_cqm_rssi()
11514 return -EOPNOTSUPP; in nl80211_set_cqm_rssi()
11526 err = -ENOMEM; in nl80211_set_cqm_rssi()
11530 cqm_config->rssi_hyst = hysteresis; in nl80211_set_cqm_rssi()
11531 cqm_config->n_rssi_thresholds = n_thresholds; in nl80211_set_cqm_rssi()
11532 memcpy(cqm_config->rssi_thresholds, thresholds, in nl80211_set_cqm_rssi()
11535 wdev->cqm_config = cqm_config; in nl80211_set_cqm_rssi()
11552 cqm = info->attrs[NL80211_ATTR_CQM]; in nl80211_set_cqm()
11554 return -EINVAL; in nl80211_set_cqm()
11558 info->extack); in nl80211_set_cqm()
11570 return -EINVAL; in nl80211_set_cqm()
11586 return -EINVAL; in nl80211_set_cqm()
11591 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_join_ocb()
11592 struct net_device *dev = info->user_ptr[1]; in nl80211_join_ocb()
11605 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_leave_ocb()
11606 struct net_device *dev = info->user_ptr[1]; in nl80211_leave_ocb()
11613 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_join_mesh()
11614 struct net_device *dev = info->user_ptr[1]; in nl80211_join_mesh()
11623 if (info->attrs[NL80211_ATTR_MESH_CONFIG]) { in nl80211_join_mesh()
11630 if (!info->attrs[NL80211_ATTR_MESH_ID] || in nl80211_join_mesh()
11631 !nla_len(info->attrs[NL80211_ATTR_MESH_ID])) in nl80211_join_mesh()
11632 return -EINVAL; in nl80211_join_mesh()
11634 setup.mesh_id = nla_data(info->attrs[NL80211_ATTR_MESH_ID]); in nl80211_join_mesh()
11635 setup.mesh_id_len = nla_len(info->attrs[NL80211_ATTR_MESH_ID]); in nl80211_join_mesh()
11637 if (info->attrs[NL80211_ATTR_MCAST_RATE] && in nl80211_join_mesh()
11639 nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]))) in nl80211_join_mesh()
11640 return -EINVAL; in nl80211_join_mesh()
11642 if (info->attrs[NL80211_ATTR_BEACON_INTERVAL]) { in nl80211_join_mesh()
11644 nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]); in nl80211_join_mesh()
11653 if (info->attrs[NL80211_ATTR_DTIM_PERIOD]) { in nl80211_join_mesh()
11655 nla_get_u32(info->attrs[NL80211_ATTR_DTIM_PERIOD]); in nl80211_join_mesh()
11657 return -EINVAL; in nl80211_join_mesh()
11660 if (info->attrs[NL80211_ATTR_MESH_SETUP]) { in nl80211_join_mesh()
11670 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { in nl80211_join_mesh()
11679 if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) { in nl80211_join_mesh()
11680 u8 *rates = nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); in nl80211_join_mesh()
11682 nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); in nl80211_join_mesh()
11686 return -EINVAL; in nl80211_join_mesh()
11688 sband = rdev->wiphy.bands[setup.chandef.chan->band]; in nl80211_join_mesh()
11696 if (info->attrs[NL80211_ATTR_TX_RATES]) { in nl80211_join_mesh()
11697 err = nl80211_parse_tx_bitrate_mask(info, info->attrs, in nl80211_join_mesh()
11705 return -EINVAL; in nl80211_join_mesh()
11707 err = validate_beacon_tx_rate(rdev, setup.chandef.chan->band, in nl80211_join_mesh()
11714 nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS]); in nl80211_join_mesh()
11716 if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) { in nl80211_join_mesh()
11725 wdev_lock(dev->ieee80211_ptr); in nl80211_join_mesh()
11727 if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) in nl80211_join_mesh()
11728 dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid; in nl80211_join_mesh()
11729 wdev_unlock(dev->ieee80211_ptr); in nl80211_join_mesh()
11736 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_leave_mesh()
11737 struct net_device *dev = info->user_ptr[1]; in nl80211_leave_mesh()
11746 struct cfg80211_wowlan *wowlan = rdev->wiphy.wowlan_config; in nl80211_send_wowlan_patterns()
11750 if (!wowlan->n_patterns) in nl80211_send_wowlan_patterns()
11755 return -ENOBUFS; in nl80211_send_wowlan_patterns()
11757 for (i = 0; i < wowlan->n_patterns; i++) { in nl80211_send_wowlan_patterns()
11760 return -ENOBUFS; in nl80211_send_wowlan_patterns()
11761 pat_len = wowlan->patterns[i].pattern_len; in nl80211_send_wowlan_patterns()
11763 wowlan->patterns[i].mask) || in nl80211_send_wowlan_patterns()
11765 wowlan->patterns[i].pattern) || in nl80211_send_wowlan_patterns()
11767 wowlan->patterns[i].pkt_offset)) in nl80211_send_wowlan_patterns()
11768 return -ENOBUFS; in nl80211_send_wowlan_patterns()
11787 return -ENOBUFS; in nl80211_send_wowlan_tcp()
11789 if (nla_put_in_addr(msg, NL80211_WOWLAN_TCP_SRC_IPV4, tcp->src) || in nl80211_send_wowlan_tcp()
11790 nla_put_in_addr(msg, NL80211_WOWLAN_TCP_DST_IPV4, tcp->dst) || in nl80211_send_wowlan_tcp()
11791 nla_put(msg, NL80211_WOWLAN_TCP_DST_MAC, ETH_ALEN, tcp->dst_mac) || in nl80211_send_wowlan_tcp()
11792 nla_put_u16(msg, NL80211_WOWLAN_TCP_SRC_PORT, tcp->src_port) || in nl80211_send_wowlan_tcp()
11793 nla_put_u16(msg, NL80211_WOWLAN_TCP_DST_PORT, tcp->dst_port) || in nl80211_send_wowlan_tcp()
11795 tcp->payload_len, tcp->payload) || in nl80211_send_wowlan_tcp()
11797 tcp->data_interval) || in nl80211_send_wowlan_tcp()
11799 tcp->wake_len, tcp->wake_data) || in nl80211_send_wowlan_tcp()
11801 DIV_ROUND_UP(tcp->wake_len, 8), tcp->wake_mask)) in nl80211_send_wowlan_tcp()
11802 return -ENOBUFS; in nl80211_send_wowlan_tcp()
11804 if (tcp->payload_seq.len && in nl80211_send_wowlan_tcp()
11806 sizeof(tcp->payload_seq), &tcp->payload_seq)) in nl80211_send_wowlan_tcp()
11807 return -ENOBUFS; in nl80211_send_wowlan_tcp()
11809 if (tcp->payload_tok.len && in nl80211_send_wowlan_tcp()
11811 sizeof(tcp->payload_tok) + tcp->tokens_size, in nl80211_send_wowlan_tcp()
11812 &tcp->payload_tok)) in nl80211_send_wowlan_tcp()
11813 return -ENOBUFS; in nl80211_send_wowlan_tcp()
11831 return -ENOBUFS; in nl80211_send_wowlan_nd()
11833 if (req->n_scan_plans == 1 && in nl80211_send_wowlan_nd()
11835 req->scan_plans[0].interval * 1000)) in nl80211_send_wowlan_nd()
11836 return -ENOBUFS; in nl80211_send_wowlan_nd()
11838 if (nla_put_u32(msg, NL80211_ATTR_SCHED_SCAN_DELAY, req->delay)) in nl80211_send_wowlan_nd()
11839 return -ENOBUFS; in nl80211_send_wowlan_nd()
11841 if (req->relative_rssi_set) { in nl80211_send_wowlan_nd()
11845 req->relative_rssi)) in nl80211_send_wowlan_nd()
11846 return -ENOBUFS; in nl80211_send_wowlan_nd()
11848 rssi_adjust.band = req->rssi_adjust.band; in nl80211_send_wowlan_nd()
11849 rssi_adjust.delta = req->rssi_adjust.delta; in nl80211_send_wowlan_nd()
11852 return -ENOBUFS; in nl80211_send_wowlan_nd()
11857 return -ENOBUFS; in nl80211_send_wowlan_nd()
11859 for (i = 0; i < req->n_channels; i++) { in nl80211_send_wowlan_nd()
11860 if (nla_put_u32(msg, i, req->channels[i]->center_freq)) in nl80211_send_wowlan_nd()
11861 return -ENOBUFS; in nl80211_send_wowlan_nd()
11866 if (req->n_match_sets) { in nl80211_send_wowlan_nd()
11870 return -ENOBUFS; in nl80211_send_wowlan_nd()
11872 for (i = 0; i < req->n_match_sets; i++) { in nl80211_send_wowlan_nd()
11875 return -ENOBUFS; in nl80211_send_wowlan_nd()
11878 req->match_sets[i].ssid.ssid_len, in nl80211_send_wowlan_nd()
11879 req->match_sets[i].ssid.ssid)) in nl80211_send_wowlan_nd()
11880 return -ENOBUFS; in nl80211_send_wowlan_nd()
11888 return -ENOBUFS; in nl80211_send_wowlan_nd()
11890 for (i = 0; i < req->n_scan_plans; i++) { in nl80211_send_wowlan_nd()
11893 return -ENOBUFS; in nl80211_send_wowlan_nd()
11896 req->scan_plans[i].interval) || in nl80211_send_wowlan_nd()
11897 (req->scan_plans[i].iterations && in nl80211_send_wowlan_nd()
11899 req->scan_plans[i].iterations))) in nl80211_send_wowlan_nd()
11900 return -ENOBUFS; in nl80211_send_wowlan_nd()
11912 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_wowlan()
11917 if (!rdev->wiphy.wowlan) in nl80211_get_wowlan()
11918 return -EOPNOTSUPP; in nl80211_get_wowlan()
11920 if (rdev->wiphy.wowlan_config && rdev->wiphy.wowlan_config->tcp) { in nl80211_get_wowlan()
11922 size += rdev->wiphy.wowlan_config->tcp->tokens_size + in nl80211_get_wowlan()
11923 rdev->wiphy.wowlan_config->tcp->payload_len + in nl80211_get_wowlan()
11924 rdev->wiphy.wowlan_config->tcp->wake_len + in nl80211_get_wowlan()
11925 rdev->wiphy.wowlan_config->tcp->wake_len / 8; in nl80211_get_wowlan()
11930 return -ENOMEM; in nl80211_get_wowlan()
11932 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_wowlan()
11937 if (rdev->wiphy.wowlan_config) { in nl80211_get_wowlan()
11945 if ((rdev->wiphy.wowlan_config->any && in nl80211_get_wowlan()
11947 (rdev->wiphy.wowlan_config->disconnect && in nl80211_get_wowlan()
11949 (rdev->wiphy.wowlan_config->magic_pkt && in nl80211_get_wowlan()
11951 (rdev->wiphy.wowlan_config->gtk_rekey_failure && in nl80211_get_wowlan()
11953 (rdev->wiphy.wowlan_config->eap_identity_req && in nl80211_get_wowlan()
11955 (rdev->wiphy.wowlan_config->four_way_handshake && in nl80211_get_wowlan()
11957 (rdev->wiphy.wowlan_config->rfkill_release && in nl80211_get_wowlan()
11965 rdev->wiphy.wowlan_config->tcp)) in nl80211_get_wowlan()
11970 rdev->wiphy.wowlan_config->nd_config)) in nl80211_get_wowlan()
11981 return -ENOBUFS; in nl80211_get_wowlan()
11986 struct cfg80211_wowlan *trig) in nl80211_parse_wowlan_tcp() argument
11996 if (!rdev->wiphy.wowlan->tcp) in nl80211_parse_wowlan_tcp()
11997 return -EINVAL; in nl80211_parse_wowlan_tcp()
12012 return -EINVAL; in nl80211_parse_wowlan_tcp()
12015 if (data_size > rdev->wiphy.wowlan->tcp->data_payload_max) in nl80211_parse_wowlan_tcp()
12016 return -EINVAL; in nl80211_parse_wowlan_tcp()
12019 rdev->wiphy.wowlan->tcp->data_interval_max || in nl80211_parse_wowlan_tcp()
12021 return -EINVAL; in nl80211_parse_wowlan_tcp()
12024 if (wake_size > rdev->wiphy.wowlan->tcp->wake_payload_max) in nl80211_parse_wowlan_tcp()
12025 return -EINVAL; in nl80211_parse_wowlan_tcp()
12029 return -EINVAL; in nl80211_parse_wowlan_tcp()
12035 tokens_size = tokln - sizeof(*tok); in nl80211_parse_wowlan_tcp()
12037 if (!tok->len || tokens_size % tok->len) in nl80211_parse_wowlan_tcp()
12038 return -EINVAL; in nl80211_parse_wowlan_tcp()
12039 if (!rdev->wiphy.wowlan->tcp->tok) in nl80211_parse_wowlan_tcp()
12040 return -EINVAL; in nl80211_parse_wowlan_tcp()
12041 if (tok->len > rdev->wiphy.wowlan->tcp->tok->max_len) in nl80211_parse_wowlan_tcp()
12042 return -EINVAL; in nl80211_parse_wowlan_tcp()
12043 if (tok->len < rdev->wiphy.wowlan->tcp->tok->min_len) in nl80211_parse_wowlan_tcp()
12044 return -EINVAL; in nl80211_parse_wowlan_tcp()
12045 if (tokens_size > rdev->wiphy.wowlan->tcp->tok->bufsize) in nl80211_parse_wowlan_tcp()
12046 return -EINVAL; in nl80211_parse_wowlan_tcp()
12047 if (tok->offset + tok->len > data_size) in nl80211_parse_wowlan_tcp()
12048 return -EINVAL; in nl80211_parse_wowlan_tcp()
12053 if (!rdev->wiphy.wowlan->tcp->seq) in nl80211_parse_wowlan_tcp()
12054 return -EINVAL; in nl80211_parse_wowlan_tcp()
12055 if (seq->len == 0 || seq->len > 4) in nl80211_parse_wowlan_tcp()
12056 return -EINVAL; in nl80211_parse_wowlan_tcp()
12057 if (seq->len + seq->offset > data_size) in nl80211_parse_wowlan_tcp()
12058 return -EINVAL; in nl80211_parse_wowlan_tcp()
12068 return -ENOMEM; in nl80211_parse_wowlan_tcp()
12069 cfg->src = nla_get_in_addr(tb[NL80211_WOWLAN_TCP_SRC_IPV4]); in nl80211_parse_wowlan_tcp()
12070 cfg->dst = nla_get_in_addr(tb[NL80211_WOWLAN_TCP_DST_IPV4]); in nl80211_parse_wowlan_tcp()
12071 memcpy(cfg->dst_mac, nla_data(tb[NL80211_WOWLAN_TCP_DST_MAC]), in nl80211_parse_wowlan_tcp()
12079 err = __sock_create(wiphy_net(&rdev->wiphy), PF_INET, SOCK_STREAM, in nl80211_parse_wowlan_tcp()
12080 IPPROTO_TCP, &cfg->sock, 1); in nl80211_parse_wowlan_tcp()
12085 if (inet_csk_get_port(cfg->sock->sk, port)) { in nl80211_parse_wowlan_tcp()
12086 sock_release(cfg->sock); in nl80211_parse_wowlan_tcp()
12088 return -EADDRINUSE; in nl80211_parse_wowlan_tcp()
12090 cfg->src_port = inet_sk(cfg->sock->sk)->inet_num; in nl80211_parse_wowlan_tcp()
12094 return -EINVAL; in nl80211_parse_wowlan_tcp()
12096 cfg->src_port = port; in nl80211_parse_wowlan_tcp()
12099 cfg->dst_port = nla_get_u16(tb[NL80211_WOWLAN_TCP_DST_PORT]); in nl80211_parse_wowlan_tcp()
12100 cfg->payload_len = data_size; in nl80211_parse_wowlan_tcp()
12101 cfg->payload = (u8 *)cfg + sizeof(*cfg) + tokens_size; in nl80211_parse_wowlan_tcp()
12102 memcpy((void *)cfg->payload, in nl80211_parse_wowlan_tcp()
12106 cfg->payload_seq = *seq; in nl80211_parse_wowlan_tcp()
12107 cfg->data_interval = nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]); in nl80211_parse_wowlan_tcp()
12108 cfg->wake_len = wake_size; in nl80211_parse_wowlan_tcp()
12109 cfg->wake_data = (u8 *)cfg + sizeof(*cfg) + tokens_size + data_size; in nl80211_parse_wowlan_tcp()
12110 memcpy((void *)cfg->wake_data, in nl80211_parse_wowlan_tcp()
12113 cfg->wake_mask = (u8 *)cfg + sizeof(*cfg) + tokens_size + in nl80211_parse_wowlan_tcp()
12115 memcpy((void *)cfg->wake_mask, in nl80211_parse_wowlan_tcp()
12119 cfg->tokens_size = tokens_size; in nl80211_parse_wowlan_tcp()
12120 memcpy(&cfg->payload_tok, tok, sizeof(*tok) + tokens_size); in nl80211_parse_wowlan_tcp()
12123 trig->tcp = cfg; in nl80211_parse_wowlan_tcp()
12131 struct cfg80211_wowlan *trig) in nl80211_parse_wowlan_nd() argument
12138 return -ENOMEM; in nl80211_parse_wowlan_nd()
12140 if (!(wowlan->flags & WIPHY_WOWLAN_NET_DETECT)) { in nl80211_parse_wowlan_nd()
12141 err = -EOPNOTSUPP; in nl80211_parse_wowlan_nd()
12150 trig->nd_config = nl80211_parse_sched_scan(&rdev->wiphy, NULL, tb, in nl80211_parse_wowlan_nd()
12151 wowlan->max_nd_match_sets); in nl80211_parse_wowlan_nd()
12152 err = PTR_ERR_OR_ZERO(trig->nd_config); in nl80211_parse_wowlan_nd()
12154 trig->nd_config = NULL; in nl80211_parse_wowlan_nd()
12163 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_wowlan()
12167 const struct wiphy_wowlan_support *wowlan = rdev->wiphy.wowlan; in nl80211_set_wowlan()
12169 bool prev_enabled = rdev->wiphy.wowlan_config; in nl80211_set_wowlan()
12173 return -EOPNOTSUPP; in nl80211_set_wowlan()
12175 if (!info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS]) { in nl80211_set_wowlan()
12177 rdev->wiphy.wowlan_config = NULL; in nl80211_set_wowlan()
12182 info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS], in nl80211_set_wowlan()
12183 nl80211_wowlan_policy, info->extack); in nl80211_set_wowlan()
12188 if (!(wowlan->flags & WIPHY_WOWLAN_ANY)) in nl80211_set_wowlan()
12189 return -EINVAL; in nl80211_set_wowlan()
12194 if (!(wowlan->flags & WIPHY_WOWLAN_DISCONNECT)) in nl80211_set_wowlan()
12195 return -EINVAL; in nl80211_set_wowlan()
12201 if (!(wowlan->flags & WIPHY_WOWLAN_MAGIC_PKT)) in nl80211_set_wowlan()
12202 return -EINVAL; in nl80211_set_wowlan()
12208 return -EINVAL; in nl80211_set_wowlan()
12211 if (!(wowlan->flags & WIPHY_WOWLAN_GTK_REKEY_FAILURE)) in nl80211_set_wowlan()
12212 return -EINVAL; in nl80211_set_wowlan()
12218 if (!(wowlan->flags & WIPHY_WOWLAN_EAP_IDENTITY_REQ)) in nl80211_set_wowlan()
12219 return -EINVAL; in nl80211_set_wowlan()
12225 if (!(wowlan->flags & WIPHY_WOWLAN_4WAY_HANDSHAKE)) in nl80211_set_wowlan()
12226 return -EINVAL; in nl80211_set_wowlan()
12232 if (!(wowlan->flags & WIPHY_WOWLAN_RFKILL_RELEASE)) in nl80211_set_wowlan()
12233 return -EINVAL; in nl80211_set_wowlan()
12249 if (n_patterns > wowlan->n_patterns) in nl80211_set_wowlan()
12250 return -EINVAL; in nl80211_set_wowlan()
12256 return -ENOMEM; in nl80211_set_wowlan()
12269 info->extack); in nl80211_set_wowlan()
12273 err = -EINVAL; in nl80211_set_wowlan()
12281 if (pat_len > wowlan->pattern_max_len || in nl80211_set_wowlan()
12282 pat_len < wowlan->pattern_min_len) in nl80211_set_wowlan()
12290 if (pkt_offset > wowlan->max_pkt_offset) in nl80211_set_wowlan()
12296 err = -ENOMEM; in nl80211_set_wowlan()
12337 err = -EINVAL; in nl80211_set_wowlan()
12343 err = -ENOMEM; in nl80211_set_wowlan()
12347 rdev->wiphy.wowlan_config = ntrig; in nl80211_set_wowlan()
12350 if (rdev->ops->set_wakeup && in nl80211_set_wowlan()
12351 prev_enabled != !!rdev->wiphy.wowlan_config) in nl80211_set_wowlan()
12352 rdev_set_wakeup(rdev, rdev->wiphy.wowlan_config); in nl80211_set_wowlan()
12359 if (new_triggers.tcp && new_triggers.tcp->sock) in nl80211_set_wowlan()
12360 sock_release(new_triggers.tcp->sock); in nl80211_set_wowlan()
12374 if (!rdev->coalesce->n_rules) in nl80211_send_coalesce_rules()
12379 return -ENOBUFS; in nl80211_send_coalesce_rules()
12381 for (i = 0; i < rdev->coalesce->n_rules; i++) { in nl80211_send_coalesce_rules()
12384 return -ENOBUFS; in nl80211_send_coalesce_rules()
12386 rule = &rdev->coalesce->rules[i]; in nl80211_send_coalesce_rules()
12388 rule->delay)) in nl80211_send_coalesce_rules()
12389 return -ENOBUFS; in nl80211_send_coalesce_rules()
12392 rule->condition)) in nl80211_send_coalesce_rules()
12393 return -ENOBUFS; in nl80211_send_coalesce_rules()
12398 return -ENOBUFS; in nl80211_send_coalesce_rules()
12400 for (j = 0; j < rule->n_patterns; j++) { in nl80211_send_coalesce_rules()
12403 return -ENOBUFS; in nl80211_send_coalesce_rules()
12404 pat_len = rule->patterns[j].pattern_len; in nl80211_send_coalesce_rules()
12407 rule->patterns[j].mask) || in nl80211_send_coalesce_rules()
12409 rule->patterns[j].pattern) || in nl80211_send_coalesce_rules()
12411 rule->patterns[j].pkt_offset)) in nl80211_send_coalesce_rules()
12412 return -ENOBUFS; in nl80211_send_coalesce_rules()
12425 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_coalesce()
12429 if (!rdev->wiphy.coalesce) in nl80211_get_coalesce()
12430 return -EOPNOTSUPP; in nl80211_get_coalesce()
12434 return -ENOMEM; in nl80211_get_coalesce()
12436 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_coalesce()
12441 if (rdev->coalesce && nl80211_send_coalesce_rules(msg, rdev)) in nl80211_get_coalesce()
12449 return -ENOBUFS; in nl80211_get_coalesce()
12454 struct cfg80211_coalesce *coalesce = rdev->coalesce; in cfg80211_rdev_free_coalesce()
12461 for (i = 0; i < coalesce->n_rules; i++) { in cfg80211_rdev_free_coalesce()
12462 rule = &coalesce->rules[i]; in cfg80211_rdev_free_coalesce()
12463 for (j = 0; j < rule->n_patterns; j++) in cfg80211_rdev_free_coalesce()
12464 kfree(rule->patterns[j].mask); in cfg80211_rdev_free_coalesce()
12465 kfree(rule->patterns); in cfg80211_rdev_free_coalesce()
12467 kfree(coalesce->rules); in cfg80211_rdev_free_coalesce()
12469 rdev->coalesce = NULL; in cfg80211_rdev_free_coalesce()
12477 const struct wiphy_coalesce_support *coalesce = rdev->wiphy.coalesce; in nl80211_parse_coalesce_rule()
12488 new_rule->delay = in nl80211_parse_coalesce_rule()
12490 if (new_rule->delay > coalesce->max_delay) in nl80211_parse_coalesce_rule()
12491 return -EINVAL; in nl80211_parse_coalesce_rule()
12494 new_rule->condition = in nl80211_parse_coalesce_rule()
12498 return -EINVAL; in nl80211_parse_coalesce_rule()
12503 if (n_patterns > coalesce->n_patterns) in nl80211_parse_coalesce_rule()
12504 return -EINVAL; in nl80211_parse_coalesce_rule()
12506 new_rule->patterns = kcalloc(n_patterns, sizeof(new_rule->patterns[0]), in nl80211_parse_coalesce_rule()
12508 if (!new_rule->patterns) in nl80211_parse_coalesce_rule()
12509 return -ENOMEM; in nl80211_parse_coalesce_rule()
12511 new_rule->n_patterns = n_patterns; in nl80211_parse_coalesce_rule()
12527 return -EINVAL; in nl80211_parse_coalesce_rule()
12531 return -EINVAL; in nl80211_parse_coalesce_rule()
12532 if (pat_len > coalesce->pattern_max_len || in nl80211_parse_coalesce_rule()
12533 pat_len < coalesce->pattern_min_len) in nl80211_parse_coalesce_rule()
12534 return -EINVAL; in nl80211_parse_coalesce_rule()
12540 if (pkt_offset > coalesce->max_pkt_offset) in nl80211_parse_coalesce_rule()
12541 return -EINVAL; in nl80211_parse_coalesce_rule()
12542 new_rule->patterns[i].pkt_offset = pkt_offset; in nl80211_parse_coalesce_rule()
12546 return -ENOMEM; in nl80211_parse_coalesce_rule()
12548 new_rule->patterns[i].mask = mask_pat; in nl80211_parse_coalesce_rule()
12553 new_rule->patterns[i].pattern = mask_pat; in nl80211_parse_coalesce_rule()
12554 new_rule->patterns[i].pattern_len = pat_len; in nl80211_parse_coalesce_rule()
12565 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_coalesce()
12566 const struct wiphy_coalesce_support *coalesce = rdev->wiphy.coalesce; in nl80211_set_coalesce()
12573 if (!rdev->wiphy.coalesce || !rdev->ops->set_coalesce) in nl80211_set_coalesce()
12574 return -EOPNOTSUPP; in nl80211_set_coalesce()
12576 if (!info->attrs[NL80211_ATTR_COALESCE_RULE]) { in nl80211_set_coalesce()
12582 nla_for_each_nested(rule, info->attrs[NL80211_ATTR_COALESCE_RULE], in nl80211_set_coalesce()
12585 if (n_rules > coalesce->n_rules) in nl80211_set_coalesce()
12586 return -EINVAL; in nl80211_set_coalesce()
12591 return -ENOMEM; in nl80211_set_coalesce()
12596 nla_for_each_nested(rule, info->attrs[NL80211_ATTR_COALESCE_RULE], in nl80211_set_coalesce()
12612 err = -ENOMEM; in nl80211_set_coalesce()
12616 rdev->coalesce = n_coalesce; in nl80211_set_coalesce()
12622 for (j = 0; j < tmp_rule->n_patterns; j++) in nl80211_set_coalesce()
12623 kfree(tmp_rule->patterns[j].mask); in nl80211_set_coalesce()
12624 kfree(tmp_rule->patterns); in nl80211_set_coalesce()
12633 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_rekey_data()
12634 struct net_device *dev = info->user_ptr[1]; in nl80211_set_rekey_data()
12635 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_rekey_data()
12640 if (!info->attrs[NL80211_ATTR_REKEY_DATA]) in nl80211_set_rekey_data()
12641 return -EINVAL; in nl80211_set_rekey_data()
12644 info->attrs[NL80211_ATTR_REKEY_DATA], in nl80211_set_rekey_data()
12645 nl80211_rekey_policy, info->extack); in nl80211_set_rekey_data()
12651 return -EINVAL; in nl80211_set_rekey_data()
12653 !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_EXT_KEK_KCK && in nl80211_set_rekey_data()
12655 return -ERANGE; in nl80211_set_rekey_data()
12657 !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_EXT_KEK_KCK && in nl80211_set_rekey_data()
12659 return -ERANGE; in nl80211_set_rekey_data()
12670 if (!wdev->current_bss) { in nl80211_set_rekey_data()
12671 err = -ENOTCONN; in nl80211_set_rekey_data()
12675 if (!rdev->ops->set_rekey_data) { in nl80211_set_rekey_data()
12676 err = -EOPNOTSUPP; in nl80211_set_rekey_data()
12689 struct net_device *dev = info->user_ptr[1]; in nl80211_register_unexpected_frame()
12690 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_register_unexpected_frame()
12692 if (wdev->iftype != NL80211_IFTYPE_AP && in nl80211_register_unexpected_frame()
12693 wdev->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_register_unexpected_frame()
12694 return -EINVAL; in nl80211_register_unexpected_frame()
12696 if (wdev->ap_unexpected_nlportid) in nl80211_register_unexpected_frame()
12697 return -EBUSY; in nl80211_register_unexpected_frame()
12699 wdev->ap_unexpected_nlportid = info->snd_portid; in nl80211_register_unexpected_frame()
12706 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_probe_client()
12707 struct net_device *dev = info->user_ptr[1]; in nl80211_probe_client()
12708 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_probe_client()
12715 if (wdev->iftype != NL80211_IFTYPE_AP && in nl80211_probe_client()
12716 wdev->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_probe_client()
12717 return -EOPNOTSUPP; in nl80211_probe_client()
12719 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_probe_client()
12720 return -EINVAL; in nl80211_probe_client()
12722 if (!rdev->ops->probe_client) in nl80211_probe_client()
12723 return -EOPNOTSUPP; in nl80211_probe_client()
12727 return -ENOMEM; in nl80211_probe_client()
12729 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_probe_client()
12732 err = -ENOBUFS; in nl80211_probe_client()
12736 addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_probe_client()
12751 err = -ENOBUFS; in nl80211_probe_client()
12759 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_register_beacons()
12763 if (!(rdev->wiphy.flags & WIPHY_FLAG_REPORTS_OBSS)) in nl80211_register_beacons()
12764 return -EOPNOTSUPP; in nl80211_register_beacons()
12768 return -ENOMEM; in nl80211_register_beacons()
12771 spin_lock_bh(&rdev->beacon_registrations_lock); in nl80211_register_beacons()
12772 list_for_each_entry(reg, &rdev->beacon_registrations, list) { in nl80211_register_beacons()
12773 if (reg->nlportid == info->snd_portid) { in nl80211_register_beacons()
12774 rv = -EALREADY; in nl80211_register_beacons()
12779 nreg->nlportid = info->snd_portid; in nl80211_register_beacons()
12780 list_add(&nreg->list, &rdev->beacon_registrations); in nl80211_register_beacons()
12782 spin_unlock_bh(&rdev->beacon_registrations_lock); in nl80211_register_beacons()
12786 spin_unlock_bh(&rdev->beacon_registrations_lock); in nl80211_register_beacons()
12793 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_start_p2p_device()
12794 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_start_p2p_device()
12797 if (!rdev->ops->start_p2p_device) in nl80211_start_p2p_device()
12798 return -EOPNOTSUPP; in nl80211_start_p2p_device()
12800 if (wdev->iftype != NL80211_IFTYPE_P2P_DEVICE) in nl80211_start_p2p_device()
12801 return -EOPNOTSUPP; in nl80211_start_p2p_device()
12806 if (rfkill_blocked(rdev->rfkill)) in nl80211_start_p2p_device()
12807 return -ERFKILL; in nl80211_start_p2p_device()
12813 wdev->is_running = true; in nl80211_start_p2p_device()
12814 rdev->opencount++; in nl80211_start_p2p_device()
12821 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_stop_p2p_device()
12822 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_stop_p2p_device()
12824 if (wdev->iftype != NL80211_IFTYPE_P2P_DEVICE) in nl80211_stop_p2p_device()
12825 return -EOPNOTSUPP; in nl80211_stop_p2p_device()
12827 if (!rdev->ops->stop_p2p_device) in nl80211_stop_p2p_device()
12828 return -EOPNOTSUPP; in nl80211_stop_p2p_device()
12837 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_start_nan()
12838 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_start_nan()
12842 if (wdev->iftype != NL80211_IFTYPE_NAN) in nl80211_start_nan()
12843 return -EOPNOTSUPP; in nl80211_start_nan()
12846 return -EEXIST; in nl80211_start_nan()
12848 if (rfkill_blocked(rdev->rfkill)) in nl80211_start_nan()
12849 return -ERFKILL; in nl80211_start_nan()
12851 if (!info->attrs[NL80211_ATTR_NAN_MASTER_PREF]) in nl80211_start_nan()
12852 return -EINVAL; in nl80211_start_nan()
12855 nla_get_u8(info->attrs[NL80211_ATTR_NAN_MASTER_PREF]); in nl80211_start_nan()
12857 if (info->attrs[NL80211_ATTR_BANDS]) { in nl80211_start_nan()
12858 u32 bands = nla_get_u32(info->attrs[NL80211_ATTR_BANDS]); in nl80211_start_nan()
12860 if (bands & ~(u32)wdev->wiphy->nan_supported_bands) in nl80211_start_nan()
12861 return -EOPNOTSUPP; in nl80211_start_nan()
12864 return -EINVAL; in nl80211_start_nan()
12873 wdev->is_running = true; in nl80211_start_nan()
12874 rdev->opencount++; in nl80211_start_nan()
12881 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_stop_nan()
12882 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_stop_nan()
12884 if (wdev->iftype != NL80211_IFTYPE_NAN) in nl80211_stop_nan()
12885 return -EOPNOTSUPP; in nl80211_stop_nan()
12903 return -EINVAL; in validate_nan_filter()
12910 bool tx) in handle_nan_filter() argument
12920 BUILD_BUG_ON(sizeof(*func->rx_filters) != sizeof(*func->tx_filters)); in handle_nan_filter()
12922 filter = kcalloc(n_entries, sizeof(*func->rx_filters), GFP_KERNEL); in handle_nan_filter()
12924 return -ENOMEM; in handle_nan_filter()
12932 if (tx) { in handle_nan_filter()
12933 func->num_tx_filters = n_entries; in handle_nan_filter()
12934 func->tx_filters = filter; in handle_nan_filter()
12936 func->num_rx_filters = n_entries; in handle_nan_filter()
12937 func->rx_filters = filter; in handle_nan_filter()
12946 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_nan_add_func()
12947 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_nan_add_func()
12954 if (wdev->iftype != NL80211_IFTYPE_NAN) in nl80211_nan_add_func()
12955 return -EOPNOTSUPP; in nl80211_nan_add_func()
12958 return -ENOTCONN; in nl80211_nan_add_func()
12960 if (!info->attrs[NL80211_ATTR_NAN_FUNC]) in nl80211_nan_add_func()
12961 return -EINVAL; in nl80211_nan_add_func()
12964 info->attrs[NL80211_ATTR_NAN_FUNC], in nl80211_nan_add_func()
12966 info->extack); in nl80211_nan_add_func()
12972 return -ENOMEM; in nl80211_nan_add_func()
12974 func->cookie = cfg80211_assign_cookie(rdev); in nl80211_nan_add_func()
12977 err = -EINVAL; in nl80211_nan_add_func()
12982 func->type = nla_get_u8(tb[NL80211_NAN_FUNC_TYPE]); in nl80211_nan_add_func()
12985 err = -EINVAL; in nl80211_nan_add_func()
12989 memcpy(func->service_id, nla_data(tb[NL80211_NAN_FUNC_SERVICE_ID]), in nl80211_nan_add_func()
12990 sizeof(func->service_id)); in nl80211_nan_add_func()
12992 func->close_range = in nl80211_nan_add_func()
12996 func->serv_spec_info_len = in nl80211_nan_add_func()
12998 func->serv_spec_info = in nl80211_nan_add_func()
13000 func->serv_spec_info_len, in nl80211_nan_add_func()
13002 if (!func->serv_spec_info) { in nl80211_nan_add_func()
13003 err = -ENOMEM; in nl80211_nan_add_func()
13009 func->ttl = nla_get_u32(tb[NL80211_NAN_FUNC_TTL]); in nl80211_nan_add_func()
13011 switch (func->type) { in nl80211_nan_add_func()
13014 err = -EINVAL; in nl80211_nan_add_func()
13018 func->publish_type = in nl80211_nan_add_func()
13020 func->publish_bcast = in nl80211_nan_add_func()
13023 if ((!(func->publish_type & NL80211_NAN_SOLICITED_PUBLISH)) && in nl80211_nan_add_func()
13024 func->publish_bcast) { in nl80211_nan_add_func()
13025 err = -EINVAL; in nl80211_nan_add_func()
13030 func->subscribe_active = in nl80211_nan_add_func()
13037 err = -EINVAL; in nl80211_nan_add_func()
13041 func->followup_id = in nl80211_nan_add_func()
13043 func->followup_reqid = in nl80211_nan_add_func()
13045 memcpy(func->followup_dest.addr, in nl80211_nan_add_func()
13047 sizeof(func->followup_dest.addr)); in nl80211_nan_add_func()
13048 if (func->ttl) { in nl80211_nan_add_func()
13049 err = -EINVAL; in nl80211_nan_add_func()
13054 err = -EINVAL; in nl80211_nan_add_func()
13065 info->extack); in nl80211_nan_add_func()
13069 func->srf_include = in nl80211_nan_add_func()
13075 err = -EINVAL; in nl80211_nan_add_func()
13079 func->srf_bf_len = in nl80211_nan_add_func()
13081 func->srf_bf = in nl80211_nan_add_func()
13083 func->srf_bf_len, GFP_KERNEL); in nl80211_nan_add_func()
13084 if (!func->srf_bf) { in nl80211_nan_add_func()
13085 err = -ENOMEM; in nl80211_nan_add_func()
13089 func->srf_bf_idx = in nl80211_nan_add_func()
13097 err = -EINVAL; in nl80211_nan_add_func()
13103 err = -EINVAL; in nl80211_nan_add_func()
13107 func->srf_num_macs = n_entries; in nl80211_nan_add_func()
13108 func->srf_macs = in nl80211_nan_add_func()
13109 kcalloc(n_entries, sizeof(*func->srf_macs), in nl80211_nan_add_func()
13111 if (!func->srf_macs) { in nl80211_nan_add_func()
13112 err = -ENOMEM; in nl80211_nan_add_func()
13117 memcpy(func->srf_macs[i++].addr, nla_data(attr), in nl80211_nan_add_func()
13118 sizeof(*func->srf_macs)); in nl80211_nan_add_func()
13138 err = -ENOMEM; in nl80211_nan_add_func()
13142 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_nan_add_func()
13144 /* This can't really happen - we just allocated 4KB */ in nl80211_nan_add_func()
13146 err = -ENOMEM; in nl80211_nan_add_func()
13159 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, func->cookie, in nl80211_nan_add_func()
13168 func->instance_id)) in nl80211_nan_add_func()
13178 return -ENOBUFS; in nl80211_nan_add_func()
13184 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_nan_del_func()
13185 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_nan_del_func()
13188 if (wdev->iftype != NL80211_IFTYPE_NAN) in nl80211_nan_del_func()
13189 return -EOPNOTSUPP; in nl80211_nan_del_func()
13192 return -ENOTCONN; in nl80211_nan_del_func()
13194 if (!info->attrs[NL80211_ATTR_COOKIE]) in nl80211_nan_del_func()
13195 return -EINVAL; in nl80211_nan_del_func()
13197 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); in nl80211_nan_del_func()
13207 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_nan_change_config()
13208 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_nan_change_config()
13212 if (wdev->iftype != NL80211_IFTYPE_NAN) in nl80211_nan_change_config()
13213 return -EOPNOTSUPP; in nl80211_nan_change_config()
13216 return -ENOTCONN; in nl80211_nan_change_config()
13218 if (info->attrs[NL80211_ATTR_NAN_MASTER_PREF]) { in nl80211_nan_change_config()
13220 nla_get_u8(info->attrs[NL80211_ATTR_NAN_MASTER_PREF]); in nl80211_nan_change_config()
13222 return -EINVAL; in nl80211_nan_change_config()
13227 if (info->attrs[NL80211_ATTR_BANDS]) { in nl80211_nan_change_config()
13228 u32 bands = nla_get_u32(info->attrs[NL80211_ATTR_BANDS]); in nl80211_nan_change_config()
13230 if (bands & ~(u32)wdev->wiphy->nan_supported_bands) in nl80211_nan_change_config()
13231 return -EOPNOTSUPP; in nl80211_nan_change_config()
13234 return -EINVAL; in nl80211_nan_change_config()
13241 return -EINVAL; in nl80211_nan_change_config()
13249 struct wiphy *wiphy = wdev->wiphy; in cfg80211_nan_match()
13255 if (WARN_ON(!match->inst_id || !match->peer_inst_id || !match->addr)) in cfg80211_nan_match()
13268 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_nan_match()
13269 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, in cfg80211_nan_match()
13270 wdev->netdev->ifindex)) || in cfg80211_nan_match()
13275 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, match->cookie, in cfg80211_nan_match()
13277 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, match->addr)) in cfg80211_nan_match()
13289 if (nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, match->inst_id)) in cfg80211_nan_match()
13299 if (nla_put_u8(msg, NL80211_NAN_FUNC_TYPE, match->type) || in cfg80211_nan_match()
13300 nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, match->peer_inst_id)) in cfg80211_nan_match()
13303 if (match->info && match->info_len && in cfg80211_nan_match()
13304 nla_put(msg, NL80211_NAN_FUNC_SERVICE_INFO, match->info_len, in cfg80211_nan_match()
13305 match->info)) in cfg80211_nan_match()
13312 if (!wdev->owner_nlportid) in cfg80211_nan_match()
13313 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), in cfg80211_nan_match()
13316 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, in cfg80211_nan_match()
13317 wdev->owner_nlportid); in cfg80211_nan_match()
13331 struct wiphy *wiphy = wdev->wiphy; in cfg80211_nan_func_terminated()
13350 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_nan_func_terminated()
13351 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, in cfg80211_nan_func_terminated()
13352 wdev->netdev->ifindex)) || in cfg80211_nan_func_terminated()
13372 if (!wdev->owner_nlportid) in cfg80211_nan_func_terminated()
13373 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), in cfg80211_nan_func_terminated()
13376 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, in cfg80211_nan_func_terminated()
13377 wdev->owner_nlportid); in cfg80211_nan_func_terminated()
13394 return -ENOMEM; in nl80211_get_protocol_features()
13396 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_protocol_features()
13410 return -ENOBUFS; in nl80211_get_protocol_features()
13415 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_update_ft_ies()
13417 struct net_device *dev = info->user_ptr[1]; in nl80211_update_ft_ies()
13419 if (!rdev->ops->update_ft_ies) in nl80211_update_ft_ies()
13420 return -EOPNOTSUPP; in nl80211_update_ft_ies()
13422 if (!info->attrs[NL80211_ATTR_MDID] || in nl80211_update_ft_ies()
13423 !info->attrs[NL80211_ATTR_IE]) in nl80211_update_ft_ies()
13424 return -EINVAL; in nl80211_update_ft_ies()
13427 ft_params.md = nla_get_u16(info->attrs[NL80211_ATTR_MDID]); in nl80211_update_ft_ies()
13428 ft_params.ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_update_ft_ies()
13429 ft_params.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_update_ft_ies()
13437 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_crit_protocol_start()
13438 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_crit_protocol_start()
13443 if (!rdev->ops->crit_proto_start) in nl80211_crit_protocol_start()
13444 return -EOPNOTSUPP; in nl80211_crit_protocol_start()
13446 if (WARN_ON(!rdev->ops->crit_proto_stop)) in nl80211_crit_protocol_start()
13447 return -EINVAL; in nl80211_crit_protocol_start()
13449 if (rdev->crit_proto_nlportid) in nl80211_crit_protocol_start()
13450 return -EBUSY; in nl80211_crit_protocol_start()
13453 if (info->attrs[NL80211_ATTR_CRIT_PROT_ID]) in nl80211_crit_protocol_start()
13454 proto = nla_get_u16(info->attrs[NL80211_ATTR_CRIT_PROT_ID]); in nl80211_crit_protocol_start()
13457 return -EINVAL; in nl80211_crit_protocol_start()
13460 if (!info->attrs[NL80211_ATTR_MAX_CRIT_PROT_DURATION]) in nl80211_crit_protocol_start()
13461 return -EINVAL; in nl80211_crit_protocol_start()
13464 nla_get_u16(info->attrs[NL80211_ATTR_MAX_CRIT_PROT_DURATION]); in nl80211_crit_protocol_start()
13468 rdev->crit_proto_nlportid = info->snd_portid; in nl80211_crit_protocol_start()
13476 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_crit_protocol_stop()
13477 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_crit_protocol_stop()
13479 if (!rdev->ops->crit_proto_stop) in nl80211_crit_protocol_stop()
13480 return -EOPNOTSUPP; in nl80211_crit_protocol_stop()
13482 if (rdev->crit_proto_nlportid) { in nl80211_crit_protocol_stop()
13483 rdev->crit_proto_nlportid = 0; in nl80211_crit_protocol_stop()
13493 if (vcmd->policy == VENDOR_CMD_RAW_DATA) { in nl80211_vendor_check_policy()
13494 if (attr->nla_type & NLA_F_NESTED) { in nl80211_vendor_check_policy()
13497 return -EINVAL; in nl80211_vendor_check_policy()
13503 if (!(attr->nla_type & NLA_F_NESTED)) { in nl80211_vendor_check_policy()
13505 return -EINVAL; in nl80211_vendor_check_policy()
13508 return nla_validate_nested(attr, vcmd->maxattr, vcmd->policy, extack); in nl80211_vendor_check_policy()
13513 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_vendor_cmd()
13515 __cfg80211_wdev_from_attrs(genl_info_net(info), info->attrs); in nl80211_vendor_cmd()
13519 if (!rdev->wiphy.vendor_commands) in nl80211_vendor_cmd()
13520 return -EOPNOTSUPP; in nl80211_vendor_cmd()
13524 if (err != -EINVAL) in nl80211_vendor_cmd()
13527 } else if (wdev->wiphy != &rdev->wiphy) { in nl80211_vendor_cmd()
13528 return -EINVAL; in nl80211_vendor_cmd()
13531 if (!info->attrs[NL80211_ATTR_VENDOR_ID] || in nl80211_vendor_cmd()
13532 !info->attrs[NL80211_ATTR_VENDOR_SUBCMD]) in nl80211_vendor_cmd()
13533 return -EINVAL; in nl80211_vendor_cmd()
13535 vid = nla_get_u32(info->attrs[NL80211_ATTR_VENDOR_ID]); in nl80211_vendor_cmd()
13536 subcmd = nla_get_u32(info->attrs[NL80211_ATTR_VENDOR_SUBCMD]); in nl80211_vendor_cmd()
13537 for (i = 0; i < rdev->wiphy.n_vendor_commands; i++) { in nl80211_vendor_cmd()
13542 vcmd = &rdev->wiphy.vendor_commands[i]; in nl80211_vendor_cmd()
13544 if (vcmd->info.vendor_id != vid || vcmd->info.subcmd != subcmd) in nl80211_vendor_cmd()
13547 if (vcmd->flags & (WIPHY_VENDOR_CMD_NEED_WDEV | in nl80211_vendor_cmd()
13550 return -EINVAL; in nl80211_vendor_cmd()
13551 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_NETDEV && in nl80211_vendor_cmd()
13552 !wdev->netdev) in nl80211_vendor_cmd()
13553 return -EINVAL; in nl80211_vendor_cmd()
13555 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_RUNNING) { in nl80211_vendor_cmd()
13557 return -ENETDOWN; in nl80211_vendor_cmd()
13563 if (!vcmd->doit) in nl80211_vendor_cmd()
13564 return -EOPNOTSUPP; in nl80211_vendor_cmd()
13566 if (info->attrs[NL80211_ATTR_VENDOR_DATA]) { in nl80211_vendor_cmd()
13567 data = nla_data(info->attrs[NL80211_ATTR_VENDOR_DATA]); in nl80211_vendor_cmd()
13568 len = nla_len(info->attrs[NL80211_ATTR_VENDOR_DATA]); in nl80211_vendor_cmd()
13571 info->attrs[NL80211_ATTR_VENDOR_DATA], in nl80211_vendor_cmd()
13572 info->extack); in nl80211_vendor_cmd()
13577 rdev->cur_cmd_info = info; in nl80211_vendor_cmd()
13578 err = vcmd->doit(&rdev->wiphy, wdev, data, len); in nl80211_vendor_cmd()
13579 rdev->cur_cmd_info = NULL; in nl80211_vendor_cmd()
13583 return -EOPNOTSUPP; in nl80211_vendor_cmd()
13594 int vcmd_idx = -1; in nl80211_prepare_vendor_dump()
13599 if (cb->args[0]) { in nl80211_prepare_vendor_dump()
13601 struct wiphy *wiphy = wiphy_idx_to_wiphy(cb->args[0] - 1); in nl80211_prepare_vendor_dump()
13605 return -ENODEV; in nl80211_prepare_vendor_dump()
13609 if (cb->args[1]) { in nl80211_prepare_vendor_dump()
13610 list_for_each_entry(tmp, &wiphy->wdev_list, list) { in nl80211_prepare_vendor_dump()
13611 if (tmp->identifier == cb->args[1] - 1) { in nl80211_prepare_vendor_dump()
13624 return -ENOMEM; in nl80211_prepare_vendor_dump()
13626 err = nlmsg_parse_deprecated(cb->nlh, in nl80211_prepare_vendor_dump()
13635 err = -EINVAL; in nl80211_prepare_vendor_dump()
13639 *wdev = __cfg80211_wdev_from_attrs(sock_net(skb->sk), attrbuf); in nl80211_prepare_vendor_dump()
13643 *rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk), attrbuf); in nl80211_prepare_vendor_dump()
13652 for (i = 0; i < (*rdev)->wiphy.n_vendor_commands; i++) { in nl80211_prepare_vendor_dump()
13655 vcmd = &(*rdev)->wiphy.vendor_commands[i]; in nl80211_prepare_vendor_dump()
13657 if (vcmd->info.vendor_id != vid || vcmd->info.subcmd != subcmd) in nl80211_prepare_vendor_dump()
13660 if (!vcmd->dumpit) { in nl80211_prepare_vendor_dump()
13661 err = -EOPNOTSUPP; in nl80211_prepare_vendor_dump()
13670 err = -EOPNOTSUPP; in nl80211_prepare_vendor_dump()
13679 &(*rdev)->wiphy.vendor_commands[vcmd_idx], in nl80211_prepare_vendor_dump()
13681 cb->extack); in nl80211_prepare_vendor_dump()
13686 /* 0 is the first index - add 1 to parse only once */ in nl80211_prepare_vendor_dump()
13687 cb->args[0] = (*rdev)->wiphy_idx + 1; in nl80211_prepare_vendor_dump()
13689 cb->args[1] = *wdev ? (*wdev)->identifier + 1 : 0; in nl80211_prepare_vendor_dump()
13690 cb->args[2] = vcmd_idx; in nl80211_prepare_vendor_dump()
13691 cb->args[3] = (unsigned long)data; in nl80211_prepare_vendor_dump()
13692 cb->args[4] = data_len; in nl80211_prepare_vendor_dump()
13718 vcmd_idx = cb->args[2]; in nl80211_vendor_cmd_dump()
13719 data = (void *)cb->args[3]; in nl80211_vendor_cmd_dump()
13720 data_len = cb->args[4]; in nl80211_vendor_cmd_dump()
13721 vcmd = &rdev->wiphy.vendor_commands[vcmd_idx]; in nl80211_vendor_cmd_dump()
13723 if (vcmd->flags & (WIPHY_VENDOR_CMD_NEED_WDEV | in nl80211_vendor_cmd_dump()
13726 err = -EINVAL; in nl80211_vendor_cmd_dump()
13729 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_NETDEV && in nl80211_vendor_cmd_dump()
13730 !wdev->netdev) { in nl80211_vendor_cmd_dump()
13731 err = -EINVAL; in nl80211_vendor_cmd_dump()
13735 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_RUNNING) { in nl80211_vendor_cmd_dump()
13737 err = -ENETDOWN; in nl80211_vendor_cmd_dump()
13744 void *hdr = nl80211hdr_put(skb, NETLINK_CB(cb->skb).portid, in nl80211_vendor_cmd_dump()
13745 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_vendor_cmd_dump()
13750 if (nla_put_u32(skb, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_vendor_cmd_dump()
13765 err = vcmd->dumpit(&rdev->wiphy, wdev, skb, data, data_len, in nl80211_vendor_cmd_dump()
13766 (unsigned long *)&cb->args[5]); in nl80211_vendor_cmd_dump()
13769 if (err == -ENOBUFS || err == -ENOENT) { in nl80211_vendor_cmd_dump()
13780 err = skb->len; in nl80211_vendor_cmd_dump()
13793 if (WARN_ON(!rdev->cur_cmd_info)) in __cfg80211_alloc_reply_skb()
13797 rdev->cur_cmd_info->snd_portid, in __cfg80211_alloc_reply_skb()
13798 rdev->cur_cmd_info->snd_seq, in __cfg80211_alloc_reply_skb()
13805 struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0]; in cfg80211_vendor_cmd_reply()
13806 void *hdr = ((void **)skb->cb)[1]; in cfg80211_vendor_cmd_reply()
13807 struct nlattr *data = ((void **)skb->cb)[2]; in cfg80211_vendor_cmd_reply()
13810 memset(skb->cb, 0, sizeof(skb->cb)); in cfg80211_vendor_cmd_reply()
13812 if (WARN_ON(!rdev->cur_cmd_info)) { in cfg80211_vendor_cmd_reply()
13814 return -EINVAL; in cfg80211_vendor_cmd_reply()
13819 return genlmsg_reply(skb, rdev->cur_cmd_info); in cfg80211_vendor_cmd_reply()
13827 if (WARN_ON(!rdev->cur_cmd_info)) in cfg80211_vendor_cmd_get_sender()
13830 return rdev->cur_cmd_info->snd_portid; in cfg80211_vendor_cmd_get_sender()
13837 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_qos_map()
13839 struct net_device *dev = info->user_ptr[1]; in nl80211_set_qos_map()
13843 if (!rdev->ops->set_qos_map) in nl80211_set_qos_map()
13844 return -EOPNOTSUPP; in nl80211_set_qos_map()
13846 if (info->attrs[NL80211_ATTR_QOS_MAP]) { in nl80211_set_qos_map()
13847 pos = nla_data(info->attrs[NL80211_ATTR_QOS_MAP]); in nl80211_set_qos_map()
13848 len = nla_len(info->attrs[NL80211_ATTR_QOS_MAP]); in nl80211_set_qos_map()
13851 return -EINVAL; in nl80211_set_qos_map()
13855 return -ENOMEM; in nl80211_set_qos_map()
13857 num_des = (len - IEEE80211_QOS_MAP_LEN_MIN) >> 1; in nl80211_set_qos_map()
13861 memcpy(qos_map->dscp_exception, pos, des_len); in nl80211_set_qos_map()
13862 qos_map->num_des = num_des; in nl80211_set_qos_map()
13864 if (qos_map->dscp_exception[des].up > 7) { in nl80211_set_qos_map()
13866 return -EINVAL; in nl80211_set_qos_map()
13871 memcpy(qos_map->up, pos, IEEE80211_QOS_MAP_LEN_MIN); in nl80211_set_qos_map()
13874 wdev_lock(dev->ieee80211_ptr); in nl80211_set_qos_map()
13875 ret = nl80211_key_allowed(dev->ieee80211_ptr); in nl80211_set_qos_map()
13878 wdev_unlock(dev->ieee80211_ptr); in nl80211_set_qos_map()
13886 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_add_tx_ts()
13887 struct net_device *dev = info->user_ptr[1]; in nl80211_add_tx_ts()
13888 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_add_tx_ts()
13894 if (!(rdev->wiphy.features & NL80211_FEATURE_SUPPORTS_WMM_ADMISSION)) in nl80211_add_tx_ts()
13895 return -EOPNOTSUPP; in nl80211_add_tx_ts()
13897 if (!info->attrs[NL80211_ATTR_TSID] || !info->attrs[NL80211_ATTR_MAC] || in nl80211_add_tx_ts()
13898 !info->attrs[NL80211_ATTR_USER_PRIO]) in nl80211_add_tx_ts()
13899 return -EINVAL; in nl80211_add_tx_ts()
13901 tsid = nla_get_u8(info->attrs[NL80211_ATTR_TSID]); in nl80211_add_tx_ts()
13902 up = nla_get_u8(info->attrs[NL80211_ATTR_USER_PRIO]); in nl80211_add_tx_ts()
13904 /* WMM uses TIDs 0-7 even for TSPEC */ in nl80211_add_tx_ts()
13910 return -EINVAL; in nl80211_add_tx_ts()
13913 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_add_tx_ts()
13915 if (info->attrs[NL80211_ATTR_ADMITTED_TIME]) { in nl80211_add_tx_ts()
13917 nla_get_u16(info->attrs[NL80211_ATTR_ADMITTED_TIME]); in nl80211_add_tx_ts()
13919 return -EINVAL; in nl80211_add_tx_ts()
13923 switch (wdev->iftype) { in nl80211_add_tx_ts()
13926 if (wdev->current_bss) in nl80211_add_tx_ts()
13928 err = -ENOTCONN; in nl80211_add_tx_ts()
13931 err = -EOPNOTSUPP; in nl80211_add_tx_ts()
13944 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_del_tx_ts()
13945 struct net_device *dev = info->user_ptr[1]; in nl80211_del_tx_ts()
13946 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_del_tx_ts()
13951 if (!info->attrs[NL80211_ATTR_TSID] || !info->attrs[NL80211_ATTR_MAC]) in nl80211_del_tx_ts()
13952 return -EINVAL; in nl80211_del_tx_ts()
13954 tsid = nla_get_u8(info->attrs[NL80211_ATTR_TSID]); in nl80211_del_tx_ts()
13955 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_del_tx_ts()
13967 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_tdls_channel_switch()
13968 struct net_device *dev = info->user_ptr[1]; in nl80211_tdls_channel_switch()
13969 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_tdls_channel_switch()
13975 if (!rdev->ops->tdls_channel_switch || in nl80211_tdls_channel_switch()
13976 !(rdev->wiphy.features & NL80211_FEATURE_TDLS_CHANNEL_SWITCH)) in nl80211_tdls_channel_switch()
13977 return -EOPNOTSUPP; in nl80211_tdls_channel_switch()
13979 switch (dev->ieee80211_ptr->iftype) { in nl80211_tdls_channel_switch()
13984 return -EOPNOTSUPP; in nl80211_tdls_channel_switch()
13987 if (!info->attrs[NL80211_ATTR_MAC] || in nl80211_tdls_channel_switch()
13988 !info->attrs[NL80211_ATTR_OPER_CLASS]) in nl80211_tdls_channel_switch()
13989 return -EINVAL; in nl80211_tdls_channel_switch()
13996 * Don't allow wide channels on the 2.4Ghz band, as per IEEE802.11-2012 in nl80211_tdls_channel_switch()
14000 if (chandef.chan->band == NL80211_BAND_2GHZ && in nl80211_tdls_channel_switch()
14003 return -EINVAL; in nl80211_tdls_channel_switch()
14006 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &chandef, in nl80211_tdls_channel_switch()
14007 wdev->iftype)) in nl80211_tdls_channel_switch()
14008 return -EINVAL; in nl80211_tdls_channel_switch()
14011 if (cfg80211_chandef_dfs_required(wdev->wiphy, &chandef, wdev->iftype)) in nl80211_tdls_channel_switch()
14012 return -EINVAL; in nl80211_tdls_channel_switch()
14014 addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_tdls_channel_switch()
14015 oper_class = nla_get_u8(info->attrs[NL80211_ATTR_OPER_CLASS]); in nl80211_tdls_channel_switch()
14027 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_tdls_cancel_channel_switch()
14028 struct net_device *dev = info->user_ptr[1]; in nl80211_tdls_cancel_channel_switch()
14029 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_tdls_cancel_channel_switch()
14032 if (!rdev->ops->tdls_channel_switch || in nl80211_tdls_cancel_channel_switch()
14033 !rdev->ops->tdls_cancel_channel_switch || in nl80211_tdls_cancel_channel_switch()
14034 !(rdev->wiphy.features & NL80211_FEATURE_TDLS_CHANNEL_SWITCH)) in nl80211_tdls_cancel_channel_switch()
14035 return -EOPNOTSUPP; in nl80211_tdls_cancel_channel_switch()
14037 switch (dev->ieee80211_ptr->iftype) { in nl80211_tdls_cancel_channel_switch()
14042 return -EOPNOTSUPP; in nl80211_tdls_cancel_channel_switch()
14045 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_tdls_cancel_channel_switch()
14046 return -EINVAL; in nl80211_tdls_cancel_channel_switch()
14048 addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_tdls_cancel_channel_switch()
14060 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_multicast_to_unicast()
14061 struct net_device *dev = info->user_ptr[1]; in nl80211_set_multicast_to_unicast()
14062 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_multicast_to_unicast()
14066 if (!rdev->ops->set_multicast_to_unicast) in nl80211_set_multicast_to_unicast()
14067 return -EOPNOTSUPP; in nl80211_set_multicast_to_unicast()
14069 if (wdev->iftype != NL80211_IFTYPE_AP && in nl80211_set_multicast_to_unicast()
14070 wdev->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_set_multicast_to_unicast()
14071 return -EOPNOTSUPP; in nl80211_set_multicast_to_unicast()
14073 nla = info->attrs[NL80211_ATTR_MULTICAST_TO_UNICAST_ENABLED]; in nl80211_set_multicast_to_unicast()
14081 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_pmk()
14082 struct net_device *dev = info->user_ptr[1]; in nl80211_set_pmk()
14083 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_pmk()
14087 if (wdev->iftype != NL80211_IFTYPE_STATION && in nl80211_set_pmk()
14088 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_set_pmk()
14089 return -EOPNOTSUPP; in nl80211_set_pmk()
14091 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_set_pmk()
14093 return -EOPNOTSUPP; in nl80211_set_pmk()
14095 if (!info->attrs[NL80211_ATTR_MAC] || !info->attrs[NL80211_ATTR_PMK]) in nl80211_set_pmk()
14096 return -EINVAL; in nl80211_set_pmk()
14099 if (!wdev->current_bss) { in nl80211_set_pmk()
14100 ret = -ENOTCONN; in nl80211_set_pmk()
14104 pmk_conf.aa = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_set_pmk()
14105 if (memcmp(pmk_conf.aa, wdev->current_bss->pub.bssid, ETH_ALEN)) { in nl80211_set_pmk()
14106 ret = -EINVAL; in nl80211_set_pmk()
14110 pmk_conf.pmk = nla_data(info->attrs[NL80211_ATTR_PMK]); in nl80211_set_pmk()
14111 pmk_conf.pmk_len = nla_len(info->attrs[NL80211_ATTR_PMK]); in nl80211_set_pmk()
14114 ret = -EINVAL; in nl80211_set_pmk()
14118 if (info->attrs[NL80211_ATTR_PMKR0_NAME]) in nl80211_set_pmk()
14120 nla_data(info->attrs[NL80211_ATTR_PMKR0_NAME]); in nl80211_set_pmk()
14130 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_del_pmk()
14131 struct net_device *dev = info->user_ptr[1]; in nl80211_del_pmk()
14132 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_del_pmk()
14136 if (wdev->iftype != NL80211_IFTYPE_STATION && in nl80211_del_pmk()
14137 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_del_pmk()
14138 return -EOPNOTSUPP; in nl80211_del_pmk()
14140 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_del_pmk()
14142 return -EOPNOTSUPP; in nl80211_del_pmk()
14144 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_del_pmk()
14145 return -EINVAL; in nl80211_del_pmk()
14148 aa = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_del_pmk()
14157 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_external_auth()
14158 struct net_device *dev = info->user_ptr[1]; in nl80211_external_auth()
14161 if (!rdev->ops->external_auth) in nl80211_external_auth()
14162 return -EOPNOTSUPP; in nl80211_external_auth()
14164 if (!info->attrs[NL80211_ATTR_SSID] && in nl80211_external_auth()
14165 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && in nl80211_external_auth()
14166 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_external_auth()
14167 return -EINVAL; in nl80211_external_auth()
14169 if (!info->attrs[NL80211_ATTR_BSSID]) in nl80211_external_auth()
14170 return -EINVAL; in nl80211_external_auth()
14172 if (!info->attrs[NL80211_ATTR_STATUS_CODE]) in nl80211_external_auth()
14173 return -EINVAL; in nl80211_external_auth()
14177 if (info->attrs[NL80211_ATTR_SSID]) { in nl80211_external_auth()
14178 params.ssid.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); in nl80211_external_auth()
14180 return -EINVAL; in nl80211_external_auth()
14182 nla_data(info->attrs[NL80211_ATTR_SSID]), in nl80211_external_auth()
14186 memcpy(params.bssid, nla_data(info->attrs[NL80211_ATTR_BSSID]), in nl80211_external_auth()
14189 params.status = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]); in nl80211_external_auth()
14191 if (info->attrs[NL80211_ATTR_PMKID]) in nl80211_external_auth()
14192 params.pmkid = nla_data(info->attrs[NL80211_ATTR_PMKID]); in nl80211_external_auth()
14199 bool dont_wait_for_ack = info->attrs[NL80211_ATTR_DONT_WAIT_FOR_ACK]; in nl80211_tx_control_port()
14200 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_tx_control_port()
14201 struct net_device *dev = info->user_ptr[1]; in nl80211_tx_control_port()
14202 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_tx_control_port()
14211 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_tx_control_port()
14213 return -EOPNOTSUPP; in nl80211_tx_control_port()
14215 if (!rdev->ops->tx_control_port) in nl80211_tx_control_port()
14216 return -EOPNOTSUPP; in nl80211_tx_control_port()
14218 if (!info->attrs[NL80211_ATTR_FRAME] || in nl80211_tx_control_port()
14219 !info->attrs[NL80211_ATTR_MAC] || in nl80211_tx_control_port()
14220 !info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]) { in nl80211_tx_control_port()
14222 return -EINVAL; in nl80211_tx_control_port()
14227 switch (wdev->iftype) { in nl80211_tx_control_port()
14235 if (wdev->current_bss) in nl80211_tx_control_port()
14237 err = -ENOTCONN; in nl80211_tx_control_port()
14240 err = -EOPNOTSUPP; in nl80211_tx_control_port()
14246 buf = nla_data(info->attrs[NL80211_ATTR_FRAME]); in nl80211_tx_control_port()
14247 len = nla_len(info->attrs[NL80211_ATTR_FRAME]); in nl80211_tx_control_port()
14248 dest = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_tx_control_port()
14249 proto = nla_get_u16(info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]); in nl80211_tx_control_port()
14251 nla_get_flag(info->attrs[NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT]); in nl80211_tx_control_port()
14257 nl_set_extack_cookie_u64(info->extack, cookie); in nl80211_tx_control_port()
14267 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_ftm_responder_stats()
14268 struct net_device *dev = info->user_ptr[1]; in nl80211_get_ftm_responder_stats()
14269 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_get_ftm_responder_stats()
14276 if (wdev->iftype != NL80211_IFTYPE_AP || !wdev->beacon_interval) in nl80211_get_ftm_responder_stats()
14277 return -EOPNOTSUPP; in nl80211_get_ftm_responder_stats()
14284 return -ENODATA; in nl80211_get_ftm_responder_stats()
14288 return -ENOMEM; in nl80211_get_ftm_responder_stats()
14290 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_ftm_responder_stats()
14295 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) in nl80211_get_ftm_responder_stats()
14332 return -ENOBUFS; in nl80211_get_ftm_responder_stats()
14337 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_update_owe_info()
14339 struct net_device *dev = info->user_ptr[1]; in nl80211_update_owe_info()
14341 if (!rdev->ops->update_owe_info) in nl80211_update_owe_info()
14342 return -EOPNOTSUPP; in nl80211_update_owe_info()
14344 if (!info->attrs[NL80211_ATTR_STATUS_CODE] || in nl80211_update_owe_info()
14345 !info->attrs[NL80211_ATTR_MAC]) in nl80211_update_owe_info()
14346 return -EINVAL; in nl80211_update_owe_info()
14349 owe_info.status = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]); in nl80211_update_owe_info()
14350 nla_memcpy(owe_info.peer, info->attrs[NL80211_ATTR_MAC], ETH_ALEN); in nl80211_update_owe_info()
14352 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_update_owe_info()
14353 owe_info.ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_update_owe_info()
14354 owe_info.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_update_owe_info()
14362 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_probe_mesh_link()
14363 struct net_device *dev = info->user_ptr[1]; in nl80211_probe_mesh_link()
14364 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_probe_mesh_link()
14371 if (!rdev->ops->probe_mesh_link || !rdev->ops->get_station) in nl80211_probe_mesh_link()
14372 return -EOPNOTSUPP; in nl80211_probe_mesh_link()
14374 if (!info->attrs[NL80211_ATTR_MAC] || in nl80211_probe_mesh_link()
14375 !info->attrs[NL80211_ATTR_FRAME]) { in nl80211_probe_mesh_link()
14377 return -EINVAL; in nl80211_probe_mesh_link()
14380 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_probe_mesh_link()
14381 return -EOPNOTSUPP; in nl80211_probe_mesh_link()
14383 dest = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_probe_mesh_link()
14384 buf = nla_data(info->attrs[NL80211_ATTR_FRAME]); in nl80211_probe_mesh_link()
14385 len = nla_len(info->attrs[NL80211_ATTR_FRAME]); in nl80211_probe_mesh_link()
14388 return -EINVAL; in nl80211_probe_mesh_link()
14391 !ether_addr_equal(buf + ETH_ALEN, dev->dev_addr)) in nl80211_probe_mesh_link()
14392 return -EINVAL; in nl80211_probe_mesh_link()
14408 struct netlink_ext_ack *extack = info->extack; in parse_tid_conf()
14413 return -EINVAL; in parse_tid_conf()
14415 tid_conf->config_override = in parse_tid_conf()
14417 tid_conf->tids = nla_get_u16(attrs[NL80211_TID_CONFIG_ATTR_TIDS]); in parse_tid_conf()
14419 if (tid_conf->config_override) { in parse_tid_conf()
14420 if (rdev->ops->reset_tid_config) { in parse_tid_conf()
14422 tid_conf->tids); in parse_tid_conf()
14426 return -EINVAL; in parse_tid_conf()
14431 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_NOACK); in parse_tid_conf()
14432 tid_conf->noack = in parse_tid_conf()
14437 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_RETRY_SHORT); in parse_tid_conf()
14438 tid_conf->retry_short = in parse_tid_conf()
14441 if (tid_conf->retry_short > rdev->wiphy.max_data_retry_count) in parse_tid_conf()
14442 return -EINVAL; in parse_tid_conf()
14446 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_RETRY_LONG); in parse_tid_conf()
14447 tid_conf->retry_long = in parse_tid_conf()
14450 if (tid_conf->retry_long > rdev->wiphy.max_data_retry_count) in parse_tid_conf()
14451 return -EINVAL; in parse_tid_conf()
14455 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_AMPDU_CTRL); in parse_tid_conf()
14456 tid_conf->ampdu = in parse_tid_conf()
14461 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL); in parse_tid_conf()
14462 tid_conf->rtscts = in parse_tid_conf()
14467 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_AMSDU_CTRL); in parse_tid_conf()
14468 tid_conf->amsdu = in parse_tid_conf()
14475 tid_conf->txrate_type = nla_get_u8(attrs[idx]); in parse_tid_conf()
14477 if (tid_conf->txrate_type != NL80211_TX_RATE_AUTOMATIC) { in parse_tid_conf()
14480 &tid_conf->txrate_mask, dev); in parse_tid_conf()
14484 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_TX_RATE); in parse_tid_conf()
14486 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE); in parse_tid_conf()
14490 mask = rdev->wiphy.tid_config_support.peer; in parse_tid_conf()
14492 mask = rdev->wiphy.tid_config_support.vif; in parse_tid_conf()
14494 if (tid_conf->mask & ~mask) { in parse_tid_conf()
14496 return -ENOTSUPP; in parse_tid_conf()
14505 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_tid_config()
14507 struct net_device *dev = info->user_ptr[1]; in nl80211_set_tid_config()
14511 int ret = -EINVAL; in nl80211_set_tid_config()
14514 if (!info->attrs[NL80211_ATTR_TID_CONFIG]) in nl80211_set_tid_config()
14515 return -EINVAL; in nl80211_set_tid_config()
14517 if (!rdev->ops->set_tid_config) in nl80211_set_tid_config()
14518 return -EOPNOTSUPP; in nl80211_set_tid_config()
14520 nla_for_each_nested(tid, info->attrs[NL80211_ATTR_TID_CONFIG], in nl80211_set_tid_config()
14527 return -ENOMEM; in nl80211_set_tid_config()
14529 tid_config->n_tid_conf = num_conf; in nl80211_set_tid_config()
14531 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_set_tid_config()
14532 tid_config->peer = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_set_tid_config()
14534 nla_for_each_nested(tid, info->attrs[NL80211_ATTR_TID_CONFIG], in nl80211_set_tid_config()
14543 &tid_config->tid_conf[conf_idx], in nl80211_set_tid_config()
14544 info, tid_config->peer); in nl80211_set_tid_config()
14576 bool rtnl = ops->internal_flags & NL80211_FLAG_NEED_RTNL; in nl80211_pre_doit()
14581 if (ops->internal_flags & NL80211_FLAG_NEED_WIPHY) { in nl80211_pre_doit()
14588 info->user_ptr[0] = rdev; in nl80211_pre_doit()
14589 } else if (ops->internal_flags & NL80211_FLAG_NEED_NETDEV || in nl80211_pre_doit()
14590 ops->internal_flags & NL80211_FLAG_NEED_WDEV) { in nl80211_pre_doit()
14594 info->attrs); in nl80211_pre_doit()
14601 dev = wdev->netdev; in nl80211_pre_doit()
14602 rdev = wiphy_to_rdev(wdev->wiphy); in nl80211_pre_doit()
14604 if (ops->internal_flags & NL80211_FLAG_NEED_NETDEV) { in nl80211_pre_doit()
14608 return -EINVAL; in nl80211_pre_doit()
14611 info->user_ptr[1] = dev; in nl80211_pre_doit()
14613 info->user_ptr[1] = wdev; in nl80211_pre_doit()
14616 if (ops->internal_flags & NL80211_FLAG_CHECK_NETDEV_UP && in nl80211_pre_doit()
14620 return -ENETDOWN; in nl80211_pre_doit()
14626 info->user_ptr[0] = rdev; in nl80211_pre_doit()
14635 if (info->user_ptr[1]) { in nl80211_post_doit()
14636 if (ops->internal_flags & NL80211_FLAG_NEED_WDEV) { in nl80211_post_doit()
14637 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_post_doit()
14639 if (wdev->netdev) in nl80211_post_doit()
14640 dev_put(wdev->netdev); in nl80211_post_doit()
14642 dev_put(info->user_ptr[1]); in nl80211_post_doit()
14646 if (ops->internal_flags & NL80211_FLAG_NEED_RTNL) in nl80211_post_doit()
14654 if (ops->internal_flags & NL80211_FLAG_CLEAR_SKB) { in nl80211_post_doit()
15563 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_notify_wiphy()
15582 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_notify_iface()
15589 struct cfg80211_scan_request *req = rdev->scan_req; in nl80211_add_scan_req()
15600 for (i = 0; i < req->n_ssids; i++) { in nl80211_add_scan_req()
15601 if (nla_put(msg, i, req->ssids[i].ssid_len, req->ssids[i].ssid)) in nl80211_add_scan_req()
15606 if (req->flags & NL80211_SCAN_FLAG_FREQ_KHZ) { in nl80211_add_scan_req()
15610 for (i = 0; i < req->n_channels; i++) { in nl80211_add_scan_req()
15612 ieee80211_channel_to_khz(req->channels[i]))) in nl80211_add_scan_req()
15621 for (i = 0; i < req->n_channels; i++) { in nl80211_add_scan_req()
15622 if (nla_put_u32(msg, i, req->channels[i]->center_freq)) in nl80211_add_scan_req()
15628 if (req->ie && in nl80211_add_scan_req()
15629 nla_put(msg, NL80211_ATTR_IE, req->ie_len, req->ie)) in nl80211_add_scan_req()
15632 if (req->flags && in nl80211_add_scan_req()
15633 nla_put_u32(msg, NL80211_ATTR_SCAN_FLAGS, req->flags)) in nl80211_add_scan_req()
15636 info = rdev->int_scan_req ? &rdev->int_scan_req->info : in nl80211_add_scan_req()
15637 &rdev->scan_req->info; in nl80211_add_scan_req()
15638 if (info->scan_start_tsf && in nl80211_add_scan_req()
15640 info->scan_start_tsf, NL80211_BSS_PAD) || in nl80211_add_scan_req()
15642 info->tsf_bssid))) in nl80211_add_scan_req()
15647 return -ENOBUFS; in nl80211_add_scan_req()
15660 return -1; in nl80211_prep_scan_msg()
15662 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_prep_scan_msg()
15663 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, in nl80211_prep_scan_msg()
15664 wdev->netdev->ifindex)) || in nl80211_prep_scan_msg()
15677 return -EMSGSIZE; in nl80211_prep_scan_msg()
15688 return -1; in nl80211_prep_sched_scan_msg()
15691 wiphy_to_rdev(req->wiphy)->wiphy_idx) || in nl80211_prep_sched_scan_msg()
15692 nla_put_u32(msg, NL80211_ATTR_IFINDEX, req->dev->ifindex) || in nl80211_prep_sched_scan_msg()
15693 nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, req->reqid, in nl80211_prep_sched_scan_msg()
15702 return -EMSGSIZE; in nl80211_prep_sched_scan_msg()
15720 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_scan_start()
15750 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_scan_msg()
15767 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(req->wiphy), msg, 0, in nl80211_send_sched_scan()
15775 if (nla_put_u8(msg, NL80211_ATTR_REG_INITIATOR, request->initiator)) in nl80211_reg_change_event_fill()
15778 if (request->alpha2[0] == '0' && request->alpha2[1] == '0') { in nl80211_reg_change_event_fill()
15782 } else if (request->alpha2[0] == '9' && request->alpha2[1] == '9') { in nl80211_reg_change_event_fill()
15786 } else if ((request->alpha2[0] == '9' && request->alpha2[1] == '8') || in nl80211_reg_change_event_fill()
15787 request->intersect) { in nl80211_reg_change_event_fill()
15795 request->alpha2)) in nl80211_reg_change_event_fill()
15799 if (request->wiphy_idx != WIPHY_IDX_INVALID) { in nl80211_reg_change_event_fill()
15800 struct wiphy *wiphy = wiphy_idx_to_wiphy(request->wiphy_idx); in nl80211_reg_change_event_fill()
15803 nla_put_u32(msg, NL80211_ATTR_WIPHY, request->wiphy_idx)) in nl80211_reg_change_event_fill()
15807 wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED && in nl80211_reg_change_event_fill()
15872 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_mlme_event()
15873 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_send_mlme_event()
15894 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_mlme_event()
15907 NL80211_CMD_AUTHENTICATE, gfp, -1, NULL, 0); in nl80211_send_rx_auth()
15925 NL80211_CMD_DEAUTHENTICATE, gfp, -1, NULL, 0); in nl80211_send_deauth()
15933 NL80211_CMD_DISASSOCIATE, gfp, -1, NULL, 0); in nl80211_send_disassoc()
15939 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_rx_unprot_mlme_mgmt()
15940 struct wiphy *wiphy = wdev->wiphy; in cfg80211_rx_unprot_mlme_mgmt()
15948 if (ieee80211_is_deauth(mgmt->frame_control)) { in cfg80211_rx_unprot_mlme_mgmt()
15950 } else if (ieee80211_is_disassoc(mgmt->frame_control)) { in cfg80211_rx_unprot_mlme_mgmt()
15952 } else if (ieee80211_is_beacon(mgmt->frame_control)) { in cfg80211_rx_unprot_mlme_mgmt()
15953 if (wdev->unprot_beacon_reported && in cfg80211_rx_unprot_mlme_mgmt()
15954 elapsed_jiffies_msecs(wdev->unprot_beacon_reported) < 10000) in cfg80211_rx_unprot_mlme_mgmt()
15957 wdev->unprot_beacon_reported = jiffies; in cfg80211_rx_unprot_mlme_mgmt()
15963 nl80211_send_mlme_event(rdev, dev, buf, len, cmd, GFP_ATOMIC, -1, in cfg80211_rx_unprot_mlme_mgmt()
15985 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_mlme_timeout()
15986 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_send_mlme_timeout()
15993 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_mlme_timeout()
16025 msg = nlmsg_new(100 + cr->req_ie_len + cr->resp_ie_len + in nl80211_send_connect_result()
16026 cr->fils.kek_len + cr->fils.pmk_len + in nl80211_send_connect_result()
16027 (cr->fils.pmkid ? WLAN_PMKID_LEN : 0), gfp); in nl80211_send_connect_result()
16037 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_connect_result()
16038 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_send_connect_result()
16039 (cr->bssid && in nl80211_send_connect_result()
16040 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, cr->bssid)) || in nl80211_send_connect_result()
16042 cr->status < 0 ? WLAN_STATUS_UNSPECIFIED_FAILURE : in nl80211_send_connect_result()
16043 cr->status) || in nl80211_send_connect_result()
16044 (cr->status < 0 && in nl80211_send_connect_result()
16047 cr->timeout_reason))) || in nl80211_send_connect_result()
16048 (cr->req_ie && in nl80211_send_connect_result()
16049 nla_put(msg, NL80211_ATTR_REQ_IE, cr->req_ie_len, cr->req_ie)) || in nl80211_send_connect_result()
16050 (cr->resp_ie && in nl80211_send_connect_result()
16051 nla_put(msg, NL80211_ATTR_RESP_IE, cr->resp_ie_len, in nl80211_send_connect_result()
16052 cr->resp_ie)) || in nl80211_send_connect_result()
16053 (cr->fils.update_erp_next_seq_num && in nl80211_send_connect_result()
16055 cr->fils.erp_next_seq_num)) || in nl80211_send_connect_result()
16056 (cr->status == WLAN_STATUS_SUCCESS && in nl80211_send_connect_result()
16057 ((cr->fils.kek && in nl80211_send_connect_result()
16058 nla_put(msg, NL80211_ATTR_FILS_KEK, cr->fils.kek_len, in nl80211_send_connect_result()
16059 cr->fils.kek)) || in nl80211_send_connect_result()
16060 (cr->fils.pmk && in nl80211_send_connect_result()
16061 nla_put(msg, NL80211_ATTR_PMK, cr->fils.pmk_len, cr->fils.pmk)) || in nl80211_send_connect_result()
16062 (cr->fils.pmkid && in nl80211_send_connect_result()
16063 nla_put(msg, NL80211_ATTR_PMKID, WLAN_PMKID_LEN, cr->fils.pmkid))))) in nl80211_send_connect_result()
16068 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_connect_result()
16082 const u8 *bssid = info->bss ? info->bss->bssid : info->bssid; in nl80211_send_roamed()
16084 msg = nlmsg_new(100 + info->req_ie_len + info->resp_ie_len + in nl80211_send_roamed()
16085 info->fils.kek_len + info->fils.pmk_len + in nl80211_send_roamed()
16086 (info->fils.pmkid ? WLAN_PMKID_LEN : 0), gfp); in nl80211_send_roamed()
16096 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_roamed()
16097 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_send_roamed()
16099 (info->req_ie && in nl80211_send_roamed()
16100 nla_put(msg, NL80211_ATTR_REQ_IE, info->req_ie_len, in nl80211_send_roamed()
16101 info->req_ie)) || in nl80211_send_roamed()
16102 (info->resp_ie && in nl80211_send_roamed()
16103 nla_put(msg, NL80211_ATTR_RESP_IE, info->resp_ie_len, in nl80211_send_roamed()
16104 info->resp_ie)) || in nl80211_send_roamed()
16105 (info->fils.update_erp_next_seq_num && in nl80211_send_roamed()
16107 info->fils.erp_next_seq_num)) || in nl80211_send_roamed()
16108 (info->fils.kek && in nl80211_send_roamed()
16109 nla_put(msg, NL80211_ATTR_FILS_KEK, info->fils.kek_len, in nl80211_send_roamed()
16110 info->fils.kek)) || in nl80211_send_roamed()
16111 (info->fils.pmk && in nl80211_send_roamed()
16112 nla_put(msg, NL80211_ATTR_PMK, info->fils.pmk_len, info->fils.pmk)) || in nl80211_send_roamed()
16113 (info->fils.pmkid && in nl80211_send_roamed()
16114 nla_put(msg, NL80211_ATTR_PMKID, WLAN_PMKID_LEN, info->fils.pmkid))) in nl80211_send_roamed()
16119 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_roamed()
16143 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_port_authorized()
16144 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_send_port_authorized()
16150 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_port_authorized()
16175 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_disconnected()
16176 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_send_disconnected()
16186 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_disconnected()
16211 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_ibss_bssid()
16212 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_send_ibss_bssid()
16218 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_ibss_bssid()
16230 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_notify_new_peer_candidate()
16231 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_notify_new_peer_candidate()
16235 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_MESH_POINT)) in cfg80211_notify_new_peer_candidate()
16250 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_notify_new_peer_candidate()
16251 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in cfg80211_notify_new_peer_candidate()
16261 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_notify_new_peer_candidate()
16288 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_michael_mic_failure()
16289 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_michael_mic_failure()
16292 (key_id != -1 && in nl80211_michael_mic_failure()
16299 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_michael_mic_failure()
16382 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_remain_on_chan_event()
16383 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, in nl80211_send_remain_on_chan_event()
16384 wdev->netdev->ifindex)) || in nl80211_send_remain_on_chan_event()
16387 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, chan->center_freq) || in nl80211_send_remain_on_chan_event()
16400 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_remain_on_chan_event()
16412 struct wiphy *wiphy = wdev->wiphy; in cfg80211_ready_on_channel()
16426 struct wiphy *wiphy = wdev->wiphy; in cfg80211_remain_on_channel_expired()
16439 struct wiphy *wiphy = wdev->wiphy; in cfg80211_tx_mgmt_expired()
16451 struct wiphy *wiphy = dev->ieee80211_ptr->wiphy; in cfg80211_new_sta()
16467 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_new_sta()
16475 struct wiphy *wiphy = dev->ieee80211_ptr->wiphy; in cfg80211_del_sta_sinfo()
16497 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_del_sta_sinfo()
16506 struct wiphy *wiphy = dev->ieee80211_ptr->wiphy; in cfg80211_conn_failed()
16521 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in cfg80211_conn_failed()
16528 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_conn_failed()
16540 struct wireless_dev *wdev = dev->ieee80211_ptr; in __nl80211_unexpected_frame()
16541 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in __nl80211_unexpected_frame()
16544 u32 nlportid = READ_ONCE(wdev->ap_unexpected_nlportid); in __nl80211_unexpected_frame()
16559 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in __nl80211_unexpected_frame()
16560 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in __nl80211_unexpected_frame()
16565 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); in __nl80211_unexpected_frame()
16576 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_rx_spurious_frame()
16581 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP && in cfg80211_rx_spurious_frame()
16582 wdev->iftype != NL80211_IFTYPE_P2P_GO)) { in cfg80211_rx_spurious_frame()
16596 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_rx_unexpected_4addr_frame()
16601 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP && in cfg80211_rx_unexpected_4addr_frame()
16602 wdev->iftype != NL80211_IFTYPE_P2P_GO && in cfg80211_rx_unexpected_4addr_frame()
16603 wdev->iftype != NL80211_IFTYPE_AP_VLAN)) { in cfg80211_rx_unexpected_4addr_frame()
16620 struct net_device *netdev = wdev->netdev; in nl80211_send_mgmt()
16626 return -ENOMEM; in nl80211_send_mgmt()
16631 return -ENOMEM; in nl80211_send_mgmt()
16634 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_mgmt()
16636 netdev->ifindex)) || in nl80211_send_mgmt()
16650 return genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); in nl80211_send_mgmt()
16654 return -ENOBUFS; in nl80211_send_mgmt()
16661 struct wiphy *wiphy = wdev->wiphy; in nl80211_frame_tx_status()
16663 struct net_device *netdev = wdev->netdev; in nl80211_frame_tx_status()
16682 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_frame_tx_status()
16684 netdev->ifindex)) || in nl80211_frame_tx_status()
16695 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_frame_tx_status()
16724 struct wireless_dev *wdev = dev->ieee80211_ptr; in __nl80211_rx_control_port()
16725 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in __nl80211_rx_control_port()
16727 const u8 *addr = ehdr->h_source; in __nl80211_rx_control_port()
16728 u16 proto = be16_to_cpu(skb->protocol); in __nl80211_rx_control_port()
16733 u32 nlportid = READ_ONCE(wdev->conn_owner_nlportid); in __nl80211_rx_control_port()
16736 return -ENOENT; in __nl80211_rx_control_port()
16738 msg = nlmsg_new(100 + skb->len, gfp); in __nl80211_rx_control_port()
16740 return -ENOMEM; in __nl80211_rx_control_port()
16745 return -ENOBUFS; in __nl80211_rx_control_port()
16748 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in __nl80211_rx_control_port()
16749 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in __nl80211_rx_control_port()
16758 frame = nla_reserve(msg, NL80211_ATTR_FRAME, skb->len); in __nl80211_rx_control_port()
16762 skb_copy_bits(skb, 0, nla_data(frame), skb->len); in __nl80211_rx_control_port()
16765 return genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); in __nl80211_rx_control_port()
16769 return -ENOBUFS; in __nl80211_rx_control_port()
16787 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_prepare_cqm()
16788 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_prepare_cqm()
16795 cb = (void **)msg->cb; in cfg80211_prepare_cqm()
16803 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_prepare_cqm()
16804 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) in cfg80211_prepare_cqm()
16824 void **cb = (void **)msg->cb; in cfg80211_send_cqm()
16830 memset(msg->cb, 0, sizeof(msg->cb)); in cfg80211_send_cqm()
16832 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_send_cqm()
16841 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_cqm_rssi_notify()
16842 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_cqm_rssi_notify()
16850 if (wdev->cqm_config) { in cfg80211_cqm_rssi_notify()
16851 wdev->cqm_config->last_rssi_event_value = rssi_level; in cfg80211_cqm_rssi_notify()
16856 rssi_level = wdev->cqm_config->last_rssi_event_value; in cfg80211_cqm_rssi_notify()
16966 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_gtk_rekey_notify()
16967 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_gtk_rekey_notify()
16983 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_gtk_rekey_notify()
16994 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_gtk_rekey_notify()
16995 struct wiphy *wiphy = wdev->wiphy; in cfg80211_gtk_rekey_notify()
17022 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_pmksa_candidate_notify()
17023 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex)) in nl80211_pmksa_candidate_notify()
17040 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_pmksa_candidate_notify()
17051 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_pmksa_candidate_notify()
17052 struct wiphy *wiphy = wdev->wiphy; in cfg80211_pmksa_candidate_notify()
17080 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex)) in nl80211_ch_switch_notify()
17092 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_ch_switch_notify()
17103 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_ch_switch_notify()
17104 struct wiphy *wiphy = wdev->wiphy; in cfg80211_ch_switch_notify()
17111 wdev->chandef = *chandef; in cfg80211_ch_switch_notify()
17112 wdev->preset_chandef = *chandef; in cfg80211_ch_switch_notify()
17114 if (wdev->iftype == NL80211_IFTYPE_STATION && in cfg80211_ch_switch_notify()
17115 !WARN_ON(!wdev->current_bss)) in cfg80211_ch_switch_notify()
17116 cfg80211_update_assoc_bss_entry(wdev, chandef->chan); in cfg80211_ch_switch_notify()
17129 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_ch_switch_started_notify()
17130 struct wiphy *wiphy = wdev->wiphy; in cfg80211_ch_switch_started_notify()
17159 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx)) in nl80211_radar_notify()
17164 struct wireless_dev *wdev = netdev->ieee80211_ptr; in nl80211_radar_notify()
17166 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_radar_notify()
17180 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_radar_notify()
17193 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_sta_opmode_change_notify()
17194 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_sta_opmode_change_notify()
17210 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx)) in cfg80211_sta_opmode_change_notify()
17213 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) in cfg80211_sta_opmode_change_notify()
17219 if ((sta_opmode->changed & STA_OPMODE_SMPS_MODE_CHANGED) && in cfg80211_sta_opmode_change_notify()
17220 nla_put_u8(msg, NL80211_ATTR_SMPS_MODE, sta_opmode->smps_mode)) in cfg80211_sta_opmode_change_notify()
17223 if ((sta_opmode->changed & STA_OPMODE_MAX_BW_CHANGED) && in cfg80211_sta_opmode_change_notify()
17224 nla_put_u32(msg, NL80211_ATTR_CHANNEL_WIDTH, sta_opmode->bw)) in cfg80211_sta_opmode_change_notify()
17227 if ((sta_opmode->changed & STA_OPMODE_N_SS_CHANGED) && in cfg80211_sta_opmode_change_notify()
17228 nla_put_u8(msg, NL80211_ATTR_NSS, sta_opmode->rx_nss)) in cfg80211_sta_opmode_change_notify()
17233 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_sta_opmode_change_notify()
17247 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_probe_status()
17248 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_probe_status()
17265 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_probe_status()
17266 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in cfg80211_probe_status()
17277 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_probe_status()
17296 spin_lock_bh(&rdev->beacon_registrations_lock); in cfg80211_report_obss_beacon_khz()
17297 list_for_each_entry(reg, &rdev->beacon_registrations, list) { in cfg80211_report_obss_beacon_khz()
17300 spin_unlock_bh(&rdev->beacon_registrations_lock); in cfg80211_report_obss_beacon_khz()
17308 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_report_obss_beacon_khz()
17321 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, reg->nlportid); in cfg80211_report_obss_beacon_khz()
17323 spin_unlock_bh(&rdev->beacon_registrations_lock); in cfg80211_report_obss_beacon_khz()
17327 spin_unlock_bh(&rdev->beacon_registrations_lock); in cfg80211_report_obss_beacon_khz()
17336 struct cfg80211_wowlan_nd_info *nd = wakeup->net_detect; in cfg80211_net_detect_results()
17343 return -EMSGSIZE; in cfg80211_net_detect_results()
17345 for (i = 0; i < nd->n_matches; i++) { in cfg80211_net_detect_results()
17346 struct cfg80211_wowlan_nd_match *match = nd->matches[i]; in cfg80211_net_detect_results()
17359 if (nla_put(msg, NL80211_ATTR_SSID, match->ssid.ssid_len, in cfg80211_net_detect_results()
17360 match->ssid.ssid)) { in cfg80211_net_detect_results()
17365 if (match->n_channels) { in cfg80211_net_detect_results()
17373 for (j = 0; j < match->n_channels; j++) { in cfg80211_net_detect_results()
17374 if (nla_put_u32(msg, j, match->channels[j])) { in cfg80211_net_detect_results()
17396 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_report_wowlan_wakeup()
17401 trace_cfg80211_report_wowlan_wakeup(wdev->wiphy, wdev, wakeup); in cfg80211_report_wowlan_wakeup()
17404 size += wakeup->packet_present_len; in cfg80211_report_wowlan_wakeup()
17414 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_report_wowlan_wakeup()
17419 if (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, in cfg80211_report_wowlan_wakeup()
17420 wdev->netdev->ifindex)) in cfg80211_report_wowlan_wakeup()
17431 if (wakeup->disconnect && in cfg80211_report_wowlan_wakeup()
17434 if (wakeup->magic_pkt && in cfg80211_report_wowlan_wakeup()
17437 if (wakeup->gtk_rekey_failure && in cfg80211_report_wowlan_wakeup()
17440 if (wakeup->eap_identity_req && in cfg80211_report_wowlan_wakeup()
17443 if (wakeup->four_way_handshake && in cfg80211_report_wowlan_wakeup()
17446 if (wakeup->rfkill_release && in cfg80211_report_wowlan_wakeup()
17450 if (wakeup->pattern_idx >= 0 && in cfg80211_report_wowlan_wakeup()
17452 wakeup->pattern_idx)) in cfg80211_report_wowlan_wakeup()
17455 if (wakeup->tcp_match && in cfg80211_report_wowlan_wakeup()
17459 if (wakeup->tcp_connlost && in cfg80211_report_wowlan_wakeup()
17463 if (wakeup->tcp_nomoretokens && in cfg80211_report_wowlan_wakeup()
17468 if (wakeup->packet) { in cfg80211_report_wowlan_wakeup()
17472 if (!wakeup->packet_80211) { in cfg80211_report_wowlan_wakeup()
17479 if (wakeup->packet_len && in cfg80211_report_wowlan_wakeup()
17480 nla_put_u32(msg, len_attr, wakeup->packet_len)) in cfg80211_report_wowlan_wakeup()
17483 if (nla_put(msg, pkt_attr, wakeup->packet_present_len, in cfg80211_report_wowlan_wakeup()
17484 wakeup->packet)) in cfg80211_report_wowlan_wakeup()
17488 if (wakeup->net_detect && in cfg80211_report_wowlan_wakeup()
17497 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_report_wowlan_wakeup()
17511 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_tdls_oper_request()
17512 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_tdls_oper_request()
17516 trace_cfg80211_tdls_oper_request(wdev->wiphy, dev, peer, oper, in cfg80211_tdls_oper_request()
17529 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_tdls_oper_request()
17530 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in cfg80211_tdls_oper_request()
17539 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_tdls_oper_request()
17557 if (state != NETLINK_URELEASE || notify->protocol != NETLINK_GENERIC) in nl80211_netlink_notify()
17566 &rdev->sched_scan_req_list, in nl80211_netlink_notify()
17568 if (sched_scan_req->owner_nlportid == notify->portid) { in nl80211_netlink_notify()
17569 sched_scan_req->nl_owner_dead = true; in nl80211_netlink_notify()
17570 schedule_work(&rdev->sched_scan_stop_wk); in nl80211_netlink_notify()
17574 list_for_each_entry_rcu(wdev, &rdev->wiphy.wdev_list, list) { in nl80211_netlink_notify()
17575 cfg80211_mlme_unregister_socket(wdev, notify->portid); in nl80211_netlink_notify()
17577 if (wdev->owner_nlportid == notify->portid) { in nl80211_netlink_notify()
17578 wdev->nl_owner_dead = true; in nl80211_netlink_notify()
17579 schedule_work(&rdev->destroy_work); in nl80211_netlink_notify()
17580 } else if (wdev->conn_owner_nlportid == notify->portid) { in nl80211_netlink_notify()
17581 schedule_work(&wdev->disconnect_wk); in nl80211_netlink_notify()
17584 cfg80211_release_pmsr(wdev, notify->portid); in nl80211_netlink_notify()
17587 spin_lock_bh(&rdev->beacon_registrations_lock); in nl80211_netlink_notify()
17588 list_for_each_entry_safe(reg, tmp, &rdev->beacon_registrations, in nl80211_netlink_notify()
17590 if (reg->nlportid == notify->portid) { in nl80211_netlink_notify()
17591 list_del(&reg->list); in nl80211_netlink_notify()
17596 spin_unlock_bh(&rdev->beacon_registrations_lock); in nl80211_netlink_notify()
17605 regulatory_netlink_notify(notify->portid); in nl80211_netlink_notify()
17616 struct wiphy *wiphy = netdev->ieee80211_ptr->wiphy; in cfg80211_ft_event()
17623 if (!ft_event->target_ap) in cfg80211_ft_event()
17626 msg = nlmsg_new(100 + ft_event->ies_len + ft_event->ric_ies_len, in cfg80211_ft_event()
17635 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_ft_event()
17636 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in cfg80211_ft_event()
17637 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, ft_event->target_ap)) in cfg80211_ft_event()
17640 if (ft_event->ies && in cfg80211_ft_event()
17641 nla_put(msg, NL80211_ATTR_IE, ft_event->ies_len, ft_event->ies)) in cfg80211_ft_event()
17643 if (ft_event->ric_ies && in cfg80211_ft_event()
17644 nla_put(msg, NL80211_ATTR_IE_RIC, ft_event->ric_ies_len, in cfg80211_ft_event()
17645 ft_event->ric_ies)) in cfg80211_ft_event()
17650 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_ft_event()
17665 rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_crit_proto_stopped()
17666 if (!rdev->crit_proto_nlportid) in cfg80211_crit_proto_stopped()
17669 nlportid = rdev->crit_proto_nlportid; in cfg80211_crit_proto_stopped()
17670 rdev->crit_proto_nlportid = 0; in cfg80211_crit_proto_stopped()
17680 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_crit_proto_stopped()
17687 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); in cfg80211_crit_proto_stopped()
17697 struct wiphy *wiphy = wdev->wiphy; in nl80211_send_ap_stopped()
17710 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_ap_stopped()
17711 nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex) || in nl80211_send_ap_stopped()
17729 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_external_auth_request()
17730 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_external_auth_request()
17734 if (!wdev->conn_owner_nlportid) in cfg80211_external_auth_request()
17735 return -EINVAL; in cfg80211_external_auth_request()
17739 return -ENOMEM; in cfg80211_external_auth_request()
17745 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_external_auth_request()
17746 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in cfg80211_external_auth_request()
17747 nla_put_u32(msg, NL80211_ATTR_AKM_SUITES, params->key_mgmt_suite) || in cfg80211_external_auth_request()
17749 params->action) || in cfg80211_external_auth_request()
17750 nla_put(msg, NL80211_ATTR_BSSID, ETH_ALEN, params->bssid) || in cfg80211_external_auth_request()
17751 nla_put(msg, NL80211_ATTR_SSID, params->ssid.ssid_len, in cfg80211_external_auth_request()
17752 params->ssid.ssid)) in cfg80211_external_auth_request()
17756 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, in cfg80211_external_auth_request()
17757 wdev->conn_owner_nlportid); in cfg80211_external_auth_request()
17762 return -ENOBUFS; in cfg80211_external_auth_request()
17770 struct wiphy *wiphy = netdev->ieee80211_ptr->wiphy; in cfg80211_update_owe_info_event()
17785 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_update_owe_info_event()
17786 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in cfg80211_update_owe_info_event()
17787 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, owe_info->peer)) in cfg80211_update_owe_info_event()
17790 if (!owe_info->ie_len || in cfg80211_update_owe_info_event()
17791 nla_put(msg, NL80211_ATTR_IE, owe_info->ie_len, owe_info->ie)) in cfg80211_update_owe_info_event()
17796 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_update_owe_info_event()