Lines Matching +full:rx +full:- +full:level +full:- +full:trig
1 // SPDX-License-Identifier: GPL-2.0-only
3 * This is the new netlink-based wireless configuration interface.
5 * Copyright 2006-2010 Johannes Berg <johannes@sipsolutions.net>
6 * Copyright 2013-2014 Intel Mobile Communications GmbH
7 * Copyright 2015-2017 Intel Deutschland GmbH
8 * Copyright (C) 2018-2021 Intel Corporation
32 #include "rdev-ops.h"
50 NL80211_MCGRP_TESTMODE /* keep last - ifdef! */
74 int wiphy_idx = -1; in __cfg80211_wdev_from_attrs()
75 int ifidx = -1; in __cfg80211_wdev_from_attrs()
80 return ERR_PTR(-EINVAL); in __cfg80211_wdev_from_attrs()
92 if (wiphy_net(&rdev->wiphy) != netns) in __cfg80211_wdev_from_attrs()
95 if (have_wdev_id && rdev->wiphy_idx != wiphy_idx) in __cfg80211_wdev_from_attrs()
98 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) { in __cfg80211_wdev_from_attrs()
99 if (have_ifidx && wdev->netdev && in __cfg80211_wdev_from_attrs()
100 wdev->netdev->ifindex == ifidx) { in __cfg80211_wdev_from_attrs()
104 if (have_wdev_id && wdev->identifier == (u32)wdev_id) { in __cfg80211_wdev_from_attrs()
116 return ERR_PTR(-ENODEV); in __cfg80211_wdev_from_attrs()
130 return ERR_PTR(-EINVAL); in __cfg80211_rdev_from_attrs()
144 list_for_each_entry(wdev, &tmp->wiphy.wdev_list, list) { in __cfg80211_rdev_from_attrs()
145 if (wdev->identifier != (u32)wdev_id) in __cfg80211_rdev_from_attrs()
155 return ERR_PTR(-EINVAL); in __cfg80211_rdev_from_attrs()
165 if (netdev->ieee80211_ptr) in __cfg80211_rdev_from_attrs()
167 netdev->ieee80211_ptr->wiphy); in __cfg80211_rdev_from_attrs()
171 /* not wireless device -- return error */ in __cfg80211_rdev_from_attrs()
173 return ERR_PTR(-EINVAL); in __cfg80211_rdev_from_attrs()
175 /* mismatch -- return error */ in __cfg80211_rdev_from_attrs()
177 return ERR_PTR(-EINVAL); in __cfg80211_rdev_from_attrs()
184 return ERR_PTR(-ENODEV); in __cfg80211_rdev_from_attrs()
186 if (netns != wiphy_net(&rdev->wiphy)) in __cfg80211_rdev_from_attrs()
187 return ERR_PTR(-ENODEV); in __cfg80211_rdev_from_attrs()
202 return __cfg80211_rdev_from_attrs(netns, info->attrs); in cfg80211_get_dev_from_info()
218 s1g_bcn = ieee80211_is_s1g_beacon(mgmt->frame_control); in validate_beacon_head()
232 if (ieee80211_hdrlen(mgmt->frame_control) != hdrlen) in validate_beacon_head()
236 len -= fixedlen; in validate_beacon_head()
247 return -EINVAL; in validate_beacon_head()
265 return -EINVAL; in validate_ie_attr()
410 .len = 20-1 },
436 [NL80211_ATTR_IFNAME] = { .type = NLA_NUL_STRING, .len = IFNAMSIZ-1 },
466 NLA_POLICY_MAX(NLA_U8, NUM_NL80211_PLINK_ACTIONS - 1),
478 /* allow 3 for NUL-termination, we used to declare this NLA_STRING */
546 NLA_POLICY_MAX(NLA_U8, NUM_NL80211_PLINK_STATES - 1),
641 [NL80211_ATTR_TSID] = NLA_POLICY_MAX(NLA_U8, IEEE80211_NUM_TIDS - 1),
643 NLA_POLICY_MAX(NLA_U8, IEEE80211_NUM_UPS - 1),
655 NLA_POLICY_MAX(NLA_U8, NUM_NL80211_P2P_PS_STATUS - 1),
703 [NL80211_ATTR_VLAN_ID] = NLA_POLICY_RANGE(NLA_U16, 1, VLAN_N_VID - 2),
736 [NL80211_KEY_TYPE] = NLA_POLICY_MAX(NLA_U32, NUM_NL80211_KEYTYPES - 1),
891 if (!cb->args[0]) { in nl80211_prepare_wdev_dump()
897 return -ENOMEM; in nl80211_prepare_wdev_dump()
899 err = nlmsg_parse_deprecated(cb->nlh, in nl80211_prepare_wdev_dump()
908 *wdev = __cfg80211_wdev_from_attrs(sock_net(cb->skb->sk), in nl80211_prepare_wdev_dump()
913 *rdev = wiphy_to_rdev((*wdev)->wiphy); in nl80211_prepare_wdev_dump()
914 /* 0 is the first index - add 1 to parse only once */ in nl80211_prepare_wdev_dump()
915 cb->args[0] = (*rdev)->wiphy_idx + 1; in nl80211_prepare_wdev_dump()
916 cb->args[1] = (*wdev)->identifier; in nl80211_prepare_wdev_dump()
919 struct wiphy *wiphy = wiphy_idx_to_wiphy(cb->args[0] - 1); in nl80211_prepare_wdev_dump()
923 return -ENODEV; in nl80211_prepare_wdev_dump()
927 list_for_each_entry(tmp, &(*rdev)->wiphy.wdev_list, list) { in nl80211_prepare_wdev_dump()
928 if (tmp->identifier == cb->args[1]) { in nl80211_prepare_wdev_dump()
935 return -ENODEV; in nl80211_prepare_wdev_dump()
966 rule->wmm_rule.client[j].cw_min) || in nl80211_msg_put_wmm_rules()
968 rule->wmm_rule.client[j].cw_max) || in nl80211_msg_put_wmm_rules()
970 rule->wmm_rule.client[j].aifsn) || in nl80211_msg_put_wmm_rules()
972 rule->wmm_rule.client[j].cot)) in nl80211_msg_put_wmm_rules()
982 return -ENOBUFS; in nl80211_msg_put_wmm_rules()
990 * list to protect old user-space tools from breaking in nl80211_msg_put_channel()
992 if (!large && chan->flags & in nl80211_msg_put_channel()
995 if (!large && chan->freq_offset) in nl80211_msg_put_channel()
999 chan->center_freq)) in nl80211_msg_put_channel()
1002 if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_OFFSET, chan->freq_offset)) in nl80211_msg_put_channel()
1005 if ((chan->flags & IEEE80211_CHAN_DISABLED) && in nl80211_msg_put_channel()
1008 if (chan->flags & IEEE80211_CHAN_NO_IR) { in nl80211_msg_put_channel()
1014 if (chan->flags & IEEE80211_CHAN_RADAR) { in nl80211_msg_put_channel()
1020 time = elapsed_jiffies_msecs(chan->dfs_state_entered); in nl80211_msg_put_channel()
1023 chan->dfs_state)) in nl80211_msg_put_channel()
1030 chan->dfs_cac_ms)) in nl80211_msg_put_channel()
1036 if ((chan->flags & IEEE80211_CHAN_NO_HT40MINUS) && in nl80211_msg_put_channel()
1039 if ((chan->flags & IEEE80211_CHAN_NO_HT40PLUS) && in nl80211_msg_put_channel()
1042 if ((chan->flags & IEEE80211_CHAN_NO_80MHZ) && in nl80211_msg_put_channel()
1045 if ((chan->flags & IEEE80211_CHAN_NO_160MHZ) && in nl80211_msg_put_channel()
1048 if ((chan->flags & IEEE80211_CHAN_INDOOR_ONLY) && in nl80211_msg_put_channel()
1051 if ((chan->flags & IEEE80211_CHAN_IR_CONCURRENT) && in nl80211_msg_put_channel()
1054 if ((chan->flags & IEEE80211_CHAN_NO_20MHZ) && in nl80211_msg_put_channel()
1057 if ((chan->flags & IEEE80211_CHAN_NO_10MHZ) && in nl80211_msg_put_channel()
1060 if ((chan->flags & IEEE80211_CHAN_NO_HE) && in nl80211_msg_put_channel()
1063 if ((chan->flags & IEEE80211_CHAN_1MHZ) && in nl80211_msg_put_channel()
1066 if ((chan->flags & IEEE80211_CHAN_2MHZ) && in nl80211_msg_put_channel()
1069 if ((chan->flags & IEEE80211_CHAN_4MHZ) && in nl80211_msg_put_channel()
1072 if ((chan->flags & IEEE80211_CHAN_8MHZ) && in nl80211_msg_put_channel()
1075 if ((chan->flags & IEEE80211_CHAN_16MHZ) && in nl80211_msg_put_channel()
1081 DBM_TO_MBM(chan->max_power))) in nl80211_msg_put_channel()
1086 freq_reg_info(wiphy, MHZ_TO_KHZ(chan->center_freq)); in nl80211_msg_put_channel()
1088 if (!IS_ERR_OR_NULL(rule) && rule->has_wmm) { in nl80211_msg_put_channel()
1097 return -ENOBUFS; in nl80211_msg_put_channel()
1107 if (txqstats->filled & BIT(NL80211_TXQ_STATS_ ## attr) && \ in nl80211_put_txq_stats()
1108 nla_put_u32(msg, NL80211_TXQ_STATS_ ## attr, txqstats->memb)) \ in nl80211_put_txq_stats()
1149 info->extack); in nl80211_parse_key_new()
1153 k->def = !!tb[NL80211_KEY_DEFAULT]; in nl80211_parse_key_new()
1154 k->defmgmt = !!tb[NL80211_KEY_DEFAULT_MGMT]; in nl80211_parse_key_new()
1155 k->defbeacon = !!tb[NL80211_KEY_DEFAULT_BEACON]; in nl80211_parse_key_new()
1157 if (k->def) { in nl80211_parse_key_new()
1158 k->def_uni = true; in nl80211_parse_key_new()
1159 k->def_multi = true; in nl80211_parse_key_new()
1161 if (k->defmgmt || k->defbeacon) in nl80211_parse_key_new()
1162 k->def_multi = true; in nl80211_parse_key_new()
1165 k->idx = nla_get_u8(tb[NL80211_KEY_IDX]); in nl80211_parse_key_new()
1168 k->p.key = nla_data(tb[NL80211_KEY_DATA]); in nl80211_parse_key_new()
1169 k->p.key_len = nla_len(tb[NL80211_KEY_DATA]); in nl80211_parse_key_new()
1173 k->p.seq = nla_data(tb[NL80211_KEY_SEQ]); in nl80211_parse_key_new()
1174 k->p.seq_len = nla_len(tb[NL80211_KEY_SEQ]); in nl80211_parse_key_new()
1178 k->p.cipher = nla_get_u32(tb[NL80211_KEY_CIPHER]); in nl80211_parse_key_new()
1181 k->type = nla_get_u32(tb[NL80211_KEY_TYPE]); in nl80211_parse_key_new()
1187 NUM_NL80211_KEY_DEFAULT_TYPES - 1, in nl80211_parse_key_new()
1190 info->extack); in nl80211_parse_key_new()
1194 k->def_uni = kdt[NL80211_KEY_DEFAULT_TYPE_UNICAST]; in nl80211_parse_key_new()
1195 k->def_multi = kdt[NL80211_KEY_DEFAULT_TYPE_MULTICAST]; in nl80211_parse_key_new()
1199 k->p.mode = nla_get_u8(tb[NL80211_KEY_MODE]); in nl80211_parse_key_new()
1206 if (info->attrs[NL80211_ATTR_KEY_DATA]) { in nl80211_parse_key_old()
1207 k->p.key = nla_data(info->attrs[NL80211_ATTR_KEY_DATA]); in nl80211_parse_key_old()
1208 k->p.key_len = nla_len(info->attrs[NL80211_ATTR_KEY_DATA]); in nl80211_parse_key_old()
1211 if (info->attrs[NL80211_ATTR_KEY_SEQ]) { in nl80211_parse_key_old()
1212 k->p.seq = nla_data(info->attrs[NL80211_ATTR_KEY_SEQ]); in nl80211_parse_key_old()
1213 k->p.seq_len = nla_len(info->attrs[NL80211_ATTR_KEY_SEQ]); in nl80211_parse_key_old()
1216 if (info->attrs[NL80211_ATTR_KEY_IDX]) in nl80211_parse_key_old()
1217 k->idx = nla_get_u8(info->attrs[NL80211_ATTR_KEY_IDX]); in nl80211_parse_key_old()
1219 if (info->attrs[NL80211_ATTR_KEY_CIPHER]) in nl80211_parse_key_old()
1220 k->p.cipher = nla_get_u32(info->attrs[NL80211_ATTR_KEY_CIPHER]); in nl80211_parse_key_old()
1222 k->def = !!info->attrs[NL80211_ATTR_KEY_DEFAULT]; in nl80211_parse_key_old()
1223 k->defmgmt = !!info->attrs[NL80211_ATTR_KEY_DEFAULT_MGMT]; in nl80211_parse_key_old()
1225 if (k->def) { in nl80211_parse_key_old()
1226 k->def_uni = true; in nl80211_parse_key_old()
1227 k->def_multi = true; in nl80211_parse_key_old()
1229 if (k->defmgmt) in nl80211_parse_key_old()
1230 k->def_multi = true; in nl80211_parse_key_old()
1232 if (info->attrs[NL80211_ATTR_KEY_TYPE]) in nl80211_parse_key_old()
1233 k->type = nla_get_u32(info->attrs[NL80211_ATTR_KEY_TYPE]); in nl80211_parse_key_old()
1235 if (info->attrs[NL80211_ATTR_KEY_DEFAULT_TYPES]) { in nl80211_parse_key_old()
1238 NUM_NL80211_KEY_DEFAULT_TYPES - 1, in nl80211_parse_key_old()
1239 info->attrs[NL80211_ATTR_KEY_DEFAULT_TYPES], in nl80211_parse_key_old()
1241 info->extack); in nl80211_parse_key_old()
1245 k->def_uni = kdt[NL80211_KEY_DEFAULT_TYPE_UNICAST]; in nl80211_parse_key_old()
1246 k->def_multi = kdt[NL80211_KEY_DEFAULT_TYPE_MULTICAST]; in nl80211_parse_key_old()
1257 k->idx = -1; in nl80211_parse_key()
1258 k->type = -1; in nl80211_parse_key()
1260 if (info->attrs[NL80211_ATTR_KEY]) in nl80211_parse_key()
1261 err = nl80211_parse_key_new(info, info->attrs[NL80211_ATTR_KEY], k); in nl80211_parse_key()
1268 if ((k->def ? 1 : 0) + (k->defmgmt ? 1 : 0) + in nl80211_parse_key()
1269 (k->defbeacon ? 1 : 0) > 1) { in nl80211_parse_key()
1272 return -EINVAL; in nl80211_parse_key()
1275 if (k->defmgmt || k->defbeacon) { in nl80211_parse_key()
1276 if (k->def_uni || !k->def_multi) { in nl80211_parse_key()
1279 return -EINVAL; in nl80211_parse_key()
1283 if (k->idx != -1) { in nl80211_parse_key()
1284 if (k->defmgmt) { in nl80211_parse_key()
1285 if (k->idx < 4 || k->idx > 5) { in nl80211_parse_key()
1288 return -EINVAL; in nl80211_parse_key()
1290 } else if (k->defbeacon) { in nl80211_parse_key()
1291 if (k->idx < 6 || k->idx > 7) { in nl80211_parse_key()
1294 return -EINVAL; in nl80211_parse_key()
1296 } else if (k->def) { in nl80211_parse_key()
1297 if (k->idx < 0 || k->idx > 3) { in nl80211_parse_key()
1298 GENL_SET_ERR_MSG(info, "def key idx not 0-3"); in nl80211_parse_key()
1299 return -EINVAL; in nl80211_parse_key()
1302 if (k->idx < 0 || k->idx > 7) { in nl80211_parse_key()
1303 GENL_SET_ERR_MSG(info, "key idx not 0-7"); in nl80211_parse_key()
1304 return -EINVAL; in nl80211_parse_key()
1316 struct nlattr *keys = info->attrs[NL80211_ATTR_KEYS]; in nl80211_parse_connkeys()
1333 return ERR_PTR(-ENOMEM); in nl80211_parse_connkeys()
1335 result->def = -1; in nl80211_parse_connkeys()
1339 parse.idx = -1; in nl80211_parse_connkeys()
1344 err = -EINVAL; in nl80211_parse_connkeys()
1348 GENL_SET_ERR_MSG(info, "key index out of range [0-3]"); in nl80211_parse_connkeys()
1358 result->def = parse.idx; in nl80211_parse_connkeys()
1370 err = -EINVAL; in nl80211_parse_connkeys()
1373 result->params[parse.idx].cipher = parse.p.cipher; in nl80211_parse_connkeys()
1374 result->params[parse.idx].key_len = parse.p.key_len; in nl80211_parse_connkeys()
1375 result->params[parse.idx].key = result->data[parse.idx]; in nl80211_parse_connkeys()
1376 memcpy(result->data[parse.idx], parse.p.key, parse.p.key_len); in nl80211_parse_connkeys()
1383 if (result->def < 0) { in nl80211_parse_connkeys()
1384 err = -EINVAL; in nl80211_parse_connkeys()
1399 switch (wdev->iftype) { in nl80211_key_allowed()
1408 if (!wdev->current_bss) in nl80211_key_allowed()
1409 return -ENOLINK; in nl80211_key_allowed()
1418 return -EINVAL; in nl80211_key_allowed()
1430 if (!chan || chan->flags & IEEE80211_CHAN_DISABLED) in nl80211_get_valid_chan()
1455 return -ENOBUFS; in nl80211_put_iftypes()
1470 for (i = 0; i < wiphy->n_iface_combinations; i++) { in nl80211_put_iface_combinations()
1474 c = &wiphy->iface_combinations[i]; in nl80211_put_iface_combinations()
1485 for (j = 0; j < c->n_limits; j++) { in nl80211_put_iface_combinations()
1492 c->limits[j].max)) in nl80211_put_iface_combinations()
1495 c->limits[j].types)) in nl80211_put_iface_combinations()
1502 if (c->beacon_int_infra_match && in nl80211_put_iface_combinations()
1506 c->num_different_channels) || in nl80211_put_iface_combinations()
1508 c->max_interfaces)) in nl80211_put_iface_combinations()
1512 c->radar_detect_widths) || in nl80211_put_iface_combinations()
1514 c->radar_detect_regions))) in nl80211_put_iface_combinations()
1516 if (c->beacon_int_min_gcd && in nl80211_put_iface_combinations()
1518 c->beacon_int_min_gcd)) in nl80211_put_iface_combinations()
1528 return -ENOBUFS; in nl80211_put_iface_combinations()
1535 const struct wiphy_wowlan_tcp_support *tcp = rdev->wiphy.wowlan->tcp; in nl80211_send_wowlan_tcp_caps()
1544 return -ENOBUFS; in nl80211_send_wowlan_tcp_caps()
1547 tcp->data_payload_max)) in nl80211_send_wowlan_tcp_caps()
1548 return -ENOBUFS; in nl80211_send_wowlan_tcp_caps()
1551 tcp->data_payload_max)) in nl80211_send_wowlan_tcp_caps()
1552 return -ENOBUFS; in nl80211_send_wowlan_tcp_caps()
1554 if (tcp->seq && nla_put_flag(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ)) in nl80211_send_wowlan_tcp_caps()
1555 return -ENOBUFS; in nl80211_send_wowlan_tcp_caps()
1557 if (tcp->tok && nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN, in nl80211_send_wowlan_tcp_caps()
1558 sizeof(*tcp->tok), tcp->tok)) in nl80211_send_wowlan_tcp_caps()
1559 return -ENOBUFS; in nl80211_send_wowlan_tcp_caps()
1562 tcp->data_interval_max)) in nl80211_send_wowlan_tcp_caps()
1563 return -ENOBUFS; in nl80211_send_wowlan_tcp_caps()
1566 tcp->wake_payload_max)) in nl80211_send_wowlan_tcp_caps()
1567 return -ENOBUFS; in nl80211_send_wowlan_tcp_caps()
1579 if (!rdev->wiphy.wowlan) in nl80211_send_wowlan()
1585 return -ENOBUFS; in nl80211_send_wowlan()
1587 if (((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_ANY) && in nl80211_send_wowlan()
1589 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_DISCONNECT) && in nl80211_send_wowlan()
1591 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_MAGIC_PKT) && in nl80211_send_wowlan()
1593 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_SUPPORTS_GTK_REKEY) && in nl80211_send_wowlan()
1595 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_GTK_REKEY_FAILURE) && in nl80211_send_wowlan()
1597 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_EAP_IDENTITY_REQ) && in nl80211_send_wowlan()
1599 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_4WAY_HANDSHAKE) && in nl80211_send_wowlan()
1601 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_RFKILL_RELEASE) && in nl80211_send_wowlan()
1603 return -ENOBUFS; in nl80211_send_wowlan()
1605 if (rdev->wiphy.wowlan->n_patterns) { in nl80211_send_wowlan()
1607 .max_patterns = rdev->wiphy.wowlan->n_patterns, in nl80211_send_wowlan()
1608 .min_pattern_len = rdev->wiphy.wowlan->pattern_min_len, in nl80211_send_wowlan()
1609 .max_pattern_len = rdev->wiphy.wowlan->pattern_max_len, in nl80211_send_wowlan()
1610 .max_pkt_offset = rdev->wiphy.wowlan->max_pkt_offset, in nl80211_send_wowlan()
1615 return -ENOBUFS; in nl80211_send_wowlan()
1618 if ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_NET_DETECT) && in nl80211_send_wowlan()
1620 rdev->wiphy.wowlan->max_nd_match_sets)) in nl80211_send_wowlan()
1621 return -ENOBUFS; in nl80211_send_wowlan()
1624 return -ENOBUFS; in nl80211_send_wowlan()
1637 if (!rdev->wiphy.coalesce) in nl80211_send_coalesce()
1640 rule.max_rules = rdev->wiphy.coalesce->n_rules; in nl80211_send_coalesce()
1641 rule.max_delay = rdev->wiphy.coalesce->max_delay; in nl80211_send_coalesce()
1642 rule.pat.max_patterns = rdev->wiphy.coalesce->n_patterns; in nl80211_send_coalesce()
1643 rule.pat.min_pattern_len = rdev->wiphy.coalesce->pattern_min_len; in nl80211_send_coalesce()
1644 rule.pat.max_pattern_len = rdev->wiphy.coalesce->pattern_max_len; in nl80211_send_coalesce()
1645 rule.pat.max_pkt_offset = rdev->wiphy.coalesce->max_pkt_offset; in nl80211_send_coalesce()
1648 return -ENOBUFS; in nl80211_send_coalesce()
1658 const struct ieee80211_sta_he_cap *he_cap = &iftdata->he_cap; in nl80211_send_iftype_data()
1661 iftdata->types_mask)) in nl80211_send_iftype_data()
1662 return -ENOBUFS; in nl80211_send_iftype_data()
1664 if (he_cap->has_he) { in nl80211_send_iftype_data()
1666 sizeof(he_cap->he_cap_elem.mac_cap_info), in nl80211_send_iftype_data()
1667 he_cap->he_cap_elem.mac_cap_info) || in nl80211_send_iftype_data()
1669 sizeof(he_cap->he_cap_elem.phy_cap_info), in nl80211_send_iftype_data()
1670 he_cap->he_cap_elem.phy_cap_info) || in nl80211_send_iftype_data()
1672 sizeof(he_cap->he_mcs_nss_supp), in nl80211_send_iftype_data()
1673 &he_cap->he_mcs_nss_supp) || in nl80211_send_iftype_data()
1675 sizeof(he_cap->ppe_thres), he_cap->ppe_thres)) in nl80211_send_iftype_data()
1676 return -ENOBUFS; in nl80211_send_iftype_data()
1679 if (sband->band == NL80211_BAND_6GHZ && in nl80211_send_iftype_data()
1681 sizeof(iftdata->he_6ghz_capa), in nl80211_send_iftype_data()
1682 &iftdata->he_6ghz_capa)) in nl80211_send_iftype_data()
1683 return -ENOBUFS; in nl80211_send_iftype_data()
1697 if (sband->ht_cap.ht_supported && in nl80211_send_band_rateinfo()
1699 sizeof(sband->ht_cap.mcs), in nl80211_send_band_rateinfo()
1700 &sband->ht_cap.mcs) || in nl80211_send_band_rateinfo()
1702 sband->ht_cap.cap) || in nl80211_send_band_rateinfo()
1704 sband->ht_cap.ampdu_factor) || in nl80211_send_band_rateinfo()
1706 sband->ht_cap.ampdu_density))) in nl80211_send_band_rateinfo()
1707 return -ENOBUFS; in nl80211_send_band_rateinfo()
1710 if (sband->vht_cap.vht_supported && in nl80211_send_band_rateinfo()
1712 sizeof(sband->vht_cap.vht_mcs), in nl80211_send_band_rateinfo()
1713 &sband->vht_cap.vht_mcs) || in nl80211_send_band_rateinfo()
1715 sband->vht_cap.cap))) in nl80211_send_band_rateinfo()
1716 return -ENOBUFS; in nl80211_send_band_rateinfo()
1718 if (large && sband->n_iftype_data) { in nl80211_send_band_rateinfo()
1725 return -ENOBUFS; in nl80211_send_band_rateinfo()
1727 for (i = 0; i < sband->n_iftype_data; i++) { in nl80211_send_band_rateinfo()
1732 return -ENOBUFS; in nl80211_send_band_rateinfo()
1735 &sband->iftype_data[i]); in nl80211_send_band_rateinfo()
1746 if (large && sband->edmg_cap.channels && in nl80211_send_band_rateinfo()
1748 sband->edmg_cap.channels) || in nl80211_send_band_rateinfo()
1750 sband->edmg_cap.bw_config))) in nl80211_send_band_rateinfo()
1752 return -ENOBUFS; in nl80211_send_band_rateinfo()
1757 return -ENOBUFS; in nl80211_send_band_rateinfo()
1759 for (i = 0; i < sband->n_bitrates; i++) { in nl80211_send_band_rateinfo()
1762 return -ENOBUFS; in nl80211_send_band_rateinfo()
1764 rate = &sband->bitrates[i]; in nl80211_send_band_rateinfo()
1766 rate->bitrate)) in nl80211_send_band_rateinfo()
1767 return -ENOBUFS; in nl80211_send_band_rateinfo()
1768 if ((rate->flags & IEEE80211_RATE_SHORT_PREAMBLE) && in nl80211_send_band_rateinfo()
1771 return -ENOBUFS; in nl80211_send_band_rateinfo()
1795 return -ENOBUFS; in nl80211_send_mgmt_stypes()
1800 return -ENOBUFS; in nl80211_send_mgmt_stypes()
1807 return -ENOBUFS; in nl80211_send_mgmt_stypes()
1818 return -ENOBUFS; in nl80211_send_mgmt_stypes()
1823 return -ENOBUFS; in nl80211_send_mgmt_stypes()
1825 stypes = mgmt_stypes[ift].rx; in nl80211_send_mgmt_stypes()
1830 return -ENOBUFS; in nl80211_send_mgmt_stypes()
1843 if (rdev->ops->op) { \
1877 if (rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL) in nl80211_add_commands_unsplit()
1882 if (rdev->wiphy.flags & WIPHY_FLAG_NETNS_OK) { in nl80211_add_commands_unsplit()
1887 if (rdev->ops->set_monitor_channel || rdev->ops->start_ap || in nl80211_add_commands_unsplit()
1888 rdev->ops->join_mesh) { in nl80211_add_commands_unsplit()
1894 if (rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) { in nl80211_add_commands_unsplit()
1898 if (rdev->wiphy.max_sched_scan_reqs) in nl80211_add_commands_unsplit()
1902 if (rdev->wiphy.flags & WIPHY_FLAG_REPORTS_OBSS) { in nl80211_add_commands_unsplit()
1913 if (rdev->ops->connect || rdev->ops->auth) { in nl80211_add_commands_unsplit()
1919 if (rdev->ops->disconnect || rdev->ops->deauth) { in nl80211_add_commands_unsplit()
1927 return -ENOBUFS; in nl80211_add_commands_unsplit()
1936 if (!cap->ftm.supported) in nl80211_send_pmsr_ftm_capa()
1941 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
1943 if (cap->ftm.asap && nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_ASAP)) in nl80211_send_pmsr_ftm_capa()
1944 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
1945 if (cap->ftm.non_asap && in nl80211_send_pmsr_ftm_capa()
1947 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
1948 if (cap->ftm.request_lci && in nl80211_send_pmsr_ftm_capa()
1950 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
1951 if (cap->ftm.request_civicloc && in nl80211_send_pmsr_ftm_capa()
1953 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
1955 cap->ftm.preambles)) in nl80211_send_pmsr_ftm_capa()
1956 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
1958 cap->ftm.bandwidths)) in nl80211_send_pmsr_ftm_capa()
1959 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
1960 if (cap->ftm.max_bursts_exponent >= 0 && in nl80211_send_pmsr_ftm_capa()
1962 cap->ftm.max_bursts_exponent)) in nl80211_send_pmsr_ftm_capa()
1963 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
1964 if (cap->ftm.max_ftms_per_burst && in nl80211_send_pmsr_ftm_capa()
1966 cap->ftm.max_ftms_per_burst)) in nl80211_send_pmsr_ftm_capa()
1967 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
1968 if (cap->ftm.trigger_based && in nl80211_send_pmsr_ftm_capa()
1970 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
1971 if (cap->ftm.non_trigger_based && in nl80211_send_pmsr_ftm_capa()
1973 return -ENOBUFS; in nl80211_send_pmsr_ftm_capa()
1982 const struct cfg80211_pmsr_capabilities *cap = rdev->wiphy.pmsr_capa; in nl80211_send_pmsr_capa()
1995 return -ENOBUFS; in nl80211_send_pmsr_capa()
1997 if (nla_put_u32(msg, NL80211_PMSR_ATTR_MAX_PEERS, cap->max_peers)) in nl80211_send_pmsr_capa()
1998 return -ENOBUFS; in nl80211_send_pmsr_capa()
2000 if (cap->report_ap_tsf && in nl80211_send_pmsr_capa()
2002 return -ENOBUFS; in nl80211_send_pmsr_capa()
2004 if (cap->randomize_mac_addr && in nl80211_send_pmsr_capa()
2006 return -ENOBUFS; in nl80211_send_pmsr_capa()
2010 return -ENOBUFS; in nl80211_send_pmsr_capa()
2013 return -ENOBUFS; in nl80211_send_pmsr_capa()
2029 if (!rdev->wiphy.num_iftype_akm_suites || in nl80211_put_iftype_akm_suites()
2030 !rdev->wiphy.iftype_akm_suites) in nl80211_put_iftype_akm_suites()
2035 return -ENOBUFS; in nl80211_put_iftype_akm_suites()
2037 for (i = 0; i < rdev->wiphy.num_iftype_akm_suites; i++) { in nl80211_put_iftype_akm_suites()
2040 return -ENOBUFS; in nl80211_put_iftype_akm_suites()
2042 iftype_akms = &rdev->wiphy.iftype_akm_suites[i]; in nl80211_put_iftype_akm_suites()
2045 iftype_akms->iftypes_mask)) in nl80211_put_iftype_akm_suites()
2046 return -ENOBUFS; in nl80211_put_iftype_akm_suites()
2049 sizeof(u32) * iftype_akms->n_akm_suites, in nl80211_put_iftype_akm_suites()
2050 iftype_akms->akm_suites)) { in nl80211_put_iftype_akm_suites()
2051 return -ENOBUFS; in nl80211_put_iftype_akm_suites()
2067 if (!rdev->wiphy.tid_config_support.vif && in nl80211_put_tid_config_support()
2068 !rdev->wiphy.tid_config_support.peer) in nl80211_put_tid_config_support()
2073 return -ENOSPC; in nl80211_put_tid_config_support()
2075 if (rdev->wiphy.tid_config_support.vif && in nl80211_put_tid_config_support()
2077 rdev->wiphy.tid_config_support.vif, in nl80211_put_tid_config_support()
2081 if (rdev->wiphy.tid_config_support.peer && in nl80211_put_tid_config_support()
2083 rdev->wiphy.tid_config_support.peer, in nl80211_put_tid_config_support()
2089 rdev->wiphy.tid_config_support.max_retry)) in nl80211_put_tid_config_support()
2092 rdev->wiphy.tid_config_support.max_retry)) in nl80211_put_tid_config_support()
2100 return -ENOBUFS; in nl80211_put_tid_config_support()
2123 rdev->wiphy.mgmt_stypes; in nl80211_send_wiphy()
2128 return -ENOBUFS; in nl80211_send_wiphy()
2131 return -EINVAL; in nl80211_send_wiphy()
2133 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_wiphy()
2135 wiphy_name(&rdev->wiphy)) || in nl80211_send_wiphy()
2143 switch (state->split_start) { in nl80211_send_wiphy()
2146 rdev->wiphy.retry_short) || in nl80211_send_wiphy()
2148 rdev->wiphy.retry_long) || in nl80211_send_wiphy()
2150 rdev->wiphy.frag_threshold) || in nl80211_send_wiphy()
2152 rdev->wiphy.rts_threshold) || in nl80211_send_wiphy()
2154 rdev->wiphy.coverage_class) || in nl80211_send_wiphy()
2156 rdev->wiphy.max_scan_ssids) || in nl80211_send_wiphy()
2158 rdev->wiphy.max_sched_scan_ssids) || in nl80211_send_wiphy()
2160 rdev->wiphy.max_scan_ie_len) || in nl80211_send_wiphy()
2162 rdev->wiphy.max_sched_scan_ie_len) || in nl80211_send_wiphy()
2164 rdev->wiphy.max_match_sets)) in nl80211_send_wiphy()
2167 if ((rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN) && in nl80211_send_wiphy()
2170 if ((rdev->wiphy.flags & WIPHY_FLAG_MESH_AUTH) && in nl80211_send_wiphy()
2173 if ((rdev->wiphy.flags & WIPHY_FLAG_AP_UAPSD) && in nl80211_send_wiphy()
2176 if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_FW_ROAM) && in nl80211_send_wiphy()
2179 if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) && in nl80211_send_wiphy()
2182 if ((rdev->wiphy.flags & WIPHY_FLAG_TDLS_EXTERNAL_SETUP) && in nl80211_send_wiphy()
2185 state->split_start++; in nl80211_send_wiphy()
2186 if (state->split) in nl80211_send_wiphy()
2191 sizeof(u32) * rdev->wiphy.n_cipher_suites, in nl80211_send_wiphy()
2192 rdev->wiphy.cipher_suites)) in nl80211_send_wiphy()
2196 rdev->wiphy.max_num_pmkids)) in nl80211_send_wiphy()
2199 if ((rdev->wiphy.flags & WIPHY_FLAG_CONTROL_PORT_PROTOCOL) && in nl80211_send_wiphy()
2204 rdev->wiphy.available_antennas_tx) || in nl80211_send_wiphy()
2206 rdev->wiphy.available_antennas_rx)) in nl80211_send_wiphy()
2209 if ((rdev->wiphy.flags & WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD) && in nl80211_send_wiphy()
2211 rdev->wiphy.probe_resp_offload)) in nl80211_send_wiphy()
2214 if ((rdev->wiphy.available_antennas_tx || in nl80211_send_wiphy()
2215 rdev->wiphy.available_antennas_rx) && in nl80211_send_wiphy()
2216 rdev->ops->get_antenna) { in nl80211_send_wiphy()
2232 state->split_start++; in nl80211_send_wiphy()
2233 if (state->split) in nl80211_send_wiphy()
2238 rdev->wiphy.interface_modes)) in nl80211_send_wiphy()
2240 state->split_start++; in nl80211_send_wiphy()
2241 if (state->split) in nl80211_send_wiphy()
2250 for (band = state->band_start; in nl80211_send_wiphy()
2255 if (band > NL80211_BAND_5GHZ && !state->split) in nl80211_send_wiphy()
2258 sband = rdev->wiphy.bands[band]; in nl80211_send_wiphy()
2267 switch (state->chan_start) { in nl80211_send_wiphy()
2270 state->split)) in nl80211_send_wiphy()
2272 state->chan_start++; in nl80211_send_wiphy()
2273 if (state->split) in nl80211_send_wiphy()
2283 for (i = state->chan_start - 1; in nl80211_send_wiphy()
2284 i < sband->n_channels; in nl80211_send_wiphy()
2291 chan = &sband->channels[i]; in nl80211_send_wiphy()
2294 msg, &rdev->wiphy, chan, in nl80211_send_wiphy()
2295 state->split)) in nl80211_send_wiphy()
2299 if (state->split) in nl80211_send_wiphy()
2302 if (i < sband->n_channels) in nl80211_send_wiphy()
2303 state->chan_start = i + 2; in nl80211_send_wiphy()
2305 state->chan_start = 0; in nl80211_send_wiphy()
2311 if (state->split) { in nl80211_send_wiphy()
2313 if (state->chan_start) in nl80211_send_wiphy()
2314 band--; in nl80211_send_wiphy()
2321 state->band_start = band + 1; in nl80211_send_wiphy()
2323 state->band_start = 0; in nl80211_send_wiphy()
2326 if (state->band_start == 0 && state->chan_start == 0) in nl80211_send_wiphy()
2327 state->split_start++; in nl80211_send_wiphy()
2328 if (state->split) in nl80211_send_wiphy()
2340 if (state->split) { in nl80211_send_wiphy()
2343 if (rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH) in nl80211_send_wiphy()
2346 if (rdev->wiphy.features & in nl80211_send_wiphy()
2356 state->split_start++; in nl80211_send_wiphy()
2357 if (state->split) in nl80211_send_wiphy()
2361 if (rdev->ops->remain_on_channel && in nl80211_send_wiphy()
2362 (rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL) && in nl80211_send_wiphy()
2365 rdev->wiphy.max_remain_on_channel_duration)) in nl80211_send_wiphy()
2368 if ((rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX) && in nl80211_send_wiphy()
2372 state->split_start++; in nl80211_send_wiphy()
2373 if (state->split) in nl80211_send_wiphy()
2378 if (nl80211_send_wowlan(msg, rdev, state->split)) in nl80211_send_wiphy()
2380 state->split_start++; in nl80211_send_wiphy()
2381 if (state->split) in nl80211_send_wiphy()
2384 state->split_start++; in nl80211_send_wiphy()
2389 rdev->wiphy.software_iftypes)) in nl80211_send_wiphy()
2392 if (nl80211_put_iface_combinations(&rdev->wiphy, msg, in nl80211_send_wiphy()
2393 state->split)) in nl80211_send_wiphy()
2396 state->split_start++; in nl80211_send_wiphy()
2397 if (state->split) in nl80211_send_wiphy()
2401 if ((rdev->wiphy.flags & WIPHY_FLAG_HAVE_AP_SME) && in nl80211_send_wiphy()
2403 rdev->wiphy.ap_sme_capa)) in nl80211_send_wiphy()
2406 features = rdev->wiphy.features; in nl80211_send_wiphy()
2408 * We can only add the per-channel limit information if the in nl80211_send_wiphy()
2412 if (state->split) in nl80211_send_wiphy()
2417 if (rdev->wiphy.ht_capa_mod_mask && in nl80211_send_wiphy()
2419 sizeof(*rdev->wiphy.ht_capa_mod_mask), in nl80211_send_wiphy()
2420 rdev->wiphy.ht_capa_mod_mask)) in nl80211_send_wiphy()
2423 if (rdev->wiphy.flags & WIPHY_FLAG_HAVE_AP_SME && in nl80211_send_wiphy()
2424 rdev->wiphy.max_acl_mac_addrs && in nl80211_send_wiphy()
2426 rdev->wiphy.max_acl_mac_addrs)) in nl80211_send_wiphy()
2439 if (state->split) in nl80211_send_wiphy()
2440 state->split_start++; in nl80211_send_wiphy()
2442 state->split_start = 0; in nl80211_send_wiphy()
2449 rdev->wiphy.max_sched_scan_plans) || in nl80211_send_wiphy()
2451 rdev->wiphy.max_sched_scan_plan_interval) || in nl80211_send_wiphy()
2453 rdev->wiphy.max_sched_scan_plan_iterations)) in nl80211_send_wiphy()
2456 if (rdev->wiphy.extended_capabilities && in nl80211_send_wiphy()
2458 rdev->wiphy.extended_capabilities_len, in nl80211_send_wiphy()
2459 rdev->wiphy.extended_capabilities) || in nl80211_send_wiphy()
2461 rdev->wiphy.extended_capabilities_len, in nl80211_send_wiphy()
2462 rdev->wiphy.extended_capabilities_mask))) in nl80211_send_wiphy()
2465 if (rdev->wiphy.vht_capa_mod_mask && in nl80211_send_wiphy()
2467 sizeof(*rdev->wiphy.vht_capa_mod_mask), in nl80211_send_wiphy()
2468 rdev->wiphy.vht_capa_mod_mask)) in nl80211_send_wiphy()
2472 rdev->wiphy.perm_addr)) in nl80211_send_wiphy()
2475 if (!is_zero_ether_addr(rdev->wiphy.addr_mask) && in nl80211_send_wiphy()
2477 rdev->wiphy.addr_mask)) in nl80211_send_wiphy()
2480 if (rdev->wiphy.n_addresses > 1) { in nl80211_send_wiphy()
2487 for (i = 0; i < rdev->wiphy.n_addresses; i++) in nl80211_send_wiphy()
2489 rdev->wiphy.addresses[i].addr)) in nl80211_send_wiphy()
2495 state->split_start++; in nl80211_send_wiphy()
2501 if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_5_10_MHZ) && in nl80211_send_wiphy()
2506 if (rdev->wiphy.max_ap_assoc_sta && in nl80211_send_wiphy()
2508 rdev->wiphy.max_ap_assoc_sta)) in nl80211_send_wiphy()
2511 state->split_start++; in nl80211_send_wiphy()
2514 if (rdev->wiphy.n_vendor_commands) { in nl80211_send_wiphy()
2523 for (i = 0; i < rdev->wiphy.n_vendor_commands; i++) { in nl80211_send_wiphy()
2524 info = &rdev->wiphy.vendor_commands[i].info; in nl80211_send_wiphy()
2531 if (rdev->wiphy.n_vendor_events) { in nl80211_send_wiphy()
2540 for (i = 0; i < rdev->wiphy.n_vendor_events; i++) { in nl80211_send_wiphy()
2541 info = &rdev->wiphy.vendor_events[i]; in nl80211_send_wiphy()
2547 state->split_start++; in nl80211_send_wiphy()
2550 if (rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH && in nl80211_send_wiphy()
2552 rdev->wiphy.max_num_csa_counters)) in nl80211_send_wiphy()
2555 if (rdev->wiphy.regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED && in nl80211_send_wiphy()
2559 if (rdev->wiphy.max_sched_scan_reqs && in nl80211_send_wiphy()
2561 rdev->wiphy.max_sched_scan_reqs)) in nl80211_send_wiphy()
2565 sizeof(rdev->wiphy.ext_features), in nl80211_send_wiphy()
2566 rdev->wiphy.ext_features)) in nl80211_send_wiphy()
2569 if (rdev->wiphy.bss_select_support) { in nl80211_send_wiphy()
2571 u32 bss_select_support = rdev->wiphy.bss_select_support; in nl80211_send_wiphy()
2589 state->split_start++; in nl80211_send_wiphy()
2592 if (rdev->wiphy.num_iftype_ext_capab && in nl80211_send_wiphy()
2593 rdev->wiphy.iftype_ext_capab) { in nl80211_send_wiphy()
2601 for (i = state->capa_start; in nl80211_send_wiphy()
2602 i < rdev->wiphy.num_iftype_ext_capab; i++) { in nl80211_send_wiphy()
2605 capab = &rdev->wiphy.iftype_ext_capab[i]; in nl80211_send_wiphy()
2611 capab->iftype) || in nl80211_send_wiphy()
2613 capab->extended_capabilities_len, in nl80211_send_wiphy()
2614 capab->extended_capabilities) || in nl80211_send_wiphy()
2616 capab->extended_capabilities_len, in nl80211_send_wiphy()
2617 capab->extended_capabilities_mask)) in nl80211_send_wiphy()
2621 if (state->split) in nl80211_send_wiphy()
2625 if (i < rdev->wiphy.num_iftype_ext_capab) { in nl80211_send_wiphy()
2626 state->capa_start = i + 1; in nl80211_send_wiphy()
2632 rdev->wiphy.nan_supported_bands)) in nl80211_send_wiphy()
2635 if (wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_send_wiphy()
2647 rdev->wiphy.txq_limit)) in nl80211_send_wiphy()
2650 rdev->wiphy.txq_memory_limit)) in nl80211_send_wiphy()
2653 rdev->wiphy.txq_quantum)) in nl80211_send_wiphy()
2657 state->split_start++; in nl80211_send_wiphy()
2663 state->split_start++; in nl80211_send_wiphy()
2666 if (rdev->wiphy.akm_suites && in nl80211_send_wiphy()
2668 sizeof(u32) * rdev->wiphy.n_akm_suites, in nl80211_send_wiphy()
2669 rdev->wiphy.akm_suites)) in nl80211_send_wiphy()
2679 state->split_start = 0; in nl80211_send_wiphy()
2688 return -EMSGSIZE; in nl80211_send_wiphy()
2699 return -ENOMEM; in nl80211_dump_wiphy_parse()
2701 ret = nlmsg_parse_deprecated(cb->nlh, in nl80211_dump_wiphy_parse()
2711 state->split = tb[NL80211_ATTR_SPLIT_WIPHY_DUMP]; in nl80211_dump_wiphy_parse()
2713 state->filter_wiphy = nla_get_u32(tb[NL80211_ATTR_WIPHY]); in nl80211_dump_wiphy_parse()
2715 state->filter_wiphy = nla_get_u64(tb[NL80211_ATTR_WDEV]) >> 32; in nl80211_dump_wiphy_parse()
2721 netdev = __dev_get_by_index(sock_net(skb->sk), ifidx); in nl80211_dump_wiphy_parse()
2723 ret = -ENODEV; in nl80211_dump_wiphy_parse()
2726 if (netdev->ieee80211_ptr) { in nl80211_dump_wiphy_parse()
2728 netdev->ieee80211_ptr->wiphy); in nl80211_dump_wiphy_parse()
2729 state->filter_wiphy = rdev->wiphy_idx; in nl80211_dump_wiphy_parse()
2742 struct nl80211_dump_wiphy_state *state = (void *)cb->args[0]; in nl80211_dump_wiphy()
2750 return -ENOMEM; in nl80211_dump_wiphy()
2752 state->filter_wiphy = -1; in nl80211_dump_wiphy()
2759 cb->args[0] = (long)state; in nl80211_dump_wiphy()
2763 if (!net_eq(wiphy_net(&rdev->wiphy), sock_net(skb->sk))) in nl80211_dump_wiphy()
2765 if (++idx <= state->start) in nl80211_dump_wiphy()
2767 if (state->filter_wiphy != -1 && in nl80211_dump_wiphy()
2768 state->filter_wiphy != rdev->wiphy_idx) in nl80211_dump_wiphy()
2774 NETLINK_CB(cb->skb).portid, in nl80211_dump_wiphy()
2775 cb->nlh->nlmsg_seq, in nl80211_dump_wiphy()
2786 * This results in an empty message being RX'ed in nl80211_dump_wiphy()
2791 if ((ret == -ENOBUFS || ret == -EMSGSIZE) && in nl80211_dump_wiphy()
2792 !skb->len && !state->split && in nl80211_dump_wiphy()
2793 cb->min_dump_alloc < 4096) { in nl80211_dump_wiphy()
2794 cb->min_dump_alloc = 4096; in nl80211_dump_wiphy()
2795 state->split_start = 0; in nl80211_dump_wiphy()
2799 idx--; in nl80211_dump_wiphy()
2802 } while (state->split_start > 0); in nl80211_dump_wiphy()
2807 state->start = idx; in nl80211_dump_wiphy()
2809 return skb->len; in nl80211_dump_wiphy()
2814 kfree((void *)cb->args[0]); in nl80211_dump_wiphy_done()
2821 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_wiphy()
2826 return -ENOMEM; in nl80211_get_wiphy()
2829 info->snd_portid, info->snd_seq, 0, in nl80211_get_wiphy()
2832 return -ENOBUFS; in nl80211_get_wiphy()
2854 return -EINVAL; in parse_txq_params()
2857 txq_params->txop = nla_get_u16(tb[NL80211_TXQ_ATTR_TXOP]); in parse_txq_params()
2858 txq_params->cwmin = nla_get_u16(tb[NL80211_TXQ_ATTR_CWMIN]); in parse_txq_params()
2859 txq_params->cwmax = nla_get_u16(tb[NL80211_TXQ_ATTR_CWMAX]); in parse_txq_params()
2860 txq_params->aifs = nla_get_u8(tb[NL80211_TXQ_ATTR_AIFS]); in parse_txq_params()
2863 return -EINVAL; in parse_txq_params()
2864 txq_params->ac = array_index_nospec(ac, NL80211_NUM_ACS); in parse_txq_params()
2877 * low-level driver when the AP starts or the mesh is joined. in nl80211_can_set_dev_channel()
2879 * the channel in the start-ap or join-mesh commands instead. in nl80211_can_set_dev_channel()
2886 wdev->iftype == NL80211_IFTYPE_AP || in nl80211_can_set_dev_channel()
2887 wdev->iftype == NL80211_IFTYPE_MESH_POINT || in nl80211_can_set_dev_channel()
2888 wdev->iftype == NL80211_IFTYPE_MONITOR || in nl80211_can_set_dev_channel()
2889 wdev->iftype == NL80211_IFTYPE_P2P_GO; in nl80211_can_set_dev_channel()
2896 struct netlink_ext_ack *extack = info->extack; in nl80211_parse_chandef()
2897 struct nlattr **attrs = info->attrs; in nl80211_parse_chandef()
2901 return -EINVAL; in nl80211_parse_chandef()
2904 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ])); in nl80211_parse_chandef()
2905 if (info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]) in nl80211_parse_chandef()
2907 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]); in nl80211_parse_chandef()
2910 chandef->chan = ieee80211_get_channel_khz(&rdev->wiphy, control_freq); in nl80211_parse_chandef()
2911 chandef->width = NL80211_CHAN_WIDTH_20_NOHT; in nl80211_parse_chandef()
2912 chandef->center_freq1 = KHZ_TO_MHZ(control_freq); in nl80211_parse_chandef()
2913 chandef->freq1_offset = control_freq % 1000; in nl80211_parse_chandef()
2914 chandef->center_freq2 = 0; in nl80211_parse_chandef()
2917 if (!chandef->chan || chandef->chan->flags & IEEE80211_CHAN_DISABLED) { in nl80211_parse_chandef()
2920 return -EINVAL; in nl80211_parse_chandef()
2933 cfg80211_chandef_create(chandef, chandef->chan, in nl80211_parse_chandef()
2937 chandef->center_freq1 != nla_get_u32(attrs[NL80211_ATTR_CENTER_FREQ1])) { in nl80211_parse_chandef()
2941 return -EINVAL; in nl80211_parse_chandef()
2949 return -EINVAL; in nl80211_parse_chandef()
2956 return -EINVAL; in nl80211_parse_chandef()
2959 chandef->width = in nl80211_parse_chandef()
2961 if (chandef->chan->band == NL80211_BAND_S1GHZ) { in nl80211_parse_chandef()
2963 if (chandef->width != ieee80211_s1g_channel_width(chandef->chan)) { in nl80211_parse_chandef()
2967 return -EINVAL; in nl80211_parse_chandef()
2971 chandef->center_freq1 = in nl80211_parse_chandef()
2974 chandef->freq1_offset = nla_get_u32( in nl80211_parse_chandef()
2977 chandef->freq1_offset = 0; in nl80211_parse_chandef()
2980 chandef->center_freq2 = in nl80211_parse_chandef()
2984 if (info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]) { in nl80211_parse_chandef()
2985 chandef->edmg.channels = in nl80211_parse_chandef()
2986 nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]); in nl80211_parse_chandef()
2988 if (info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]) in nl80211_parse_chandef()
2989 chandef->edmg.bw_config = in nl80211_parse_chandef()
2990 nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]); in nl80211_parse_chandef()
2992 chandef->edmg.bw_config = 0; in nl80211_parse_chandef()
2993 chandef->edmg.channels = 0; in nl80211_parse_chandef()
2998 return -EINVAL; in nl80211_parse_chandef()
3001 if (!cfg80211_chandef_usable(&rdev->wiphy, chandef, in nl80211_parse_chandef()
3004 return -EINVAL; in nl80211_parse_chandef()
3007 if ((chandef->width == NL80211_CHAN_WIDTH_5 || in nl80211_parse_chandef()
3008 chandef->width == NL80211_CHAN_WIDTH_10) && in nl80211_parse_chandef()
3009 !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_5_10_MHZ)) { in nl80211_parse_chandef()
3011 return -EINVAL; in nl80211_parse_chandef()
3027 wdev = dev->ieee80211_ptr; in __nl80211_set_channel()
3029 return -EOPNOTSUPP; in __nl80211_set_channel()
3031 iftype = wdev->iftype; in __nl80211_set_channel()
3040 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &chandef, in __nl80211_set_channel()
3042 result = -EINVAL; in __nl80211_set_channel()
3045 if (wdev->beacon_interval) { in __nl80211_set_channel()
3046 if (!dev || !rdev->ops->set_ap_chanwidth || in __nl80211_set_channel()
3047 !(rdev->wiphy.features & in __nl80211_set_channel()
3049 result = -EBUSY; in __nl80211_set_channel()
3054 if (chandef.chan != wdev->preset_chandef.chan) { in __nl80211_set_channel()
3055 result = -EBUSY; in __nl80211_set_channel()
3062 wdev->preset_chandef = chandef; in __nl80211_set_channel()
3072 result = -EINVAL; in __nl80211_set_channel()
3080 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_channel()
3081 struct net_device *netdev = info->user_ptr[1]; in nl80211_set_channel()
3088 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_wds_peer()
3089 struct net_device *dev = info->user_ptr[1]; in nl80211_set_wds_peer()
3090 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_wds_peer()
3093 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_set_wds_peer()
3094 return -EINVAL; in nl80211_set_wds_peer()
3097 return -EBUSY; in nl80211_set_wds_peer()
3099 if (!rdev->ops->set_wds_peer) in nl80211_set_wds_peer()
3100 return -EOPNOTSUPP; in nl80211_set_wds_peer()
3102 if (wdev->iftype != NL80211_IFTYPE_WDS) in nl80211_set_wds_peer()
3103 return -EOPNOTSUPP; in nl80211_set_wds_peer()
3105 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_set_wds_peer()
3127 * done for backward compatibility -- previously in nl80211_set_wiphy()
3134 if (info->attrs[NL80211_ATTR_IFINDEX]) { in nl80211_set_wiphy()
3135 int ifindex = nla_get_u32(info->attrs[NL80211_ATTR_IFINDEX]); in nl80211_set_wiphy()
3138 if (netdev && netdev->ieee80211_ptr) in nl80211_set_wiphy()
3139 rdev = wiphy_to_rdev(netdev->ieee80211_ptr->wiphy); in nl80211_set_wiphy()
3146 info->attrs); in nl80211_set_wiphy()
3153 wdev = netdev->ieee80211_ptr; in nl80211_set_wiphy()
3160 if (info->attrs[NL80211_ATTR_WIPHY_NAME]) in nl80211_set_wiphy()
3162 rdev, nla_data(info->attrs[NL80211_ATTR_WIPHY_NAME])); in nl80211_set_wiphy()
3167 if (info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS]) { in nl80211_set_wiphy()
3171 if (!rdev->ops->set_txq_params) in nl80211_set_wiphy()
3172 return -EOPNOTSUPP; in nl80211_set_wiphy()
3175 return -EINVAL; in nl80211_set_wiphy()
3177 if (netdev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && in nl80211_set_wiphy()
3178 netdev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_set_wiphy()
3179 return -EINVAL; in nl80211_set_wiphy()
3182 return -ENETDOWN; in nl80211_set_wiphy()
3185 info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS], in nl80211_set_wiphy()
3191 info->extack); in nl80211_set_wiphy()
3205 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { in nl80211_set_wiphy()
3214 if (info->attrs[NL80211_ATTR_WIPHY_TX_POWER_SETTING]) { in nl80211_set_wiphy()
3219 if (!(rdev->wiphy.features & NL80211_FEATURE_VIF_TXPOWER)) in nl80211_set_wiphy()
3222 if (!rdev->ops->set_tx_power) in nl80211_set_wiphy()
3223 return -EOPNOTSUPP; in nl80211_set_wiphy()
3226 type = nla_get_u32(info->attrs[idx]); in nl80211_set_wiphy()
3228 if (!info->attrs[NL80211_ATTR_WIPHY_TX_POWER_LEVEL] && in nl80211_set_wiphy()
3230 return -EINVAL; in nl80211_set_wiphy()
3234 mbm = nla_get_u32(info->attrs[idx]); in nl80211_set_wiphy()
3242 if (info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX] && in nl80211_set_wiphy()
3243 info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]) { in nl80211_set_wiphy()
3246 if ((!rdev->wiphy.available_antennas_tx && in nl80211_set_wiphy()
3247 !rdev->wiphy.available_antennas_rx) || in nl80211_set_wiphy()
3248 !rdev->ops->set_antenna) in nl80211_set_wiphy()
3249 return -EOPNOTSUPP; in nl80211_set_wiphy()
3251 tx_ant = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX]); in nl80211_set_wiphy()
3252 rx_ant = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]); in nl80211_set_wiphy()
3256 if ((~tx_ant && (tx_ant & ~rdev->wiphy.available_antennas_tx)) || in nl80211_set_wiphy()
3257 (~rx_ant && (rx_ant & ~rdev->wiphy.available_antennas_rx))) in nl80211_set_wiphy()
3258 return -EINVAL; in nl80211_set_wiphy()
3260 tx_ant = tx_ant & rdev->wiphy.available_antennas_tx; in nl80211_set_wiphy()
3261 rx_ant = rx_ant & rdev->wiphy.available_antennas_rx; in nl80211_set_wiphy()
3270 if (info->attrs[NL80211_ATTR_WIPHY_RETRY_SHORT]) { in nl80211_set_wiphy()
3272 info->attrs[NL80211_ATTR_WIPHY_RETRY_SHORT]); in nl80211_set_wiphy()
3277 if (info->attrs[NL80211_ATTR_WIPHY_RETRY_LONG]) { in nl80211_set_wiphy()
3279 info->attrs[NL80211_ATTR_WIPHY_RETRY_LONG]); in nl80211_set_wiphy()
3284 if (info->attrs[NL80211_ATTR_WIPHY_FRAG_THRESHOLD]) { in nl80211_set_wiphy()
3286 info->attrs[NL80211_ATTR_WIPHY_FRAG_THRESHOLD]); in nl80211_set_wiphy()
3288 return -EINVAL; in nl80211_set_wiphy()
3290 if (frag_threshold != (u32) -1) { in nl80211_set_wiphy()
3302 if (info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]) { in nl80211_set_wiphy()
3304 info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]); in nl80211_set_wiphy()
3308 if (info->attrs[NL80211_ATTR_WIPHY_COVERAGE_CLASS]) { in nl80211_set_wiphy()
3309 if (info->attrs[NL80211_ATTR_WIPHY_DYN_ACK]) in nl80211_set_wiphy()
3310 return -EINVAL; in nl80211_set_wiphy()
3313 info->attrs[NL80211_ATTR_WIPHY_COVERAGE_CLASS]); in nl80211_set_wiphy()
3317 if (info->attrs[NL80211_ATTR_WIPHY_DYN_ACK]) { in nl80211_set_wiphy()
3318 if (!(rdev->wiphy.features & NL80211_FEATURE_ACKTO_ESTIMATION)) in nl80211_set_wiphy()
3319 return -EOPNOTSUPP; in nl80211_set_wiphy()
3324 if (info->attrs[NL80211_ATTR_TXQ_LIMIT]) { in nl80211_set_wiphy()
3325 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_set_wiphy()
3327 return -EOPNOTSUPP; in nl80211_set_wiphy()
3329 info->attrs[NL80211_ATTR_TXQ_LIMIT]); in nl80211_set_wiphy()
3333 if (info->attrs[NL80211_ATTR_TXQ_MEMORY_LIMIT]) { in nl80211_set_wiphy()
3334 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_set_wiphy()
3336 return -EOPNOTSUPP; in nl80211_set_wiphy()
3338 info->attrs[NL80211_ATTR_TXQ_MEMORY_LIMIT]); in nl80211_set_wiphy()
3342 if (info->attrs[NL80211_ATTR_TXQ_QUANTUM]) { in nl80211_set_wiphy()
3343 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_set_wiphy()
3345 return -EOPNOTSUPP; in nl80211_set_wiphy()
3347 info->attrs[NL80211_ATTR_TXQ_QUANTUM]); in nl80211_set_wiphy()
3357 if (!rdev->ops->set_wiphy_params) in nl80211_set_wiphy()
3358 return -EOPNOTSUPP; in nl80211_set_wiphy()
3360 old_retry_short = rdev->wiphy.retry_short; in nl80211_set_wiphy()
3361 old_retry_long = rdev->wiphy.retry_long; in nl80211_set_wiphy()
3362 old_frag_threshold = rdev->wiphy.frag_threshold; in nl80211_set_wiphy()
3363 old_rts_threshold = rdev->wiphy.rts_threshold; in nl80211_set_wiphy()
3364 old_coverage_class = rdev->wiphy.coverage_class; in nl80211_set_wiphy()
3365 old_txq_limit = rdev->wiphy.txq_limit; in nl80211_set_wiphy()
3366 old_txq_memory_limit = rdev->wiphy.txq_memory_limit; in nl80211_set_wiphy()
3367 old_txq_quantum = rdev->wiphy.txq_quantum; in nl80211_set_wiphy()
3370 rdev->wiphy.retry_short = retry_short; in nl80211_set_wiphy()
3372 rdev->wiphy.retry_long = retry_long; in nl80211_set_wiphy()
3374 rdev->wiphy.frag_threshold = frag_threshold; in nl80211_set_wiphy()
3376 rdev->wiphy.rts_threshold = rts_threshold; in nl80211_set_wiphy()
3378 rdev->wiphy.coverage_class = coverage_class; in nl80211_set_wiphy()
3380 rdev->wiphy.txq_limit = txq_limit; in nl80211_set_wiphy()
3382 rdev->wiphy.txq_memory_limit = txq_memory_limit; in nl80211_set_wiphy()
3384 rdev->wiphy.txq_quantum = txq_quantum; in nl80211_set_wiphy()
3388 rdev->wiphy.retry_short = old_retry_short; in nl80211_set_wiphy()
3389 rdev->wiphy.retry_long = old_retry_long; in nl80211_set_wiphy()
3390 rdev->wiphy.frag_threshold = old_frag_threshold; in nl80211_set_wiphy()
3391 rdev->wiphy.rts_threshold = old_rts_threshold; in nl80211_set_wiphy()
3392 rdev->wiphy.coverage_class = old_coverage_class; in nl80211_set_wiphy()
3393 rdev->wiphy.txq_limit = old_txq_limit; in nl80211_set_wiphy()
3394 rdev->wiphy.txq_memory_limit = old_txq_memory_limit; in nl80211_set_wiphy()
3395 rdev->wiphy.txq_quantum = old_txq_quantum; in nl80211_set_wiphy()
3406 return -EINVAL; in nl80211_send_chandef()
3409 chandef->chan->center_freq)) in nl80211_send_chandef()
3410 return -ENOBUFS; in nl80211_send_chandef()
3412 chandef->chan->freq_offset)) in nl80211_send_chandef()
3413 return -ENOBUFS; in nl80211_send_chandef()
3414 switch (chandef->width) { in nl80211_send_chandef()
3420 return -ENOBUFS; in nl80211_send_chandef()
3425 if (nla_put_u32(msg, NL80211_ATTR_CHANNEL_WIDTH, chandef->width)) in nl80211_send_chandef()
3426 return -ENOBUFS; in nl80211_send_chandef()
3427 if (nla_put_u32(msg, NL80211_ATTR_CENTER_FREQ1, chandef->center_freq1)) in nl80211_send_chandef()
3428 return -ENOBUFS; in nl80211_send_chandef()
3429 if (chandef->center_freq2 && in nl80211_send_chandef()
3430 nla_put_u32(msg, NL80211_ATTR_CENTER_FREQ2, chandef->center_freq2)) in nl80211_send_chandef()
3431 return -ENOBUFS; in nl80211_send_chandef()
3440 struct net_device *dev = wdev->netdev; in nl80211_send_iface()
3449 return -1; in nl80211_send_iface()
3452 (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in nl80211_send_iface()
3453 nla_put_string(msg, NL80211_ATTR_IFNAME, dev->name))) in nl80211_send_iface()
3456 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_iface()
3457 nla_put_u32(msg, NL80211_ATTR_IFTYPE, wdev->iftype) || in nl80211_send_iface()
3462 rdev->devlist_generation ^ in nl80211_send_iface()
3464 nla_put_u8(msg, NL80211_ATTR_4ADDR, wdev->use_4addr)) in nl80211_send_iface()
3467 if (rdev->ops->get_channel) { in nl80211_send_iface()
3478 if (rdev->ops->get_tx_power) { in nl80211_send_iface()
3489 switch (wdev->iftype) { in nl80211_send_iface()
3492 if (wdev->ssid_len && in nl80211_send_iface()
3493 nla_put(msg, NL80211_ATTR_SSID, wdev->ssid_len, wdev->ssid)) in nl80211_send_iface()
3500 if (!wdev->current_bss) in nl80211_send_iface()
3503 ssid_ie = ieee80211_bss_get_ie(&wdev->current_bss->pub, in nl80211_send_iface()
3517 if (rdev->ops->get_txq_stats) { in nl80211_send_iface()
3536 return -EMSGSIZE; in nl80211_send_iface()
3543 int wp_start = cb->args[0]; in nl80211_dump_interface()
3544 int if_start = cb->args[1]; in nl80211_dump_interface()
3545 int filter_wiphy = -1; in nl80211_dump_interface()
3551 if (!cb->args[2]) { in nl80211_dump_interface()
3553 .filter_wiphy = -1, in nl80211_dump_interface()
3563 * if filtering, set cb->args[2] to +1 since 0 is the default in nl80211_dump_interface()
3567 cb->args[2] = filter_wiphy + 1; in nl80211_dump_interface()
3569 cb->args[2] = -1; in nl80211_dump_interface()
3570 } else if (cb->args[2] > 0) { in nl80211_dump_interface()
3571 filter_wiphy = cb->args[2] - 1; in nl80211_dump_interface()
3575 if (!net_eq(wiphy_net(&rdev->wiphy), sock_net(skb->sk))) in nl80211_dump_interface()
3582 if (filter_wiphy >= 0 && filter_wiphy != rdev->wiphy_idx) in nl80211_dump_interface()
3587 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) { in nl80211_dump_interface()
3592 if (nl80211_send_iface(skb, NETLINK_CB(cb->skb).portid, in nl80211_dump_interface()
3593 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_dump_interface()
3604 cb->args[0] = wp_idx; in nl80211_dump_interface()
3605 cb->args[1] = if_idx; in nl80211_dump_interface()
3607 ret = skb->len; in nl80211_dump_interface()
3617 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_interface()
3618 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_get_interface()
3622 return -ENOMEM; in nl80211_get_interface()
3624 if (nl80211_send_iface(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_interface()
3627 return -ENOBUFS; in nl80211_get_interface()
3650 return -EINVAL; in parse_monitor_flags()
3653 return -EINVAL; in parse_monitor_flags()
3672 if (info->attrs[NL80211_ATTR_MNTR_FLAGS]) { in nl80211_parse_mon_options()
3674 return -EINVAL; in nl80211_parse_mon_options()
3676 err = parse_monitor_flags(info->attrs[NL80211_ATTR_MNTR_FLAGS], in nl80211_parse_mon_options()
3677 ¶ms->flags); in nl80211_parse_mon_options()
3684 if (params->flags & MONITOR_FLAG_ACTIVE && in nl80211_parse_mon_options()
3685 !(rdev->wiphy.features & NL80211_FEATURE_ACTIVE_MONITOR)) in nl80211_parse_mon_options()
3686 return -EOPNOTSUPP; in nl80211_parse_mon_options()
3688 if (info->attrs[NL80211_ATTR_MU_MIMO_GROUP_DATA]) { in nl80211_parse_mon_options()
3693 return -EINVAL; in nl80211_parse_mon_options()
3695 if (!wiphy_ext_feature_isset(&rdev->wiphy, cap_flag)) in nl80211_parse_mon_options()
3696 return -EOPNOTSUPP; in nl80211_parse_mon_options()
3699 nla_data(info->attrs[NL80211_ATTR_MU_MIMO_GROUP_DATA]); in nl80211_parse_mon_options()
3703 (mumimo_groups[VHT_MUMIMO_GROUPS_DATA_LEN - 1] & BIT(7))) in nl80211_parse_mon_options()
3704 return -EINVAL; in nl80211_parse_mon_options()
3706 params->vht_mumimo_groups = mumimo_groups; in nl80211_parse_mon_options()
3710 if (info->attrs[NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR]) { in nl80211_parse_mon_options()
3714 return -EINVAL; in nl80211_parse_mon_options()
3716 if (!wiphy_ext_feature_isset(&rdev->wiphy, cap_flag)) in nl80211_parse_mon_options()
3717 return -EOPNOTSUPP; in nl80211_parse_mon_options()
3719 params->vht_mumimo_follow_addr = in nl80211_parse_mon_options()
3720 nla_data(info->attrs[NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR]); in nl80211_parse_mon_options()
3733 return -EBUSY; in nl80211_valid_4addr()
3739 if (rdev->wiphy.flags & WIPHY_FLAG_4ADDR_AP) in nl80211_valid_4addr()
3743 if (rdev->wiphy.flags & WIPHY_FLAG_4ADDR_STATION) in nl80211_valid_4addr()
3750 return -EOPNOTSUPP; in nl80211_valid_4addr()
3755 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_interface()
3759 struct net_device *dev = info->user_ptr[1]; in nl80211_set_interface()
3764 otype = ntype = dev->ieee80211_ptr->iftype; in nl80211_set_interface()
3766 if (info->attrs[NL80211_ATTR_IFTYPE]) { in nl80211_set_interface()
3767 ntype = nla_get_u32(info->attrs[NL80211_ATTR_IFTYPE]); in nl80211_set_interface()
3772 if (info->attrs[NL80211_ATTR_MESH_ID]) { in nl80211_set_interface()
3773 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_interface()
3776 return -EINVAL; in nl80211_set_interface()
3778 return -EBUSY; in nl80211_set_interface()
3783 wdev->mesh_id_up_len = in nl80211_set_interface()
3784 nla_len(info->attrs[NL80211_ATTR_MESH_ID]); in nl80211_set_interface()
3785 memcpy(wdev->ssid, nla_data(info->attrs[NL80211_ATTR_MESH_ID]), in nl80211_set_interface()
3786 wdev->mesh_id_up_len); in nl80211_set_interface()
3790 if (info->attrs[NL80211_ATTR_4ADDR]) { in nl80211_set_interface()
3791 params.use_4addr = !!nla_get_u8(info->attrs[NL80211_ATTR_4ADDR]); in nl80211_set_interface()
3797 params.use_4addr = -1; in nl80211_set_interface()
3811 if (!err && params.use_4addr != -1) in nl80211_set_interface()
3812 dev->ieee80211_ptr->use_4addr = params.use_4addr; in nl80211_set_interface()
3815 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_interface()
3825 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_new_interface()
3837 if (!info->attrs[NL80211_ATTR_IFNAME]) in nl80211_new_interface()
3838 return -EINVAL; in nl80211_new_interface()
3840 if (info->attrs[NL80211_ATTR_IFTYPE]) in nl80211_new_interface()
3841 type = nla_get_u32(info->attrs[NL80211_ATTR_IFTYPE]); in nl80211_new_interface()
3843 if (!rdev->ops->add_virtual_intf) in nl80211_new_interface()
3844 return -EOPNOTSUPP; in nl80211_new_interface()
3847 rdev->wiphy.features & NL80211_FEATURE_MAC_ON_CREATE) && in nl80211_new_interface()
3848 info->attrs[NL80211_ATTR_MAC]) { in nl80211_new_interface()
3849 nla_memcpy(params.macaddr, info->attrs[NL80211_ATTR_MAC], in nl80211_new_interface()
3852 return -EADDRNOTAVAIL; in nl80211_new_interface()
3855 if (info->attrs[NL80211_ATTR_4ADDR]) { in nl80211_new_interface()
3856 params.use_4addr = !!nla_get_u8(info->attrs[NL80211_ATTR_4ADDR]); in nl80211_new_interface()
3862 if (!cfg80211_iftype_allowed(&rdev->wiphy, type, params.use_4addr, 0)) in nl80211_new_interface()
3863 return -EOPNOTSUPP; in nl80211_new_interface()
3871 return -ENOMEM; in nl80211_new_interface()
3874 nla_data(info->attrs[NL80211_ATTR_IFNAME]), in nl80211_new_interface()
3878 return -EPROTO; in nl80211_new_interface()
3884 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) in nl80211_new_interface()
3885 wdev->owner_nlportid = info->snd_portid; in nl80211_new_interface()
3889 if (!info->attrs[NL80211_ATTR_MESH_ID]) in nl80211_new_interface()
3894 wdev->mesh_id_up_len = in nl80211_new_interface()
3895 nla_len(info->attrs[NL80211_ATTR_MESH_ID]); in nl80211_new_interface()
3896 memcpy(wdev->ssid, nla_data(info->attrs[NL80211_ATTR_MESH_ID]), in nl80211_new_interface()
3897 wdev->mesh_id_up_len); in nl80211_new_interface()
3913 if (nl80211_send_iface(msg, info->snd_portid, info->snd_seq, 0, in nl80211_new_interface()
3916 return -ENOBUFS; in nl80211_new_interface()
3924 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_del_interface()
3925 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_del_interface()
3927 if (!rdev->ops->del_virtual_intf) in nl80211_del_interface()
3928 return -EOPNOTSUPP; in nl80211_del_interface()
3937 if (!wdev->netdev) in nl80211_del_interface()
3938 info->user_ptr[1] = NULL; in nl80211_del_interface()
3945 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_noack_map()
3946 struct net_device *dev = info->user_ptr[1]; in nl80211_set_noack_map()
3949 if (!info->attrs[NL80211_ATTR_NOACK_MAP]) in nl80211_set_noack_map()
3950 return -EINVAL; in nl80211_set_noack_map()
3952 if (!rdev->ops->set_noack_map) in nl80211_set_noack_map()
3953 return -EOPNOTSUPP; in nl80211_set_noack_map()
3955 noack_map = nla_get_u16(info->attrs[NL80211_ATTR_NOACK_MAP]); in nl80211_set_noack_map()
3971 if ((params->key && in get_key_callback()
3972 nla_put(cookie->msg, NL80211_ATTR_KEY_DATA, in get_key_callback()
3973 params->key_len, params->key)) || in get_key_callback()
3974 (params->seq && in get_key_callback()
3975 nla_put(cookie->msg, NL80211_ATTR_KEY_SEQ, in get_key_callback()
3976 params->seq_len, params->seq)) || in get_key_callback()
3977 (params->cipher && in get_key_callback()
3978 nla_put_u32(cookie->msg, NL80211_ATTR_KEY_CIPHER, in get_key_callback()
3979 params->cipher))) in get_key_callback()
3982 key = nla_nest_start_noflag(cookie->msg, NL80211_ATTR_KEY); in get_key_callback()
3986 if ((params->key && in get_key_callback()
3987 nla_put(cookie->msg, NL80211_KEY_DATA, in get_key_callback()
3988 params->key_len, params->key)) || in get_key_callback()
3989 (params->seq && in get_key_callback()
3990 nla_put(cookie->msg, NL80211_KEY_SEQ, in get_key_callback()
3991 params->seq_len, params->seq)) || in get_key_callback()
3992 (params->cipher && in get_key_callback()
3993 nla_put_u32(cookie->msg, NL80211_KEY_CIPHER, in get_key_callback()
3994 params->cipher))) in get_key_callback()
3997 if (nla_put_u8(cookie->msg, NL80211_KEY_IDX, cookie->idx)) in get_key_callback()
4000 nla_nest_end(cookie->msg, key); in get_key_callback()
4004 cookie->error = 1; in get_key_callback()
4009 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_key()
4011 struct net_device *dev = info->user_ptr[1]; in nl80211_get_key()
4022 if (wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_get_key()
4026 if ((dev->ieee80211_ptr->iftype == NL80211_IFTYPE_STATION || in nl80211_get_key()
4027 dev->ieee80211_ptr->iftype == NL80211_IFTYPE_P2P_CLIENT) && in nl80211_get_key()
4028 wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_get_key()
4032 if (info->attrs[NL80211_ATTR_KEY_IDX]) { in nl80211_get_key()
4033 key_idx = nla_get_u8(info->attrs[NL80211_ATTR_KEY_IDX]); in nl80211_get_key()
4037 return -EINVAL; in nl80211_get_key()
4041 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_get_key()
4042 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_get_key()
4045 if (info->attrs[NL80211_ATTR_KEY_TYPE]) { in nl80211_get_key()
4046 u32 kt = nla_get_u32(info->attrs[NL80211_ATTR_KEY_TYPE]); in nl80211_get_key()
4050 return -EINVAL; in nl80211_get_key()
4054 if (!rdev->ops->get_key) in nl80211_get_key()
4055 return -EOPNOTSUPP; in nl80211_get_key()
4057 if (!pairwise && mac_addr && !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN)) in nl80211_get_key()
4058 return -ENOENT; in nl80211_get_key()
4062 return -ENOMEM; in nl80211_get_key()
4064 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_key()
4072 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in nl80211_get_key()
4092 err = -ENOBUFS; in nl80211_get_key()
4100 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_key()
4103 struct net_device *dev = info->user_ptr[1]; in nl80211_set_key()
4110 return -EINVAL; in nl80211_set_key()
4117 return -EINVAL; in nl80211_set_key()
4119 wdev_lock(dev->ieee80211_ptr); in nl80211_set_key()
4122 if (!rdev->ops->set_default_key) { in nl80211_set_key()
4123 err = -EOPNOTSUPP; in nl80211_set_key()
4127 err = nl80211_key_allowed(dev->ieee80211_ptr); in nl80211_set_key()
4138 dev->ieee80211_ptr->wext.default_key = key.idx; in nl80211_set_key()
4142 err = -EINVAL; in nl80211_set_key()
4146 if (!rdev->ops->set_default_mgmt_key) { in nl80211_set_key()
4147 err = -EOPNOTSUPP; in nl80211_set_key()
4151 err = nl80211_key_allowed(dev->ieee80211_ptr); in nl80211_set_key()
4160 dev->ieee80211_ptr->wext.default_mgmt_key = key.idx; in nl80211_set_key()
4164 err = -EINVAL; in nl80211_set_key()
4168 if (!rdev->ops->set_default_beacon_key) { in nl80211_set_key()
4169 err = -EOPNOTSUPP; in nl80211_set_key()
4173 err = nl80211_key_allowed(dev->ieee80211_ptr); in nl80211_set_key()
4181 wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_set_key()
4185 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_set_key()
4186 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_set_key()
4189 err = -EINVAL; in nl80211_set_key()
4197 err = -EINVAL; in nl80211_set_key()
4200 wdev_unlock(dev->ieee80211_ptr); in nl80211_set_key()
4207 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_new_key()
4209 struct net_device *dev = info->user_ptr[1]; in nl80211_new_key()
4219 return -EINVAL; in nl80211_new_key()
4222 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_new_key()
4223 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_new_key()
4225 if (key.type == -1) { in nl80211_new_key()
4236 return -EINVAL; in nl80211_new_key()
4240 info->attrs[NL80211_ATTR_VLAN_ID]) in nl80211_new_key()
4241 key.p.vlan_id = nla_get_u16(info->attrs[NL80211_ATTR_VLAN_ID]); in nl80211_new_key()
4243 if (!rdev->ops->add_key) in nl80211_new_key()
4244 return -EOPNOTSUPP; in nl80211_new_key()
4250 return -EINVAL; in nl80211_new_key()
4253 wdev_lock(dev->ieee80211_ptr); in nl80211_new_key()
4254 err = nl80211_key_allowed(dev->ieee80211_ptr); in nl80211_new_key()
4264 wdev_unlock(dev->ieee80211_ptr); in nl80211_new_key()
4271 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_del_key()
4273 struct net_device *dev = info->user_ptr[1]; in nl80211_del_key()
4281 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_del_key()
4282 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_del_key()
4284 if (key.type == -1) { in nl80211_del_key()
4294 return -EINVAL; in nl80211_del_key()
4298 return -EINVAL; in nl80211_del_key()
4300 if (!rdev->ops->del_key) in nl80211_del_key()
4301 return -EOPNOTSUPP; in nl80211_del_key()
4303 wdev_lock(dev->ieee80211_ptr); in nl80211_del_key()
4304 err = nl80211_key_allowed(dev->ieee80211_ptr); in nl80211_del_key()
4307 !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN)) in nl80211_del_key()
4308 err = -ENOENT; in nl80211_del_key()
4317 if (key.idx == dev->ieee80211_ptr->wext.default_key) in nl80211_del_key()
4318 dev->ieee80211_ptr->wext.default_key = -1; in nl80211_del_key()
4319 else if (key.idx == dev->ieee80211_ptr->wext.default_mgmt_key) in nl80211_del_key()
4320 dev->ieee80211_ptr->wext.default_mgmt_key = -1; in nl80211_del_key()
4323 wdev_unlock(dev->ieee80211_ptr); in nl80211_del_key()
4336 return -EINVAL; in validate_acl_mac_addrs()
4357 if (!wiphy->max_acl_mac_addrs) in parse_acl_data()
4358 return ERR_PTR(-EOPNOTSUPP); in parse_acl_data()
4360 if (!info->attrs[NL80211_ATTR_ACL_POLICY]) in parse_acl_data()
4361 return ERR_PTR(-EINVAL); in parse_acl_data()
4363 acl_policy = nla_get_u32(info->attrs[NL80211_ATTR_ACL_POLICY]); in parse_acl_data()
4366 return ERR_PTR(-EINVAL); in parse_acl_data()
4368 if (!info->attrs[NL80211_ATTR_MAC_ADDRS]) in parse_acl_data()
4369 return ERR_PTR(-EINVAL); in parse_acl_data()
4371 n_entries = validate_acl_mac_addrs(info->attrs[NL80211_ATTR_MAC_ADDRS]); in parse_acl_data()
4375 if (n_entries > wiphy->max_acl_mac_addrs) in parse_acl_data()
4376 return ERR_PTR(-ENOTSUPP); in parse_acl_data()
4380 return ERR_PTR(-ENOMEM); in parse_acl_data()
4382 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_MAC_ADDRS], tmp) { in parse_acl_data()
4383 memcpy(acl->mac_addrs[i].addr, nla_data(attr), ETH_ALEN); in parse_acl_data()
4387 acl->n_acl_entries = n_entries; in parse_acl_data()
4388 acl->acl_policy = acl_policy; in parse_acl_data()
4395 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_mac_acl()
4396 struct net_device *dev = info->user_ptr[1]; in nl80211_set_mac_acl()
4400 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && in nl80211_set_mac_acl()
4401 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_set_mac_acl()
4402 return -EOPNOTSUPP; in nl80211_set_mac_acl()
4404 if (!dev->ieee80211_ptr->beacon_interval) in nl80211_set_mac_acl()
4405 return -EINVAL; in nl80211_set_mac_acl()
4407 acl = parse_acl_data(&rdev->wiphy, info); in nl80211_set_mac_acl()
4428 for (ridx = 0; ridx < sband->n_bitrates; ridx++) { in rateset_to_mask()
4430 &sband->bitrates[ridx]; in rateset_to_mask()
4431 if (rate == srate->bitrate) { in rateset_to_mask()
4436 if (ridx == sband->n_bitrates) in rateset_to_mask()
4463 if (sband->ht_cap.mcs.rx_mask[ridx] & rbit) in ht_rateset_to_mask()
4510 u16 tx_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map); in vht_set_mcs_mask()
4514 if (!sband->vht_cap.vht_supported) in vht_set_mcs_mask()
4523 if ((tx_mcs_mask[i] & txrate->mcs[i]) == txrate->mcs[i]) in vht_set_mcs_mask()
4524 mcs[i] = txrate->mcs[i]; in vht_set_mcs_mask()
4563 struct net_device *dev = info->user_ptr[1]; in he_get_txmcsmap()
4564 struct wireless_dev *wdev = dev->ieee80211_ptr; in he_get_txmcsmap()
4567 switch (wdev->chandef.width) { in he_get_txmcsmap()
4569 tx_mcs = he_cap->he_mcs_nss_supp.tx_mcs_80p80; in he_get_txmcsmap()
4572 tx_mcs = he_cap->he_mcs_nss_supp.tx_mcs_160; in he_get_txmcsmap()
4575 tx_mcs = he_cap->he_mcs_nss_supp.tx_mcs_80; in he_get_txmcsmap()
4592 he_cap = ieee80211_get_he_iftype_cap(sband, wdev->iftype); in he_set_mcs_mask()
4604 if ((tx_mcs_mask[i] & txrate->mcs[i]) == txrate->mcs[i]) in he_set_mcs_mask()
4605 mcs[i] = txrate->mcs[i]; in he_set_mcs_mask()
4620 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_parse_tx_bitrate_mask()
4621 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_parse_tx_bitrate_mask()
4632 sband = rdev->wiphy.bands[i]; in nl80211_parse_tx_bitrate_mask()
4637 mask->control[i].legacy = (1 << sband->n_bitrates) - 1; in nl80211_parse_tx_bitrate_mask()
4638 memcpy(mask->control[i].ht_mcs, in nl80211_parse_tx_bitrate_mask()
4639 sband->ht_cap.mcs.rx_mask, in nl80211_parse_tx_bitrate_mask()
4640 sizeof(mask->control[i].ht_mcs)); in nl80211_parse_tx_bitrate_mask()
4642 if (sband->vht_cap.vht_supported) { in nl80211_parse_tx_bitrate_mask()
4643 vht_tx_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map); in nl80211_parse_tx_bitrate_mask()
4644 vht_build_mcs_mask(vht_tx_mcs_map, mask->control[i].vht_mcs); in nl80211_parse_tx_bitrate_mask()
4647 he_cap = ieee80211_get_he_iftype_cap(sband, wdev->iftype); in nl80211_parse_tx_bitrate_mask()
4652 he_build_mcs_mask(he_tx_mcs_map, mask->control[i].he_mcs); in nl80211_parse_tx_bitrate_mask()
4654 mask->control[i].he_gi = 0xFF; in nl80211_parse_tx_bitrate_mask()
4655 mask->control[i].he_ltf = 0xFF; in nl80211_parse_tx_bitrate_mask()
4671 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
4672 sband = rdev->wiphy.bands[band]; in nl80211_parse_tx_bitrate_mask()
4674 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
4678 info->extack); in nl80211_parse_tx_bitrate_mask()
4682 mask->control[band].legacy = rateset_to_mask( in nl80211_parse_tx_bitrate_mask()
4686 if ((mask->control[band].legacy == 0) && in nl80211_parse_tx_bitrate_mask()
4688 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
4695 mask->control[band].ht_mcs)) in nl80211_parse_tx_bitrate_mask()
4696 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
4702 mask->control[band].vht_mcs)) in nl80211_parse_tx_bitrate_mask()
4703 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
4706 mask->control[band].gi = in nl80211_parse_tx_bitrate_mask()
4708 if (mask->control[band].gi > NL80211_TXRATE_FORCE_LGI) in nl80211_parse_tx_bitrate_mask()
4709 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
4714 mask->control[band].he_mcs)) in nl80211_parse_tx_bitrate_mask()
4715 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
4717 mask->control[band].he_gi = in nl80211_parse_tx_bitrate_mask()
4720 mask->control[band].he_ltf = in nl80211_parse_tx_bitrate_mask()
4723 if (mask->control[band].legacy == 0) { in nl80211_parse_tx_bitrate_mask()
4727 if (!(rdev->wiphy.bands[band]->ht_cap.ht_supported || in nl80211_parse_tx_bitrate_mask()
4728 rdev->wiphy.bands[band]->vht_cap.vht_supported || in nl80211_parse_tx_bitrate_mask()
4729 ieee80211_get_he_iftype_cap(sband, wdev->iftype))) in nl80211_parse_tx_bitrate_mask()
4730 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
4733 if (mask->control[band].ht_mcs[i]) in nl80211_parse_tx_bitrate_mask()
4737 if (mask->control[band].vht_mcs[i]) in nl80211_parse_tx_bitrate_mask()
4741 if (mask->control[band].he_mcs[i]) in nl80211_parse_tx_bitrate_mask()
4745 return -EINVAL; in nl80211_parse_tx_bitrate_mask()
4758 u32 rate = beacon_rate->control[band].legacy; in validate_beacon_tx_rate()
4762 return -EINVAL; in validate_beacon_tx_rate()
4766 if (hweight8(beacon_rate->control[band].ht_mcs[i]) > 1) { in validate_beacon_tx_rate()
4767 return -EINVAL; in validate_beacon_tx_rate()
4768 } else if (beacon_rate->control[band].ht_mcs[i]) { in validate_beacon_tx_rate()
4771 return -EINVAL; in validate_beacon_tx_rate()
4774 return -EINVAL; in validate_beacon_tx_rate()
4779 if (hweight16(beacon_rate->control[band].vht_mcs[i]) > 1) { in validate_beacon_tx_rate()
4780 return -EINVAL; in validate_beacon_tx_rate()
4781 } else if (beacon_rate->control[band].vht_mcs[i]) { in validate_beacon_tx_rate()
4784 return -EINVAL; in validate_beacon_tx_rate()
4787 return -EINVAL; in validate_beacon_tx_rate()
4791 return -EINVAL; in validate_beacon_tx_rate()
4794 !wiphy_ext_feature_isset(&rdev->wiphy, in validate_beacon_tx_rate()
4796 return -EINVAL; in validate_beacon_tx_rate()
4798 !wiphy_ext_feature_isset(&rdev->wiphy, in validate_beacon_tx_rate()
4800 return -EINVAL; in validate_beacon_tx_rate()
4802 !wiphy_ext_feature_isset(&rdev->wiphy, in validate_beacon_tx_rate()
4804 return -EINVAL; in validate_beacon_tx_rate()
4819 bcn->head = nla_data(attrs[NL80211_ATTR_BEACON_HEAD]); in nl80211_parse_beacon()
4820 bcn->head_len = nla_len(attrs[NL80211_ATTR_BEACON_HEAD]); in nl80211_parse_beacon()
4821 if (!bcn->head_len) in nl80211_parse_beacon()
4822 return -EINVAL; in nl80211_parse_beacon()
4827 bcn->tail = nla_data(attrs[NL80211_ATTR_BEACON_TAIL]); in nl80211_parse_beacon()
4828 bcn->tail_len = nla_len(attrs[NL80211_ATTR_BEACON_TAIL]); in nl80211_parse_beacon()
4833 return -EINVAL; in nl80211_parse_beacon()
4836 bcn->beacon_ies = nla_data(attrs[NL80211_ATTR_IE]); in nl80211_parse_beacon()
4837 bcn->beacon_ies_len = nla_len(attrs[NL80211_ATTR_IE]); in nl80211_parse_beacon()
4841 bcn->proberesp_ies = in nl80211_parse_beacon()
4843 bcn->proberesp_ies_len = in nl80211_parse_beacon()
4848 bcn->assocresp_ies = in nl80211_parse_beacon()
4850 bcn->assocresp_ies_len = in nl80211_parse_beacon()
4855 bcn->probe_resp = nla_data(attrs[NL80211_ATTR_PROBE_RESP]); in nl80211_parse_beacon()
4856 bcn->probe_resp_len = nla_len(attrs[NL80211_ATTR_PROBE_RESP]); in nl80211_parse_beacon()
4870 wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_parse_beacon()
4872 bcn->ftm_responder = 1; in nl80211_parse_beacon()
4874 return -EOPNOTSUPP; in nl80211_parse_beacon()
4877 bcn->lci = nla_data(tb[NL80211_FTM_RESP_ATTR_LCI]); in nl80211_parse_beacon()
4878 bcn->lci_len = nla_len(tb[NL80211_FTM_RESP_ATTR_LCI]); in nl80211_parse_beacon()
4882 bcn->civicloc = nla_data(tb[NL80211_FTM_RESP_ATTR_CIVICLOC]); in nl80211_parse_beacon()
4883 bcn->civicloc_len = nla_len(tb[NL80211_FTM_RESP_ATTR_CIVICLOC]); in nl80211_parse_beacon()
4886 bcn->ftm_responder = -1; in nl80211_parse_beacon()
4904 return -EINVAL; in nl80211_parse_he_obss_pd()
4906 he_obss_pd->sr_ctrl = nla_get_u8(tb[NL80211_HE_OBSS_PD_ATTR_SR_CTRL]); in nl80211_parse_he_obss_pd()
4909 he_obss_pd->min_offset = in nl80211_parse_he_obss_pd()
4912 he_obss_pd->max_offset = in nl80211_parse_he_obss_pd()
4915 he_obss_pd->non_srg_max_offset = in nl80211_parse_he_obss_pd()
4918 if (he_obss_pd->min_offset > he_obss_pd->max_offset) in nl80211_parse_he_obss_pd()
4919 return -EINVAL; in nl80211_parse_he_obss_pd()
4922 memcpy(he_obss_pd->bss_color_bitmap, in nl80211_parse_he_obss_pd()
4924 sizeof(he_obss_pd->bss_color_bitmap)); in nl80211_parse_he_obss_pd()
4927 memcpy(he_obss_pd->partial_bssid_bitmap, in nl80211_parse_he_obss_pd()
4929 sizeof(he_obss_pd->partial_bssid_bitmap)); in nl80211_parse_he_obss_pd()
4931 he_obss_pd->enable = true; in nl80211_parse_he_obss_pd()
4948 return -EINVAL; in nl80211_parse_he_bss_color()
4950 he_bss_color->color = in nl80211_parse_he_bss_color()
4952 he_bss_color->enabled = in nl80211_parse_he_bss_color()
4954 he_bss_color->partial = in nl80211_parse_he_bss_color()
4966 struct cfg80211_fils_discovery *fd = ¶ms->fils_discovery; in nl80211_parse_fils_discovery()
4968 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_parse_fils_discovery()
4970 return -EINVAL; in nl80211_parse_fils_discovery()
4980 return -EINVAL; in nl80211_parse_fils_discovery()
4982 fd->tmpl_len = nla_len(tb[NL80211_FILS_DISCOVERY_ATTR_TMPL]); in nl80211_parse_fils_discovery()
4983 fd->tmpl = nla_data(tb[NL80211_FILS_DISCOVERY_ATTR_TMPL]); in nl80211_parse_fils_discovery()
4984 fd->min_interval = nla_get_u32(tb[NL80211_FILS_DISCOVERY_ATTR_INT_MIN]); in nl80211_parse_fils_discovery()
4985 fd->max_interval = nla_get_u32(tb[NL80211_FILS_DISCOVERY_ATTR_INT_MAX]); in nl80211_parse_fils_discovery()
4998 ¶ms->unsol_bcast_probe_resp; in nl80211_parse_unsol_bcast_probe_resp()
5000 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_parse_unsol_bcast_probe_resp()
5002 return -EINVAL; in nl80211_parse_unsol_bcast_probe_resp()
5011 return -EINVAL; in nl80211_parse_unsol_bcast_probe_resp()
5013 presp->tmpl = nla_data(tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_TMPL]); in nl80211_parse_unsol_bcast_probe_resp()
5014 presp->tmpl_len = nla_len(tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_TMPL]); in nl80211_parse_unsol_bcast_probe_resp()
5015 presp->interval = nla_get_u32(tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_INT]); in nl80211_parse_unsol_bcast_probe_resp()
5029 params->ht_required = true; in nl80211_check_ap_rate_selectors()
5031 params->vht_required = true; in nl80211_check_ap_rate_selectors()
5033 params->he_required = true; in nl80211_check_ap_rate_selectors()
5044 const struct cfg80211_beacon_data *bcn = ¶ms->beacon; in nl80211_calculate_ap_params()
5045 size_t ies_len = bcn->tail_len; in nl80211_calculate_ap_params()
5046 const u8 *ies = bcn->tail; in nl80211_calculate_ap_params()
5057 if (cap && cap[1] >= sizeof(*params->ht_cap)) in nl80211_calculate_ap_params()
5058 params->ht_cap = (void *)(cap + 2); in nl80211_calculate_ap_params()
5060 if (cap && cap[1] >= sizeof(*params->vht_cap)) in nl80211_calculate_ap_params()
5061 params->vht_cap = (void *)(cap + 2); in nl80211_calculate_ap_params()
5063 if (cap && cap[1] >= sizeof(*params->he_cap) + 1) in nl80211_calculate_ap_params()
5064 params->he_cap = (void *)(cap + 3); in nl80211_calculate_ap_params()
5066 if (cap && cap[1] >= sizeof(*params->he_oper) + 1) in nl80211_calculate_ap_params()
5067 params->he_oper = (void *)(cap + 3); in nl80211_calculate_ap_params()
5076 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) { in nl80211_get_ap_channel()
5077 if (wdev->iftype != NL80211_IFTYPE_AP && in nl80211_get_ap_channel()
5078 wdev->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_get_ap_channel()
5081 if (!wdev->preset_chandef.chan) in nl80211_get_ap_channel()
5084 params->chandef = wdev->preset_chandef; in nl80211_get_ap_channel()
5101 if (!(rdev->wiphy.features & NL80211_FEATURE_SAE) && in nl80211_valid_auth_type()
5104 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_valid_auth_type()
5112 if (!(rdev->wiphy.features & NL80211_FEATURE_SAE) && in nl80211_valid_auth_type()
5113 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_valid_auth_type()
5123 &rdev->wiphy, in nl80211_valid_auth_type()
5129 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_valid_auth_type()
5146 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_start_ap()
5147 struct net_device *dev = info->user_ptr[1]; in nl80211_start_ap()
5148 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_start_ap()
5152 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && in nl80211_start_ap()
5153 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_start_ap()
5154 return -EOPNOTSUPP; in nl80211_start_ap()
5156 if (!rdev->ops->start_ap) in nl80211_start_ap()
5157 return -EOPNOTSUPP; in nl80211_start_ap()
5159 if (wdev->beacon_interval) in nl80211_start_ap()
5160 return -EALREADY; in nl80211_start_ap()
5165 if (!info->attrs[NL80211_ATTR_BEACON_INTERVAL] || in nl80211_start_ap()
5166 !info->attrs[NL80211_ATTR_DTIM_PERIOD] || in nl80211_start_ap()
5167 !info->attrs[NL80211_ATTR_BEACON_HEAD]) in nl80211_start_ap()
5168 return -EINVAL; in nl80211_start_ap()
5170 err = nl80211_parse_beacon(rdev, info->attrs, ¶ms.beacon); in nl80211_start_ap()
5175 nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]); in nl80211_start_ap()
5177 nla_get_u32(info->attrs[NL80211_ATTR_DTIM_PERIOD]); in nl80211_start_ap()
5179 err = cfg80211_validate_beacon_int(rdev, dev->ieee80211_ptr->iftype, in nl80211_start_ap()
5189 * additional information -- drivers must check! in nl80211_start_ap()
5191 if (info->attrs[NL80211_ATTR_SSID]) { in nl80211_start_ap()
5192 params.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); in nl80211_start_ap()
5194 nla_len(info->attrs[NL80211_ATTR_SSID]); in nl80211_start_ap()
5196 return -EINVAL; in nl80211_start_ap()
5199 if (info->attrs[NL80211_ATTR_HIDDEN_SSID]) in nl80211_start_ap()
5201 info->attrs[NL80211_ATTR_HIDDEN_SSID]); in nl80211_start_ap()
5203 params.privacy = !!info->attrs[NL80211_ATTR_PRIVACY]; in nl80211_start_ap()
5205 if (info->attrs[NL80211_ATTR_AUTH_TYPE]) { in nl80211_start_ap()
5207 info->attrs[NL80211_ATTR_AUTH_TYPE]); in nl80211_start_ap()
5210 return -EINVAL; in nl80211_start_ap()
5219 if (info->attrs[NL80211_ATTR_INACTIVITY_TIMEOUT]) { in nl80211_start_ap()
5220 if (!(rdev->wiphy.features & NL80211_FEATURE_INACTIVITY_TIMER)) in nl80211_start_ap()
5221 return -EOPNOTSUPP; in nl80211_start_ap()
5223 info->attrs[NL80211_ATTR_INACTIVITY_TIMEOUT]); in nl80211_start_ap()
5226 if (info->attrs[NL80211_ATTR_P2P_CTWINDOW]) { in nl80211_start_ap()
5227 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_start_ap()
5228 return -EINVAL; in nl80211_start_ap()
5230 nla_get_u8(info->attrs[NL80211_ATTR_P2P_CTWINDOW]); in nl80211_start_ap()
5232 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_CTWIN)) in nl80211_start_ap()
5233 return -EINVAL; in nl80211_start_ap()
5236 if (info->attrs[NL80211_ATTR_P2P_OPPPS]) { in nl80211_start_ap()
5239 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_start_ap()
5240 return -EINVAL; in nl80211_start_ap()
5241 tmp = nla_get_u8(info->attrs[NL80211_ATTR_P2P_OPPPS]); in nl80211_start_ap()
5244 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_OPPPS)) in nl80211_start_ap()
5245 return -EINVAL; in nl80211_start_ap()
5248 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { in nl80211_start_ap()
5252 } else if (wdev->preset_chandef.chan) { in nl80211_start_ap()
5253 params.chandef = wdev->preset_chandef; in nl80211_start_ap()
5255 return -EINVAL; in nl80211_start_ap()
5257 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, ¶ms.chandef, in nl80211_start_ap()
5258 wdev->iftype)) in nl80211_start_ap()
5259 return -EINVAL; in nl80211_start_ap()
5261 if (info->attrs[NL80211_ATTR_TX_RATES]) { in nl80211_start_ap()
5262 err = nl80211_parse_tx_bitrate_mask(info, info->attrs, in nl80211_start_ap()
5269 err = validate_beacon_tx_rate(rdev, params.chandef.chan->band, in nl80211_start_ap()
5275 if (info->attrs[NL80211_ATTR_SMPS_MODE]) { in nl80211_start_ap()
5277 nla_get_u8(info->attrs[NL80211_ATTR_SMPS_MODE]); in nl80211_start_ap()
5282 if (!(rdev->wiphy.features & in nl80211_start_ap()
5284 return -EINVAL; in nl80211_start_ap()
5287 if (!(rdev->wiphy.features & in nl80211_start_ap()
5289 return -EINVAL; in nl80211_start_ap()
5292 return -EINVAL; in nl80211_start_ap()
5298 params.pbss = nla_get_flag(info->attrs[NL80211_ATTR_PBSS]); in nl80211_start_ap()
5299 if (params.pbss && !rdev->wiphy.bands[NL80211_BAND_60GHZ]) in nl80211_start_ap()
5300 return -EOPNOTSUPP; in nl80211_start_ap()
5302 if (info->attrs[NL80211_ATTR_ACL_POLICY]) { in nl80211_start_ap()
5303 params.acl = parse_acl_data(&rdev->wiphy, info); in nl80211_start_ap()
5309 nla_get_flag(info->attrs[NL80211_ATTR_TWT_RESPONDER]); in nl80211_start_ap()
5311 if (info->attrs[NL80211_ATTR_HE_OBSS_PD]) { in nl80211_start_ap()
5313 info->attrs[NL80211_ATTR_HE_OBSS_PD], in nl80211_start_ap()
5319 if (info->attrs[NL80211_ATTR_HE_BSS_COLOR]) { in nl80211_start_ap()
5321 info->attrs[NL80211_ATTR_HE_BSS_COLOR], in nl80211_start_ap()
5327 if (info->attrs[NL80211_ATTR_FILS_DISCOVERY]) { in nl80211_start_ap()
5329 info->attrs[NL80211_ATTR_FILS_DISCOVERY], in nl80211_start_ap()
5335 if (info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP]) { in nl80211_start_ap()
5337 rdev, info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP], in nl80211_start_ap()
5345 if (info->attrs[NL80211_ATTR_EXTERNAL_AUTH_SUPPORT]) in nl80211_start_ap()
5351 wdev->preset_chandef = params.chandef; in nl80211_start_ap()
5352 wdev->beacon_interval = params.beacon_interval; in nl80211_start_ap()
5353 wdev->chandef = params.chandef; in nl80211_start_ap()
5354 wdev->ssid_len = params.ssid_len; in nl80211_start_ap()
5355 memcpy(wdev->ssid, params.ssid, wdev->ssid_len); in nl80211_start_ap()
5357 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) in nl80211_start_ap()
5358 wdev->conn_owner_nlportid = info->snd_portid; in nl80211_start_ap()
5370 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_beacon()
5371 struct net_device *dev = info->user_ptr[1]; in nl80211_set_beacon()
5372 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_beacon()
5376 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && in nl80211_set_beacon()
5377 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_set_beacon()
5378 return -EOPNOTSUPP; in nl80211_set_beacon()
5380 if (!rdev->ops->change_beacon) in nl80211_set_beacon()
5381 return -EOPNOTSUPP; in nl80211_set_beacon()
5383 if (!wdev->beacon_interval) in nl80211_set_beacon()
5384 return -EINVAL; in nl80211_set_beacon()
5386 err = nl80211_parse_beacon(rdev, info->attrs, ¶ms); in nl80211_set_beacon()
5399 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_stop_ap()
5400 struct net_device *dev = info->user_ptr[1]; in nl80211_stop_ap()
5426 nla = info->attrs[NL80211_ATTR_STA_FLAGS2]; in parse_station_flags()
5431 params->sta_flags_mask = sta_flags->mask; in parse_station_flags()
5432 params->sta_flags_set = sta_flags->set; in parse_station_flags()
5433 params->sta_flags_set &= params->sta_flags_mask; in parse_station_flags()
5434 if ((params->sta_flags_mask | in parse_station_flags()
5435 params->sta_flags_set) & BIT(__NL80211_STA_FLAG_INVALID)) in parse_station_flags()
5436 return -EINVAL; in parse_station_flags()
5442 nla = info->attrs[NL80211_ATTR_STA_FLAGS]; in parse_station_flags()
5446 if (nla_parse_nested_deprecated(flags, NL80211_STA_FLAG_MAX, nla, sta_flags_policy, info->extack)) in parse_station_flags()
5447 return -EINVAL; in parse_station_flags()
5459 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHORIZED) | in parse_station_flags()
5466 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHORIZED) | in parse_station_flags()
5470 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHENTICATED) | in parse_station_flags()
5475 return -EINVAL; in parse_station_flags()
5480 params->sta_flags_set |= (1<<flag); in parse_station_flags()
5484 return -EINVAL; in parse_station_flags()
5504 /* report 16-bit bitrate only if we can */ in nl80211_put_sta_rate()
5513 switch (info->bw) { in nl80211_put_sta_rate()
5537 WARN_ON(!(info->flags & RATE_INFO_FLAGS_HE_MCS)); in nl80211_put_sta_rate()
5543 if (info->flags & RATE_INFO_FLAGS_MCS) { in nl80211_put_sta_rate()
5544 if (nla_put_u8(msg, NL80211_RATE_INFO_MCS, info->mcs)) in nl80211_put_sta_rate()
5546 if (info->flags & RATE_INFO_FLAGS_SHORT_GI && in nl80211_put_sta_rate()
5549 } else if (info->flags & RATE_INFO_FLAGS_VHT_MCS) { in nl80211_put_sta_rate()
5550 if (nla_put_u8(msg, NL80211_RATE_INFO_VHT_MCS, info->mcs)) in nl80211_put_sta_rate()
5552 if (nla_put_u8(msg, NL80211_RATE_INFO_VHT_NSS, info->nss)) in nl80211_put_sta_rate()
5554 if (info->flags & RATE_INFO_FLAGS_SHORT_GI && in nl80211_put_sta_rate()
5557 } else if (info->flags & RATE_INFO_FLAGS_HE_MCS) { in nl80211_put_sta_rate()
5558 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_MCS, info->mcs)) in nl80211_put_sta_rate()
5560 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_NSS, info->nss)) in nl80211_put_sta_rate()
5562 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_GI, info->he_gi)) in nl80211_put_sta_rate()
5564 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_DCM, info->he_dcm)) in nl80211_put_sta_rate()
5566 if (info->bw == RATE_INFO_BW_HE_RU && in nl80211_put_sta_rate()
5568 info->he_ru_alloc)) in nl80211_put_sta_rate()
5614 return -1; in nl80211_send_station()
5617 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in nl80211_send_station()
5619 nla_put_u32(msg, NL80211_ATTR_GENERATION, sinfo->generation)) in nl80211_send_station()
5628 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_ ## attr) && \ in nl80211_send_station()
5630 sinfo->memb)) \ in nl80211_send_station()
5634 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_ ## attr) && \ in nl80211_send_station()
5636 sinfo->memb, NL80211_STA_INFO_PAD)) \ in nl80211_send_station()
5644 if (sinfo->filled & (BIT_ULL(NL80211_STA_INFO_RX_BYTES) | in nl80211_send_station()
5647 (u32)sinfo->rx_bytes)) in nl80211_send_station()
5650 if (sinfo->filled & (BIT_ULL(NL80211_STA_INFO_TX_BYTES) | in nl80211_send_station()
5653 (u32)sinfo->tx_bytes)) in nl80211_send_station()
5664 if (wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_send_station()
5668 switch (rdev->wiphy.signal_type) { in nl80211_send_station()
5676 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL)) { in nl80211_send_station()
5677 if (!nl80211_put_signal(msg, sinfo->chains, in nl80211_send_station()
5678 sinfo->chain_signal, in nl80211_send_station()
5682 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL_AVG)) { in nl80211_send_station()
5683 if (!nl80211_put_signal(msg, sinfo->chains, in nl80211_send_station()
5684 sinfo->chain_signal_avg, in nl80211_send_station()
5688 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_TX_BITRATE)) { in nl80211_send_station()
5689 if (!nl80211_put_sta_rate(msg, &sinfo->txrate, in nl80211_send_station()
5693 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_RX_BITRATE)) { in nl80211_send_station()
5694 if (!nl80211_put_sta_rate(msg, &sinfo->rxrate, in nl80211_send_station()
5712 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_BSS_PARAM)) { in nl80211_send_station()
5718 if (((sinfo->bss_param.flags & BSS_PARAM_FLAGS_CTS_PROT) && in nl80211_send_station()
5720 ((sinfo->bss_param.flags & BSS_PARAM_FLAGS_SHORT_PREAMBLE) && in nl80211_send_station()
5722 ((sinfo->bss_param.flags & BSS_PARAM_FLAGS_SHORT_SLOT_TIME) && in nl80211_send_station()
5725 sinfo->bss_param.dtim_period) || in nl80211_send_station()
5727 sinfo->bss_param.beacon_interval)) in nl80211_send_station()
5732 if ((sinfo->filled & BIT_ULL(NL80211_STA_INFO_STA_FLAGS)) && in nl80211_send_station()
5735 &sinfo->sta_flags)) in nl80211_send_station()
5744 if (wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_send_station()
5753 if (sinfo->pertid) { in nl80211_send_station()
5766 tidstats = &sinfo->pertid[tid]; in nl80211_send_station()
5768 if (!tidstats->filled) in nl80211_send_station()
5776 if (tidstats->filled & BIT(NL80211_TID_STATS_ ## attr) && \ in nl80211_send_station()
5778 tidstats->memb, NL80211_TID_STATS_PAD)) \ in nl80211_send_station()
5788 if ((tidstats->filled & in nl80211_send_station()
5790 !nl80211_put_txq_stats(msg, &tidstats->txq_stats, in nl80211_send_station()
5802 if (sinfo->assoc_req_ies_len && in nl80211_send_station()
5803 nla_put(msg, NL80211_ATTR_IE, sinfo->assoc_req_ies_len, in nl80211_send_station()
5804 sinfo->assoc_req_ies)) in nl80211_send_station()
5814 return -EMSGSIZE; in nl80211_send_station()
5824 int sta_idx = cb->args[2]; in nl80211_dump_station()
5832 if (!wdev->netdev) { in nl80211_dump_station()
5833 err = -EINVAL; in nl80211_dump_station()
5837 if (!rdev->ops->dump_station) { in nl80211_dump_station()
5838 err = -EOPNOTSUPP; in nl80211_dump_station()
5844 err = rdev_dump_station(rdev, wdev->netdev, sta_idx, in nl80211_dump_station()
5846 if (err == -ENOENT) in nl80211_dump_station()
5852 NETLINK_CB(cb->skb).portid, in nl80211_dump_station()
5853 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_dump_station()
5854 rdev, wdev->netdev, mac_addr, in nl80211_dump_station()
5862 cb->args[2] = sta_idx; in nl80211_dump_station()
5863 err = skb->len; in nl80211_dump_station()
5872 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_station()
5873 struct net_device *dev = info->user_ptr[1]; in nl80211_get_station()
5881 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_get_station()
5882 return -EINVAL; in nl80211_get_station()
5884 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_get_station()
5886 if (!rdev->ops->get_station) in nl80211_get_station()
5887 return -EOPNOTSUPP; in nl80211_get_station()
5896 return -ENOMEM; in nl80211_get_station()
5900 info->snd_portid, info->snd_seq, 0, in nl80211_get_station()
5903 return -ENOBUFS; in nl80211_get_station()
5913 if (params->listen_interval != -1 && in cfg80211_check_station_change()
5915 return -EINVAL; in cfg80211_check_station_change()
5917 if (params->support_p2p_ps != -1 && in cfg80211_check_station_change()
5919 return -EINVAL; in cfg80211_check_station_change()
5921 if (params->aid && in cfg80211_check_station_change()
5922 !(params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) && in cfg80211_check_station_change()
5924 return -EINVAL; in cfg80211_check_station_change()
5933 * No ignoring the TDLS flag here -- the userspace mesh in cfg80211_check_station_change()
5937 if (params->sta_flags_mask & in cfg80211_check_station_change()
5941 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()
5948 params->sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER); in cfg80211_check_station_change()
5951 /* disallow mesh-specific things */ in cfg80211_check_station_change()
5952 if (params->plink_action != NL80211_PLINK_ACTION_NO_ACTION) in cfg80211_check_station_change()
5953 return -EINVAL; in cfg80211_check_station_change()
5954 if (params->local_pm) in cfg80211_check_station_change()
5955 return -EINVAL; in cfg80211_check_station_change()
5956 if (params->sta_modify_mask & STATION_PARAM_APPLY_PLINK_STATE) in cfg80211_check_station_change()
5957 return -EINVAL; in cfg80211_check_station_change()
5963 if (params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) in cfg80211_check_station_change()
5964 return -EINVAL; in cfg80211_check_station_change()
5967 * a hostapd/wpa_supplicant issue -- it always includes the in cfg80211_check_station_change()
5970 params->sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER); in cfg80211_check_station_change()
5976 if (params->sta_modify_mask & STATION_PARAM_APPLY_UAPSD) in cfg80211_check_station_change()
5977 return -EINVAL; in cfg80211_check_station_change()
5978 if (params->sta_modify_mask & STATION_PARAM_APPLY_CAPABILITY) in cfg80211_check_station_change()
5979 return -EINVAL; in cfg80211_check_station_change()
5980 if (params->supported_rates) in cfg80211_check_station_change()
5981 return -EINVAL; in cfg80211_check_station_change()
5982 if (params->ext_capab || params->ht_capa || params->vht_capa || in cfg80211_check_station_change()
5983 params->he_capa) in cfg80211_check_station_change()
5984 return -EINVAL; in cfg80211_check_station_change()
5989 if (params->vlan) in cfg80211_check_station_change()
5990 return -EINVAL; in cfg80211_check_station_change()
5996 if (!(params->sta_flags_mask & BIT(NL80211_STA_FLAG_AUTHORIZED))) in cfg80211_check_station_change()
5997 return -EOPNOTSUPP; in cfg80211_check_station_change()
6002 if (params->sta_flags_mask & in cfg80211_check_station_change()
6009 return -EINVAL; in cfg80211_check_station_change()
6012 if (!(wiphy->features & NL80211_FEATURE_FULL_AP_CLIENT_STATE) && in cfg80211_check_station_change()
6013 params->sta_flags_mask & in cfg80211_check_station_change()
6016 return -EINVAL; in cfg80211_check_station_change()
6021 if (params->sta_flags_mask & ~BIT(NL80211_STA_FLAG_AUTHORIZED)) in cfg80211_check_station_change()
6022 return -EINVAL; in cfg80211_check_station_change()
6026 if (params->sta_flags_mask & ~(BIT(NL80211_STA_FLAG_AUTHORIZED) | in cfg80211_check_station_change()
6028 return -EINVAL; in cfg80211_check_station_change()
6030 if (params->sta_flags_set & BIT(NL80211_STA_FLAG_AUTHORIZED) && in cfg80211_check_station_change()
6031 !params->supported_rates) in cfg80211_check_station_change()
6032 return -EINVAL; in cfg80211_check_station_change()
6036 return -EINVAL; in cfg80211_check_station_change()
6038 if (params->sta_modify_mask & STATION_PARAM_APPLY_PLINK_STATE) in cfg80211_check_station_change()
6039 return -EINVAL; in cfg80211_check_station_change()
6042 if (params->plink_action != NL80211_PLINK_ACTION_NO_ACTION && in cfg80211_check_station_change()
6043 params->plink_action != NL80211_PLINK_ACTION_BLOCK) in cfg80211_check_station_change()
6044 return -EINVAL; in cfg80211_check_station_change()
6055 params->opmode_notif_used = false; in cfg80211_check_station_change()
6067 struct nlattr *vlanattr = info->attrs[NL80211_ATTR_STA_VLAN]; in get_vlan()
6076 return ERR_PTR(-ENODEV); in get_vlan()
6078 if (!v->ieee80211_ptr || v->ieee80211_ptr->wiphy != &rdev->wiphy) { in get_vlan()
6079 ret = -EINVAL; in get_vlan()
6083 if (v->ieee80211_ptr->iftype != NL80211_IFTYPE_AP_VLAN && in get_vlan()
6084 v->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && in get_vlan()
6085 v->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) { in get_vlan()
6086 ret = -EINVAL; in get_vlan()
6091 ret = -ENETDOWN; in get_vlan()
6115 if (!info->attrs[NL80211_ATTR_STA_WME]) in nl80211_parse_sta_wme()
6118 nla = info->attrs[NL80211_ATTR_STA_WME]; in nl80211_parse_sta_wme()
6121 info->extack); in nl80211_parse_sta_wme()
6126 params->uapsd_queues = nla_get_u8( in nl80211_parse_sta_wme()
6128 if (params->uapsd_queues & ~IEEE80211_WMM_IE_STA_QOSINFO_AC_MASK) in nl80211_parse_sta_wme()
6129 return -EINVAL; in nl80211_parse_sta_wme()
6132 params->max_sp = nla_get_u8(tb[NL80211_STA_WME_MAX_SP]); in nl80211_parse_sta_wme()
6134 if (params->max_sp & ~IEEE80211_WMM_IE_STA_QOSINFO_SP_MASK) in nl80211_parse_sta_wme()
6135 return -EINVAL; in nl80211_parse_sta_wme()
6137 params->sta_modify_mask |= STATION_PARAM_APPLY_UAPSD; in nl80211_parse_sta_wme()
6145 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]) { in nl80211_parse_sta_channel_info()
6146 params->supported_channels = in nl80211_parse_sta_channel_info()
6147 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]); in nl80211_parse_sta_channel_info()
6148 params->supported_channels_len = in nl80211_parse_sta_channel_info()
6149 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]); in nl80211_parse_sta_channel_info()
6155 if (params->supported_channels_len % 2) in nl80211_parse_sta_channel_info()
6156 return -EINVAL; in nl80211_parse_sta_channel_info()
6159 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]) { in nl80211_parse_sta_channel_info()
6160 params->supported_oper_classes = in nl80211_parse_sta_channel_info()
6161 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]); in nl80211_parse_sta_channel_info()
6162 params->supported_oper_classes_len = in nl80211_parse_sta_channel_info()
6163 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]); in nl80211_parse_sta_channel_info()
6173 if (info->attrs[NL80211_ATTR_PEER_AID]) in nl80211_set_station_tdls()
6174 params->aid = nla_get_u16(info->attrs[NL80211_ATTR_PEER_AID]); in nl80211_set_station_tdls()
6175 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) in nl80211_set_station_tdls()
6176 params->ht_capa = in nl80211_set_station_tdls()
6177 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]); in nl80211_set_station_tdls()
6178 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) in nl80211_set_station_tdls()
6179 params->vht_capa = in nl80211_set_station_tdls()
6180 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]); in nl80211_set_station_tdls()
6181 if (info->attrs[NL80211_ATTR_HE_CAPABILITY]) { in nl80211_set_station_tdls()
6182 params->he_capa = in nl80211_set_station_tdls()
6183 nla_data(info->attrs[NL80211_ATTR_HE_CAPABILITY]); in nl80211_set_station_tdls()
6184 params->he_capa_len = in nl80211_set_station_tdls()
6185 nla_len(info->attrs[NL80211_ATTR_HE_CAPABILITY]); in nl80211_set_station_tdls()
6198 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_parse_sta_txpower_setting()
6201 if (info->attrs[NL80211_ATTR_STA_TX_POWER_SETTING]) { in nl80211_parse_sta_txpower_setting()
6202 if (!rdev->ops->set_tx_power || in nl80211_parse_sta_txpower_setting()
6203 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_parse_sta_txpower_setting()
6205 return -EOPNOTSUPP; in nl80211_parse_sta_txpower_setting()
6208 params->txpwr.type = nla_get_u8(info->attrs[idx]); in nl80211_parse_sta_txpower_setting()
6210 if (params->txpwr.type == NL80211_TX_POWER_LIMITED) { in nl80211_parse_sta_txpower_setting()
6213 if (info->attrs[idx]) in nl80211_parse_sta_txpower_setting()
6214 params->txpwr.power = in nl80211_parse_sta_txpower_setting()
6215 nla_get_s16(info->attrs[idx]); in nl80211_parse_sta_txpower_setting()
6217 return -EINVAL; in nl80211_parse_sta_txpower_setting()
6219 params->sta_modify_mask |= STATION_PARAM_APPLY_STA_TXPOWER; in nl80211_parse_sta_txpower_setting()
6227 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_station()
6228 struct net_device *dev = info->user_ptr[1]; in nl80211_set_station()
6235 if (!rdev->ops->change_station) in nl80211_set_station()
6236 return -EOPNOTSUPP; in nl80211_set_station()
6243 if (info->attrs[NL80211_ATTR_STA_AID]) in nl80211_set_station()
6244 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_STA_AID]); in nl80211_set_station()
6246 if (info->attrs[NL80211_ATTR_VLAN_ID]) in nl80211_set_station()
6247 params.vlan_id = nla_get_u16(info->attrs[NL80211_ATTR_VLAN_ID]); in nl80211_set_station()
6249 if (info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]) in nl80211_set_station()
6251 nla_get_u16(info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]); in nl80211_set_station()
6253 params.listen_interval = -1; in nl80211_set_station()
6255 if (info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]) in nl80211_set_station()
6257 nla_get_u8(info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]); in nl80211_set_station()
6259 params.support_p2p_ps = -1; in nl80211_set_station()
6261 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_set_station()
6262 return -EINVAL; in nl80211_set_station()
6264 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_set_station()
6266 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) { in nl80211_set_station()
6268 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); in nl80211_set_station()
6270 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); in nl80211_set_station()
6273 if (info->attrs[NL80211_ATTR_STA_CAPABILITY]) { in nl80211_set_station()
6275 nla_get_u16(info->attrs[NL80211_ATTR_STA_CAPABILITY]); in nl80211_set_station()
6279 if (info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]) { in nl80211_set_station()
6281 nla_data(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); in nl80211_set_station()
6283 nla_len(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); in nl80211_set_station()
6286 if (parse_station_flags(info, dev->ieee80211_ptr->iftype, ¶ms)) in nl80211_set_station()
6287 return -EINVAL; in nl80211_set_station()
6289 if (info->attrs[NL80211_ATTR_STA_PLINK_ACTION]) in nl80211_set_station()
6291 nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_ACTION]); in nl80211_set_station()
6293 if (info->attrs[NL80211_ATTR_STA_PLINK_STATE]) { in nl80211_set_station()
6295 nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_STATE]); in nl80211_set_station()
6296 if (info->attrs[NL80211_ATTR_MESH_PEER_AID]) in nl80211_set_station()
6298 info->attrs[NL80211_ATTR_MESH_PEER_AID]); in nl80211_set_station()
6302 if (info->attrs[NL80211_ATTR_LOCAL_MESH_POWER_MODE]) in nl80211_set_station()
6304 info->attrs[NL80211_ATTR_LOCAL_MESH_POWER_MODE]); in nl80211_set_station()
6306 if (info->attrs[NL80211_ATTR_OPMODE_NOTIF]) { in nl80211_set_station()
6309 nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]); in nl80211_set_station()
6312 if (info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]) in nl80211_set_station()
6314 nla_data(info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]); in nl80211_set_station()
6316 if (info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]) in nl80211_set_station()
6318 nla_get_u16(info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]); in nl80211_set_station()
6321 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_set_station()
6323 return -EOPNOTSUPP; in nl80211_set_station()
6338 switch (dev->ieee80211_ptr->iftype) { in nl80211_set_station()
6348 err = -EOPNOTSUPP; in nl80211_set_station()
6364 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_new_station()
6366 struct net_device *dev = info->user_ptr[1]; in nl80211_new_station()
6374 if (!rdev->ops->add_station) in nl80211_new_station()
6375 return -EOPNOTSUPP; in nl80211_new_station()
6377 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_new_station()
6378 return -EINVAL; in nl80211_new_station()
6380 if (!info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]) in nl80211_new_station()
6381 return -EINVAL; in nl80211_new_station()
6383 if (!info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) in nl80211_new_station()
6384 return -EINVAL; in nl80211_new_station()
6386 if (!info->attrs[NL80211_ATTR_STA_AID] && in nl80211_new_station()
6387 !info->attrs[NL80211_ATTR_PEER_AID]) in nl80211_new_station()
6388 return -EINVAL; in nl80211_new_station()
6390 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_new_station()
6392 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); in nl80211_new_station()
6394 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); in nl80211_new_station()
6396 nla_get_u16(info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]); in nl80211_new_station()
6398 if (info->attrs[NL80211_ATTR_VLAN_ID]) in nl80211_new_station()
6399 params.vlan_id = nla_get_u16(info->attrs[NL80211_ATTR_VLAN_ID]); in nl80211_new_station()
6401 if (info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]) { in nl80211_new_station()
6403 nla_get_u8(info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]); in nl80211_new_station()
6410 dev->ieee80211_ptr->iftype == NL80211_IFTYPE_P2P_GO; in nl80211_new_station()
6413 if (info->attrs[NL80211_ATTR_PEER_AID]) in nl80211_new_station()
6414 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_PEER_AID]); in nl80211_new_station()
6416 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_STA_AID]); in nl80211_new_station()
6418 if (info->attrs[NL80211_ATTR_STA_CAPABILITY]) { in nl80211_new_station()
6420 nla_get_u16(info->attrs[NL80211_ATTR_STA_CAPABILITY]); in nl80211_new_station()
6424 if (info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]) { in nl80211_new_station()
6426 nla_data(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); in nl80211_new_station()
6428 nla_len(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); in nl80211_new_station()
6431 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) in nl80211_new_station()
6433 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]); in nl80211_new_station()
6435 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) in nl80211_new_station()
6437 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]); in nl80211_new_station()
6439 if (info->attrs[NL80211_ATTR_HE_CAPABILITY]) { in nl80211_new_station()
6441 nla_data(info->attrs[NL80211_ATTR_HE_CAPABILITY]); in nl80211_new_station()
6443 nla_len(info->attrs[NL80211_ATTR_HE_CAPABILITY]); in nl80211_new_station()
6446 if (info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]) in nl80211_new_station()
6448 nla_data(info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]); in nl80211_new_station()
6450 if (info->attrs[NL80211_ATTR_OPMODE_NOTIF]) { in nl80211_new_station()
6453 nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]); in nl80211_new_station()
6456 if (info->attrs[NL80211_ATTR_STA_PLINK_ACTION]) in nl80211_new_station()
6458 nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_ACTION]); in nl80211_new_station()
6460 if (info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]) in nl80211_new_station()
6462 nla_get_u16(info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]); in nl80211_new_station()
6465 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_new_station()
6467 return -EOPNOTSUPP; in nl80211_new_station()
6481 if (parse_station_flags(info, dev->ieee80211_ptr->iftype, ¶ms)) in nl80211_new_station()
6482 return -EINVAL; in nl80211_new_station()
6495 return -EINVAL; in nl80211_new_station()
6500 return -EINVAL; in nl80211_new_station()
6505 switch (dev->ieee80211_ptr->iftype) { in nl80211_new_station()
6510 if (!(rdev->wiphy.flags & WIPHY_FLAG_AP_UAPSD) || in nl80211_new_station()
6516 info->attrs[NL80211_ATTR_PEER_AID]) in nl80211_new_station()
6517 return -EINVAL; in nl80211_new_station()
6522 if (!(rdev->wiphy.features & in nl80211_new_station()
6525 return -EINVAL; in nl80211_new_station()
6553 return -EINVAL; in nl80211_new_station()
6556 info->attrs[NL80211_ATTR_PEER_AID]) in nl80211_new_station()
6557 return -EINVAL; in nl80211_new_station()
6568 return -EINVAL; in nl80211_new_station()
6571 return -EINVAL; in nl80211_new_station()
6573 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS)) in nl80211_new_station()
6574 return -EOPNOTSUPP; in nl80211_new_station()
6576 if (!(rdev->wiphy.flags & WIPHY_FLAG_TDLS_EXTERNAL_SETUP)) in nl80211_new_station()
6577 return -EOPNOTSUPP; in nl80211_new_station()
6585 return -EOPNOTSUPP; in nl80211_new_station()
6599 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_del_station()
6600 struct net_device *dev = info->user_ptr[1]; in nl80211_del_station()
6605 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_del_station()
6606 params.mac = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_del_station()
6608 switch (dev->ieee80211_ptr->iftype) { in nl80211_del_station()
6617 if (wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_del_station()
6620 return -EINVAL; in nl80211_del_station()
6622 return -EINVAL; in nl80211_del_station()
6625 if (!rdev->ops->del_station) in nl80211_del_station()
6626 return -EOPNOTSUPP; in nl80211_del_station()
6628 if (info->attrs[NL80211_ATTR_MGMT_SUBTYPE]) { in nl80211_del_station()
6630 nla_get_u8(info->attrs[NL80211_ATTR_MGMT_SUBTYPE]); in nl80211_del_station()
6633 return -EINVAL; in nl80211_del_station()
6639 if (info->attrs[NL80211_ATTR_REASON_CODE]) { in nl80211_del_station()
6641 nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); in nl80211_del_station()
6643 return -EINVAL; /* 0 is reserved */ in nl80211_del_station()
6662 return -1; in nl80211_send_mpath()
6664 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in nl80211_send_mpath()
6667 nla_put_u32(msg, NL80211_ATTR_GENERATION, pinfo->generation)) in nl80211_send_mpath()
6673 if ((pinfo->filled & MPATH_INFO_FRAME_QLEN) && in nl80211_send_mpath()
6675 pinfo->frame_qlen)) in nl80211_send_mpath()
6677 if (((pinfo->filled & MPATH_INFO_SN) && in nl80211_send_mpath()
6678 nla_put_u32(msg, NL80211_MPATH_INFO_SN, pinfo->sn)) || in nl80211_send_mpath()
6679 ((pinfo->filled & MPATH_INFO_METRIC) && in nl80211_send_mpath()
6681 pinfo->metric)) || in nl80211_send_mpath()
6682 ((pinfo->filled & MPATH_INFO_EXPTIME) && in nl80211_send_mpath()
6684 pinfo->exptime)) || in nl80211_send_mpath()
6685 ((pinfo->filled & MPATH_INFO_FLAGS) && in nl80211_send_mpath()
6687 pinfo->flags)) || in nl80211_send_mpath()
6688 ((pinfo->filled & MPATH_INFO_DISCOVERY_TIMEOUT) && in nl80211_send_mpath()
6690 pinfo->discovery_timeout)) || in nl80211_send_mpath()
6691 ((pinfo->filled & MPATH_INFO_DISCOVERY_RETRIES) && in nl80211_send_mpath()
6693 pinfo->discovery_retries)) || in nl80211_send_mpath()
6694 ((pinfo->filled & MPATH_INFO_HOP_COUNT) && in nl80211_send_mpath()
6696 pinfo->hop_count)) || in nl80211_send_mpath()
6697 ((pinfo->filled & MPATH_INFO_PATH_CHANGE) && in nl80211_send_mpath()
6699 pinfo->path_change_count))) in nl80211_send_mpath()
6709 return -EMSGSIZE; in nl80211_send_mpath()
6720 int path_idx = cb->args[2]; in nl80211_dump_mpath()
6728 if (!rdev->ops->dump_mpath) { in nl80211_dump_mpath()
6729 err = -EOPNOTSUPP; in nl80211_dump_mpath()
6733 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) { in nl80211_dump_mpath()
6734 err = -EOPNOTSUPP; in nl80211_dump_mpath()
6739 err = rdev_dump_mpath(rdev, wdev->netdev, path_idx, dst, in nl80211_dump_mpath()
6741 if (err == -ENOENT) in nl80211_dump_mpath()
6746 if (nl80211_send_mpath(skb, NETLINK_CB(cb->skb).portid, in nl80211_dump_mpath()
6747 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_dump_mpath()
6748 wdev->netdev, dst, next_hop, in nl80211_dump_mpath()
6756 cb->args[2] = path_idx; in nl80211_dump_mpath()
6757 err = skb->len; in nl80211_dump_mpath()
6765 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_mpath()
6767 struct net_device *dev = info->user_ptr[1]; in nl80211_get_mpath()
6775 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_get_mpath()
6776 return -EINVAL; in nl80211_get_mpath()
6778 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_get_mpath()
6780 if (!rdev->ops->get_mpath) in nl80211_get_mpath()
6781 return -EOPNOTSUPP; in nl80211_get_mpath()
6783 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_get_mpath()
6784 return -EOPNOTSUPP; in nl80211_get_mpath()
6792 return -ENOMEM; in nl80211_get_mpath()
6794 if (nl80211_send_mpath(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_mpath()
6797 return -ENOBUFS; in nl80211_get_mpath()
6805 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_mpath()
6806 struct net_device *dev = info->user_ptr[1]; in nl80211_set_mpath()
6810 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_set_mpath()
6811 return -EINVAL; in nl80211_set_mpath()
6813 if (!info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]) in nl80211_set_mpath()
6814 return -EINVAL; in nl80211_set_mpath()
6816 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_set_mpath()
6817 next_hop = nla_data(info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]); in nl80211_set_mpath()
6819 if (!rdev->ops->change_mpath) in nl80211_set_mpath()
6820 return -EOPNOTSUPP; in nl80211_set_mpath()
6822 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_set_mpath()
6823 return -EOPNOTSUPP; in nl80211_set_mpath()
6830 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_new_mpath()
6831 struct net_device *dev = info->user_ptr[1]; in nl80211_new_mpath()
6835 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_new_mpath()
6836 return -EINVAL; in nl80211_new_mpath()
6838 if (!info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]) in nl80211_new_mpath()
6839 return -EINVAL; in nl80211_new_mpath()
6841 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_new_mpath()
6842 next_hop = nla_data(info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]); in nl80211_new_mpath()
6844 if (!rdev->ops->add_mpath) in nl80211_new_mpath()
6845 return -EOPNOTSUPP; in nl80211_new_mpath()
6847 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_new_mpath()
6848 return -EOPNOTSUPP; in nl80211_new_mpath()
6855 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_del_mpath()
6856 struct net_device *dev = info->user_ptr[1]; in nl80211_del_mpath()
6859 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_del_mpath()
6860 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_del_mpath()
6862 if (!rdev->ops->del_mpath) in nl80211_del_mpath()
6863 return -EOPNOTSUPP; in nl80211_del_mpath()
6865 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_del_mpath()
6866 return -EOPNOTSUPP; in nl80211_del_mpath()
6873 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_mpp()
6875 struct net_device *dev = info->user_ptr[1]; in nl80211_get_mpp()
6883 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_get_mpp()
6884 return -EINVAL; in nl80211_get_mpp()
6886 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_get_mpp()
6888 if (!rdev->ops->get_mpp) in nl80211_get_mpp()
6889 return -EOPNOTSUPP; in nl80211_get_mpp()
6891 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_get_mpp()
6892 return -EOPNOTSUPP; in nl80211_get_mpp()
6900 return -ENOMEM; in nl80211_get_mpp()
6902 if (nl80211_send_mpath(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_mpp()
6905 return -ENOBUFS; in nl80211_get_mpp()
6919 int path_idx = cb->args[2]; in nl80211_dump_mpp()
6927 if (!rdev->ops->dump_mpp) { in nl80211_dump_mpp()
6928 err = -EOPNOTSUPP; in nl80211_dump_mpp()
6932 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) { in nl80211_dump_mpp()
6933 err = -EOPNOTSUPP; in nl80211_dump_mpp()
6938 err = rdev_dump_mpp(rdev, wdev->netdev, path_idx, dst, in nl80211_dump_mpp()
6940 if (err == -ENOENT) in nl80211_dump_mpp()
6945 if (nl80211_send_mpath(skb, NETLINK_CB(cb->skb).portid, in nl80211_dump_mpp()
6946 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_dump_mpp()
6947 wdev->netdev, dst, mpp, in nl80211_dump_mpp()
6955 cb->args[2] = path_idx; in nl80211_dump_mpp()
6956 err = skb->len; in nl80211_dump_mpp()
6964 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_bss()
6965 struct net_device *dev = info->user_ptr[1]; in nl80211_set_bss()
6966 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_bss()
6972 params.use_cts_prot = -1; in nl80211_set_bss()
6973 params.use_short_preamble = -1; in nl80211_set_bss()
6974 params.use_short_slot_time = -1; in nl80211_set_bss()
6975 params.ap_isolate = -1; in nl80211_set_bss()
6976 params.ht_opmode = -1; in nl80211_set_bss()
6977 params.p2p_ctwindow = -1; in nl80211_set_bss()
6978 params.p2p_opp_ps = -1; in nl80211_set_bss()
6980 if (info->attrs[NL80211_ATTR_BSS_CTS_PROT]) in nl80211_set_bss()
6982 nla_get_u8(info->attrs[NL80211_ATTR_BSS_CTS_PROT]); in nl80211_set_bss()
6983 if (info->attrs[NL80211_ATTR_BSS_SHORT_PREAMBLE]) in nl80211_set_bss()
6985 nla_get_u8(info->attrs[NL80211_ATTR_BSS_SHORT_PREAMBLE]); in nl80211_set_bss()
6986 if (info->attrs[NL80211_ATTR_BSS_SHORT_SLOT_TIME]) in nl80211_set_bss()
6988 nla_get_u8(info->attrs[NL80211_ATTR_BSS_SHORT_SLOT_TIME]); in nl80211_set_bss()
6989 if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) { in nl80211_set_bss()
6991 nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); in nl80211_set_bss()
6993 nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); in nl80211_set_bss()
6995 if (info->attrs[NL80211_ATTR_AP_ISOLATE]) in nl80211_set_bss()
6996 params.ap_isolate = !!nla_get_u8(info->attrs[NL80211_ATTR_AP_ISOLATE]); in nl80211_set_bss()
6997 if (info->attrs[NL80211_ATTR_BSS_HT_OPMODE]) in nl80211_set_bss()
6999 nla_get_u16(info->attrs[NL80211_ATTR_BSS_HT_OPMODE]); in nl80211_set_bss()
7001 if (info->attrs[NL80211_ATTR_P2P_CTWINDOW]) { in nl80211_set_bss()
7002 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_set_bss()
7003 return -EINVAL; in nl80211_set_bss()
7005 nla_get_u8(info->attrs[NL80211_ATTR_P2P_CTWINDOW]); in nl80211_set_bss()
7007 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_CTWIN)) in nl80211_set_bss()
7008 return -EINVAL; in nl80211_set_bss()
7011 if (info->attrs[NL80211_ATTR_P2P_OPPPS]) { in nl80211_set_bss()
7014 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_set_bss()
7015 return -EINVAL; in nl80211_set_bss()
7016 tmp = nla_get_u8(info->attrs[NL80211_ATTR_P2P_OPPPS]); in nl80211_set_bss()
7019 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_OPPPS)) in nl80211_set_bss()
7020 return -EINVAL; in nl80211_set_bss()
7023 if (!rdev->ops->change_bss) in nl80211_set_bss()
7024 return -EOPNOTSUPP; in nl80211_set_bss()
7026 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && in nl80211_set_bss()
7027 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_set_bss()
7028 return -EOPNOTSUPP; in nl80211_set_bss()
7046 * completely when built-in to the kernel right between the time in nl80211_req_set_reg()
7051 return -EINPROGRESS; in nl80211_req_set_reg()
7053 if (info->attrs[NL80211_ATTR_USER_REG_HINT_TYPE]) in nl80211_req_set_reg()
7055 nla_get_u32(info->attrs[NL80211_ATTR_USER_REG_HINT_TYPE]); in nl80211_req_set_reg()
7062 if (!info->attrs[NL80211_ATTR_REG_ALPHA2]) in nl80211_req_set_reg()
7063 return -EINVAL; in nl80211_req_set_reg()
7065 data = nla_data(info->attrs[NL80211_ATTR_REG_ALPHA2]); in nl80211_req_set_reg()
7068 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) { in nl80211_req_set_reg()
7069 owner_nlportid = info->snd_portid; in nl80211_req_set_reg()
7070 is_indoor = !!info->attrs[NL80211_ATTR_REG_INDOOR]; in nl80211_req_set_reg()
7078 return -EINVAL; in nl80211_req_set_reg()
7090 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_mesh_config()
7091 struct net_device *dev = info->user_ptr[1]; in nl80211_get_mesh_config()
7092 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_get_mesh_config()
7099 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_get_mesh_config()
7100 return -EOPNOTSUPP; in nl80211_get_mesh_config()
7102 if (!rdev->ops->get_mesh_config) in nl80211_get_mesh_config()
7103 return -EOPNOTSUPP; in nl80211_get_mesh_config()
7107 if (!wdev->mesh_id_len) in nl80211_get_mesh_config()
7119 return -ENOMEM; in nl80211_get_mesh_config()
7120 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_mesh_config()
7127 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in nl80211_get_mesh_config()
7198 return -ENOBUFS; in nl80211_get_mesh_config()
7233 NLA_POLICY_RANGE(NLA_S32, -255, 0),
7276 cfg->param = fn(tb[attr]); \ in nl80211_parse_mesh_config()
7277 mask |= BIT((attr) - 1); \ in nl80211_parse_mesh_config()
7281 if (!info->attrs[NL80211_ATTR_MESH_CONFIG]) in nl80211_parse_mesh_config()
7282 return -EINVAL; in nl80211_parse_mesh_config()
7283 …ated(tb, NL80211_MESHCONF_ATTR_MAX, info->attrs[NL80211_ATTR_MESH_CONFIG], nl80211_meshconf_params… in nl80211_parse_mesh_config()
7284 return -EINVAL; in nl80211_parse_mesh_config()
7322 (cfg->path_refresh_time < 1 || cfg->path_refresh_time > 65535)) in nl80211_parse_mesh_config()
7323 return -EINVAL; in nl80211_parse_mesh_config()
7332 (cfg->dot11MeshHWMPactivePathTimeout < 1 || in nl80211_parse_mesh_config()
7333 cfg->dot11MeshHWMPactivePathTimeout > 65535)) in nl80211_parse_mesh_config()
7334 return -EINVAL; in nl80211_parse_mesh_config()
7366 * IEEE 802.11-2016 9.4.2.57 HT Operation element. in nl80211_parse_mesh_config()
7374 return -EINVAL; in nl80211_parse_mesh_config()
7379 cfg->ht_opmode = ht_opmode; in nl80211_parse_mesh_config()
7380 mask |= (1 << (NL80211_MESHCONF_HT_OPMODE - 1)); in nl80211_parse_mesh_config()
7387 (cfg->dot11MeshHWMPactivePathToRootTimeout < 1 || in nl80211_parse_mesh_config()
7388 cfg->dot11MeshHWMPactivePathToRootTimeout > 65535)) in nl80211_parse_mesh_config()
7389 return -EINVAL; in nl80211_parse_mesh_config()
7416 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_parse_mesh_setup()
7419 if (!info->attrs[NL80211_ATTR_MESH_SETUP]) in nl80211_parse_mesh_setup()
7420 return -EINVAL; in nl80211_parse_mesh_setup()
7421 …ed(tb, NL80211_MESH_SETUP_ATTR_MAX, info->attrs[NL80211_ATTR_MESH_SETUP], nl80211_mesh_setup_param… in nl80211_parse_mesh_setup()
7422 return -EINVAL; in nl80211_parse_mesh_setup()
7425 setup->sync_method = in nl80211_parse_mesh_setup()
7431 setup->path_sel_proto = in nl80211_parse_mesh_setup()
7437 setup->path_metric = in nl80211_parse_mesh_setup()
7445 setup->ie = nla_data(ieattr); in nl80211_parse_mesh_setup()
7446 setup->ie_len = nla_len(ieattr); in nl80211_parse_mesh_setup()
7449 !(rdev->wiphy.features & NL80211_FEATURE_USERSPACE_MPM)) in nl80211_parse_mesh_setup()
7450 return -EINVAL; in nl80211_parse_mesh_setup()
7451 setup->user_mpm = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_MPM]); in nl80211_parse_mesh_setup()
7452 setup->is_authenticated = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_AUTH]); in nl80211_parse_mesh_setup()
7453 setup->is_secure = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_AMPE]); in nl80211_parse_mesh_setup()
7454 if (setup->is_secure) in nl80211_parse_mesh_setup()
7455 setup->user_mpm = true; in nl80211_parse_mesh_setup()
7458 if (!setup->user_mpm) in nl80211_parse_mesh_setup()
7459 return -EINVAL; in nl80211_parse_mesh_setup()
7460 setup->auth_id = in nl80211_parse_mesh_setup()
7470 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_update_mesh_config()
7471 struct net_device *dev = info->user_ptr[1]; in nl80211_update_mesh_config()
7472 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_update_mesh_config()
7477 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_update_mesh_config()
7478 return -EOPNOTSUPP; in nl80211_update_mesh_config()
7480 if (!rdev->ops->update_mesh_config) in nl80211_update_mesh_config()
7481 return -EOPNOTSUPP; in nl80211_update_mesh_config()
7488 if (!wdev->mesh_id_len) in nl80211_update_mesh_config()
7489 err = -ENOLINK; in nl80211_update_mesh_config()
7505 if (nla_put_string(msg, NL80211_ATTR_REG_ALPHA2, regdom->alpha2) || in nl80211_put_regdom()
7506 (regdom->dfs_region && in nl80211_put_regdom()
7507 nla_put_u8(msg, NL80211_ATTR_DFS_REGION, regdom->dfs_region))) in nl80211_put_regdom()
7514 for (i = 0; i < regdom->n_reg_rules; i++) { in nl80211_put_regdom()
7521 reg_rule = ®dom->reg_rules[i]; in nl80211_put_regdom()
7522 freq_range = ®_rule->freq_range; in nl80211_put_regdom()
7523 power_rule = ®_rule->power_rule; in nl80211_put_regdom()
7529 max_bandwidth_khz = freq_range->max_bandwidth_khz; in nl80211_put_regdom()
7535 reg_rule->flags) || in nl80211_put_regdom()
7537 freq_range->start_freq_khz) || in nl80211_put_regdom()
7539 freq_range->end_freq_khz) || in nl80211_put_regdom()
7543 power_rule->max_antenna_gain) || in nl80211_put_regdom()
7545 power_rule->max_eirp) || in nl80211_put_regdom()
7547 reg_rule->dfs_cac_ms)) in nl80211_put_regdom()
7557 return -EMSGSIZE; in nl80211_put_regdom()
7570 return -ENOBUFS; in nl80211_get_reg_do()
7572 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_reg_do()
7577 if (info->attrs[NL80211_ATTR_WIPHY]) { in nl80211_get_reg_do()
7586 wiphy = &rdev->wiphy; in nl80211_get_reg_do()
7587 self_managed = wiphy->regulatory_flags & in nl80211_get_reg_do()
7591 /* a self-managed-reg device must have a private regdom */ in nl80211_get_reg_do()
7594 return -EINVAL; in nl80211_get_reg_do()
7625 return -EMSGSIZE; in nl80211_get_reg_do()
7632 void *hdr = nl80211hdr_put(msg, NETLINK_CB(cb->skb).portid, seq, flags, in nl80211_send_regdom()
7636 return -1; in nl80211_send_regdom()
7652 if (wiphy && wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED && in nl80211_send_regdom()
7661 return -EMSGSIZE; in nl80211_send_regdom()
7669 int err, reg_idx, start = cb->args[2]; in nl80211_get_reg_dump()
7674 err = nl80211_send_regdom(skb, cb, cb->nlh->nlmsg_seq, in nl80211_get_reg_dump()
7684 regdom = get_wiphy_regdom(&rdev->wiphy); in nl80211_get_reg_dump()
7691 err = nl80211_send_regdom(skb, cb, cb->nlh->nlmsg_seq, in nl80211_get_reg_dump()
7692 NLM_F_MULTI, &rdev->wiphy, regdom); in nl80211_get_reg_dump()
7694 reg_idx--; in nl80211_get_reg_dump()
7699 cb->args[2] = reg_idx; in nl80211_get_reg_dump()
7700 err = skb->len; in nl80211_get_reg_dump()
7720 struct ieee80211_freq_range *freq_range = ®_rule->freq_range; in parse_reg_rule()
7721 struct ieee80211_power_rule *power_rule = ®_rule->power_rule; in parse_reg_rule()
7724 return -EINVAL; in parse_reg_rule()
7726 return -EINVAL; in parse_reg_rule()
7728 return -EINVAL; in parse_reg_rule()
7730 return -EINVAL; in parse_reg_rule()
7732 return -EINVAL; in parse_reg_rule()
7734 reg_rule->flags = nla_get_u32(tb[NL80211_ATTR_REG_RULE_FLAGS]); in parse_reg_rule()
7736 freq_range->start_freq_khz = in parse_reg_rule()
7738 freq_range->end_freq_khz = in parse_reg_rule()
7740 freq_range->max_bandwidth_khz = in parse_reg_rule()
7743 power_rule->max_eirp = in parse_reg_rule()
7747 power_rule->max_antenna_gain = in parse_reg_rule()
7751 reg_rule->dfs_cac_ms = in parse_reg_rule()
7767 if (!info->attrs[NL80211_ATTR_REG_ALPHA2]) in nl80211_set_reg()
7768 return -EINVAL; in nl80211_set_reg()
7770 if (!info->attrs[NL80211_ATTR_REG_RULES]) in nl80211_set_reg()
7771 return -EINVAL; in nl80211_set_reg()
7773 alpha2 = nla_data(info->attrs[NL80211_ATTR_REG_ALPHA2]); in nl80211_set_reg()
7775 if (info->attrs[NL80211_ATTR_DFS_REGION]) in nl80211_set_reg()
7776 dfs_region = nla_get_u8(info->attrs[NL80211_ATTR_DFS_REGION]); in nl80211_set_reg()
7778 nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES], in nl80211_set_reg()
7782 return -EINVAL; in nl80211_set_reg()
7786 return -EINVAL; in nl80211_set_reg()
7790 return -ENOMEM; in nl80211_set_reg()
7792 rd->n_reg_rules = num_rules; in nl80211_set_reg()
7793 rd->alpha2[0] = alpha2[0]; in nl80211_set_reg()
7794 rd->alpha2[1] = alpha2[1]; in nl80211_set_reg()
7801 rd->dfs_region = dfs_region; in nl80211_set_reg()
7803 nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES], in nl80211_set_reg()
7807 info->extack); in nl80211_set_reg()
7810 r = parse_reg_rule(tb, &rd->reg_rules[rule_idx]); in nl80211_set_reg()
7817 r = -EINVAL; in nl80211_set_reg()
7861 return b < NUM_NL80211_BANDS && wiphy->bands[b]; in is_band_valid()
7876 return -EINVAL; in parse_bss_select()
7888 return -EINVAL; in parse_bss_select()
7893 bss_select->behaviour = __NL80211_BSS_SELECT_ATTR_INVALID; in parse_bss_select()
7896 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_RSSI; in parse_bss_select()
7899 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_BAND_PREF; in parse_bss_select()
7900 bss_select->param.band_pref = in parse_bss_select()
7902 if (!is_band_valid(wiphy, bss_select->param.band_pref)) in parse_bss_select()
7903 return -EINVAL; in parse_bss_select()
7910 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_RSSI_ADJUST; in parse_bss_select()
7911 bss_select->param.adjust.band = adj_param->band; in parse_bss_select()
7912 bss_select->param.adjust.delta = adj_param->delta; in parse_bss_select()
7913 if (!is_band_valid(wiphy, bss_select->param.adjust.band)) in parse_bss_select()
7914 return -EINVAL; in parse_bss_select()
7917 /* user-space did not provide behaviour attribute */ in parse_bss_select()
7918 if (bss_select->behaviour == __NL80211_BSS_SELECT_ATTR_INVALID) in parse_bss_select()
7919 return -EINVAL; in parse_bss_select()
7921 if (!(wiphy->bss_select_support & BIT(bss_select->behaviour))) in parse_bss_select()
7922 return -EINVAL; in parse_bss_select()
7943 return -EINVAL; in nl80211_parse_random_mac()
7951 return -EINVAL; in nl80211_parse_random_mac()
7971 if (!(wdev->chandef.chan->flags & IEEE80211_CHAN_RADAR)) in cfg80211_off_channel_oper_allowed()
7974 return regulatory_pre_cac_allowed(wdev->wiphy); in cfg80211_off_channel_oper_allowed()
8005 flags = &req->flags; in nl80211_check_scan_flags()
8006 mac_addr = req->mac_addr; in nl80211_check_scan_flags()
8007 mac_addr_mask = req->mac_addr_mask; in nl80211_check_scan_flags()
8012 flags = &req->flags; in nl80211_check_scan_flags()
8013 mac_addr = req->mac_addr; in nl80211_check_scan_flags()
8014 mac_addr_mask = req->mac_addr_mask; in nl80211_check_scan_flags()
8020 !(wiphy->features & NL80211_FEATURE_LOW_PRIORITY_SCAN)) || in nl80211_check_scan_flags()
8048 return -EOPNOTSUPP; in nl80211_check_scan_flags()
8053 if (!(wiphy->features & randomness_flag) || in nl80211_check_scan_flags()
8054 (wdev && wdev->current_bss)) in nl80211_check_scan_flags()
8055 return -EOPNOTSUPP; in nl80211_check_scan_flags()
8067 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_trigger_scan()
8068 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_trigger_scan()
8077 wiphy = &rdev->wiphy; in nl80211_trigger_scan()
8079 if (wdev->iftype == NL80211_IFTYPE_NAN) in nl80211_trigger_scan()
8080 return -EOPNOTSUPP; in nl80211_trigger_scan()
8082 if (!rdev->ops->scan) in nl80211_trigger_scan()
8083 return -EOPNOTSUPP; in nl80211_trigger_scan()
8085 if (rdev->scan_req || rdev->scan_msg) in nl80211_trigger_scan()
8086 return -EBUSY; in nl80211_trigger_scan()
8088 if (info->attrs[NL80211_ATTR_SCAN_FREQ_KHZ]) { in nl80211_trigger_scan()
8091 return -EOPNOTSUPP; in nl80211_trigger_scan()
8092 scan_freqs = info->attrs[NL80211_ATTR_SCAN_FREQ_KHZ]; in nl80211_trigger_scan()
8094 } else if (info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]) in nl80211_trigger_scan()
8095 scan_freqs = info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]; in nl80211_trigger_scan()
8100 return -EINVAL; in nl80211_trigger_scan()
8105 if (info->attrs[NL80211_ATTR_SCAN_SSIDS]) in nl80211_trigger_scan()
8106 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp) in nl80211_trigger_scan()
8109 if (n_ssids > wiphy->max_scan_ssids) in nl80211_trigger_scan()
8110 return -EINVAL; in nl80211_trigger_scan()
8112 if (info->attrs[NL80211_ATTR_IE]) in nl80211_trigger_scan()
8113 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_trigger_scan()
8117 if (ie_len > wiphy->max_scan_ie_len) in nl80211_trigger_scan()
8118 return -EINVAL; in nl80211_trigger_scan()
8121 + sizeof(*request->ssids) * n_ssids in nl80211_trigger_scan()
8122 + sizeof(*request->channels) * n_channels in nl80211_trigger_scan()
8125 return -ENOMEM; in nl80211_trigger_scan()
8128 request->ssids = (void *)&request->channels[n_channels]; in nl80211_trigger_scan()
8129 request->n_ssids = n_ssids; in nl80211_trigger_scan()
8132 request->ie = (void *)(request->ssids + n_ssids); in nl80211_trigger_scan()
8134 request->ie = (void *)(request->channels + n_channels); in nl80211_trigger_scan()
8149 err = -EINVAL; in nl80211_trigger_scan()
8154 if (chan->flags & IEEE80211_CHAN_DISABLED) in nl80211_trigger_scan()
8157 request->channels[i] = chan; in nl80211_trigger_scan()
8167 if (!wiphy->bands[band]) in nl80211_trigger_scan()
8169 for (j = 0; j < wiphy->bands[band]->n_channels; j++) { in nl80211_trigger_scan()
8172 chan = &wiphy->bands[band]->channels[j]; in nl80211_trigger_scan()
8174 if (chan->flags & IEEE80211_CHAN_DISABLED) in nl80211_trigger_scan()
8177 request->channels[i] = chan; in nl80211_trigger_scan()
8184 err = -EINVAL; in nl80211_trigger_scan()
8188 request->n_channels = i; in nl80211_trigger_scan()
8194 if (request->n_channels != 1) { in nl80211_trigger_scan()
8196 err = -EBUSY; in nl80211_trigger_scan()
8200 chan = request->channels[0]; in nl80211_trigger_scan()
8201 if (chan->center_freq != wdev->chandef.chan->center_freq) { in nl80211_trigger_scan()
8203 err = -EBUSY; in nl80211_trigger_scan()
8211 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp) { in nl80211_trigger_scan()
8213 err = -EINVAL; in nl80211_trigger_scan()
8216 request->ssids[i].ssid_len = nla_len(attr); in nl80211_trigger_scan()
8217 memcpy(request->ssids[i].ssid, nla_data(attr), nla_len(attr)); in nl80211_trigger_scan()
8222 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_trigger_scan()
8223 request->ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_trigger_scan()
8224 memcpy((void *)request->ie, in nl80211_trigger_scan()
8225 nla_data(info->attrs[NL80211_ATTR_IE]), in nl80211_trigger_scan()
8226 request->ie_len); in nl80211_trigger_scan()
8230 if (wiphy->bands[i]) in nl80211_trigger_scan()
8231 request->rates[i] = in nl80211_trigger_scan()
8232 (1 << wiphy->bands[i]->n_bitrates) - 1; in nl80211_trigger_scan()
8234 if (info->attrs[NL80211_ATTR_SCAN_SUPP_RATES]) { in nl80211_trigger_scan()
8236 info->attrs[NL80211_ATTR_SCAN_SUPP_RATES], in nl80211_trigger_scan()
8241 err = -EINVAL; in nl80211_trigger_scan()
8245 if (!wiphy->bands[band]) in nl80211_trigger_scan()
8248 err = ieee80211_get_ratemask(wiphy->bands[band], in nl80211_trigger_scan()
8251 &request->rates[band]); in nl80211_trigger_scan()
8257 if (info->attrs[NL80211_ATTR_MEASUREMENT_DURATION]) { in nl80211_trigger_scan()
8260 err = -EOPNOTSUPP; in nl80211_trigger_scan()
8264 request->duration = in nl80211_trigger_scan()
8265 nla_get_u16(info->attrs[NL80211_ATTR_MEASUREMENT_DURATION]); in nl80211_trigger_scan()
8266 request->duration_mandatory = in nl80211_trigger_scan()
8267 nla_get_flag(info->attrs[NL80211_ATTR_MEASUREMENT_DURATION_MANDATORY]); in nl80211_trigger_scan()
8270 err = nl80211_check_scan_flags(wiphy, wdev, request, info->attrs, in nl80211_trigger_scan()
8275 request->no_cck = in nl80211_trigger_scan()
8276 nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]); in nl80211_trigger_scan()
8287 if (info->attrs[NL80211_ATTR_BSSID]) in nl80211_trigger_scan()
8288 memcpy(request->bssid, in nl80211_trigger_scan()
8289 nla_data(info->attrs[NL80211_ATTR_BSSID]), ETH_ALEN); in nl80211_trigger_scan()
8290 else if (!(request->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) && in nl80211_trigger_scan()
8291 info->attrs[NL80211_ATTR_MAC]) in nl80211_trigger_scan()
8292 memcpy(request->bssid, nla_data(info->attrs[NL80211_ATTR_MAC]), in nl80211_trigger_scan()
8295 eth_broadcast_addr(request->bssid); in nl80211_trigger_scan()
8297 request->wdev = wdev; in nl80211_trigger_scan()
8298 request->wiphy = &rdev->wiphy; in nl80211_trigger_scan()
8299 request->scan_start = jiffies; in nl80211_trigger_scan()
8301 rdev->scan_req = request; in nl80211_trigger_scan()
8308 if (wdev->netdev) in nl80211_trigger_scan()
8309 dev_hold(wdev->netdev); in nl80211_trigger_scan()
8314 rdev->scan_req = NULL; in nl80211_trigger_scan()
8322 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_abort_scan()
8323 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_abort_scan()
8325 if (!rdev->ops->abort_scan) in nl80211_abort_scan()
8326 return -EOPNOTSUPP; in nl80211_abort_scan()
8328 if (rdev->scan_msg) in nl80211_abort_scan()
8331 if (!rdev->scan_req) in nl80211_abort_scan()
8332 return -ENOENT; in nl80211_abort_scan()
8357 return -EINVAL; in nl80211_parse_sched_scan_plans()
8359 request->scan_plans[0].interval = in nl80211_parse_sched_scan_plans()
8361 if (!request->scan_plans[0].interval) in nl80211_parse_sched_scan_plans()
8362 return -EINVAL; in nl80211_parse_sched_scan_plans()
8364 if (request->scan_plans[0].interval > in nl80211_parse_sched_scan_plans()
8365 wiphy->max_sched_scan_plan_interval) in nl80211_parse_sched_scan_plans()
8366 request->scan_plans[0].interval = in nl80211_parse_sched_scan_plans()
8367 wiphy->max_sched_scan_plan_interval; in nl80211_parse_sched_scan_plans()
8376 return -EINVAL; in nl80211_parse_sched_scan_plans()
8386 return -EINVAL; in nl80211_parse_sched_scan_plans()
8388 request->scan_plans[i].interval = in nl80211_parse_sched_scan_plans()
8390 if (!request->scan_plans[i].interval || in nl80211_parse_sched_scan_plans()
8391 request->scan_plans[i].interval > in nl80211_parse_sched_scan_plans()
8392 wiphy->max_sched_scan_plan_interval) in nl80211_parse_sched_scan_plans()
8393 return -EINVAL; in nl80211_parse_sched_scan_plans()
8396 request->scan_plans[i].iterations = in nl80211_parse_sched_scan_plans()
8398 if (!request->scan_plans[i].iterations || in nl80211_parse_sched_scan_plans()
8399 (request->scan_plans[i].iterations > in nl80211_parse_sched_scan_plans()
8400 wiphy->max_sched_scan_plan_iterations)) in nl80211_parse_sched_scan_plans()
8401 return -EINVAL; in nl80211_parse_sched_scan_plans()
8402 } else if (i < n_plans - 1) { in nl80211_parse_sched_scan_plans()
8407 return -EINVAL; in nl80211_parse_sched_scan_plans()
8417 if (request->scan_plans[n_plans - 1].iterations) in nl80211_parse_sched_scan_plans()
8418 return -EINVAL; in nl80211_parse_sched_scan_plans()
8435 ret = -EOPNOTSUPP; in nl80211_parse_sched_scan_per_band_rssi()
8438 match_sets->per_band_rssi_thold[i] = in nl80211_parse_sched_scan_per_band_rssi()
8444 match_sets->per_band_rssi_thold[i] = rssi_thold; in nl80211_parse_sched_scan_per_band_rssi()
8450 return -EINVAL; in nl80211_parse_sched_scan_per_band_rssi()
8452 match_sets->per_band_rssi_thold[band] = nla_get_s32(attr); in nl80211_parse_sched_scan_per_band_rssi()
8474 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
8484 if (n_ssids > wiphy->max_sched_scan_ssids) in nl80211_parse_sched_scan()
8485 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
8494 * global RSSI for all other matchsets - if there are other matchsets. in nl80211_parse_sched_scan()
8513 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
8532 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
8539 if (ie_len > wiphy->max_sched_scan_ie_len) in nl80211_parse_sched_scan()
8540 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
8548 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
8561 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
8566 if (!n_plans || n_plans > wiphy->max_sched_scan_plans) in nl80211_parse_sched_scan()
8567 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
8573 return ERR_PTR(-EINVAL); in nl80211_parse_sched_scan()
8576 + sizeof(*request->ssids) * n_ssids in nl80211_parse_sched_scan()
8577 + sizeof(*request->match_sets) * n_match_sets in nl80211_parse_sched_scan()
8578 + sizeof(*request->scan_plans) * n_plans in nl80211_parse_sched_scan()
8579 + sizeof(*request->channels) * n_channels in nl80211_parse_sched_scan()
8582 return ERR_PTR(-ENOMEM); in nl80211_parse_sched_scan()
8585 request->ssids = (void *)&request->channels[n_channels]; in nl80211_parse_sched_scan()
8586 request->n_ssids = n_ssids; in nl80211_parse_sched_scan()
8589 request->ie = (void *)(request->ssids + n_ssids); in nl80211_parse_sched_scan()
8591 request->ie = (void *)(request->channels + n_channels); in nl80211_parse_sched_scan()
8595 if (request->ie) in nl80211_parse_sched_scan()
8596 request->match_sets = (void *)(request->ie + ie_len); in nl80211_parse_sched_scan()
8598 request->match_sets = in nl80211_parse_sched_scan()
8599 (void *)(request->ssids + n_ssids); in nl80211_parse_sched_scan()
8601 request->match_sets = in nl80211_parse_sched_scan()
8602 (void *)(request->channels + n_channels); in nl80211_parse_sched_scan()
8604 request->n_match_sets = n_match_sets; in nl80211_parse_sched_scan()
8607 request->scan_plans = (void *)(request->match_sets + in nl80211_parse_sched_scan()
8609 else if (request->ie) in nl80211_parse_sched_scan()
8610 request->scan_plans = (void *)(request->ie + ie_len); in nl80211_parse_sched_scan()
8612 request->scan_plans = (void *)(request->ssids + n_ssids); in nl80211_parse_sched_scan()
8614 request->scan_plans = (void *)(request->channels + n_channels); in nl80211_parse_sched_scan()
8616 request->n_scan_plans = n_plans; in nl80211_parse_sched_scan()
8629 err = -EINVAL; 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()
8645 if (!wiphy->bands[band]) in nl80211_parse_sched_scan()
8647 for (j = 0; j < wiphy->bands[band]->n_channels; j++) { in nl80211_parse_sched_scan()
8650 chan = &wiphy->bands[band]->channels[j]; in nl80211_parse_sched_scan()
8652 if (chan->flags & IEEE80211_CHAN_DISABLED) in nl80211_parse_sched_scan()
8655 request->channels[i] = chan; in nl80211_parse_sched_scan()
8662 err = -EINVAL; in nl80211_parse_sched_scan()
8666 request->n_channels = i; in nl80211_parse_sched_scan()
8673 err = -EINVAL; in nl80211_parse_sched_scan()
8676 request->ssids[i].ssid_len = nla_len(attr); in nl80211_parse_sched_scan()
8677 memcpy(request->ssids[i].ssid, nla_data(attr), in nl80211_parse_sched_scan()
8710 err = -EINVAL; in nl80211_parse_sched_scan()
8715 memcpy(request->match_sets[i].ssid.ssid, in nl80211_parse_sched_scan()
8717 request->match_sets[i].ssid.ssid_len = in nl80211_parse_sched_scan()
8721 memcpy(request->match_sets[i].bssid, in nl80211_parse_sched_scan()
8724 /* special attribute - old implementation w/a */ in nl80211_parse_sched_scan()
8725 request->match_sets[i].rssi_thold = default_match_rssi; in nl80211_parse_sched_scan()
8728 request->match_sets[i].rssi_thold = in nl80211_parse_sched_scan()
8733 &request->match_sets[i], in nl80211_parse_sched_scan()
8735 request->match_sets[i].rssi_thold); in nl80211_parse_sched_scan()
8744 request->match_sets[0].rssi_thold = default_match_rssi; in nl80211_parse_sched_scan()
8746 request->min_rssi_thold = INT_MAX; in nl80211_parse_sched_scan()
8748 request->min_rssi_thold = in nl80211_parse_sched_scan()
8749 min(request->match_sets[i].rssi_thold, in nl80211_parse_sched_scan()
8750 request->min_rssi_thold); in nl80211_parse_sched_scan()
8752 request->min_rssi_thold = NL80211_SCAN_RSSI_THOLD_OFF; in nl80211_parse_sched_scan()
8756 request->ie_len = ie_len; in nl80211_parse_sched_scan()
8757 memcpy((void *)request->ie, in nl80211_parse_sched_scan()
8759 request->ie_len); in nl80211_parse_sched_scan()
8767 request->delay = in nl80211_parse_sched_scan()
8771 request->relative_rssi = nla_get_s8( in nl80211_parse_sched_scan()
8773 request->relative_rssi_set = true; in nl80211_parse_sched_scan()
8776 if (request->relative_rssi_set && in nl80211_parse_sched_scan()
8782 request->rssi_adjust.band = rssi_adjust->band; in nl80211_parse_sched_scan()
8783 request->rssi_adjust.delta = rssi_adjust->delta; in nl80211_parse_sched_scan()
8784 if (!is_band_valid(wiphy, request->rssi_adjust.band)) { in nl80211_parse_sched_scan()
8785 err = -EINVAL; in nl80211_parse_sched_scan()
8794 request->scan_start = jiffies; in nl80211_parse_sched_scan()
8806 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_start_sched_scan()
8807 struct net_device *dev = info->user_ptr[1]; in nl80211_start_sched_scan()
8808 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_start_sched_scan()
8813 if (!rdev->wiphy.max_sched_scan_reqs || !rdev->ops->sched_scan_start) in nl80211_start_sched_scan()
8814 return -EOPNOTSUPP; in nl80211_start_sched_scan()
8816 want_multi = info->attrs[NL80211_ATTR_SCHED_SCAN_MULTI]; in nl80211_start_sched_scan()
8821 sched_scan_req = nl80211_parse_sched_scan(&rdev->wiphy, wdev, in nl80211_start_sched_scan()
8822 info->attrs, in nl80211_start_sched_scan()
8823 rdev->wiphy.max_match_sets); in nl80211_start_sched_scan()
8830 * or if driver does not support multi-scheduled scan in nl80211_start_sched_scan()
8832 if (want_multi && rdev->wiphy.max_sched_scan_reqs > 1) in nl80211_start_sched_scan()
8833 sched_scan_req->reqid = cfg80211_assign_cookie(rdev); in nl80211_start_sched_scan()
8839 sched_scan_req->dev = dev; in nl80211_start_sched_scan()
8840 sched_scan_req->wiphy = &rdev->wiphy; in nl80211_start_sched_scan()
8842 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) in nl80211_start_sched_scan()
8843 sched_scan_req->owner_nlportid = info->snd_portid; in nl80211_start_sched_scan()
8860 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_stop_sched_scan()
8863 if (!rdev->wiphy.max_sched_scan_reqs || !rdev->ops->sched_scan_stop) in nl80211_stop_sched_scan()
8864 return -EOPNOTSUPP; in nl80211_stop_sched_scan()
8866 if (info->attrs[NL80211_ATTR_COOKIE]) { in nl80211_stop_sched_scan()
8867 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); in nl80211_stop_sched_scan()
8871 req = list_first_or_null_rcu(&rdev->sched_scan_req_list, in nl80211_stop_sched_scan()
8874 if (!req || req->reqid || in nl80211_stop_sched_scan()
8875 (req->owner_nlportid && in nl80211_stop_sched_scan()
8876 req->owner_nlportid != info->snd_portid)) in nl80211_stop_sched_scan()
8877 return -ENOENT; in nl80211_stop_sched_scan()
8885 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_start_radar_detection()
8886 struct net_device *dev = info->user_ptr[1]; in nl80211_start_radar_detection()
8887 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_start_radar_detection()
8888 struct wiphy *wiphy = wdev->wiphy; in nl80211_start_radar_detection()
8896 return -EINVAL; in nl80211_start_radar_detection()
8903 return -EBUSY; in nl80211_start_radar_detection()
8905 if (wdev->cac_started) in nl80211_start_radar_detection()
8906 return -EBUSY; in nl80211_start_radar_detection()
8908 err = cfg80211_chandef_dfs_required(wiphy, &chandef, wdev->iftype); in nl80211_start_radar_detection()
8913 return -EINVAL; in nl80211_start_radar_detection()
8916 return -EINVAL; in nl80211_start_radar_detection()
8920 return -EOPNOTSUPP; in nl80211_start_radar_detection()
8922 if (!rdev->ops->start_radar_detection) in nl80211_start_radar_detection()
8923 return -EOPNOTSUPP; in nl80211_start_radar_detection()
8925 cac_time_ms = cfg80211_chandef_dfs_cac_time(&rdev->wiphy, &chandef); in nl80211_start_radar_detection()
8931 wdev->chandef = chandef; in nl80211_start_radar_detection()
8932 wdev->cac_started = true; in nl80211_start_radar_detection()
8933 wdev->cac_start_time = jiffies; in nl80211_start_radar_detection()
8934 wdev->cac_time_ms = cac_time_ms; in nl80211_start_radar_detection()
8942 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_notify_radar_detection()
8943 struct net_device *dev = info->user_ptr[1]; in nl80211_notify_radar_detection()
8944 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_notify_radar_detection()
8945 struct wiphy *wiphy = wdev->wiphy; in nl80211_notify_radar_detection()
8954 return -EINVAL; in nl80211_notify_radar_detection()
8963 err = cfg80211_chandef_dfs_required(wiphy, &chandef, wdev->iftype); in nl80211_notify_radar_detection()
8972 return -EINVAL; in nl80211_notify_radar_detection()
8978 if (chandef.chan->dfs_state == NL80211_DFS_UNAVAILABLE) in nl80211_notify_radar_detection()
8985 rdev->radar_chandef = chandef; in nl80211_notify_radar_detection()
8988 queue_work(cfg80211_wq, &rdev->propagate_radar_detect_wk); in nl80211_notify_radar_detection()
8995 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_channel_switch()
8996 struct net_device *dev = info->user_ptr[1]; in nl80211_channel_switch()
8997 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_channel_switch()
8999 /* csa_attrs is defined static to avoid waste of stack size - this in nl80211_channel_switch()
9009 if (!rdev->ops->channel_switch || in nl80211_channel_switch()
9010 !(rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH)) in nl80211_channel_switch()
9011 return -EOPNOTSUPP; in nl80211_channel_switch()
9013 switch (dev->ieee80211_ptr->iftype) { in nl80211_channel_switch()
9025 if (!wdev->beacon_interval) in nl80211_channel_switch()
9026 return -ENOTCONN; in nl80211_channel_switch()
9029 if (!wdev->ssid_len) in nl80211_channel_switch()
9030 return -ENOTCONN; in nl80211_channel_switch()
9033 if (!wdev->mesh_id_len) in nl80211_channel_switch()
9034 return -ENOTCONN; in nl80211_channel_switch()
9037 return -EOPNOTSUPP; in nl80211_channel_switch()
9041 params.beacon_csa.ftm_responder = -1; in nl80211_channel_switch()
9043 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ] || in nl80211_channel_switch()
9044 !info->attrs[NL80211_ATTR_CH_SWITCH_COUNT]) in nl80211_channel_switch()
9045 return -EINVAL; in nl80211_channel_switch()
9048 if (need_new_beacon && !info->attrs[NL80211_ATTR_CSA_IES]) in nl80211_channel_switch()
9049 return -EINVAL; in nl80211_channel_switch()
9054 cs_count = nla_get_u32(info->attrs[NL80211_ATTR_CH_SWITCH_COUNT]); in nl80211_channel_switch()
9056 return -EINVAL; in nl80211_channel_switch()
9063 err = nl80211_parse_beacon(rdev, info->attrs, ¶ms.beacon_after); in nl80211_channel_switch()
9068 info->attrs[NL80211_ATTR_CSA_IES], in nl80211_channel_switch()
9069 nl80211_policy, info->extack); in nl80211_channel_switch()
9078 return -EINVAL; in nl80211_channel_switch()
9082 return -EINVAL; in nl80211_channel_switch()
9085 if (rdev->wiphy.max_num_csa_counters && in nl80211_channel_switch()
9087 rdev->wiphy.max_num_csa_counters)) in nl80211_channel_switch()
9088 return -EINVAL; in nl80211_channel_switch()
9093 /* sanity checks - counters should fit and be the same */ in nl80211_channel_switch()
9098 return -EINVAL; in nl80211_channel_switch()
9101 return -EINVAL; in nl80211_channel_switch()
9107 return -EINVAL; in nl80211_channel_switch()
9110 if (rdev->wiphy.max_num_csa_counters && in nl80211_channel_switch()
9112 rdev->wiphy.max_num_csa_counters)) in nl80211_channel_switch()
9113 return -EINVAL; in nl80211_channel_switch()
9118 /* sanity checks - counters should fit and be the same */ in nl80211_channel_switch()
9123 return -EINVAL; in nl80211_channel_switch()
9127 return -EINVAL; in nl80211_channel_switch()
9136 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, ¶ms.chandef, in nl80211_channel_switch()
9137 wdev->iftype)) in nl80211_channel_switch()
9138 return -EINVAL; in nl80211_channel_switch()
9140 err = cfg80211_chandef_dfs_required(wdev->wiphy, in nl80211_channel_switch()
9142 wdev->iftype); in nl80211_channel_switch()
9149 !nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS])) { in nl80211_channel_switch()
9150 return -EINVAL; in nl80211_channel_switch()
9154 if (info->attrs[NL80211_ATTR_CH_SWITCH_BLOCK_TX]) in nl80211_channel_switch()
9170 struct cfg80211_bss *res = &intbss->pub; in nl80211_send_bss()
9177 hdr = nl80211hdr_put(msg, NETLINK_CB(cb->skb).portid, seq, flags, in nl80211_send_bss()
9180 return -1; in nl80211_send_bss()
9184 if (nla_put_u32(msg, NL80211_ATTR_GENERATION, rdev->bss_generation)) in nl80211_send_bss()
9186 if (wdev->netdev && in nl80211_send_bss()
9187 nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex)) in nl80211_send_bss()
9196 if ((!is_zero_ether_addr(res->bssid) && in nl80211_send_bss()
9197 nla_put(msg, NL80211_BSS_BSSID, ETH_ALEN, res->bssid))) in nl80211_send_bss()
9202 if (rcu_access_pointer(res->proberesp_ies) && in nl80211_send_bss()
9209 ies = rcu_dereference(res->ies); in nl80211_send_bss()
9211 if (nla_put_u64_64bit(msg, NL80211_BSS_TSF, ies->tsf, in nl80211_send_bss()
9214 if (ies->len && nla_put(msg, NL80211_BSS_INFORMATION_ELEMENTS, in nl80211_send_bss()
9215 ies->len, ies->data)) in nl80211_send_bss()
9220 ies = rcu_dereference(res->beacon_ies); in nl80211_send_bss()
9221 if (ies && ies->from_beacon) { in nl80211_send_bss()
9222 if (nla_put_u64_64bit(msg, NL80211_BSS_BEACON_TSF, ies->tsf, in nl80211_send_bss()
9225 if (ies->len && nla_put(msg, NL80211_BSS_BEACON_IES, in nl80211_send_bss()
9226 ies->len, ies->data)) in nl80211_send_bss()
9231 if (res->beacon_interval && in nl80211_send_bss()
9232 nla_put_u16(msg, NL80211_BSS_BEACON_INTERVAL, res->beacon_interval)) in nl80211_send_bss()
9234 if (nla_put_u16(msg, NL80211_BSS_CAPABILITY, res->capability) || in nl80211_send_bss()
9235 nla_put_u32(msg, NL80211_BSS_FREQUENCY, res->channel->center_freq) || in nl80211_send_bss()
9237 res->channel->freq_offset) || in nl80211_send_bss()
9238 nla_put_u32(msg, NL80211_BSS_CHAN_WIDTH, res->scan_width) || in nl80211_send_bss()
9240 jiffies_to_msecs(jiffies - intbss->ts))) in nl80211_send_bss()
9243 if (intbss->parent_tsf && in nl80211_send_bss()
9245 intbss->parent_tsf, NL80211_BSS_PAD) || in nl80211_send_bss()
9247 intbss->parent_bssid))) in nl80211_send_bss()
9250 if (intbss->ts_boottime && in nl80211_send_bss()
9252 intbss->ts_boottime, NL80211_BSS_PAD)) in nl80211_send_bss()
9255 if (!nl80211_put_signal(msg, intbss->pub.chains, in nl80211_send_bss()
9256 intbss->pub.chain_signal, in nl80211_send_bss()
9260 switch (rdev->wiphy.signal_type) { in nl80211_send_bss()
9262 if (nla_put_u32(msg, NL80211_BSS_SIGNAL_MBM, res->signal)) in nl80211_send_bss()
9266 if (nla_put_u8(msg, NL80211_BSS_SIGNAL_UNSPEC, res->signal)) in nl80211_send_bss()
9273 switch (wdev->iftype) { in nl80211_send_bss()
9276 if (intbss == wdev->current_bss && in nl80211_send_bss()
9282 if (intbss == wdev->current_bss && in nl80211_send_bss()
9300 return -EMSGSIZE; in nl80211_send_bss()
9308 int start = cb->args[2], idx = 0; in nl80211_dump_scan()
9319 spin_lock_bh(&rdev->bss_lock); in nl80211_dump_scan()
9323 * into multiple messages. It is unlikely that any more bss-es will be in nl80211_dump_scan()
9330 cb->seq = rdev->bss_generation; in nl80211_dump_scan()
9332 list_for_each_entry(scan, &rdev->bss_list, list) { in nl80211_dump_scan()
9336 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_dump_scan()
9338 idx--; in nl80211_dump_scan()
9343 spin_unlock_bh(&rdev->bss_lock); in nl80211_dump_scan()
9346 cb->args[2] = idx; in nl80211_dump_scan()
9349 return skb->len; in nl80211_dump_scan()
9361 if (!survey->channel && !allow_radio_stats) in nl80211_send_survey()
9367 return -ENOMEM; in nl80211_send_survey()
9369 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) in nl80211_send_survey()
9376 if (survey->channel && in nl80211_send_survey()
9378 survey->channel->center_freq)) in nl80211_send_survey()
9381 if (survey->channel && survey->channel->freq_offset && in nl80211_send_survey()
9383 survey->channel->freq_offset)) in nl80211_send_survey()
9386 if ((survey->filled & SURVEY_INFO_NOISE_DBM) && in nl80211_send_survey()
9387 nla_put_u8(msg, NL80211_SURVEY_INFO_NOISE, survey->noise)) in nl80211_send_survey()
9389 if ((survey->filled & SURVEY_INFO_IN_USE) && in nl80211_send_survey()
9392 if ((survey->filled & SURVEY_INFO_TIME) && in nl80211_send_survey()
9394 survey->time, NL80211_SURVEY_INFO_PAD)) in nl80211_send_survey()
9396 if ((survey->filled & SURVEY_INFO_TIME_BUSY) && in nl80211_send_survey()
9398 survey->time_busy, NL80211_SURVEY_INFO_PAD)) in nl80211_send_survey()
9400 if ((survey->filled & SURVEY_INFO_TIME_EXT_BUSY) && in nl80211_send_survey()
9402 survey->time_ext_busy, NL80211_SURVEY_INFO_PAD)) in nl80211_send_survey()
9404 if ((survey->filled & SURVEY_INFO_TIME_RX) && in nl80211_send_survey()
9406 survey->time_rx, NL80211_SURVEY_INFO_PAD)) in nl80211_send_survey()
9408 if ((survey->filled & SURVEY_INFO_TIME_TX) && in nl80211_send_survey()
9410 survey->time_tx, NL80211_SURVEY_INFO_PAD)) in nl80211_send_survey()
9412 if ((survey->filled & SURVEY_INFO_TIME_SCAN) && in nl80211_send_survey()
9414 survey->time_scan, NL80211_SURVEY_INFO_PAD)) in nl80211_send_survey()
9416 if ((survey->filled & SURVEY_INFO_TIME_BSS_RX) && in nl80211_send_survey()
9418 survey->time_bss_rx, NL80211_SURVEY_INFO_PAD)) in nl80211_send_survey()
9428 return -EMSGSIZE; in nl80211_send_survey()
9437 int survey_idx = cb->args[2]; in nl80211_dump_survey()
9443 return -ENOMEM; in nl80211_dump_survey()
9453 if (!wdev->netdev) { in nl80211_dump_survey()
9454 res = -EINVAL; in nl80211_dump_survey()
9458 if (!rdev->ops->dump_survey) { in nl80211_dump_survey()
9459 res = -EOPNOTSUPP; in nl80211_dump_survey()
9464 res = rdev_dump_survey(rdev, wdev->netdev, survey_idx, &survey); in nl80211_dump_survey()
9465 if (res == -ENOENT) in nl80211_dump_survey()
9470 /* don't send disabled channels, but do send non-channel data */ in nl80211_dump_survey()
9472 survey.channel->flags & IEEE80211_CHAN_DISABLED) { in nl80211_dump_survey()
9478 NETLINK_CB(cb->skb).portid, in nl80211_dump_survey()
9479 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_dump_survey()
9480 wdev->netdev, radio_stats, &survey) < 0) in nl80211_dump_survey()
9486 cb->args[2] = survey_idx; in nl80211_dump_survey()
9487 res = skb->len; in nl80211_dump_survey()
9503 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_authenticate()
9504 struct net_device *dev = info->user_ptr[1]; in nl80211_authenticate()
9513 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_authenticate()
9514 return -EINVAL; in nl80211_authenticate()
9516 if (!info->attrs[NL80211_ATTR_AUTH_TYPE]) in nl80211_authenticate()
9517 return -EINVAL; in nl80211_authenticate()
9519 if (!info->attrs[NL80211_ATTR_SSID]) in nl80211_authenticate()
9520 return -EINVAL; in nl80211_authenticate()
9522 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ]) in nl80211_authenticate()
9523 return -EINVAL; in nl80211_authenticate()
9530 if (key.type != -1 && key.type != NL80211_KEYTYPE_GROUP) in nl80211_authenticate()
9531 return -EINVAL; in nl80211_authenticate()
9533 return -EINVAL; in nl80211_authenticate()
9538 return -EINVAL; in nl80211_authenticate()
9540 return -EINVAL; in nl80211_authenticate()
9550 for (i = 0; i < rdev->wiphy.n_cipher_suites; i++) { in nl80211_authenticate()
9551 if (key.p.cipher == rdev->wiphy.cipher_suites[i]) { in nl80211_authenticate()
9557 return -EINVAL; in nl80211_authenticate()
9560 if (!rdev->ops->auth) in nl80211_authenticate()
9561 return -EOPNOTSUPP; in nl80211_authenticate()
9563 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_authenticate()
9564 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_authenticate()
9565 return -EOPNOTSUPP; in nl80211_authenticate()
9567 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_authenticate()
9568 freq = MHZ_TO_KHZ(nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ])); in nl80211_authenticate()
9569 if (info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]) in nl80211_authenticate()
9571 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]); in nl80211_authenticate()
9573 chan = nl80211_get_valid_chan(&rdev->wiphy, freq); in nl80211_authenticate()
9575 return -EINVAL; in nl80211_authenticate()
9577 ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); in nl80211_authenticate()
9578 ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); in nl80211_authenticate()
9580 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_authenticate()
9581 ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_authenticate()
9582 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_authenticate()
9585 auth_type = nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]); in nl80211_authenticate()
9587 return -EINVAL; in nl80211_authenticate()
9593 !info->attrs[NL80211_ATTR_AUTH_DATA]) in nl80211_authenticate()
9594 return -EINVAL; in nl80211_authenticate()
9596 if (info->attrs[NL80211_ATTR_AUTH_DATA]) { in nl80211_authenticate()
9601 return -EINVAL; in nl80211_authenticate()
9602 auth_data = nla_data(info->attrs[NL80211_ATTR_AUTH_DATA]); in nl80211_authenticate()
9603 auth_data_len = nla_len(info->attrs[NL80211_ATTR_AUTH_DATA]); in nl80211_authenticate()
9606 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; in nl80211_authenticate()
9615 wdev_lock(dev->ieee80211_ptr); in nl80211_authenticate()
9620 wdev_unlock(dev->ieee80211_ptr); in nl80211_authenticate()
9627 if (!info->attrs[NL80211_ATTR_SOCKET_OWNER]) { in validate_pae_over_nl80211()
9629 return -EINVAL; in validate_pae_over_nl80211()
9632 if (!rdev->ops->tx_control_port || in validate_pae_over_nl80211()
9633 !wiphy_ext_feature_isset(&rdev->wiphy, in validate_pae_over_nl80211()
9635 return -EOPNOTSUPP; in validate_pae_over_nl80211()
9647 settings->control_port = info->attrs[NL80211_ATTR_CONTROL_PORT]; in nl80211_crypto_settings()
9649 if (info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]) { in nl80211_crypto_settings()
9653 info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]); in nl80211_crypto_settings()
9654 settings->control_port_ethertype = cpu_to_be16(proto); in nl80211_crypto_settings()
9655 if (!(rdev->wiphy.flags & WIPHY_FLAG_CONTROL_PORT_PROTOCOL) && in nl80211_crypto_settings()
9657 return -EINVAL; in nl80211_crypto_settings()
9658 if (info->attrs[NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT]) in nl80211_crypto_settings()
9659 settings->control_port_no_encrypt = true; in nl80211_crypto_settings()
9661 settings->control_port_ethertype = cpu_to_be16(ETH_P_PAE); in nl80211_crypto_settings()
9663 if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) { in nl80211_crypto_settings()
9669 settings->control_port_over_nl80211 = true; in nl80211_crypto_settings()
9671 if (info->attrs[NL80211_ATTR_CONTROL_PORT_NO_PREAUTH]) in nl80211_crypto_settings()
9672 settings->control_port_no_preauth = true; in nl80211_crypto_settings()
9675 if (info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]) { in nl80211_crypto_settings()
9679 data = nla_data(info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]); in nl80211_crypto_settings()
9680 len = nla_len(info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]); in nl80211_crypto_settings()
9681 settings->n_ciphers_pairwise = len / sizeof(u32); in nl80211_crypto_settings()
9684 return -EINVAL; in nl80211_crypto_settings()
9686 if (settings->n_ciphers_pairwise > cipher_limit) in nl80211_crypto_settings()
9687 return -EINVAL; in nl80211_crypto_settings()
9689 memcpy(settings->ciphers_pairwise, data, len); in nl80211_crypto_settings()
9691 for (i = 0; i < settings->n_ciphers_pairwise; i++) in nl80211_crypto_settings()
9693 &rdev->wiphy, in nl80211_crypto_settings()
9694 settings->ciphers_pairwise[i])) in nl80211_crypto_settings()
9695 return -EINVAL; in nl80211_crypto_settings()
9698 if (info->attrs[NL80211_ATTR_CIPHER_SUITE_GROUP]) { in nl80211_crypto_settings()
9699 settings->cipher_group = in nl80211_crypto_settings()
9700 nla_get_u32(info->attrs[NL80211_ATTR_CIPHER_SUITE_GROUP]); in nl80211_crypto_settings()
9701 if (!cfg80211_supported_cipher_suite(&rdev->wiphy, in nl80211_crypto_settings()
9702 settings->cipher_group)) in nl80211_crypto_settings()
9703 return -EINVAL; in nl80211_crypto_settings()
9706 if (info->attrs[NL80211_ATTR_WPA_VERSIONS]) { in nl80211_crypto_settings()
9707 settings->wpa_versions = in nl80211_crypto_settings()
9708 nla_get_u32(info->attrs[NL80211_ATTR_WPA_VERSIONS]); in nl80211_crypto_settings()
9709 if (!nl80211_valid_wpa_versions(settings->wpa_versions)) in nl80211_crypto_settings()
9710 return -EINVAL; in nl80211_crypto_settings()
9713 if (info->attrs[NL80211_ATTR_AKM_SUITES]) { in nl80211_crypto_settings()
9717 data = nla_data(info->attrs[NL80211_ATTR_AKM_SUITES]); in nl80211_crypto_settings()
9718 len = nla_len(info->attrs[NL80211_ATTR_AKM_SUITES]); in nl80211_crypto_settings()
9719 settings->n_akm_suites = len / sizeof(u32); in nl80211_crypto_settings()
9722 return -EINVAL; in nl80211_crypto_settings()
9724 if (settings->n_akm_suites > NL80211_MAX_NR_AKM_SUITES) in nl80211_crypto_settings()
9725 return -EINVAL; in nl80211_crypto_settings()
9727 memcpy(settings->akm_suites, data, len); in nl80211_crypto_settings()
9730 if (info->attrs[NL80211_ATTR_PMK]) { in nl80211_crypto_settings()
9731 if (nla_len(info->attrs[NL80211_ATTR_PMK]) != WLAN_PMK_LEN) in nl80211_crypto_settings()
9732 return -EINVAL; in nl80211_crypto_settings()
9733 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_crypto_settings()
9735 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_crypto_settings()
9737 return -EINVAL; in nl80211_crypto_settings()
9738 settings->psk = nla_data(info->attrs[NL80211_ATTR_PMK]); in nl80211_crypto_settings()
9741 if (info->attrs[NL80211_ATTR_SAE_PASSWORD]) { in nl80211_crypto_settings()
9742 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_crypto_settings()
9744 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_crypto_settings()
9746 return -EINVAL; in nl80211_crypto_settings()
9747 settings->sae_pwd = in nl80211_crypto_settings()
9748 nla_data(info->attrs[NL80211_ATTR_SAE_PASSWORD]); in nl80211_crypto_settings()
9749 settings->sae_pwd_len = in nl80211_crypto_settings()
9750 nla_len(info->attrs[NL80211_ATTR_SAE_PASSWORD]); in nl80211_crypto_settings()
9753 if (info->attrs[NL80211_ATTR_SAE_PWE]) in nl80211_crypto_settings()
9754 settings->sae_pwe = in nl80211_crypto_settings()
9755 nla_get_u8(info->attrs[NL80211_ATTR_SAE_PWE]); in nl80211_crypto_settings()
9757 settings->sae_pwe = NL80211_SAE_PWE_UNSPECIFIED; in nl80211_crypto_settings()
9764 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_associate()
9765 struct net_device *dev = info->user_ptr[1]; in nl80211_associate()
9772 if (dev->ieee80211_ptr->conn_owner_nlportid && in nl80211_associate()
9773 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) in nl80211_associate()
9774 return -EPERM; in nl80211_associate()
9776 if (!info->attrs[NL80211_ATTR_MAC] || in nl80211_associate()
9777 !info->attrs[NL80211_ATTR_SSID] || in nl80211_associate()
9778 !info->attrs[NL80211_ATTR_WIPHY_FREQ]) in nl80211_associate()
9779 return -EINVAL; in nl80211_associate()
9781 if (!rdev->ops->assoc) in nl80211_associate()
9782 return -EOPNOTSUPP; in nl80211_associate()
9784 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_associate()
9785 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_associate()
9786 return -EOPNOTSUPP; in nl80211_associate()
9788 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_associate()
9790 freq = MHZ_TO_KHZ(nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ])); in nl80211_associate()
9791 if (info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]) in nl80211_associate()
9793 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]); in nl80211_associate()
9794 chan = nl80211_get_valid_chan(&rdev->wiphy, freq); in nl80211_associate()
9796 return -EINVAL; in nl80211_associate()
9798 ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); in nl80211_associate()
9799 ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); in nl80211_associate()
9801 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_associate()
9802 req.ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_associate()
9803 req.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_associate()
9806 if (info->attrs[NL80211_ATTR_USE_MFP]) { in nl80211_associate()
9808 nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]); in nl80211_associate()
9812 return -EINVAL; in nl80211_associate()
9815 if (info->attrs[NL80211_ATTR_PREV_BSSID]) in nl80211_associate()
9816 req.prev_bssid = nla_data(info->attrs[NL80211_ATTR_PREV_BSSID]); in nl80211_associate()
9818 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HT])) in nl80211_associate()
9821 if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) in nl80211_associate()
9823 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]), in nl80211_associate()
9826 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) { in nl80211_associate()
9827 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) in nl80211_associate()
9828 return -EINVAL; in nl80211_associate()
9830 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]), in nl80211_associate()
9834 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_VHT])) in nl80211_associate()
9837 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) in nl80211_associate()
9839 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]), in nl80211_associate()
9842 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) { in nl80211_associate()
9843 if (!info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) in nl80211_associate()
9844 return -EINVAL; in nl80211_associate()
9846 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]), in nl80211_associate()
9850 if (nla_get_flag(info->attrs[NL80211_ATTR_USE_RRM])) { in nl80211_associate()
9851 if (!((rdev->wiphy.features & in nl80211_associate()
9853 (rdev->wiphy.features & NL80211_FEATURE_QUIET)) && in nl80211_associate()
9854 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_associate()
9856 return -EINVAL; in nl80211_associate()
9860 if (info->attrs[NL80211_ATTR_FILS_KEK]) { in nl80211_associate()
9861 req.fils_kek = nla_data(info->attrs[NL80211_ATTR_FILS_KEK]); in nl80211_associate()
9862 req.fils_kek_len = nla_len(info->attrs[NL80211_ATTR_FILS_KEK]); in nl80211_associate()
9863 if (!info->attrs[NL80211_ATTR_FILS_NONCES]) in nl80211_associate()
9864 return -EINVAL; in nl80211_associate()
9866 nla_data(info->attrs[NL80211_ATTR_FILS_NONCES]); in nl80211_associate()
9869 if (info->attrs[NL80211_ATTR_S1G_CAPABILITY_MASK]) { in nl80211_associate()
9870 if (!info->attrs[NL80211_ATTR_S1G_CAPABILITY]) in nl80211_associate()
9871 return -EINVAL; in nl80211_associate()
9873 nla_data(info->attrs[NL80211_ATTR_S1G_CAPABILITY_MASK]), in nl80211_associate()
9877 if (info->attrs[NL80211_ATTR_S1G_CAPABILITY]) { in nl80211_associate()
9878 if (!info->attrs[NL80211_ATTR_S1G_CAPABILITY_MASK]) in nl80211_associate()
9879 return -EINVAL; in nl80211_associate()
9881 nla_data(info->attrs[NL80211_ATTR_S1G_CAPABILITY]), in nl80211_associate()
9887 wdev_lock(dev->ieee80211_ptr); in nl80211_associate()
9892 if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) { in nl80211_associate()
9893 dev->ieee80211_ptr->conn_owner_nlportid = in nl80211_associate()
9894 info->snd_portid; in nl80211_associate()
9895 memcpy(dev->ieee80211_ptr->disconnect_bssid, in nl80211_associate()
9899 wdev_unlock(dev->ieee80211_ptr); in nl80211_associate()
9907 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_deauthenticate()
9908 struct net_device *dev = info->user_ptr[1]; in nl80211_deauthenticate()
9914 if (dev->ieee80211_ptr->conn_owner_nlportid && in nl80211_deauthenticate()
9915 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) in nl80211_deauthenticate()
9916 return -EPERM; in nl80211_deauthenticate()
9918 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_deauthenticate()
9919 return -EINVAL; in nl80211_deauthenticate()
9921 if (!info->attrs[NL80211_ATTR_REASON_CODE]) in nl80211_deauthenticate()
9922 return -EINVAL; in nl80211_deauthenticate()
9924 if (!rdev->ops->deauth) in nl80211_deauthenticate()
9925 return -EOPNOTSUPP; in nl80211_deauthenticate()
9927 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_deauthenticate()
9928 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_deauthenticate()
9929 return -EOPNOTSUPP; in nl80211_deauthenticate()
9931 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_deauthenticate()
9933 reason_code = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); in nl80211_deauthenticate()
9936 return -EINVAL; in nl80211_deauthenticate()
9939 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_deauthenticate()
9940 ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_deauthenticate()
9941 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_deauthenticate()
9944 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; in nl80211_deauthenticate()
9946 wdev_lock(dev->ieee80211_ptr); in nl80211_deauthenticate()
9949 wdev_unlock(dev->ieee80211_ptr); in nl80211_deauthenticate()
9955 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_disassociate()
9956 struct net_device *dev = info->user_ptr[1]; in nl80211_disassociate()
9962 if (dev->ieee80211_ptr->conn_owner_nlportid && in nl80211_disassociate()
9963 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) in nl80211_disassociate()
9964 return -EPERM; in nl80211_disassociate()
9966 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_disassociate()
9967 return -EINVAL; in nl80211_disassociate()
9969 if (!info->attrs[NL80211_ATTR_REASON_CODE]) in nl80211_disassociate()
9970 return -EINVAL; in nl80211_disassociate()
9972 if (!rdev->ops->disassoc) in nl80211_disassociate()
9973 return -EOPNOTSUPP; in nl80211_disassociate()
9975 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_disassociate()
9976 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_disassociate()
9977 return -EOPNOTSUPP; in nl80211_disassociate()
9979 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_disassociate()
9981 reason_code = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); in nl80211_disassociate()
9984 return -EINVAL; in nl80211_disassociate()
9987 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_disassociate()
9988 ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_disassociate()
9989 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_disassociate()
9992 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; in nl80211_disassociate()
9994 wdev_lock(dev->ieee80211_ptr); in nl80211_disassociate()
9997 wdev_unlock(dev->ieee80211_ptr); in nl80211_disassociate()
10006 struct wiphy *wiphy = &rdev->wiphy; in nl80211_parse_mcast_rate()
10013 sband = wiphy->bands[band]; in nl80211_parse_mcast_rate()
10017 for (i = 0; i < sband->n_bitrates; i++) { in nl80211_parse_mcast_rate()
10018 if (sband->bitrates[i].bitrate == rateval) { in nl80211_parse_mcast_rate()
10031 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_join_ibss()
10032 struct net_device *dev = info->user_ptr[1]; in nl80211_join_ibss()
10040 if (!info->attrs[NL80211_ATTR_SSID] || in nl80211_join_ibss()
10041 !nla_len(info->attrs[NL80211_ATTR_SSID])) in nl80211_join_ibss()
10042 return -EINVAL; in nl80211_join_ibss()
10046 if (info->attrs[NL80211_ATTR_BEACON_INTERVAL]) in nl80211_join_ibss()
10048 nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]); in nl80211_join_ibss()
10055 if (!rdev->ops->join_ibss) in nl80211_join_ibss()
10056 return -EOPNOTSUPP; in nl80211_join_ibss()
10058 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC) in nl80211_join_ibss()
10059 return -EOPNOTSUPP; in nl80211_join_ibss()
10061 wiphy = &rdev->wiphy; in nl80211_join_ibss()
10063 if (info->attrs[NL80211_ATTR_MAC]) { in nl80211_join_ibss()
10064 ibss.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_join_ibss()
10067 return -EINVAL; in nl80211_join_ibss()
10069 ibss.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); in nl80211_join_ibss()
10070 ibss.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); in nl80211_join_ibss()
10072 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_join_ibss()
10073 ibss.ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_join_ibss()
10074 ibss.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_join_ibss()
10081 if (!cfg80211_reg_can_beacon(&rdev->wiphy, &ibss.chandef, in nl80211_join_ibss()
10083 return -EINVAL; in nl80211_join_ibss()
10092 if (!(rdev->wiphy.features & NL80211_FEATURE_HT_IBSS)) in nl80211_join_ibss()
10093 return -EINVAL; in nl80211_join_ibss()
10098 if (!(rdev->wiphy.features & NL80211_FEATURE_HT_IBSS)) in nl80211_join_ibss()
10099 return -EINVAL; in nl80211_join_ibss()
10100 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_join_ibss()
10102 return -EINVAL; in nl80211_join_ibss()
10105 return -EINVAL; in nl80211_join_ibss()
10108 ibss.channel_fixed = !!info->attrs[NL80211_ATTR_FREQ_FIXED]; in nl80211_join_ibss()
10109 ibss.privacy = !!info->attrs[NL80211_ATTR_PRIVACY]; in nl80211_join_ibss()
10111 if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) { in nl80211_join_ibss()
10113 nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); in nl80211_join_ibss()
10115 nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); in nl80211_join_ibss()
10117 wiphy->bands[ibss.chandef.chan->band]; in nl80211_join_ibss()
10125 if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) in nl80211_join_ibss()
10127 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]), in nl80211_join_ibss()
10130 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) { in nl80211_join_ibss()
10131 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) in nl80211_join_ibss()
10132 return -EINVAL; in nl80211_join_ibss()
10134 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]), in nl80211_join_ibss()
10138 if (info->attrs[NL80211_ATTR_MCAST_RATE] && in nl80211_join_ibss()
10140 nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]))) in nl80211_join_ibss()
10141 return -EINVAL; in nl80211_join_ibss()
10143 if (ibss.privacy && info->attrs[NL80211_ATTR_KEYS]) { in nl80211_join_ibss()
10153 return -EINVAL; in nl80211_join_ibss()
10158 nla_get_flag(info->attrs[NL80211_ATTR_CONTROL_PORT]); in nl80211_join_ibss()
10160 if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) { in nl80211_join_ibss()
10172 nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS]); in nl80211_join_ibss()
10174 wdev_lock(dev->ieee80211_ptr); in nl80211_join_ibss()
10178 else if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) in nl80211_join_ibss()
10179 dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid; in nl80211_join_ibss()
10180 wdev_unlock(dev->ieee80211_ptr); in nl80211_join_ibss()
10187 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_leave_ibss()
10188 struct net_device *dev = info->user_ptr[1]; in nl80211_leave_ibss()
10190 if (!rdev->ops->leave_ibss) in nl80211_leave_ibss()
10191 return -EOPNOTSUPP; in nl80211_leave_ibss()
10193 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC) in nl80211_leave_ibss()
10194 return -EOPNOTSUPP; in nl80211_leave_ibss()
10201 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_mcast_rate()
10202 struct net_device *dev = info->user_ptr[1]; in nl80211_set_mcast_rate()
10207 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC && in nl80211_set_mcast_rate()
10208 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT && in nl80211_set_mcast_rate()
10209 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_OCB) in nl80211_set_mcast_rate()
10210 return -EOPNOTSUPP; in nl80211_set_mcast_rate()
10212 if (!rdev->ops->set_mcast_rate) in nl80211_set_mcast_rate()
10213 return -EOPNOTSUPP; in nl80211_set_mcast_rate()
10217 if (!info->attrs[NL80211_ATTR_MCAST_RATE]) in nl80211_set_mcast_rate()
10218 return -EINVAL; in nl80211_set_mcast_rate()
10220 nla_rate = nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]); in nl80211_set_mcast_rate()
10222 return -EINVAL; in nl80211_set_mcast_rate()
10251 if (nla_put_u32(skb, NL80211_ATTR_WIPHY, rdev->wiphy_idx)) in __cfg80211_alloc_vendor_skb()
10256 info->vendor_id)) in __cfg80211_alloc_vendor_skb()
10259 info->subcmd)) in __cfg80211_alloc_vendor_skb()
10267 if (wdev->netdev && in __cfg80211_alloc_vendor_skb()
10269 wdev->netdev->ifindex)) in __cfg80211_alloc_vendor_skb()
10277 ((void **)skb->cb)[0] = rdev; in __cfg80211_alloc_vendor_skb()
10278 ((void **)skb->cb)[1] = hdr; in __cfg80211_alloc_vendor_skb()
10279 ((void **)skb->cb)[2] = data; in __cfg80211_alloc_vendor_skb()
10301 if (WARN_ON(vendor_event_idx != -1)) in __cfg80211_alloc_event_skb()
10307 vendor_event_idx >= wiphy->n_vendor_events)) in __cfg80211_alloc_event_skb()
10309 info = &wiphy->vendor_events[vendor_event_idx]; in __cfg80211_alloc_event_skb()
10323 struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0]; in __cfg80211_send_event_skb()
10324 void *hdr = ((void **)skb->cb)[1]; in __cfg80211_send_event_skb()
10326 struct nlattr *data = ((void **)skb->cb)[2]; in __cfg80211_send_event_skb()
10330 memset(skb->cb, 0, sizeof(skb->cb)); in __cfg80211_send_event_skb()
10335 if (nlhdr->nlmsg_pid) { in __cfg80211_send_event_skb()
10336 genlmsg_unicast(wiphy_net(&rdev->wiphy), skb, in __cfg80211_send_event_skb()
10337 nlhdr->nlmsg_pid); in __cfg80211_send_event_skb()
10339 if (data->nla_type == NL80211_ATTR_VENDOR_DATA) in __cfg80211_send_event_skb()
10342 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), in __cfg80211_send_event_skb()
10351 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_testmode_do()
10353 __cfg80211_wdev_from_attrs(genl_info_net(info), info->attrs); in nl80211_testmode_do()
10356 if (!rdev->ops->testmode_cmd) in nl80211_testmode_do()
10357 return -EOPNOTSUPP; in nl80211_testmode_do()
10361 if (err != -EINVAL) in nl80211_testmode_do()
10364 } else if (wdev->wiphy != &rdev->wiphy) { in nl80211_testmode_do()
10365 return -EINVAL; in nl80211_testmode_do()
10368 if (!info->attrs[NL80211_ATTR_TESTDATA]) in nl80211_testmode_do()
10369 return -EINVAL; in nl80211_testmode_do()
10371 rdev->cur_cmd_info = info; in nl80211_testmode_do()
10373 nla_data(info->attrs[NL80211_ATTR_TESTDATA]), in nl80211_testmode_do()
10374 nla_len(info->attrs[NL80211_ATTR_TESTDATA])); in nl80211_testmode_do()
10375 rdev->cur_cmd_info = NULL; in nl80211_testmode_do()
10392 if (cb->args[0]) { in nl80211_testmode_dump()
10397 phy_idx = cb->args[0] - 1; in nl80211_testmode_dump()
10401 err = -ENOENT; in nl80211_testmode_dump()
10408 err = -ENOMEM; in nl80211_testmode_dump()
10412 err = nlmsg_parse_deprecated(cb->nlh, in nl80211_testmode_dump()
10419 rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk), attrbuf); in nl80211_testmode_dump()
10424 phy_idx = rdev->wiphy_idx; in nl80211_testmode_dump()
10427 cb->args[1] = (long)attrbuf[NL80211_ATTR_TESTDATA]; in nl80211_testmode_dump()
10430 if (cb->args[1]) { in nl80211_testmode_dump()
10431 data = nla_data((void *)cb->args[1]); in nl80211_testmode_dump()
10432 data_len = nla_len((void *)cb->args[1]); in nl80211_testmode_dump()
10435 if (!rdev->ops->testmode_dump) { in nl80211_testmode_dump()
10436 err = -EOPNOTSUPP; in nl80211_testmode_dump()
10441 void *hdr = nl80211hdr_put(skb, NETLINK_CB(cb->skb).portid, in nl80211_testmode_dump()
10442 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_testmode_dump()
10462 if (err == -ENOBUFS || err == -ENOENT) { in nl80211_testmode_dump()
10473 err = skb->len; in nl80211_testmode_dump()
10475 cb->args[0] = phy_idx + 1; in nl80211_testmode_dump()
10485 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_connect()
10486 struct net_device *dev = info->user_ptr[1]; in nl80211_connect()
10495 if (!info->attrs[NL80211_ATTR_SSID] || in nl80211_connect()
10496 !nla_len(info->attrs[NL80211_ATTR_SSID])) in nl80211_connect()
10497 return -EINVAL; in nl80211_connect()
10499 if (info->attrs[NL80211_ATTR_AUTH_TYPE]) { in nl80211_connect()
10501 nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]); in nl80211_connect()
10504 return -EINVAL; in nl80211_connect()
10508 connect.privacy = info->attrs[NL80211_ATTR_PRIVACY]; in nl80211_connect()
10510 if (info->attrs[NL80211_ATTR_WANT_1X_4WAY_HS] && in nl80211_connect()
10511 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_connect()
10513 return -EINVAL; in nl80211_connect()
10514 connect.want_1x = info->attrs[NL80211_ATTR_WANT_1X_4WAY_HS]; in nl80211_connect()
10521 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_connect()
10522 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_connect()
10523 return -EOPNOTSUPP; in nl80211_connect()
10525 wiphy = &rdev->wiphy; in nl80211_connect()
10527 connect.bg_scan_period = -1; in nl80211_connect()
10528 if (info->attrs[NL80211_ATTR_BG_SCAN_PERIOD] && in nl80211_connect()
10529 (wiphy->flags & WIPHY_FLAG_SUPPORTS_FW_ROAM)) { in nl80211_connect()
10531 nla_get_u16(info->attrs[NL80211_ATTR_BG_SCAN_PERIOD]); in nl80211_connect()
10534 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_connect()
10535 connect.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_connect()
10536 else if (info->attrs[NL80211_ATTR_MAC_HINT]) in nl80211_connect()
10538 nla_data(info->attrs[NL80211_ATTR_MAC_HINT]); in nl80211_connect()
10539 connect.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); in nl80211_connect()
10540 connect.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); in nl80211_connect()
10542 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_connect()
10543 connect.ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_connect()
10544 connect.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_connect()
10547 if (info->attrs[NL80211_ATTR_USE_MFP]) { in nl80211_connect()
10548 connect.mfp = nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]); in nl80211_connect()
10550 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_connect()
10552 return -EOPNOTSUPP; in nl80211_connect()
10557 if (info->attrs[NL80211_ATTR_PREV_BSSID]) in nl80211_connect()
10559 nla_data(info->attrs[NL80211_ATTR_PREV_BSSID]); in nl80211_connect()
10561 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) in nl80211_connect()
10563 info->attrs[NL80211_ATTR_WIPHY_FREQ])); in nl80211_connect()
10564 if (info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]) in nl80211_connect()
10566 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]); in nl80211_connect()
10571 return -EINVAL; in nl80211_connect()
10572 } else if (info->attrs[NL80211_ATTR_WIPHY_FREQ_HINT]) { in nl80211_connect()
10573 freq = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_HINT]); in nl80211_connect()
10577 return -EINVAL; in nl80211_connect()
10580 if (info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]) { in nl80211_connect()
10582 nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]); in nl80211_connect()
10584 if (info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]) in nl80211_connect()
10586 nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]); in nl80211_connect()
10589 if (connect.privacy && info->attrs[NL80211_ATTR_KEYS]) { in nl80211_connect()
10595 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HT])) in nl80211_connect()
10598 if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) in nl80211_connect()
10600 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]), in nl80211_connect()
10603 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) { in nl80211_connect()
10604 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) { in nl80211_connect()
10606 return -EINVAL; in nl80211_connect()
10609 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]), in nl80211_connect()
10613 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_VHT])) in nl80211_connect()
10616 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) in nl80211_connect()
10618 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]), in nl80211_connect()
10621 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) { in nl80211_connect()
10622 if (!info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) { in nl80211_connect()
10624 return -EINVAL; in nl80211_connect()
10627 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]), in nl80211_connect()
10631 if (nla_get_flag(info->attrs[NL80211_ATTR_USE_RRM])) { in nl80211_connect()
10632 if (!((rdev->wiphy.features & in nl80211_connect()
10634 (rdev->wiphy.features & NL80211_FEATURE_QUIET)) && in nl80211_connect()
10635 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_connect()
10638 return -EINVAL; in nl80211_connect()
10643 connect.pbss = nla_get_flag(info->attrs[NL80211_ATTR_PBSS]); in nl80211_connect()
10644 if (connect.pbss && !rdev->wiphy.bands[NL80211_BAND_60GHZ]) { in nl80211_connect()
10646 return -EOPNOTSUPP; in nl80211_connect()
10649 if (info->attrs[NL80211_ATTR_BSS_SELECT]) { in nl80211_connect()
10653 return -EINVAL; in nl80211_connect()
10656 err = parse_bss_select(info->attrs[NL80211_ATTR_BSS_SELECT], in nl80211_connect()
10664 if (wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_connect()
10666 info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] && in nl80211_connect()
10667 info->attrs[NL80211_ATTR_FILS_ERP_REALM] && in nl80211_connect()
10668 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] && in nl80211_connect()
10669 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { in nl80211_connect()
10671 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); in nl80211_connect()
10673 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); in nl80211_connect()
10675 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); in nl80211_connect()
10677 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); in nl80211_connect()
10680 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM]); in nl80211_connect()
10682 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); in nl80211_connect()
10684 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); in nl80211_connect()
10685 } else if (info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] || in nl80211_connect()
10686 info->attrs[NL80211_ATTR_FILS_ERP_REALM] || in nl80211_connect()
10687 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] || in nl80211_connect()
10688 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { in nl80211_connect()
10690 return -EINVAL; in nl80211_connect()
10693 if (nla_get_flag(info->attrs[NL80211_ATTR_EXTERNAL_AUTH_SUPPORT])) { in nl80211_connect()
10694 if (!info->attrs[NL80211_ATTR_SOCKET_OWNER]) { in nl80211_connect()
10698 return -EINVAL; in nl80211_connect()
10703 wdev_lock(dev->ieee80211_ptr); in nl80211_connect()
10710 if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) { in nl80211_connect()
10711 dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid; in nl80211_connect()
10713 memcpy(dev->ieee80211_ptr->disconnect_bssid, in nl80211_connect()
10716 eth_zero_addr(dev->ieee80211_ptr->disconnect_bssid); in nl80211_connect()
10719 wdev_unlock(dev->ieee80211_ptr); in nl80211_connect()
10728 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_update_connect_params()
10729 struct net_device *dev = info->user_ptr[1]; in nl80211_update_connect_params()
10730 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_update_connect_params()
10736 if (!rdev->ops->update_connect_params) in nl80211_update_connect_params()
10737 return -EOPNOTSUPP; in nl80211_update_connect_params()
10739 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_update_connect_params()
10740 connect.ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_update_connect_params()
10741 connect.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_update_connect_params()
10745 fils_sk_offload = wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_update_connect_params()
10749 * when driver supports fils-sk offload all attributes must be in nl80211_update_connect_params()
10750 * provided. So the else covers "fils-sk-not-all" and in nl80211_update_connect_params()
10751 * "no-fils-sk-any". in nl80211_update_connect_params()
10754 info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] && in nl80211_update_connect_params()
10755 info->attrs[NL80211_ATTR_FILS_ERP_REALM] && in nl80211_update_connect_params()
10756 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] && in nl80211_update_connect_params()
10757 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { in nl80211_update_connect_params()
10759 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); in nl80211_update_connect_params()
10761 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); in nl80211_update_connect_params()
10763 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); in nl80211_update_connect_params()
10765 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); in nl80211_update_connect_params()
10768 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM]); in nl80211_update_connect_params()
10770 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); in nl80211_update_connect_params()
10772 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); in nl80211_update_connect_params()
10774 } else if (info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] || in nl80211_update_connect_params()
10775 info->attrs[NL80211_ATTR_FILS_ERP_REALM] || in nl80211_update_connect_params()
10776 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] || in nl80211_update_connect_params()
10777 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { in nl80211_update_connect_params()
10778 return -EINVAL; in nl80211_update_connect_params()
10781 if (info->attrs[NL80211_ATTR_AUTH_TYPE]) { in nl80211_update_connect_params()
10782 auth_type = nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]); in nl80211_update_connect_params()
10785 return -EINVAL; in nl80211_update_connect_params()
10789 return -EINVAL; in nl80211_update_connect_params()
10795 wdev_lock(dev->ieee80211_ptr); in nl80211_update_connect_params()
10796 if (!wdev->current_bss) in nl80211_update_connect_params()
10797 ret = -ENOLINK; in nl80211_update_connect_params()
10800 wdev_unlock(dev->ieee80211_ptr); in nl80211_update_connect_params()
10807 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_disconnect()
10808 struct net_device *dev = info->user_ptr[1]; in nl80211_disconnect()
10812 if (dev->ieee80211_ptr->conn_owner_nlportid && in nl80211_disconnect()
10813 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) in nl80211_disconnect()
10814 return -EPERM; in nl80211_disconnect()
10816 if (!info->attrs[NL80211_ATTR_REASON_CODE]) in nl80211_disconnect()
10819 reason = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); in nl80211_disconnect()
10822 return -EINVAL; in nl80211_disconnect()
10824 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_disconnect()
10825 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_disconnect()
10826 return -EOPNOTSUPP; in nl80211_disconnect()
10828 wdev_lock(dev->ieee80211_ptr); in nl80211_disconnect()
10830 wdev_unlock(dev->ieee80211_ptr); in nl80211_disconnect()
10836 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_wiphy_netns()
10840 if (info->attrs[NL80211_ATTR_PID]) { in nl80211_wiphy_netns()
10841 u32 pid = nla_get_u32(info->attrs[NL80211_ATTR_PID]); in nl80211_wiphy_netns()
10844 } else if (info->attrs[NL80211_ATTR_NETNS_FD]) { in nl80211_wiphy_netns()
10845 u32 fd = nla_get_u32(info->attrs[NL80211_ATTR_NETNS_FD]); in nl80211_wiphy_netns()
10849 return -EINVAL; in nl80211_wiphy_netns()
10858 if (!net_eq(wiphy_net(&rdev->wiphy), net)) in nl80211_wiphy_netns()
10867 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_setdel_pmksa()
10870 struct net_device *dev = info->user_ptr[1]; in nl80211_setdel_pmksa()
10875 if (!info->attrs[NL80211_ATTR_PMKID]) in nl80211_setdel_pmksa()
10876 return -EINVAL; in nl80211_setdel_pmksa()
10878 pmksa.pmkid = nla_data(info->attrs[NL80211_ATTR_PMKID]); in nl80211_setdel_pmksa()
10880 if (info->attrs[NL80211_ATTR_MAC]) { in nl80211_setdel_pmksa()
10881 pmksa.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_setdel_pmksa()
10882 } else if (info->attrs[NL80211_ATTR_SSID] && in nl80211_setdel_pmksa()
10883 info->attrs[NL80211_ATTR_FILS_CACHE_ID] && in nl80211_setdel_pmksa()
10884 (info->genlhdr->cmd == NL80211_CMD_DEL_PMKSA || in nl80211_setdel_pmksa()
10885 info->attrs[NL80211_ATTR_PMK])) { in nl80211_setdel_pmksa()
10886 pmksa.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); in nl80211_setdel_pmksa()
10887 pmksa.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); in nl80211_setdel_pmksa()
10889 nla_data(info->attrs[NL80211_ATTR_FILS_CACHE_ID]); in nl80211_setdel_pmksa()
10891 return -EINVAL; in nl80211_setdel_pmksa()
10893 if (info->attrs[NL80211_ATTR_PMK]) { in nl80211_setdel_pmksa()
10894 pmksa.pmk = nla_data(info->attrs[NL80211_ATTR_PMK]); in nl80211_setdel_pmksa()
10895 pmksa.pmk_len = nla_len(info->attrs[NL80211_ATTR_PMK]); in nl80211_setdel_pmksa()
10898 if (info->attrs[NL80211_ATTR_PMK_LIFETIME]) in nl80211_setdel_pmksa()
10900 nla_get_u32(info->attrs[NL80211_ATTR_PMK_LIFETIME]); in nl80211_setdel_pmksa()
10902 if (info->attrs[NL80211_ATTR_PMK_REAUTH_THRESHOLD]) in nl80211_setdel_pmksa()
10905 info->attrs[NL80211_ATTR_PMK_REAUTH_THRESHOLD]); in nl80211_setdel_pmksa()
10907 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_setdel_pmksa()
10908 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT && in nl80211_setdel_pmksa()
10909 !(dev->ieee80211_ptr->iftype == NL80211_IFTYPE_AP && in nl80211_setdel_pmksa()
10910 wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_setdel_pmksa()
10912 return -EOPNOTSUPP; in nl80211_setdel_pmksa()
10914 switch (info->genlhdr->cmd) { in nl80211_setdel_pmksa()
10916 rdev_ops = rdev->ops->set_pmksa; in nl80211_setdel_pmksa()
10919 rdev_ops = rdev->ops->del_pmksa; in nl80211_setdel_pmksa()
10927 return -EOPNOTSUPP; in nl80211_setdel_pmksa()
10929 return rdev_ops(&rdev->wiphy, dev, &pmksa); in nl80211_setdel_pmksa()
10934 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_flush_pmksa()
10935 struct net_device *dev = info->user_ptr[1]; in nl80211_flush_pmksa()
10937 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && in nl80211_flush_pmksa()
10938 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_flush_pmksa()
10939 return -EOPNOTSUPP; in nl80211_flush_pmksa()
10941 if (!rdev->ops->flush_pmksa) in nl80211_flush_pmksa()
10942 return -EOPNOTSUPP; in nl80211_flush_pmksa()
10949 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_tdls_mgmt()
10950 struct net_device *dev = info->user_ptr[1]; in nl80211_tdls_mgmt()
10957 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) || in nl80211_tdls_mgmt()
10958 !rdev->ops->tdls_mgmt) in nl80211_tdls_mgmt()
10959 return -EOPNOTSUPP; in nl80211_tdls_mgmt()
10961 if (!info->attrs[NL80211_ATTR_TDLS_ACTION] || in nl80211_tdls_mgmt()
10962 !info->attrs[NL80211_ATTR_STATUS_CODE] || in nl80211_tdls_mgmt()
10963 !info->attrs[NL80211_ATTR_TDLS_DIALOG_TOKEN] || in nl80211_tdls_mgmt()
10964 !info->attrs[NL80211_ATTR_IE] || in nl80211_tdls_mgmt()
10965 !info->attrs[NL80211_ATTR_MAC]) in nl80211_tdls_mgmt()
10966 return -EINVAL; in nl80211_tdls_mgmt()
10968 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_tdls_mgmt()
10969 action_code = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_ACTION]); in nl80211_tdls_mgmt()
10970 status_code = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]); in nl80211_tdls_mgmt()
10971 dialog_token = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_DIALOG_TOKEN]); in nl80211_tdls_mgmt()
10972 initiator = nla_get_flag(info->attrs[NL80211_ATTR_TDLS_INITIATOR]); in nl80211_tdls_mgmt()
10973 if (info->attrs[NL80211_ATTR_TDLS_PEER_CAPABILITY]) in nl80211_tdls_mgmt()
10975 nla_get_u32(info->attrs[NL80211_ATTR_TDLS_PEER_CAPABILITY]); in nl80211_tdls_mgmt()
10980 nla_data(info->attrs[NL80211_ATTR_IE]), in nl80211_tdls_mgmt()
10981 nla_len(info->attrs[NL80211_ATTR_IE])); in nl80211_tdls_mgmt()
10986 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_tdls_oper()
10987 struct net_device *dev = info->user_ptr[1]; in nl80211_tdls_oper()
10991 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) || in nl80211_tdls_oper()
10992 !rdev->ops->tdls_oper) in nl80211_tdls_oper()
10993 return -EOPNOTSUPP; in nl80211_tdls_oper()
10995 if (!info->attrs[NL80211_ATTR_TDLS_OPERATION] || in nl80211_tdls_oper()
10996 !info->attrs[NL80211_ATTR_MAC]) in nl80211_tdls_oper()
10997 return -EINVAL; in nl80211_tdls_oper()
10999 operation = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_OPERATION]); in nl80211_tdls_oper()
11000 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_tdls_oper()
11008 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_remain_on_channel()
11009 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_remain_on_channel()
11018 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ] || in nl80211_remain_on_channel()
11019 !info->attrs[NL80211_ATTR_DURATION]) in nl80211_remain_on_channel()
11020 return -EINVAL; in nl80211_remain_on_channel()
11022 duration = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]); in nl80211_remain_on_channel()
11024 if (!rdev->ops->remain_on_channel || in nl80211_remain_on_channel()
11025 !(rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL)) in nl80211_remain_on_channel()
11026 return -EOPNOTSUPP; in nl80211_remain_on_channel()
11033 duration > rdev->wiphy.max_remain_on_channel_duration) in nl80211_remain_on_channel()
11034 return -EINVAL; in nl80211_remain_on_channel()
11042 !cfg80211_chandef_identical(&wdev->chandef, &chandef)) { in nl80211_remain_on_channel()
11043 compat_chandef = cfg80211_chandef_compatible(&wdev->chandef, in nl80211_remain_on_channel()
11047 return -EBUSY; in nl80211_remain_on_channel()
11054 return -ENOMEM; in nl80211_remain_on_channel()
11056 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_remain_on_channel()
11059 err = -ENOBUFS; in nl80211_remain_on_channel()
11078 err = -ENOBUFS; in nl80211_remain_on_channel()
11087 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_cancel_remain_on_channel()
11088 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_cancel_remain_on_channel()
11091 if (!info->attrs[NL80211_ATTR_COOKIE]) in nl80211_cancel_remain_on_channel()
11092 return -EINVAL; in nl80211_cancel_remain_on_channel()
11094 if (!rdev->ops->cancel_remain_on_channel) in nl80211_cancel_remain_on_channel()
11095 return -EOPNOTSUPP; in nl80211_cancel_remain_on_channel()
11097 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); in nl80211_cancel_remain_on_channel()
11106 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_tx_bitrate_mask()
11107 struct net_device *dev = info->user_ptr[1]; in nl80211_set_tx_bitrate_mask()
11108 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_tx_bitrate_mask()
11111 if (!rdev->ops->set_bitrate_mask) in nl80211_set_tx_bitrate_mask()
11112 return -EOPNOTSUPP; in nl80211_set_tx_bitrate_mask()
11115 err = nl80211_parse_tx_bitrate_mask(info, info->attrs, in nl80211_set_tx_bitrate_mask()
11129 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_register_mgmt()
11130 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_register_mgmt()
11133 if (!info->attrs[NL80211_ATTR_FRAME_MATCH]) in nl80211_register_mgmt()
11134 return -EINVAL; in nl80211_register_mgmt()
11136 if (info->attrs[NL80211_ATTR_FRAME_TYPE]) in nl80211_register_mgmt()
11137 frame_type = nla_get_u16(info->attrs[NL80211_ATTR_FRAME_TYPE]); in nl80211_register_mgmt()
11139 switch (wdev->iftype) { in nl80211_register_mgmt()
11151 return -EOPNOTSUPP; in nl80211_register_mgmt()
11155 if (!rdev->ops->mgmt_tx) in nl80211_register_mgmt()
11156 return -EOPNOTSUPP; in nl80211_register_mgmt()
11158 if (info->attrs[NL80211_ATTR_RECEIVE_MULTICAST] && in nl80211_register_mgmt()
11159 !wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_register_mgmt()
11162 "multicast RX registrations are not supported"); in nl80211_register_mgmt()
11163 return -EOPNOTSUPP; in nl80211_register_mgmt()
11166 return cfg80211_mlme_register_mgmt(wdev, info->snd_portid, frame_type, in nl80211_register_mgmt()
11167 nla_data(info->attrs[NL80211_ATTR_FRAME_MATCH]), in nl80211_register_mgmt()
11168 nla_len(info->attrs[NL80211_ATTR_FRAME_MATCH]), in nl80211_register_mgmt()
11169 info->attrs[NL80211_ATTR_RECEIVE_MULTICAST], in nl80211_register_mgmt()
11170 info->extack); in nl80211_register_mgmt()
11175 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_tx_mgmt()
11176 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_tx_mgmt()
11184 info->attrs[NL80211_ATTR_DONT_WAIT_FOR_ACK], in nl80211_tx_mgmt()
11187 if (!info->attrs[NL80211_ATTR_FRAME]) in nl80211_tx_mgmt()
11188 return -EINVAL; in nl80211_tx_mgmt()
11190 if (!rdev->ops->mgmt_tx) in nl80211_tx_mgmt()
11191 return -EOPNOTSUPP; in nl80211_tx_mgmt()
11193 switch (wdev->iftype) { in nl80211_tx_mgmt()
11195 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ]) in nl80211_tx_mgmt()
11196 return -EINVAL; in nl80211_tx_mgmt()
11207 return -EOPNOTSUPP; in nl80211_tx_mgmt()
11210 if (info->attrs[NL80211_ATTR_DURATION]) { in nl80211_tx_mgmt()
11211 if (!(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX)) in nl80211_tx_mgmt()
11212 return -EINVAL; in nl80211_tx_mgmt()
11213 params.wait = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]); in nl80211_tx_mgmt()
11220 params.wait > rdev->wiphy.max_remain_on_channel_duration) in nl80211_tx_mgmt()
11221 return -EINVAL; in nl80211_tx_mgmt()
11224 params.offchan = info->attrs[NL80211_ATTR_OFFCHANNEL_TX_OK]; in nl80211_tx_mgmt()
11226 if (params.offchan && !(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX)) in nl80211_tx_mgmt()
11227 return -EINVAL; in nl80211_tx_mgmt()
11229 params.no_cck = nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]); in nl80211_tx_mgmt()
11235 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { in nl80211_tx_mgmt()
11242 return -EINVAL; in nl80211_tx_mgmt()
11247 return -EBUSY; in nl80211_tx_mgmt()
11251 params.buf = nla_data(info->attrs[NL80211_ATTR_FRAME]); in nl80211_tx_mgmt()
11252 params.len = nla_len(info->attrs[NL80211_ATTR_FRAME]); in nl80211_tx_mgmt()
11254 if (info->attrs[NL80211_ATTR_CSA_C_OFFSETS_TX]) { in nl80211_tx_mgmt()
11255 int len = nla_len(info->attrs[NL80211_ATTR_CSA_C_OFFSETS_TX]); in nl80211_tx_mgmt()
11259 return -EINVAL; in nl80211_tx_mgmt()
11263 nla_data(info->attrs[NL80211_ATTR_CSA_C_OFFSETS_TX]); in nl80211_tx_mgmt()
11268 return -EINVAL; in nl80211_tx_mgmt()
11275 return -ENOMEM; in nl80211_tx_mgmt()
11277 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_tx_mgmt()
11280 err = -ENOBUFS; in nl80211_tx_mgmt()
11302 err = -ENOBUFS; in nl80211_tx_mgmt()
11310 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_tx_mgmt_cancel_wait()
11311 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_tx_mgmt_cancel_wait()
11314 if (!info->attrs[NL80211_ATTR_COOKIE]) in nl80211_tx_mgmt_cancel_wait()
11315 return -EINVAL; in nl80211_tx_mgmt_cancel_wait()
11317 if (!rdev->ops->mgmt_tx_cancel_wait) in nl80211_tx_mgmt_cancel_wait()
11318 return -EOPNOTSUPP; in nl80211_tx_mgmt_cancel_wait()
11320 switch (wdev->iftype) { in nl80211_tx_mgmt_cancel_wait()
11331 return -EOPNOTSUPP; in nl80211_tx_mgmt_cancel_wait()
11334 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); in nl80211_tx_mgmt_cancel_wait()
11341 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_power_save()
11343 struct net_device *dev = info->user_ptr[1]; in nl80211_set_power_save()
11348 if (!info->attrs[NL80211_ATTR_PS_STATE]) in nl80211_set_power_save()
11349 return -EINVAL; in nl80211_set_power_save()
11351 ps_state = nla_get_u32(info->attrs[NL80211_ATTR_PS_STATE]); in nl80211_set_power_save()
11353 wdev = dev->ieee80211_ptr; in nl80211_set_power_save()
11355 if (!rdev->ops->set_power_mgmt) in nl80211_set_power_save()
11356 return -EOPNOTSUPP; in nl80211_set_power_save()
11360 if (state == wdev->ps) in nl80211_set_power_save()
11363 err = rdev_set_power_mgmt(rdev, dev, state, wdev->ps_timeout); in nl80211_set_power_save()
11365 wdev->ps = state; in nl80211_set_power_save()
11371 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_power_save()
11374 struct net_device *dev = info->user_ptr[1]; in nl80211_get_power_save()
11379 wdev = dev->ieee80211_ptr; in nl80211_get_power_save()
11381 if (!rdev->ops->set_power_mgmt) in nl80211_get_power_save()
11382 return -EOPNOTSUPP; in nl80211_get_power_save()
11386 return -ENOMEM; in nl80211_get_power_save()
11388 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_power_save()
11391 err = -ENOBUFS; in nl80211_get_power_save()
11395 if (wdev->ps) in nl80211_get_power_save()
11407 err = -ENOBUFS; in nl80211_get_power_save()
11427 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_cqm_txe()
11428 struct net_device *dev = info->user_ptr[1]; in nl80211_set_cqm_txe()
11429 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_cqm_txe()
11432 return -EINVAL; in nl80211_set_cqm_txe()
11434 if (!rdev->ops->set_cqm_txe_config) in nl80211_set_cqm_txe()
11435 return -EOPNOTSUPP; in nl80211_set_cqm_txe()
11437 if (wdev->iftype != NL80211_IFTYPE_STATION && in nl80211_set_cqm_txe()
11438 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_set_cqm_txe()
11439 return -EOPNOTSUPP; in nl80211_set_cqm_txe()
11447 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_cqm_rssi_update()
11454 if (!wdev->cqm_config) in cfg80211_cqm_rssi_update()
11463 if (!wdev->cqm_config->last_rssi_event_value && wdev->current_bss && in cfg80211_cqm_rssi_update()
11464 rdev->ops->get_station) { in cfg80211_cqm_rssi_update()
11468 mac_addr = wdev->current_bss->pub.bssid; in cfg80211_cqm_rssi_update()
11476 wdev->cqm_config->last_rssi_event_value = in cfg80211_cqm_rssi_update()
11480 last = wdev->cqm_config->last_rssi_event_value; in cfg80211_cqm_rssi_update()
11481 hyst = wdev->cqm_config->rssi_hyst; in cfg80211_cqm_rssi_update()
11482 n = wdev->cqm_config->n_rssi_thresholds; in cfg80211_cqm_rssi_update()
11486 if (last < wdev->cqm_config->rssi_thresholds[i]) in cfg80211_cqm_rssi_update()
11490 low_index = i - 1; in cfg80211_cqm_rssi_update()
11493 low = wdev->cqm_config->rssi_thresholds[low_index] - hyst; in cfg80211_cqm_rssi_update()
11499 high = wdev->cqm_config->rssi_thresholds[i] + hyst - 1; in cfg80211_cqm_rssi_update()
11511 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_cqm_rssi()
11512 struct net_device *dev = info->user_ptr[1]; in nl80211_set_cqm_rssi()
11513 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_cqm_rssi()
11520 return -EINVAL; in nl80211_set_cqm_rssi()
11525 if (wdev->iftype != NL80211_IFTYPE_STATION && in nl80211_set_cqm_rssi()
11526 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_set_cqm_rssi()
11527 return -EOPNOTSUPP; in nl80211_set_cqm_rssi()
11533 if (n_thresholds <= 1 && rdev->ops->set_cqm_rssi_config) { in nl80211_set_cqm_rssi()
11541 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_set_cqm_rssi()
11543 return -EOPNOTSUPP; in nl80211_set_cqm_rssi()
11555 err = -ENOMEM; in nl80211_set_cqm_rssi()
11559 cqm_config->rssi_hyst = hysteresis; in nl80211_set_cqm_rssi()
11560 cqm_config->n_rssi_thresholds = n_thresholds; in nl80211_set_cqm_rssi()
11561 memcpy(cqm_config->rssi_thresholds, thresholds, in nl80211_set_cqm_rssi()
11564 wdev->cqm_config = cqm_config; in nl80211_set_cqm_rssi()
11581 cqm = info->attrs[NL80211_ATTR_CQM]; in nl80211_set_cqm()
11583 return -EINVAL; in nl80211_set_cqm()
11587 info->extack); in nl80211_set_cqm()
11599 return -EINVAL; in nl80211_set_cqm()
11615 return -EINVAL; in nl80211_set_cqm()
11620 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_join_ocb()
11621 struct net_device *dev = info->user_ptr[1]; in nl80211_join_ocb()
11634 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_leave_ocb()
11635 struct net_device *dev = info->user_ptr[1]; in nl80211_leave_ocb()
11642 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_join_mesh()
11643 struct net_device *dev = info->user_ptr[1]; in nl80211_join_mesh()
11652 if (info->attrs[NL80211_ATTR_MESH_CONFIG]) { in nl80211_join_mesh()
11659 if (!info->attrs[NL80211_ATTR_MESH_ID] || in nl80211_join_mesh()
11660 !nla_len(info->attrs[NL80211_ATTR_MESH_ID])) in nl80211_join_mesh()
11661 return -EINVAL; in nl80211_join_mesh()
11663 setup.mesh_id = nla_data(info->attrs[NL80211_ATTR_MESH_ID]); in nl80211_join_mesh()
11664 setup.mesh_id_len = nla_len(info->attrs[NL80211_ATTR_MESH_ID]); in nl80211_join_mesh()
11666 if (info->attrs[NL80211_ATTR_MCAST_RATE] && in nl80211_join_mesh()
11668 nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]))) in nl80211_join_mesh()
11669 return -EINVAL; in nl80211_join_mesh()
11671 if (info->attrs[NL80211_ATTR_BEACON_INTERVAL]) { in nl80211_join_mesh()
11673 nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]); in nl80211_join_mesh()
11682 if (info->attrs[NL80211_ATTR_DTIM_PERIOD]) { in nl80211_join_mesh()
11684 nla_get_u32(info->attrs[NL80211_ATTR_DTIM_PERIOD]); in nl80211_join_mesh()
11686 return -EINVAL; in nl80211_join_mesh()
11689 if (info->attrs[NL80211_ATTR_MESH_SETUP]) { in nl80211_join_mesh()
11699 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { in nl80211_join_mesh()
11708 if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) { in nl80211_join_mesh()
11709 u8 *rates = nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); in nl80211_join_mesh()
11711 nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); in nl80211_join_mesh()
11715 return -EINVAL; in nl80211_join_mesh()
11717 sband = rdev->wiphy.bands[setup.chandef.chan->band]; in nl80211_join_mesh()
11725 if (info->attrs[NL80211_ATTR_TX_RATES]) { in nl80211_join_mesh()
11726 err = nl80211_parse_tx_bitrate_mask(info, info->attrs, in nl80211_join_mesh()
11734 return -EINVAL; in nl80211_join_mesh()
11736 err = validate_beacon_tx_rate(rdev, setup.chandef.chan->band, in nl80211_join_mesh()
11743 nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS]); in nl80211_join_mesh()
11745 if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) { in nl80211_join_mesh()
11754 wdev_lock(dev->ieee80211_ptr); in nl80211_join_mesh()
11756 if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) in nl80211_join_mesh()
11757 dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid; in nl80211_join_mesh()
11758 wdev_unlock(dev->ieee80211_ptr); in nl80211_join_mesh()
11765 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_leave_mesh()
11766 struct net_device *dev = info->user_ptr[1]; in nl80211_leave_mesh()
11775 struct cfg80211_wowlan *wowlan = rdev->wiphy.wowlan_config; in nl80211_send_wowlan_patterns()
11779 if (!wowlan->n_patterns) in nl80211_send_wowlan_patterns()
11784 return -ENOBUFS; in nl80211_send_wowlan_patterns()
11786 for (i = 0; i < wowlan->n_patterns; i++) { in nl80211_send_wowlan_patterns()
11789 return -ENOBUFS; in nl80211_send_wowlan_patterns()
11790 pat_len = wowlan->patterns[i].pattern_len; in nl80211_send_wowlan_patterns()
11792 wowlan->patterns[i].mask) || in nl80211_send_wowlan_patterns()
11794 wowlan->patterns[i].pattern) || in nl80211_send_wowlan_patterns()
11796 wowlan->patterns[i].pkt_offset)) in nl80211_send_wowlan_patterns()
11797 return -ENOBUFS; in nl80211_send_wowlan_patterns()
11816 return -ENOBUFS; in nl80211_send_wowlan_tcp()
11818 if (nla_put_in_addr(msg, NL80211_WOWLAN_TCP_SRC_IPV4, tcp->src) || in nl80211_send_wowlan_tcp()
11819 nla_put_in_addr(msg, NL80211_WOWLAN_TCP_DST_IPV4, tcp->dst) || in nl80211_send_wowlan_tcp()
11820 nla_put(msg, NL80211_WOWLAN_TCP_DST_MAC, ETH_ALEN, tcp->dst_mac) || in nl80211_send_wowlan_tcp()
11821 nla_put_u16(msg, NL80211_WOWLAN_TCP_SRC_PORT, tcp->src_port) || in nl80211_send_wowlan_tcp()
11822 nla_put_u16(msg, NL80211_WOWLAN_TCP_DST_PORT, tcp->dst_port) || in nl80211_send_wowlan_tcp()
11824 tcp->payload_len, tcp->payload) || in nl80211_send_wowlan_tcp()
11826 tcp->data_interval) || in nl80211_send_wowlan_tcp()
11828 tcp->wake_len, tcp->wake_data) || in nl80211_send_wowlan_tcp()
11830 DIV_ROUND_UP(tcp->wake_len, 8), tcp->wake_mask)) in nl80211_send_wowlan_tcp()
11831 return -ENOBUFS; in nl80211_send_wowlan_tcp()
11833 if (tcp->payload_seq.len && in nl80211_send_wowlan_tcp()
11835 sizeof(tcp->payload_seq), &tcp->payload_seq)) in nl80211_send_wowlan_tcp()
11836 return -ENOBUFS; in nl80211_send_wowlan_tcp()
11838 if (tcp->payload_tok.len && in nl80211_send_wowlan_tcp()
11840 sizeof(tcp->payload_tok) + tcp->tokens_size, in nl80211_send_wowlan_tcp()
11841 &tcp->payload_tok)) in nl80211_send_wowlan_tcp()
11842 return -ENOBUFS; in nl80211_send_wowlan_tcp()
11860 return -ENOBUFS; in nl80211_send_wowlan_nd()
11862 if (req->n_scan_plans == 1 && in nl80211_send_wowlan_nd()
11864 req->scan_plans[0].interval * 1000)) in nl80211_send_wowlan_nd()
11865 return -ENOBUFS; in nl80211_send_wowlan_nd()
11867 if (nla_put_u32(msg, NL80211_ATTR_SCHED_SCAN_DELAY, req->delay)) in nl80211_send_wowlan_nd()
11868 return -ENOBUFS; in nl80211_send_wowlan_nd()
11870 if (req->relative_rssi_set) { in nl80211_send_wowlan_nd()
11874 req->relative_rssi)) in nl80211_send_wowlan_nd()
11875 return -ENOBUFS; in nl80211_send_wowlan_nd()
11877 rssi_adjust.band = req->rssi_adjust.band; in nl80211_send_wowlan_nd()
11878 rssi_adjust.delta = req->rssi_adjust.delta; in nl80211_send_wowlan_nd()
11881 return -ENOBUFS; in nl80211_send_wowlan_nd()
11886 return -ENOBUFS; in nl80211_send_wowlan_nd()
11888 for (i = 0; i < req->n_channels; i++) { in nl80211_send_wowlan_nd()
11889 if (nla_put_u32(msg, i, req->channels[i]->center_freq)) in nl80211_send_wowlan_nd()
11890 return -ENOBUFS; in nl80211_send_wowlan_nd()
11895 if (req->n_match_sets) { in nl80211_send_wowlan_nd()
11899 return -ENOBUFS; in nl80211_send_wowlan_nd()
11901 for (i = 0; i < req->n_match_sets; i++) { in nl80211_send_wowlan_nd()
11904 return -ENOBUFS; in nl80211_send_wowlan_nd()
11907 req->match_sets[i].ssid.ssid_len, in nl80211_send_wowlan_nd()
11908 req->match_sets[i].ssid.ssid)) in nl80211_send_wowlan_nd()
11909 return -ENOBUFS; in nl80211_send_wowlan_nd()
11917 return -ENOBUFS; in nl80211_send_wowlan_nd()
11919 for (i = 0; i < req->n_scan_plans; i++) { in nl80211_send_wowlan_nd()
11922 return -ENOBUFS; in nl80211_send_wowlan_nd()
11925 req->scan_plans[i].interval) || in nl80211_send_wowlan_nd()
11926 (req->scan_plans[i].iterations && in nl80211_send_wowlan_nd()
11928 req->scan_plans[i].iterations))) in nl80211_send_wowlan_nd()
11929 return -ENOBUFS; in nl80211_send_wowlan_nd()
11941 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_wowlan()
11946 if (!rdev->wiphy.wowlan) in nl80211_get_wowlan()
11947 return -EOPNOTSUPP; in nl80211_get_wowlan()
11949 if (rdev->wiphy.wowlan_config && rdev->wiphy.wowlan_config->tcp) { in nl80211_get_wowlan()
11951 size += rdev->wiphy.wowlan_config->tcp->tokens_size + in nl80211_get_wowlan()
11952 rdev->wiphy.wowlan_config->tcp->payload_len + in nl80211_get_wowlan()
11953 rdev->wiphy.wowlan_config->tcp->wake_len + in nl80211_get_wowlan()
11954 rdev->wiphy.wowlan_config->tcp->wake_len / 8; in nl80211_get_wowlan()
11959 return -ENOMEM; in nl80211_get_wowlan()
11961 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_wowlan()
11966 if (rdev->wiphy.wowlan_config) { in nl80211_get_wowlan()
11974 if ((rdev->wiphy.wowlan_config->any && in nl80211_get_wowlan()
11976 (rdev->wiphy.wowlan_config->disconnect && in nl80211_get_wowlan()
11978 (rdev->wiphy.wowlan_config->magic_pkt && in nl80211_get_wowlan()
11980 (rdev->wiphy.wowlan_config->gtk_rekey_failure && in nl80211_get_wowlan()
11982 (rdev->wiphy.wowlan_config->eap_identity_req && in nl80211_get_wowlan()
11984 (rdev->wiphy.wowlan_config->four_way_handshake && in nl80211_get_wowlan()
11986 (rdev->wiphy.wowlan_config->rfkill_release && in nl80211_get_wowlan()
11994 rdev->wiphy.wowlan_config->tcp)) in nl80211_get_wowlan()
11999 rdev->wiphy.wowlan_config->nd_config)) in nl80211_get_wowlan()
12010 return -ENOBUFS; in nl80211_get_wowlan()
12015 struct cfg80211_wowlan *trig) in nl80211_parse_wowlan_tcp() argument
12025 if (!rdev->wiphy.wowlan->tcp) in nl80211_parse_wowlan_tcp()
12026 return -EINVAL; in nl80211_parse_wowlan_tcp()
12041 return -EINVAL; in nl80211_parse_wowlan_tcp()
12044 if (data_size > rdev->wiphy.wowlan->tcp->data_payload_max) in nl80211_parse_wowlan_tcp()
12045 return -EINVAL; in nl80211_parse_wowlan_tcp()
12048 rdev->wiphy.wowlan->tcp->data_interval_max || in nl80211_parse_wowlan_tcp()
12050 return -EINVAL; in nl80211_parse_wowlan_tcp()
12053 if (wake_size > rdev->wiphy.wowlan->tcp->wake_payload_max) in nl80211_parse_wowlan_tcp()
12054 return -EINVAL; in nl80211_parse_wowlan_tcp()
12058 return -EINVAL; in nl80211_parse_wowlan_tcp()
12064 tokens_size = tokln - sizeof(*tok); in nl80211_parse_wowlan_tcp()
12066 if (!tok->len || tokens_size % tok->len) in nl80211_parse_wowlan_tcp()
12067 return -EINVAL; in nl80211_parse_wowlan_tcp()
12068 if (!rdev->wiphy.wowlan->tcp->tok) in nl80211_parse_wowlan_tcp()
12069 return -EINVAL; in nl80211_parse_wowlan_tcp()
12070 if (tok->len > rdev->wiphy.wowlan->tcp->tok->max_len) in nl80211_parse_wowlan_tcp()
12071 return -EINVAL; in nl80211_parse_wowlan_tcp()
12072 if (tok->len < rdev->wiphy.wowlan->tcp->tok->min_len) in nl80211_parse_wowlan_tcp()
12073 return -EINVAL; in nl80211_parse_wowlan_tcp()
12074 if (tokens_size > rdev->wiphy.wowlan->tcp->tok->bufsize) in nl80211_parse_wowlan_tcp()
12075 return -EINVAL; in nl80211_parse_wowlan_tcp()
12076 if (tok->offset + tok->len > data_size) in nl80211_parse_wowlan_tcp()
12077 return -EINVAL; in nl80211_parse_wowlan_tcp()
12082 if (!rdev->wiphy.wowlan->tcp->seq) in nl80211_parse_wowlan_tcp()
12083 return -EINVAL; in nl80211_parse_wowlan_tcp()
12084 if (seq->len == 0 || seq->len > 4) in nl80211_parse_wowlan_tcp()
12085 return -EINVAL; in nl80211_parse_wowlan_tcp()
12086 if (seq->len + seq->offset > data_size) in nl80211_parse_wowlan_tcp()
12087 return -EINVAL; in nl80211_parse_wowlan_tcp()
12097 return -ENOMEM; in nl80211_parse_wowlan_tcp()
12098 cfg->src = nla_get_in_addr(tb[NL80211_WOWLAN_TCP_SRC_IPV4]); in nl80211_parse_wowlan_tcp()
12099 cfg->dst = nla_get_in_addr(tb[NL80211_WOWLAN_TCP_DST_IPV4]); in nl80211_parse_wowlan_tcp()
12100 memcpy(cfg->dst_mac, nla_data(tb[NL80211_WOWLAN_TCP_DST_MAC]), in nl80211_parse_wowlan_tcp()
12108 err = __sock_create(wiphy_net(&rdev->wiphy), PF_INET, SOCK_STREAM, in nl80211_parse_wowlan_tcp()
12109 IPPROTO_TCP, &cfg->sock, 1); in nl80211_parse_wowlan_tcp()
12114 if (inet_csk_get_port(cfg->sock->sk, port)) { in nl80211_parse_wowlan_tcp()
12115 sock_release(cfg->sock); in nl80211_parse_wowlan_tcp()
12117 return -EADDRINUSE; in nl80211_parse_wowlan_tcp()
12119 cfg->src_port = inet_sk(cfg->sock->sk)->inet_num; in nl80211_parse_wowlan_tcp()
12123 return -EINVAL; in nl80211_parse_wowlan_tcp()
12125 cfg->src_port = port; in nl80211_parse_wowlan_tcp()
12128 cfg->dst_port = nla_get_u16(tb[NL80211_WOWLAN_TCP_DST_PORT]); in nl80211_parse_wowlan_tcp()
12129 cfg->payload_len = data_size; in nl80211_parse_wowlan_tcp()
12130 cfg->payload = (u8 *)cfg + sizeof(*cfg) + tokens_size; in nl80211_parse_wowlan_tcp()
12131 memcpy((void *)cfg->payload, in nl80211_parse_wowlan_tcp()
12135 cfg->payload_seq = *seq; in nl80211_parse_wowlan_tcp()
12136 cfg->data_interval = nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]); in nl80211_parse_wowlan_tcp()
12137 cfg->wake_len = wake_size; in nl80211_parse_wowlan_tcp()
12138 cfg->wake_data = (u8 *)cfg + sizeof(*cfg) + tokens_size + data_size; in nl80211_parse_wowlan_tcp()
12139 memcpy((void *)cfg->wake_data, in nl80211_parse_wowlan_tcp()
12142 cfg->wake_mask = (u8 *)cfg + sizeof(*cfg) + tokens_size + in nl80211_parse_wowlan_tcp()
12144 memcpy((void *)cfg->wake_mask, in nl80211_parse_wowlan_tcp()
12148 cfg->tokens_size = tokens_size; in nl80211_parse_wowlan_tcp()
12149 memcpy(&cfg->payload_tok, tok, sizeof(*tok) + tokens_size); in nl80211_parse_wowlan_tcp()
12152 trig->tcp = cfg; in nl80211_parse_wowlan_tcp()
12160 struct cfg80211_wowlan *trig) in nl80211_parse_wowlan_nd() argument
12167 return -ENOMEM; in nl80211_parse_wowlan_nd()
12169 if (!(wowlan->flags & WIPHY_WOWLAN_NET_DETECT)) { in nl80211_parse_wowlan_nd()
12170 err = -EOPNOTSUPP; in nl80211_parse_wowlan_nd()
12179 trig->nd_config = nl80211_parse_sched_scan(&rdev->wiphy, NULL, tb, in nl80211_parse_wowlan_nd()
12180 wowlan->max_nd_match_sets); in nl80211_parse_wowlan_nd()
12181 err = PTR_ERR_OR_ZERO(trig->nd_config); in nl80211_parse_wowlan_nd()
12183 trig->nd_config = NULL; in nl80211_parse_wowlan_nd()
12192 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_wowlan()
12196 const struct wiphy_wowlan_support *wowlan = rdev->wiphy.wowlan; in nl80211_set_wowlan()
12198 bool prev_enabled = rdev->wiphy.wowlan_config; in nl80211_set_wowlan()
12202 return -EOPNOTSUPP; in nl80211_set_wowlan()
12204 if (!info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS]) { in nl80211_set_wowlan()
12206 rdev->wiphy.wowlan_config = NULL; in nl80211_set_wowlan()
12211 info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS], in nl80211_set_wowlan()
12212 nl80211_wowlan_policy, info->extack); in nl80211_set_wowlan()
12217 if (!(wowlan->flags & WIPHY_WOWLAN_ANY)) in nl80211_set_wowlan()
12218 return -EINVAL; in nl80211_set_wowlan()
12223 if (!(wowlan->flags & WIPHY_WOWLAN_DISCONNECT)) in nl80211_set_wowlan()
12224 return -EINVAL; in nl80211_set_wowlan()
12230 if (!(wowlan->flags & WIPHY_WOWLAN_MAGIC_PKT)) in nl80211_set_wowlan()
12231 return -EINVAL; in nl80211_set_wowlan()
12237 return -EINVAL; in nl80211_set_wowlan()
12240 if (!(wowlan->flags & WIPHY_WOWLAN_GTK_REKEY_FAILURE)) in nl80211_set_wowlan()
12241 return -EINVAL; in nl80211_set_wowlan()
12247 if (!(wowlan->flags & WIPHY_WOWLAN_EAP_IDENTITY_REQ)) in nl80211_set_wowlan()
12248 return -EINVAL; in nl80211_set_wowlan()
12254 if (!(wowlan->flags & WIPHY_WOWLAN_4WAY_HANDSHAKE)) in nl80211_set_wowlan()
12255 return -EINVAL; in nl80211_set_wowlan()
12261 if (!(wowlan->flags & WIPHY_WOWLAN_RFKILL_RELEASE)) in nl80211_set_wowlan()
12262 return -EINVAL; in nl80211_set_wowlan()
12278 if (n_patterns > wowlan->n_patterns) in nl80211_set_wowlan()
12279 return -EINVAL; in nl80211_set_wowlan()
12285 return -ENOMEM; in nl80211_set_wowlan()
12298 info->extack); in nl80211_set_wowlan()
12302 err = -EINVAL; in nl80211_set_wowlan()
12310 if (pat_len > wowlan->pattern_max_len || in nl80211_set_wowlan()
12311 pat_len < wowlan->pattern_min_len) in nl80211_set_wowlan()
12319 if (pkt_offset > wowlan->max_pkt_offset) in nl80211_set_wowlan()
12325 err = -ENOMEM; in nl80211_set_wowlan()
12361 * normal interrupts (like packet RX, ...) in nl80211_set_wowlan()
12366 err = -EINVAL; in nl80211_set_wowlan()
12372 err = -ENOMEM; in nl80211_set_wowlan()
12376 rdev->wiphy.wowlan_config = ntrig; in nl80211_set_wowlan()
12379 if (rdev->ops->set_wakeup && in nl80211_set_wowlan()
12380 prev_enabled != !!rdev->wiphy.wowlan_config) in nl80211_set_wowlan()
12381 rdev_set_wakeup(rdev, rdev->wiphy.wowlan_config); in nl80211_set_wowlan()
12388 if (new_triggers.tcp && new_triggers.tcp->sock) in nl80211_set_wowlan()
12389 sock_release(new_triggers.tcp->sock); in nl80211_set_wowlan()
12403 if (!rdev->coalesce->n_rules) in nl80211_send_coalesce_rules()
12408 return -ENOBUFS; in nl80211_send_coalesce_rules()
12410 for (i = 0; i < rdev->coalesce->n_rules; i++) { in nl80211_send_coalesce_rules()
12413 return -ENOBUFS; in nl80211_send_coalesce_rules()
12415 rule = &rdev->coalesce->rules[i]; in nl80211_send_coalesce_rules()
12417 rule->delay)) in nl80211_send_coalesce_rules()
12418 return -ENOBUFS; in nl80211_send_coalesce_rules()
12421 rule->condition)) in nl80211_send_coalesce_rules()
12422 return -ENOBUFS; in nl80211_send_coalesce_rules()
12427 return -ENOBUFS; in nl80211_send_coalesce_rules()
12429 for (j = 0; j < rule->n_patterns; j++) { in nl80211_send_coalesce_rules()
12432 return -ENOBUFS; in nl80211_send_coalesce_rules()
12433 pat_len = rule->patterns[j].pattern_len; in nl80211_send_coalesce_rules()
12436 rule->patterns[j].mask) || in nl80211_send_coalesce_rules()
12438 rule->patterns[j].pattern) || in nl80211_send_coalesce_rules()
12440 rule->patterns[j].pkt_offset)) in nl80211_send_coalesce_rules()
12441 return -ENOBUFS; in nl80211_send_coalesce_rules()
12454 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_coalesce()
12458 if (!rdev->wiphy.coalesce) in nl80211_get_coalesce()
12459 return -EOPNOTSUPP; in nl80211_get_coalesce()
12463 return -ENOMEM; in nl80211_get_coalesce()
12465 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_coalesce()
12470 if (rdev->coalesce && nl80211_send_coalesce_rules(msg, rdev)) in nl80211_get_coalesce()
12478 return -ENOBUFS; in nl80211_get_coalesce()
12483 struct cfg80211_coalesce *coalesce = rdev->coalesce; in cfg80211_rdev_free_coalesce()
12490 for (i = 0; i < coalesce->n_rules; i++) { in cfg80211_rdev_free_coalesce()
12491 rule = &coalesce->rules[i]; in cfg80211_rdev_free_coalesce()
12492 for (j = 0; j < rule->n_patterns; j++) in cfg80211_rdev_free_coalesce()
12493 kfree(rule->patterns[j].mask); in cfg80211_rdev_free_coalesce()
12494 kfree(rule->patterns); in cfg80211_rdev_free_coalesce()
12496 kfree(coalesce->rules); in cfg80211_rdev_free_coalesce()
12498 rdev->coalesce = NULL; in cfg80211_rdev_free_coalesce()
12506 const struct wiphy_coalesce_support *coalesce = rdev->wiphy.coalesce; in nl80211_parse_coalesce_rule()
12517 new_rule->delay = in nl80211_parse_coalesce_rule()
12519 if (new_rule->delay > coalesce->max_delay) in nl80211_parse_coalesce_rule()
12520 return -EINVAL; in nl80211_parse_coalesce_rule()
12523 new_rule->condition = in nl80211_parse_coalesce_rule()
12527 return -EINVAL; in nl80211_parse_coalesce_rule()
12532 if (n_patterns > coalesce->n_patterns) in nl80211_parse_coalesce_rule()
12533 return -EINVAL; in nl80211_parse_coalesce_rule()
12535 new_rule->patterns = kcalloc(n_patterns, sizeof(new_rule->patterns[0]), in nl80211_parse_coalesce_rule()
12537 if (!new_rule->patterns) in nl80211_parse_coalesce_rule()
12538 return -ENOMEM; in nl80211_parse_coalesce_rule()
12540 new_rule->n_patterns = n_patterns; in nl80211_parse_coalesce_rule()
12556 return -EINVAL; in nl80211_parse_coalesce_rule()
12560 return -EINVAL; in nl80211_parse_coalesce_rule()
12561 if (pat_len > coalesce->pattern_max_len || in nl80211_parse_coalesce_rule()
12562 pat_len < coalesce->pattern_min_len) in nl80211_parse_coalesce_rule()
12563 return -EINVAL; in nl80211_parse_coalesce_rule()
12569 if (pkt_offset > coalesce->max_pkt_offset) in nl80211_parse_coalesce_rule()
12570 return -EINVAL; in nl80211_parse_coalesce_rule()
12571 new_rule->patterns[i].pkt_offset = pkt_offset; in nl80211_parse_coalesce_rule()
12575 return -ENOMEM; in nl80211_parse_coalesce_rule()
12577 new_rule->patterns[i].mask = mask_pat; in nl80211_parse_coalesce_rule()
12582 new_rule->patterns[i].pattern = mask_pat; in nl80211_parse_coalesce_rule()
12583 new_rule->patterns[i].pattern_len = pat_len; in nl80211_parse_coalesce_rule()
12594 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_coalesce()
12595 const struct wiphy_coalesce_support *coalesce = rdev->wiphy.coalesce; in nl80211_set_coalesce()
12602 if (!rdev->wiphy.coalesce || !rdev->ops->set_coalesce) in nl80211_set_coalesce()
12603 return -EOPNOTSUPP; in nl80211_set_coalesce()
12605 if (!info->attrs[NL80211_ATTR_COALESCE_RULE]) { in nl80211_set_coalesce()
12611 nla_for_each_nested(rule, info->attrs[NL80211_ATTR_COALESCE_RULE], in nl80211_set_coalesce()
12614 if (n_rules > coalesce->n_rules) in nl80211_set_coalesce()
12615 return -EINVAL; in nl80211_set_coalesce()
12620 return -ENOMEM; in nl80211_set_coalesce()
12625 nla_for_each_nested(rule, info->attrs[NL80211_ATTR_COALESCE_RULE], in nl80211_set_coalesce()
12641 err = -ENOMEM; in nl80211_set_coalesce()
12645 rdev->coalesce = n_coalesce; in nl80211_set_coalesce()
12651 for (j = 0; j < tmp_rule->n_patterns; j++) in nl80211_set_coalesce()
12652 kfree(tmp_rule->patterns[j].mask); in nl80211_set_coalesce()
12653 kfree(tmp_rule->patterns); in nl80211_set_coalesce()
12662 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_rekey_data()
12663 struct net_device *dev = info->user_ptr[1]; in nl80211_set_rekey_data()
12664 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_rekey_data()
12669 if (!info->attrs[NL80211_ATTR_REKEY_DATA]) in nl80211_set_rekey_data()
12670 return -EINVAL; in nl80211_set_rekey_data()
12673 info->attrs[NL80211_ATTR_REKEY_DATA], in nl80211_set_rekey_data()
12674 nl80211_rekey_policy, info->extack); in nl80211_set_rekey_data()
12680 return -EINVAL; in nl80211_set_rekey_data()
12682 !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_EXT_KEK_KCK && in nl80211_set_rekey_data()
12684 return -ERANGE; in nl80211_set_rekey_data()
12686 !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_EXT_KEK_KCK && in nl80211_set_rekey_data()
12688 return -ERANGE; in nl80211_set_rekey_data()
12699 if (!wdev->current_bss) { in nl80211_set_rekey_data()
12700 err = -ENOTCONN; in nl80211_set_rekey_data()
12704 if (!rdev->ops->set_rekey_data) { in nl80211_set_rekey_data()
12705 err = -EOPNOTSUPP; in nl80211_set_rekey_data()
12718 struct net_device *dev = info->user_ptr[1]; in nl80211_register_unexpected_frame()
12719 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_register_unexpected_frame()
12721 if (wdev->iftype != NL80211_IFTYPE_AP && in nl80211_register_unexpected_frame()
12722 wdev->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_register_unexpected_frame()
12723 return -EINVAL; in nl80211_register_unexpected_frame()
12725 if (wdev->ap_unexpected_nlportid) in nl80211_register_unexpected_frame()
12726 return -EBUSY; in nl80211_register_unexpected_frame()
12728 wdev->ap_unexpected_nlportid = info->snd_portid; in nl80211_register_unexpected_frame()
12735 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_probe_client()
12736 struct net_device *dev = info->user_ptr[1]; in nl80211_probe_client()
12737 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_probe_client()
12744 if (wdev->iftype != NL80211_IFTYPE_AP && in nl80211_probe_client()
12745 wdev->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_probe_client()
12746 return -EOPNOTSUPP; in nl80211_probe_client()
12748 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_probe_client()
12749 return -EINVAL; in nl80211_probe_client()
12751 if (!rdev->ops->probe_client) in nl80211_probe_client()
12752 return -EOPNOTSUPP; in nl80211_probe_client()
12756 return -ENOMEM; in nl80211_probe_client()
12758 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_probe_client()
12761 err = -ENOBUFS; in nl80211_probe_client()
12765 addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_probe_client()
12780 err = -ENOBUFS; in nl80211_probe_client()
12788 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_register_beacons()
12792 if (!(rdev->wiphy.flags & WIPHY_FLAG_REPORTS_OBSS)) in nl80211_register_beacons()
12793 return -EOPNOTSUPP; in nl80211_register_beacons()
12797 return -ENOMEM; in nl80211_register_beacons()
12800 spin_lock_bh(&rdev->beacon_registrations_lock); in nl80211_register_beacons()
12801 list_for_each_entry(reg, &rdev->beacon_registrations, list) { in nl80211_register_beacons()
12802 if (reg->nlportid == info->snd_portid) { in nl80211_register_beacons()
12803 rv = -EALREADY; in nl80211_register_beacons()
12808 nreg->nlportid = info->snd_portid; in nl80211_register_beacons()
12809 list_add(&nreg->list, &rdev->beacon_registrations); in nl80211_register_beacons()
12811 spin_unlock_bh(&rdev->beacon_registrations_lock); in nl80211_register_beacons()
12815 spin_unlock_bh(&rdev->beacon_registrations_lock); in nl80211_register_beacons()
12822 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_start_p2p_device()
12823 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_start_p2p_device()
12826 if (!rdev->ops->start_p2p_device) in nl80211_start_p2p_device()
12827 return -EOPNOTSUPP; in nl80211_start_p2p_device()
12829 if (wdev->iftype != NL80211_IFTYPE_P2P_DEVICE) in nl80211_start_p2p_device()
12830 return -EOPNOTSUPP; in nl80211_start_p2p_device()
12835 if (rfkill_blocked(rdev->rfkill)) in nl80211_start_p2p_device()
12836 return -ERFKILL; in nl80211_start_p2p_device()
12842 wdev->is_running = true; in nl80211_start_p2p_device()
12843 rdev->opencount++; in nl80211_start_p2p_device()
12850 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_stop_p2p_device()
12851 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_stop_p2p_device()
12853 if (wdev->iftype != NL80211_IFTYPE_P2P_DEVICE) in nl80211_stop_p2p_device()
12854 return -EOPNOTSUPP; in nl80211_stop_p2p_device()
12856 if (!rdev->ops->stop_p2p_device) in nl80211_stop_p2p_device()
12857 return -EOPNOTSUPP; in nl80211_stop_p2p_device()
12866 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_start_nan()
12867 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_start_nan()
12871 if (wdev->iftype != NL80211_IFTYPE_NAN) in nl80211_start_nan()
12872 return -EOPNOTSUPP; in nl80211_start_nan()
12875 return -EEXIST; in nl80211_start_nan()
12877 if (rfkill_blocked(rdev->rfkill)) in nl80211_start_nan()
12878 return -ERFKILL; in nl80211_start_nan()
12880 if (!info->attrs[NL80211_ATTR_NAN_MASTER_PREF]) in nl80211_start_nan()
12881 return -EINVAL; in nl80211_start_nan()
12884 nla_get_u8(info->attrs[NL80211_ATTR_NAN_MASTER_PREF]); in nl80211_start_nan()
12886 if (info->attrs[NL80211_ATTR_BANDS]) { in nl80211_start_nan()
12887 u32 bands = nla_get_u32(info->attrs[NL80211_ATTR_BANDS]); in nl80211_start_nan()
12889 if (bands & ~(u32)wdev->wiphy->nan_supported_bands) in nl80211_start_nan()
12890 return -EOPNOTSUPP; in nl80211_start_nan()
12893 return -EINVAL; in nl80211_start_nan()
12902 wdev->is_running = true; in nl80211_start_nan()
12903 rdev->opencount++; in nl80211_start_nan()
12910 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_stop_nan()
12911 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_stop_nan()
12913 if (wdev->iftype != NL80211_IFTYPE_NAN) in nl80211_stop_nan()
12914 return -EOPNOTSUPP; in nl80211_stop_nan()
12932 return -EINVAL; in validate_nan_filter()
12949 BUILD_BUG_ON(sizeof(*func->rx_filters) != sizeof(*func->tx_filters)); in handle_nan_filter()
12951 filter = kcalloc(n_entries, sizeof(*func->rx_filters), GFP_KERNEL); in handle_nan_filter()
12953 return -ENOMEM; in handle_nan_filter()
12965 func->num_tx_filters = n_entries; in handle_nan_filter()
12966 func->tx_filters = filter; in handle_nan_filter()
12968 func->num_rx_filters = n_entries; in handle_nan_filter()
12969 func->rx_filters = filter; in handle_nan_filter()
12981 return -ENOMEM; in handle_nan_filter()
12987 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_nan_add_func()
12988 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_nan_add_func()
12995 if (wdev->iftype != NL80211_IFTYPE_NAN) in nl80211_nan_add_func()
12996 return -EOPNOTSUPP; in nl80211_nan_add_func()
12999 return -ENOTCONN; in nl80211_nan_add_func()
13001 if (!info->attrs[NL80211_ATTR_NAN_FUNC]) in nl80211_nan_add_func()
13002 return -EINVAL; in nl80211_nan_add_func()
13005 info->attrs[NL80211_ATTR_NAN_FUNC], in nl80211_nan_add_func()
13007 info->extack); in nl80211_nan_add_func()
13013 return -ENOMEM; in nl80211_nan_add_func()
13015 func->cookie = cfg80211_assign_cookie(rdev); in nl80211_nan_add_func()
13018 err = -EINVAL; in nl80211_nan_add_func()
13023 func->type = nla_get_u8(tb[NL80211_NAN_FUNC_TYPE]); in nl80211_nan_add_func()
13026 err = -EINVAL; in nl80211_nan_add_func()
13030 memcpy(func->service_id, nla_data(tb[NL80211_NAN_FUNC_SERVICE_ID]), in nl80211_nan_add_func()
13031 sizeof(func->service_id)); in nl80211_nan_add_func()
13033 func->close_range = in nl80211_nan_add_func()
13037 func->serv_spec_info_len = in nl80211_nan_add_func()
13039 func->serv_spec_info = in nl80211_nan_add_func()
13041 func->serv_spec_info_len, in nl80211_nan_add_func()
13043 if (!func->serv_spec_info) { in nl80211_nan_add_func()
13044 err = -ENOMEM; in nl80211_nan_add_func()
13050 func->ttl = nla_get_u32(tb[NL80211_NAN_FUNC_TTL]); in nl80211_nan_add_func()
13052 switch (func->type) { in nl80211_nan_add_func()
13055 err = -EINVAL; in nl80211_nan_add_func()
13059 func->publish_type = in nl80211_nan_add_func()
13061 func->publish_bcast = in nl80211_nan_add_func()
13064 if ((!(func->publish_type & NL80211_NAN_SOLICITED_PUBLISH)) && in nl80211_nan_add_func()
13065 func->publish_bcast) { in nl80211_nan_add_func()
13066 err = -EINVAL; in nl80211_nan_add_func()
13071 func->subscribe_active = in nl80211_nan_add_func()
13078 err = -EINVAL; in nl80211_nan_add_func()
13082 func->followup_id = in nl80211_nan_add_func()
13084 func->followup_reqid = in nl80211_nan_add_func()
13086 memcpy(func->followup_dest.addr, in nl80211_nan_add_func()
13088 sizeof(func->followup_dest.addr)); in nl80211_nan_add_func()
13089 if (func->ttl) { in nl80211_nan_add_func()
13090 err = -EINVAL; in nl80211_nan_add_func()
13095 err = -EINVAL; in nl80211_nan_add_func()
13106 info->extack); in nl80211_nan_add_func()
13110 func->srf_include = in nl80211_nan_add_func()
13116 err = -EINVAL; in nl80211_nan_add_func()
13120 func->srf_bf_len = in nl80211_nan_add_func()
13122 func->srf_bf = in nl80211_nan_add_func()
13124 func->srf_bf_len, GFP_KERNEL); in nl80211_nan_add_func()
13125 if (!func->srf_bf) { in nl80211_nan_add_func()
13126 err = -ENOMEM; in nl80211_nan_add_func()
13130 func->srf_bf_idx = in nl80211_nan_add_func()
13138 err = -EINVAL; in nl80211_nan_add_func()
13144 err = -EINVAL; in nl80211_nan_add_func()
13148 func->srf_num_macs = n_entries; in nl80211_nan_add_func()
13149 func->srf_macs = in nl80211_nan_add_func()
13150 kcalloc(n_entries, sizeof(*func->srf_macs), in nl80211_nan_add_func()
13152 if (!func->srf_macs) { in nl80211_nan_add_func()
13153 err = -ENOMEM; in nl80211_nan_add_func()
13158 memcpy(func->srf_macs[i++].addr, nla_data(attr), in nl80211_nan_add_func()
13159 sizeof(*func->srf_macs)); in nl80211_nan_add_func()
13179 err = -ENOMEM; in nl80211_nan_add_func()
13183 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_nan_add_func()
13185 /* This can't really happen - we just allocated 4KB */ in nl80211_nan_add_func()
13187 err = -ENOMEM; in nl80211_nan_add_func()
13200 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, func->cookie, in nl80211_nan_add_func()
13209 func->instance_id)) in nl80211_nan_add_func()
13219 return -ENOBUFS; in nl80211_nan_add_func()
13225 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_nan_del_func()
13226 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_nan_del_func()
13229 if (wdev->iftype != NL80211_IFTYPE_NAN) in nl80211_nan_del_func()
13230 return -EOPNOTSUPP; in nl80211_nan_del_func()
13233 return -ENOTCONN; in nl80211_nan_del_func()
13235 if (!info->attrs[NL80211_ATTR_COOKIE]) in nl80211_nan_del_func()
13236 return -EINVAL; in nl80211_nan_del_func()
13238 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); in nl80211_nan_del_func()
13248 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_nan_change_config()
13249 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_nan_change_config()
13253 if (wdev->iftype != NL80211_IFTYPE_NAN) in nl80211_nan_change_config()
13254 return -EOPNOTSUPP; in nl80211_nan_change_config()
13257 return -ENOTCONN; in nl80211_nan_change_config()
13259 if (info->attrs[NL80211_ATTR_NAN_MASTER_PREF]) { in nl80211_nan_change_config()
13261 nla_get_u8(info->attrs[NL80211_ATTR_NAN_MASTER_PREF]); in nl80211_nan_change_config()
13263 return -EINVAL; in nl80211_nan_change_config()
13268 if (info->attrs[NL80211_ATTR_BANDS]) { in nl80211_nan_change_config()
13269 u32 bands = nla_get_u32(info->attrs[NL80211_ATTR_BANDS]); in nl80211_nan_change_config()
13271 if (bands & ~(u32)wdev->wiphy->nan_supported_bands) in nl80211_nan_change_config()
13272 return -EOPNOTSUPP; in nl80211_nan_change_config()
13275 return -EINVAL; in nl80211_nan_change_config()
13282 return -EINVAL; in nl80211_nan_change_config()
13290 struct wiphy *wiphy = wdev->wiphy; in cfg80211_nan_match()
13296 if (WARN_ON(!match->inst_id || !match->peer_inst_id || !match->addr)) in cfg80211_nan_match()
13309 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_nan_match()
13310 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, in cfg80211_nan_match()
13311 wdev->netdev->ifindex)) || in cfg80211_nan_match()
13316 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, match->cookie, in cfg80211_nan_match()
13318 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, match->addr)) in cfg80211_nan_match()
13330 if (nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, match->inst_id)) in cfg80211_nan_match()
13340 if (nla_put_u8(msg, NL80211_NAN_FUNC_TYPE, match->type) || in cfg80211_nan_match()
13341 nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, match->peer_inst_id)) in cfg80211_nan_match()
13344 if (match->info && match->info_len && in cfg80211_nan_match()
13345 nla_put(msg, NL80211_NAN_FUNC_SERVICE_INFO, match->info_len, in cfg80211_nan_match()
13346 match->info)) in cfg80211_nan_match()
13353 if (!wdev->owner_nlportid) in cfg80211_nan_match()
13354 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), in cfg80211_nan_match()
13357 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, in cfg80211_nan_match()
13358 wdev->owner_nlportid); in cfg80211_nan_match()
13372 struct wiphy *wiphy = wdev->wiphy; in cfg80211_nan_func_terminated()
13391 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_nan_func_terminated()
13392 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, in cfg80211_nan_func_terminated()
13393 wdev->netdev->ifindex)) || in cfg80211_nan_func_terminated()
13413 if (!wdev->owner_nlportid) in cfg80211_nan_func_terminated()
13414 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), in cfg80211_nan_func_terminated()
13417 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, in cfg80211_nan_func_terminated()
13418 wdev->owner_nlportid); in cfg80211_nan_func_terminated()
13435 return -ENOMEM; in nl80211_get_protocol_features()
13437 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_protocol_features()
13451 return -ENOBUFS; in nl80211_get_protocol_features()
13456 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_update_ft_ies()
13458 struct net_device *dev = info->user_ptr[1]; in nl80211_update_ft_ies()
13460 if (!rdev->ops->update_ft_ies) in nl80211_update_ft_ies()
13461 return -EOPNOTSUPP; in nl80211_update_ft_ies()
13463 if (!info->attrs[NL80211_ATTR_MDID] || in nl80211_update_ft_ies()
13464 !info->attrs[NL80211_ATTR_IE]) in nl80211_update_ft_ies()
13465 return -EINVAL; in nl80211_update_ft_ies()
13468 ft_params.md = nla_get_u16(info->attrs[NL80211_ATTR_MDID]); in nl80211_update_ft_ies()
13469 ft_params.ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_update_ft_ies()
13470 ft_params.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_update_ft_ies()
13478 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_crit_protocol_start()
13479 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_crit_protocol_start()
13484 if (!rdev->ops->crit_proto_start) in nl80211_crit_protocol_start()
13485 return -EOPNOTSUPP; in nl80211_crit_protocol_start()
13487 if (WARN_ON(!rdev->ops->crit_proto_stop)) in nl80211_crit_protocol_start()
13488 return -EINVAL; in nl80211_crit_protocol_start()
13490 if (rdev->crit_proto_nlportid) in nl80211_crit_protocol_start()
13491 return -EBUSY; in nl80211_crit_protocol_start()
13494 if (info->attrs[NL80211_ATTR_CRIT_PROT_ID]) in nl80211_crit_protocol_start()
13495 proto = nla_get_u16(info->attrs[NL80211_ATTR_CRIT_PROT_ID]); in nl80211_crit_protocol_start()
13498 return -EINVAL; in nl80211_crit_protocol_start()
13501 if (!info->attrs[NL80211_ATTR_MAX_CRIT_PROT_DURATION]) in nl80211_crit_protocol_start()
13502 return -EINVAL; in nl80211_crit_protocol_start()
13505 nla_get_u16(info->attrs[NL80211_ATTR_MAX_CRIT_PROT_DURATION]); in nl80211_crit_protocol_start()
13509 rdev->crit_proto_nlportid = info->snd_portid; in nl80211_crit_protocol_start()
13517 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_crit_protocol_stop()
13518 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_crit_protocol_stop()
13520 if (!rdev->ops->crit_proto_stop) in nl80211_crit_protocol_stop()
13521 return -EOPNOTSUPP; in nl80211_crit_protocol_stop()
13523 if (rdev->crit_proto_nlportid) { in nl80211_crit_protocol_stop()
13524 rdev->crit_proto_nlportid = 0; in nl80211_crit_protocol_stop()
13534 if (vcmd->policy == VENDOR_CMD_RAW_DATA) { in nl80211_vendor_check_policy()
13535 if (attr->nla_type & NLA_F_NESTED) { in nl80211_vendor_check_policy()
13538 return -EINVAL; in nl80211_vendor_check_policy()
13544 if (!(attr->nla_type & NLA_F_NESTED)) { in nl80211_vendor_check_policy()
13546 return -EINVAL; in nl80211_vendor_check_policy()
13549 return nla_validate_nested(attr, vcmd->maxattr, vcmd->policy, extack); in nl80211_vendor_check_policy()
13554 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_vendor_cmd()
13556 __cfg80211_wdev_from_attrs(genl_info_net(info), info->attrs); in nl80211_vendor_cmd()
13560 if (!rdev->wiphy.vendor_commands) in nl80211_vendor_cmd()
13561 return -EOPNOTSUPP; in nl80211_vendor_cmd()
13565 if (err != -EINVAL) in nl80211_vendor_cmd()
13568 } else if (wdev->wiphy != &rdev->wiphy) { in nl80211_vendor_cmd()
13569 return -EINVAL; in nl80211_vendor_cmd()
13572 if (!info->attrs[NL80211_ATTR_VENDOR_ID] || in nl80211_vendor_cmd()
13573 !info->attrs[NL80211_ATTR_VENDOR_SUBCMD]) in nl80211_vendor_cmd()
13574 return -EINVAL; in nl80211_vendor_cmd()
13576 vid = nla_get_u32(info->attrs[NL80211_ATTR_VENDOR_ID]); in nl80211_vendor_cmd()
13577 subcmd = nla_get_u32(info->attrs[NL80211_ATTR_VENDOR_SUBCMD]); in nl80211_vendor_cmd()
13578 for (i = 0; i < rdev->wiphy.n_vendor_commands; i++) { in nl80211_vendor_cmd()
13583 vcmd = &rdev->wiphy.vendor_commands[i]; in nl80211_vendor_cmd()
13585 if (vcmd->info.vendor_id != vid || vcmd->info.subcmd != subcmd) in nl80211_vendor_cmd()
13588 if (vcmd->flags & (WIPHY_VENDOR_CMD_NEED_WDEV | in nl80211_vendor_cmd()
13591 return -EINVAL; in nl80211_vendor_cmd()
13592 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_NETDEV && in nl80211_vendor_cmd()
13593 !wdev->netdev) in nl80211_vendor_cmd()
13594 return -EINVAL; in nl80211_vendor_cmd()
13596 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_RUNNING) { in nl80211_vendor_cmd()
13598 return -ENETDOWN; in nl80211_vendor_cmd()
13604 if (!vcmd->doit) in nl80211_vendor_cmd()
13605 return -EOPNOTSUPP; in nl80211_vendor_cmd()
13607 if (info->attrs[NL80211_ATTR_VENDOR_DATA]) { in nl80211_vendor_cmd()
13608 data = nla_data(info->attrs[NL80211_ATTR_VENDOR_DATA]); in nl80211_vendor_cmd()
13609 len = nla_len(info->attrs[NL80211_ATTR_VENDOR_DATA]); in nl80211_vendor_cmd()
13612 info->attrs[NL80211_ATTR_VENDOR_DATA], in nl80211_vendor_cmd()
13613 info->extack); in nl80211_vendor_cmd()
13618 rdev->cur_cmd_info = info; in nl80211_vendor_cmd()
13619 err = vcmd->doit(&rdev->wiphy, wdev, data, len); in nl80211_vendor_cmd()
13620 rdev->cur_cmd_info = NULL; in nl80211_vendor_cmd()
13624 return -EOPNOTSUPP; in nl80211_vendor_cmd()
13635 int vcmd_idx = -1; in nl80211_prepare_vendor_dump()
13640 if (cb->args[0]) { in nl80211_prepare_vendor_dump()
13642 struct wiphy *wiphy = wiphy_idx_to_wiphy(cb->args[0] - 1); in nl80211_prepare_vendor_dump()
13646 return -ENODEV; in nl80211_prepare_vendor_dump()
13650 if (cb->args[1]) { in nl80211_prepare_vendor_dump()
13651 list_for_each_entry(tmp, &wiphy->wdev_list, list) { in nl80211_prepare_vendor_dump()
13652 if (tmp->identifier == cb->args[1] - 1) { in nl80211_prepare_vendor_dump()
13665 return -ENOMEM; in nl80211_prepare_vendor_dump()
13667 err = nlmsg_parse_deprecated(cb->nlh, in nl80211_prepare_vendor_dump()
13676 err = -EINVAL; in nl80211_prepare_vendor_dump()
13680 *wdev = __cfg80211_wdev_from_attrs(sock_net(skb->sk), attrbuf); in nl80211_prepare_vendor_dump()
13684 *rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk), attrbuf); in nl80211_prepare_vendor_dump()
13693 for (i = 0; i < (*rdev)->wiphy.n_vendor_commands; i++) { in nl80211_prepare_vendor_dump()
13696 vcmd = &(*rdev)->wiphy.vendor_commands[i]; in nl80211_prepare_vendor_dump()
13698 if (vcmd->info.vendor_id != vid || vcmd->info.subcmd != subcmd) in nl80211_prepare_vendor_dump()
13701 if (!vcmd->dumpit) { in nl80211_prepare_vendor_dump()
13702 err = -EOPNOTSUPP; in nl80211_prepare_vendor_dump()
13711 err = -EOPNOTSUPP; in nl80211_prepare_vendor_dump()
13720 &(*rdev)->wiphy.vendor_commands[vcmd_idx], in nl80211_prepare_vendor_dump()
13722 cb->extack); in nl80211_prepare_vendor_dump()
13727 /* 0 is the first index - add 1 to parse only once */ in nl80211_prepare_vendor_dump()
13728 cb->args[0] = (*rdev)->wiphy_idx + 1; in nl80211_prepare_vendor_dump()
13730 cb->args[1] = *wdev ? (*wdev)->identifier + 1 : 0; in nl80211_prepare_vendor_dump()
13731 cb->args[2] = vcmd_idx; in nl80211_prepare_vendor_dump()
13732 cb->args[3] = (unsigned long)data; in nl80211_prepare_vendor_dump()
13733 cb->args[4] = data_len; in nl80211_prepare_vendor_dump()
13759 vcmd_idx = cb->args[2]; in nl80211_vendor_cmd_dump()
13760 data = (void *)cb->args[3]; in nl80211_vendor_cmd_dump()
13761 data_len = cb->args[4]; in nl80211_vendor_cmd_dump()
13762 vcmd = &rdev->wiphy.vendor_commands[vcmd_idx]; in nl80211_vendor_cmd_dump()
13764 if (vcmd->flags & (WIPHY_VENDOR_CMD_NEED_WDEV | in nl80211_vendor_cmd_dump()
13767 err = -EINVAL; in nl80211_vendor_cmd_dump()
13770 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_NETDEV && in nl80211_vendor_cmd_dump()
13771 !wdev->netdev) { in nl80211_vendor_cmd_dump()
13772 err = -EINVAL; in nl80211_vendor_cmd_dump()
13776 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_RUNNING) { in nl80211_vendor_cmd_dump()
13778 err = -ENETDOWN; in nl80211_vendor_cmd_dump()
13785 void *hdr = nl80211hdr_put(skb, NETLINK_CB(cb->skb).portid, in nl80211_vendor_cmd_dump()
13786 cb->nlh->nlmsg_seq, NLM_F_MULTI, in nl80211_vendor_cmd_dump()
13791 if (nla_put_u32(skb, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_vendor_cmd_dump()
13806 err = vcmd->dumpit(&rdev->wiphy, wdev, skb, data, data_len, in nl80211_vendor_cmd_dump()
13807 (unsigned long *)&cb->args[5]); in nl80211_vendor_cmd_dump()
13810 if (err == -ENOBUFS || err == -ENOENT) { in nl80211_vendor_cmd_dump()
13821 err = skb->len; in nl80211_vendor_cmd_dump()
13834 if (WARN_ON(!rdev->cur_cmd_info)) in __cfg80211_alloc_reply_skb()
13838 rdev->cur_cmd_info->snd_portid, in __cfg80211_alloc_reply_skb()
13839 rdev->cur_cmd_info->snd_seq, in __cfg80211_alloc_reply_skb()
13846 struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0]; in cfg80211_vendor_cmd_reply()
13847 void *hdr = ((void **)skb->cb)[1]; in cfg80211_vendor_cmd_reply()
13848 struct nlattr *data = ((void **)skb->cb)[2]; in cfg80211_vendor_cmd_reply()
13851 memset(skb->cb, 0, sizeof(skb->cb)); in cfg80211_vendor_cmd_reply()
13853 if (WARN_ON(!rdev->cur_cmd_info)) { in cfg80211_vendor_cmd_reply()
13855 return -EINVAL; in cfg80211_vendor_cmd_reply()
13860 return genlmsg_reply(skb, rdev->cur_cmd_info); in cfg80211_vendor_cmd_reply()
13868 if (WARN_ON(!rdev->cur_cmd_info)) in cfg80211_vendor_cmd_get_sender()
13871 return rdev->cur_cmd_info->snd_portid; in cfg80211_vendor_cmd_get_sender()
13878 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_qos_map()
13880 struct net_device *dev = info->user_ptr[1]; in nl80211_set_qos_map()
13884 if (!rdev->ops->set_qos_map) in nl80211_set_qos_map()
13885 return -EOPNOTSUPP; in nl80211_set_qos_map()
13887 if (info->attrs[NL80211_ATTR_QOS_MAP]) { in nl80211_set_qos_map()
13888 pos = nla_data(info->attrs[NL80211_ATTR_QOS_MAP]); in nl80211_set_qos_map()
13889 len = nla_len(info->attrs[NL80211_ATTR_QOS_MAP]); in nl80211_set_qos_map()
13892 return -EINVAL; in nl80211_set_qos_map()
13896 return -ENOMEM; in nl80211_set_qos_map()
13898 num_des = (len - IEEE80211_QOS_MAP_LEN_MIN) >> 1; in nl80211_set_qos_map()
13902 memcpy(qos_map->dscp_exception, pos, des_len); in nl80211_set_qos_map()
13903 qos_map->num_des = num_des; in nl80211_set_qos_map()
13905 if (qos_map->dscp_exception[des].up > 7) { in nl80211_set_qos_map()
13907 return -EINVAL; in nl80211_set_qos_map()
13912 memcpy(qos_map->up, pos, IEEE80211_QOS_MAP_LEN_MIN); in nl80211_set_qos_map()
13915 wdev_lock(dev->ieee80211_ptr); in nl80211_set_qos_map()
13916 ret = nl80211_key_allowed(dev->ieee80211_ptr); in nl80211_set_qos_map()
13919 wdev_unlock(dev->ieee80211_ptr); in nl80211_set_qos_map()
13927 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_add_tx_ts()
13928 struct net_device *dev = info->user_ptr[1]; in nl80211_add_tx_ts()
13929 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_add_tx_ts()
13935 if (!(rdev->wiphy.features & NL80211_FEATURE_SUPPORTS_WMM_ADMISSION)) in nl80211_add_tx_ts()
13936 return -EOPNOTSUPP; in nl80211_add_tx_ts()
13938 if (!info->attrs[NL80211_ATTR_TSID] || !info->attrs[NL80211_ATTR_MAC] || in nl80211_add_tx_ts()
13939 !info->attrs[NL80211_ATTR_USER_PRIO]) in nl80211_add_tx_ts()
13940 return -EINVAL; in nl80211_add_tx_ts()
13942 tsid = nla_get_u8(info->attrs[NL80211_ATTR_TSID]); in nl80211_add_tx_ts()
13943 up = nla_get_u8(info->attrs[NL80211_ATTR_USER_PRIO]); in nl80211_add_tx_ts()
13945 /* WMM uses TIDs 0-7 even for TSPEC */ in nl80211_add_tx_ts()
13951 return -EINVAL; in nl80211_add_tx_ts()
13954 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_add_tx_ts()
13956 if (info->attrs[NL80211_ATTR_ADMITTED_TIME]) { in nl80211_add_tx_ts()
13958 nla_get_u16(info->attrs[NL80211_ATTR_ADMITTED_TIME]); in nl80211_add_tx_ts()
13960 return -EINVAL; in nl80211_add_tx_ts()
13964 switch (wdev->iftype) { in nl80211_add_tx_ts()
13967 if (wdev->current_bss) in nl80211_add_tx_ts()
13969 err = -ENOTCONN; in nl80211_add_tx_ts()
13972 err = -EOPNOTSUPP; in nl80211_add_tx_ts()
13985 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_del_tx_ts()
13986 struct net_device *dev = info->user_ptr[1]; in nl80211_del_tx_ts()
13987 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_del_tx_ts()
13992 if (!info->attrs[NL80211_ATTR_TSID] || !info->attrs[NL80211_ATTR_MAC]) in nl80211_del_tx_ts()
13993 return -EINVAL; in nl80211_del_tx_ts()
13995 tsid = nla_get_u8(info->attrs[NL80211_ATTR_TSID]); in nl80211_del_tx_ts()
13996 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_del_tx_ts()
14008 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_tdls_channel_switch()
14009 struct net_device *dev = info->user_ptr[1]; in nl80211_tdls_channel_switch()
14010 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_tdls_channel_switch()
14016 if (!rdev->ops->tdls_channel_switch || in nl80211_tdls_channel_switch()
14017 !(rdev->wiphy.features & NL80211_FEATURE_TDLS_CHANNEL_SWITCH)) in nl80211_tdls_channel_switch()
14018 return -EOPNOTSUPP; in nl80211_tdls_channel_switch()
14020 switch (dev->ieee80211_ptr->iftype) { in nl80211_tdls_channel_switch()
14025 return -EOPNOTSUPP; in nl80211_tdls_channel_switch()
14028 if (!info->attrs[NL80211_ATTR_MAC] || in nl80211_tdls_channel_switch()
14029 !info->attrs[NL80211_ATTR_OPER_CLASS]) in nl80211_tdls_channel_switch()
14030 return -EINVAL; in nl80211_tdls_channel_switch()
14037 * Don't allow wide channels on the 2.4Ghz band, as per IEEE802.11-2012 in nl80211_tdls_channel_switch()
14041 if (chandef.chan->band == NL80211_BAND_2GHZ && in nl80211_tdls_channel_switch()
14044 return -EINVAL; in nl80211_tdls_channel_switch()
14047 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &chandef, in nl80211_tdls_channel_switch()
14048 wdev->iftype)) in nl80211_tdls_channel_switch()
14049 return -EINVAL; in nl80211_tdls_channel_switch()
14052 if (cfg80211_chandef_dfs_required(wdev->wiphy, &chandef, wdev->iftype)) in nl80211_tdls_channel_switch()
14053 return -EINVAL; in nl80211_tdls_channel_switch()
14055 addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_tdls_channel_switch()
14056 oper_class = nla_get_u8(info->attrs[NL80211_ATTR_OPER_CLASS]); in nl80211_tdls_channel_switch()
14068 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_tdls_cancel_channel_switch()
14069 struct net_device *dev = info->user_ptr[1]; in nl80211_tdls_cancel_channel_switch()
14070 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_tdls_cancel_channel_switch()
14073 if (!rdev->ops->tdls_channel_switch || in nl80211_tdls_cancel_channel_switch()
14074 !rdev->ops->tdls_cancel_channel_switch || in nl80211_tdls_cancel_channel_switch()
14075 !(rdev->wiphy.features & NL80211_FEATURE_TDLS_CHANNEL_SWITCH)) in nl80211_tdls_cancel_channel_switch()
14076 return -EOPNOTSUPP; in nl80211_tdls_cancel_channel_switch()
14078 switch (dev->ieee80211_ptr->iftype) { in nl80211_tdls_cancel_channel_switch()
14083 return -EOPNOTSUPP; in nl80211_tdls_cancel_channel_switch()
14086 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_tdls_cancel_channel_switch()
14087 return -EINVAL; in nl80211_tdls_cancel_channel_switch()
14089 addr = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_tdls_cancel_channel_switch()
14101 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_multicast_to_unicast()
14102 struct net_device *dev = info->user_ptr[1]; in nl80211_set_multicast_to_unicast()
14103 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_multicast_to_unicast()
14107 if (!rdev->ops->set_multicast_to_unicast) in nl80211_set_multicast_to_unicast()
14108 return -EOPNOTSUPP; in nl80211_set_multicast_to_unicast()
14110 if (wdev->iftype != NL80211_IFTYPE_AP && in nl80211_set_multicast_to_unicast()
14111 wdev->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_set_multicast_to_unicast()
14112 return -EOPNOTSUPP; in nl80211_set_multicast_to_unicast()
14114 nla = info->attrs[NL80211_ATTR_MULTICAST_TO_UNICAST_ENABLED]; in nl80211_set_multicast_to_unicast()
14122 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_pmk()
14123 struct net_device *dev = info->user_ptr[1]; in nl80211_set_pmk()
14124 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_set_pmk()
14128 if (wdev->iftype != NL80211_IFTYPE_STATION && in nl80211_set_pmk()
14129 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_set_pmk()
14130 return -EOPNOTSUPP; in nl80211_set_pmk()
14132 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_set_pmk()
14134 return -EOPNOTSUPP; in nl80211_set_pmk()
14136 if (!info->attrs[NL80211_ATTR_MAC] || !info->attrs[NL80211_ATTR_PMK]) in nl80211_set_pmk()
14137 return -EINVAL; in nl80211_set_pmk()
14140 if (!wdev->current_bss) { in nl80211_set_pmk()
14141 ret = -ENOTCONN; in nl80211_set_pmk()
14145 pmk_conf.aa = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_set_pmk()
14146 if (memcmp(pmk_conf.aa, wdev->current_bss->pub.bssid, ETH_ALEN)) { in nl80211_set_pmk()
14147 ret = -EINVAL; in nl80211_set_pmk()
14151 pmk_conf.pmk = nla_data(info->attrs[NL80211_ATTR_PMK]); in nl80211_set_pmk()
14152 pmk_conf.pmk_len = nla_len(info->attrs[NL80211_ATTR_PMK]); in nl80211_set_pmk()
14155 ret = -EINVAL; in nl80211_set_pmk()
14159 if (info->attrs[NL80211_ATTR_PMKR0_NAME]) in nl80211_set_pmk()
14161 nla_data(info->attrs[NL80211_ATTR_PMKR0_NAME]); in nl80211_set_pmk()
14171 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_del_pmk()
14172 struct net_device *dev = info->user_ptr[1]; in nl80211_del_pmk()
14173 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_del_pmk()
14177 if (wdev->iftype != NL80211_IFTYPE_STATION && in nl80211_del_pmk()
14178 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) in nl80211_del_pmk()
14179 return -EOPNOTSUPP; in nl80211_del_pmk()
14181 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_del_pmk()
14183 return -EOPNOTSUPP; in nl80211_del_pmk()
14185 if (!info->attrs[NL80211_ATTR_MAC]) in nl80211_del_pmk()
14186 return -EINVAL; in nl80211_del_pmk()
14189 aa = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_del_pmk()
14198 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_external_auth()
14199 struct net_device *dev = info->user_ptr[1]; in nl80211_external_auth()
14202 if (!rdev->ops->external_auth) in nl80211_external_auth()
14203 return -EOPNOTSUPP; in nl80211_external_auth()
14205 if (!info->attrs[NL80211_ATTR_SSID] && in nl80211_external_auth()
14206 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && in nl80211_external_auth()
14207 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) in nl80211_external_auth()
14208 return -EINVAL; in nl80211_external_auth()
14210 if (!info->attrs[NL80211_ATTR_BSSID]) in nl80211_external_auth()
14211 return -EINVAL; in nl80211_external_auth()
14213 if (!info->attrs[NL80211_ATTR_STATUS_CODE]) in nl80211_external_auth()
14214 return -EINVAL; in nl80211_external_auth()
14218 if (info->attrs[NL80211_ATTR_SSID]) { in nl80211_external_auth()
14219 params.ssid.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); in nl80211_external_auth()
14221 return -EINVAL; in nl80211_external_auth()
14223 nla_data(info->attrs[NL80211_ATTR_SSID]), in nl80211_external_auth()
14227 memcpy(params.bssid, nla_data(info->attrs[NL80211_ATTR_BSSID]), in nl80211_external_auth()
14230 params.status = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]); in nl80211_external_auth()
14232 if (info->attrs[NL80211_ATTR_PMKID]) in nl80211_external_auth()
14233 params.pmkid = nla_data(info->attrs[NL80211_ATTR_PMKID]); in nl80211_external_auth()
14240 bool dont_wait_for_ack = info->attrs[NL80211_ATTR_DONT_WAIT_FOR_ACK]; in nl80211_tx_control_port()
14241 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_tx_control_port()
14242 struct net_device *dev = info->user_ptr[1]; in nl80211_tx_control_port()
14243 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_tx_control_port()
14252 if (!wiphy_ext_feature_isset(&rdev->wiphy, in nl80211_tx_control_port()
14254 return -EOPNOTSUPP; in nl80211_tx_control_port()
14256 if (!rdev->ops->tx_control_port) in nl80211_tx_control_port()
14257 return -EOPNOTSUPP; in nl80211_tx_control_port()
14259 if (!info->attrs[NL80211_ATTR_FRAME] || in nl80211_tx_control_port()
14260 !info->attrs[NL80211_ATTR_MAC] || in nl80211_tx_control_port()
14261 !info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]) { in nl80211_tx_control_port()
14263 return -EINVAL; in nl80211_tx_control_port()
14268 switch (wdev->iftype) { in nl80211_tx_control_port()
14276 if (wdev->current_bss) in nl80211_tx_control_port()
14278 err = -ENOTCONN; in nl80211_tx_control_port()
14281 err = -EOPNOTSUPP; in nl80211_tx_control_port()
14287 buf = nla_data(info->attrs[NL80211_ATTR_FRAME]); in nl80211_tx_control_port()
14288 len = nla_len(info->attrs[NL80211_ATTR_FRAME]); in nl80211_tx_control_port()
14289 dest = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_tx_control_port()
14290 proto = nla_get_u16(info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]); in nl80211_tx_control_port()
14292 nla_get_flag(info->attrs[NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT]); in nl80211_tx_control_port()
14298 nl_set_extack_cookie_u64(info->extack, cookie); in nl80211_tx_control_port()
14308 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_get_ftm_responder_stats()
14309 struct net_device *dev = info->user_ptr[1]; in nl80211_get_ftm_responder_stats()
14310 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_get_ftm_responder_stats()
14317 if (wdev->iftype != NL80211_IFTYPE_AP || !wdev->beacon_interval) in nl80211_get_ftm_responder_stats()
14318 return -EOPNOTSUPP; in nl80211_get_ftm_responder_stats()
14325 return -ENODATA; in nl80211_get_ftm_responder_stats()
14329 return -ENOMEM; in nl80211_get_ftm_responder_stats()
14331 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, in nl80211_get_ftm_responder_stats()
14336 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) in nl80211_get_ftm_responder_stats()
14373 return -ENOBUFS; in nl80211_get_ftm_responder_stats()
14378 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_update_owe_info()
14380 struct net_device *dev = info->user_ptr[1]; in nl80211_update_owe_info()
14382 if (!rdev->ops->update_owe_info) in nl80211_update_owe_info()
14383 return -EOPNOTSUPP; in nl80211_update_owe_info()
14385 if (!info->attrs[NL80211_ATTR_STATUS_CODE] || in nl80211_update_owe_info()
14386 !info->attrs[NL80211_ATTR_MAC]) in nl80211_update_owe_info()
14387 return -EINVAL; in nl80211_update_owe_info()
14390 owe_info.status = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]); in nl80211_update_owe_info()
14391 nla_memcpy(owe_info.peer, info->attrs[NL80211_ATTR_MAC], ETH_ALEN); in nl80211_update_owe_info()
14393 if (info->attrs[NL80211_ATTR_IE]) { in nl80211_update_owe_info()
14394 owe_info.ie = nla_data(info->attrs[NL80211_ATTR_IE]); in nl80211_update_owe_info()
14395 owe_info.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); in nl80211_update_owe_info()
14403 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_probe_mesh_link()
14404 struct net_device *dev = info->user_ptr[1]; in nl80211_probe_mesh_link()
14405 struct wireless_dev *wdev = dev->ieee80211_ptr; in nl80211_probe_mesh_link()
14412 if (!rdev->ops->probe_mesh_link || !rdev->ops->get_station) in nl80211_probe_mesh_link()
14413 return -EOPNOTSUPP; in nl80211_probe_mesh_link()
14415 if (!info->attrs[NL80211_ATTR_MAC] || in nl80211_probe_mesh_link()
14416 !info->attrs[NL80211_ATTR_FRAME]) { in nl80211_probe_mesh_link()
14418 return -EINVAL; in nl80211_probe_mesh_link()
14421 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) in nl80211_probe_mesh_link()
14422 return -EOPNOTSUPP; in nl80211_probe_mesh_link()
14424 dest = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_probe_mesh_link()
14425 buf = nla_data(info->attrs[NL80211_ATTR_FRAME]); in nl80211_probe_mesh_link()
14426 len = nla_len(info->attrs[NL80211_ATTR_FRAME]); in nl80211_probe_mesh_link()
14429 return -EINVAL; in nl80211_probe_mesh_link()
14432 !ether_addr_equal(buf + ETH_ALEN, dev->dev_addr)) in nl80211_probe_mesh_link()
14433 return -EINVAL; in nl80211_probe_mesh_link()
14449 struct netlink_ext_ack *extack = info->extack; in parse_tid_conf()
14454 return -EINVAL; in parse_tid_conf()
14456 tid_conf->config_override = in parse_tid_conf()
14458 tid_conf->tids = nla_get_u16(attrs[NL80211_TID_CONFIG_ATTR_TIDS]); in parse_tid_conf()
14460 if (tid_conf->config_override) { in parse_tid_conf()
14461 if (rdev->ops->reset_tid_config) { in parse_tid_conf()
14463 tid_conf->tids); in parse_tid_conf()
14467 return -EINVAL; in parse_tid_conf()
14472 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_NOACK); in parse_tid_conf()
14473 tid_conf->noack = in parse_tid_conf()
14478 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_RETRY_SHORT); in parse_tid_conf()
14479 tid_conf->retry_short = in parse_tid_conf()
14482 if (tid_conf->retry_short > rdev->wiphy.max_data_retry_count) in parse_tid_conf()
14483 return -EINVAL; in parse_tid_conf()
14487 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_RETRY_LONG); in parse_tid_conf()
14488 tid_conf->retry_long = in parse_tid_conf()
14491 if (tid_conf->retry_long > rdev->wiphy.max_data_retry_count) in parse_tid_conf()
14492 return -EINVAL; in parse_tid_conf()
14496 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_AMPDU_CTRL); in parse_tid_conf()
14497 tid_conf->ampdu = in parse_tid_conf()
14502 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL); in parse_tid_conf()
14503 tid_conf->rtscts = in parse_tid_conf()
14508 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_AMSDU_CTRL); in parse_tid_conf()
14509 tid_conf->amsdu = in parse_tid_conf()
14516 tid_conf->txrate_type = nla_get_u8(attrs[idx]); in parse_tid_conf()
14518 if (tid_conf->txrate_type != NL80211_TX_RATE_AUTOMATIC) { in parse_tid_conf()
14521 &tid_conf->txrate_mask, dev); in parse_tid_conf()
14525 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_TX_RATE); in parse_tid_conf()
14527 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE); in parse_tid_conf()
14531 mask = rdev->wiphy.tid_config_support.peer; in parse_tid_conf()
14533 mask = rdev->wiphy.tid_config_support.vif; in parse_tid_conf()
14535 if (tid_conf->mask & ~mask) { in parse_tid_conf()
14537 return -ENOTSUPP; in parse_tid_conf()
14546 struct cfg80211_registered_device *rdev = info->user_ptr[0]; in nl80211_set_tid_config()
14548 struct net_device *dev = info->user_ptr[1]; in nl80211_set_tid_config()
14552 int ret = -EINVAL; in nl80211_set_tid_config()
14555 if (!info->attrs[NL80211_ATTR_TID_CONFIG]) in nl80211_set_tid_config()
14556 return -EINVAL; in nl80211_set_tid_config()
14558 if (!rdev->ops->set_tid_config) in nl80211_set_tid_config()
14559 return -EOPNOTSUPP; in nl80211_set_tid_config()
14561 nla_for_each_nested(tid, info->attrs[NL80211_ATTR_TID_CONFIG], in nl80211_set_tid_config()
14568 return -ENOMEM; in nl80211_set_tid_config()
14570 tid_config->n_tid_conf = num_conf; in nl80211_set_tid_config()
14572 if (info->attrs[NL80211_ATTR_MAC]) in nl80211_set_tid_config()
14573 tid_config->peer = nla_data(info->attrs[NL80211_ATTR_MAC]); in nl80211_set_tid_config()
14575 nla_for_each_nested(tid, info->attrs[NL80211_ATTR_TID_CONFIG], in nl80211_set_tid_config()
14584 &tid_config->tid_conf[conf_idx], in nl80211_set_tid_config()
14585 info, tid_config->peer); in nl80211_set_tid_config()
14617 bool rtnl = ops->internal_flags & NL80211_FLAG_NEED_RTNL; in nl80211_pre_doit()
14622 if (ops->internal_flags & NL80211_FLAG_NEED_WIPHY) { in nl80211_pre_doit()
14629 info->user_ptr[0] = rdev; in nl80211_pre_doit()
14630 } else if (ops->internal_flags & NL80211_FLAG_NEED_NETDEV || in nl80211_pre_doit()
14631 ops->internal_flags & NL80211_FLAG_NEED_WDEV) { in nl80211_pre_doit()
14635 info->attrs); in nl80211_pre_doit()
14642 dev = wdev->netdev; in nl80211_pre_doit()
14643 rdev = wiphy_to_rdev(wdev->wiphy); in nl80211_pre_doit()
14645 if (ops->internal_flags & NL80211_FLAG_NEED_NETDEV) { in nl80211_pre_doit()
14649 return -EINVAL; in nl80211_pre_doit()
14652 info->user_ptr[1] = dev; in nl80211_pre_doit()
14654 info->user_ptr[1] = wdev; in nl80211_pre_doit()
14657 if (ops->internal_flags & NL80211_FLAG_CHECK_NETDEV_UP && in nl80211_pre_doit()
14661 return -ENETDOWN; in nl80211_pre_doit()
14667 info->user_ptr[0] = rdev; in nl80211_pre_doit()
14676 if (info->user_ptr[1]) { in nl80211_post_doit()
14677 if (ops->internal_flags & NL80211_FLAG_NEED_WDEV) { in nl80211_post_doit()
14678 struct wireless_dev *wdev = info->user_ptr[1]; in nl80211_post_doit()
14680 if (wdev->netdev) in nl80211_post_doit()
14681 dev_put(wdev->netdev); in nl80211_post_doit()
14683 dev_put(info->user_ptr[1]); in nl80211_post_doit()
14687 if (ops->internal_flags & NL80211_FLAG_NEED_RTNL) in nl80211_post_doit()
14695 if (ops->internal_flags & NL80211_FLAG_CLEAR_SKB) { in nl80211_post_doit()
15604 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_notify_wiphy()
15623 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_notify_iface()
15630 struct cfg80211_scan_request *req = rdev->scan_req; in nl80211_add_scan_req()
15641 for (i = 0; i < req->n_ssids; i++) { in nl80211_add_scan_req()
15642 if (nla_put(msg, i, req->ssids[i].ssid_len, req->ssids[i].ssid)) in nl80211_add_scan_req()
15647 if (req->flags & NL80211_SCAN_FLAG_FREQ_KHZ) { in nl80211_add_scan_req()
15651 for (i = 0; i < req->n_channels; i++) { in nl80211_add_scan_req()
15653 ieee80211_channel_to_khz(req->channels[i]))) in nl80211_add_scan_req()
15662 for (i = 0; i < req->n_channels; i++) { in nl80211_add_scan_req()
15663 if (nla_put_u32(msg, i, req->channels[i]->center_freq)) in nl80211_add_scan_req()
15669 if (req->ie && in nl80211_add_scan_req()
15670 nla_put(msg, NL80211_ATTR_IE, req->ie_len, req->ie)) in nl80211_add_scan_req()
15673 if (req->flags && in nl80211_add_scan_req()
15674 nla_put_u32(msg, NL80211_ATTR_SCAN_FLAGS, req->flags)) in nl80211_add_scan_req()
15677 info = rdev->int_scan_req ? &rdev->int_scan_req->info : in nl80211_add_scan_req()
15678 &rdev->scan_req->info; in nl80211_add_scan_req()
15679 if (info->scan_start_tsf && in nl80211_add_scan_req()
15681 info->scan_start_tsf, NL80211_BSS_PAD) || in nl80211_add_scan_req()
15683 info->tsf_bssid))) in nl80211_add_scan_req()
15688 return -ENOBUFS; in nl80211_add_scan_req()
15701 return -1; in nl80211_prep_scan_msg()
15703 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_prep_scan_msg()
15704 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, in nl80211_prep_scan_msg()
15705 wdev->netdev->ifindex)) || in nl80211_prep_scan_msg()
15718 return -EMSGSIZE; in nl80211_prep_scan_msg()
15729 return -1; in nl80211_prep_sched_scan_msg()
15732 wiphy_to_rdev(req->wiphy)->wiphy_idx) || in nl80211_prep_sched_scan_msg()
15733 nla_put_u32(msg, NL80211_ATTR_IFINDEX, req->dev->ifindex) || in nl80211_prep_sched_scan_msg()
15734 nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, req->reqid, in nl80211_prep_sched_scan_msg()
15743 return -EMSGSIZE; in nl80211_prep_sched_scan_msg()
15761 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_scan_start()
15791 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_scan_msg()
15808 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(req->wiphy), msg, 0, in nl80211_send_sched_scan()
15816 if (nla_put_u8(msg, NL80211_ATTR_REG_INITIATOR, request->initiator)) in nl80211_reg_change_event_fill()
15819 if (request->alpha2[0] == '0' && request->alpha2[1] == '0') { in nl80211_reg_change_event_fill()
15823 } else if (request->alpha2[0] == '9' && request->alpha2[1] == '9') { in nl80211_reg_change_event_fill()
15827 } else if ((request->alpha2[0] == '9' && request->alpha2[1] == '8') || in nl80211_reg_change_event_fill()
15828 request->intersect) { in nl80211_reg_change_event_fill()
15836 request->alpha2)) in nl80211_reg_change_event_fill()
15840 if (request->wiphy_idx != WIPHY_IDX_INVALID) { in nl80211_reg_change_event_fill()
15841 struct wiphy *wiphy = wiphy_idx_to_wiphy(request->wiphy_idx); in nl80211_reg_change_event_fill()
15844 nla_put_u32(msg, NL80211_ATTR_WIPHY, request->wiphy_idx)) in nl80211_reg_change_event_fill()
15848 wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED && in nl80211_reg_change_event_fill()
15913 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_mlme_event()
15914 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_send_mlme_event()
15935 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_mlme_event()
15948 NL80211_CMD_AUTHENTICATE, gfp, -1, NULL, 0); in nl80211_send_rx_auth()
15966 NL80211_CMD_DEAUTHENTICATE, gfp, -1, NULL, 0); in nl80211_send_deauth()
15974 NL80211_CMD_DISASSOCIATE, gfp, -1, NULL, 0); in nl80211_send_disassoc()
15980 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_rx_unprot_mlme_mgmt()
15981 struct wiphy *wiphy = wdev->wiphy; in cfg80211_rx_unprot_mlme_mgmt()
15989 if (ieee80211_is_deauth(mgmt->frame_control)) { in cfg80211_rx_unprot_mlme_mgmt()
15991 } else if (ieee80211_is_disassoc(mgmt->frame_control)) { in cfg80211_rx_unprot_mlme_mgmt()
15993 } else if (ieee80211_is_beacon(mgmt->frame_control)) { in cfg80211_rx_unprot_mlme_mgmt()
15994 if (wdev->unprot_beacon_reported && in cfg80211_rx_unprot_mlme_mgmt()
15995 elapsed_jiffies_msecs(wdev->unprot_beacon_reported) < 10000) in cfg80211_rx_unprot_mlme_mgmt()
15998 wdev->unprot_beacon_reported = jiffies; in cfg80211_rx_unprot_mlme_mgmt()
16004 nl80211_send_mlme_event(rdev, dev, buf, len, cmd, GFP_ATOMIC, -1, in cfg80211_rx_unprot_mlme_mgmt()
16026 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_mlme_timeout()
16027 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_send_mlme_timeout()
16034 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_mlme_timeout()
16066 msg = nlmsg_new(100 + cr->req_ie_len + cr->resp_ie_len + in nl80211_send_connect_result()
16067 cr->fils.kek_len + cr->fils.pmk_len + in nl80211_send_connect_result()
16068 (cr->fils.pmkid ? WLAN_PMKID_LEN : 0), gfp); in nl80211_send_connect_result()
16078 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_connect_result()
16079 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_send_connect_result()
16080 (cr->bssid && in nl80211_send_connect_result()
16081 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, cr->bssid)) || in nl80211_send_connect_result()
16083 cr->status < 0 ? WLAN_STATUS_UNSPECIFIED_FAILURE : in nl80211_send_connect_result()
16084 cr->status) || in nl80211_send_connect_result()
16085 (cr->status < 0 && in nl80211_send_connect_result()
16088 cr->timeout_reason))) || in nl80211_send_connect_result()
16089 (cr->req_ie && in nl80211_send_connect_result()
16090 nla_put(msg, NL80211_ATTR_REQ_IE, cr->req_ie_len, cr->req_ie)) || in nl80211_send_connect_result()
16091 (cr->resp_ie && in nl80211_send_connect_result()
16092 nla_put(msg, NL80211_ATTR_RESP_IE, cr->resp_ie_len, in nl80211_send_connect_result()
16093 cr->resp_ie)) || in nl80211_send_connect_result()
16094 (cr->fils.update_erp_next_seq_num && in nl80211_send_connect_result()
16096 cr->fils.erp_next_seq_num)) || in nl80211_send_connect_result()
16097 (cr->status == WLAN_STATUS_SUCCESS && in nl80211_send_connect_result()
16098 ((cr->fils.kek && in nl80211_send_connect_result()
16099 nla_put(msg, NL80211_ATTR_FILS_KEK, cr->fils.kek_len, in nl80211_send_connect_result()
16100 cr->fils.kek)) || in nl80211_send_connect_result()
16101 (cr->fils.pmk && in nl80211_send_connect_result()
16102 nla_put(msg, NL80211_ATTR_PMK, cr->fils.pmk_len, cr->fils.pmk)) || in nl80211_send_connect_result()
16103 (cr->fils.pmkid && in nl80211_send_connect_result()
16104 nla_put(msg, NL80211_ATTR_PMKID, WLAN_PMKID_LEN, cr->fils.pmkid))))) in nl80211_send_connect_result()
16109 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_connect_result()
16123 const u8 *bssid = info->bss ? info->bss->bssid : info->bssid; in nl80211_send_roamed()
16125 msg = nlmsg_new(100 + info->req_ie_len + info->resp_ie_len + in nl80211_send_roamed()
16126 info->fils.kek_len + info->fils.pmk_len + in nl80211_send_roamed()
16127 (info->fils.pmkid ? WLAN_PMKID_LEN : 0), gfp); in nl80211_send_roamed()
16137 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_roamed()
16138 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_send_roamed()
16140 (info->req_ie && in nl80211_send_roamed()
16141 nla_put(msg, NL80211_ATTR_REQ_IE, info->req_ie_len, in nl80211_send_roamed()
16142 info->req_ie)) || in nl80211_send_roamed()
16143 (info->resp_ie && in nl80211_send_roamed()
16144 nla_put(msg, NL80211_ATTR_RESP_IE, info->resp_ie_len, in nl80211_send_roamed()
16145 info->resp_ie)) || in nl80211_send_roamed()
16146 (info->fils.update_erp_next_seq_num && in nl80211_send_roamed()
16148 info->fils.erp_next_seq_num)) || in nl80211_send_roamed()
16149 (info->fils.kek && in nl80211_send_roamed()
16150 nla_put(msg, NL80211_ATTR_FILS_KEK, info->fils.kek_len, in nl80211_send_roamed()
16151 info->fils.kek)) || in nl80211_send_roamed()
16152 (info->fils.pmk && in nl80211_send_roamed()
16153 nla_put(msg, NL80211_ATTR_PMK, info->fils.pmk_len, info->fils.pmk)) || in nl80211_send_roamed()
16154 (info->fils.pmkid && in nl80211_send_roamed()
16155 nla_put(msg, NL80211_ATTR_PMKID, WLAN_PMKID_LEN, info->fils.pmkid))) in nl80211_send_roamed()
16160 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_roamed()
16184 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_port_authorized()
16185 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_send_port_authorized()
16191 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_port_authorized()
16216 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_disconnected()
16217 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_send_disconnected()
16227 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_disconnected()
16252 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_ibss_bssid()
16253 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_send_ibss_bssid()
16259 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_ibss_bssid()
16271 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_notify_new_peer_candidate()
16272 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_notify_new_peer_candidate()
16276 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_MESH_POINT)) in cfg80211_notify_new_peer_candidate()
16291 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_notify_new_peer_candidate()
16292 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in cfg80211_notify_new_peer_candidate()
16302 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_notify_new_peer_candidate()
16329 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_michael_mic_failure()
16330 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_michael_mic_failure()
16333 (key_id != -1 && in nl80211_michael_mic_failure()
16340 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_michael_mic_failure()
16423 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_remain_on_chan_event()
16424 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, in nl80211_send_remain_on_chan_event()
16425 wdev->netdev->ifindex)) || in nl80211_send_remain_on_chan_event()
16428 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, chan->center_freq) || in nl80211_send_remain_on_chan_event()
16441 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_send_remain_on_chan_event()
16453 struct wiphy *wiphy = wdev->wiphy; in cfg80211_ready_on_channel()
16467 struct wiphy *wiphy = wdev->wiphy; in cfg80211_remain_on_channel_expired()
16480 struct wiphy *wiphy = wdev->wiphy; in cfg80211_tx_mgmt_expired()
16492 struct wiphy *wiphy = dev->ieee80211_ptr->wiphy; in cfg80211_new_sta()
16508 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_new_sta()
16516 struct wiphy *wiphy = dev->ieee80211_ptr->wiphy; in cfg80211_del_sta_sinfo()
16538 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_del_sta_sinfo()
16547 struct wiphy *wiphy = dev->ieee80211_ptr->wiphy; in cfg80211_conn_failed()
16562 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in cfg80211_conn_failed()
16569 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_conn_failed()
16581 struct wireless_dev *wdev = dev->ieee80211_ptr; in __nl80211_unexpected_frame()
16582 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in __nl80211_unexpected_frame()
16585 u32 nlportid = READ_ONCE(wdev->ap_unexpected_nlportid); in __nl80211_unexpected_frame()
16600 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in __nl80211_unexpected_frame()
16601 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in __nl80211_unexpected_frame()
16606 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); in __nl80211_unexpected_frame()
16617 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_rx_spurious_frame()
16622 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP && in cfg80211_rx_spurious_frame()
16623 wdev->iftype != NL80211_IFTYPE_P2P_GO)) { in cfg80211_rx_spurious_frame()
16637 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_rx_unexpected_4addr_frame()
16642 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP && in cfg80211_rx_unexpected_4addr_frame()
16643 wdev->iftype != NL80211_IFTYPE_P2P_GO && in cfg80211_rx_unexpected_4addr_frame()
16644 wdev->iftype != NL80211_IFTYPE_AP_VLAN)) { in cfg80211_rx_unexpected_4addr_frame()
16661 struct net_device *netdev = wdev->netdev; in nl80211_send_mgmt()
16667 return -ENOMEM; in nl80211_send_mgmt()
16672 return -ENOMEM; in nl80211_send_mgmt()
16675 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_mgmt()
16677 netdev->ifindex)) || in nl80211_send_mgmt()
16691 return genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); in nl80211_send_mgmt()
16695 return -ENOBUFS; in nl80211_send_mgmt()
16702 struct wiphy *wiphy = wdev->wiphy; in nl80211_frame_tx_status()
16704 struct net_device *netdev = wdev->netdev; in nl80211_frame_tx_status()
16723 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_frame_tx_status()
16725 netdev->ifindex)) || in nl80211_frame_tx_status()
16736 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_frame_tx_status()
16765 struct wireless_dev *wdev = dev->ieee80211_ptr; in __nl80211_rx_control_port()
16766 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in __nl80211_rx_control_port()
16768 const u8 *addr = ehdr->h_source; in __nl80211_rx_control_port()
16769 u16 proto = be16_to_cpu(skb->protocol); in __nl80211_rx_control_port()
16774 u32 nlportid = READ_ONCE(wdev->conn_owner_nlportid); in __nl80211_rx_control_port()
16777 return -ENOENT; in __nl80211_rx_control_port()
16779 msg = nlmsg_new(100 + skb->len, gfp); in __nl80211_rx_control_port()
16781 return -ENOMEM; in __nl80211_rx_control_port()
16786 return -ENOBUFS; in __nl80211_rx_control_port()
16789 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in __nl80211_rx_control_port()
16790 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in __nl80211_rx_control_port()
16799 frame = nla_reserve(msg, NL80211_ATTR_FRAME, skb->len); in __nl80211_rx_control_port()
16803 skb_copy_bits(skb, 0, nla_data(frame), skb->len); in __nl80211_rx_control_port()
16806 return genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); in __nl80211_rx_control_port()
16810 return -ENOBUFS; in __nl80211_rx_control_port()
16828 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_prepare_cqm()
16829 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_prepare_cqm()
16836 cb = (void **)msg->cb; in cfg80211_prepare_cqm()
16844 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_prepare_cqm()
16845 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) in cfg80211_prepare_cqm()
16865 void **cb = (void **)msg->cb; in cfg80211_send_cqm()
16871 memset(msg->cb, 0, sizeof(msg->cb)); in cfg80211_send_cqm()
16873 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_send_cqm()
16882 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_cqm_rssi_notify()
16883 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_cqm_rssi_notify()
16891 if (wdev->cqm_config) { in cfg80211_cqm_rssi_notify()
16892 wdev->cqm_config->last_rssi_event_value = rssi_level; in cfg80211_cqm_rssi_notify()
16897 rssi_level = wdev->cqm_config->last_rssi_event_value; in cfg80211_cqm_rssi_notify()
17007 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_gtk_rekey_notify()
17008 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_gtk_rekey_notify()
17024 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_gtk_rekey_notify()
17035 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_gtk_rekey_notify()
17036 struct wiphy *wiphy = wdev->wiphy; in cfg80211_gtk_rekey_notify()
17063 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_pmksa_candidate_notify()
17064 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex)) in nl80211_pmksa_candidate_notify()
17081 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_pmksa_candidate_notify()
17092 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_pmksa_candidate_notify()
17093 struct wiphy *wiphy = wdev->wiphy; in cfg80211_pmksa_candidate_notify()
17121 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex)) in nl80211_ch_switch_notify()
17133 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_ch_switch_notify()
17144 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_ch_switch_notify()
17145 struct wiphy *wiphy = wdev->wiphy; in cfg80211_ch_switch_notify()
17152 wdev->chandef = *chandef; in cfg80211_ch_switch_notify()
17153 wdev->preset_chandef = *chandef; in cfg80211_ch_switch_notify()
17155 if ((wdev->iftype == NL80211_IFTYPE_STATION || in cfg80211_ch_switch_notify()
17156 wdev->iftype == NL80211_IFTYPE_P2P_CLIENT) && in cfg80211_ch_switch_notify()
17157 !WARN_ON(!wdev->current_bss)) in cfg80211_ch_switch_notify()
17158 cfg80211_update_assoc_bss_entry(wdev, chandef->chan); in cfg80211_ch_switch_notify()
17171 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_ch_switch_started_notify()
17172 struct wiphy *wiphy = wdev->wiphy; in cfg80211_ch_switch_started_notify()
17201 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx)) in nl80211_radar_notify()
17206 struct wireless_dev *wdev = netdev->ieee80211_ptr; in nl80211_radar_notify()
17208 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in nl80211_radar_notify()
17222 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in nl80211_radar_notify()
17235 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_sta_opmode_change_notify()
17236 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_sta_opmode_change_notify()
17252 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx)) in cfg80211_sta_opmode_change_notify()
17255 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) in cfg80211_sta_opmode_change_notify()
17261 if ((sta_opmode->changed & STA_OPMODE_SMPS_MODE_CHANGED) && in cfg80211_sta_opmode_change_notify()
17262 nla_put_u8(msg, NL80211_ATTR_SMPS_MODE, sta_opmode->smps_mode)) in cfg80211_sta_opmode_change_notify()
17265 if ((sta_opmode->changed & STA_OPMODE_MAX_BW_CHANGED) && in cfg80211_sta_opmode_change_notify()
17266 nla_put_u32(msg, NL80211_ATTR_CHANNEL_WIDTH, sta_opmode->bw)) in cfg80211_sta_opmode_change_notify()
17269 if ((sta_opmode->changed & STA_OPMODE_N_SS_CHANGED) && in cfg80211_sta_opmode_change_notify()
17270 nla_put_u8(msg, NL80211_ATTR_NSS, sta_opmode->rx_nss)) in cfg80211_sta_opmode_change_notify()
17275 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_sta_opmode_change_notify()
17289 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_probe_status()
17290 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_probe_status()
17307 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_probe_status()
17308 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in cfg80211_probe_status()
17319 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_probe_status()
17338 spin_lock_bh(&rdev->beacon_registrations_lock); in cfg80211_report_obss_beacon_khz()
17339 list_for_each_entry(reg, &rdev->beacon_registrations, list) { in cfg80211_report_obss_beacon_khz()
17342 spin_unlock_bh(&rdev->beacon_registrations_lock); in cfg80211_report_obss_beacon_khz()
17350 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_report_obss_beacon_khz()
17363 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, reg->nlportid); in cfg80211_report_obss_beacon_khz()
17365 spin_unlock_bh(&rdev->beacon_registrations_lock); in cfg80211_report_obss_beacon_khz()
17369 spin_unlock_bh(&rdev->beacon_registrations_lock); in cfg80211_report_obss_beacon_khz()
17378 struct cfg80211_wowlan_nd_info *nd = wakeup->net_detect; in cfg80211_net_detect_results()
17385 return -EMSGSIZE; in cfg80211_net_detect_results()
17387 for (i = 0; i < nd->n_matches; i++) { in cfg80211_net_detect_results()
17388 struct cfg80211_wowlan_nd_match *match = nd->matches[i]; in cfg80211_net_detect_results()
17401 if (nla_put(msg, NL80211_ATTR_SSID, match->ssid.ssid_len, in cfg80211_net_detect_results()
17402 match->ssid.ssid)) { in cfg80211_net_detect_results()
17407 if (match->n_channels) { in cfg80211_net_detect_results()
17415 for (j = 0; j < match->n_channels; j++) { in cfg80211_net_detect_results()
17416 if (nla_put_u32(msg, j, match->channels[j])) { in cfg80211_net_detect_results()
17438 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_report_wowlan_wakeup()
17443 trace_cfg80211_report_wowlan_wakeup(wdev->wiphy, wdev, wakeup); in cfg80211_report_wowlan_wakeup()
17446 size += wakeup->packet_present_len; in cfg80211_report_wowlan_wakeup()
17456 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_report_wowlan_wakeup()
17461 if (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, in cfg80211_report_wowlan_wakeup()
17462 wdev->netdev->ifindex)) in cfg80211_report_wowlan_wakeup()
17473 if (wakeup->disconnect && in cfg80211_report_wowlan_wakeup()
17476 if (wakeup->magic_pkt && in cfg80211_report_wowlan_wakeup()
17479 if (wakeup->gtk_rekey_failure && in cfg80211_report_wowlan_wakeup()
17482 if (wakeup->eap_identity_req && in cfg80211_report_wowlan_wakeup()
17485 if (wakeup->four_way_handshake && in cfg80211_report_wowlan_wakeup()
17488 if (wakeup->rfkill_release && in cfg80211_report_wowlan_wakeup()
17492 if (wakeup->pattern_idx >= 0 && in cfg80211_report_wowlan_wakeup()
17494 wakeup->pattern_idx)) in cfg80211_report_wowlan_wakeup()
17497 if (wakeup->tcp_match && in cfg80211_report_wowlan_wakeup()
17501 if (wakeup->tcp_connlost && in cfg80211_report_wowlan_wakeup()
17505 if (wakeup->tcp_nomoretokens && in cfg80211_report_wowlan_wakeup()
17510 if (wakeup->packet) { in cfg80211_report_wowlan_wakeup()
17514 if (!wakeup->packet_80211) { in cfg80211_report_wowlan_wakeup()
17521 if (wakeup->packet_len && in cfg80211_report_wowlan_wakeup()
17522 nla_put_u32(msg, len_attr, wakeup->packet_len)) in cfg80211_report_wowlan_wakeup()
17525 if (nla_put(msg, pkt_attr, wakeup->packet_present_len, in cfg80211_report_wowlan_wakeup()
17526 wakeup->packet)) in cfg80211_report_wowlan_wakeup()
17530 if (wakeup->net_detect && in cfg80211_report_wowlan_wakeup()
17539 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_report_wowlan_wakeup()
17553 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_tdls_oper_request()
17554 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_tdls_oper_request()
17558 trace_cfg80211_tdls_oper_request(wdev->wiphy, dev, peer, oper, in cfg80211_tdls_oper_request()
17571 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_tdls_oper_request()
17572 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in cfg80211_tdls_oper_request()
17581 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_tdls_oper_request()
17599 if (state != NETLINK_URELEASE || notify->protocol != NETLINK_GENERIC) in nl80211_netlink_notify()
17608 &rdev->sched_scan_req_list, in nl80211_netlink_notify()
17610 if (sched_scan_req->owner_nlportid == notify->portid) { in nl80211_netlink_notify()
17611 sched_scan_req->nl_owner_dead = true; in nl80211_netlink_notify()
17612 schedule_work(&rdev->sched_scan_stop_wk); in nl80211_netlink_notify()
17616 list_for_each_entry_rcu(wdev, &rdev->wiphy.wdev_list, list) { in nl80211_netlink_notify()
17617 cfg80211_mlme_unregister_socket(wdev, notify->portid); in nl80211_netlink_notify()
17619 if (wdev->owner_nlportid == notify->portid) { in nl80211_netlink_notify()
17620 wdev->nl_owner_dead = true; in nl80211_netlink_notify()
17621 schedule_work(&rdev->destroy_work); in nl80211_netlink_notify()
17622 } else if (wdev->conn_owner_nlportid == notify->portid) { in nl80211_netlink_notify()
17623 schedule_work(&wdev->disconnect_wk); in nl80211_netlink_notify()
17626 cfg80211_release_pmsr(wdev, notify->portid); in nl80211_netlink_notify()
17629 spin_lock_bh(&rdev->beacon_registrations_lock); in nl80211_netlink_notify()
17630 list_for_each_entry_safe(reg, tmp, &rdev->beacon_registrations, in nl80211_netlink_notify()
17632 if (reg->nlportid == notify->portid) { in nl80211_netlink_notify()
17633 list_del(®->list); in nl80211_netlink_notify()
17638 spin_unlock_bh(&rdev->beacon_registrations_lock); in nl80211_netlink_notify()
17647 regulatory_netlink_notify(notify->portid); in nl80211_netlink_notify()
17658 struct wiphy *wiphy = netdev->ieee80211_ptr->wiphy; in cfg80211_ft_event()
17665 if (!ft_event->target_ap) in cfg80211_ft_event()
17668 msg = nlmsg_new(100 + ft_event->ies_len + ft_event->ric_ies_len, in cfg80211_ft_event()
17677 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_ft_event()
17678 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in cfg80211_ft_event()
17679 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, ft_event->target_ap)) in cfg80211_ft_event()
17682 if (ft_event->ies && in cfg80211_ft_event()
17683 nla_put(msg, NL80211_ATTR_IE, ft_event->ies_len, ft_event->ies)) in cfg80211_ft_event()
17685 if (ft_event->ric_ies && in cfg80211_ft_event()
17686 nla_put(msg, NL80211_ATTR_IE_RIC, ft_event->ric_ies_len, in cfg80211_ft_event()
17687 ft_event->ric_ies)) in cfg80211_ft_event()
17692 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_ft_event()
17707 rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_crit_proto_stopped()
17708 if (!rdev->crit_proto_nlportid) in cfg80211_crit_proto_stopped()
17711 nlportid = rdev->crit_proto_nlportid; in cfg80211_crit_proto_stopped()
17712 rdev->crit_proto_nlportid = 0; in cfg80211_crit_proto_stopped()
17722 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_crit_proto_stopped()
17729 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); in cfg80211_crit_proto_stopped()
17739 struct wiphy *wiphy = wdev->wiphy; in nl80211_send_ap_stopped()
17752 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in nl80211_send_ap_stopped()
17753 nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex) || in nl80211_send_ap_stopped()
17771 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_external_auth_request()
17772 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_external_auth_request()
17776 if (!wdev->conn_owner_nlportid) in cfg80211_external_auth_request()
17777 return -EINVAL; in cfg80211_external_auth_request()
17781 return -ENOMEM; in cfg80211_external_auth_request()
17787 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_external_auth_request()
17788 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || in cfg80211_external_auth_request()
17789 nla_put_u32(msg, NL80211_ATTR_AKM_SUITES, params->key_mgmt_suite) || in cfg80211_external_auth_request()
17791 params->action) || in cfg80211_external_auth_request()
17792 nla_put(msg, NL80211_ATTR_BSSID, ETH_ALEN, params->bssid) || in cfg80211_external_auth_request()
17793 nla_put(msg, NL80211_ATTR_SSID, params->ssid.ssid_len, in cfg80211_external_auth_request()
17794 params->ssid.ssid)) in cfg80211_external_auth_request()
17798 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, in cfg80211_external_auth_request()
17799 wdev->conn_owner_nlportid); in cfg80211_external_auth_request()
17804 return -ENOBUFS; in cfg80211_external_auth_request()
17812 struct wiphy *wiphy = netdev->ieee80211_ptr->wiphy; in cfg80211_update_owe_info_event()
17827 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || in cfg80211_update_owe_info_event()
17828 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || in cfg80211_update_owe_info_event()
17829 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, owe_info->peer)) in cfg80211_update_owe_info_event()
17832 if (!owe_info->ie_len || in cfg80211_update_owe_info_event()
17833 nla_put(msg, NL80211_ATTR_IE, owe_info->ie_len, owe_info->ie)) in cfg80211_update_owe_info_event()
17838 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, in cfg80211_update_owe_info_event()