1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * This is the new netlink-based wireless configuration interface. 4 * 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-2026 Intel Corporation 9 */ 10 11 #include <linux/if.h> 12 #include <linux/module.h> 13 #include <linux/err.h> 14 #include <linux/slab.h> 15 #include <linux/list.h> 16 #include <linux/if_ether.h> 17 #include <linux/ieee80211.h> 18 #include <linux/nl80211.h> 19 #include <linux/rtnetlink.h> 20 #include <linux/netlink.h> 21 #include <linux/nospec.h> 22 #include <linux/etherdevice.h> 23 #include <linux/if_vlan.h> 24 #include <linux/random.h> 25 #include <net/net_namespace.h> 26 #include <net/genetlink.h> 27 #include <net/cfg80211.h> 28 #include <net/sock.h> 29 #include <net/inet_connection_sock.h> 30 #include "core.h" 31 #include "nl80211.h" 32 #include "reg.h" 33 #include "rdev-ops.h" 34 35 static int nl80211_crypto_settings(struct cfg80211_registered_device *rdev, 36 struct genl_info *info, 37 struct cfg80211_crypto_settings *settings, 38 int cipher_limit); 39 40 /* the netlink family */ 41 static struct genl_family nl80211_fam; 42 43 /* multicast groups */ 44 enum nl80211_multicast_groups { 45 NL80211_MCGRP_CONFIG, 46 NL80211_MCGRP_SCAN, 47 NL80211_MCGRP_REGULATORY, 48 NL80211_MCGRP_MLME, 49 NL80211_MCGRP_VENDOR, 50 NL80211_MCGRP_NAN, 51 NL80211_MCGRP_TESTMODE /* keep last - ifdef! */ 52 }; 53 54 static const struct genl_multicast_group nl80211_mcgrps[] = { 55 [NL80211_MCGRP_CONFIG] = { .name = NL80211_MULTICAST_GROUP_CONFIG }, 56 [NL80211_MCGRP_SCAN] = { .name = NL80211_MULTICAST_GROUP_SCAN }, 57 [NL80211_MCGRP_REGULATORY] = { .name = NL80211_MULTICAST_GROUP_REG }, 58 [NL80211_MCGRP_MLME] = { .name = NL80211_MULTICAST_GROUP_MLME }, 59 [NL80211_MCGRP_VENDOR] = { .name = NL80211_MULTICAST_GROUP_VENDOR }, 60 [NL80211_MCGRP_NAN] = { .name = NL80211_MULTICAST_GROUP_NAN }, 61 #ifdef CONFIG_NL80211_TESTMODE 62 [NL80211_MCGRP_TESTMODE] = { .name = NL80211_MULTICAST_GROUP_TESTMODE } 63 #endif 64 }; 65 66 /* returns ERR_PTR values */ 67 static struct wireless_dev * 68 __cfg80211_wdev_from_attrs(struct cfg80211_registered_device *rdev, 69 struct net *netns, struct nlattr **attrs) 70 { 71 struct wireless_dev *result = NULL; 72 bool have_ifidx = attrs[NL80211_ATTR_IFINDEX]; 73 bool have_wdev_id = attrs[NL80211_ATTR_WDEV]; 74 u64 wdev_id = 0; 75 int wiphy_idx = -1; 76 int ifidx = -1; 77 78 if (!have_ifidx && !have_wdev_id) 79 return ERR_PTR(-EINVAL); 80 81 if (have_ifidx) 82 ifidx = nla_get_u32(attrs[NL80211_ATTR_IFINDEX]); 83 if (have_wdev_id) { 84 wdev_id = nla_get_u64(attrs[NL80211_ATTR_WDEV]); 85 wiphy_idx = wdev_id >> 32; 86 } 87 88 if (rdev) { 89 struct wireless_dev *wdev; 90 91 lockdep_assert_held(&rdev->wiphy.mtx); 92 93 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) { 94 if (have_ifidx && wdev->netdev && 95 wdev->netdev->ifindex == ifidx) { 96 result = wdev; 97 break; 98 } 99 if (have_wdev_id && wdev->identifier == (u32)wdev_id) { 100 result = wdev; 101 break; 102 } 103 } 104 105 return result ?: ERR_PTR(-ENODEV); 106 } 107 108 ASSERT_RTNL(); 109 110 for_each_rdev(rdev) { 111 struct wireless_dev *wdev; 112 113 if (wiphy_net(&rdev->wiphy) != netns) 114 continue; 115 116 if (have_wdev_id && rdev->wiphy_idx != wiphy_idx) 117 continue; 118 119 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) { 120 if (have_ifidx && wdev->netdev && 121 wdev->netdev->ifindex == ifidx) { 122 result = wdev; 123 break; 124 } 125 if (have_wdev_id && wdev->identifier == (u32)wdev_id) { 126 result = wdev; 127 break; 128 } 129 } 130 131 if (result) 132 break; 133 } 134 135 if (result) 136 return result; 137 return ERR_PTR(-ENODEV); 138 } 139 140 static struct cfg80211_registered_device * 141 __cfg80211_rdev_from_attrs(struct net *netns, struct nlattr **attrs) 142 { 143 struct cfg80211_registered_device *rdev = NULL, *tmp; 144 struct net_device *netdev; 145 146 ASSERT_RTNL(); 147 148 if (!attrs[NL80211_ATTR_WIPHY] && 149 !attrs[NL80211_ATTR_IFINDEX] && 150 !attrs[NL80211_ATTR_WDEV]) 151 return ERR_PTR(-EINVAL); 152 153 if (attrs[NL80211_ATTR_WIPHY]) 154 rdev = cfg80211_rdev_by_wiphy_idx( 155 nla_get_u32(attrs[NL80211_ATTR_WIPHY])); 156 157 if (attrs[NL80211_ATTR_WDEV]) { 158 u64 wdev_id = nla_get_u64(attrs[NL80211_ATTR_WDEV]); 159 struct wireless_dev *wdev; 160 bool found = false; 161 162 tmp = cfg80211_rdev_by_wiphy_idx(wdev_id >> 32); 163 if (tmp) { 164 /* make sure wdev exists */ 165 list_for_each_entry(wdev, &tmp->wiphy.wdev_list, list) { 166 if (wdev->identifier != (u32)wdev_id) 167 continue; 168 found = true; 169 break; 170 } 171 172 if (!found) 173 tmp = NULL; 174 175 if (rdev && tmp != rdev) 176 return ERR_PTR(-EINVAL); 177 rdev = tmp; 178 } 179 } 180 181 if (attrs[NL80211_ATTR_IFINDEX]) { 182 int ifindex = nla_get_u32(attrs[NL80211_ATTR_IFINDEX]); 183 184 netdev = __dev_get_by_index(netns, ifindex); 185 if (netdev) { 186 if (netdev->ieee80211_ptr) 187 tmp = wiphy_to_rdev( 188 netdev->ieee80211_ptr->wiphy); 189 else 190 tmp = NULL; 191 192 /* not wireless device -- return error */ 193 if (!tmp) 194 return ERR_PTR(-EINVAL); 195 196 /* mismatch -- return error */ 197 if (rdev && tmp != rdev) 198 return ERR_PTR(-EINVAL); 199 200 rdev = tmp; 201 } 202 } 203 204 if (!rdev) 205 return ERR_PTR(-ENODEV); 206 207 if (netns != wiphy_net(&rdev->wiphy)) 208 return ERR_PTR(-ENODEV); 209 210 return rdev; 211 } 212 213 /* 214 * This function returns a pointer to the driver 215 * that the genl_info item that is passed refers to. 216 * 217 * The result of this can be a PTR_ERR and hence must 218 * be checked with IS_ERR() for errors. 219 */ 220 static struct cfg80211_registered_device * 221 cfg80211_get_dev_from_info(struct net *netns, struct genl_info *info) 222 { 223 return __cfg80211_rdev_from_attrs(netns, info->attrs); 224 } 225 226 static int validate_beacon_head(const struct nlattr *attr, 227 struct netlink_ext_ack *extack) 228 { 229 const u8 *data = nla_data(attr); 230 unsigned int len = nla_len(attr); 231 const struct element *elem; 232 const struct ieee80211_mgmt *mgmt = (void *)data; 233 const struct ieee80211_ext *ext; 234 unsigned int fixedlen, hdrlen; 235 bool s1g_bcn; 236 237 if (len < offsetofend(typeof(*mgmt), frame_control)) 238 goto err; 239 240 s1g_bcn = ieee80211_is_s1g_beacon(mgmt->frame_control); 241 if (s1g_bcn) { 242 ext = (struct ieee80211_ext *)mgmt; 243 fixedlen = 244 offsetof(struct ieee80211_ext, u.s1g_beacon.variable) + 245 ieee80211_s1g_optional_len(ext->frame_control); 246 hdrlen = offsetof(struct ieee80211_ext, u.s1g_beacon); 247 } else { 248 fixedlen = offsetof(struct ieee80211_mgmt, 249 u.beacon.variable); 250 hdrlen = offsetof(struct ieee80211_mgmt, u.beacon); 251 } 252 253 if (len < fixedlen) 254 goto err; 255 256 if (ieee80211_hdrlen(mgmt->frame_control) != hdrlen) 257 goto err; 258 259 data += fixedlen; 260 len -= fixedlen; 261 262 for_each_element(elem, data, len) { 263 /* nothing */ 264 } 265 266 if (for_each_element_completed(elem, data, len)) 267 return 0; 268 269 err: 270 NL_SET_ERR_MSG_ATTR(extack, attr, "malformed beacon head"); 271 return -EINVAL; 272 } 273 274 static int validate_ie_attr(const struct nlattr *attr, 275 struct netlink_ext_ack *extack) 276 { 277 const u8 *data = nla_data(attr); 278 unsigned int len = nla_len(attr); 279 const struct element *elem; 280 281 for_each_element(elem, data, len) { 282 /* nothing */ 283 } 284 285 if (for_each_element_completed(elem, data, len)) 286 return 0; 287 288 NL_SET_ERR_MSG_ATTR(extack, attr, "malformed information elements"); 289 return -EINVAL; 290 } 291 292 static int validate_he_capa(const struct nlattr *attr, 293 struct netlink_ext_ack *extack) 294 { 295 if (!ieee80211_he_capa_size_ok(nla_data(attr), nla_len(attr))) 296 return -EINVAL; 297 298 return 0; 299 } 300 301 static int validate_supported_selectors(const struct nlattr *attr, 302 struct netlink_ext_ack *extack) 303 { 304 const u8 *supported_selectors = nla_data(attr); 305 u8 supported_selectors_len = nla_len(attr); 306 307 /* The top bit must not be set as it is not part of the selector */ 308 for (int i = 0; i < supported_selectors_len; i++) { 309 if (supported_selectors[i] & 0x80) 310 return -EINVAL; 311 } 312 313 return 0; 314 } 315 316 static int validate_nan_cluster_id(const struct nlattr *attr, 317 struct netlink_ext_ack *extack) 318 { 319 const u8 *data = nla_data(attr); 320 unsigned int len = nla_len(attr); 321 static const u8 cluster_id_prefix[4] = {0x50, 0x6f, 0x9a, 0x1}; 322 323 if (len != ETH_ALEN) { 324 NL_SET_ERR_MSG_ATTR(extack, attr, "bad cluster id length"); 325 return -EINVAL; 326 } 327 328 if (memcmp(data, cluster_id_prefix, sizeof(cluster_id_prefix))) { 329 NL_SET_ERR_MSG_ATTR(extack, attr, "invalid cluster id prefix"); 330 return -EINVAL; 331 } 332 333 return 0; 334 } 335 336 static int validate_uhr_capa(const struct nlattr *attr, 337 struct netlink_ext_ack *extack) 338 { 339 const u8 *data = nla_data(attr); 340 unsigned int len = nla_len(attr); 341 342 return ieee80211_uhr_capa_size_ok(data, len, false); 343 } 344 345 /* policy for the attributes */ 346 static const struct nla_policy nl80211_policy[NUM_NL80211_ATTR]; 347 348 static const struct nla_policy 349 nl80211_ftm_responder_policy[NL80211_FTM_RESP_ATTR_MAX + 1] = { 350 [NL80211_FTM_RESP_ATTR_ENABLED] = { .type = NLA_FLAG, }, 351 [NL80211_FTM_RESP_ATTR_LCI] = { .type = NLA_BINARY, 352 .len = U8_MAX }, 353 [NL80211_FTM_RESP_ATTR_CIVICLOC] = { .type = NLA_BINARY, 354 .len = U8_MAX }, 355 }; 356 357 static const struct nla_policy 358 nl80211_pmsr_ftm_req_attr_policy[NL80211_PMSR_FTM_REQ_ATTR_MAX + 1] = { 359 [NL80211_PMSR_FTM_REQ_ATTR_ASAP] = { .type = NLA_FLAG }, 360 [NL80211_PMSR_FTM_REQ_ATTR_PREAMBLE] = { .type = NLA_U32 }, 361 [NL80211_PMSR_FTM_REQ_ATTR_NUM_BURSTS_EXP] = 362 NLA_POLICY_MAX(NLA_U8, 15), 363 [NL80211_PMSR_FTM_REQ_ATTR_BURST_PERIOD] = { .type = NLA_U16 }, 364 [NL80211_PMSR_FTM_REQ_ATTR_BURST_DURATION] = 365 NLA_POLICY_MAX(NLA_U8, 15), 366 [NL80211_PMSR_FTM_REQ_ATTR_FTMS_PER_BURST] = { .type = NLA_U8 }, 367 [NL80211_PMSR_FTM_REQ_ATTR_NUM_FTMR_RETRIES] = { .type = NLA_U8 }, 368 [NL80211_PMSR_FTM_REQ_ATTR_REQUEST_LCI] = { .type = NLA_FLAG }, 369 [NL80211_PMSR_FTM_REQ_ATTR_REQUEST_CIVICLOC] = { .type = NLA_FLAG }, 370 [NL80211_PMSR_FTM_REQ_ATTR_TRIGGER_BASED] = { .type = NLA_FLAG }, 371 [NL80211_PMSR_FTM_REQ_ATTR_NON_TRIGGER_BASED] = { .type = NLA_FLAG }, 372 [NL80211_PMSR_FTM_REQ_ATTR_LMR_FEEDBACK] = { .type = NLA_FLAG }, 373 [NL80211_PMSR_FTM_REQ_ATTR_BSS_COLOR] = { .type = NLA_U8 }, 374 [NL80211_PMSR_FTM_REQ_ATTR_RSTA] = { .type = NLA_FLAG }, 375 }; 376 377 static const struct nla_policy 378 nl80211_pmsr_req_data_policy[NL80211_PMSR_TYPE_MAX + 1] = { 379 [NL80211_PMSR_TYPE_FTM] = 380 NLA_POLICY_NESTED(nl80211_pmsr_ftm_req_attr_policy), 381 }; 382 383 static const struct nla_policy 384 nl80211_pmsr_req_attr_policy[NL80211_PMSR_REQ_ATTR_MAX + 1] = { 385 [NL80211_PMSR_REQ_ATTR_DATA] = 386 NLA_POLICY_NESTED(nl80211_pmsr_req_data_policy), 387 [NL80211_PMSR_REQ_ATTR_GET_AP_TSF] = { .type = NLA_FLAG }, 388 }; 389 390 static const struct nla_policy 391 nl80211_pmsr_peer_attr_policy[NL80211_PMSR_PEER_ATTR_MAX + 1] = { 392 [NL80211_PMSR_PEER_ATTR_ADDR] = NLA_POLICY_ETH_ADDR, 393 [NL80211_PMSR_PEER_ATTR_CHAN] = NLA_POLICY_NESTED(nl80211_policy), 394 [NL80211_PMSR_PEER_ATTR_REQ] = 395 NLA_POLICY_NESTED(nl80211_pmsr_req_attr_policy), 396 [NL80211_PMSR_PEER_ATTR_RESP] = { .type = NLA_REJECT }, 397 }; 398 399 static const struct nla_policy 400 nl80211_pmsr_attr_policy[NL80211_PMSR_ATTR_MAX + 1] = { 401 [NL80211_PMSR_ATTR_MAX_PEERS] = { .type = NLA_REJECT }, 402 [NL80211_PMSR_ATTR_REPORT_AP_TSF] = { .type = NLA_REJECT }, 403 [NL80211_PMSR_ATTR_RANDOMIZE_MAC_ADDR] = { .type = NLA_REJECT }, 404 [NL80211_PMSR_ATTR_TYPE_CAPA] = { .type = NLA_REJECT }, 405 [NL80211_PMSR_ATTR_PEERS] = 406 NLA_POLICY_NESTED_ARRAY(nl80211_pmsr_peer_attr_policy), 407 }; 408 409 static const struct nla_policy 410 he_obss_pd_policy[NL80211_HE_OBSS_PD_ATTR_MAX + 1] = { 411 [NL80211_HE_OBSS_PD_ATTR_MIN_OFFSET] = 412 NLA_POLICY_RANGE(NLA_U8, 1, 20), 413 [NL80211_HE_OBSS_PD_ATTR_MAX_OFFSET] = 414 NLA_POLICY_RANGE(NLA_U8, 1, 20), 415 [NL80211_HE_OBSS_PD_ATTR_NON_SRG_MAX_OFFSET] = 416 NLA_POLICY_RANGE(NLA_U8, 1, 20), 417 [NL80211_HE_OBSS_PD_ATTR_BSS_COLOR_BITMAP] = 418 NLA_POLICY_EXACT_LEN(8), 419 [NL80211_HE_OBSS_PD_ATTR_PARTIAL_BSSID_BITMAP] = 420 NLA_POLICY_EXACT_LEN(8), 421 [NL80211_HE_OBSS_PD_ATTR_SR_CTRL] = { .type = NLA_U8 }, 422 }; 423 424 static const struct nla_policy 425 he_bss_color_policy[NL80211_HE_BSS_COLOR_ATTR_MAX + 1] = { 426 [NL80211_HE_BSS_COLOR_ATTR_COLOR] = NLA_POLICY_RANGE(NLA_U8, 1, 63), 427 [NL80211_HE_BSS_COLOR_ATTR_DISABLED] = { .type = NLA_FLAG }, 428 [NL80211_HE_BSS_COLOR_ATTR_PARTIAL] = { .type = NLA_FLAG }, 429 }; 430 431 static const struct nla_policy nl80211_txattr_policy[NL80211_TXRATE_MAX + 1] = { 432 [NL80211_TXRATE_LEGACY] = { .type = NLA_BINARY, 433 .len = NL80211_MAX_SUPP_RATES }, 434 [NL80211_TXRATE_HT] = { .type = NLA_BINARY, 435 .len = NL80211_MAX_SUPP_HT_RATES }, 436 [NL80211_TXRATE_VHT] = NLA_POLICY_EXACT_LEN_WARN(sizeof(struct nl80211_txrate_vht)), 437 [NL80211_TXRATE_GI] = { .type = NLA_U8 }, 438 [NL80211_TXRATE_HE] = NLA_POLICY_EXACT_LEN(sizeof(struct nl80211_txrate_he)), 439 [NL80211_TXRATE_HE_GI] = NLA_POLICY_RANGE(NLA_U8, 440 NL80211_RATE_INFO_HE_GI_0_8, 441 NL80211_RATE_INFO_HE_GI_3_2), 442 [NL80211_TXRATE_HE_LTF] = NLA_POLICY_RANGE(NLA_U8, 443 NL80211_RATE_INFO_HE_1XLTF, 444 NL80211_RATE_INFO_HE_4XLTF), 445 [NL80211_TXRATE_EHT] = NLA_POLICY_EXACT_LEN(sizeof(struct nl80211_txrate_eht)), 446 [NL80211_TXRATE_EHT_GI] = NLA_POLICY_RANGE(NLA_U8, 447 NL80211_RATE_INFO_EHT_GI_0_8, 448 NL80211_RATE_INFO_EHT_GI_3_2), 449 [NL80211_TXRATE_EHT_LTF] = NLA_POLICY_RANGE(NLA_U8, 450 NL80211_RATE_INFO_EHT_1XLTF, 451 NL80211_RATE_INFO_EHT_8XLTF), 452 453 }; 454 455 static const struct nla_policy 456 nl80211_tid_config_attr_policy[NL80211_TID_CONFIG_ATTR_MAX + 1] = { 457 [NL80211_TID_CONFIG_ATTR_VIF_SUPP] = { .type = NLA_U64 }, 458 [NL80211_TID_CONFIG_ATTR_PEER_SUPP] = { .type = NLA_U64 }, 459 [NL80211_TID_CONFIG_ATTR_OVERRIDE] = { .type = NLA_FLAG }, 460 [NL80211_TID_CONFIG_ATTR_TIDS] = NLA_POLICY_RANGE(NLA_U16, 1, 0xff), 461 [NL80211_TID_CONFIG_ATTR_NOACK] = 462 NLA_POLICY_MAX(NLA_U8, NL80211_TID_CONFIG_DISABLE), 463 [NL80211_TID_CONFIG_ATTR_RETRY_SHORT] = NLA_POLICY_MIN(NLA_U8, 1), 464 [NL80211_TID_CONFIG_ATTR_RETRY_LONG] = NLA_POLICY_MIN(NLA_U8, 1), 465 [NL80211_TID_CONFIG_ATTR_AMPDU_CTRL] = 466 NLA_POLICY_MAX(NLA_U8, NL80211_TID_CONFIG_DISABLE), 467 [NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL] = 468 NLA_POLICY_MAX(NLA_U8, NL80211_TID_CONFIG_DISABLE), 469 [NL80211_TID_CONFIG_ATTR_AMSDU_CTRL] = 470 NLA_POLICY_MAX(NLA_U8, NL80211_TID_CONFIG_DISABLE), 471 [NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE] = 472 NLA_POLICY_MAX(NLA_U8, NL80211_TX_RATE_FIXED), 473 [NL80211_TID_CONFIG_ATTR_TX_RATE] = 474 NLA_POLICY_NESTED(nl80211_txattr_policy), 475 }; 476 477 static const struct nla_policy 478 nl80211_fils_discovery_policy[NL80211_FILS_DISCOVERY_ATTR_MAX + 1] = { 479 [NL80211_FILS_DISCOVERY_ATTR_INT_MIN] = NLA_POLICY_MAX(NLA_U32, 10000), 480 [NL80211_FILS_DISCOVERY_ATTR_INT_MAX] = NLA_POLICY_MAX(NLA_U32, 10000), 481 [NL80211_FILS_DISCOVERY_ATTR_TMPL] = 482 NLA_POLICY_RANGE(NLA_BINARY, 483 NL80211_FILS_DISCOVERY_TMPL_MIN_LEN, 484 IEEE80211_MAX_DATA_LEN), 485 }; 486 487 static const struct nla_policy 488 nl80211_unsol_bcast_probe_resp_policy[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_MAX + 1] = { 489 [NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_INT] = NLA_POLICY_MAX(NLA_U32, 20), 490 [NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_TMPL] = { .type = NLA_BINARY, 491 .len = IEEE80211_MAX_DATA_LEN } 492 }; 493 494 static const struct nla_policy 495 sar_specs_policy[NL80211_SAR_ATTR_SPECS_MAX + 1] = { 496 [NL80211_SAR_ATTR_SPECS_POWER] = { .type = NLA_S32 }, 497 [NL80211_SAR_ATTR_SPECS_RANGE_INDEX] = {.type = NLA_U32 }, 498 }; 499 500 static const struct nla_policy 501 sar_policy[NL80211_SAR_ATTR_MAX + 1] = { 502 [NL80211_SAR_ATTR_TYPE] = NLA_POLICY_MAX(NLA_U32, NUM_NL80211_SAR_TYPE), 503 [NL80211_SAR_ATTR_SPECS] = NLA_POLICY_NESTED_ARRAY(sar_specs_policy), 504 }; 505 506 static const struct nla_policy 507 nl80211_mbssid_config_policy[NL80211_MBSSID_CONFIG_ATTR_MAX + 1] = { 508 [NL80211_MBSSID_CONFIG_ATTR_MAX_INTERFACES] = NLA_POLICY_MIN(NLA_U8, 2), 509 [NL80211_MBSSID_CONFIG_ATTR_MAX_EMA_PROFILE_PERIODICITY] = 510 NLA_POLICY_MIN(NLA_U8, 1), 511 [NL80211_MBSSID_CONFIG_ATTR_INDEX] = { .type = NLA_U8 }, 512 [NL80211_MBSSID_CONFIG_ATTR_TX_IFINDEX] = { .type = NLA_U32 }, 513 [NL80211_MBSSID_CONFIG_ATTR_EMA] = { .type = NLA_FLAG }, 514 [NL80211_MBSSID_CONFIG_ATTR_TX_LINK_ID] = 515 NLA_POLICY_MAX(NLA_U8, IEEE80211_MLD_MAX_NUM_LINKS), 516 }; 517 518 static const struct nla_policy 519 nl80211_sta_wme_policy[NL80211_STA_WME_MAX + 1] = { 520 [NL80211_STA_WME_UAPSD_QUEUES] = { .type = NLA_U8 }, 521 [NL80211_STA_WME_MAX_SP] = { .type = NLA_U8 }, 522 }; 523 524 static const struct nla_policy 525 nl80211_s1g_short_beacon[NL80211_S1G_SHORT_BEACON_ATTR_MAX + 1] = { 526 [NL80211_S1G_SHORT_BEACON_ATTR_HEAD] = 527 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_beacon_head, 528 IEEE80211_MAX_DATA_LEN), 529 [NL80211_S1G_SHORT_BEACON_ATTR_TAIL] = 530 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_ie_attr, 531 IEEE80211_MAX_DATA_LEN), 532 }; 533 534 static const struct nla_policy 535 nl80211_nan_band_conf_policy[NL80211_NAN_BAND_CONF_ATTR_MAX + 1] = { 536 [NL80211_NAN_BAND_CONF_BAND] = NLA_POLICY_MAX(NLA_U8, 537 NUM_NL80211_BANDS - 1), 538 [NL80211_NAN_BAND_CONF_FREQ] = { .type = NLA_U16 }, 539 [NL80211_NAN_BAND_CONF_RSSI_CLOSE] = NLA_POLICY_MIN(NLA_S8, -59), 540 [NL80211_NAN_BAND_CONF_RSSI_MIDDLE] = NLA_POLICY_MIN(NLA_S8, -74), 541 [NL80211_NAN_BAND_CONF_WAKE_DW] = NLA_POLICY_MAX(NLA_U8, 5), 542 [NL80211_NAN_BAND_CONF_DISABLE_SCAN] = { .type = NLA_FLAG }, 543 }; 544 545 static const struct nla_policy 546 nl80211_nan_conf_policy[NL80211_NAN_CONF_ATTR_MAX + 1] = { 547 [NL80211_NAN_CONF_CLUSTER_ID] = 548 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_nan_cluster_id, 549 ETH_ALEN), 550 [NL80211_NAN_CONF_EXTRA_ATTRS] = { .type = NLA_BINARY, 551 .len = IEEE80211_MAX_DATA_LEN}, 552 [NL80211_NAN_CONF_VENDOR_ELEMS] = 553 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_ie_attr, 554 IEEE80211_MAX_DATA_LEN), 555 [NL80211_NAN_CONF_BAND_CONFIGS] = 556 NLA_POLICY_NESTED_ARRAY(nl80211_nan_band_conf_policy), 557 [NL80211_NAN_CONF_SCAN_PERIOD] = { .type = NLA_U16 }, 558 [NL80211_NAN_CONF_SCAN_DWELL_TIME] = NLA_POLICY_RANGE(NLA_U16, 50, 512), 559 [NL80211_NAN_CONF_DISCOVERY_BEACON_INTERVAL] = 560 NLA_POLICY_RANGE(NLA_U8, 50, 200), 561 [NL80211_NAN_CONF_NOTIFY_DW] = { .type = NLA_FLAG }, 562 }; 563 564 static const struct netlink_range_validation nl80211_punct_bitmap_range = { 565 .min = 0, 566 .max = 0xffff, 567 }; 568 569 static const struct netlink_range_validation q_range = { 570 .max = INT_MAX, 571 }; 572 573 static const struct nla_policy nl80211_policy[NUM_NL80211_ATTR] = { 574 [0] = { .strict_start_type = NL80211_ATTR_HE_OBSS_PD }, 575 [NL80211_ATTR_WIPHY] = { .type = NLA_U32 }, 576 [NL80211_ATTR_WIPHY_NAME] = { .type = NLA_NUL_STRING, 577 .len = 20-1 }, 578 [NL80211_ATTR_WIPHY_TXQ_PARAMS] = { .type = NLA_NESTED }, 579 580 [NL80211_ATTR_WIPHY_FREQ] = { .type = NLA_U32 }, 581 [NL80211_ATTR_WIPHY_CHANNEL_TYPE] = { .type = NLA_U32 }, 582 [NL80211_ATTR_WIPHY_EDMG_CHANNELS] = NLA_POLICY_RANGE(NLA_U8, 583 NL80211_EDMG_CHANNELS_MIN, 584 NL80211_EDMG_CHANNELS_MAX), 585 [NL80211_ATTR_WIPHY_EDMG_BW_CONFIG] = NLA_POLICY_RANGE(NLA_U8, 586 NL80211_EDMG_BW_CONFIG_MIN, 587 NL80211_EDMG_BW_CONFIG_MAX), 588 589 [NL80211_ATTR_CHANNEL_WIDTH] = { .type = NLA_U32 }, 590 [NL80211_ATTR_CENTER_FREQ1] = { .type = NLA_U32 }, 591 [NL80211_ATTR_CENTER_FREQ1_OFFSET] = NLA_POLICY_RANGE(NLA_U32, 0, 999), 592 [NL80211_ATTR_CENTER_FREQ2] = { .type = NLA_U32 }, 593 594 [NL80211_ATTR_WIPHY_RETRY_SHORT] = NLA_POLICY_MIN(NLA_U8, 1), 595 [NL80211_ATTR_WIPHY_RETRY_LONG] = NLA_POLICY_MIN(NLA_U8, 1), 596 [NL80211_ATTR_WIPHY_FRAG_THRESHOLD] = { .type = NLA_U32 }, 597 [NL80211_ATTR_WIPHY_RTS_THRESHOLD] = { .type = NLA_U32 }, 598 [NL80211_ATTR_WIPHY_COVERAGE_CLASS] = { .type = NLA_U8 }, 599 [NL80211_ATTR_WIPHY_DYN_ACK] = { .type = NLA_FLAG }, 600 601 [NL80211_ATTR_IFTYPE] = NLA_POLICY_MAX(NLA_U32, NL80211_IFTYPE_MAX), 602 [NL80211_ATTR_IFINDEX] = { .type = NLA_U32 }, 603 [NL80211_ATTR_IFNAME] = { .type = NLA_NUL_STRING, .len = IFNAMSIZ-1 }, 604 605 [NL80211_ATTR_MAC] = NLA_POLICY_EXACT_LEN_WARN(ETH_ALEN), 606 [NL80211_ATTR_PREV_BSSID] = NLA_POLICY_EXACT_LEN_WARN(ETH_ALEN), 607 608 [NL80211_ATTR_KEY] = { .type = NLA_NESTED, }, 609 [NL80211_ATTR_KEY_DATA] = { .type = NLA_BINARY, 610 .len = WLAN_MAX_KEY_LEN }, 611 [NL80211_ATTR_KEY_IDX] = NLA_POLICY_MAX(NLA_U8, 7), 612 [NL80211_ATTR_KEY_CIPHER] = { .type = NLA_U32 }, 613 [NL80211_ATTR_KEY_DEFAULT] = { .type = NLA_FLAG }, 614 [NL80211_ATTR_KEY_SEQ] = { .type = NLA_BINARY, .len = 16 }, 615 [NL80211_ATTR_KEY_TYPE] = 616 NLA_POLICY_MAX(NLA_U32, NUM_NL80211_KEYTYPES), 617 618 [NL80211_ATTR_BEACON_INTERVAL] = { .type = NLA_U32 }, 619 [NL80211_ATTR_DTIM_PERIOD] = { .type = NLA_U32 }, 620 [NL80211_ATTR_BEACON_HEAD] = 621 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_beacon_head, 622 IEEE80211_MAX_DATA_LEN), 623 [NL80211_ATTR_BEACON_TAIL] = 624 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_ie_attr, 625 IEEE80211_MAX_DATA_LEN), 626 [NL80211_ATTR_STA_AID] = 627 NLA_POLICY_RANGE(NLA_U16, 1, IEEE80211_MAX_AID), 628 [NL80211_ATTR_STA_FLAGS] = { .type = NLA_NESTED }, 629 [NL80211_ATTR_STA_LISTEN_INTERVAL] = { .type = NLA_U16 }, 630 [NL80211_ATTR_STA_SUPPORTED_RATES] = { .type = NLA_BINARY, 631 .len = NL80211_MAX_SUPP_RATES }, 632 [NL80211_ATTR_STA_PLINK_ACTION] = 633 NLA_POLICY_MAX(NLA_U8, NUM_NL80211_PLINK_ACTIONS - 1), 634 [NL80211_ATTR_STA_TX_POWER_SETTING] = 635 NLA_POLICY_RANGE(NLA_U8, 636 NL80211_TX_POWER_AUTOMATIC, 637 NL80211_TX_POWER_FIXED), 638 [NL80211_ATTR_STA_TX_POWER] = { .type = NLA_S16 }, 639 [NL80211_ATTR_STA_VLAN] = { .type = NLA_U32 }, 640 [NL80211_ATTR_MNTR_FLAGS] = { /* NLA_NESTED can't be empty */ }, 641 [NL80211_ATTR_MESH_ID] = { .type = NLA_BINARY, 642 .len = IEEE80211_MAX_MESH_ID_LEN }, 643 [NL80211_ATTR_MPATH_NEXT_HOP] = NLA_POLICY_ETH_ADDR_COMPAT, 644 645 /* allow 3 for NUL-termination, we used to declare this NLA_STRING */ 646 [NL80211_ATTR_REG_ALPHA2] = NLA_POLICY_RANGE(NLA_BINARY, 2, 3), 647 [NL80211_ATTR_REG_RULES] = { .type = NLA_NESTED }, 648 649 [NL80211_ATTR_BSS_CTS_PROT] = { .type = NLA_U8 }, 650 [NL80211_ATTR_BSS_SHORT_PREAMBLE] = { .type = NLA_U8 }, 651 [NL80211_ATTR_BSS_SHORT_SLOT_TIME] = { .type = NLA_U8 }, 652 [NL80211_ATTR_BSS_BASIC_RATES] = { .type = NLA_BINARY, 653 .len = NL80211_MAX_SUPP_RATES }, 654 [NL80211_ATTR_BSS_HT_OPMODE] = { .type = NLA_U16 }, 655 656 [NL80211_ATTR_MESH_CONFIG] = { .type = NLA_NESTED }, 657 [NL80211_ATTR_SUPPORT_MESH_AUTH] = { .type = NLA_FLAG }, 658 659 [NL80211_ATTR_HT_CAPABILITY] = NLA_POLICY_EXACT_LEN_WARN(NL80211_HT_CAPABILITY_LEN), 660 661 [NL80211_ATTR_MGMT_SUBTYPE] = { .type = NLA_U8 }, 662 [NL80211_ATTR_IE] = NLA_POLICY_VALIDATE_FN(NLA_BINARY, 663 validate_ie_attr, 664 IEEE80211_MAX_DATA_LEN), 665 [NL80211_ATTR_SCAN_FREQUENCIES] = { .type = NLA_NESTED }, 666 [NL80211_ATTR_SCAN_SSIDS] = { .type = NLA_NESTED }, 667 668 [NL80211_ATTR_SSID] = { .type = NLA_BINARY, 669 .len = IEEE80211_MAX_SSID_LEN }, 670 [NL80211_ATTR_AUTH_TYPE] = { .type = NLA_U32 }, 671 [NL80211_ATTR_REASON_CODE] = { .type = NLA_U16 }, 672 [NL80211_ATTR_FREQ_FIXED] = { .type = NLA_FLAG }, 673 [NL80211_ATTR_TIMED_OUT] = { .type = NLA_FLAG }, 674 [NL80211_ATTR_USE_MFP] = NLA_POLICY_RANGE(NLA_U32, 675 NL80211_MFP_NO, 676 NL80211_MFP_OPTIONAL), 677 [NL80211_ATTR_STA_FLAGS2] = 678 NLA_POLICY_EXACT_LEN_WARN(sizeof(struct nl80211_sta_flag_update)), 679 [NL80211_ATTR_CONTROL_PORT] = { .type = NLA_FLAG }, 680 [NL80211_ATTR_CONTROL_PORT_ETHERTYPE] = { .type = NLA_U16 }, 681 [NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT] = { .type = NLA_FLAG }, 682 [NL80211_ATTR_CONTROL_PORT_OVER_NL80211] = { .type = NLA_FLAG }, 683 [NL80211_ATTR_PRIVACY] = { .type = NLA_FLAG }, 684 [NL80211_ATTR_STATUS_CODE] = { .type = NLA_U16 }, 685 [NL80211_ATTR_CIPHER_SUITE_GROUP] = { .type = NLA_U32 }, 686 [NL80211_ATTR_WPA_VERSIONS] = 687 NLA_POLICY_RANGE(NLA_U32, 0, 688 NL80211_WPA_VERSION_1 | 689 NL80211_WPA_VERSION_2 | 690 NL80211_WPA_VERSION_3), 691 [NL80211_ATTR_PID] = { .type = NLA_U32 }, 692 [NL80211_ATTR_4ADDR] = { .type = NLA_U8 }, 693 [NL80211_ATTR_PMKID] = NLA_POLICY_EXACT_LEN_WARN(WLAN_PMKID_LEN), 694 [NL80211_ATTR_DURATION] = { .type = NLA_U32 }, 695 [NL80211_ATTR_COOKIE] = { .type = NLA_U64 }, 696 [NL80211_ATTR_TX_RATES] = { .type = NLA_NESTED }, 697 [NL80211_ATTR_FRAME] = { .type = NLA_BINARY, 698 .len = IEEE80211_MAX_DATA_LEN }, 699 [NL80211_ATTR_FRAME_MATCH] = { .type = NLA_BINARY, }, 700 [NL80211_ATTR_PS_STATE] = NLA_POLICY_RANGE(NLA_U32, 701 NL80211_PS_DISABLED, 702 NL80211_PS_ENABLED), 703 [NL80211_ATTR_CQM] = { .type = NLA_NESTED, }, 704 [NL80211_ATTR_LOCAL_STATE_CHANGE] = { .type = NLA_FLAG }, 705 [NL80211_ATTR_AP_ISOLATE] = { .type = NLA_U8 }, 706 [NL80211_ATTR_WIPHY_TX_POWER_SETTING] = { .type = NLA_U32 }, 707 [NL80211_ATTR_WIPHY_TX_POWER_LEVEL] = { .type = NLA_U32 }, 708 [NL80211_ATTR_FRAME_TYPE] = { .type = NLA_U16 }, 709 [NL80211_ATTR_WIPHY_ANTENNA_TX] = { .type = NLA_U32 }, 710 [NL80211_ATTR_WIPHY_ANTENNA_RX] = { .type = NLA_U32 }, 711 [NL80211_ATTR_MCAST_RATE] = { .type = NLA_U32 }, 712 [NL80211_ATTR_OFFCHANNEL_TX_OK] = { .type = NLA_FLAG }, 713 [NL80211_ATTR_KEY_DEFAULT_TYPES] = { .type = NLA_NESTED }, 714 [NL80211_ATTR_WOWLAN_TRIGGERS] = { .type = NLA_NESTED }, 715 [NL80211_ATTR_STA_PLINK_STATE] = 716 NLA_POLICY_MAX(NLA_U8, NUM_NL80211_PLINK_STATES - 1), 717 [NL80211_ATTR_MEASUREMENT_DURATION] = { .type = NLA_U16 }, 718 [NL80211_ATTR_MEASUREMENT_DURATION_MANDATORY] = { .type = NLA_FLAG }, 719 [NL80211_ATTR_MESH_PEER_AID] = 720 NLA_POLICY_RANGE(NLA_U16, 1, IEEE80211_MAX_AID), 721 [NL80211_ATTR_SCHED_SCAN_INTERVAL] = { .type = NLA_U32 }, 722 [NL80211_ATTR_REKEY_DATA] = { .type = NLA_NESTED }, 723 [NL80211_ATTR_SCAN_SUPP_RATES] = { .type = NLA_NESTED }, 724 [NL80211_ATTR_HIDDEN_SSID] = 725 NLA_POLICY_RANGE(NLA_U32, 726 NL80211_HIDDEN_SSID_NOT_IN_USE, 727 NL80211_HIDDEN_SSID_ZERO_CONTENTS), 728 [NL80211_ATTR_IE_PROBE_RESP] = 729 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_ie_attr, 730 IEEE80211_MAX_DATA_LEN), 731 [NL80211_ATTR_IE_ASSOC_RESP] = 732 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_ie_attr, 733 IEEE80211_MAX_DATA_LEN), 734 [NL80211_ATTR_ROAM_SUPPORT] = { .type = NLA_FLAG }, 735 [NL80211_ATTR_STA_WME] = NLA_POLICY_NESTED(nl80211_sta_wme_policy), 736 [NL80211_ATTR_SCHED_SCAN_MATCH] = { .type = NLA_NESTED }, 737 [NL80211_ATTR_TX_NO_CCK_RATE] = { .type = NLA_FLAG }, 738 [NL80211_ATTR_TDLS_ACTION] = { .type = NLA_U8 }, 739 [NL80211_ATTR_TDLS_DIALOG_TOKEN] = { .type = NLA_U8 }, 740 [NL80211_ATTR_TDLS_OPERATION] = { .type = NLA_U8 }, 741 [NL80211_ATTR_TDLS_SUPPORT] = { .type = NLA_FLAG }, 742 [NL80211_ATTR_TDLS_EXTERNAL_SETUP] = { .type = NLA_FLAG }, 743 [NL80211_ATTR_TDLS_INITIATOR] = { .type = NLA_FLAG }, 744 [NL80211_ATTR_DONT_WAIT_FOR_ACK] = { .type = NLA_FLAG }, 745 [NL80211_ATTR_PROBE_RESP] = { .type = NLA_BINARY, 746 .len = IEEE80211_MAX_DATA_LEN }, 747 [NL80211_ATTR_DFS_REGION] = { .type = NLA_U8 }, 748 [NL80211_ATTR_DISABLE_HT] = { .type = NLA_FLAG }, 749 [NL80211_ATTR_HT_CAPABILITY_MASK] = { 750 .len = NL80211_HT_CAPABILITY_LEN 751 }, 752 [NL80211_ATTR_NOACK_MAP] = { .type = NLA_U16 }, 753 [NL80211_ATTR_INACTIVITY_TIMEOUT] = { .type = NLA_U16 }, 754 [NL80211_ATTR_BG_SCAN_PERIOD] = { .type = NLA_U16 }, 755 [NL80211_ATTR_WDEV] = { .type = NLA_U64 }, 756 [NL80211_ATTR_USER_REG_HINT_TYPE] = { .type = NLA_U32 }, 757 758 /* need to include at least Auth Transaction and Status Code */ 759 [NL80211_ATTR_AUTH_DATA] = NLA_POLICY_MIN_LEN(4), 760 761 [NL80211_ATTR_VHT_CAPABILITY] = NLA_POLICY_EXACT_LEN_WARN(NL80211_VHT_CAPABILITY_LEN), 762 [NL80211_ATTR_SCAN_FLAGS] = { .type = NLA_U32 }, 763 [NL80211_ATTR_P2P_CTWINDOW] = NLA_POLICY_MAX(NLA_U8, 127), 764 [NL80211_ATTR_P2P_OPPPS] = NLA_POLICY_MAX(NLA_U8, 1), 765 [NL80211_ATTR_LOCAL_MESH_POWER_MODE] = 766 NLA_POLICY_RANGE(NLA_U32, 767 NL80211_MESH_POWER_UNKNOWN + 1, 768 NL80211_MESH_POWER_MAX), 769 [NL80211_ATTR_ACL_POLICY] = {. type = NLA_U32 }, 770 [NL80211_ATTR_MAC_ADDRS] = { .type = NLA_NESTED }, 771 [NL80211_ATTR_STA_CAPABILITY] = { .type = NLA_U16 }, 772 [NL80211_ATTR_STA_EXT_CAPABILITY] = { .type = NLA_BINARY, }, 773 [NL80211_ATTR_SPLIT_WIPHY_DUMP] = { .type = NLA_FLAG, }, 774 [NL80211_ATTR_DISABLE_VHT] = { .type = NLA_FLAG }, 775 [NL80211_ATTR_VHT_CAPABILITY_MASK] = { 776 .len = NL80211_VHT_CAPABILITY_LEN, 777 }, 778 [NL80211_ATTR_MDID] = { .type = NLA_U16 }, 779 [NL80211_ATTR_IE_RIC] = { .type = NLA_BINARY, 780 .len = IEEE80211_MAX_DATA_LEN }, 781 [NL80211_ATTR_CRIT_PROT_ID] = { .type = NLA_U16 }, 782 [NL80211_ATTR_MAX_CRIT_PROT_DURATION] = 783 NLA_POLICY_MAX(NLA_U16, NL80211_CRIT_PROTO_MAX_DURATION), 784 [NL80211_ATTR_PEER_AID] = 785 NLA_POLICY_RANGE(NLA_U16, 1, IEEE80211_MAX_AID), 786 [NL80211_ATTR_CH_SWITCH_COUNT] = { .type = NLA_U32 }, 787 [NL80211_ATTR_CH_SWITCH_BLOCK_TX] = { .type = NLA_FLAG }, 788 [NL80211_ATTR_CSA_IES] = { .type = NLA_NESTED }, 789 [NL80211_ATTR_CNTDWN_OFFS_BEACON] = { .type = NLA_BINARY }, 790 [NL80211_ATTR_CNTDWN_OFFS_PRESP] = { .type = NLA_BINARY }, 791 [NL80211_ATTR_STA_SUPPORTED_CHANNELS] = NLA_POLICY_MIN_LEN(2), 792 /* 793 * The value of the Length field of the Supported Operating 794 * Classes element is between 2 and 253. 795 */ 796 [NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES] = 797 NLA_POLICY_RANGE(NLA_BINARY, 2, 253), 798 [NL80211_ATTR_HANDLE_DFS] = { .type = NLA_FLAG }, 799 [NL80211_ATTR_OPMODE_NOTIF] = { .type = NLA_U8 }, 800 [NL80211_ATTR_VENDOR_ID] = { .type = NLA_U32 }, 801 [NL80211_ATTR_VENDOR_SUBCMD] = { .type = NLA_U32 }, 802 [NL80211_ATTR_VENDOR_DATA] = { .type = NLA_BINARY }, 803 [NL80211_ATTR_QOS_MAP] = NLA_POLICY_RANGE(NLA_BINARY, 804 IEEE80211_QOS_MAP_LEN_MIN, 805 IEEE80211_QOS_MAP_LEN_MAX), 806 [NL80211_ATTR_MAC_HINT] = NLA_POLICY_EXACT_LEN_WARN(ETH_ALEN), 807 [NL80211_ATTR_WIPHY_FREQ_HINT] = { .type = NLA_U32 }, 808 [NL80211_ATTR_TDLS_PEER_CAPABILITY] = { .type = NLA_U32 }, 809 [NL80211_ATTR_SOCKET_OWNER] = { .type = NLA_FLAG }, 810 [NL80211_ATTR_CSA_C_OFFSETS_TX] = { .type = NLA_BINARY }, 811 [NL80211_ATTR_USE_RRM] = { .type = NLA_FLAG }, 812 [NL80211_ATTR_TSID] = NLA_POLICY_MAX(NLA_U8, IEEE80211_NUM_TIDS - 1), 813 [NL80211_ATTR_USER_PRIO] = 814 NLA_POLICY_MAX(NLA_U8, IEEE80211_NUM_UPS - 1), 815 [NL80211_ATTR_ADMITTED_TIME] = { .type = NLA_U16 }, 816 [NL80211_ATTR_SMPS_MODE] = { .type = NLA_U8 }, 817 [NL80211_ATTR_OPER_CLASS] = { .type = NLA_U8 }, 818 [NL80211_ATTR_MAC_MASK] = NLA_POLICY_EXACT_LEN_WARN(ETH_ALEN), 819 [NL80211_ATTR_WIPHY_SELF_MANAGED_REG] = { .type = NLA_FLAG }, 820 [NL80211_ATTR_NETNS_FD] = { .type = NLA_U32 }, 821 [NL80211_ATTR_SCHED_SCAN_DELAY] = { .type = NLA_U32 }, 822 [NL80211_ATTR_REG_INDOOR] = { .type = NLA_FLAG }, 823 [NL80211_ATTR_PBSS] = { .type = NLA_FLAG }, 824 [NL80211_ATTR_BSS_SELECT] = { .type = NLA_NESTED }, 825 [NL80211_ATTR_STA_SUPPORT_P2P_PS] = 826 NLA_POLICY_MAX(NLA_U8, NUM_NL80211_P2P_PS_STATUS - 1), 827 [NL80211_ATTR_MU_MIMO_GROUP_DATA] = { 828 .len = VHT_MUMIMO_GROUPS_DATA_LEN 829 }, 830 [NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR] = NLA_POLICY_EXACT_LEN_WARN(ETH_ALEN), 831 [NL80211_ATTR_NAN_MASTER_PREF] = NLA_POLICY_MIN(NLA_U8, 1), 832 [NL80211_ATTR_BANDS] = { .type = NLA_U32 }, 833 [NL80211_ATTR_NAN_CONFIG] = NLA_POLICY_NESTED(nl80211_nan_conf_policy), 834 [NL80211_ATTR_NAN_FUNC] = { .type = NLA_NESTED }, 835 [NL80211_ATTR_FILS_KEK] = { .type = NLA_BINARY, 836 .len = FILS_MAX_KEK_LEN }, 837 [NL80211_ATTR_FILS_NONCES] = NLA_POLICY_EXACT_LEN_WARN(2 * FILS_NONCE_LEN), 838 [NL80211_ATTR_MULTICAST_TO_UNICAST_ENABLED] = { .type = NLA_FLAG, }, 839 [NL80211_ATTR_BSSID] = NLA_POLICY_EXACT_LEN_WARN(ETH_ALEN), 840 [NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI] = { .type = NLA_S8 }, 841 [NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST] = { 842 .len = sizeof(struct nl80211_bss_select_rssi_adjust) 843 }, 844 [NL80211_ATTR_TIMEOUT_REASON] = { .type = NLA_U32 }, 845 [NL80211_ATTR_FILS_ERP_USERNAME] = { .type = NLA_BINARY, 846 .len = FILS_ERP_MAX_USERNAME_LEN }, 847 [NL80211_ATTR_FILS_ERP_REALM] = { .type = NLA_BINARY, 848 .len = FILS_ERP_MAX_REALM_LEN }, 849 [NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] = { .type = NLA_U16 }, 850 [NL80211_ATTR_FILS_ERP_RRK] = { .type = NLA_BINARY, 851 .len = FILS_ERP_MAX_RRK_LEN }, 852 [NL80211_ATTR_FILS_CACHE_ID] = NLA_POLICY_EXACT_LEN_WARN(2), 853 [NL80211_ATTR_PMK] = { .type = NLA_BINARY, .len = PMK_MAX_LEN }, 854 [NL80211_ATTR_PMKR0_NAME] = NLA_POLICY_EXACT_LEN(WLAN_PMK_NAME_LEN), 855 [NL80211_ATTR_SCHED_SCAN_MULTI] = { .type = NLA_FLAG }, 856 [NL80211_ATTR_EXTERNAL_AUTH_SUPPORT] = { .type = NLA_FLAG }, 857 858 [NL80211_ATTR_TXQ_LIMIT] = { .type = NLA_U32 }, 859 [NL80211_ATTR_TXQ_MEMORY_LIMIT] = { .type = NLA_U32 }, 860 [NL80211_ATTR_TXQ_QUANTUM] = NLA_POLICY_FULL_RANGE(NLA_U32, &q_range), 861 [NL80211_ATTR_HE_CAPABILITY] = 862 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_he_capa, 863 NL80211_HE_MAX_CAPABILITY_LEN), 864 [NL80211_ATTR_FTM_RESPONDER] = 865 NLA_POLICY_NESTED(nl80211_ftm_responder_policy), 866 [NL80211_ATTR_TIMEOUT] = NLA_POLICY_MIN(NLA_U32, 1), 867 [NL80211_ATTR_PEER_MEASUREMENTS] = 868 NLA_POLICY_NESTED(nl80211_pmsr_attr_policy), 869 [NL80211_ATTR_AIRTIME_WEIGHT] = NLA_POLICY_MIN(NLA_U16, 1), 870 [NL80211_ATTR_SAE_PASSWORD] = { .type = NLA_BINARY, 871 .len = SAE_PASSWORD_MAX_LEN }, 872 [NL80211_ATTR_TWT_RESPONDER] = { .type = NLA_FLAG }, 873 [NL80211_ATTR_HE_OBSS_PD] = NLA_POLICY_NESTED(he_obss_pd_policy), 874 [NL80211_ATTR_VLAN_ID] = NLA_POLICY_RANGE(NLA_U16, 1, VLAN_N_VID - 2), 875 [NL80211_ATTR_HE_BSS_COLOR] = NLA_POLICY_NESTED(he_bss_color_policy), 876 [NL80211_ATTR_TID_CONFIG] = 877 NLA_POLICY_NESTED_ARRAY(nl80211_tid_config_attr_policy), 878 [NL80211_ATTR_CONTROL_PORT_NO_PREAUTH] = { .type = NLA_FLAG }, 879 [NL80211_ATTR_PMK_LIFETIME] = NLA_POLICY_MIN(NLA_U32, 1), 880 [NL80211_ATTR_PMK_REAUTH_THRESHOLD] = NLA_POLICY_RANGE(NLA_U8, 1, 100), 881 [NL80211_ATTR_RECEIVE_MULTICAST] = { .type = NLA_FLAG }, 882 [NL80211_ATTR_WIPHY_FREQ_OFFSET] = NLA_POLICY_RANGE(NLA_U32, 0, 999), 883 [NL80211_ATTR_SCAN_FREQ_KHZ] = { .type = NLA_NESTED }, 884 [NL80211_ATTR_HE_6GHZ_CAPABILITY] = 885 NLA_POLICY_EXACT_LEN(sizeof(struct ieee80211_he_6ghz_capa)), 886 [NL80211_ATTR_FILS_DISCOVERY] = 887 NLA_POLICY_NESTED(nl80211_fils_discovery_policy), 888 [NL80211_ATTR_UNSOL_BCAST_PROBE_RESP] = 889 NLA_POLICY_NESTED(nl80211_unsol_bcast_probe_resp_policy), 890 [NL80211_ATTR_S1G_CAPABILITY] = 891 NLA_POLICY_EXACT_LEN(IEEE80211_S1G_CAPABILITY_LEN), 892 [NL80211_ATTR_S1G_CAPABILITY_MASK] = 893 NLA_POLICY_EXACT_LEN(IEEE80211_S1G_CAPABILITY_LEN), 894 [NL80211_ATTR_SAE_PWE] = 895 NLA_POLICY_RANGE(NLA_U8, NL80211_SAE_PWE_HUNT_AND_PECK, 896 NL80211_SAE_PWE_BOTH), 897 [NL80211_ATTR_RECONNECT_REQUESTED] = { .type = NLA_REJECT }, 898 [NL80211_ATTR_SAR_SPEC] = NLA_POLICY_NESTED(sar_policy), 899 [NL80211_ATTR_DISABLE_HE] = { .type = NLA_FLAG }, 900 [NL80211_ATTR_OBSS_COLOR_BITMAP] = { .type = NLA_U64 }, 901 [NL80211_ATTR_COLOR_CHANGE_COUNT] = { .type = NLA_U8 }, 902 [NL80211_ATTR_COLOR_CHANGE_COLOR] = { .type = NLA_U8 }, 903 [NL80211_ATTR_COLOR_CHANGE_ELEMS] = NLA_POLICY_NESTED(nl80211_policy), 904 [NL80211_ATTR_MBSSID_CONFIG] = 905 NLA_POLICY_NESTED(nl80211_mbssid_config_policy), 906 [NL80211_ATTR_MBSSID_ELEMS] = { .type = NLA_NESTED }, 907 [NL80211_ATTR_RADAR_BACKGROUND] = { .type = NLA_FLAG }, 908 [NL80211_ATTR_AP_SETTINGS_FLAGS] = { .type = NLA_U32 }, 909 [NL80211_ATTR_EHT_CAPABILITY] = 910 NLA_POLICY_RANGE(NLA_BINARY, 911 NL80211_EHT_MIN_CAPABILITY_LEN, 912 NL80211_EHT_MAX_CAPABILITY_LEN), 913 [NL80211_ATTR_DISABLE_EHT] = { .type = NLA_FLAG }, 914 [NL80211_ATTR_MLO_LINKS] = 915 NLA_POLICY_NESTED_ARRAY(nl80211_policy), 916 [NL80211_ATTR_MLO_LINK_ID] = 917 NLA_POLICY_RANGE(NLA_U8, 0, IEEE80211_MLD_MAX_NUM_LINKS - 1), 918 [NL80211_ATTR_MLD_ADDR] = NLA_POLICY_EXACT_LEN(ETH_ALEN), 919 [NL80211_ATTR_MLO_SUPPORT] = { .type = NLA_FLAG }, 920 [NL80211_ATTR_MAX_NUM_AKM_SUITES] = { .type = NLA_REJECT }, 921 [NL80211_ATTR_EML_CAPABILITY] = { .type = NLA_U16 }, 922 [NL80211_ATTR_PUNCT_BITMAP] = 923 NLA_POLICY_FULL_RANGE(NLA_U32, &nl80211_punct_bitmap_range), 924 925 [NL80211_ATTR_MAX_HW_TIMESTAMP_PEERS] = { .type = NLA_U16 }, 926 [NL80211_ATTR_HW_TIMESTAMP_ENABLED] = { .type = NLA_FLAG }, 927 [NL80211_ATTR_EMA_RNR_ELEMS] = { .type = NLA_NESTED }, 928 [NL80211_ATTR_MLO_LINK_DISABLED] = { .type = NLA_FLAG }, 929 [NL80211_ATTR_BSS_DUMP_INCLUDE_USE_DATA] = { .type = NLA_FLAG }, 930 [NL80211_ATTR_MLO_TTLM_DLINK] = NLA_POLICY_EXACT_LEN(sizeof(u16) * 8), 931 [NL80211_ATTR_MLO_TTLM_ULINK] = NLA_POLICY_EXACT_LEN(sizeof(u16) * 8), 932 [NL80211_ATTR_ASSOC_SPP_AMSDU] = { .type = NLA_FLAG }, 933 [NL80211_ATTR_VIF_RADIO_MASK] = { .type = NLA_U32 }, 934 [NL80211_ATTR_SUPPORTED_SELECTORS] = 935 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_supported_selectors, 936 NL80211_MAX_SUPP_SELECTORS), 937 [NL80211_ATTR_MLO_RECONF_REM_LINKS] = { .type = NLA_U16 }, 938 [NL80211_ATTR_EPCS] = { .type = NLA_FLAG }, 939 [NL80211_ATTR_ASSOC_MLD_EXT_CAPA_OPS] = { .type = NLA_U16 }, 940 [NL80211_ATTR_WIPHY_RADIO_INDEX] = { .type = NLA_U8 }, 941 [NL80211_ATTR_S1G_LONG_BEACON_PERIOD] = NLA_POLICY_MIN(NLA_U8, 2), 942 [NL80211_ATTR_S1G_SHORT_BEACON] = 943 NLA_POLICY_NESTED(nl80211_s1g_short_beacon), 944 [NL80211_ATTR_BSS_PARAM] = { .type = NLA_FLAG }, 945 [NL80211_ATTR_S1G_PRIMARY_2MHZ] = { .type = NLA_FLAG }, 946 [NL80211_ATTR_EPP_PEER] = { .type = NLA_FLAG }, 947 [NL80211_ATTR_UHR_CAPABILITY] = 948 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_uhr_capa, 255), 949 [NL80211_ATTR_DISABLE_UHR] = { .type = NLA_FLAG }, 950 }; 951 952 /* policy for the key attributes */ 953 static const struct nla_policy nl80211_key_policy[NL80211_KEY_MAX + 1] = { 954 [NL80211_KEY_DATA] = { .type = NLA_BINARY, .len = WLAN_MAX_KEY_LEN }, 955 [NL80211_KEY_IDX] = { .type = NLA_U8 }, 956 [NL80211_KEY_CIPHER] = { .type = NLA_U32 }, 957 [NL80211_KEY_SEQ] = { .type = NLA_BINARY, .len = 16 }, 958 [NL80211_KEY_DEFAULT] = { .type = NLA_FLAG }, 959 [NL80211_KEY_DEFAULT_MGMT] = { .type = NLA_FLAG }, 960 [NL80211_KEY_TYPE] = NLA_POLICY_MAX(NLA_U32, NUM_NL80211_KEYTYPES - 1), 961 [NL80211_KEY_DEFAULT_TYPES] = { .type = NLA_NESTED }, 962 [NL80211_KEY_MODE] = NLA_POLICY_RANGE(NLA_U8, 0, NL80211_KEY_SET_TX), 963 }; 964 965 /* policy for the key default flags */ 966 static const struct nla_policy 967 nl80211_key_default_policy[NUM_NL80211_KEY_DEFAULT_TYPES] = { 968 [NL80211_KEY_DEFAULT_TYPE_UNICAST] = { .type = NLA_FLAG }, 969 [NL80211_KEY_DEFAULT_TYPE_MULTICAST] = { .type = NLA_FLAG }, 970 }; 971 972 #ifdef CONFIG_PM 973 /* policy for WoWLAN attributes */ 974 static const struct nla_policy 975 nl80211_wowlan_policy[NUM_NL80211_WOWLAN_TRIG] = { 976 [NL80211_WOWLAN_TRIG_ANY] = { .type = NLA_FLAG }, 977 [NL80211_WOWLAN_TRIG_DISCONNECT] = { .type = NLA_FLAG }, 978 [NL80211_WOWLAN_TRIG_MAGIC_PKT] = { .type = NLA_FLAG }, 979 [NL80211_WOWLAN_TRIG_PKT_PATTERN] = { .type = NLA_NESTED }, 980 [NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE] = { .type = NLA_FLAG }, 981 [NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST] = { .type = NLA_FLAG }, 982 [NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE] = { .type = NLA_FLAG }, 983 [NL80211_WOWLAN_TRIG_RFKILL_RELEASE] = { .type = NLA_FLAG }, 984 [NL80211_WOWLAN_TRIG_TCP_CONNECTION] = { .type = NLA_NESTED }, 985 [NL80211_WOWLAN_TRIG_NET_DETECT] = { .type = NLA_NESTED }, 986 }; 987 988 static const struct nla_policy 989 nl80211_wowlan_tcp_policy[NUM_NL80211_WOWLAN_TCP] = { 990 [NL80211_WOWLAN_TCP_SRC_IPV4] = { .type = NLA_U32 }, 991 [NL80211_WOWLAN_TCP_DST_IPV4] = { .type = NLA_U32 }, 992 [NL80211_WOWLAN_TCP_DST_MAC] = NLA_POLICY_EXACT_LEN_WARN(ETH_ALEN), 993 [NL80211_WOWLAN_TCP_SRC_PORT] = { .type = NLA_U16 }, 994 [NL80211_WOWLAN_TCP_DST_PORT] = { .type = NLA_U16 }, 995 [NL80211_WOWLAN_TCP_DATA_PAYLOAD] = NLA_POLICY_MIN_LEN(1), 996 [NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ] = { 997 .len = sizeof(struct nl80211_wowlan_tcp_data_seq) 998 }, 999 [NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN] = { 1000 .len = sizeof(struct nl80211_wowlan_tcp_data_token) 1001 }, 1002 [NL80211_WOWLAN_TCP_DATA_INTERVAL] = { .type = NLA_U32 }, 1003 [NL80211_WOWLAN_TCP_WAKE_PAYLOAD] = NLA_POLICY_MIN_LEN(1), 1004 [NL80211_WOWLAN_TCP_WAKE_MASK] = NLA_POLICY_MIN_LEN(1), 1005 }; 1006 #endif /* CONFIG_PM */ 1007 1008 /* policy for coalesce rule attributes */ 1009 static const struct nla_policy 1010 nl80211_coalesce_policy[NUM_NL80211_ATTR_COALESCE_RULE] = { 1011 [NL80211_ATTR_COALESCE_RULE_DELAY] = { .type = NLA_U32 }, 1012 [NL80211_ATTR_COALESCE_RULE_CONDITION] = 1013 NLA_POLICY_RANGE(NLA_U32, 1014 NL80211_COALESCE_CONDITION_MATCH, 1015 NL80211_COALESCE_CONDITION_NO_MATCH), 1016 [NL80211_ATTR_COALESCE_RULE_PKT_PATTERN] = { .type = NLA_NESTED }, 1017 }; 1018 1019 /* policy for GTK rekey offload attributes */ 1020 static const struct nla_policy 1021 nl80211_rekey_policy[NUM_NL80211_REKEY_DATA] = { 1022 [NL80211_REKEY_DATA_KEK] = { 1023 .type = NLA_BINARY, 1024 .len = NL80211_KEK_EXT_LEN 1025 }, 1026 [NL80211_REKEY_DATA_KCK] = { 1027 .type = NLA_BINARY, 1028 .len = NL80211_KCK_EXT_LEN_32 1029 }, 1030 [NL80211_REKEY_DATA_REPLAY_CTR] = NLA_POLICY_EXACT_LEN(NL80211_REPLAY_CTR_LEN), 1031 [NL80211_REKEY_DATA_AKM] = { .type = NLA_U32 }, 1032 }; 1033 1034 static const struct nla_policy 1035 nl80211_match_policy[NL80211_SCHED_SCAN_MATCH_ATTR_MAX + 1] = { 1036 [NL80211_SCHED_SCAN_MATCH_ATTR_SSID] = { .type = NLA_BINARY, 1037 .len = IEEE80211_MAX_SSID_LEN }, 1038 [NL80211_SCHED_SCAN_MATCH_ATTR_BSSID] = NLA_POLICY_EXACT_LEN_WARN(ETH_ALEN), 1039 [NL80211_SCHED_SCAN_MATCH_ATTR_RSSI] = { .type = NLA_U32 }, 1040 }; 1041 1042 static const struct nla_policy 1043 nl80211_plan_policy[NL80211_SCHED_SCAN_PLAN_MAX + 1] = { 1044 [NL80211_SCHED_SCAN_PLAN_INTERVAL] = { .type = NLA_U32 }, 1045 [NL80211_SCHED_SCAN_PLAN_ITERATIONS] = { .type = NLA_U32 }, 1046 }; 1047 1048 static const struct nla_policy 1049 nl80211_bss_select_policy[NL80211_BSS_SELECT_ATTR_MAX + 1] = { 1050 [NL80211_BSS_SELECT_ATTR_RSSI] = { .type = NLA_FLAG }, 1051 [NL80211_BSS_SELECT_ATTR_BAND_PREF] = { .type = NLA_U32 }, 1052 [NL80211_BSS_SELECT_ATTR_RSSI_ADJUST] = { 1053 .len = sizeof(struct nl80211_bss_select_rssi_adjust) 1054 }, 1055 }; 1056 1057 /* policy for NAN function attributes */ 1058 static const struct nla_policy 1059 nl80211_nan_func_policy[NL80211_NAN_FUNC_ATTR_MAX + 1] = { 1060 [NL80211_NAN_FUNC_TYPE] = 1061 NLA_POLICY_MAX(NLA_U8, NL80211_NAN_FUNC_MAX_TYPE), 1062 [NL80211_NAN_FUNC_SERVICE_ID] = { 1063 .len = NL80211_NAN_FUNC_SERVICE_ID_LEN }, 1064 [NL80211_NAN_FUNC_PUBLISH_TYPE] = { .type = NLA_U8 }, 1065 [NL80211_NAN_FUNC_PUBLISH_BCAST] = { .type = NLA_FLAG }, 1066 [NL80211_NAN_FUNC_SUBSCRIBE_ACTIVE] = { .type = NLA_FLAG }, 1067 [NL80211_NAN_FUNC_FOLLOW_UP_ID] = { .type = NLA_U8 }, 1068 [NL80211_NAN_FUNC_FOLLOW_UP_REQ_ID] = { .type = NLA_U8 }, 1069 [NL80211_NAN_FUNC_FOLLOW_UP_DEST] = NLA_POLICY_EXACT_LEN_WARN(ETH_ALEN), 1070 [NL80211_NAN_FUNC_CLOSE_RANGE] = { .type = NLA_FLAG }, 1071 [NL80211_NAN_FUNC_TTL] = { .type = NLA_U32 }, 1072 [NL80211_NAN_FUNC_SERVICE_INFO] = { .type = NLA_BINARY, 1073 .len = NL80211_NAN_FUNC_SERVICE_SPEC_INFO_MAX_LEN }, 1074 [NL80211_NAN_FUNC_SRF] = { .type = NLA_NESTED }, 1075 [NL80211_NAN_FUNC_RX_MATCH_FILTER] = { .type = NLA_NESTED }, 1076 [NL80211_NAN_FUNC_TX_MATCH_FILTER] = { .type = NLA_NESTED }, 1077 [NL80211_NAN_FUNC_INSTANCE_ID] = { .type = NLA_U8 }, 1078 [NL80211_NAN_FUNC_TERM_REASON] = { .type = NLA_U8 }, 1079 }; 1080 1081 /* policy for Service Response Filter attributes */ 1082 static const struct nla_policy 1083 nl80211_nan_srf_policy[NL80211_NAN_SRF_ATTR_MAX + 1] = { 1084 [NL80211_NAN_SRF_INCLUDE] = { .type = NLA_FLAG }, 1085 [NL80211_NAN_SRF_BF] = { .type = NLA_BINARY, 1086 .len = NL80211_NAN_FUNC_SRF_MAX_LEN }, 1087 [NL80211_NAN_SRF_BF_IDX] = { .type = NLA_U8 }, 1088 [NL80211_NAN_SRF_MAC_ADDRS] = { .type = NLA_NESTED }, 1089 }; 1090 1091 /* policy for packet pattern attributes */ 1092 static const struct nla_policy 1093 nl80211_packet_pattern_policy[MAX_NL80211_PKTPAT + 1] = { 1094 [NL80211_PKTPAT_MASK] = { .type = NLA_BINARY, }, 1095 [NL80211_PKTPAT_PATTERN] = { .type = NLA_BINARY, }, 1096 [NL80211_PKTPAT_OFFSET] = { .type = NLA_U32 }, 1097 }; 1098 1099 static int nl80211_prepare_wdev_dump(struct netlink_callback *cb, 1100 struct cfg80211_registered_device **rdev, 1101 struct wireless_dev **wdev, 1102 struct nlattr **attrbuf) 1103 { 1104 int err; 1105 1106 if (!cb->args[0]) { 1107 struct nlattr **attrbuf_free = NULL; 1108 1109 if (!attrbuf) { 1110 attrbuf = kzalloc_objs(*attrbuf, NUM_NL80211_ATTR); 1111 if (!attrbuf) 1112 return -ENOMEM; 1113 attrbuf_free = attrbuf; 1114 } 1115 1116 err = nlmsg_parse_deprecated(cb->nlh, 1117 GENL_HDRLEN + nl80211_fam.hdrsize, 1118 attrbuf, nl80211_fam.maxattr, 1119 nl80211_policy, NULL); 1120 if (err) { 1121 kfree(attrbuf_free); 1122 return err; 1123 } 1124 1125 rtnl_lock(); 1126 *wdev = __cfg80211_wdev_from_attrs(NULL, sock_net(cb->skb->sk), 1127 attrbuf); 1128 kfree(attrbuf_free); 1129 if (IS_ERR(*wdev)) { 1130 rtnl_unlock(); 1131 return PTR_ERR(*wdev); 1132 } 1133 *rdev = wiphy_to_rdev((*wdev)->wiphy); 1134 mutex_lock(&(*rdev)->wiphy.mtx); 1135 rtnl_unlock(); 1136 /* 0 is the first index - add 1 to parse only once */ 1137 cb->args[0] = (*rdev)->wiphy_idx + 1; 1138 cb->args[1] = (*wdev)->identifier; 1139 } else { 1140 /* subtract the 1 again here */ 1141 struct wiphy *wiphy; 1142 struct wireless_dev *tmp; 1143 1144 rtnl_lock(); 1145 wiphy = wiphy_idx_to_wiphy(cb->args[0] - 1); 1146 if (!wiphy) { 1147 rtnl_unlock(); 1148 return -ENODEV; 1149 } 1150 *rdev = wiphy_to_rdev(wiphy); 1151 *wdev = NULL; 1152 1153 list_for_each_entry(tmp, &(*rdev)->wiphy.wdev_list, list) { 1154 if (tmp->identifier == cb->args[1]) { 1155 *wdev = tmp; 1156 break; 1157 } 1158 } 1159 1160 if (!*wdev) { 1161 rtnl_unlock(); 1162 return -ENODEV; 1163 } 1164 mutex_lock(&(*rdev)->wiphy.mtx); 1165 rtnl_unlock(); 1166 } 1167 1168 return 0; 1169 } 1170 1171 /* message building helper */ 1172 void *nl80211hdr_put(struct sk_buff *skb, u32 portid, u32 seq, 1173 int flags, u8 cmd) 1174 { 1175 /* since there is no private header just add the generic one */ 1176 return genlmsg_put(skb, portid, seq, &nl80211_fam, flags, cmd); 1177 } 1178 1179 static int nl80211_msg_put_wmm_rules(struct sk_buff *msg, 1180 const struct ieee80211_reg_rule *rule) 1181 { 1182 int j; 1183 struct nlattr *nl_wmm_rules = 1184 nla_nest_start_noflag(msg, NL80211_FREQUENCY_ATTR_WMM); 1185 1186 if (!nl_wmm_rules) 1187 goto nla_put_failure; 1188 1189 for (j = 0; j < IEEE80211_NUM_ACS; j++) { 1190 struct nlattr *nl_wmm_rule = nla_nest_start_noflag(msg, j); 1191 1192 if (!nl_wmm_rule) 1193 goto nla_put_failure; 1194 1195 if (nla_put_u16(msg, NL80211_WMMR_CW_MIN, 1196 rule->wmm_rule.client[j].cw_min) || 1197 nla_put_u16(msg, NL80211_WMMR_CW_MAX, 1198 rule->wmm_rule.client[j].cw_max) || 1199 nla_put_u8(msg, NL80211_WMMR_AIFSN, 1200 rule->wmm_rule.client[j].aifsn) || 1201 nla_put_u16(msg, NL80211_WMMR_TXOP, 1202 rule->wmm_rule.client[j].cot)) 1203 goto nla_put_failure; 1204 1205 nla_nest_end(msg, nl_wmm_rule); 1206 } 1207 nla_nest_end(msg, nl_wmm_rules); 1208 1209 return 0; 1210 1211 nla_put_failure: 1212 return -ENOBUFS; 1213 } 1214 1215 static int nl80211_msg_put_channel(struct sk_buff *msg, struct wiphy *wiphy, 1216 struct ieee80211_channel *chan, 1217 bool large) 1218 { 1219 /* Some channels must be completely excluded from the 1220 * list to protect old user-space tools from breaking 1221 */ 1222 if (!large && chan->flags & 1223 (IEEE80211_CHAN_NO_10MHZ | IEEE80211_CHAN_NO_20MHZ)) 1224 return 0; 1225 if (!large && chan->freq_offset) 1226 return 0; 1227 1228 if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_FREQ, 1229 chan->center_freq)) 1230 goto nla_put_failure; 1231 1232 if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_OFFSET, chan->freq_offset)) 1233 goto nla_put_failure; 1234 1235 if ((chan->flags & IEEE80211_CHAN_PSD) && 1236 nla_put_s8(msg, NL80211_FREQUENCY_ATTR_PSD, chan->psd)) 1237 goto nla_put_failure; 1238 1239 if ((chan->flags & IEEE80211_CHAN_DISABLED) && 1240 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_DISABLED)) 1241 goto nla_put_failure; 1242 if (chan->flags & IEEE80211_CHAN_NO_IR) { 1243 if (nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_IR)) 1244 goto nla_put_failure; 1245 if (nla_put_flag(msg, __NL80211_FREQUENCY_ATTR_NO_IBSS)) 1246 goto nla_put_failure; 1247 } 1248 if (chan->flags & IEEE80211_CHAN_RADAR) { 1249 if (nla_put_flag(msg, NL80211_FREQUENCY_ATTR_RADAR)) 1250 goto nla_put_failure; 1251 if (large) { 1252 u32 time; 1253 1254 time = elapsed_jiffies_msecs(chan->dfs_state_entered); 1255 1256 if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_DFS_STATE, 1257 chan->dfs_state)) 1258 goto nla_put_failure; 1259 if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_DFS_TIME, 1260 time)) 1261 goto nla_put_failure; 1262 if (nla_put_u32(msg, 1263 NL80211_FREQUENCY_ATTR_DFS_CAC_TIME, 1264 chan->dfs_cac_ms)) 1265 goto nla_put_failure; 1266 } 1267 } 1268 1269 if (large) { 1270 if ((chan->flags & IEEE80211_CHAN_NO_HT40MINUS) && 1271 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_HT40_MINUS)) 1272 goto nla_put_failure; 1273 if ((chan->flags & IEEE80211_CHAN_NO_HT40PLUS) && 1274 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_HT40_PLUS)) 1275 goto nla_put_failure; 1276 if ((chan->flags & IEEE80211_CHAN_NO_80MHZ) && 1277 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_80MHZ)) 1278 goto nla_put_failure; 1279 if ((chan->flags & IEEE80211_CHAN_NO_160MHZ) && 1280 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_160MHZ)) 1281 goto nla_put_failure; 1282 if ((chan->flags & IEEE80211_CHAN_INDOOR_ONLY) && 1283 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_INDOOR_ONLY)) 1284 goto nla_put_failure; 1285 if ((chan->flags & IEEE80211_CHAN_IR_CONCURRENT) && 1286 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_IR_CONCURRENT)) 1287 goto nla_put_failure; 1288 if ((chan->flags & IEEE80211_CHAN_NO_20MHZ) && 1289 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_20MHZ)) 1290 goto nla_put_failure; 1291 if ((chan->flags & IEEE80211_CHAN_NO_10MHZ) && 1292 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_10MHZ)) 1293 goto nla_put_failure; 1294 if ((chan->flags & IEEE80211_CHAN_NO_HE) && 1295 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_HE)) 1296 goto nla_put_failure; 1297 if ((chan->flags & IEEE80211_CHAN_NO_320MHZ) && 1298 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_320MHZ)) 1299 goto nla_put_failure; 1300 if ((chan->flags & IEEE80211_CHAN_NO_EHT) && 1301 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_EHT)) 1302 goto nla_put_failure; 1303 if ((chan->flags & IEEE80211_CHAN_DFS_CONCURRENT) && 1304 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_DFS_CONCURRENT)) 1305 goto nla_put_failure; 1306 if ((chan->flags & IEEE80211_CHAN_NO_6GHZ_VLP_CLIENT) && 1307 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_6GHZ_VLP_CLIENT)) 1308 goto nla_put_failure; 1309 if ((chan->flags & IEEE80211_CHAN_NO_6GHZ_AFC_CLIENT) && 1310 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_6GHZ_AFC_CLIENT)) 1311 goto nla_put_failure; 1312 if ((chan->flags & IEEE80211_CHAN_CAN_MONITOR) && 1313 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_CAN_MONITOR)) 1314 goto nla_put_failure; 1315 if ((chan->flags & IEEE80211_CHAN_ALLOW_6GHZ_VLP_AP) && 1316 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_ALLOW_6GHZ_VLP_AP)) 1317 goto nla_put_failure; 1318 if ((chan->flags & IEEE80211_CHAN_ALLOW_20MHZ_ACTIVITY) && 1319 nla_put_flag(msg, 1320 NL80211_FREQUENCY_ATTR_ALLOW_20MHZ_ACTIVITY)) 1321 goto nla_put_failure; 1322 if ((chan->flags & IEEE80211_CHAN_NO_4MHZ) && 1323 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_4MHZ)) 1324 goto nla_put_failure; 1325 if ((chan->flags & IEEE80211_CHAN_NO_8MHZ) && 1326 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_8MHZ)) 1327 goto nla_put_failure; 1328 if ((chan->flags & IEEE80211_CHAN_NO_16MHZ) && 1329 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_16MHZ)) 1330 goto nla_put_failure; 1331 if ((chan->flags & IEEE80211_CHAN_S1G_NO_PRIMARY) && 1332 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_S1G_NO_PRIMARY)) 1333 goto nla_put_failure; 1334 if ((chan->flags & IEEE80211_CHAN_NO_UHR) && 1335 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_UHR)) 1336 goto nla_put_failure; 1337 if (chan->cac_start_time && 1338 nla_put_u64_64bit(msg, 1339 NL80211_FREQUENCY_ATTR_CAC_START_TIME, 1340 chan->cac_start_time, 1341 NL80211_FREQUENCY_ATTR_PAD)) 1342 goto nla_put_failure; 1343 } 1344 1345 if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_MAX_TX_POWER, 1346 DBM_TO_MBM(chan->max_power))) 1347 goto nla_put_failure; 1348 1349 if (large) { 1350 const struct ieee80211_reg_rule *rule = 1351 freq_reg_info(wiphy, MHZ_TO_KHZ(chan->center_freq)); 1352 1353 if (!IS_ERR_OR_NULL(rule) && rule->has_wmm) { 1354 if (nl80211_msg_put_wmm_rules(msg, rule)) 1355 goto nla_put_failure; 1356 } 1357 } 1358 1359 return 0; 1360 1361 nla_put_failure: 1362 return -ENOBUFS; 1363 } 1364 1365 static bool nl80211_put_txq_stats(struct sk_buff *msg, 1366 struct cfg80211_txq_stats *txqstats, 1367 int attrtype) 1368 { 1369 struct nlattr *txqattr; 1370 1371 #define PUT_TXQVAL_U32(attr, memb) do { \ 1372 if (txqstats->filled & BIT(NL80211_TXQ_STATS_ ## attr) && \ 1373 nla_put_u32(msg, NL80211_TXQ_STATS_ ## attr, txqstats->memb)) \ 1374 return false; \ 1375 } while (0) 1376 1377 txqattr = nla_nest_start_noflag(msg, attrtype); 1378 if (!txqattr) 1379 return false; 1380 1381 PUT_TXQVAL_U32(BACKLOG_BYTES, backlog_bytes); 1382 PUT_TXQVAL_U32(BACKLOG_PACKETS, backlog_packets); 1383 PUT_TXQVAL_U32(FLOWS, flows); 1384 PUT_TXQVAL_U32(DROPS, drops); 1385 PUT_TXQVAL_U32(ECN_MARKS, ecn_marks); 1386 PUT_TXQVAL_U32(OVERLIMIT, overlimit); 1387 PUT_TXQVAL_U32(OVERMEMORY, overmemory); 1388 PUT_TXQVAL_U32(COLLISIONS, collisions); 1389 PUT_TXQVAL_U32(TX_BYTES, tx_bytes); 1390 PUT_TXQVAL_U32(TX_PACKETS, tx_packets); 1391 PUT_TXQVAL_U32(MAX_FLOWS, max_flows); 1392 nla_nest_end(msg, txqattr); 1393 1394 #undef PUT_TXQVAL_U32 1395 return true; 1396 } 1397 1398 /* netlink command implementations */ 1399 1400 /** 1401 * nl80211_link_id - return link ID 1402 * @attrs: attributes to look at 1403 * 1404 * Returns: the link ID or 0 if not given 1405 * 1406 * Note this function doesn't do any validation of the link 1407 * ID validity wrt. links that were actually added, so it must 1408 * be called only from ops with %NL80211_FLAG_MLO_VALID_LINK_ID 1409 * or if additional validation is done. 1410 */ 1411 static unsigned int nl80211_link_id(struct nlattr **attrs) 1412 { 1413 struct nlattr *linkid = attrs[NL80211_ATTR_MLO_LINK_ID]; 1414 1415 return nla_get_u8_default(linkid, 0); 1416 } 1417 1418 static int nl80211_link_id_or_invalid(struct nlattr **attrs) 1419 { 1420 struct nlattr *linkid = attrs[NL80211_ATTR_MLO_LINK_ID]; 1421 1422 if (!linkid) 1423 return -1; 1424 1425 return nla_get_u8(linkid); 1426 } 1427 1428 struct key_parse { 1429 struct key_params p; 1430 int idx; 1431 int type; 1432 bool def, defmgmt, defbeacon; 1433 bool def_uni, def_multi; 1434 }; 1435 1436 static int nl80211_parse_key_new(struct genl_info *info, struct nlattr *key, 1437 struct key_parse *k) 1438 { 1439 struct nlattr *tb[NL80211_KEY_MAX + 1]; 1440 int err = nla_parse_nested_deprecated(tb, NL80211_KEY_MAX, key, 1441 nl80211_key_policy, 1442 info->extack); 1443 if (err) 1444 return err; 1445 1446 k->def = !!tb[NL80211_KEY_DEFAULT]; 1447 k->defmgmt = !!tb[NL80211_KEY_DEFAULT_MGMT]; 1448 k->defbeacon = !!tb[NL80211_KEY_DEFAULT_BEACON]; 1449 1450 if (k->def) { 1451 k->def_uni = true; 1452 k->def_multi = true; 1453 } 1454 if (k->defmgmt || k->defbeacon) 1455 k->def_multi = true; 1456 1457 if (tb[NL80211_KEY_IDX]) 1458 k->idx = nla_get_u8(tb[NL80211_KEY_IDX]); 1459 1460 if (tb[NL80211_KEY_DATA]) { 1461 k->p.key = nla_data(tb[NL80211_KEY_DATA]); 1462 k->p.key_len = nla_len(tb[NL80211_KEY_DATA]); 1463 } 1464 1465 if (tb[NL80211_KEY_SEQ]) { 1466 k->p.seq = nla_data(tb[NL80211_KEY_SEQ]); 1467 k->p.seq_len = nla_len(tb[NL80211_KEY_SEQ]); 1468 } 1469 1470 if (tb[NL80211_KEY_CIPHER]) 1471 k->p.cipher = nla_get_u32(tb[NL80211_KEY_CIPHER]); 1472 1473 if (tb[NL80211_KEY_TYPE]) 1474 k->type = nla_get_u32(tb[NL80211_KEY_TYPE]); 1475 1476 if (tb[NL80211_KEY_DEFAULT_TYPES]) { 1477 struct nlattr *kdt[NUM_NL80211_KEY_DEFAULT_TYPES]; 1478 1479 err = nla_parse_nested_deprecated(kdt, 1480 NUM_NL80211_KEY_DEFAULT_TYPES - 1, 1481 tb[NL80211_KEY_DEFAULT_TYPES], 1482 nl80211_key_default_policy, 1483 info->extack); 1484 if (err) 1485 return err; 1486 1487 k->def_uni = kdt[NL80211_KEY_DEFAULT_TYPE_UNICAST]; 1488 k->def_multi = kdt[NL80211_KEY_DEFAULT_TYPE_MULTICAST]; 1489 } 1490 1491 if (tb[NL80211_KEY_MODE]) 1492 k->p.mode = nla_get_u8(tb[NL80211_KEY_MODE]); 1493 1494 return 0; 1495 } 1496 1497 static int nl80211_parse_key_old(struct genl_info *info, struct key_parse *k) 1498 { 1499 if (info->attrs[NL80211_ATTR_KEY_DATA]) { 1500 k->p.key = nla_data(info->attrs[NL80211_ATTR_KEY_DATA]); 1501 k->p.key_len = nla_len(info->attrs[NL80211_ATTR_KEY_DATA]); 1502 } 1503 1504 if (info->attrs[NL80211_ATTR_KEY_SEQ]) { 1505 k->p.seq = nla_data(info->attrs[NL80211_ATTR_KEY_SEQ]); 1506 k->p.seq_len = nla_len(info->attrs[NL80211_ATTR_KEY_SEQ]); 1507 } 1508 1509 if (info->attrs[NL80211_ATTR_KEY_IDX]) 1510 k->idx = nla_get_u8(info->attrs[NL80211_ATTR_KEY_IDX]); 1511 1512 if (info->attrs[NL80211_ATTR_KEY_CIPHER]) 1513 k->p.cipher = nla_get_u32(info->attrs[NL80211_ATTR_KEY_CIPHER]); 1514 1515 k->def = !!info->attrs[NL80211_ATTR_KEY_DEFAULT]; 1516 k->defmgmt = !!info->attrs[NL80211_ATTR_KEY_DEFAULT_MGMT]; 1517 1518 if (k->def) { 1519 k->def_uni = true; 1520 k->def_multi = true; 1521 } 1522 if (k->defmgmt) 1523 k->def_multi = true; 1524 1525 if (info->attrs[NL80211_ATTR_KEY_TYPE]) 1526 k->type = nla_get_u32(info->attrs[NL80211_ATTR_KEY_TYPE]); 1527 1528 if (info->attrs[NL80211_ATTR_KEY_DEFAULT_TYPES]) { 1529 struct nlattr *kdt[NUM_NL80211_KEY_DEFAULT_TYPES]; 1530 int err = nla_parse_nested_deprecated(kdt, 1531 NUM_NL80211_KEY_DEFAULT_TYPES - 1, 1532 info->attrs[NL80211_ATTR_KEY_DEFAULT_TYPES], 1533 nl80211_key_default_policy, 1534 info->extack); 1535 if (err) 1536 return err; 1537 1538 k->def_uni = kdt[NL80211_KEY_DEFAULT_TYPE_UNICAST]; 1539 k->def_multi = kdt[NL80211_KEY_DEFAULT_TYPE_MULTICAST]; 1540 } 1541 1542 return 0; 1543 } 1544 1545 static int nl80211_parse_key(struct genl_info *info, struct key_parse *k) 1546 { 1547 int err; 1548 1549 memset(k, 0, sizeof(*k)); 1550 k->idx = -1; 1551 k->type = -1; 1552 1553 if (info->attrs[NL80211_ATTR_KEY]) 1554 err = nl80211_parse_key_new(info, info->attrs[NL80211_ATTR_KEY], k); 1555 else 1556 err = nl80211_parse_key_old(info, k); 1557 1558 if (err) 1559 return err; 1560 1561 if ((k->def ? 1 : 0) + (k->defmgmt ? 1 : 0) + 1562 (k->defbeacon ? 1 : 0) > 1) { 1563 GENL_SET_ERR_MSG(info, 1564 "key with multiple default flags is invalid"); 1565 return -EINVAL; 1566 } 1567 1568 if (k->defmgmt || k->defbeacon) { 1569 if (k->def_uni || !k->def_multi) { 1570 GENL_SET_ERR_MSG(info, 1571 "defmgmt/defbeacon key must be mcast"); 1572 return -EINVAL; 1573 } 1574 } 1575 1576 if (k->idx != -1) { 1577 if (k->defmgmt) { 1578 if (k->idx < 4 || k->idx > 5) { 1579 GENL_SET_ERR_MSG(info, 1580 "defmgmt key idx not 4 or 5"); 1581 return -EINVAL; 1582 } 1583 } else if (k->defbeacon) { 1584 if (k->idx < 6 || k->idx > 7) { 1585 GENL_SET_ERR_MSG(info, 1586 "defbeacon key idx not 6 or 7"); 1587 return -EINVAL; 1588 } 1589 } else if (k->def) { 1590 if (k->idx < 0 || k->idx > 3) { 1591 GENL_SET_ERR_MSG(info, "def key idx not 0-3"); 1592 return -EINVAL; 1593 } 1594 } else { 1595 if (k->idx < 0 || k->idx > 7) { 1596 GENL_SET_ERR_MSG(info, "key idx not 0-7"); 1597 return -EINVAL; 1598 } 1599 } 1600 } 1601 1602 return 0; 1603 } 1604 1605 static struct cfg80211_cached_keys * 1606 nl80211_parse_connkeys(struct cfg80211_registered_device *rdev, 1607 struct genl_info *info, bool *no_ht) 1608 { 1609 struct nlattr *keys = info->attrs[NL80211_ATTR_KEYS]; 1610 struct key_parse parse; 1611 struct nlattr *key; 1612 struct cfg80211_cached_keys *result; 1613 int rem, err, def = 0; 1614 bool have_key = false; 1615 1616 nla_for_each_nested(key, keys, rem) { 1617 have_key = true; 1618 break; 1619 } 1620 1621 if (!have_key) 1622 return NULL; 1623 1624 result = kzalloc_obj(*result); 1625 if (!result) 1626 return ERR_PTR(-ENOMEM); 1627 1628 result->def = -1; 1629 1630 nla_for_each_nested(key, keys, rem) { 1631 memset(&parse, 0, sizeof(parse)); 1632 parse.idx = -1; 1633 1634 err = nl80211_parse_key_new(info, key, &parse); 1635 if (err) 1636 goto error; 1637 err = -EINVAL; 1638 if (!parse.p.key) 1639 goto error; 1640 if (parse.idx < 0 || parse.idx > 3) { 1641 GENL_SET_ERR_MSG(info, "key index out of range [0-3]"); 1642 goto error; 1643 } 1644 if (parse.def) { 1645 if (def) { 1646 GENL_SET_ERR_MSG(info, 1647 "only one key can be default"); 1648 goto error; 1649 } 1650 def = 1; 1651 result->def = parse.idx; 1652 if (!parse.def_uni || !parse.def_multi) 1653 goto error; 1654 } else if (parse.defmgmt) 1655 goto error; 1656 err = cfg80211_validate_key_settings(rdev, &parse.p, 1657 parse.idx, false, NULL); 1658 if (err) 1659 goto error; 1660 if (parse.p.cipher != WLAN_CIPHER_SUITE_WEP40 && 1661 parse.p.cipher != WLAN_CIPHER_SUITE_WEP104) { 1662 GENL_SET_ERR_MSG(info, "connect key must be WEP"); 1663 err = -EINVAL; 1664 goto error; 1665 } 1666 result->params[parse.idx].cipher = parse.p.cipher; 1667 result->params[parse.idx].key_len = parse.p.key_len; 1668 result->params[parse.idx].key = result->data[parse.idx]; 1669 memcpy(result->data[parse.idx], parse.p.key, parse.p.key_len); 1670 1671 /* must be WEP key if we got here */ 1672 if (no_ht) 1673 *no_ht = true; 1674 } 1675 1676 if (result->def < 0) { 1677 err = -EINVAL; 1678 GENL_SET_ERR_MSG(info, "need a default/TX key"); 1679 goto error; 1680 } 1681 1682 return result; 1683 error: 1684 kfree_sensitive(result); 1685 return ERR_PTR(err); 1686 } 1687 1688 static int nl80211_key_allowed(struct wireless_dev *wdev) 1689 { 1690 lockdep_assert_wiphy(wdev->wiphy); 1691 1692 switch (wdev->iftype) { 1693 case NL80211_IFTYPE_AP: 1694 case NL80211_IFTYPE_AP_VLAN: 1695 case NL80211_IFTYPE_P2P_GO: 1696 case NL80211_IFTYPE_MESH_POINT: 1697 break; 1698 case NL80211_IFTYPE_ADHOC: 1699 if (wdev->u.ibss.current_bss) 1700 return 0; 1701 return -ENOLINK; 1702 case NL80211_IFTYPE_STATION: 1703 case NL80211_IFTYPE_P2P_CLIENT: 1704 if (wdev->connected || 1705 (wiphy_ext_feature_isset(wdev->wiphy, 1706 NL80211_EXT_FEATURE_ASSOC_FRAME_ENCRYPTION))) 1707 return 0; 1708 return -ENOLINK; 1709 case NL80211_IFTYPE_NAN: 1710 if (wiphy_ext_feature_isset(wdev->wiphy, 1711 NL80211_EXT_FEATURE_SECURE_NAN)) 1712 return 0; 1713 return -EINVAL; 1714 case NL80211_IFTYPE_UNSPECIFIED: 1715 case NL80211_IFTYPE_OCB: 1716 case NL80211_IFTYPE_MONITOR: 1717 case NL80211_IFTYPE_P2P_DEVICE: 1718 case NL80211_IFTYPE_WDS: 1719 case NUM_NL80211_IFTYPES: 1720 return -EINVAL; 1721 } 1722 1723 return 0; 1724 } 1725 1726 static struct ieee80211_channel *nl80211_get_valid_chan(struct wiphy *wiphy, 1727 u32 freq) 1728 { 1729 struct ieee80211_channel *chan; 1730 1731 chan = ieee80211_get_channel_khz(wiphy, freq); 1732 if (!chan || chan->flags & IEEE80211_CHAN_DISABLED) 1733 return NULL; 1734 return chan; 1735 } 1736 1737 static int nl80211_put_iftypes(struct sk_buff *msg, u32 attr, u16 ifmodes) 1738 { 1739 struct nlattr *nl_modes = nla_nest_start_noflag(msg, attr); 1740 int i; 1741 1742 if (!nl_modes) 1743 goto nla_put_failure; 1744 1745 i = 0; 1746 while (ifmodes) { 1747 if ((ifmodes & 1) && nla_put_flag(msg, i)) 1748 goto nla_put_failure; 1749 ifmodes >>= 1; 1750 i++; 1751 } 1752 1753 nla_nest_end(msg, nl_modes); 1754 return 0; 1755 1756 nla_put_failure: 1757 return -ENOBUFS; 1758 } 1759 1760 static int nl80211_put_ifcomb_data(struct sk_buff *msg, bool large, int idx, 1761 const struct ieee80211_iface_combination *c, 1762 u16 nested) 1763 { 1764 struct nlattr *nl_combi, *nl_limits; 1765 int i; 1766 1767 nl_combi = nla_nest_start_noflag(msg, idx | nested); 1768 if (!nl_combi) 1769 goto nla_put_failure; 1770 1771 nl_limits = nla_nest_start_noflag(msg, NL80211_IFACE_COMB_LIMITS | 1772 nested); 1773 if (!nl_limits) 1774 goto nla_put_failure; 1775 1776 for (i = 0; i < c->n_limits; i++) { 1777 struct nlattr *nl_limit; 1778 1779 nl_limit = nla_nest_start_noflag(msg, i + 1); 1780 if (!nl_limit) 1781 goto nla_put_failure; 1782 if (nla_put_u32(msg, NL80211_IFACE_LIMIT_MAX, c->limits[i].max)) 1783 goto nla_put_failure; 1784 if (nl80211_put_iftypes(msg, NL80211_IFACE_LIMIT_TYPES, 1785 c->limits[i].types)) 1786 goto nla_put_failure; 1787 nla_nest_end(msg, nl_limit); 1788 } 1789 1790 nla_nest_end(msg, nl_limits); 1791 1792 if (c->beacon_int_infra_match && 1793 nla_put_flag(msg, NL80211_IFACE_COMB_STA_AP_BI_MATCH)) 1794 goto nla_put_failure; 1795 if (nla_put_u32(msg, NL80211_IFACE_COMB_NUM_CHANNELS, 1796 c->num_different_channels) || 1797 nla_put_u32(msg, NL80211_IFACE_COMB_MAXNUM, 1798 c->max_interfaces)) 1799 goto nla_put_failure; 1800 if (large && 1801 (nla_put_u32(msg, NL80211_IFACE_COMB_RADAR_DETECT_WIDTHS, 1802 c->radar_detect_widths) || 1803 nla_put_u32(msg, NL80211_IFACE_COMB_RADAR_DETECT_REGIONS, 1804 c->radar_detect_regions))) 1805 goto nla_put_failure; 1806 if (c->beacon_int_min_gcd && 1807 nla_put_u32(msg, NL80211_IFACE_COMB_BI_MIN_GCD, 1808 c->beacon_int_min_gcd)) 1809 goto nla_put_failure; 1810 1811 nla_nest_end(msg, nl_combi); 1812 1813 return 0; 1814 nla_put_failure: 1815 return -ENOBUFS; 1816 } 1817 1818 static int nl80211_put_iface_combinations(struct wiphy *wiphy, 1819 struct sk_buff *msg, 1820 int attr, int radio, 1821 bool large, u16 nested) 1822 { 1823 const struct ieee80211_iface_combination *c; 1824 struct nlattr *nl_combis; 1825 int i, n; 1826 1827 nl_combis = nla_nest_start_noflag(msg, attr | nested); 1828 if (!nl_combis) 1829 goto nla_put_failure; 1830 1831 if (radio >= 0) { 1832 c = wiphy->radio[0].iface_combinations; 1833 n = wiphy->radio[0].n_iface_combinations; 1834 } else { 1835 c = wiphy->iface_combinations; 1836 n = wiphy->n_iface_combinations; 1837 } 1838 for (i = 0; i < n; i++) 1839 if (nl80211_put_ifcomb_data(msg, large, i + 1, &c[i], nested)) 1840 goto nla_put_failure; 1841 1842 nla_nest_end(msg, nl_combis); 1843 1844 return 0; 1845 nla_put_failure: 1846 return -ENOBUFS; 1847 } 1848 1849 #ifdef CONFIG_PM 1850 static int nl80211_send_wowlan_tcp_caps(struct cfg80211_registered_device *rdev, 1851 struct sk_buff *msg) 1852 { 1853 const struct wiphy_wowlan_tcp_support *tcp = rdev->wiphy.wowlan->tcp; 1854 struct nlattr *nl_tcp; 1855 1856 if (!tcp) 1857 return 0; 1858 1859 nl_tcp = nla_nest_start_noflag(msg, 1860 NL80211_WOWLAN_TRIG_TCP_CONNECTION); 1861 if (!nl_tcp) 1862 return -ENOBUFS; 1863 1864 if (nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD, 1865 tcp->data_payload_max)) 1866 return -ENOBUFS; 1867 1868 if (nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD, 1869 tcp->data_payload_max)) 1870 return -ENOBUFS; 1871 1872 if (tcp->seq && nla_put_flag(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ)) 1873 return -ENOBUFS; 1874 1875 if (tcp->tok && nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN, 1876 sizeof(*tcp->tok), tcp->tok)) 1877 return -ENOBUFS; 1878 1879 if (nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_INTERVAL, 1880 tcp->data_interval_max)) 1881 return -ENOBUFS; 1882 1883 if (nla_put_u32(msg, NL80211_WOWLAN_TCP_WAKE_PAYLOAD, 1884 tcp->wake_payload_max)) 1885 return -ENOBUFS; 1886 1887 nla_nest_end(msg, nl_tcp); 1888 return 0; 1889 } 1890 1891 static int nl80211_send_wowlan(struct sk_buff *msg, 1892 struct cfg80211_registered_device *rdev, 1893 bool large) 1894 { 1895 struct nlattr *nl_wowlan; 1896 1897 if (!rdev->wiphy.wowlan) 1898 return 0; 1899 1900 nl_wowlan = nla_nest_start_noflag(msg, 1901 NL80211_ATTR_WOWLAN_TRIGGERS_SUPPORTED); 1902 if (!nl_wowlan) 1903 return -ENOBUFS; 1904 1905 if (((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_ANY) && 1906 nla_put_flag(msg, NL80211_WOWLAN_TRIG_ANY)) || 1907 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_DISCONNECT) && 1908 nla_put_flag(msg, NL80211_WOWLAN_TRIG_DISCONNECT)) || 1909 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_MAGIC_PKT) && 1910 nla_put_flag(msg, NL80211_WOWLAN_TRIG_MAGIC_PKT)) || 1911 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_SUPPORTS_GTK_REKEY) && 1912 nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_SUPPORTED)) || 1913 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_GTK_REKEY_FAILURE) && 1914 nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE)) || 1915 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_EAP_IDENTITY_REQ) && 1916 nla_put_flag(msg, NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST)) || 1917 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_4WAY_HANDSHAKE) && 1918 nla_put_flag(msg, NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE)) || 1919 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_RFKILL_RELEASE) && 1920 nla_put_flag(msg, NL80211_WOWLAN_TRIG_RFKILL_RELEASE))) 1921 return -ENOBUFS; 1922 1923 if (rdev->wiphy.wowlan->n_patterns) { 1924 struct nl80211_pattern_support pat = { 1925 .max_patterns = rdev->wiphy.wowlan->n_patterns, 1926 .min_pattern_len = rdev->wiphy.wowlan->pattern_min_len, 1927 .max_pattern_len = rdev->wiphy.wowlan->pattern_max_len, 1928 .max_pkt_offset = rdev->wiphy.wowlan->max_pkt_offset, 1929 }; 1930 1931 if (nla_put(msg, NL80211_WOWLAN_TRIG_PKT_PATTERN, 1932 sizeof(pat), &pat)) 1933 return -ENOBUFS; 1934 } 1935 1936 if ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_NET_DETECT) && 1937 nla_put_u32(msg, NL80211_WOWLAN_TRIG_NET_DETECT, 1938 rdev->wiphy.wowlan->max_nd_match_sets)) 1939 return -ENOBUFS; 1940 1941 if (large && nl80211_send_wowlan_tcp_caps(rdev, msg)) 1942 return -ENOBUFS; 1943 1944 nla_nest_end(msg, nl_wowlan); 1945 1946 return 0; 1947 } 1948 #endif 1949 1950 static int nl80211_send_coalesce(struct sk_buff *msg, 1951 struct cfg80211_registered_device *rdev) 1952 { 1953 struct nl80211_coalesce_rule_support rule; 1954 1955 if (!rdev->wiphy.coalesce) 1956 return 0; 1957 1958 rule.max_rules = rdev->wiphy.coalesce->n_rules; 1959 rule.max_delay = rdev->wiphy.coalesce->max_delay; 1960 rule.pat.max_patterns = rdev->wiphy.coalesce->n_patterns; 1961 rule.pat.min_pattern_len = rdev->wiphy.coalesce->pattern_min_len; 1962 rule.pat.max_pattern_len = rdev->wiphy.coalesce->pattern_max_len; 1963 rule.pat.max_pkt_offset = rdev->wiphy.coalesce->max_pkt_offset; 1964 1965 if (nla_put(msg, NL80211_ATTR_COALESCE_RULE, sizeof(rule), &rule)) 1966 return -ENOBUFS; 1967 1968 return 0; 1969 } 1970 1971 static int 1972 nl80211_send_iftype_data(struct sk_buff *msg, 1973 const struct ieee80211_supported_band *sband, 1974 const struct ieee80211_sband_iftype_data *iftdata) 1975 { 1976 const struct ieee80211_sta_he_cap *he_cap = &iftdata->he_cap; 1977 const struct ieee80211_sta_eht_cap *eht_cap = &iftdata->eht_cap; 1978 const struct ieee80211_sta_uhr_cap *uhr_cap = &iftdata->uhr_cap; 1979 1980 if (nl80211_put_iftypes(msg, NL80211_BAND_IFTYPE_ATTR_IFTYPES, 1981 iftdata->types_mask)) 1982 return -ENOBUFS; 1983 1984 if (he_cap->has_he) { 1985 if (nla_put(msg, NL80211_BAND_IFTYPE_ATTR_HE_CAP_MAC, 1986 sizeof(he_cap->he_cap_elem.mac_cap_info), 1987 he_cap->he_cap_elem.mac_cap_info) || 1988 nla_put(msg, NL80211_BAND_IFTYPE_ATTR_HE_CAP_PHY, 1989 sizeof(he_cap->he_cap_elem.phy_cap_info), 1990 he_cap->he_cap_elem.phy_cap_info) || 1991 nla_put(msg, NL80211_BAND_IFTYPE_ATTR_HE_CAP_MCS_SET, 1992 sizeof(he_cap->he_mcs_nss_supp), 1993 &he_cap->he_mcs_nss_supp) || 1994 nla_put(msg, NL80211_BAND_IFTYPE_ATTR_HE_CAP_PPE, 1995 sizeof(he_cap->ppe_thres), he_cap->ppe_thres)) 1996 return -ENOBUFS; 1997 } 1998 1999 if (eht_cap->has_eht && he_cap->has_he) { 2000 u8 mcs_nss_size, ppe_thresh_size; 2001 u16 ppe_thres_hdr; 2002 bool is_ap; 2003 2004 is_ap = iftdata->types_mask & BIT(NL80211_IFTYPE_AP) || 2005 iftdata->types_mask & BIT(NL80211_IFTYPE_P2P_GO); 2006 2007 mcs_nss_size = 2008 ieee80211_eht_mcs_nss_size(&he_cap->he_cap_elem, 2009 &eht_cap->eht_cap_elem, 2010 is_ap); 2011 2012 ppe_thres_hdr = get_unaligned_le16(&eht_cap->eht_ppe_thres[0]); 2013 ppe_thresh_size = 2014 ieee80211_eht_ppe_size(ppe_thres_hdr, 2015 eht_cap->eht_cap_elem.phy_cap_info); 2016 2017 if (nla_put(msg, NL80211_BAND_IFTYPE_ATTR_EHT_CAP_MAC, 2018 sizeof(eht_cap->eht_cap_elem.mac_cap_info), 2019 eht_cap->eht_cap_elem.mac_cap_info) || 2020 nla_put(msg, NL80211_BAND_IFTYPE_ATTR_EHT_CAP_PHY, 2021 sizeof(eht_cap->eht_cap_elem.phy_cap_info), 2022 eht_cap->eht_cap_elem.phy_cap_info) || 2023 nla_put(msg, NL80211_BAND_IFTYPE_ATTR_EHT_CAP_MCS_SET, 2024 mcs_nss_size, &eht_cap->eht_mcs_nss_supp) || 2025 nla_put(msg, NL80211_BAND_IFTYPE_ATTR_EHT_CAP_PPE, 2026 ppe_thresh_size, eht_cap->eht_ppe_thres)) 2027 return -ENOBUFS; 2028 } 2029 2030 if (uhr_cap->has_uhr) { 2031 if (nla_put(msg, NL80211_BAND_IFTYPE_ATTR_UHR_CAP_MAC, 2032 sizeof(uhr_cap->mac), &uhr_cap->mac) || 2033 nla_put(msg, NL80211_BAND_IFTYPE_ATTR_UHR_CAP_PHY, 2034 sizeof(uhr_cap->phy), &uhr_cap->phy)) 2035 return -ENOBUFS; 2036 } 2037 2038 if (sband->band == NL80211_BAND_6GHZ && 2039 nla_put(msg, NL80211_BAND_IFTYPE_ATTR_HE_6GHZ_CAPA, 2040 sizeof(iftdata->he_6ghz_capa), 2041 &iftdata->he_6ghz_capa)) 2042 return -ENOBUFS; 2043 2044 if (iftdata->vendor_elems.data && iftdata->vendor_elems.len && 2045 nla_put(msg, NL80211_BAND_IFTYPE_ATTR_VENDOR_ELEMS, 2046 iftdata->vendor_elems.len, iftdata->vendor_elems.data)) 2047 return -ENOBUFS; 2048 2049 return 0; 2050 } 2051 2052 static int nl80211_send_band_rateinfo(struct sk_buff *msg, 2053 struct ieee80211_supported_band *sband, 2054 bool large) 2055 { 2056 struct nlattr *nl_rates, *nl_rate; 2057 struct ieee80211_rate *rate; 2058 int i; 2059 2060 /* add HT info */ 2061 if (sband->ht_cap.ht_supported && 2062 (nla_put(msg, NL80211_BAND_ATTR_HT_MCS_SET, 2063 sizeof(sband->ht_cap.mcs), 2064 &sband->ht_cap.mcs) || 2065 nla_put_u16(msg, NL80211_BAND_ATTR_HT_CAPA, 2066 sband->ht_cap.cap) || 2067 nla_put_u8(msg, NL80211_BAND_ATTR_HT_AMPDU_FACTOR, 2068 sband->ht_cap.ampdu_factor) || 2069 nla_put_u8(msg, NL80211_BAND_ATTR_HT_AMPDU_DENSITY, 2070 sband->ht_cap.ampdu_density))) 2071 return -ENOBUFS; 2072 2073 /* add VHT info */ 2074 if (sband->vht_cap.vht_supported && 2075 (nla_put(msg, NL80211_BAND_ATTR_VHT_MCS_SET, 2076 sizeof(sband->vht_cap.vht_mcs), 2077 &sband->vht_cap.vht_mcs) || 2078 nla_put_u32(msg, NL80211_BAND_ATTR_VHT_CAPA, 2079 sband->vht_cap.cap))) 2080 return -ENOBUFS; 2081 2082 if (large && sband->n_iftype_data) { 2083 struct nlattr *nl_iftype_data = 2084 nla_nest_start_noflag(msg, 2085 NL80211_BAND_ATTR_IFTYPE_DATA); 2086 const struct ieee80211_sband_iftype_data *iftd; 2087 int err; 2088 2089 if (!nl_iftype_data) 2090 return -ENOBUFS; 2091 2092 for_each_sband_iftype_data(sband, i, iftd) { 2093 struct nlattr *iftdata; 2094 2095 iftdata = nla_nest_start_noflag(msg, i + 1); 2096 if (!iftdata) 2097 return -ENOBUFS; 2098 2099 err = nl80211_send_iftype_data(msg, sband, iftd); 2100 if (err) 2101 return err; 2102 2103 nla_nest_end(msg, iftdata); 2104 } 2105 2106 nla_nest_end(msg, nl_iftype_data); 2107 } 2108 2109 /* add EDMG info */ 2110 if (large && sband->edmg_cap.channels && 2111 (nla_put_u8(msg, NL80211_BAND_ATTR_EDMG_CHANNELS, 2112 sband->edmg_cap.channels) || 2113 nla_put_u8(msg, NL80211_BAND_ATTR_EDMG_BW_CONFIG, 2114 sband->edmg_cap.bw_config))) 2115 2116 return -ENOBUFS; 2117 2118 /* add bitrates */ 2119 nl_rates = nla_nest_start_noflag(msg, NL80211_BAND_ATTR_RATES); 2120 if (!nl_rates) 2121 return -ENOBUFS; 2122 2123 for (i = 0; i < sband->n_bitrates; i++) { 2124 nl_rate = nla_nest_start_noflag(msg, i); 2125 if (!nl_rate) 2126 return -ENOBUFS; 2127 2128 rate = &sband->bitrates[i]; 2129 if (nla_put_u32(msg, NL80211_BITRATE_ATTR_RATE, 2130 rate->bitrate)) 2131 return -ENOBUFS; 2132 if ((rate->flags & IEEE80211_RATE_SHORT_PREAMBLE) && 2133 nla_put_flag(msg, 2134 NL80211_BITRATE_ATTR_2GHZ_SHORTPREAMBLE)) 2135 return -ENOBUFS; 2136 2137 nla_nest_end(msg, nl_rate); 2138 } 2139 2140 nla_nest_end(msg, nl_rates); 2141 2142 /* S1G capabilities */ 2143 if (sband->band == NL80211_BAND_S1GHZ && sband->s1g_cap.s1g && 2144 (nla_put(msg, NL80211_BAND_ATTR_S1G_CAPA, 2145 sizeof(sband->s1g_cap.cap), 2146 sband->s1g_cap.cap) || 2147 nla_put(msg, NL80211_BAND_ATTR_S1G_MCS_NSS_SET, 2148 sizeof(sband->s1g_cap.nss_mcs), 2149 sband->s1g_cap.nss_mcs))) 2150 return -ENOBUFS; 2151 2152 return 0; 2153 } 2154 2155 static int 2156 nl80211_send_mgmt_stypes(struct sk_buff *msg, 2157 const struct ieee80211_txrx_stypes *mgmt_stypes) 2158 { 2159 u16 stypes; 2160 struct nlattr *nl_ftypes, *nl_ifs; 2161 enum nl80211_iftype ift; 2162 int i; 2163 2164 if (!mgmt_stypes) 2165 return 0; 2166 2167 nl_ifs = nla_nest_start_noflag(msg, NL80211_ATTR_TX_FRAME_TYPES); 2168 if (!nl_ifs) 2169 return -ENOBUFS; 2170 2171 for (ift = 0; ift < NUM_NL80211_IFTYPES; ift++) { 2172 nl_ftypes = nla_nest_start_noflag(msg, ift); 2173 if (!nl_ftypes) 2174 return -ENOBUFS; 2175 i = 0; 2176 stypes = mgmt_stypes[ift].tx; 2177 while (stypes) { 2178 if ((stypes & 1) && 2179 nla_put_u16(msg, NL80211_ATTR_FRAME_TYPE, 2180 (i << 4) | IEEE80211_FTYPE_MGMT)) 2181 return -ENOBUFS; 2182 stypes >>= 1; 2183 i++; 2184 } 2185 nla_nest_end(msg, nl_ftypes); 2186 } 2187 2188 nla_nest_end(msg, nl_ifs); 2189 2190 nl_ifs = nla_nest_start_noflag(msg, NL80211_ATTR_RX_FRAME_TYPES); 2191 if (!nl_ifs) 2192 return -ENOBUFS; 2193 2194 for (ift = 0; ift < NUM_NL80211_IFTYPES; ift++) { 2195 nl_ftypes = nla_nest_start_noflag(msg, ift); 2196 if (!nl_ftypes) 2197 return -ENOBUFS; 2198 i = 0; 2199 stypes = mgmt_stypes[ift].rx; 2200 while (stypes) { 2201 if ((stypes & 1) && 2202 nla_put_u16(msg, NL80211_ATTR_FRAME_TYPE, 2203 (i << 4) | IEEE80211_FTYPE_MGMT)) 2204 return -ENOBUFS; 2205 stypes >>= 1; 2206 i++; 2207 } 2208 nla_nest_end(msg, nl_ftypes); 2209 } 2210 nla_nest_end(msg, nl_ifs); 2211 2212 return 0; 2213 } 2214 2215 #define CMD(op, n) \ 2216 do { \ 2217 if (rdev->ops->op) { \ 2218 i++; \ 2219 if (nla_put_u32(msg, i, NL80211_CMD_ ## n)) \ 2220 goto nla_put_failure; \ 2221 } \ 2222 } while (0) 2223 2224 static int nl80211_add_commands_unsplit(struct cfg80211_registered_device *rdev, 2225 struct sk_buff *msg) 2226 { 2227 int i = 0; 2228 2229 /* 2230 * do *NOT* add anything into this function, new things need to be 2231 * advertised only to new versions of userspace that can deal with 2232 * the split (and they can't possibly care about new features... 2233 */ 2234 CMD(add_virtual_intf, NEW_INTERFACE); 2235 CMD(change_virtual_intf, SET_INTERFACE); 2236 CMD(add_key, NEW_KEY); 2237 CMD(start_ap, START_AP); 2238 CMD(add_station, NEW_STATION); 2239 CMD(add_mpath, NEW_MPATH); 2240 CMD(update_mesh_config, SET_MESH_CONFIG); 2241 CMD(change_bss, SET_BSS); 2242 CMD(auth, AUTHENTICATE); 2243 CMD(assoc, ASSOCIATE); 2244 CMD(deauth, DEAUTHENTICATE); 2245 CMD(disassoc, DISASSOCIATE); 2246 CMD(join_ibss, JOIN_IBSS); 2247 CMD(join_mesh, JOIN_MESH); 2248 CMD(set_pmksa, SET_PMKSA); 2249 CMD(del_pmksa, DEL_PMKSA); 2250 CMD(flush_pmksa, FLUSH_PMKSA); 2251 if (rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL) 2252 CMD(remain_on_channel, REMAIN_ON_CHANNEL); 2253 CMD(set_bitrate_mask, SET_TX_BITRATE_MASK); 2254 CMD(mgmt_tx, FRAME); 2255 CMD(mgmt_tx_cancel_wait, FRAME_WAIT_CANCEL); 2256 if (rdev->wiphy.flags & WIPHY_FLAG_NETNS_OK) { 2257 i++; 2258 if (nla_put_u32(msg, i, NL80211_CMD_SET_WIPHY_NETNS)) 2259 goto nla_put_failure; 2260 } 2261 if (rdev->ops->set_monitor_channel || rdev->ops->start_ap || 2262 rdev->ops->join_mesh) { 2263 i++; 2264 if (nla_put_u32(msg, i, NL80211_CMD_SET_CHANNEL)) 2265 goto nla_put_failure; 2266 } 2267 if (rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) { 2268 CMD(tdls_mgmt, TDLS_MGMT); 2269 CMD(tdls_oper, TDLS_OPER); 2270 } 2271 if (rdev->wiphy.max_sched_scan_reqs) 2272 CMD(sched_scan_start, START_SCHED_SCAN); 2273 CMD(probe_client, PROBE_CLIENT); 2274 CMD(set_noack_map, SET_NOACK_MAP); 2275 if (rdev->wiphy.flags & WIPHY_FLAG_REPORTS_OBSS) { 2276 i++; 2277 if (nla_put_u32(msg, i, NL80211_CMD_REGISTER_BEACONS)) 2278 goto nla_put_failure; 2279 } 2280 CMD(start_p2p_device, START_P2P_DEVICE); 2281 CMD(set_mcast_rate, SET_MCAST_RATE); 2282 #ifdef CONFIG_NL80211_TESTMODE 2283 CMD(testmode_cmd, TESTMODE); 2284 #endif 2285 2286 if (rdev->ops->connect || rdev->ops->auth) { 2287 i++; 2288 if (nla_put_u32(msg, i, NL80211_CMD_CONNECT)) 2289 goto nla_put_failure; 2290 } 2291 2292 if (rdev->ops->disconnect || rdev->ops->deauth) { 2293 i++; 2294 if (nla_put_u32(msg, i, NL80211_CMD_DISCONNECT)) 2295 goto nla_put_failure; 2296 } 2297 2298 return i; 2299 nla_put_failure: 2300 return -ENOBUFS; 2301 } 2302 2303 static int 2304 nl80211_send_pmsr_ftm_capa(const struct cfg80211_pmsr_capabilities *cap, 2305 struct sk_buff *msg) 2306 { 2307 struct nlattr *ftm; 2308 2309 if (!cap->ftm.supported) 2310 return 0; 2311 2312 ftm = nla_nest_start_noflag(msg, NL80211_PMSR_TYPE_FTM); 2313 if (!ftm) 2314 return -ENOBUFS; 2315 2316 if (cap->ftm.asap && nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_ASAP)) 2317 return -ENOBUFS; 2318 if (cap->ftm.non_asap && 2319 nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_NON_ASAP)) 2320 return -ENOBUFS; 2321 if (cap->ftm.request_lci && 2322 nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_REQ_LCI)) 2323 return -ENOBUFS; 2324 if (cap->ftm.request_civicloc && 2325 nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_REQ_CIVICLOC)) 2326 return -ENOBUFS; 2327 if (nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_PREAMBLES, 2328 cap->ftm.preambles)) 2329 return -ENOBUFS; 2330 if (nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_BANDWIDTHS, 2331 cap->ftm.bandwidths)) 2332 return -ENOBUFS; 2333 if (cap->ftm.max_bursts_exponent >= 0 && 2334 nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_MAX_BURSTS_EXPONENT, 2335 cap->ftm.max_bursts_exponent)) 2336 return -ENOBUFS; 2337 if (cap->ftm.max_ftms_per_burst && 2338 nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_MAX_FTMS_PER_BURST, 2339 cap->ftm.max_ftms_per_burst)) 2340 return -ENOBUFS; 2341 if (cap->ftm.trigger_based && 2342 nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_TRIGGER_BASED)) 2343 return -ENOBUFS; 2344 if (cap->ftm.non_trigger_based && 2345 nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_NON_TRIGGER_BASED)) 2346 return -ENOBUFS; 2347 if (cap->ftm.support_6ghz && 2348 nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_6GHZ_SUPPORT)) 2349 return -ENOBUFS; 2350 if (nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_MAX_TX_LTF_REP, 2351 cap->ftm.max_tx_ltf_rep)) 2352 return -ENOBUFS; 2353 if (nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_MAX_RX_LTF_REP, 2354 cap->ftm.max_rx_ltf_rep)) 2355 return -ENOBUFS; 2356 if (nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_MAX_TX_STS, 2357 cap->ftm.max_tx_sts)) 2358 return -ENOBUFS; 2359 if (nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_MAX_RX_STS, 2360 cap->ftm.max_rx_sts)) 2361 return -ENOBUFS; 2362 if (cap->ftm.max_total_ltf_tx > 0 && 2363 nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_MAX_TOTAL_LTF_TX, 2364 cap->ftm.max_total_ltf_tx)) 2365 return -ENOBUFS; 2366 if (cap->ftm.max_total_ltf_rx > 0 && 2367 nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_MAX_TOTAL_LTF_RX, 2368 cap->ftm.max_total_ltf_rx)) 2369 return -ENOBUFS; 2370 if (cap->ftm.support_rsta && 2371 nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_RSTA_SUPPORT)) 2372 return -ENOBUFS; 2373 2374 nla_nest_end(msg, ftm); 2375 return 0; 2376 } 2377 2378 static int nl80211_send_pmsr_capa(struct cfg80211_registered_device *rdev, 2379 struct sk_buff *msg) 2380 { 2381 const struct cfg80211_pmsr_capabilities *cap = rdev->wiphy.pmsr_capa; 2382 struct nlattr *pmsr, *caps; 2383 2384 if (!cap) 2385 return 0; 2386 2387 /* 2388 * we don't need to clean up anything here since the caller 2389 * will genlmsg_cancel() if we fail 2390 */ 2391 2392 pmsr = nla_nest_start_noflag(msg, NL80211_ATTR_PEER_MEASUREMENTS); 2393 if (!pmsr) 2394 return -ENOBUFS; 2395 2396 if (nla_put_u32(msg, NL80211_PMSR_ATTR_MAX_PEERS, cap->max_peers)) 2397 return -ENOBUFS; 2398 2399 if (cap->report_ap_tsf && 2400 nla_put_flag(msg, NL80211_PMSR_ATTR_REPORT_AP_TSF)) 2401 return -ENOBUFS; 2402 2403 if (cap->randomize_mac_addr && 2404 nla_put_flag(msg, NL80211_PMSR_ATTR_RANDOMIZE_MAC_ADDR)) 2405 return -ENOBUFS; 2406 2407 caps = nla_nest_start_noflag(msg, NL80211_PMSR_ATTR_TYPE_CAPA); 2408 if (!caps) 2409 return -ENOBUFS; 2410 2411 if (nl80211_send_pmsr_ftm_capa(cap, msg)) 2412 return -ENOBUFS; 2413 2414 nla_nest_end(msg, caps); 2415 nla_nest_end(msg, pmsr); 2416 2417 return 0; 2418 } 2419 2420 static int 2421 nl80211_put_iftype_akm_suites(struct cfg80211_registered_device *rdev, 2422 struct sk_buff *msg) 2423 { 2424 int i; 2425 struct nlattr *nested, *nested_akms; 2426 const struct wiphy_iftype_akm_suites *iftype_akms; 2427 2428 if (!rdev->wiphy.num_iftype_akm_suites || 2429 !rdev->wiphy.iftype_akm_suites) 2430 return 0; 2431 2432 nested = nla_nest_start(msg, NL80211_ATTR_IFTYPE_AKM_SUITES); 2433 if (!nested) 2434 return -ENOBUFS; 2435 2436 for (i = 0; i < rdev->wiphy.num_iftype_akm_suites; i++) { 2437 nested_akms = nla_nest_start(msg, i + 1); 2438 if (!nested_akms) 2439 return -ENOBUFS; 2440 2441 iftype_akms = &rdev->wiphy.iftype_akm_suites[i]; 2442 2443 if (nl80211_put_iftypes(msg, NL80211_IFTYPE_AKM_ATTR_IFTYPES, 2444 iftype_akms->iftypes_mask)) 2445 return -ENOBUFS; 2446 2447 if (nla_put(msg, NL80211_IFTYPE_AKM_ATTR_SUITES, 2448 sizeof(u32) * iftype_akms->n_akm_suites, 2449 iftype_akms->akm_suites)) { 2450 return -ENOBUFS; 2451 } 2452 nla_nest_end(msg, nested_akms); 2453 } 2454 2455 nla_nest_end(msg, nested); 2456 2457 return 0; 2458 } 2459 2460 static int 2461 nl80211_put_tid_config_support(struct cfg80211_registered_device *rdev, 2462 struct sk_buff *msg) 2463 { 2464 struct nlattr *supp; 2465 2466 if (!rdev->wiphy.tid_config_support.vif && 2467 !rdev->wiphy.tid_config_support.peer) 2468 return 0; 2469 2470 supp = nla_nest_start(msg, NL80211_ATTR_TID_CONFIG); 2471 if (!supp) 2472 return -ENOSPC; 2473 2474 if (rdev->wiphy.tid_config_support.vif && 2475 nla_put_u64_64bit(msg, NL80211_TID_CONFIG_ATTR_VIF_SUPP, 2476 rdev->wiphy.tid_config_support.vif, 2477 NL80211_TID_CONFIG_ATTR_PAD)) 2478 goto fail; 2479 2480 if (rdev->wiphy.tid_config_support.peer && 2481 nla_put_u64_64bit(msg, NL80211_TID_CONFIG_ATTR_PEER_SUPP, 2482 rdev->wiphy.tid_config_support.peer, 2483 NL80211_TID_CONFIG_ATTR_PAD)) 2484 goto fail; 2485 2486 /* for now we just use the same value ... makes more sense */ 2487 if (nla_put_u8(msg, NL80211_TID_CONFIG_ATTR_RETRY_SHORT, 2488 rdev->wiphy.tid_config_support.max_retry)) 2489 goto fail; 2490 if (nla_put_u8(msg, NL80211_TID_CONFIG_ATTR_RETRY_LONG, 2491 rdev->wiphy.tid_config_support.max_retry)) 2492 goto fail; 2493 2494 nla_nest_end(msg, supp); 2495 2496 return 0; 2497 fail: 2498 nla_nest_cancel(msg, supp); 2499 return -ENOBUFS; 2500 } 2501 2502 static int 2503 nl80211_put_sar_specs(struct cfg80211_registered_device *rdev, 2504 struct sk_buff *msg) 2505 { 2506 struct nlattr *sar_capa, *specs, *sub_freq_range; 2507 u8 num_freq_ranges; 2508 int i; 2509 2510 if (!rdev->wiphy.sar_capa) 2511 return 0; 2512 2513 num_freq_ranges = rdev->wiphy.sar_capa->num_freq_ranges; 2514 2515 sar_capa = nla_nest_start(msg, NL80211_ATTR_SAR_SPEC); 2516 if (!sar_capa) 2517 return -ENOSPC; 2518 2519 if (nla_put_u32(msg, NL80211_SAR_ATTR_TYPE, rdev->wiphy.sar_capa->type)) 2520 goto fail; 2521 2522 specs = nla_nest_start(msg, NL80211_SAR_ATTR_SPECS); 2523 if (!specs) 2524 goto fail; 2525 2526 /* report supported freq_ranges */ 2527 for (i = 0; i < num_freq_ranges; i++) { 2528 sub_freq_range = nla_nest_start(msg, i + 1); 2529 if (!sub_freq_range) 2530 goto fail; 2531 2532 if (nla_put_u32(msg, NL80211_SAR_ATTR_SPECS_START_FREQ, 2533 rdev->wiphy.sar_capa->freq_ranges[i].start_freq)) 2534 goto fail; 2535 2536 if (nla_put_u32(msg, NL80211_SAR_ATTR_SPECS_END_FREQ, 2537 rdev->wiphy.sar_capa->freq_ranges[i].end_freq)) 2538 goto fail; 2539 2540 nla_nest_end(msg, sub_freq_range); 2541 } 2542 2543 nla_nest_end(msg, specs); 2544 nla_nest_end(msg, sar_capa); 2545 2546 return 0; 2547 fail: 2548 nla_nest_cancel(msg, sar_capa); 2549 return -ENOBUFS; 2550 } 2551 2552 static int nl80211_put_mbssid_support(struct wiphy *wiphy, struct sk_buff *msg) 2553 { 2554 struct nlattr *config; 2555 2556 if (!wiphy->mbssid_max_interfaces) 2557 return 0; 2558 2559 config = nla_nest_start(msg, NL80211_ATTR_MBSSID_CONFIG); 2560 if (!config) 2561 return -ENOBUFS; 2562 2563 if (nla_put_u8(msg, NL80211_MBSSID_CONFIG_ATTR_MAX_INTERFACES, 2564 wiphy->mbssid_max_interfaces)) 2565 goto fail; 2566 2567 if (wiphy->ema_max_profile_periodicity && 2568 nla_put_u8(msg, 2569 NL80211_MBSSID_CONFIG_ATTR_MAX_EMA_PROFILE_PERIODICITY, 2570 wiphy->ema_max_profile_periodicity)) 2571 goto fail; 2572 2573 nla_nest_end(msg, config); 2574 return 0; 2575 2576 fail: 2577 nla_nest_cancel(msg, config); 2578 return -ENOBUFS; 2579 } 2580 2581 static int nl80211_put_radio(struct wiphy *wiphy, struct sk_buff *msg, int idx) 2582 { 2583 const struct wiphy_radio *r = &wiphy->radio[idx]; 2584 const struct wiphy_radio_cfg *rcfg = &wiphy->radio_cfg[idx]; 2585 struct nlattr *radio, *freq; 2586 int i; 2587 2588 radio = nla_nest_start(msg, idx); 2589 if (!radio) 2590 return -ENOBUFS; 2591 2592 if (nla_put_u32(msg, NL80211_WIPHY_RADIO_ATTR_INDEX, idx)) 2593 goto nla_put_failure; 2594 2595 if (rcfg->rts_threshold && 2596 nla_put_u32(msg, NL80211_WIPHY_RADIO_ATTR_RTS_THRESHOLD, 2597 rcfg->rts_threshold)) 2598 goto nla_put_failure; 2599 2600 if (r->antenna_mask && 2601 nla_put_u32(msg, NL80211_WIPHY_RADIO_ATTR_ANTENNA_MASK, 2602 r->antenna_mask)) 2603 goto nla_put_failure; 2604 2605 for (i = 0; i < r->n_freq_range; i++) { 2606 const struct wiphy_radio_freq_range *range = &r->freq_range[i]; 2607 2608 freq = nla_nest_start(msg, NL80211_WIPHY_RADIO_ATTR_FREQ_RANGE); 2609 if (!freq) 2610 goto nla_put_failure; 2611 2612 if (nla_put_u32(msg, NL80211_WIPHY_RADIO_FREQ_ATTR_START, 2613 range->start_freq) || 2614 nla_put_u32(msg, NL80211_WIPHY_RADIO_FREQ_ATTR_END, 2615 range->end_freq)) 2616 goto nla_put_failure; 2617 2618 nla_nest_end(msg, freq); 2619 } 2620 2621 for (i = 0; i < r->n_iface_combinations; i++) 2622 if (nl80211_put_ifcomb_data(msg, true, 2623 NL80211_WIPHY_RADIO_ATTR_INTERFACE_COMBINATION, 2624 &r->iface_combinations[i], 2625 NLA_F_NESTED)) 2626 goto nla_put_failure; 2627 2628 nla_nest_end(msg, radio); 2629 2630 return 0; 2631 2632 nla_put_failure: 2633 return -ENOBUFS; 2634 } 2635 2636 static int nl80211_put_radios(struct wiphy *wiphy, struct sk_buff *msg) 2637 { 2638 struct nlattr *radios; 2639 int i; 2640 2641 if (!wiphy->n_radio) 2642 return 0; 2643 2644 radios = nla_nest_start(msg, NL80211_ATTR_WIPHY_RADIOS); 2645 if (!radios) 2646 return -ENOBUFS; 2647 2648 for (i = 0; i < wiphy->n_radio; i++) 2649 if (nl80211_put_radio(wiphy, msg, i)) 2650 goto fail; 2651 2652 nla_nest_end(msg, radios); 2653 2654 if (nl80211_put_iface_combinations(wiphy, msg, 2655 NL80211_ATTR_WIPHY_INTERFACE_COMBINATIONS, 2656 -1, true, NLA_F_NESTED)) 2657 return -ENOBUFS; 2658 2659 return 0; 2660 2661 fail: 2662 nla_nest_cancel(msg, radios); 2663 return -ENOBUFS; 2664 } 2665 2666 static int nl80211_put_nan_capa(struct wiphy *wiphy, struct sk_buff *msg) 2667 { 2668 struct nlattr *nan_caps; 2669 2670 nan_caps = nla_nest_start(msg, NL80211_ATTR_NAN_CAPABILITIES); 2671 if (!nan_caps) 2672 return -ENOBUFS; 2673 2674 if (wiphy->nan_capa.flags & WIPHY_NAN_FLAGS_CONFIGURABLE_SYNC && 2675 nla_put_flag(msg, NL80211_NAN_CAPA_CONFIGURABLE_SYNC)) 2676 goto fail; 2677 2678 if ((wiphy->nan_capa.flags & WIPHY_NAN_FLAGS_USERSPACE_DE) && 2679 nla_put_flag(msg, NL80211_NAN_CAPA_USERSPACE_DE)) 2680 goto fail; 2681 2682 if (nla_put_u8(msg, NL80211_NAN_CAPA_OP_MODE, 2683 wiphy->nan_capa.op_mode) || 2684 nla_put_u8(msg, NL80211_NAN_CAPA_NUM_ANTENNAS, 2685 wiphy->nan_capa.n_antennas) || 2686 nla_put_u16(msg, NL80211_NAN_CAPA_MAX_CHANNEL_SWITCH_TIME, 2687 wiphy->nan_capa.max_channel_switch_time) || 2688 nla_put_u8(msg, NL80211_NAN_CAPA_CAPABILITIES, 2689 wiphy->nan_capa.dev_capabilities)) 2690 goto fail; 2691 2692 nla_nest_end(msg, nan_caps); 2693 2694 return 0; 2695 2696 fail: 2697 nla_nest_cancel(msg, nan_caps); 2698 return -ENOBUFS; 2699 } 2700 2701 struct nl80211_dump_wiphy_state { 2702 s64 filter_wiphy; 2703 long start; 2704 long split_start, band_start, chan_start, capa_start; 2705 bool split; 2706 }; 2707 2708 static int nl80211_send_wiphy(struct cfg80211_registered_device *rdev, 2709 enum nl80211_commands cmd, 2710 struct sk_buff *msg, u32 portid, u32 seq, 2711 int flags, struct nl80211_dump_wiphy_state *state) 2712 { 2713 void *hdr; 2714 struct nlattr *nl_bands, *nl_band; 2715 struct nlattr *nl_freqs, *nl_freq; 2716 struct nlattr *nl_cmds; 2717 enum nl80211_band band; 2718 struct ieee80211_channel *chan; 2719 int i; 2720 const struct ieee80211_txrx_stypes *mgmt_stypes = 2721 rdev->wiphy.mgmt_stypes; 2722 u32 features; 2723 2724 hdr = nl80211hdr_put(msg, portid, seq, flags, cmd); 2725 if (!hdr) 2726 return -ENOBUFS; 2727 2728 if (WARN_ON(!state)) 2729 return -EINVAL; 2730 2731 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 2732 nla_put_string(msg, NL80211_ATTR_WIPHY_NAME, 2733 wiphy_name(&rdev->wiphy)) || 2734 nla_put_u32(msg, NL80211_ATTR_GENERATION, 2735 cfg80211_rdev_list_generation)) 2736 goto nla_put_failure; 2737 2738 if (cmd != NL80211_CMD_NEW_WIPHY) 2739 goto finish; 2740 2741 switch (state->split_start) { 2742 case 0: 2743 if (nla_put_u8(msg, NL80211_ATTR_WIPHY_RETRY_SHORT, 2744 rdev->wiphy.retry_short) || 2745 nla_put_u8(msg, NL80211_ATTR_WIPHY_RETRY_LONG, 2746 rdev->wiphy.retry_long) || 2747 nla_put_u32(msg, NL80211_ATTR_WIPHY_FRAG_THRESHOLD, 2748 rdev->wiphy.frag_threshold) || 2749 nla_put_u32(msg, NL80211_ATTR_WIPHY_RTS_THRESHOLD, 2750 rdev->wiphy.rts_threshold) || 2751 nla_put_u8(msg, NL80211_ATTR_WIPHY_COVERAGE_CLASS, 2752 rdev->wiphy.coverage_class) || 2753 nla_put_u8(msg, NL80211_ATTR_MAX_NUM_SCAN_SSIDS, 2754 rdev->wiphy.max_scan_ssids) || 2755 nla_put_u8(msg, NL80211_ATTR_MAX_NUM_SCHED_SCAN_SSIDS, 2756 rdev->wiphy.max_sched_scan_ssids) || 2757 nla_put_u16(msg, NL80211_ATTR_MAX_SCAN_IE_LEN, 2758 rdev->wiphy.max_scan_ie_len) || 2759 nla_put_u16(msg, NL80211_ATTR_MAX_SCHED_SCAN_IE_LEN, 2760 rdev->wiphy.max_sched_scan_ie_len) || 2761 nla_put_u8(msg, NL80211_ATTR_MAX_MATCH_SETS, 2762 rdev->wiphy.max_match_sets)) 2763 goto nla_put_failure; 2764 2765 if ((rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN) && 2766 nla_put_flag(msg, NL80211_ATTR_SUPPORT_IBSS_RSN)) 2767 goto nla_put_failure; 2768 if ((rdev->wiphy.flags & WIPHY_FLAG_MESH_AUTH) && 2769 nla_put_flag(msg, NL80211_ATTR_SUPPORT_MESH_AUTH)) 2770 goto nla_put_failure; 2771 if ((rdev->wiphy.flags & WIPHY_FLAG_AP_UAPSD) && 2772 nla_put_flag(msg, NL80211_ATTR_SUPPORT_AP_UAPSD)) 2773 goto nla_put_failure; 2774 if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_FW_ROAM) && 2775 nla_put_flag(msg, NL80211_ATTR_ROAM_SUPPORT)) 2776 goto nla_put_failure; 2777 if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) && 2778 nla_put_flag(msg, NL80211_ATTR_TDLS_SUPPORT)) 2779 goto nla_put_failure; 2780 if ((rdev->wiphy.flags & WIPHY_FLAG_TDLS_EXTERNAL_SETUP) && 2781 nla_put_flag(msg, NL80211_ATTR_TDLS_EXTERNAL_SETUP)) 2782 goto nla_put_failure; 2783 state->split_start++; 2784 if (state->split) 2785 break; 2786 fallthrough; 2787 case 1: 2788 if (nla_put(msg, NL80211_ATTR_CIPHER_SUITES, 2789 sizeof(u32) * rdev->wiphy.n_cipher_suites, 2790 rdev->wiphy.cipher_suites)) 2791 goto nla_put_failure; 2792 2793 if (nla_put_u8(msg, NL80211_ATTR_MAX_NUM_PMKIDS, 2794 rdev->wiphy.max_num_pmkids)) 2795 goto nla_put_failure; 2796 2797 if ((rdev->wiphy.flags & WIPHY_FLAG_CONTROL_PORT_PROTOCOL) && 2798 nla_put_flag(msg, NL80211_ATTR_CONTROL_PORT_ETHERTYPE)) 2799 goto nla_put_failure; 2800 2801 if (nla_put_u32(msg, NL80211_ATTR_WIPHY_ANTENNA_AVAIL_TX, 2802 rdev->wiphy.available_antennas_tx) || 2803 nla_put_u32(msg, NL80211_ATTR_WIPHY_ANTENNA_AVAIL_RX, 2804 rdev->wiphy.available_antennas_rx)) 2805 goto nla_put_failure; 2806 2807 if ((rdev->wiphy.flags & WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD) && 2808 nla_put_u32(msg, NL80211_ATTR_PROBE_RESP_OFFLOAD, 2809 rdev->wiphy.probe_resp_offload)) 2810 goto nla_put_failure; 2811 2812 if ((rdev->wiphy.available_antennas_tx || 2813 rdev->wiphy.available_antennas_rx) && 2814 rdev->ops->get_antenna) { 2815 u32 tx_ant = 0, rx_ant = 0; 2816 int res; 2817 2818 res = rdev_get_antenna(rdev, -1, &tx_ant, &rx_ant); 2819 if (!res) { 2820 if (nla_put_u32(msg, 2821 NL80211_ATTR_WIPHY_ANTENNA_TX, 2822 tx_ant) || 2823 nla_put_u32(msg, 2824 NL80211_ATTR_WIPHY_ANTENNA_RX, 2825 rx_ant)) 2826 goto nla_put_failure; 2827 } 2828 } 2829 2830 state->split_start++; 2831 if (state->split) 2832 break; 2833 fallthrough; 2834 case 2: 2835 if (nl80211_put_iftypes(msg, NL80211_ATTR_SUPPORTED_IFTYPES, 2836 rdev->wiphy.interface_modes)) 2837 goto nla_put_failure; 2838 state->split_start++; 2839 if (state->split) 2840 break; 2841 fallthrough; 2842 case 3: 2843 nl_bands = nla_nest_start_noflag(msg, 2844 NL80211_ATTR_WIPHY_BANDS); 2845 if (!nl_bands) 2846 goto nla_put_failure; 2847 2848 for (band = state->band_start; 2849 band < (state->split ? 2850 NUM_NL80211_BANDS : 2851 NL80211_BAND_60GHZ + 1); 2852 band++) { 2853 struct ieee80211_supported_band *sband; 2854 2855 /* omit higher bands for ancient software */ 2856 if (band > NL80211_BAND_5GHZ && !state->split) 2857 break; 2858 2859 sband = rdev->wiphy.bands[band]; 2860 2861 if (!sband) 2862 continue; 2863 2864 nl_band = nla_nest_start_noflag(msg, band); 2865 if (!nl_band) 2866 goto nla_put_failure; 2867 2868 switch (state->chan_start) { 2869 case 0: 2870 if (nl80211_send_band_rateinfo(msg, sband, 2871 state->split)) 2872 goto nla_put_failure; 2873 state->chan_start++; 2874 if (state->split) 2875 break; 2876 fallthrough; 2877 default: 2878 /* add frequencies */ 2879 nl_freqs = nla_nest_start_noflag(msg, 2880 NL80211_BAND_ATTR_FREQS); 2881 if (!nl_freqs) 2882 goto nla_put_failure; 2883 2884 for (i = state->chan_start - 1; 2885 i < sband->n_channels; 2886 i++) { 2887 nl_freq = nla_nest_start_noflag(msg, 2888 i); 2889 if (!nl_freq) 2890 goto nla_put_failure; 2891 2892 chan = &sband->channels[i]; 2893 2894 if (nl80211_msg_put_channel( 2895 msg, &rdev->wiphy, chan, 2896 state->split)) 2897 goto nla_put_failure; 2898 2899 nla_nest_end(msg, nl_freq); 2900 if (state->split) 2901 break; 2902 } 2903 if (i < sband->n_channels) 2904 state->chan_start = i + 2; 2905 else 2906 state->chan_start = 0; 2907 nla_nest_end(msg, nl_freqs); 2908 } 2909 2910 nla_nest_end(msg, nl_band); 2911 2912 if (state->split) { 2913 /* start again here */ 2914 if (state->chan_start) 2915 band--; 2916 break; 2917 } 2918 } 2919 nla_nest_end(msg, nl_bands); 2920 2921 if (band < NUM_NL80211_BANDS) 2922 state->band_start = band + 1; 2923 else 2924 state->band_start = 0; 2925 2926 /* if bands & channels are done, continue outside */ 2927 if (state->band_start == 0 && state->chan_start == 0) 2928 state->split_start++; 2929 if (state->split) 2930 break; 2931 fallthrough; 2932 case 4: 2933 nl_cmds = nla_nest_start_noflag(msg, 2934 NL80211_ATTR_SUPPORTED_COMMANDS); 2935 if (!nl_cmds) 2936 goto nla_put_failure; 2937 2938 i = nl80211_add_commands_unsplit(rdev, msg); 2939 if (i < 0) 2940 goto nla_put_failure; 2941 if (state->split) { 2942 CMD(crit_proto_start, CRIT_PROTOCOL_START); 2943 CMD(crit_proto_stop, CRIT_PROTOCOL_STOP); 2944 if (rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH) 2945 CMD(channel_switch, CHANNEL_SWITCH); 2946 CMD(set_qos_map, SET_QOS_MAP); 2947 if (rdev->wiphy.features & 2948 NL80211_FEATURE_SUPPORTS_WMM_ADMISSION) 2949 CMD(add_tx_ts, ADD_TX_TS); 2950 CMD(set_multicast_to_unicast, SET_MULTICAST_TO_UNICAST); 2951 CMD(update_connect_params, UPDATE_CONNECT_PARAMS); 2952 CMD(update_ft_ies, UPDATE_FT_IES); 2953 if (rdev->wiphy.sar_capa) 2954 CMD(set_sar_specs, SET_SAR_SPECS); 2955 CMD(assoc_ml_reconf, ASSOC_MLO_RECONF); 2956 } 2957 #undef CMD 2958 2959 nla_nest_end(msg, nl_cmds); 2960 state->split_start++; 2961 if (state->split) 2962 break; 2963 fallthrough; 2964 case 5: 2965 if (rdev->ops->remain_on_channel && 2966 (rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL) && 2967 nla_put_u32(msg, 2968 NL80211_ATTR_MAX_REMAIN_ON_CHANNEL_DURATION, 2969 rdev->wiphy.max_remain_on_channel_duration)) 2970 goto nla_put_failure; 2971 2972 if ((rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX) && 2973 nla_put_flag(msg, NL80211_ATTR_OFFCHANNEL_TX_OK)) 2974 goto nla_put_failure; 2975 2976 state->split_start++; 2977 if (state->split) 2978 break; 2979 fallthrough; 2980 case 6: 2981 #ifdef CONFIG_PM 2982 if (nl80211_send_wowlan(msg, rdev, state->split)) 2983 goto nla_put_failure; 2984 state->split_start++; 2985 if (state->split) 2986 break; 2987 #else 2988 state->split_start++; 2989 #endif 2990 fallthrough; 2991 case 7: 2992 if (nl80211_put_iftypes(msg, NL80211_ATTR_SOFTWARE_IFTYPES, 2993 rdev->wiphy.software_iftypes)) 2994 goto nla_put_failure; 2995 2996 if (nl80211_put_iface_combinations(&rdev->wiphy, msg, 2997 NL80211_ATTR_INTERFACE_COMBINATIONS, 2998 rdev->wiphy.n_radio ? 0 : -1, 2999 state->split, 0)) 3000 goto nla_put_failure; 3001 3002 state->split_start++; 3003 if (state->split) 3004 break; 3005 fallthrough; 3006 case 8: 3007 if ((rdev->wiphy.flags & WIPHY_FLAG_HAVE_AP_SME) && 3008 nla_put_u32(msg, NL80211_ATTR_DEVICE_AP_SME, 3009 rdev->wiphy.ap_sme_capa)) 3010 goto nla_put_failure; 3011 3012 features = rdev->wiphy.features; 3013 /* 3014 * We can only add the per-channel limit information if the 3015 * dump is split, otherwise it makes it too big. Therefore 3016 * only advertise it in that case. 3017 */ 3018 if (state->split) 3019 features |= NL80211_FEATURE_ADVERTISE_CHAN_LIMITS; 3020 if (nla_put_u32(msg, NL80211_ATTR_FEATURE_FLAGS, features)) 3021 goto nla_put_failure; 3022 3023 if (rdev->wiphy.ht_capa_mod_mask && 3024 nla_put(msg, NL80211_ATTR_HT_CAPABILITY_MASK, 3025 sizeof(*rdev->wiphy.ht_capa_mod_mask), 3026 rdev->wiphy.ht_capa_mod_mask)) 3027 goto nla_put_failure; 3028 3029 if (rdev->wiphy.flags & WIPHY_FLAG_HAVE_AP_SME && 3030 rdev->wiphy.max_acl_mac_addrs && 3031 nla_put_u32(msg, NL80211_ATTR_MAC_ACL_MAX, 3032 rdev->wiphy.max_acl_mac_addrs)) 3033 goto nla_put_failure; 3034 3035 /* 3036 * Any information below this point is only available to 3037 * applications that can deal with it being split. This 3038 * helps ensure that newly added capabilities don't break 3039 * older tools by overrunning their buffers. 3040 * 3041 * We still increment split_start so that in the split 3042 * case we'll continue with more data in the next round, 3043 * but break unconditionally so unsplit data stops here. 3044 */ 3045 if (state->split) 3046 state->split_start++; 3047 else 3048 state->split_start = 0; 3049 break; 3050 case 9: 3051 if (nl80211_send_mgmt_stypes(msg, mgmt_stypes)) 3052 goto nla_put_failure; 3053 3054 if (nla_put_u32(msg, NL80211_ATTR_MAX_NUM_SCHED_SCAN_PLANS, 3055 rdev->wiphy.max_sched_scan_plans) || 3056 nla_put_u32(msg, NL80211_ATTR_MAX_SCAN_PLAN_INTERVAL, 3057 rdev->wiphy.max_sched_scan_plan_interval) || 3058 nla_put_u32(msg, NL80211_ATTR_MAX_SCAN_PLAN_ITERATIONS, 3059 rdev->wiphy.max_sched_scan_plan_iterations)) 3060 goto nla_put_failure; 3061 3062 if (rdev->wiphy.extended_capabilities && 3063 (nla_put(msg, NL80211_ATTR_EXT_CAPA, 3064 rdev->wiphy.extended_capabilities_len, 3065 rdev->wiphy.extended_capabilities) || 3066 nla_put(msg, NL80211_ATTR_EXT_CAPA_MASK, 3067 rdev->wiphy.extended_capabilities_len, 3068 rdev->wiphy.extended_capabilities_mask))) 3069 goto nla_put_failure; 3070 3071 if (rdev->wiphy.vht_capa_mod_mask && 3072 nla_put(msg, NL80211_ATTR_VHT_CAPABILITY_MASK, 3073 sizeof(*rdev->wiphy.vht_capa_mod_mask), 3074 rdev->wiphy.vht_capa_mod_mask)) 3075 goto nla_put_failure; 3076 3077 if (nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, 3078 rdev->wiphy.perm_addr)) 3079 goto nla_put_failure; 3080 3081 if (!is_zero_ether_addr(rdev->wiphy.addr_mask) && 3082 nla_put(msg, NL80211_ATTR_MAC_MASK, ETH_ALEN, 3083 rdev->wiphy.addr_mask)) 3084 goto nla_put_failure; 3085 3086 if (rdev->wiphy.n_addresses > 1) { 3087 void *attr; 3088 3089 attr = nla_nest_start(msg, NL80211_ATTR_MAC_ADDRS); 3090 if (!attr) 3091 goto nla_put_failure; 3092 3093 for (i = 0; i < rdev->wiphy.n_addresses; i++) 3094 if (nla_put(msg, i + 1, ETH_ALEN, 3095 rdev->wiphy.addresses[i].addr)) 3096 goto nla_put_failure; 3097 3098 nla_nest_end(msg, attr); 3099 } 3100 3101 state->split_start++; 3102 break; 3103 case 10: 3104 if (nl80211_send_coalesce(msg, rdev)) 3105 goto nla_put_failure; 3106 3107 if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_5_10_MHZ) && 3108 (nla_put_flag(msg, NL80211_ATTR_SUPPORT_5_MHZ) || 3109 nla_put_flag(msg, NL80211_ATTR_SUPPORT_10_MHZ))) 3110 goto nla_put_failure; 3111 3112 if (rdev->wiphy.max_ap_assoc_sta && 3113 nla_put_u32(msg, NL80211_ATTR_MAX_AP_ASSOC_STA, 3114 rdev->wiphy.max_ap_assoc_sta)) 3115 goto nla_put_failure; 3116 3117 state->split_start++; 3118 break; 3119 case 11: 3120 if (rdev->wiphy.n_vendor_commands) { 3121 const struct nl80211_vendor_cmd_info *info; 3122 struct nlattr *nested; 3123 3124 nested = nla_nest_start_noflag(msg, 3125 NL80211_ATTR_VENDOR_DATA); 3126 if (!nested) 3127 goto nla_put_failure; 3128 3129 for (i = 0; i < rdev->wiphy.n_vendor_commands; i++) { 3130 info = &rdev->wiphy.vendor_commands[i].info; 3131 if (nla_put(msg, i + 1, sizeof(*info), info)) 3132 goto nla_put_failure; 3133 } 3134 nla_nest_end(msg, nested); 3135 } 3136 3137 if (rdev->wiphy.n_vendor_events) { 3138 const struct nl80211_vendor_cmd_info *info; 3139 struct nlattr *nested; 3140 3141 nested = nla_nest_start_noflag(msg, 3142 NL80211_ATTR_VENDOR_EVENTS); 3143 if (!nested) 3144 goto nla_put_failure; 3145 3146 for (i = 0; i < rdev->wiphy.n_vendor_events; i++) { 3147 info = &rdev->wiphy.vendor_events[i]; 3148 if (nla_put(msg, i + 1, sizeof(*info), info)) 3149 goto nla_put_failure; 3150 } 3151 nla_nest_end(msg, nested); 3152 } 3153 state->split_start++; 3154 break; 3155 case 12: 3156 if (rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH && 3157 nla_put_u8(msg, NL80211_ATTR_MAX_CSA_COUNTERS, 3158 rdev->wiphy.max_num_csa_counters)) 3159 goto nla_put_failure; 3160 3161 if (rdev->wiphy.regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED && 3162 nla_put_flag(msg, NL80211_ATTR_WIPHY_SELF_MANAGED_REG)) 3163 goto nla_put_failure; 3164 3165 if (rdev->wiphy.max_sched_scan_reqs && 3166 nla_put_u32(msg, NL80211_ATTR_SCHED_SCAN_MAX_REQS, 3167 rdev->wiphy.max_sched_scan_reqs)) 3168 goto nla_put_failure; 3169 3170 if (nla_put(msg, NL80211_ATTR_EXT_FEATURES, 3171 sizeof(rdev->wiphy.ext_features), 3172 rdev->wiphy.ext_features)) 3173 goto nla_put_failure; 3174 3175 if (rdev->wiphy.bss_param_support) { 3176 struct nlattr *nested; 3177 u32 parsup = rdev->wiphy.bss_param_support; 3178 3179 nested = nla_nest_start(msg, NL80211_ATTR_BSS_PARAM); 3180 if (!nested) 3181 goto nla_put_failure; 3182 3183 if ((parsup & WIPHY_BSS_PARAM_CTS_PROT) && 3184 nla_put_flag(msg, NL80211_ATTR_BSS_CTS_PROT)) 3185 goto nla_put_failure; 3186 if ((parsup & WIPHY_BSS_PARAM_SHORT_PREAMBLE) && 3187 nla_put_flag(msg, NL80211_ATTR_BSS_SHORT_PREAMBLE)) 3188 goto nla_put_failure; 3189 if ((parsup & WIPHY_BSS_PARAM_SHORT_SLOT_TIME) && 3190 nla_put_flag(msg, NL80211_ATTR_BSS_SHORT_SLOT_TIME)) 3191 goto nla_put_failure; 3192 if ((parsup & WIPHY_BSS_PARAM_BASIC_RATES) && 3193 nla_put_flag(msg, NL80211_ATTR_BSS_BASIC_RATES)) 3194 goto nla_put_failure; 3195 if ((parsup & WIPHY_BSS_PARAM_AP_ISOLATE) && 3196 nla_put_flag(msg, NL80211_ATTR_AP_ISOLATE)) 3197 goto nla_put_failure; 3198 if ((parsup & WIPHY_BSS_PARAM_HT_OPMODE) && 3199 nla_put_flag(msg, NL80211_ATTR_BSS_HT_OPMODE)) 3200 goto nla_put_failure; 3201 if ((parsup & WIPHY_BSS_PARAM_P2P_CTWINDOW) && 3202 nla_put_flag(msg, NL80211_ATTR_P2P_CTWINDOW)) 3203 goto nla_put_failure; 3204 if ((parsup & WIPHY_BSS_PARAM_P2P_OPPPS) && 3205 nla_put_flag(msg, NL80211_ATTR_P2P_OPPPS)) 3206 goto nla_put_failure; 3207 nla_nest_end(msg, nested); 3208 } 3209 if (rdev->wiphy.bss_select_support) { 3210 struct nlattr *nested; 3211 u32 bss_select_support = rdev->wiphy.bss_select_support; 3212 3213 nested = nla_nest_start_noflag(msg, 3214 NL80211_ATTR_BSS_SELECT); 3215 if (!nested) 3216 goto nla_put_failure; 3217 3218 i = 0; 3219 while (bss_select_support) { 3220 if ((bss_select_support & 1) && 3221 nla_put_flag(msg, i)) 3222 goto nla_put_failure; 3223 i++; 3224 bss_select_support >>= 1; 3225 } 3226 nla_nest_end(msg, nested); 3227 } 3228 3229 state->split_start++; 3230 break; 3231 case 13: 3232 if (rdev->wiphy.num_iftype_ext_capab && 3233 rdev->wiphy.iftype_ext_capab) { 3234 struct nlattr *nested_ext_capab, *nested; 3235 3236 nested = nla_nest_start_noflag(msg, 3237 NL80211_ATTR_IFTYPE_EXT_CAPA); 3238 if (!nested) 3239 goto nla_put_failure; 3240 3241 for (i = state->capa_start; 3242 i < rdev->wiphy.num_iftype_ext_capab; i++) { 3243 const struct wiphy_iftype_ext_capab *capab; 3244 3245 capab = &rdev->wiphy.iftype_ext_capab[i]; 3246 3247 nested_ext_capab = nla_nest_start_noflag(msg, 3248 i); 3249 if (!nested_ext_capab || 3250 nla_put_u32(msg, NL80211_ATTR_IFTYPE, 3251 capab->iftype) || 3252 nla_put(msg, NL80211_ATTR_EXT_CAPA, 3253 capab->extended_capabilities_len, 3254 capab->extended_capabilities) || 3255 nla_put(msg, NL80211_ATTR_EXT_CAPA_MASK, 3256 capab->extended_capabilities_len, 3257 capab->extended_capabilities_mask)) 3258 goto nla_put_failure; 3259 3260 if (rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_MLO && 3261 (nla_put_u16(msg, 3262 NL80211_ATTR_EML_CAPABILITY, 3263 capab->eml_capabilities) || 3264 nla_put_u16(msg, 3265 NL80211_ATTR_MLD_CAPA_AND_OPS, 3266 capab->mld_capa_and_ops))) 3267 goto nla_put_failure; 3268 3269 nla_nest_end(msg, nested_ext_capab); 3270 if (state->split) 3271 break; 3272 } 3273 nla_nest_end(msg, nested); 3274 if (i < rdev->wiphy.num_iftype_ext_capab) { 3275 state->capa_start = i + 1; 3276 break; 3277 } 3278 } 3279 3280 if (nla_put_u32(msg, NL80211_ATTR_BANDS, 3281 rdev->wiphy.nan_supported_bands)) 3282 goto nla_put_failure; 3283 3284 if (wiphy_ext_feature_isset(&rdev->wiphy, 3285 NL80211_EXT_FEATURE_TXQS)) { 3286 struct cfg80211_txq_stats txqstats = {}; 3287 int res; 3288 3289 res = rdev_get_txq_stats(rdev, NULL, &txqstats); 3290 if (!res && 3291 !nl80211_put_txq_stats(msg, &txqstats, 3292 NL80211_ATTR_TXQ_STATS)) 3293 goto nla_put_failure; 3294 3295 if (nla_put_u32(msg, NL80211_ATTR_TXQ_LIMIT, 3296 rdev->wiphy.txq_limit)) 3297 goto nla_put_failure; 3298 if (nla_put_u32(msg, NL80211_ATTR_TXQ_MEMORY_LIMIT, 3299 rdev->wiphy.txq_memory_limit)) 3300 goto nla_put_failure; 3301 if (nla_put_u32(msg, NL80211_ATTR_TXQ_QUANTUM, 3302 rdev->wiphy.txq_quantum)) 3303 goto nla_put_failure; 3304 } 3305 3306 state->split_start++; 3307 break; 3308 case 14: 3309 if (nl80211_send_pmsr_capa(rdev, msg)) 3310 goto nla_put_failure; 3311 3312 state->split_start++; 3313 break; 3314 case 15: 3315 if (rdev->wiphy.akm_suites && 3316 nla_put(msg, NL80211_ATTR_AKM_SUITES, 3317 sizeof(u32) * rdev->wiphy.n_akm_suites, 3318 rdev->wiphy.akm_suites)) 3319 goto nla_put_failure; 3320 3321 if (nl80211_put_iftype_akm_suites(rdev, msg)) 3322 goto nla_put_failure; 3323 3324 if (nl80211_put_tid_config_support(rdev, msg)) 3325 goto nla_put_failure; 3326 state->split_start++; 3327 break; 3328 case 16: 3329 if (nl80211_put_sar_specs(rdev, msg)) 3330 goto nla_put_failure; 3331 3332 if (nl80211_put_mbssid_support(&rdev->wiphy, msg)) 3333 goto nla_put_failure; 3334 3335 if (nla_put_u16(msg, NL80211_ATTR_MAX_NUM_AKM_SUITES, 3336 rdev->wiphy.max_num_akm_suites)) 3337 goto nla_put_failure; 3338 3339 if (rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_MLO) 3340 nla_put_flag(msg, NL80211_ATTR_MLO_SUPPORT); 3341 3342 if (rdev->wiphy.hw_timestamp_max_peers && 3343 nla_put_u16(msg, NL80211_ATTR_MAX_HW_TIMESTAMP_PEERS, 3344 rdev->wiphy.hw_timestamp_max_peers)) 3345 goto nla_put_failure; 3346 3347 state->split_start++; 3348 break; 3349 case 17: 3350 if (nl80211_put_radios(&rdev->wiphy, msg)) 3351 goto nla_put_failure; 3352 3353 state->split_start++; 3354 break; 3355 case 18: 3356 if (nl80211_put_nan_capa(&rdev->wiphy, msg)) 3357 goto nla_put_failure; 3358 3359 /* done */ 3360 state->split_start = 0; 3361 break; 3362 } 3363 finish: 3364 genlmsg_end(msg, hdr); 3365 return 0; 3366 3367 nla_put_failure: 3368 genlmsg_cancel(msg, hdr); 3369 return -EMSGSIZE; 3370 } 3371 3372 static int nl80211_dump_wiphy_parse(struct sk_buff *skb, 3373 struct netlink_callback *cb, 3374 struct nl80211_dump_wiphy_state *state) 3375 { 3376 struct nlattr **tb = kzalloc_objs(*tb, NUM_NL80211_ATTR); 3377 int ret; 3378 3379 if (!tb) 3380 return -ENOMEM; 3381 3382 ret = nlmsg_parse_deprecated(cb->nlh, 3383 GENL_HDRLEN + nl80211_fam.hdrsize, 3384 tb, nl80211_fam.maxattr, 3385 nl80211_policy, NULL); 3386 /* ignore parse errors for backward compatibility */ 3387 if (ret) { 3388 ret = 0; 3389 goto out; 3390 } 3391 3392 state->split = tb[NL80211_ATTR_SPLIT_WIPHY_DUMP]; 3393 if (tb[NL80211_ATTR_WIPHY]) 3394 state->filter_wiphy = nla_get_u32(tb[NL80211_ATTR_WIPHY]); 3395 if (tb[NL80211_ATTR_WDEV]) 3396 state->filter_wiphy = nla_get_u64(tb[NL80211_ATTR_WDEV]) >> 32; 3397 if (tb[NL80211_ATTR_IFINDEX]) { 3398 struct net_device *netdev; 3399 struct cfg80211_registered_device *rdev; 3400 int ifidx = nla_get_u32(tb[NL80211_ATTR_IFINDEX]); 3401 3402 netdev = __dev_get_by_index(sock_net(skb->sk), ifidx); 3403 if (!netdev) { 3404 ret = -ENODEV; 3405 goto out; 3406 } 3407 if (netdev->ieee80211_ptr) { 3408 rdev = wiphy_to_rdev( 3409 netdev->ieee80211_ptr->wiphy); 3410 state->filter_wiphy = rdev->wiphy_idx; 3411 } 3412 } 3413 3414 ret = 0; 3415 out: 3416 kfree(tb); 3417 return ret; 3418 } 3419 3420 static int nl80211_dump_wiphy(struct sk_buff *skb, struct netlink_callback *cb) 3421 { 3422 int idx = 0, ret; 3423 struct nl80211_dump_wiphy_state *state = (void *)cb->args[0]; 3424 struct cfg80211_registered_device *rdev; 3425 3426 rtnl_lock(); 3427 if (!state) { 3428 state = kzalloc_obj(*state); 3429 if (!state) { 3430 rtnl_unlock(); 3431 return -ENOMEM; 3432 } 3433 state->filter_wiphy = -1; 3434 ret = nl80211_dump_wiphy_parse(skb, cb, state); 3435 if (ret) { 3436 kfree(state); 3437 rtnl_unlock(); 3438 return ret; 3439 } 3440 cb->args[0] = (long)state; 3441 } 3442 3443 for_each_rdev(rdev) { 3444 if (!net_eq(wiphy_net(&rdev->wiphy), sock_net(skb->sk))) 3445 continue; 3446 if (++idx <= state->start) 3447 continue; 3448 if (state->filter_wiphy != -1 && 3449 state->filter_wiphy != rdev->wiphy_idx) 3450 continue; 3451 wiphy_lock(&rdev->wiphy); 3452 /* attempt to fit multiple wiphy data chunks into the skb */ 3453 do { 3454 ret = nl80211_send_wiphy(rdev, NL80211_CMD_NEW_WIPHY, 3455 skb, 3456 NETLINK_CB(cb->skb).portid, 3457 cb->nlh->nlmsg_seq, 3458 NLM_F_MULTI, state); 3459 if (ret < 0) { 3460 /* 3461 * If sending the wiphy data didn't fit (ENOBUFS 3462 * or EMSGSIZE returned), this SKB is still 3463 * empty (so it's not too big because another 3464 * wiphy dataset is already in the skb) and 3465 * we've not tried to adjust the dump allocation 3466 * yet ... then adjust the alloc size to be 3467 * bigger, and return 1 but with the empty skb. 3468 * This results in an empty message being RX'ed 3469 * in userspace, but that is ignored. 3470 * 3471 * We can then retry with the larger buffer. 3472 */ 3473 if ((ret == -ENOBUFS || ret == -EMSGSIZE) && 3474 !skb->len && !state->split && 3475 cb->min_dump_alloc < 4096) { 3476 cb->min_dump_alloc = 4096; 3477 state->split_start = 0; 3478 wiphy_unlock(&rdev->wiphy); 3479 rtnl_unlock(); 3480 return 1; 3481 } 3482 idx--; 3483 break; 3484 } 3485 } while (state->split_start > 0); 3486 wiphy_unlock(&rdev->wiphy); 3487 break; 3488 } 3489 rtnl_unlock(); 3490 3491 state->start = idx; 3492 3493 return skb->len; 3494 } 3495 3496 static int nl80211_dump_wiphy_done(struct netlink_callback *cb) 3497 { 3498 kfree((void *)cb->args[0]); 3499 return 0; 3500 } 3501 3502 static int nl80211_get_wiphy(struct sk_buff *skb, struct genl_info *info) 3503 { 3504 struct sk_buff *msg; 3505 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 3506 struct nl80211_dump_wiphy_state state = {}; 3507 3508 msg = nlmsg_new(4096, GFP_KERNEL); 3509 if (!msg) 3510 return -ENOMEM; 3511 3512 if (nl80211_send_wiphy(rdev, NL80211_CMD_NEW_WIPHY, msg, 3513 info->snd_portid, info->snd_seq, 0, 3514 &state) < 0) { 3515 nlmsg_free(msg); 3516 return -ENOBUFS; 3517 } 3518 3519 return genlmsg_reply(msg, info); 3520 } 3521 3522 static const struct nla_policy txq_params_policy[NL80211_TXQ_ATTR_MAX + 1] = { 3523 [NL80211_TXQ_ATTR_QUEUE] = { .type = NLA_U8 }, 3524 [NL80211_TXQ_ATTR_TXOP] = { .type = NLA_U16 }, 3525 [NL80211_TXQ_ATTR_CWMIN] = { .type = NLA_U16 }, 3526 [NL80211_TXQ_ATTR_CWMAX] = { .type = NLA_U16 }, 3527 [NL80211_TXQ_ATTR_AIFS] = { .type = NLA_U8 }, 3528 }; 3529 3530 static int parse_txq_params(struct nlattr *tb[], 3531 struct ieee80211_txq_params *txq_params) 3532 { 3533 u8 ac; 3534 3535 if (!tb[NL80211_TXQ_ATTR_AC] || !tb[NL80211_TXQ_ATTR_TXOP] || 3536 !tb[NL80211_TXQ_ATTR_CWMIN] || !tb[NL80211_TXQ_ATTR_CWMAX] || 3537 !tb[NL80211_TXQ_ATTR_AIFS]) 3538 return -EINVAL; 3539 3540 ac = nla_get_u8(tb[NL80211_TXQ_ATTR_AC]); 3541 txq_params->txop = nla_get_u16(tb[NL80211_TXQ_ATTR_TXOP]); 3542 txq_params->cwmin = nla_get_u16(tb[NL80211_TXQ_ATTR_CWMIN]); 3543 txq_params->cwmax = nla_get_u16(tb[NL80211_TXQ_ATTR_CWMAX]); 3544 txq_params->aifs = nla_get_u8(tb[NL80211_TXQ_ATTR_AIFS]); 3545 3546 if (ac >= NL80211_NUM_ACS) 3547 return -EINVAL; 3548 txq_params->ac = array_index_nospec(ac, NL80211_NUM_ACS); 3549 return 0; 3550 } 3551 3552 static bool nl80211_can_set_dev_channel(struct wireless_dev *wdev) 3553 { 3554 /* 3555 * You can only set the channel explicitly for some interfaces, 3556 * most have their channel managed via their respective 3557 * "establish a connection" command (connect, join, ...) 3558 * 3559 * For AP/GO and mesh mode, the channel can be set with the 3560 * channel userspace API, but is only stored and passed to the 3561 * low-level driver when the AP starts or the mesh is joined. 3562 * This is for backward compatibility, userspace can also give 3563 * the channel in the start-ap or join-mesh commands instead. 3564 * 3565 * Monitors are special as they are normally slaved to 3566 * whatever else is going on, so they have their own special 3567 * operation to set the monitor channel if possible. 3568 */ 3569 return !wdev || 3570 wdev->iftype == NL80211_IFTYPE_AP || 3571 wdev->iftype == NL80211_IFTYPE_MESH_POINT || 3572 wdev->iftype == NL80211_IFTYPE_MONITOR || 3573 wdev->iftype == NL80211_IFTYPE_P2P_GO; 3574 } 3575 3576 static int _nl80211_parse_chandef(struct cfg80211_registered_device *rdev, 3577 struct netlink_ext_ack *extack, 3578 struct nlattr **attrs, bool monitor, 3579 struct cfg80211_chan_def *chandef) 3580 { 3581 u32 control_freq; 3582 3583 if (!attrs[NL80211_ATTR_WIPHY_FREQ]) { 3584 NL_SET_ERR_MSG_ATTR(extack, attrs[NL80211_ATTR_WIPHY_FREQ], 3585 "Frequency is missing"); 3586 return -EINVAL; 3587 } 3588 3589 control_freq = MHZ_TO_KHZ( 3590 nla_get_u32(attrs[NL80211_ATTR_WIPHY_FREQ])); 3591 if (attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]) 3592 control_freq += 3593 nla_get_u32(attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]); 3594 3595 memset(chandef, 0, sizeof(*chandef)); 3596 chandef->chan = ieee80211_get_channel_khz(&rdev->wiphy, control_freq); 3597 chandef->width = NL80211_CHAN_WIDTH_20_NOHT; 3598 chandef->center_freq1 = KHZ_TO_MHZ(control_freq); 3599 chandef->freq1_offset = control_freq % 1000; 3600 chandef->center_freq2 = 0; 3601 chandef->s1g_primary_2mhz = false; 3602 3603 if (!chandef->chan) { 3604 NL_SET_ERR_MSG_ATTR(extack, attrs[NL80211_ATTR_WIPHY_FREQ], 3605 "Unknown channel"); 3606 return -EINVAL; 3607 } 3608 3609 if (cfg80211_chandef_is_s1g(chandef)) 3610 chandef->width = NL80211_CHAN_WIDTH_1; 3611 3612 if (attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE]) { 3613 enum nl80211_channel_type chantype; 3614 3615 chantype = nla_get_u32(attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE]); 3616 3617 switch (chantype) { 3618 case NL80211_CHAN_NO_HT: 3619 case NL80211_CHAN_HT20: 3620 case NL80211_CHAN_HT40PLUS: 3621 case NL80211_CHAN_HT40MINUS: 3622 cfg80211_chandef_create(chandef, chandef->chan, 3623 chantype); 3624 /* user input for center_freq is incorrect */ 3625 if (attrs[NL80211_ATTR_CENTER_FREQ1] && 3626 chandef->center_freq1 != nla_get_u32(attrs[NL80211_ATTR_CENTER_FREQ1])) { 3627 NL_SET_ERR_MSG_ATTR(extack, 3628 attrs[NL80211_ATTR_CENTER_FREQ1], 3629 "bad center frequency 1"); 3630 return -EINVAL; 3631 } 3632 /* center_freq2 must be zero */ 3633 if (attrs[NL80211_ATTR_CENTER_FREQ2] && 3634 nla_get_u32(attrs[NL80211_ATTR_CENTER_FREQ2])) { 3635 NL_SET_ERR_MSG_ATTR(extack, 3636 attrs[NL80211_ATTR_CENTER_FREQ2], 3637 "center frequency 2 can't be used"); 3638 return -EINVAL; 3639 } 3640 break; 3641 default: 3642 NL_SET_ERR_MSG_ATTR(extack, 3643 attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE], 3644 "invalid channel type"); 3645 return -EINVAL; 3646 } 3647 } else if (attrs[NL80211_ATTR_CHANNEL_WIDTH]) { 3648 chandef->width = nla_get_u32(attrs[NL80211_ATTR_CHANNEL_WIDTH]); 3649 if (attrs[NL80211_ATTR_CENTER_FREQ1]) { 3650 chandef->center_freq1 = 3651 nla_get_u32(attrs[NL80211_ATTR_CENTER_FREQ1]); 3652 chandef->freq1_offset = nla_get_u32_default( 3653 attrs[NL80211_ATTR_CENTER_FREQ1_OFFSET], 0); 3654 } 3655 3656 if (attrs[NL80211_ATTR_CENTER_FREQ2]) 3657 chandef->center_freq2 = 3658 nla_get_u32(attrs[NL80211_ATTR_CENTER_FREQ2]); 3659 3660 chandef->s1g_primary_2mhz = nla_get_flag( 3661 attrs[NL80211_ATTR_S1G_PRIMARY_2MHZ]); 3662 } 3663 3664 if (attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]) { 3665 chandef->edmg.channels = 3666 nla_get_u8(attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]); 3667 3668 if (attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]) 3669 chandef->edmg.bw_config = 3670 nla_get_u8(attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]); 3671 } else { 3672 chandef->edmg.bw_config = 0; 3673 chandef->edmg.channels = 0; 3674 } 3675 3676 if (attrs[NL80211_ATTR_PUNCT_BITMAP]) { 3677 chandef->punctured = 3678 nla_get_u32(attrs[NL80211_ATTR_PUNCT_BITMAP]); 3679 3680 if (chandef->punctured && 3681 !wiphy_ext_feature_isset(&rdev->wiphy, 3682 NL80211_EXT_FEATURE_PUNCT)) { 3683 NL_SET_ERR_MSG_ATTR(extack, 3684 attrs[NL80211_ATTR_WIPHY_FREQ], 3685 "driver doesn't support puncturing"); 3686 return -EINVAL; 3687 } 3688 } 3689 3690 if (!cfg80211_chandef_valid(chandef)) { 3691 NL_SET_ERR_MSG_ATTR(extack, attrs[NL80211_ATTR_WIPHY_FREQ], 3692 "invalid channel definition"); 3693 return -EINVAL; 3694 } 3695 3696 if (!_cfg80211_chandef_usable(&rdev->wiphy, chandef, 3697 IEEE80211_CHAN_DISABLED, 3698 monitor ? IEEE80211_CHAN_CAN_MONITOR : 0)) { 3699 NL_SET_ERR_MSG_ATTR(extack, attrs[NL80211_ATTR_WIPHY_FREQ], 3700 "(extension) channel is disabled"); 3701 return -EINVAL; 3702 } 3703 3704 if ((chandef->width == NL80211_CHAN_WIDTH_5 || 3705 chandef->width == NL80211_CHAN_WIDTH_10) && 3706 !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_5_10_MHZ)) { 3707 NL_SET_ERR_MSG(extack, "5/10 MHz not supported"); 3708 return -EINVAL; 3709 } 3710 3711 return 0; 3712 } 3713 3714 int nl80211_parse_chandef(struct cfg80211_registered_device *rdev, 3715 struct netlink_ext_ack *extack, 3716 struct nlattr **attrs, 3717 struct cfg80211_chan_def *chandef) 3718 { 3719 return _nl80211_parse_chandef(rdev, extack, attrs, false, chandef); 3720 } 3721 3722 static int __nl80211_set_channel(struct cfg80211_registered_device *rdev, 3723 struct net_device *dev, 3724 struct genl_info *info, 3725 int _link_id) 3726 { 3727 struct cfg80211_chan_def chandef; 3728 int result; 3729 enum nl80211_iftype iftype = NL80211_IFTYPE_MONITOR; 3730 struct wireless_dev *wdev = NULL; 3731 int link_id = _link_id; 3732 3733 if (dev) 3734 wdev = dev->ieee80211_ptr; 3735 if (!nl80211_can_set_dev_channel(wdev)) 3736 return -EOPNOTSUPP; 3737 if (wdev) 3738 iftype = wdev->iftype; 3739 3740 if (link_id < 0) { 3741 if (wdev && wdev->valid_links) 3742 return -EINVAL; 3743 link_id = 0; 3744 } 3745 3746 result = _nl80211_parse_chandef(rdev, info->extack, info->attrs, 3747 iftype == NL80211_IFTYPE_MONITOR, 3748 &chandef); 3749 if (result) 3750 return result; 3751 3752 switch (iftype) { 3753 case NL80211_IFTYPE_AP: 3754 case NL80211_IFTYPE_P2P_GO: 3755 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &chandef, 3756 iftype)) 3757 return -EINVAL; 3758 if (wdev->links[link_id].ap.beacon_interval) { 3759 struct ieee80211_channel *cur_chan; 3760 3761 if (!dev || !rdev->ops->set_ap_chanwidth || 3762 !(rdev->wiphy.features & 3763 NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE)) 3764 return -EBUSY; 3765 3766 /* Only allow dynamic channel width changes */ 3767 cur_chan = wdev->links[link_id].ap.chandef.chan; 3768 if (chandef.chan != cur_chan) 3769 return -EBUSY; 3770 3771 /* only allow this for regular channel widths */ 3772 switch (wdev->links[link_id].ap.chandef.width) { 3773 case NL80211_CHAN_WIDTH_20_NOHT: 3774 case NL80211_CHAN_WIDTH_20: 3775 case NL80211_CHAN_WIDTH_40: 3776 case NL80211_CHAN_WIDTH_80: 3777 case NL80211_CHAN_WIDTH_80P80: 3778 case NL80211_CHAN_WIDTH_160: 3779 case NL80211_CHAN_WIDTH_320: 3780 break; 3781 default: 3782 return -EINVAL; 3783 } 3784 3785 switch (chandef.width) { 3786 case NL80211_CHAN_WIDTH_20_NOHT: 3787 case NL80211_CHAN_WIDTH_20: 3788 case NL80211_CHAN_WIDTH_40: 3789 case NL80211_CHAN_WIDTH_80: 3790 case NL80211_CHAN_WIDTH_80P80: 3791 case NL80211_CHAN_WIDTH_160: 3792 case NL80211_CHAN_WIDTH_320: 3793 break; 3794 default: 3795 return -EINVAL; 3796 } 3797 3798 result = rdev_set_ap_chanwidth(rdev, dev, link_id, 3799 &chandef); 3800 if (result) 3801 return result; 3802 wdev->links[link_id].ap.chandef = chandef; 3803 } else { 3804 wdev->u.ap.preset_chandef = chandef; 3805 } 3806 return 0; 3807 case NL80211_IFTYPE_MESH_POINT: 3808 return cfg80211_set_mesh_channel(rdev, wdev, &chandef); 3809 case NL80211_IFTYPE_MONITOR: 3810 return cfg80211_set_monitor_channel(rdev, dev, &chandef); 3811 default: 3812 break; 3813 } 3814 3815 return -EINVAL; 3816 } 3817 3818 static int nl80211_set_channel(struct sk_buff *skb, struct genl_info *info) 3819 { 3820 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 3821 int link_id = nl80211_link_id_or_invalid(info->attrs); 3822 struct net_device *netdev = info->user_ptr[1]; 3823 3824 return __nl80211_set_channel(rdev, netdev, info, link_id); 3825 } 3826 3827 static int nl80211_set_wiphy_radio(struct genl_info *info, 3828 struct cfg80211_registered_device *rdev, 3829 int radio_idx) 3830 { 3831 u32 rts_threshold = 0, old_rts, changed = 0; 3832 int result; 3833 3834 if (!rdev->ops->set_wiphy_params) 3835 return -EOPNOTSUPP; 3836 3837 if (info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]) { 3838 rts_threshold = nla_get_u32( 3839 info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]); 3840 changed |= WIPHY_PARAM_RTS_THRESHOLD; 3841 } 3842 3843 old_rts = rdev->wiphy.radio_cfg[radio_idx].rts_threshold; 3844 3845 rdev->wiphy.radio_cfg[radio_idx].rts_threshold = rts_threshold; 3846 3847 result = rdev_set_wiphy_params(rdev, radio_idx, changed); 3848 if (result) 3849 rdev->wiphy.radio_cfg[radio_idx].rts_threshold = old_rts; 3850 3851 return 0; 3852 } 3853 3854 static int nl80211_set_wiphy(struct sk_buff *skb, struct genl_info *info) 3855 { 3856 struct cfg80211_registered_device *rdev = NULL; 3857 struct net_device *netdev = NULL; 3858 struct wireless_dev *wdev; 3859 int result = 0, rem_txq_params = 0; 3860 struct nlattr *nl_txq_params; 3861 u32 changed; 3862 u8 retry_short = 0, retry_long = 0; 3863 u32 frag_threshold = 0, rts_threshold = 0; 3864 u8 coverage_class = 0; 3865 u32 txq_limit = 0, txq_memory_limit = 0, txq_quantum = 0; 3866 int radio_idx = -1; 3867 3868 rtnl_lock(); 3869 /* 3870 * Try to find the wiphy and netdev. Normally this 3871 * function shouldn't need the netdev, but this is 3872 * done for backward compatibility -- previously 3873 * setting the channel was done per wiphy, but now 3874 * it is per netdev. Previous userland like hostapd 3875 * also passed a netdev to set_wiphy, so that it is 3876 * possible to let that go to the right netdev! 3877 */ 3878 3879 if (info->attrs[NL80211_ATTR_IFINDEX]) { 3880 int ifindex = nla_get_u32(info->attrs[NL80211_ATTR_IFINDEX]); 3881 3882 netdev = __dev_get_by_index(genl_info_net(info), ifindex); 3883 if (netdev && netdev->ieee80211_ptr) 3884 rdev = wiphy_to_rdev(netdev->ieee80211_ptr->wiphy); 3885 else 3886 netdev = NULL; 3887 } 3888 3889 if (!netdev) { 3890 rdev = __cfg80211_rdev_from_attrs(genl_info_net(info), 3891 info->attrs); 3892 if (IS_ERR(rdev)) { 3893 rtnl_unlock(); 3894 return PTR_ERR(rdev); 3895 } 3896 wdev = NULL; 3897 netdev = NULL; 3898 result = 0; 3899 } else 3900 wdev = netdev->ieee80211_ptr; 3901 3902 guard(wiphy)(&rdev->wiphy); 3903 3904 /* 3905 * end workaround code, by now the rdev is available 3906 * and locked, and wdev may or may not be NULL. 3907 */ 3908 3909 if (info->attrs[NL80211_ATTR_WIPHY_NAME]) 3910 result = cfg80211_dev_rename( 3911 rdev, nla_data(info->attrs[NL80211_ATTR_WIPHY_NAME])); 3912 rtnl_unlock(); 3913 3914 if (result) 3915 return result; 3916 3917 if (info->attrs[NL80211_ATTR_WIPHY_RADIO_INDEX]) { 3918 /* Radio idx is not expected for non-multi radio wiphy */ 3919 if (rdev->wiphy.n_radio <= 0) 3920 return -EINVAL; 3921 3922 radio_idx = nla_get_u8( 3923 info->attrs[NL80211_ATTR_WIPHY_RADIO_INDEX]); 3924 if (radio_idx >= rdev->wiphy.n_radio) 3925 return -EINVAL; 3926 3927 return nl80211_set_wiphy_radio(info, rdev, radio_idx); 3928 } 3929 3930 if (info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS]) { 3931 struct ieee80211_txq_params txq_params; 3932 struct nlattr *tb[NL80211_TXQ_ATTR_MAX + 1]; 3933 3934 if (!rdev->ops->set_txq_params) 3935 return -EOPNOTSUPP; 3936 3937 if (!netdev) 3938 return -EINVAL; 3939 3940 if (netdev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 3941 netdev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 3942 return -EINVAL; 3943 3944 if (!netif_running(netdev)) 3945 return -ENETDOWN; 3946 3947 nla_for_each_nested(nl_txq_params, 3948 info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS], 3949 rem_txq_params) { 3950 result = nla_parse_nested_deprecated(tb, 3951 NL80211_TXQ_ATTR_MAX, 3952 nl_txq_params, 3953 txq_params_policy, 3954 info->extack); 3955 if (result) 3956 return result; 3957 3958 result = parse_txq_params(tb, &txq_params); 3959 if (result) 3960 return result; 3961 3962 txq_params.link_id = 3963 nl80211_link_id_or_invalid(info->attrs); 3964 3965 if (txq_params.link_id >= 0 && 3966 !(netdev->ieee80211_ptr->valid_links & 3967 BIT(txq_params.link_id))) 3968 result = -ENOLINK; 3969 else if (txq_params.link_id >= 0 && 3970 !netdev->ieee80211_ptr->valid_links) 3971 result = -EINVAL; 3972 else 3973 result = rdev_set_txq_params(rdev, netdev, 3974 &txq_params); 3975 if (result) 3976 return result; 3977 } 3978 } 3979 3980 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { 3981 int link_id = nl80211_link_id_or_invalid(info->attrs); 3982 3983 if (wdev) { 3984 result = __nl80211_set_channel( 3985 rdev, 3986 nl80211_can_set_dev_channel(wdev) ? netdev : NULL, 3987 info, link_id); 3988 } else { 3989 result = __nl80211_set_channel(rdev, netdev, info, link_id); 3990 } 3991 3992 if (result) 3993 return result; 3994 } 3995 3996 if (info->attrs[NL80211_ATTR_WIPHY_TX_POWER_SETTING]) { 3997 struct wireless_dev *txp_wdev = wdev; 3998 enum nl80211_tx_power_setting type; 3999 int idx, mbm = 0; 4000 4001 if (!(rdev->wiphy.features & NL80211_FEATURE_VIF_TXPOWER)) 4002 txp_wdev = NULL; 4003 4004 if (!rdev->ops->set_tx_power) 4005 return -EOPNOTSUPP; 4006 4007 idx = NL80211_ATTR_WIPHY_TX_POWER_SETTING; 4008 type = nla_get_u32(info->attrs[idx]); 4009 4010 if (!info->attrs[NL80211_ATTR_WIPHY_TX_POWER_LEVEL] && 4011 (type != NL80211_TX_POWER_AUTOMATIC)) 4012 return -EINVAL; 4013 4014 if (type != NL80211_TX_POWER_AUTOMATIC) { 4015 idx = NL80211_ATTR_WIPHY_TX_POWER_LEVEL; 4016 mbm = nla_get_u32(info->attrs[idx]); 4017 } 4018 4019 result = rdev_set_tx_power(rdev, txp_wdev, radio_idx, type, 4020 mbm); 4021 if (result) 4022 return result; 4023 } 4024 4025 if (info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX] && 4026 info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]) { 4027 u32 tx_ant, rx_ant; 4028 4029 if ((!rdev->wiphy.available_antennas_tx && 4030 !rdev->wiphy.available_antennas_rx) || 4031 !rdev->ops->set_antenna) 4032 return -EOPNOTSUPP; 4033 4034 tx_ant = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX]); 4035 rx_ant = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]); 4036 4037 /* reject antenna configurations which don't match the 4038 * available antenna masks, except for the "all" mask */ 4039 if ((~tx_ant && (tx_ant & ~rdev->wiphy.available_antennas_tx)) || 4040 (~rx_ant && (rx_ant & ~rdev->wiphy.available_antennas_rx))) 4041 return -EINVAL; 4042 4043 tx_ant = tx_ant & rdev->wiphy.available_antennas_tx; 4044 rx_ant = rx_ant & rdev->wiphy.available_antennas_rx; 4045 4046 result = rdev_set_antenna(rdev, radio_idx, tx_ant, rx_ant); 4047 if (result) 4048 return result; 4049 } 4050 4051 changed = 0; 4052 4053 if (info->attrs[NL80211_ATTR_WIPHY_RETRY_SHORT]) { 4054 retry_short = nla_get_u8( 4055 info->attrs[NL80211_ATTR_WIPHY_RETRY_SHORT]); 4056 4057 changed |= WIPHY_PARAM_RETRY_SHORT; 4058 } 4059 4060 if (info->attrs[NL80211_ATTR_WIPHY_RETRY_LONG]) { 4061 retry_long = nla_get_u8( 4062 info->attrs[NL80211_ATTR_WIPHY_RETRY_LONG]); 4063 4064 changed |= WIPHY_PARAM_RETRY_LONG; 4065 } 4066 4067 if (info->attrs[NL80211_ATTR_WIPHY_FRAG_THRESHOLD]) { 4068 frag_threshold = nla_get_u32( 4069 info->attrs[NL80211_ATTR_WIPHY_FRAG_THRESHOLD]); 4070 if (frag_threshold < 256) 4071 return -EINVAL; 4072 4073 if (frag_threshold != (u32) -1) { 4074 /* 4075 * Fragments (apart from the last one) are required to 4076 * have even length. Make the fragmentation code 4077 * simpler by stripping LSB should someone try to use 4078 * odd threshold value. 4079 */ 4080 frag_threshold &= ~0x1; 4081 } 4082 changed |= WIPHY_PARAM_FRAG_THRESHOLD; 4083 } 4084 4085 if (info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]) { 4086 rts_threshold = nla_get_u32( 4087 info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]); 4088 changed |= WIPHY_PARAM_RTS_THRESHOLD; 4089 } 4090 4091 if (info->attrs[NL80211_ATTR_WIPHY_COVERAGE_CLASS]) { 4092 if (info->attrs[NL80211_ATTR_WIPHY_DYN_ACK]) 4093 return -EINVAL; 4094 4095 coverage_class = nla_get_u8( 4096 info->attrs[NL80211_ATTR_WIPHY_COVERAGE_CLASS]); 4097 changed |= WIPHY_PARAM_COVERAGE_CLASS; 4098 } 4099 4100 if (info->attrs[NL80211_ATTR_WIPHY_DYN_ACK]) { 4101 if (!(rdev->wiphy.features & NL80211_FEATURE_ACKTO_ESTIMATION)) 4102 return -EOPNOTSUPP; 4103 4104 changed |= WIPHY_PARAM_DYN_ACK; 4105 } 4106 4107 if (info->attrs[NL80211_ATTR_TXQ_LIMIT]) { 4108 if (!wiphy_ext_feature_isset(&rdev->wiphy, 4109 NL80211_EXT_FEATURE_TXQS)) 4110 return -EOPNOTSUPP; 4111 4112 txq_limit = nla_get_u32( 4113 info->attrs[NL80211_ATTR_TXQ_LIMIT]); 4114 changed |= WIPHY_PARAM_TXQ_LIMIT; 4115 } 4116 4117 if (info->attrs[NL80211_ATTR_TXQ_MEMORY_LIMIT]) { 4118 if (!wiphy_ext_feature_isset(&rdev->wiphy, 4119 NL80211_EXT_FEATURE_TXQS)) 4120 return -EOPNOTSUPP; 4121 4122 txq_memory_limit = nla_get_u32( 4123 info->attrs[NL80211_ATTR_TXQ_MEMORY_LIMIT]); 4124 changed |= WIPHY_PARAM_TXQ_MEMORY_LIMIT; 4125 } 4126 4127 if (info->attrs[NL80211_ATTR_TXQ_QUANTUM]) { 4128 if (!wiphy_ext_feature_isset(&rdev->wiphy, 4129 NL80211_EXT_FEATURE_TXQS)) 4130 return -EOPNOTSUPP; 4131 4132 txq_quantum = nla_get_u32( 4133 info->attrs[NL80211_ATTR_TXQ_QUANTUM]); 4134 changed |= WIPHY_PARAM_TXQ_QUANTUM; 4135 } 4136 4137 if (changed) { 4138 u8 old_retry_short, old_retry_long; 4139 u32 old_frag_threshold, old_rts_threshold; 4140 u8 old_coverage_class, i; 4141 u32 old_txq_limit, old_txq_memory_limit, old_txq_quantum; 4142 u32 *old_radio_rts_threshold = NULL; 4143 4144 if (!rdev->ops->set_wiphy_params) 4145 return -EOPNOTSUPP; 4146 4147 if (rdev->wiphy.n_radio) { 4148 old_radio_rts_threshold = kcalloc(rdev->wiphy.n_radio, 4149 sizeof(u32), 4150 GFP_KERNEL); 4151 if (!old_radio_rts_threshold) 4152 return -ENOMEM; 4153 } 4154 4155 old_retry_short = rdev->wiphy.retry_short; 4156 old_retry_long = rdev->wiphy.retry_long; 4157 old_frag_threshold = rdev->wiphy.frag_threshold; 4158 old_rts_threshold = rdev->wiphy.rts_threshold; 4159 if (old_radio_rts_threshold) { 4160 for (i = 0 ; i < rdev->wiphy.n_radio; i++) 4161 old_radio_rts_threshold[i] = 4162 rdev->wiphy.radio_cfg[i].rts_threshold; 4163 } 4164 old_coverage_class = rdev->wiphy.coverage_class; 4165 old_txq_limit = rdev->wiphy.txq_limit; 4166 old_txq_memory_limit = rdev->wiphy.txq_memory_limit; 4167 old_txq_quantum = rdev->wiphy.txq_quantum; 4168 4169 if (changed & WIPHY_PARAM_RETRY_SHORT) 4170 rdev->wiphy.retry_short = retry_short; 4171 if (changed & WIPHY_PARAM_RETRY_LONG) 4172 rdev->wiphy.retry_long = retry_long; 4173 if (changed & WIPHY_PARAM_FRAG_THRESHOLD) 4174 rdev->wiphy.frag_threshold = frag_threshold; 4175 if ((changed & WIPHY_PARAM_RTS_THRESHOLD) && 4176 old_radio_rts_threshold) { 4177 rdev->wiphy.rts_threshold = rts_threshold; 4178 for (i = 0 ; i < rdev->wiphy.n_radio; i++) 4179 rdev->wiphy.radio_cfg[i].rts_threshold = 4180 rdev->wiphy.rts_threshold; 4181 } 4182 if (changed & WIPHY_PARAM_COVERAGE_CLASS) 4183 rdev->wiphy.coverage_class = coverage_class; 4184 if (changed & WIPHY_PARAM_TXQ_LIMIT) 4185 rdev->wiphy.txq_limit = txq_limit; 4186 if (changed & WIPHY_PARAM_TXQ_MEMORY_LIMIT) 4187 rdev->wiphy.txq_memory_limit = txq_memory_limit; 4188 if (changed & WIPHY_PARAM_TXQ_QUANTUM) 4189 rdev->wiphy.txq_quantum = txq_quantum; 4190 4191 result = rdev_set_wiphy_params(rdev, radio_idx, changed); 4192 if (result) { 4193 rdev->wiphy.retry_short = old_retry_short; 4194 rdev->wiphy.retry_long = old_retry_long; 4195 rdev->wiphy.frag_threshold = old_frag_threshold; 4196 rdev->wiphy.rts_threshold = old_rts_threshold; 4197 if (old_radio_rts_threshold) { 4198 for (i = 0 ; i < rdev->wiphy.n_radio; i++) 4199 rdev->wiphy.radio_cfg[i].rts_threshold = 4200 old_radio_rts_threshold[i]; 4201 } 4202 rdev->wiphy.coverage_class = old_coverage_class; 4203 rdev->wiphy.txq_limit = old_txq_limit; 4204 rdev->wiphy.txq_memory_limit = old_txq_memory_limit; 4205 rdev->wiphy.txq_quantum = old_txq_quantum; 4206 } 4207 4208 kfree(old_radio_rts_threshold); 4209 return result; 4210 } 4211 4212 return 0; 4213 } 4214 4215 int nl80211_send_chandef(struct sk_buff *msg, const struct cfg80211_chan_def *chandef) 4216 { 4217 if (WARN_ON(!cfg80211_chandef_valid(chandef))) 4218 return -EINVAL; 4219 4220 if (nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, 4221 chandef->chan->center_freq)) 4222 return -ENOBUFS; 4223 if (nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ_OFFSET, 4224 chandef->chan->freq_offset)) 4225 return -ENOBUFS; 4226 switch (chandef->width) { 4227 case NL80211_CHAN_WIDTH_20_NOHT: 4228 case NL80211_CHAN_WIDTH_20: 4229 case NL80211_CHAN_WIDTH_40: 4230 if (nla_put_u32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE, 4231 cfg80211_get_chandef_type(chandef))) 4232 return -ENOBUFS; 4233 break; 4234 default: 4235 break; 4236 } 4237 if (nla_put_u32(msg, NL80211_ATTR_CHANNEL_WIDTH, chandef->width)) 4238 return -ENOBUFS; 4239 if (nla_put_u32(msg, NL80211_ATTR_CENTER_FREQ1, chandef->center_freq1)) 4240 return -ENOBUFS; 4241 if (chandef->center_freq2 && 4242 nla_put_u32(msg, NL80211_ATTR_CENTER_FREQ2, chandef->center_freq2)) 4243 return -ENOBUFS; 4244 if (chandef->punctured && 4245 nla_put_u32(msg, NL80211_ATTR_PUNCT_BITMAP, chandef->punctured)) 4246 return -ENOBUFS; 4247 if (chandef->s1g_primary_2mhz && 4248 nla_put_flag(msg, NL80211_ATTR_S1G_PRIMARY_2MHZ)) 4249 return -ENOBUFS; 4250 4251 return 0; 4252 } 4253 EXPORT_SYMBOL(nl80211_send_chandef); 4254 4255 static int nl80211_send_iface(struct sk_buff *msg, u32 portid, u32 seq, int flags, 4256 struct cfg80211_registered_device *rdev, 4257 struct wireless_dev *wdev, 4258 enum nl80211_commands cmd) 4259 { 4260 struct net_device *dev = wdev->netdev; 4261 void *hdr; 4262 4263 lockdep_assert_wiphy(&rdev->wiphy); 4264 4265 WARN_ON(cmd != NL80211_CMD_NEW_INTERFACE && 4266 cmd != NL80211_CMD_DEL_INTERFACE && 4267 cmd != NL80211_CMD_SET_INTERFACE); 4268 4269 hdr = nl80211hdr_put(msg, portid, seq, flags, cmd); 4270 if (!hdr) 4271 return -1; 4272 4273 if (dev && 4274 (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 4275 nla_put_string(msg, NL80211_ATTR_IFNAME, dev->name))) 4276 goto nla_put_failure; 4277 4278 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 4279 nla_put_u32(msg, NL80211_ATTR_IFTYPE, wdev->iftype) || 4280 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 4281 NL80211_ATTR_PAD) || 4282 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, wdev_address(wdev)) || 4283 nla_put_u32(msg, NL80211_ATTR_GENERATION, 4284 rdev->devlist_generation ^ 4285 (cfg80211_rdev_list_generation << 2)) || 4286 nla_put_u8(msg, NL80211_ATTR_4ADDR, wdev->use_4addr) || 4287 nla_put_u32(msg, NL80211_ATTR_VIF_RADIO_MASK, wdev->radio_mask)) 4288 goto nla_put_failure; 4289 4290 if (rdev->ops->get_channel && !wdev->valid_links) { 4291 struct cfg80211_chan_def chandef = {}; 4292 int ret; 4293 4294 ret = rdev_get_channel(rdev, wdev, 0, &chandef); 4295 if (ret == 0 && nl80211_send_chandef(msg, &chandef)) 4296 goto nla_put_failure; 4297 } 4298 4299 if (rdev->ops->get_tx_power && !wdev->valid_links) { 4300 int dbm, ret; 4301 4302 ret = rdev_get_tx_power(rdev, wdev, -1, 0, &dbm); 4303 if (ret == 0 && 4304 nla_put_u32(msg, NL80211_ATTR_WIPHY_TX_POWER_LEVEL, 4305 DBM_TO_MBM(dbm))) 4306 goto nla_put_failure; 4307 } 4308 4309 switch (wdev->iftype) { 4310 case NL80211_IFTYPE_AP: 4311 case NL80211_IFTYPE_P2P_GO: 4312 if (wdev->u.ap.ssid_len && 4313 nla_put(msg, NL80211_ATTR_SSID, wdev->u.ap.ssid_len, 4314 wdev->u.ap.ssid)) 4315 goto nla_put_failure; 4316 break; 4317 case NL80211_IFTYPE_STATION: 4318 case NL80211_IFTYPE_P2P_CLIENT: 4319 if (wdev->u.client.ssid_len && 4320 nla_put(msg, NL80211_ATTR_SSID, wdev->u.client.ssid_len, 4321 wdev->u.client.ssid)) 4322 goto nla_put_failure; 4323 break; 4324 case NL80211_IFTYPE_ADHOC: 4325 if (wdev->u.ibss.ssid_len && 4326 nla_put(msg, NL80211_ATTR_SSID, wdev->u.ibss.ssid_len, 4327 wdev->u.ibss.ssid)) 4328 goto nla_put_failure; 4329 break; 4330 default: 4331 /* nothing */ 4332 break; 4333 } 4334 4335 if (rdev->ops->get_txq_stats) { 4336 struct cfg80211_txq_stats txqstats = {}; 4337 int ret = rdev_get_txq_stats(rdev, wdev, &txqstats); 4338 4339 if (ret == 0 && 4340 !nl80211_put_txq_stats(msg, &txqstats, 4341 NL80211_ATTR_TXQ_STATS)) 4342 goto nla_put_failure; 4343 } 4344 4345 if (wdev->valid_links) { 4346 unsigned int link_id; 4347 struct nlattr *links = nla_nest_start(msg, 4348 NL80211_ATTR_MLO_LINKS); 4349 4350 if (!links) 4351 goto nla_put_failure; 4352 4353 for_each_valid_link(wdev, link_id) { 4354 struct nlattr *link = nla_nest_start(msg, link_id + 1); 4355 struct cfg80211_chan_def chandef = {}; 4356 int ret; 4357 4358 if (!link) 4359 goto nla_put_failure; 4360 4361 if (nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link_id)) 4362 goto nla_put_failure; 4363 if (nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, 4364 wdev->links[link_id].addr)) 4365 goto nla_put_failure; 4366 4367 ret = rdev_get_channel(rdev, wdev, link_id, &chandef); 4368 if (ret == 0 && nl80211_send_chandef(msg, &chandef)) 4369 goto nla_put_failure; 4370 4371 if (rdev->ops->get_tx_power) { 4372 int dbm, ret; 4373 4374 ret = rdev_get_tx_power(rdev, wdev, -1, link_id, &dbm); 4375 if (ret == 0 && 4376 nla_put_u32(msg, NL80211_ATTR_WIPHY_TX_POWER_LEVEL, 4377 DBM_TO_MBM(dbm))) 4378 goto nla_put_failure; 4379 } 4380 nla_nest_end(msg, link); 4381 } 4382 4383 nla_nest_end(msg, links); 4384 } 4385 4386 genlmsg_end(msg, hdr); 4387 return 0; 4388 4389 nla_put_failure: 4390 genlmsg_cancel(msg, hdr); 4391 return -EMSGSIZE; 4392 } 4393 4394 static int nl80211_dump_interface(struct sk_buff *skb, struct netlink_callback *cb) 4395 { 4396 int wp_idx = 0; 4397 int if_idx = 0; 4398 int wp_start = cb->args[0]; 4399 int if_start = cb->args[1]; 4400 int filter_wiphy = -1; 4401 struct cfg80211_registered_device *rdev; 4402 struct wireless_dev *wdev; 4403 int ret; 4404 4405 rtnl_lock(); 4406 if (!cb->args[2]) { 4407 struct nl80211_dump_wiphy_state state = { 4408 .filter_wiphy = -1, 4409 }; 4410 4411 ret = nl80211_dump_wiphy_parse(skb, cb, &state); 4412 if (ret) 4413 goto out_unlock; 4414 4415 filter_wiphy = state.filter_wiphy; 4416 4417 /* 4418 * if filtering, set cb->args[2] to +1 since 0 is the default 4419 * value needed to determine that parsing is necessary. 4420 */ 4421 if (filter_wiphy >= 0) 4422 cb->args[2] = filter_wiphy + 1; 4423 else 4424 cb->args[2] = -1; 4425 } else if (cb->args[2] > 0) { 4426 filter_wiphy = cb->args[2] - 1; 4427 } 4428 4429 for_each_rdev(rdev) { 4430 if (!net_eq(wiphy_net(&rdev->wiphy), sock_net(skb->sk))) 4431 continue; 4432 if (wp_idx < wp_start) { 4433 wp_idx++; 4434 continue; 4435 } 4436 4437 if (filter_wiphy >= 0 && filter_wiphy != rdev->wiphy_idx) 4438 continue; 4439 4440 if_idx = 0; 4441 4442 guard(wiphy)(&rdev->wiphy); 4443 4444 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) { 4445 if (if_idx < if_start) { 4446 if_idx++; 4447 continue; 4448 } 4449 4450 if (nl80211_send_iface(skb, NETLINK_CB(cb->skb).portid, 4451 cb->nlh->nlmsg_seq, NLM_F_MULTI, 4452 rdev, wdev, 4453 NL80211_CMD_NEW_INTERFACE) < 0) 4454 goto out; 4455 4456 if_idx++; 4457 } 4458 4459 if_start = 0; 4460 wp_idx++; 4461 } 4462 out: 4463 cb->args[0] = wp_idx; 4464 cb->args[1] = if_idx; 4465 4466 ret = skb->len; 4467 out_unlock: 4468 rtnl_unlock(); 4469 4470 return ret; 4471 } 4472 4473 static int nl80211_get_interface(struct sk_buff *skb, struct genl_info *info) 4474 { 4475 struct sk_buff *msg; 4476 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 4477 struct wireless_dev *wdev = info->user_ptr[1]; 4478 4479 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 4480 if (!msg) 4481 return -ENOMEM; 4482 4483 if (nl80211_send_iface(msg, info->snd_portid, info->snd_seq, 0, 4484 rdev, wdev, NL80211_CMD_NEW_INTERFACE) < 0) { 4485 nlmsg_free(msg); 4486 return -ENOBUFS; 4487 } 4488 4489 return genlmsg_reply(msg, info); 4490 } 4491 4492 static const struct nla_policy mntr_flags_policy[NL80211_MNTR_FLAG_MAX + 1] = { 4493 [NL80211_MNTR_FLAG_FCSFAIL] = { .type = NLA_FLAG }, 4494 [NL80211_MNTR_FLAG_PLCPFAIL] = { .type = NLA_FLAG }, 4495 [NL80211_MNTR_FLAG_CONTROL] = { .type = NLA_FLAG }, 4496 [NL80211_MNTR_FLAG_OTHER_BSS] = { .type = NLA_FLAG }, 4497 [NL80211_MNTR_FLAG_COOK_FRAMES] = { .type = NLA_FLAG }, 4498 [NL80211_MNTR_FLAG_ACTIVE] = { .type = NLA_FLAG }, 4499 [NL80211_MNTR_FLAG_SKIP_TX] = { .type = NLA_FLAG }, 4500 }; 4501 4502 static int parse_monitor_flags(struct nlattr *nla, u32 *mntrflags) 4503 { 4504 struct nlattr *flags[NL80211_MNTR_FLAG_MAX + 1]; 4505 int flag; 4506 4507 *mntrflags = 0; 4508 4509 if (!nla) 4510 return -EINVAL; 4511 4512 if (nla_parse_nested_deprecated(flags, NL80211_MNTR_FLAG_MAX, nla, mntr_flags_policy, NULL)) 4513 return -EINVAL; 4514 4515 for (flag = 1; flag <= NL80211_MNTR_FLAG_MAX; flag++) 4516 if (flags[flag]) 4517 *mntrflags |= (1<<flag); 4518 4519 /* cooked monitor mode is incompatible with other modes */ 4520 if (*mntrflags & MONITOR_FLAG_COOK_FRAMES && 4521 *mntrflags != MONITOR_FLAG_COOK_FRAMES) 4522 return -EOPNOTSUPP; 4523 4524 *mntrflags |= MONITOR_FLAG_CHANGED; 4525 4526 return 0; 4527 } 4528 4529 static int nl80211_parse_mon_options(struct cfg80211_registered_device *rdev, 4530 enum nl80211_iftype type, 4531 struct genl_info *info, 4532 struct vif_params *params) 4533 { 4534 bool change = false; 4535 int err; 4536 4537 if (info->attrs[NL80211_ATTR_MNTR_FLAGS]) { 4538 if (type != NL80211_IFTYPE_MONITOR) 4539 return -EINVAL; 4540 4541 err = parse_monitor_flags(info->attrs[NL80211_ATTR_MNTR_FLAGS], 4542 ¶ms->flags); 4543 if (err) 4544 return err; 4545 4546 change = true; 4547 } 4548 4549 /* MONITOR_FLAG_COOK_FRAMES is deprecated, refuse cooperation */ 4550 if (params->flags & MONITOR_FLAG_COOK_FRAMES) 4551 return -EOPNOTSUPP; 4552 4553 if (params->flags & MONITOR_FLAG_ACTIVE && 4554 !(rdev->wiphy.features & NL80211_FEATURE_ACTIVE_MONITOR)) 4555 return -EOPNOTSUPP; 4556 4557 if (info->attrs[NL80211_ATTR_MU_MIMO_GROUP_DATA]) { 4558 const u8 *mumimo_groups; 4559 u32 cap_flag = NL80211_EXT_FEATURE_MU_MIMO_AIR_SNIFFER; 4560 4561 if (type != NL80211_IFTYPE_MONITOR) 4562 return -EINVAL; 4563 4564 if (!wiphy_ext_feature_isset(&rdev->wiphy, cap_flag)) 4565 return -EOPNOTSUPP; 4566 4567 mumimo_groups = 4568 nla_data(info->attrs[NL80211_ATTR_MU_MIMO_GROUP_DATA]); 4569 4570 /* bits 0 and 63 are reserved and must be zero */ 4571 if ((mumimo_groups[0] & BIT(0)) || 4572 (mumimo_groups[VHT_MUMIMO_GROUPS_DATA_LEN - 1] & BIT(7))) 4573 return -EINVAL; 4574 4575 params->vht_mumimo_groups = mumimo_groups; 4576 change = true; 4577 } 4578 4579 if (info->attrs[NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR]) { 4580 u32 cap_flag = NL80211_EXT_FEATURE_MU_MIMO_AIR_SNIFFER; 4581 4582 if (type != NL80211_IFTYPE_MONITOR) 4583 return -EINVAL; 4584 4585 if (!wiphy_ext_feature_isset(&rdev->wiphy, cap_flag)) 4586 return -EOPNOTSUPP; 4587 4588 params->vht_mumimo_follow_addr = 4589 nla_data(info->attrs[NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR]); 4590 change = true; 4591 } 4592 4593 return change ? 1 : 0; 4594 } 4595 4596 static int nl80211_valid_4addr(struct cfg80211_registered_device *rdev, 4597 struct net_device *netdev, u8 use_4addr, 4598 enum nl80211_iftype iftype) 4599 { 4600 if (!use_4addr) { 4601 if (netdev && netif_is_bridge_port(netdev)) 4602 return -EBUSY; 4603 return 0; 4604 } 4605 4606 switch (iftype) { 4607 case NL80211_IFTYPE_AP_VLAN: 4608 if (rdev->wiphy.flags & WIPHY_FLAG_4ADDR_AP) 4609 return 0; 4610 break; 4611 case NL80211_IFTYPE_STATION: 4612 if (rdev->wiphy.flags & WIPHY_FLAG_4ADDR_STATION) 4613 return 0; 4614 break; 4615 default: 4616 break; 4617 } 4618 4619 return -EOPNOTSUPP; 4620 } 4621 4622 static int nl80211_parse_vif_radio_mask(struct genl_info *info, 4623 u32 *radio_mask) 4624 { 4625 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 4626 struct nlattr *attr = info->attrs[NL80211_ATTR_VIF_RADIO_MASK]; 4627 u32 mask, allowed; 4628 4629 if (!attr) { 4630 *radio_mask = 0; 4631 return 0; 4632 } 4633 4634 allowed = BIT(rdev->wiphy.n_radio) - 1; 4635 mask = nla_get_u32(attr); 4636 if (mask & ~allowed) 4637 return -EINVAL; 4638 if (!mask) 4639 mask = allowed; 4640 *radio_mask = mask; 4641 4642 return 1; 4643 } 4644 4645 static int nl80211_set_interface(struct sk_buff *skb, struct genl_info *info) 4646 { 4647 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 4648 struct vif_params params; 4649 int err; 4650 enum nl80211_iftype otype, ntype; 4651 struct net_device *dev = info->user_ptr[1]; 4652 struct wireless_dev *wdev = dev->ieee80211_ptr; 4653 u32 radio_mask = 0; 4654 bool change = false; 4655 4656 memset(¶ms, 0, sizeof(params)); 4657 4658 otype = ntype = dev->ieee80211_ptr->iftype; 4659 4660 if (info->attrs[NL80211_ATTR_IFTYPE]) { 4661 ntype = nla_get_u32(info->attrs[NL80211_ATTR_IFTYPE]); 4662 if (otype != ntype) 4663 change = true; 4664 } 4665 4666 if (info->attrs[NL80211_ATTR_MESH_ID]) { 4667 if (ntype != NL80211_IFTYPE_MESH_POINT) 4668 return -EINVAL; 4669 if (otype != NL80211_IFTYPE_MESH_POINT) 4670 return -EINVAL; 4671 if (netif_running(dev)) 4672 return -EBUSY; 4673 4674 wdev->u.mesh.id_up_len = 4675 nla_len(info->attrs[NL80211_ATTR_MESH_ID]); 4676 memcpy(wdev->u.mesh.id, 4677 nla_data(info->attrs[NL80211_ATTR_MESH_ID]), 4678 wdev->u.mesh.id_up_len); 4679 } 4680 4681 if (info->attrs[NL80211_ATTR_4ADDR]) { 4682 params.use_4addr = !!nla_get_u8(info->attrs[NL80211_ATTR_4ADDR]); 4683 change = true; 4684 err = nl80211_valid_4addr(rdev, dev, params.use_4addr, ntype); 4685 if (err) 4686 return err; 4687 } else { 4688 params.use_4addr = -1; 4689 } 4690 4691 err = nl80211_parse_mon_options(rdev, ntype, info, ¶ms); 4692 if (err < 0) 4693 return err; 4694 if (err > 0) 4695 change = true; 4696 4697 err = nl80211_parse_vif_radio_mask(info, &radio_mask); 4698 if (err < 0) 4699 return err; 4700 if (err && netif_running(dev)) 4701 return -EBUSY; 4702 4703 if (change) 4704 err = cfg80211_change_iface(rdev, dev, ntype, ¶ms); 4705 else 4706 err = 0; 4707 4708 if (!err && params.use_4addr != -1) 4709 dev->ieee80211_ptr->use_4addr = params.use_4addr; 4710 4711 if (radio_mask) 4712 wdev->radio_mask = radio_mask; 4713 4714 if (change && !err) 4715 nl80211_notify_iface(rdev, wdev, NL80211_CMD_SET_INTERFACE); 4716 4717 return err; 4718 } 4719 4720 static int _nl80211_new_interface(struct sk_buff *skb, struct genl_info *info) 4721 { 4722 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 4723 struct vif_params params; 4724 struct wireless_dev *wdev; 4725 struct sk_buff *msg; 4726 u32 radio_mask; 4727 int err; 4728 enum nl80211_iftype type = NL80211_IFTYPE_UNSPECIFIED; 4729 4730 memset(¶ms, 0, sizeof(params)); 4731 4732 if (!info->attrs[NL80211_ATTR_IFNAME]) 4733 return -EINVAL; 4734 4735 if (info->attrs[NL80211_ATTR_IFTYPE]) 4736 type = nla_get_u32(info->attrs[NL80211_ATTR_IFTYPE]); 4737 4738 if (!rdev->ops->add_virtual_intf) 4739 return -EOPNOTSUPP; 4740 4741 if ((type == NL80211_IFTYPE_P2P_DEVICE || type == NL80211_IFTYPE_NAN || 4742 rdev->wiphy.features & NL80211_FEATURE_MAC_ON_CREATE) && 4743 info->attrs[NL80211_ATTR_MAC]) { 4744 nla_memcpy(params.macaddr, info->attrs[NL80211_ATTR_MAC], 4745 ETH_ALEN); 4746 if (!is_valid_ether_addr(params.macaddr)) 4747 return -EADDRNOTAVAIL; 4748 } 4749 4750 if (info->attrs[NL80211_ATTR_4ADDR]) { 4751 params.use_4addr = !!nla_get_u8(info->attrs[NL80211_ATTR_4ADDR]); 4752 err = nl80211_valid_4addr(rdev, NULL, params.use_4addr, type); 4753 if (err) 4754 return err; 4755 } 4756 4757 if (!cfg80211_iftype_allowed(&rdev->wiphy, type, params.use_4addr, 0)) 4758 return -EOPNOTSUPP; 4759 4760 err = nl80211_parse_mon_options(rdev, type, info, ¶ms); 4761 if (err < 0) 4762 return err; 4763 4764 err = nl80211_parse_vif_radio_mask(info, &radio_mask); 4765 if (err < 0) 4766 return err; 4767 4768 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 4769 if (!msg) 4770 return -ENOMEM; 4771 4772 wdev = rdev_add_virtual_intf(rdev, 4773 nla_data(info->attrs[NL80211_ATTR_IFNAME]), 4774 NET_NAME_USER, type, ¶ms); 4775 if (WARN_ON(!wdev)) { 4776 nlmsg_free(msg); 4777 return -EPROTO; 4778 } else if (IS_ERR(wdev)) { 4779 nlmsg_free(msg); 4780 return PTR_ERR(wdev); 4781 } 4782 4783 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) 4784 wdev->owner_nlportid = info->snd_portid; 4785 4786 switch (type) { 4787 case NL80211_IFTYPE_MESH_POINT: 4788 if (!info->attrs[NL80211_ATTR_MESH_ID]) 4789 break; 4790 wdev->u.mesh.id_up_len = 4791 nla_len(info->attrs[NL80211_ATTR_MESH_ID]); 4792 memcpy(wdev->u.mesh.id, 4793 nla_data(info->attrs[NL80211_ATTR_MESH_ID]), 4794 wdev->u.mesh.id_up_len); 4795 break; 4796 case NL80211_IFTYPE_NAN: 4797 case NL80211_IFTYPE_P2P_DEVICE: 4798 /* 4799 * P2P Device and NAN do not have a netdev, so don't go 4800 * through the netdev notifier and must be added here 4801 */ 4802 cfg80211_init_wdev(wdev); 4803 cfg80211_register_wdev(rdev, wdev); 4804 break; 4805 default: 4806 break; 4807 } 4808 4809 if (radio_mask) 4810 wdev->radio_mask = radio_mask; 4811 4812 if (nl80211_send_iface(msg, info->snd_portid, info->snd_seq, 0, 4813 rdev, wdev, NL80211_CMD_NEW_INTERFACE) < 0) { 4814 nlmsg_free(msg); 4815 return -ENOBUFS; 4816 } 4817 4818 return genlmsg_reply(msg, info); 4819 } 4820 4821 static int nl80211_new_interface(struct sk_buff *skb, struct genl_info *info) 4822 { 4823 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 4824 4825 /* to avoid failing a new interface creation due to pending removal */ 4826 cfg80211_destroy_ifaces(rdev); 4827 4828 guard(wiphy)(&rdev->wiphy); 4829 4830 return _nl80211_new_interface(skb, info); 4831 } 4832 4833 static int nl80211_del_interface(struct sk_buff *skb, struct genl_info *info) 4834 { 4835 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 4836 struct wireless_dev *wdev = info->user_ptr[1]; 4837 4838 if (!rdev->ops->del_virtual_intf) 4839 return -EOPNOTSUPP; 4840 4841 /* 4842 * We hold RTNL, so this is safe, without RTNL opencount cannot 4843 * reach 0, and thus the rdev cannot be deleted. 4844 * 4845 * We need to do it for the dev_close(), since that will call 4846 * the netdev notifiers, and we need to acquire the mutex there 4847 * but don't know if we get there from here or from some other 4848 * place (e.g. "ip link set ... down"). 4849 */ 4850 mutex_unlock(&rdev->wiphy.mtx); 4851 4852 /* 4853 * If we remove a wireless device without a netdev then clear 4854 * user_ptr[1] so that nl80211_post_doit won't dereference it 4855 * to check if it needs to do dev_put(). Otherwise it crashes 4856 * since the wdev has been freed, unlike with a netdev where 4857 * we need the dev_put() for the netdev to really be freed. 4858 */ 4859 if (!wdev->netdev) 4860 info->user_ptr[1] = NULL; 4861 else 4862 dev_close(wdev->netdev); 4863 4864 mutex_lock(&rdev->wiphy.mtx); 4865 4866 return cfg80211_remove_virtual_intf(rdev, wdev); 4867 } 4868 4869 static int nl80211_set_noack_map(struct sk_buff *skb, struct genl_info *info) 4870 { 4871 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 4872 struct net_device *dev = info->user_ptr[1]; 4873 u16 noack_map; 4874 4875 if (!info->attrs[NL80211_ATTR_NOACK_MAP]) 4876 return -EINVAL; 4877 4878 if (!rdev->ops->set_noack_map) 4879 return -EOPNOTSUPP; 4880 4881 noack_map = nla_get_u16(info->attrs[NL80211_ATTR_NOACK_MAP]); 4882 4883 return rdev_set_noack_map(rdev, dev, noack_map); 4884 } 4885 4886 static int nl80211_validate_key_link_id(struct genl_info *info, 4887 struct wireless_dev *wdev, 4888 int link_id, bool pairwise) 4889 { 4890 if (pairwise) { 4891 if (link_id != -1) { 4892 GENL_SET_ERR_MSG(info, 4893 "link ID not allowed for pairwise key"); 4894 return -EINVAL; 4895 } 4896 4897 return 0; 4898 } 4899 4900 if (wdev->valid_links) { 4901 if (link_id == -1) { 4902 GENL_SET_ERR_MSG(info, 4903 "link ID must for MLO group key"); 4904 return -EINVAL; 4905 } 4906 if (!(wdev->valid_links & BIT(link_id))) { 4907 GENL_SET_ERR_MSG(info, "invalid link ID for MLO group key"); 4908 return -EINVAL; 4909 } 4910 } else if (link_id != -1) { 4911 GENL_SET_ERR_MSG(info, "link ID not allowed for non-MLO group key"); 4912 return -EINVAL; 4913 } 4914 4915 return 0; 4916 } 4917 4918 struct get_key_cookie { 4919 struct sk_buff *msg; 4920 int error; 4921 int idx; 4922 }; 4923 4924 static void get_key_callback(void *c, struct key_params *params) 4925 { 4926 struct nlattr *key; 4927 struct get_key_cookie *cookie = c; 4928 4929 if ((params->seq && 4930 nla_put(cookie->msg, NL80211_ATTR_KEY_SEQ, 4931 params->seq_len, params->seq)) || 4932 (params->cipher && 4933 nla_put_u32(cookie->msg, NL80211_ATTR_KEY_CIPHER, 4934 params->cipher))) 4935 goto nla_put_failure; 4936 4937 key = nla_nest_start_noflag(cookie->msg, NL80211_ATTR_KEY); 4938 if (!key) 4939 goto nla_put_failure; 4940 4941 if ((params->seq && 4942 nla_put(cookie->msg, NL80211_KEY_SEQ, 4943 params->seq_len, params->seq)) || 4944 (params->cipher && 4945 nla_put_u32(cookie->msg, NL80211_KEY_CIPHER, 4946 params->cipher))) 4947 goto nla_put_failure; 4948 4949 if (nla_put_u8(cookie->msg, NL80211_KEY_IDX, cookie->idx)) 4950 goto nla_put_failure; 4951 4952 nla_nest_end(cookie->msg, key); 4953 4954 return; 4955 nla_put_failure: 4956 cookie->error = 1; 4957 } 4958 4959 static int nl80211_get_key(struct sk_buff *skb, struct genl_info *info) 4960 { 4961 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 4962 int err; 4963 struct wireless_dev *wdev = info->user_ptr[1]; 4964 u8 key_idx = 0; 4965 const u8 *mac_addr = NULL; 4966 bool pairwise; 4967 struct get_key_cookie cookie = { 4968 .error = 0, 4969 }; 4970 void *hdr; 4971 struct sk_buff *msg; 4972 bool bigtk_support = false; 4973 int link_id = nl80211_link_id_or_invalid(info->attrs); 4974 4975 if (wiphy_ext_feature_isset(&rdev->wiphy, 4976 NL80211_EXT_FEATURE_BEACON_PROTECTION)) 4977 bigtk_support = true; 4978 4979 if ((wdev->iftype == NL80211_IFTYPE_STATION || 4980 wdev->iftype == NL80211_IFTYPE_P2P_CLIENT) && 4981 wiphy_ext_feature_isset(&rdev->wiphy, 4982 NL80211_EXT_FEATURE_BEACON_PROTECTION_CLIENT)) 4983 bigtk_support = true; 4984 4985 if (info->attrs[NL80211_ATTR_KEY_IDX]) { 4986 key_idx = nla_get_u8(info->attrs[NL80211_ATTR_KEY_IDX]); 4987 4988 if (key_idx >= 6 && key_idx <= 7 && !bigtk_support) { 4989 GENL_SET_ERR_MSG(info, "BIGTK not supported"); 4990 return -EINVAL; 4991 } 4992 } 4993 4994 if (info->attrs[NL80211_ATTR_MAC]) 4995 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 4996 4997 pairwise = !!mac_addr; 4998 if (info->attrs[NL80211_ATTR_KEY_TYPE]) { 4999 u32 kt = nla_get_u32(info->attrs[NL80211_ATTR_KEY_TYPE]); 5000 5001 if (kt != NL80211_KEYTYPE_GROUP && 5002 kt != NL80211_KEYTYPE_PAIRWISE) 5003 return -EINVAL; 5004 pairwise = kt == NL80211_KEYTYPE_PAIRWISE; 5005 } 5006 5007 if (!rdev->ops->get_key) 5008 return -EOPNOTSUPP; 5009 5010 if (!pairwise && mac_addr && !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN)) 5011 return -ENOENT; 5012 5013 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 5014 if (!msg) 5015 return -ENOMEM; 5016 5017 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 5018 NL80211_CMD_NEW_KEY); 5019 if (!hdr) 5020 goto nla_put_failure; 5021 5022 cookie.msg = msg; 5023 cookie.idx = key_idx; 5024 5025 if ((wdev->netdev && 5026 nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex)) || 5027 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 5028 NL80211_ATTR_PAD) || 5029 nla_put_u8(msg, NL80211_ATTR_KEY_IDX, key_idx)) 5030 goto nla_put_failure; 5031 if (mac_addr && 5032 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr)) 5033 goto nla_put_failure; 5034 5035 err = nl80211_validate_key_link_id(info, wdev, link_id, pairwise); 5036 if (err) 5037 goto free_msg; 5038 5039 err = rdev_get_key(rdev, wdev, link_id, key_idx, pairwise, mac_addr, 5040 &cookie, get_key_callback); 5041 5042 if (err) 5043 goto free_msg; 5044 5045 if (cookie.error) 5046 goto nla_put_failure; 5047 5048 genlmsg_end(msg, hdr); 5049 return genlmsg_reply(msg, info); 5050 5051 nla_put_failure: 5052 err = -ENOBUFS; 5053 free_msg: 5054 nlmsg_free(msg); 5055 return err; 5056 } 5057 5058 static int nl80211_set_key(struct sk_buff *skb, struct genl_info *info) 5059 { 5060 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 5061 struct key_parse key; 5062 int err; 5063 struct wireless_dev *wdev = info->user_ptr[1]; 5064 int link_id = nl80211_link_id_or_invalid(info->attrs); 5065 5066 err = nl80211_parse_key(info, &key); 5067 if (err) 5068 return err; 5069 5070 if (key.idx < 0) 5071 return -EINVAL; 5072 5073 /* Only support setting default key and 5074 * Extended Key ID action NL80211_KEY_SET_TX. 5075 */ 5076 if (!key.def && !key.defmgmt && !key.defbeacon && 5077 !(key.p.mode == NL80211_KEY_SET_TX)) 5078 return -EINVAL; 5079 5080 if (key.def) { 5081 if (!rdev->ops->set_default_key) 5082 return -EOPNOTSUPP; 5083 5084 if (!wdev->netdev) 5085 return -EINVAL; 5086 5087 err = nl80211_key_allowed(wdev); 5088 if (err) 5089 return err; 5090 5091 err = nl80211_validate_key_link_id(info, wdev, link_id, false); 5092 if (err) 5093 return err; 5094 5095 err = rdev_set_default_key(rdev, wdev->netdev, link_id, key.idx, 5096 key.def_uni, key.def_multi); 5097 5098 if (err) 5099 return err; 5100 5101 #ifdef CONFIG_CFG80211_WEXT 5102 wdev->wext.default_key = key.idx; 5103 #endif 5104 return 0; 5105 } else if (key.defmgmt) { 5106 if (key.def_uni || !key.def_multi) 5107 return -EINVAL; 5108 5109 if (!rdev->ops->set_default_mgmt_key) 5110 return -EOPNOTSUPP; 5111 5112 err = nl80211_key_allowed(wdev); 5113 if (err) 5114 return err; 5115 5116 err = nl80211_validate_key_link_id(info, wdev, link_id, false); 5117 if (err) 5118 return err; 5119 5120 err = rdev_set_default_mgmt_key(rdev, wdev, link_id, key.idx); 5121 if (err) 5122 return err; 5123 5124 #ifdef CONFIG_CFG80211_WEXT 5125 wdev->wext.default_mgmt_key = key.idx; 5126 #endif 5127 return 0; 5128 } else if (key.defbeacon) { 5129 if (key.def_uni || !key.def_multi) 5130 return -EINVAL; 5131 5132 if (!rdev->ops->set_default_beacon_key) 5133 return -EOPNOTSUPP; 5134 5135 err = nl80211_key_allowed(wdev); 5136 if (err) 5137 return err; 5138 5139 err = nl80211_validate_key_link_id(info, wdev, link_id, false); 5140 if (err) 5141 return err; 5142 5143 return rdev_set_default_beacon_key(rdev, wdev, link_id, 5144 key.idx); 5145 } else if (key.p.mode == NL80211_KEY_SET_TX && 5146 wiphy_ext_feature_isset(&rdev->wiphy, 5147 NL80211_EXT_FEATURE_EXT_KEY_ID)) { 5148 u8 *mac_addr = NULL; 5149 5150 if (info->attrs[NL80211_ATTR_MAC]) 5151 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 5152 5153 if (!mac_addr || key.idx < 0 || key.idx > 1) 5154 return -EINVAL; 5155 5156 err = nl80211_validate_key_link_id(info, wdev, link_id, true); 5157 if (err) 5158 return err; 5159 5160 return rdev_add_key(rdev, wdev, link_id, key.idx, 5161 NL80211_KEYTYPE_PAIRWISE, 5162 mac_addr, &key.p); 5163 } 5164 5165 return -EINVAL; 5166 } 5167 5168 static int nl80211_new_key(struct sk_buff *skb, struct genl_info *info) 5169 { 5170 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 5171 int err; 5172 struct wireless_dev *wdev = info->user_ptr[1]; 5173 struct key_parse key; 5174 const u8 *mac_addr = NULL; 5175 int link_id = nl80211_link_id_or_invalid(info->attrs); 5176 5177 err = nl80211_parse_key(info, &key); 5178 if (err) 5179 return err; 5180 5181 if (!key.p.key) { 5182 GENL_SET_ERR_MSG(info, "no key"); 5183 return -EINVAL; 5184 } 5185 5186 if (info->attrs[NL80211_ATTR_MAC]) 5187 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 5188 5189 if (key.type == -1) { 5190 if (mac_addr) 5191 key.type = NL80211_KEYTYPE_PAIRWISE; 5192 else 5193 key.type = NL80211_KEYTYPE_GROUP; 5194 } 5195 5196 /* for now */ 5197 if (key.type != NL80211_KEYTYPE_PAIRWISE && 5198 key.type != NL80211_KEYTYPE_GROUP) { 5199 GENL_SET_ERR_MSG(info, "key type not pairwise or group"); 5200 return -EINVAL; 5201 } 5202 5203 if (key.type == NL80211_KEYTYPE_GROUP && 5204 info->attrs[NL80211_ATTR_VLAN_ID]) 5205 key.p.vlan_id = nla_get_u16(info->attrs[NL80211_ATTR_VLAN_ID]); 5206 5207 if (!rdev->ops->add_key) 5208 return -EOPNOTSUPP; 5209 5210 if (cfg80211_validate_key_settings(rdev, &key.p, key.idx, 5211 key.type == NL80211_KEYTYPE_PAIRWISE, 5212 mac_addr)) { 5213 GENL_SET_ERR_MSG(info, "key setting validation failed"); 5214 return -EINVAL; 5215 } 5216 5217 err = nl80211_key_allowed(wdev); 5218 if (err) 5219 GENL_SET_ERR_MSG(info, "key not allowed"); 5220 5221 if (!err) 5222 err = nl80211_validate_key_link_id(info, wdev, link_id, 5223 key.type == NL80211_KEYTYPE_PAIRWISE); 5224 5225 if (!err) { 5226 err = rdev_add_key(rdev, wdev, link_id, key.idx, 5227 key.type == NL80211_KEYTYPE_PAIRWISE, 5228 mac_addr, &key.p); 5229 if (err) 5230 GENL_SET_ERR_MSG(info, "key addition failed"); 5231 } 5232 5233 return err; 5234 } 5235 5236 static int nl80211_del_key(struct sk_buff *skb, struct genl_info *info) 5237 { 5238 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 5239 int err; 5240 struct wireless_dev *wdev = info->user_ptr[1]; 5241 u8 *mac_addr = NULL; 5242 struct key_parse key; 5243 int link_id = nl80211_link_id_or_invalid(info->attrs); 5244 5245 err = nl80211_parse_key(info, &key); 5246 if (err) 5247 return err; 5248 5249 if (info->attrs[NL80211_ATTR_MAC]) 5250 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 5251 5252 if (key.type == -1) { 5253 if (mac_addr) 5254 key.type = NL80211_KEYTYPE_PAIRWISE; 5255 else 5256 key.type = NL80211_KEYTYPE_GROUP; 5257 } 5258 5259 /* for now */ 5260 if (key.type != NL80211_KEYTYPE_PAIRWISE && 5261 key.type != NL80211_KEYTYPE_GROUP) 5262 return -EINVAL; 5263 5264 if (!cfg80211_valid_key_idx(rdev, key.idx, 5265 key.type == NL80211_KEYTYPE_PAIRWISE)) 5266 return -EINVAL; 5267 5268 if (!rdev->ops->del_key) 5269 return -EOPNOTSUPP; 5270 5271 err = nl80211_key_allowed(wdev); 5272 5273 if (key.type == NL80211_KEYTYPE_GROUP && mac_addr && 5274 !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN)) 5275 err = -ENOENT; 5276 5277 if (!err) 5278 err = nl80211_validate_key_link_id(info, wdev, link_id, 5279 key.type == NL80211_KEYTYPE_PAIRWISE); 5280 5281 if (!err) 5282 err = rdev_del_key(rdev, wdev, link_id, key.idx, 5283 key.type == NL80211_KEYTYPE_PAIRWISE, 5284 mac_addr); 5285 5286 #ifdef CONFIG_CFG80211_WEXT 5287 if (!err) { 5288 if (key.idx == wdev->wext.default_key) 5289 wdev->wext.default_key = -1; 5290 else if (key.idx == wdev->wext.default_mgmt_key) 5291 wdev->wext.default_mgmt_key = -1; 5292 } 5293 #endif 5294 5295 return err; 5296 } 5297 5298 /* This function returns an error or the number of nested attributes */ 5299 static int validate_acl_mac_addrs(struct nlattr *nl_attr) 5300 { 5301 struct nlattr *attr; 5302 int n_entries = 0, tmp; 5303 5304 nla_for_each_nested(attr, nl_attr, tmp) { 5305 if (nla_len(attr) != ETH_ALEN) 5306 return -EINVAL; 5307 5308 n_entries++; 5309 } 5310 5311 return n_entries; 5312 } 5313 5314 /* 5315 * This function parses ACL information and allocates memory for ACL data. 5316 * On successful return, the calling function is responsible to free the 5317 * ACL buffer returned by this function. 5318 */ 5319 static struct cfg80211_acl_data *parse_acl_data(struct wiphy *wiphy, 5320 struct genl_info *info) 5321 { 5322 enum nl80211_acl_policy acl_policy; 5323 struct nlattr *attr; 5324 struct cfg80211_acl_data *acl; 5325 int i = 0, n_entries, tmp; 5326 5327 if (!wiphy->max_acl_mac_addrs) 5328 return ERR_PTR(-EOPNOTSUPP); 5329 5330 if (!info->attrs[NL80211_ATTR_ACL_POLICY]) 5331 return ERR_PTR(-EINVAL); 5332 5333 acl_policy = nla_get_u32(info->attrs[NL80211_ATTR_ACL_POLICY]); 5334 if (acl_policy != NL80211_ACL_POLICY_ACCEPT_UNLESS_LISTED && 5335 acl_policy != NL80211_ACL_POLICY_DENY_UNLESS_LISTED) 5336 return ERR_PTR(-EINVAL); 5337 5338 if (!info->attrs[NL80211_ATTR_MAC_ADDRS]) 5339 return ERR_PTR(-EINVAL); 5340 5341 n_entries = validate_acl_mac_addrs(info->attrs[NL80211_ATTR_MAC_ADDRS]); 5342 if (n_entries < 0) 5343 return ERR_PTR(n_entries); 5344 5345 if (n_entries > wiphy->max_acl_mac_addrs) 5346 return ERR_PTR(-EOPNOTSUPP); 5347 5348 acl = kzalloc_flex(*acl, mac_addrs, n_entries); 5349 if (!acl) 5350 return ERR_PTR(-ENOMEM); 5351 acl->n_acl_entries = n_entries; 5352 5353 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_MAC_ADDRS], tmp) { 5354 memcpy(acl->mac_addrs[i].addr, nla_data(attr), ETH_ALEN); 5355 i++; 5356 } 5357 acl->acl_policy = acl_policy; 5358 5359 return acl; 5360 } 5361 5362 static int nl80211_set_mac_acl(struct sk_buff *skb, struct genl_info *info) 5363 { 5364 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 5365 struct net_device *dev = info->user_ptr[1]; 5366 struct cfg80211_acl_data *acl; 5367 int err; 5368 5369 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 5370 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 5371 return -EOPNOTSUPP; 5372 5373 if (!dev->ieee80211_ptr->links[0].ap.beacon_interval) 5374 return -EINVAL; 5375 5376 acl = parse_acl_data(&rdev->wiphy, info); 5377 if (IS_ERR(acl)) 5378 return PTR_ERR(acl); 5379 5380 err = rdev_set_mac_acl(rdev, dev, acl); 5381 5382 kfree(acl); 5383 5384 return err; 5385 } 5386 5387 static u32 rateset_to_mask(struct ieee80211_supported_band *sband, 5388 u8 *rates, u8 rates_len) 5389 { 5390 u8 i; 5391 u32 mask = 0; 5392 5393 for (i = 0; i < rates_len; i++) { 5394 int rate = (rates[i] & 0x7f) * 5; 5395 int ridx; 5396 5397 for (ridx = 0; ridx < sband->n_bitrates; ridx++) { 5398 struct ieee80211_rate *srate = 5399 &sband->bitrates[ridx]; 5400 if (rate == srate->bitrate) { 5401 mask |= 1 << ridx; 5402 break; 5403 } 5404 } 5405 if (ridx == sband->n_bitrates) 5406 return 0; /* rate not found */ 5407 } 5408 5409 return mask; 5410 } 5411 5412 static bool ht_rateset_to_mask(struct ieee80211_supported_band *sband, 5413 u8 *rates, u8 rates_len, 5414 u8 mcs[IEEE80211_HT_MCS_MASK_LEN]) 5415 { 5416 u8 i; 5417 5418 memset(mcs, 0, IEEE80211_HT_MCS_MASK_LEN); 5419 5420 for (i = 0; i < rates_len; i++) { 5421 int ridx, rbit; 5422 5423 ridx = rates[i] / 8; 5424 rbit = BIT(rates[i] % 8); 5425 5426 /* check validity */ 5427 if ((ridx < 0) || (ridx >= IEEE80211_HT_MCS_MASK_LEN)) 5428 return false; 5429 5430 /* check availability */ 5431 ridx = array_index_nospec(ridx, IEEE80211_HT_MCS_MASK_LEN); 5432 if (sband->ht_cap.mcs.rx_mask[ridx] & rbit) 5433 mcs[ridx] |= rbit; 5434 else 5435 return false; 5436 } 5437 5438 return true; 5439 } 5440 5441 static u16 vht_mcs_map_to_mcs_mask(u8 vht_mcs_map) 5442 { 5443 u16 mcs_mask = 0; 5444 5445 switch (vht_mcs_map) { 5446 case IEEE80211_VHT_MCS_NOT_SUPPORTED: 5447 break; 5448 case IEEE80211_VHT_MCS_SUPPORT_0_7: 5449 mcs_mask = 0x00FF; 5450 break; 5451 case IEEE80211_VHT_MCS_SUPPORT_0_8: 5452 mcs_mask = 0x01FF; 5453 break; 5454 case IEEE80211_VHT_MCS_SUPPORT_0_9: 5455 mcs_mask = 0x03FF; 5456 break; 5457 default: 5458 break; 5459 } 5460 5461 return mcs_mask; 5462 } 5463 5464 static void vht_build_mcs_mask(u16 vht_mcs_map, 5465 u16 vht_mcs_mask[NL80211_VHT_NSS_MAX]) 5466 { 5467 u8 nss; 5468 5469 for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++) { 5470 vht_mcs_mask[nss] = vht_mcs_map_to_mcs_mask(vht_mcs_map & 0x03); 5471 vht_mcs_map >>= 2; 5472 } 5473 } 5474 5475 static bool vht_set_mcs_mask(struct ieee80211_supported_band *sband, 5476 struct nl80211_txrate_vht *txrate, 5477 u16 mcs[NL80211_VHT_NSS_MAX]) 5478 { 5479 u16 tx_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map); 5480 u16 tx_mcs_mask[NL80211_VHT_NSS_MAX] = {}; 5481 u8 i; 5482 5483 if (!sband->vht_cap.vht_supported) 5484 return false; 5485 5486 memset(mcs, 0, sizeof(u16) * NL80211_VHT_NSS_MAX); 5487 5488 /* Build vht_mcs_mask from VHT capabilities */ 5489 vht_build_mcs_mask(tx_mcs_map, tx_mcs_mask); 5490 5491 for (i = 0; i < NL80211_VHT_NSS_MAX; i++) { 5492 if ((tx_mcs_mask[i] & txrate->mcs[i]) == txrate->mcs[i]) 5493 mcs[i] = txrate->mcs[i]; 5494 else 5495 return false; 5496 } 5497 5498 return true; 5499 } 5500 5501 static u16 he_mcs_map_to_mcs_mask(u8 he_mcs_map) 5502 { 5503 switch (he_mcs_map) { 5504 case IEEE80211_HE_MCS_NOT_SUPPORTED: 5505 return 0; 5506 case IEEE80211_HE_MCS_SUPPORT_0_7: 5507 return 0x00FF; 5508 case IEEE80211_HE_MCS_SUPPORT_0_9: 5509 return 0x03FF; 5510 case IEEE80211_HE_MCS_SUPPORT_0_11: 5511 return 0xFFF; 5512 default: 5513 break; 5514 } 5515 return 0; 5516 } 5517 5518 static void he_build_mcs_mask(u16 he_mcs_map, 5519 u16 he_mcs_mask[NL80211_HE_NSS_MAX]) 5520 { 5521 u8 nss; 5522 5523 for (nss = 0; nss < NL80211_HE_NSS_MAX; nss++) { 5524 he_mcs_mask[nss] = he_mcs_map_to_mcs_mask(he_mcs_map & 0x03); 5525 he_mcs_map >>= 2; 5526 } 5527 } 5528 5529 static u16 he_get_txmcsmap(struct genl_info *info, unsigned int link_id, 5530 const struct ieee80211_sta_he_cap *he_cap) 5531 { 5532 struct net_device *dev = info->user_ptr[1]; 5533 struct wireless_dev *wdev = dev->ieee80211_ptr; 5534 struct cfg80211_chan_def *chandef; 5535 __le16 tx_mcs; 5536 5537 chandef = wdev_chandef(wdev, link_id); 5538 if (!chandef) { 5539 /* 5540 * This is probably broken, but we never maintained 5541 * a chandef in these cases, so it always was. 5542 */ 5543 return le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_80); 5544 } 5545 5546 switch (chandef->width) { 5547 case NL80211_CHAN_WIDTH_80P80: 5548 tx_mcs = he_cap->he_mcs_nss_supp.tx_mcs_80p80; 5549 break; 5550 case NL80211_CHAN_WIDTH_160: 5551 tx_mcs = he_cap->he_mcs_nss_supp.tx_mcs_160; 5552 break; 5553 default: 5554 tx_mcs = he_cap->he_mcs_nss_supp.tx_mcs_80; 5555 break; 5556 } 5557 5558 return le16_to_cpu(tx_mcs); 5559 } 5560 5561 static bool he_set_mcs_mask(struct genl_info *info, 5562 struct wireless_dev *wdev, 5563 struct ieee80211_supported_band *sband, 5564 struct nl80211_txrate_he *txrate, 5565 u16 mcs[NL80211_HE_NSS_MAX], 5566 unsigned int link_id) 5567 { 5568 const struct ieee80211_sta_he_cap *he_cap; 5569 u16 tx_mcs_mask[NL80211_HE_NSS_MAX] = {}; 5570 u16 tx_mcs_map = 0; 5571 u8 i; 5572 5573 he_cap = ieee80211_get_he_iftype_cap(sband, wdev->iftype); 5574 if (!he_cap) 5575 return false; 5576 5577 memset(mcs, 0, sizeof(u16) * NL80211_HE_NSS_MAX); 5578 5579 tx_mcs_map = he_get_txmcsmap(info, link_id, he_cap); 5580 5581 /* Build he_mcs_mask from HE capabilities */ 5582 he_build_mcs_mask(tx_mcs_map, tx_mcs_mask); 5583 5584 for (i = 0; i < NL80211_HE_NSS_MAX; i++) { 5585 if ((tx_mcs_mask[i] & txrate->mcs[i]) == txrate->mcs[i]) 5586 mcs[i] = txrate->mcs[i]; 5587 else 5588 return false; 5589 } 5590 5591 return true; 5592 } 5593 5594 static void eht_build_mcs_mask(struct genl_info *info, 5595 const struct ieee80211_sta_eht_cap *eht_cap, 5596 u8 mcs_nss_len, u16 *mcs_mask) 5597 { 5598 struct net_device *dev = info->user_ptr[1]; 5599 struct wireless_dev *wdev = dev->ieee80211_ptr; 5600 u8 nss, mcs_7 = 0, mcs_9 = 0, mcs_11 = 0, mcs_13 = 0; 5601 unsigned int link_id = nl80211_link_id(info->attrs); 5602 5603 if (mcs_nss_len == 4) { 5604 const struct ieee80211_eht_mcs_nss_supp_20mhz_only *mcs = 5605 &eht_cap->eht_mcs_nss_supp.only_20mhz; 5606 5607 mcs_7 = u8_get_bits(mcs->rx_tx_mcs7_max_nss, 5608 IEEE80211_EHT_MCS_NSS_TX); 5609 mcs_9 = u8_get_bits(mcs->rx_tx_mcs9_max_nss, 5610 IEEE80211_EHT_MCS_NSS_TX); 5611 mcs_11 = u8_get_bits(mcs->rx_tx_mcs11_max_nss, 5612 IEEE80211_EHT_MCS_NSS_TX); 5613 mcs_13 = u8_get_bits(mcs->rx_tx_mcs13_max_nss, 5614 IEEE80211_EHT_MCS_NSS_TX); 5615 5616 } else { 5617 const struct ieee80211_eht_mcs_nss_supp_bw *mcs; 5618 enum nl80211_chan_width width; 5619 5620 switch (wdev->iftype) { 5621 case NL80211_IFTYPE_ADHOC: 5622 width = wdev->u.ibss.chandef.width; 5623 break; 5624 case NL80211_IFTYPE_MESH_POINT: 5625 width = wdev->u.mesh.chandef.width; 5626 break; 5627 case NL80211_IFTYPE_OCB: 5628 width = wdev->u.ocb.chandef.width; 5629 break; 5630 default: 5631 if (wdev->valid_links) 5632 width = wdev->links[link_id].ap.chandef.width; 5633 else 5634 width = wdev->u.ap.preset_chandef.width; 5635 break; 5636 } 5637 5638 switch (width) { 5639 case NL80211_CHAN_WIDTH_320: 5640 mcs = &eht_cap->eht_mcs_nss_supp.bw._320; 5641 break; 5642 case NL80211_CHAN_WIDTH_160: 5643 mcs = &eht_cap->eht_mcs_nss_supp.bw._160; 5644 break; 5645 default: 5646 mcs = &eht_cap->eht_mcs_nss_supp.bw._80; 5647 break; 5648 } 5649 5650 mcs_7 = u8_get_bits(mcs->rx_tx_mcs9_max_nss, 5651 IEEE80211_EHT_MCS_NSS_TX); 5652 mcs_9 = u8_get_bits(mcs->rx_tx_mcs9_max_nss, 5653 IEEE80211_EHT_MCS_NSS_TX); 5654 mcs_11 = u8_get_bits(mcs->rx_tx_mcs11_max_nss, 5655 IEEE80211_EHT_MCS_NSS_TX); 5656 mcs_13 = u8_get_bits(mcs->rx_tx_mcs13_max_nss, 5657 IEEE80211_EHT_MCS_NSS_TX); 5658 } 5659 5660 /* Enable MCS 14 for NSS 0 */ 5661 if (eht_cap->eht_cap_elem.phy_cap_info[6] & 5662 IEEE80211_EHT_PHY_CAP6_EHT_DUP_6GHZ_SUPP) 5663 mcs_mask[0] |= 0x4000; 5664 5665 /* Enable MCS 15 for NSS 0 */ 5666 mcs_mask[0] |= 0x8000; 5667 5668 for (nss = 0; nss < NL80211_EHT_NSS_MAX; nss++) { 5669 if (!mcs_7) 5670 continue; 5671 mcs_mask[nss] |= 0x00FF; 5672 mcs_7--; 5673 5674 if (!mcs_9) 5675 continue; 5676 mcs_mask[nss] |= 0x0300; 5677 mcs_9--; 5678 5679 if (!mcs_11) 5680 continue; 5681 mcs_mask[nss] |= 0x0C00; 5682 mcs_11--; 5683 5684 if (!mcs_13) 5685 continue; 5686 mcs_mask[nss] |= 0x3000; 5687 mcs_13--; 5688 } 5689 } 5690 5691 static bool eht_set_mcs_mask(struct genl_info *info, struct wireless_dev *wdev, 5692 struct ieee80211_supported_band *sband, 5693 struct nl80211_txrate_eht *txrate, 5694 u16 mcs[NL80211_EHT_NSS_MAX]) 5695 { 5696 const struct ieee80211_sta_he_cap *he_cap; 5697 const struct ieee80211_sta_eht_cap *eht_cap; 5698 u16 tx_mcs_mask[NL80211_EHT_NSS_MAX] = { 0 }; 5699 u8 i, mcs_nss_len; 5700 5701 he_cap = ieee80211_get_he_iftype_cap(sband, wdev->iftype); 5702 if (!he_cap) 5703 return false; 5704 5705 eht_cap = ieee80211_get_eht_iftype_cap(sband, wdev->iftype); 5706 if (!eht_cap) 5707 return false; 5708 5709 /* Checks for MCS 14 */ 5710 if (txrate->mcs[0] & 0x4000) { 5711 if (sband->band != NL80211_BAND_6GHZ) 5712 return false; 5713 5714 if (!(eht_cap->eht_cap_elem.phy_cap_info[6] & 5715 IEEE80211_EHT_PHY_CAP6_EHT_DUP_6GHZ_SUPP)) 5716 return false; 5717 } 5718 5719 mcs_nss_len = ieee80211_eht_mcs_nss_size(&he_cap->he_cap_elem, 5720 &eht_cap->eht_cap_elem, 5721 wdev->iftype == 5722 NL80211_IFTYPE_STATION); 5723 5724 if (mcs_nss_len == 3) { 5725 /* Supported iftypes for setting non-20 MHZ only EHT MCS */ 5726 switch (wdev->iftype) { 5727 case NL80211_IFTYPE_ADHOC: 5728 case NL80211_IFTYPE_AP: 5729 case NL80211_IFTYPE_P2P_GO: 5730 case NL80211_IFTYPE_MESH_POINT: 5731 case NL80211_IFTYPE_OCB: 5732 break; 5733 default: 5734 return false; 5735 } 5736 } 5737 5738 /* Build eht_mcs_mask from EHT and HE capabilities */ 5739 eht_build_mcs_mask(info, eht_cap, mcs_nss_len, tx_mcs_mask); 5740 5741 memset(mcs, 0, sizeof(u16) * NL80211_EHT_NSS_MAX); 5742 for (i = 0; i < NL80211_EHT_NSS_MAX; i++) { 5743 if ((tx_mcs_mask[i] & txrate->mcs[i]) == txrate->mcs[i]) 5744 mcs[i] = txrate->mcs[i]; 5745 else 5746 return false; 5747 } 5748 5749 return true; 5750 } 5751 5752 static int nl80211_parse_tx_bitrate_mask(struct genl_info *info, 5753 struct nlattr *attrs[], 5754 enum nl80211_attrs attr, 5755 struct cfg80211_bitrate_mask *mask, 5756 struct net_device *dev, 5757 bool default_all_enabled, 5758 unsigned int link_id) 5759 { 5760 struct nlattr *tb[NL80211_TXRATE_MAX + 1]; 5761 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 5762 struct wireless_dev *wdev = dev->ieee80211_ptr; 5763 int rem, i; 5764 struct nlattr *tx_rates; 5765 struct ieee80211_supported_band *sband; 5766 u16 vht_tx_mcs_map, he_tx_mcs_map; 5767 5768 memset(mask, 0, sizeof(*mask)); 5769 /* Default to all rates enabled */ 5770 for (i = 0; i < NUM_NL80211_BANDS; i++) { 5771 const struct ieee80211_sta_he_cap *he_cap; 5772 const struct ieee80211_sta_eht_cap *eht_cap; 5773 u8 mcs_nss_len; 5774 5775 if (!default_all_enabled) 5776 break; 5777 5778 sband = rdev->wiphy.bands[i]; 5779 5780 if (!sband) 5781 continue; 5782 5783 mask->control[i].legacy = (1 << sband->n_bitrates) - 1; 5784 memcpy(mask->control[i].ht_mcs, 5785 sband->ht_cap.mcs.rx_mask, 5786 sizeof(mask->control[i].ht_mcs)); 5787 5788 if (sband->vht_cap.vht_supported) { 5789 vht_tx_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map); 5790 vht_build_mcs_mask(vht_tx_mcs_map, mask->control[i].vht_mcs); 5791 } 5792 5793 he_cap = ieee80211_get_he_iftype_cap(sband, wdev->iftype); 5794 if (!he_cap) 5795 continue; 5796 5797 he_tx_mcs_map = he_get_txmcsmap(info, link_id, he_cap); 5798 he_build_mcs_mask(he_tx_mcs_map, mask->control[i].he_mcs); 5799 5800 mask->control[i].he_gi = 0xFF; 5801 mask->control[i].he_ltf = 0xFF; 5802 5803 eht_cap = ieee80211_get_eht_iftype_cap(sband, wdev->iftype); 5804 if (!eht_cap) 5805 continue; 5806 5807 mcs_nss_len = ieee80211_eht_mcs_nss_size(&he_cap->he_cap_elem, 5808 &eht_cap->eht_cap_elem, 5809 wdev->iftype == 5810 NL80211_IFTYPE_STATION); 5811 5812 eht_build_mcs_mask(info, eht_cap, mcs_nss_len, 5813 mask->control[i].eht_mcs); 5814 5815 mask->control[i].eht_gi = 0xFF; 5816 mask->control[i].eht_ltf = 0xFF; 5817 } 5818 5819 /* if no rates are given set it back to the defaults */ 5820 if (!attrs[attr]) 5821 goto out; 5822 5823 /* The nested attribute uses enum nl80211_band as the index. This maps 5824 * directly to the enum nl80211_band values used in cfg80211. 5825 */ 5826 BUILD_BUG_ON(NL80211_MAX_SUPP_HT_RATES > IEEE80211_HT_MCS_MASK_LEN * 8); 5827 nla_for_each_nested(tx_rates, attrs[attr], rem) { 5828 enum nl80211_band band = nla_type(tx_rates); 5829 int err; 5830 5831 if (band < 0 || band >= NUM_NL80211_BANDS) 5832 return -EINVAL; 5833 sband = rdev->wiphy.bands[band]; 5834 if (sband == NULL) 5835 return -EINVAL; 5836 err = nla_parse_nested_deprecated(tb, NL80211_TXRATE_MAX, 5837 tx_rates, 5838 nl80211_txattr_policy, 5839 info->extack); 5840 if (err) 5841 return err; 5842 if (tb[NL80211_TXRATE_LEGACY]) { 5843 mask->control[band].legacy = rateset_to_mask( 5844 sband, 5845 nla_data(tb[NL80211_TXRATE_LEGACY]), 5846 nla_len(tb[NL80211_TXRATE_LEGACY])); 5847 if ((mask->control[band].legacy == 0) && 5848 nla_len(tb[NL80211_TXRATE_LEGACY])) 5849 return -EINVAL; 5850 } 5851 if (tb[NL80211_TXRATE_HT]) { 5852 if (!ht_rateset_to_mask( 5853 sband, 5854 nla_data(tb[NL80211_TXRATE_HT]), 5855 nla_len(tb[NL80211_TXRATE_HT]), 5856 mask->control[band].ht_mcs)) 5857 return -EINVAL; 5858 } 5859 5860 if (tb[NL80211_TXRATE_VHT]) { 5861 if (!vht_set_mcs_mask( 5862 sband, 5863 nla_data(tb[NL80211_TXRATE_VHT]), 5864 mask->control[band].vht_mcs)) 5865 return -EINVAL; 5866 } 5867 5868 if (tb[NL80211_TXRATE_GI]) { 5869 mask->control[band].gi = 5870 nla_get_u8(tb[NL80211_TXRATE_GI]); 5871 if (mask->control[band].gi > NL80211_TXRATE_FORCE_LGI) 5872 return -EINVAL; 5873 } 5874 if (tb[NL80211_TXRATE_HE] && 5875 !he_set_mcs_mask(info, wdev, sband, 5876 nla_data(tb[NL80211_TXRATE_HE]), 5877 mask->control[band].he_mcs, 5878 link_id)) 5879 return -EINVAL; 5880 5881 if (tb[NL80211_TXRATE_HE_GI]) 5882 mask->control[band].he_gi = 5883 nla_get_u8(tb[NL80211_TXRATE_HE_GI]); 5884 if (tb[NL80211_TXRATE_HE_LTF]) 5885 mask->control[band].he_ltf = 5886 nla_get_u8(tb[NL80211_TXRATE_HE_LTF]); 5887 5888 if (tb[NL80211_TXRATE_EHT] && 5889 !eht_set_mcs_mask(info, wdev, sband, 5890 nla_data(tb[NL80211_TXRATE_EHT]), 5891 mask->control[band].eht_mcs)) 5892 return -EINVAL; 5893 5894 if (tb[NL80211_TXRATE_EHT_GI]) 5895 mask->control[band].eht_gi = 5896 nla_get_u8(tb[NL80211_TXRATE_EHT_GI]); 5897 if (tb[NL80211_TXRATE_EHT_LTF]) 5898 mask->control[band].eht_ltf = 5899 nla_get_u8(tb[NL80211_TXRATE_EHT_LTF]); 5900 5901 if (mask->control[band].legacy == 0) { 5902 /* don't allow empty legacy rates if HT, VHT, HE or EHT 5903 * are not even supported. 5904 */ 5905 if (!(rdev->wiphy.bands[band]->ht_cap.ht_supported || 5906 rdev->wiphy.bands[band]->vht_cap.vht_supported || 5907 ieee80211_get_he_iftype_cap(sband, wdev->iftype) || 5908 ieee80211_get_eht_iftype_cap(sband, wdev->iftype))) 5909 return -EINVAL; 5910 5911 for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++) 5912 if (mask->control[band].ht_mcs[i]) 5913 goto out; 5914 5915 for (i = 0; i < NL80211_VHT_NSS_MAX; i++) 5916 if (mask->control[band].vht_mcs[i]) 5917 goto out; 5918 5919 for (i = 0; i < NL80211_HE_NSS_MAX; i++) 5920 if (mask->control[band].he_mcs[i]) 5921 goto out; 5922 5923 for (i = 0; i < NL80211_EHT_NSS_MAX; i++) 5924 if (mask->control[band].eht_mcs[i]) 5925 goto out; 5926 5927 /* legacy and mcs rates may not be both empty */ 5928 return -EINVAL; 5929 } 5930 } 5931 5932 out: 5933 return 0; 5934 } 5935 5936 static int validate_beacon_tx_rate(struct cfg80211_registered_device *rdev, 5937 enum nl80211_band band, 5938 struct cfg80211_bitrate_mask *beacon_rate) 5939 { 5940 u32 count_ht, count_vht, count_he, count_eht, i; 5941 u32 rate = beacon_rate->control[band].legacy; 5942 5943 /* Allow only one rate */ 5944 if (hweight32(rate) > 1) 5945 return -EINVAL; 5946 5947 count_ht = 0; 5948 for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++) { 5949 if (hweight8(beacon_rate->control[band].ht_mcs[i]) > 1) { 5950 return -EINVAL; 5951 } else if (beacon_rate->control[band].ht_mcs[i]) { 5952 count_ht++; 5953 if (count_ht > 1) 5954 return -EINVAL; 5955 } 5956 if (count_ht && rate) 5957 return -EINVAL; 5958 } 5959 5960 count_vht = 0; 5961 for (i = 0; i < NL80211_VHT_NSS_MAX; i++) { 5962 if (hweight16(beacon_rate->control[band].vht_mcs[i]) > 1) { 5963 return -EINVAL; 5964 } else if (beacon_rate->control[band].vht_mcs[i]) { 5965 count_vht++; 5966 if (count_vht > 1) 5967 return -EINVAL; 5968 } 5969 if (count_vht && rate) 5970 return -EINVAL; 5971 } 5972 5973 count_he = 0; 5974 for (i = 0; i < NL80211_HE_NSS_MAX; i++) { 5975 if (hweight16(beacon_rate->control[band].he_mcs[i]) > 1) { 5976 return -EINVAL; 5977 } else if (beacon_rate->control[band].he_mcs[i]) { 5978 count_he++; 5979 if (count_he > 1) 5980 return -EINVAL; 5981 } 5982 if (count_he && rate) 5983 return -EINVAL; 5984 } 5985 5986 count_eht = 0; 5987 for (i = 0; i < NL80211_EHT_NSS_MAX; i++) { 5988 if (hweight16(beacon_rate->control[band].eht_mcs[i]) > 1) { 5989 return -EINVAL; 5990 } else if (beacon_rate->control[band].eht_mcs[i]) { 5991 count_eht++; 5992 if (count_eht > 1) 5993 return -EINVAL; 5994 } 5995 if (count_eht && rate) 5996 return -EINVAL; 5997 } 5998 5999 if ((count_ht && count_vht && count_he && count_eht) || 6000 (!rate && !count_ht && !count_vht && !count_he && !count_eht)) 6001 return -EINVAL; 6002 6003 if (rate && 6004 !wiphy_ext_feature_isset(&rdev->wiphy, 6005 NL80211_EXT_FEATURE_BEACON_RATE_LEGACY)) 6006 return -EINVAL; 6007 if (count_ht && 6008 !wiphy_ext_feature_isset(&rdev->wiphy, 6009 NL80211_EXT_FEATURE_BEACON_RATE_HT)) 6010 return -EINVAL; 6011 if (count_vht && 6012 !wiphy_ext_feature_isset(&rdev->wiphy, 6013 NL80211_EXT_FEATURE_BEACON_RATE_VHT)) 6014 return -EINVAL; 6015 if (count_he && 6016 !wiphy_ext_feature_isset(&rdev->wiphy, 6017 NL80211_EXT_FEATURE_BEACON_RATE_HE)) 6018 return -EINVAL; 6019 6020 if (count_eht && 6021 !wiphy_ext_feature_isset(&rdev->wiphy, 6022 NL80211_EXT_FEATURE_BEACON_RATE_EHT)) 6023 return -EINVAL; 6024 6025 return 0; 6026 } 6027 6028 static int nl80211_parse_mbssid_config(struct wiphy *wiphy, 6029 struct net_device *dev, 6030 unsigned int link_id, 6031 struct nlattr *attrs, 6032 struct cfg80211_mbssid_config *config, 6033 u8 num_elems) 6034 { 6035 struct nlattr *tb[NL80211_MBSSID_CONFIG_ATTR_MAX + 1]; 6036 int tx_link_id = -1; 6037 6038 if (!wiphy->mbssid_max_interfaces) 6039 return -EOPNOTSUPP; 6040 6041 if (nla_parse_nested(tb, NL80211_MBSSID_CONFIG_ATTR_MAX, attrs, NULL, 6042 NULL) || 6043 !tb[NL80211_MBSSID_CONFIG_ATTR_INDEX]) 6044 return -EINVAL; 6045 6046 config->ema = nla_get_flag(tb[NL80211_MBSSID_CONFIG_ATTR_EMA]); 6047 if (config->ema) { 6048 if (!wiphy->ema_max_profile_periodicity) 6049 return -EOPNOTSUPP; 6050 6051 if (num_elems > wiphy->ema_max_profile_periodicity) 6052 return -EINVAL; 6053 } 6054 6055 config->index = nla_get_u8(tb[NL80211_MBSSID_CONFIG_ATTR_INDEX]); 6056 if (config->index >= wiphy->mbssid_max_interfaces || 6057 (!config->index && !num_elems)) 6058 return -EINVAL; 6059 6060 if (tb[NL80211_MBSSID_CONFIG_ATTR_TX_LINK_ID]) 6061 tx_link_id = nla_get_u8(tb[NL80211_MBSSID_CONFIG_ATTR_TX_LINK_ID]); 6062 6063 if (tb[NL80211_MBSSID_CONFIG_ATTR_TX_IFINDEX]) { 6064 u32 tx_ifindex = 6065 nla_get_u32(tb[NL80211_MBSSID_CONFIG_ATTR_TX_IFINDEX]); 6066 6067 if ((!config->index && tx_ifindex != dev->ifindex) || 6068 (config->index && tx_ifindex == dev->ifindex)) 6069 return -EINVAL; 6070 6071 if (tx_ifindex != dev->ifindex) { 6072 struct net_device *tx_netdev = 6073 dev_get_by_index(wiphy_net(wiphy), tx_ifindex); 6074 6075 if (!tx_netdev || !tx_netdev->ieee80211_ptr || 6076 tx_netdev->ieee80211_ptr->wiphy != wiphy || 6077 tx_netdev->ieee80211_ptr->iftype != 6078 NL80211_IFTYPE_AP) { 6079 dev_put(tx_netdev); 6080 return -EINVAL; 6081 } 6082 6083 config->tx_wdev = tx_netdev->ieee80211_ptr; 6084 /* Caller should call dev_put(config->tx_wdev) from this point */ 6085 6086 if (config->tx_wdev->valid_links) { 6087 if (tx_link_id == -1 || 6088 !(config->tx_wdev->valid_links & BIT(tx_link_id))) 6089 return -ENOLINK; 6090 6091 config->tx_link_id = tx_link_id; 6092 } 6093 } else { 6094 if (tx_link_id >= 0 && tx_link_id != link_id) 6095 return -EINVAL; 6096 6097 config->tx_wdev = dev->ieee80211_ptr; 6098 } 6099 } else if (!config->index) { 6100 if (tx_link_id >= 0 && tx_link_id != link_id) 6101 return -EINVAL; 6102 6103 config->tx_wdev = dev->ieee80211_ptr; 6104 } else { 6105 return -EINVAL; 6106 } 6107 6108 return 0; 6109 } 6110 6111 static struct cfg80211_mbssid_elems * 6112 nl80211_parse_mbssid_elems(struct wiphy *wiphy, struct nlattr *attrs) 6113 { 6114 struct nlattr *nl_elems; 6115 struct cfg80211_mbssid_elems *elems; 6116 int rem_elems; 6117 u8 i = 0, num_elems = 0; 6118 6119 if (!wiphy->mbssid_max_interfaces) 6120 return ERR_PTR(-EINVAL); 6121 6122 nla_for_each_nested(nl_elems, attrs, rem_elems) { 6123 if (num_elems >= 255) 6124 return ERR_PTR(-EINVAL); 6125 num_elems++; 6126 } 6127 6128 elems = kzalloc_flex(*elems, elem, num_elems); 6129 if (!elems) 6130 return ERR_PTR(-ENOMEM); 6131 elems->cnt = num_elems; 6132 6133 nla_for_each_nested(nl_elems, attrs, rem_elems) { 6134 elems->elem[i].data = nla_data(nl_elems); 6135 elems->elem[i].len = nla_len(nl_elems); 6136 i++; 6137 } 6138 return elems; 6139 } 6140 6141 static struct cfg80211_rnr_elems * 6142 nl80211_parse_rnr_elems(struct wiphy *wiphy, struct nlattr *attrs, 6143 struct netlink_ext_ack *extack) 6144 { 6145 struct nlattr *nl_elems; 6146 struct cfg80211_rnr_elems *elems; 6147 int rem_elems; 6148 u8 i = 0, num_elems = 0; 6149 6150 nla_for_each_nested(nl_elems, attrs, rem_elems) { 6151 int ret; 6152 6153 ret = validate_ie_attr(nl_elems, extack); 6154 if (ret) 6155 return ERR_PTR(ret); 6156 6157 num_elems++; 6158 } 6159 6160 elems = kzalloc_flex(*elems, elem, num_elems); 6161 if (!elems) 6162 return ERR_PTR(-ENOMEM); 6163 elems->cnt = num_elems; 6164 6165 nla_for_each_nested(nl_elems, attrs, rem_elems) { 6166 elems->elem[i].data = nla_data(nl_elems); 6167 elems->elem[i].len = nla_len(nl_elems); 6168 i++; 6169 } 6170 return elems; 6171 } 6172 6173 static int nl80211_parse_he_bss_color(struct nlattr *attrs, 6174 struct cfg80211_he_bss_color *he_bss_color) 6175 { 6176 struct nlattr *tb[NL80211_HE_BSS_COLOR_ATTR_MAX + 1]; 6177 int err; 6178 6179 err = nla_parse_nested(tb, NL80211_HE_BSS_COLOR_ATTR_MAX, attrs, 6180 he_bss_color_policy, NULL); 6181 if (err) 6182 return err; 6183 6184 if (!tb[NL80211_HE_BSS_COLOR_ATTR_COLOR]) 6185 return -EINVAL; 6186 6187 he_bss_color->color = 6188 nla_get_u8(tb[NL80211_HE_BSS_COLOR_ATTR_COLOR]); 6189 he_bss_color->enabled = 6190 !nla_get_flag(tb[NL80211_HE_BSS_COLOR_ATTR_DISABLED]); 6191 he_bss_color->partial = 6192 nla_get_flag(tb[NL80211_HE_BSS_COLOR_ATTR_PARTIAL]); 6193 6194 return 0; 6195 } 6196 6197 static int nl80211_parse_beacon(struct cfg80211_registered_device *rdev, 6198 struct nlattr *attrs[], 6199 struct cfg80211_beacon_data *bcn, 6200 struct netlink_ext_ack *extack) 6201 { 6202 bool haveinfo = false; 6203 int err; 6204 6205 memset(bcn, 0, sizeof(*bcn)); 6206 6207 bcn->link_id = nl80211_link_id(attrs); 6208 6209 if (attrs[NL80211_ATTR_BEACON_HEAD]) { 6210 bcn->head = nla_data(attrs[NL80211_ATTR_BEACON_HEAD]); 6211 bcn->head_len = nla_len(attrs[NL80211_ATTR_BEACON_HEAD]); 6212 if (!bcn->head_len) 6213 return -EINVAL; 6214 haveinfo = true; 6215 } 6216 6217 if (attrs[NL80211_ATTR_BEACON_TAIL]) { 6218 bcn->tail = nla_data(attrs[NL80211_ATTR_BEACON_TAIL]); 6219 bcn->tail_len = nla_len(attrs[NL80211_ATTR_BEACON_TAIL]); 6220 haveinfo = true; 6221 } 6222 6223 if (!haveinfo) 6224 return -EINVAL; 6225 6226 if (attrs[NL80211_ATTR_IE]) { 6227 bcn->beacon_ies = nla_data(attrs[NL80211_ATTR_IE]); 6228 bcn->beacon_ies_len = nla_len(attrs[NL80211_ATTR_IE]); 6229 } 6230 6231 if (attrs[NL80211_ATTR_IE_PROBE_RESP]) { 6232 bcn->proberesp_ies = 6233 nla_data(attrs[NL80211_ATTR_IE_PROBE_RESP]); 6234 bcn->proberesp_ies_len = 6235 nla_len(attrs[NL80211_ATTR_IE_PROBE_RESP]); 6236 } 6237 6238 if (attrs[NL80211_ATTR_IE_ASSOC_RESP]) { 6239 bcn->assocresp_ies = 6240 nla_data(attrs[NL80211_ATTR_IE_ASSOC_RESP]); 6241 bcn->assocresp_ies_len = 6242 nla_len(attrs[NL80211_ATTR_IE_ASSOC_RESP]); 6243 } 6244 6245 if (attrs[NL80211_ATTR_PROBE_RESP]) { 6246 bcn->probe_resp = nla_data(attrs[NL80211_ATTR_PROBE_RESP]); 6247 bcn->probe_resp_len = nla_len(attrs[NL80211_ATTR_PROBE_RESP]); 6248 } 6249 6250 if (attrs[NL80211_ATTR_FTM_RESPONDER]) { 6251 struct nlattr *tb[NL80211_FTM_RESP_ATTR_MAX + 1]; 6252 6253 err = nla_parse_nested_deprecated(tb, 6254 NL80211_FTM_RESP_ATTR_MAX, 6255 attrs[NL80211_ATTR_FTM_RESPONDER], 6256 NULL, NULL); 6257 if (err) 6258 return err; 6259 6260 if (tb[NL80211_FTM_RESP_ATTR_ENABLED] && 6261 wiphy_ext_feature_isset(&rdev->wiphy, 6262 NL80211_EXT_FEATURE_ENABLE_FTM_RESPONDER)) 6263 bcn->ftm_responder = 1; 6264 else 6265 return -EOPNOTSUPP; 6266 6267 if (tb[NL80211_FTM_RESP_ATTR_LCI]) { 6268 bcn->lci = nla_data(tb[NL80211_FTM_RESP_ATTR_LCI]); 6269 bcn->lci_len = nla_len(tb[NL80211_FTM_RESP_ATTR_LCI]); 6270 } 6271 6272 if (tb[NL80211_FTM_RESP_ATTR_CIVICLOC]) { 6273 bcn->civicloc = nla_data(tb[NL80211_FTM_RESP_ATTR_CIVICLOC]); 6274 bcn->civicloc_len = nla_len(tb[NL80211_FTM_RESP_ATTR_CIVICLOC]); 6275 } 6276 } else { 6277 bcn->ftm_responder = -1; 6278 } 6279 6280 if (attrs[NL80211_ATTR_HE_BSS_COLOR]) { 6281 err = nl80211_parse_he_bss_color(attrs[NL80211_ATTR_HE_BSS_COLOR], 6282 &bcn->he_bss_color); 6283 if (err) 6284 return err; 6285 bcn->he_bss_color_valid = true; 6286 } 6287 6288 if (attrs[NL80211_ATTR_MBSSID_ELEMS]) { 6289 struct cfg80211_mbssid_elems *mbssid = 6290 nl80211_parse_mbssid_elems(&rdev->wiphy, 6291 attrs[NL80211_ATTR_MBSSID_ELEMS]); 6292 6293 if (IS_ERR(mbssid)) 6294 return PTR_ERR(mbssid); 6295 6296 bcn->mbssid_ies = mbssid; 6297 6298 if (bcn->mbssid_ies && attrs[NL80211_ATTR_EMA_RNR_ELEMS]) { 6299 struct cfg80211_rnr_elems *rnr = 6300 nl80211_parse_rnr_elems(&rdev->wiphy, 6301 attrs[NL80211_ATTR_EMA_RNR_ELEMS], 6302 extack); 6303 6304 if (IS_ERR(rnr)) 6305 return PTR_ERR(rnr); 6306 6307 if (rnr && rnr->cnt < bcn->mbssid_ies->cnt) 6308 return -EINVAL; 6309 6310 bcn->rnr_ies = rnr; 6311 } 6312 } 6313 6314 return 0; 6315 } 6316 6317 static int nl80211_parse_he_obss_pd(struct nlattr *attrs, 6318 struct ieee80211_he_obss_pd *he_obss_pd) 6319 { 6320 struct nlattr *tb[NL80211_HE_OBSS_PD_ATTR_MAX + 1]; 6321 int err; 6322 6323 err = nla_parse_nested(tb, NL80211_HE_OBSS_PD_ATTR_MAX, attrs, 6324 he_obss_pd_policy, NULL); 6325 if (err) 6326 return err; 6327 6328 if (!tb[NL80211_HE_OBSS_PD_ATTR_SR_CTRL]) 6329 return -EINVAL; 6330 6331 he_obss_pd->sr_ctrl = nla_get_u8(tb[NL80211_HE_OBSS_PD_ATTR_SR_CTRL]); 6332 6333 if (tb[NL80211_HE_OBSS_PD_ATTR_MIN_OFFSET]) 6334 he_obss_pd->min_offset = 6335 nla_get_u8(tb[NL80211_HE_OBSS_PD_ATTR_MIN_OFFSET]); 6336 if (tb[NL80211_HE_OBSS_PD_ATTR_MAX_OFFSET]) 6337 he_obss_pd->max_offset = 6338 nla_get_u8(tb[NL80211_HE_OBSS_PD_ATTR_MAX_OFFSET]); 6339 if (tb[NL80211_HE_OBSS_PD_ATTR_NON_SRG_MAX_OFFSET]) 6340 he_obss_pd->non_srg_max_offset = 6341 nla_get_u8(tb[NL80211_HE_OBSS_PD_ATTR_NON_SRG_MAX_OFFSET]); 6342 6343 if (he_obss_pd->min_offset > he_obss_pd->max_offset) 6344 return -EINVAL; 6345 6346 if (tb[NL80211_HE_OBSS_PD_ATTR_BSS_COLOR_BITMAP]) 6347 memcpy(he_obss_pd->bss_color_bitmap, 6348 nla_data(tb[NL80211_HE_OBSS_PD_ATTR_BSS_COLOR_BITMAP]), 6349 sizeof(he_obss_pd->bss_color_bitmap)); 6350 6351 if (tb[NL80211_HE_OBSS_PD_ATTR_PARTIAL_BSSID_BITMAP]) 6352 memcpy(he_obss_pd->partial_bssid_bitmap, 6353 nla_data(tb[NL80211_HE_OBSS_PD_ATTR_PARTIAL_BSSID_BITMAP]), 6354 sizeof(he_obss_pd->partial_bssid_bitmap)); 6355 6356 he_obss_pd->enable = true; 6357 6358 return 0; 6359 } 6360 6361 static int nl80211_parse_fils_discovery(struct cfg80211_registered_device *rdev, 6362 struct nlattr *attrs, 6363 struct cfg80211_fils_discovery *fd) 6364 { 6365 struct nlattr *tb[NL80211_FILS_DISCOVERY_ATTR_MAX + 1]; 6366 int ret; 6367 6368 if (!wiphy_ext_feature_isset(&rdev->wiphy, 6369 NL80211_EXT_FEATURE_FILS_DISCOVERY)) 6370 return -EINVAL; 6371 6372 ret = nla_parse_nested(tb, NL80211_FILS_DISCOVERY_ATTR_MAX, attrs, 6373 NULL, NULL); 6374 if (ret) 6375 return ret; 6376 6377 if (!tb[NL80211_FILS_DISCOVERY_ATTR_INT_MIN] && 6378 !tb[NL80211_FILS_DISCOVERY_ATTR_INT_MAX] && 6379 !tb[NL80211_FILS_DISCOVERY_ATTR_TMPL]) { 6380 fd->update = true; 6381 return 0; 6382 } 6383 6384 if (!tb[NL80211_FILS_DISCOVERY_ATTR_INT_MIN] || 6385 !tb[NL80211_FILS_DISCOVERY_ATTR_INT_MAX] || 6386 !tb[NL80211_FILS_DISCOVERY_ATTR_TMPL]) 6387 return -EINVAL; 6388 6389 fd->tmpl_len = nla_len(tb[NL80211_FILS_DISCOVERY_ATTR_TMPL]); 6390 fd->tmpl = nla_data(tb[NL80211_FILS_DISCOVERY_ATTR_TMPL]); 6391 fd->min_interval = nla_get_u32(tb[NL80211_FILS_DISCOVERY_ATTR_INT_MIN]); 6392 fd->max_interval = nla_get_u32(tb[NL80211_FILS_DISCOVERY_ATTR_INT_MAX]); 6393 fd->update = true; 6394 return 0; 6395 } 6396 6397 static int 6398 nl80211_parse_unsol_bcast_probe_resp(struct cfg80211_registered_device *rdev, 6399 struct nlattr *attrs, 6400 struct cfg80211_unsol_bcast_probe_resp *presp) 6401 { 6402 struct nlattr *tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_MAX + 1]; 6403 int ret; 6404 6405 if (!wiphy_ext_feature_isset(&rdev->wiphy, 6406 NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP)) 6407 return -EINVAL; 6408 6409 ret = nla_parse_nested(tb, NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_MAX, 6410 attrs, NULL, NULL); 6411 if (ret) 6412 return ret; 6413 6414 if (!tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_INT] && 6415 !tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_TMPL]) { 6416 presp->update = true; 6417 return 0; 6418 } 6419 6420 if (!tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_INT] || 6421 !tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_TMPL]) 6422 return -EINVAL; 6423 6424 presp->tmpl = nla_data(tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_TMPL]); 6425 presp->tmpl_len = nla_len(tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_TMPL]); 6426 presp->interval = nla_get_u32(tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_INT]); 6427 presp->update = true; 6428 return 0; 6429 } 6430 6431 static void nl80211_check_ap_rate_selectors(struct cfg80211_ap_settings *params, 6432 const struct element *rates) 6433 { 6434 int i; 6435 6436 if (!rates) 6437 return; 6438 6439 for (i = 0; i < rates->datalen; i++) { 6440 if (rates->data[i] == BSS_MEMBERSHIP_SELECTOR_HT_PHY) 6441 params->ht_required = true; 6442 if (rates->data[i] == BSS_MEMBERSHIP_SELECTOR_VHT_PHY) 6443 params->vht_required = true; 6444 if (rates->data[i] == BSS_MEMBERSHIP_SELECTOR_HE_PHY) 6445 params->he_required = true; 6446 if (rates->data[i] == BSS_MEMBERSHIP_SELECTOR_SAE_H2E) 6447 params->sae_h2e_required = true; 6448 } 6449 } 6450 6451 /* 6452 * Since the nl80211 API didn't include, from the beginning, attributes about 6453 * HT/VHT requirements/capabilities, we parse them out of the IEs for the 6454 * benefit of drivers that rebuild IEs in the firmware. 6455 */ 6456 static int nl80211_calculate_ap_params(struct cfg80211_ap_settings *params) 6457 { 6458 const struct cfg80211_beacon_data *bcn = ¶ms->beacon; 6459 size_t ies_len = bcn->tail_len; 6460 const u8 *ies = bcn->tail; 6461 const struct element *rates; 6462 const struct element *cap; 6463 6464 rates = cfg80211_find_elem(WLAN_EID_SUPP_RATES, ies, ies_len); 6465 nl80211_check_ap_rate_selectors(params, rates); 6466 6467 rates = cfg80211_find_elem(WLAN_EID_EXT_SUPP_RATES, ies, ies_len); 6468 nl80211_check_ap_rate_selectors(params, rates); 6469 6470 cap = cfg80211_find_elem(WLAN_EID_HT_CAPABILITY, ies, ies_len); 6471 if (cap && cap->datalen >= sizeof(*params->ht_cap)) 6472 params->ht_cap = (void *)cap->data; 6473 cap = cfg80211_find_elem(WLAN_EID_VHT_CAPABILITY, ies, ies_len); 6474 if (cap && cap->datalen >= sizeof(*params->vht_cap)) 6475 params->vht_cap = (void *)cap->data; 6476 cap = cfg80211_find_ext_elem(WLAN_EID_EXT_HE_CAPABILITY, ies, ies_len); 6477 if (cap && cap->datalen >= sizeof(*params->he_cap) + 1) 6478 params->he_cap = (void *)(cap->data + 1); 6479 cap = cfg80211_find_ext_elem(WLAN_EID_EXT_HE_OPERATION, ies, ies_len); 6480 if (cap && cap->datalen >= sizeof(*params->he_oper) + 1) 6481 params->he_oper = (void *)(cap->data + 1); 6482 cap = cfg80211_find_ext_elem(WLAN_EID_EXT_EHT_CAPABILITY, ies, ies_len); 6483 if (cap) { 6484 if (!cap->datalen) 6485 return -EINVAL; 6486 params->eht_cap = (void *)(cap->data + 1); 6487 if (!ieee80211_eht_capa_size_ok((const u8 *)params->he_cap, 6488 (const u8 *)params->eht_cap, 6489 cap->datalen - 1, true)) 6490 return -EINVAL; 6491 } 6492 cap = cfg80211_find_ext_elem(WLAN_EID_EXT_EHT_OPERATION, ies, ies_len); 6493 if (cap) { 6494 if (!cap->datalen) 6495 return -EINVAL; 6496 params->eht_oper = (void *)(cap->data + 1); 6497 if (!ieee80211_eht_oper_size_ok((const u8 *)params->eht_oper, 6498 cap->datalen - 1)) 6499 return -EINVAL; 6500 } 6501 6502 cap = cfg80211_find_ext_elem(WLAN_EID_EXT_UHR_OPER, ies, ies_len); 6503 if (cap) { 6504 if (!cap->datalen) 6505 return -EINVAL; 6506 params->uhr_oper = (void *)(cap->data + 1); 6507 if (!ieee80211_uhr_oper_size_ok((const u8 *)params->uhr_oper, 6508 cap->datalen - 1, true)) 6509 return -EINVAL; 6510 } 6511 6512 return 0; 6513 } 6514 6515 static bool nl80211_get_ap_channel(struct cfg80211_registered_device *rdev, 6516 struct cfg80211_ap_settings *params) 6517 { 6518 struct wireless_dev *wdev; 6519 6520 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) { 6521 if (wdev->iftype != NL80211_IFTYPE_AP && 6522 wdev->iftype != NL80211_IFTYPE_P2P_GO) 6523 continue; 6524 6525 if (!wdev->u.ap.preset_chandef.chan) 6526 continue; 6527 6528 params->chandef = wdev->u.ap.preset_chandef; 6529 return true; 6530 } 6531 6532 return false; 6533 } 6534 6535 static bool nl80211_valid_auth_type(struct cfg80211_registered_device *rdev, 6536 enum nl80211_auth_type auth_type, 6537 enum nl80211_commands cmd) 6538 { 6539 if (auth_type > NL80211_AUTHTYPE_MAX) 6540 return false; 6541 6542 switch (cmd) { 6543 case NL80211_CMD_AUTHENTICATE: 6544 if (!(rdev->wiphy.features & NL80211_FEATURE_SAE) && 6545 auth_type == NL80211_AUTHTYPE_SAE) 6546 return false; 6547 if (!wiphy_ext_feature_isset(&rdev->wiphy, 6548 NL80211_EXT_FEATURE_FILS_STA) && 6549 (auth_type == NL80211_AUTHTYPE_FILS_SK || 6550 auth_type == NL80211_AUTHTYPE_FILS_SK_PFS || 6551 auth_type == NL80211_AUTHTYPE_FILS_PK)) 6552 return false; 6553 if (!wiphy_ext_feature_isset(&rdev->wiphy, 6554 NL80211_EXT_FEATURE_EPPKE) && 6555 auth_type == NL80211_AUTHTYPE_EPPKE) 6556 return false; 6557 if (!wiphy_ext_feature_isset(&rdev->wiphy, 6558 NL80211_EXT_FEATURE_IEEE8021X_AUTH) && 6559 auth_type == NL80211_AUTHTYPE_IEEE8021X) 6560 return false; 6561 return true; 6562 case NL80211_CMD_CONNECT: 6563 if (!(rdev->wiphy.features & NL80211_FEATURE_SAE) && 6564 !wiphy_ext_feature_isset(&rdev->wiphy, 6565 NL80211_EXT_FEATURE_SAE_OFFLOAD) && 6566 auth_type == NL80211_AUTHTYPE_SAE) 6567 return false; 6568 6569 /* FILS with SK PFS or PK not supported yet */ 6570 if (auth_type == NL80211_AUTHTYPE_FILS_SK_PFS || 6571 auth_type == NL80211_AUTHTYPE_FILS_PK) 6572 return false; 6573 if (!wiphy_ext_feature_isset( 6574 &rdev->wiphy, 6575 NL80211_EXT_FEATURE_FILS_SK_OFFLOAD) && 6576 auth_type == NL80211_AUTHTYPE_FILS_SK) 6577 return false; 6578 if (!wiphy_ext_feature_isset(&rdev->wiphy, 6579 NL80211_EXT_FEATURE_EPPKE) && 6580 auth_type == NL80211_AUTHTYPE_EPPKE) 6581 return false; 6582 if (!wiphy_ext_feature_isset(&rdev->wiphy, 6583 NL80211_EXT_FEATURE_IEEE8021X_AUTH) && 6584 auth_type == NL80211_AUTHTYPE_IEEE8021X) 6585 return false; 6586 return true; 6587 case NL80211_CMD_START_AP: 6588 if (!wiphy_ext_feature_isset(&rdev->wiphy, 6589 NL80211_EXT_FEATURE_SAE_OFFLOAD_AP) && 6590 auth_type == NL80211_AUTHTYPE_SAE) 6591 return false; 6592 /* FILS not supported yet */ 6593 if (auth_type == NL80211_AUTHTYPE_FILS_SK || 6594 auth_type == NL80211_AUTHTYPE_FILS_SK_PFS || 6595 auth_type == NL80211_AUTHTYPE_FILS_PK) 6596 return false; 6597 return true; 6598 default: 6599 return false; 6600 } 6601 } 6602 6603 static void nl80211_send_ap_started(struct wireless_dev *wdev, 6604 unsigned int link_id) 6605 { 6606 struct wiphy *wiphy = wdev->wiphy; 6607 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 6608 struct sk_buff *msg; 6609 void *hdr; 6610 6611 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 6612 if (!msg) 6613 return; 6614 6615 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_START_AP); 6616 if (!hdr) 6617 goto out; 6618 6619 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 6620 nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex) || 6621 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 6622 NL80211_ATTR_PAD) || 6623 (wdev->u.ap.ssid_len && 6624 nla_put(msg, NL80211_ATTR_SSID, wdev->u.ap.ssid_len, 6625 wdev->u.ap.ssid)) || 6626 (wdev->valid_links && 6627 nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link_id))) 6628 goto out; 6629 6630 genlmsg_end(msg, hdr); 6631 6632 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(wiphy), msg, 0, 6633 NL80211_MCGRP_MLME, GFP_KERNEL); 6634 return; 6635 out: 6636 nlmsg_free(msg); 6637 } 6638 6639 static int nl80211_validate_ap_phy_operation(struct cfg80211_ap_settings *params) 6640 { 6641 struct ieee80211_channel *channel = params->chandef.chan; 6642 6643 if ((params->he_cap || params->he_oper) && 6644 (channel->flags & IEEE80211_CHAN_NO_HE)) 6645 return -EOPNOTSUPP; 6646 6647 if ((params->eht_cap || params->eht_oper) && 6648 (channel->flags & IEEE80211_CHAN_NO_EHT)) 6649 return -EOPNOTSUPP; 6650 6651 if (params->uhr_oper && (channel->flags & IEEE80211_CHAN_NO_UHR)) 6652 return -EOPNOTSUPP; 6653 6654 return 0; 6655 } 6656 6657 static int 6658 nl80211_parse_s1g_short_beacon(struct cfg80211_registered_device *rdev, 6659 struct nlattr *attrs, 6660 struct cfg80211_s1g_short_beacon *sb) 6661 { 6662 struct nlattr *tb[NL80211_S1G_SHORT_BEACON_ATTR_MAX + 1]; 6663 int ret; 6664 6665 if (!rdev->wiphy.bands[NL80211_BAND_S1GHZ]) 6666 return -EINVAL; 6667 6668 ret = nla_parse_nested(tb, NL80211_S1G_SHORT_BEACON_ATTR_MAX, attrs, 6669 NULL, NULL); 6670 if (ret) 6671 return ret; 6672 6673 /* Short beacon tail is optional (i.e might only include the TIM) */ 6674 if (!tb[NL80211_S1G_SHORT_BEACON_ATTR_HEAD]) 6675 return -EINVAL; 6676 6677 sb->short_head = nla_data(tb[NL80211_S1G_SHORT_BEACON_ATTR_HEAD]); 6678 sb->short_head_len = nla_len(tb[NL80211_S1G_SHORT_BEACON_ATTR_HEAD]); 6679 sb->short_tail_len = 0; 6680 6681 if (tb[NL80211_S1G_SHORT_BEACON_ATTR_TAIL]) { 6682 sb->short_tail = 6683 nla_data(tb[NL80211_S1G_SHORT_BEACON_ATTR_TAIL]); 6684 sb->short_tail_len = 6685 nla_len(tb[NL80211_S1G_SHORT_BEACON_ATTR_TAIL]); 6686 } 6687 6688 sb->update = true; 6689 return 0; 6690 } 6691 6692 static int nl80211_start_ap(struct sk_buff *skb, struct genl_info *info) 6693 { 6694 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 6695 struct cfg80211_beaconing_check_config beacon_check = {}; 6696 unsigned int link_id = nl80211_link_id(info->attrs); 6697 struct net_device *dev = info->user_ptr[1]; 6698 struct wireless_dev *wdev = dev->ieee80211_ptr; 6699 struct cfg80211_ap_settings *params; 6700 int err; 6701 6702 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 6703 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 6704 return -EOPNOTSUPP; 6705 6706 if (!rdev->ops->start_ap) 6707 return -EOPNOTSUPP; 6708 6709 if (wdev->links[link_id].cac_started) 6710 return -EBUSY; 6711 6712 if (wdev->links[link_id].ap.beacon_interval) 6713 return -EALREADY; 6714 6715 /* these are required for START_AP */ 6716 if (!info->attrs[NL80211_ATTR_BEACON_INTERVAL] || 6717 !info->attrs[NL80211_ATTR_DTIM_PERIOD] || 6718 !info->attrs[NL80211_ATTR_BEACON_HEAD]) 6719 return -EINVAL; 6720 6721 if (info->attrs[NL80211_ATTR_SMPS_MODE] && 6722 nla_get_u8(info->attrs[NL80211_ATTR_SMPS_MODE]) != NL80211_SMPS_OFF) 6723 return -EOPNOTSUPP; 6724 6725 params = kzalloc_obj(*params); 6726 if (!params) 6727 return -ENOMEM; 6728 6729 err = nl80211_parse_beacon(rdev, info->attrs, ¶ms->beacon, 6730 info->extack); 6731 if (err) 6732 goto out; 6733 6734 params->beacon_interval = 6735 nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]); 6736 params->dtim_period = 6737 nla_get_u32(info->attrs[NL80211_ATTR_DTIM_PERIOD]); 6738 6739 err = cfg80211_validate_beacon_int(rdev, dev->ieee80211_ptr->iftype, 6740 params->beacon_interval); 6741 if (err) 6742 goto out; 6743 6744 /* 6745 * In theory, some of these attributes should be required here 6746 * but since they were not used when the command was originally 6747 * added, keep them optional for old user space programs to let 6748 * them continue to work with drivers that do not need the 6749 * additional information -- drivers must check! 6750 */ 6751 if (info->attrs[NL80211_ATTR_SSID]) { 6752 params->ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); 6753 params->ssid_len = 6754 nla_len(info->attrs[NL80211_ATTR_SSID]); 6755 if (params->ssid_len == 0) { 6756 err = -EINVAL; 6757 goto out; 6758 } 6759 6760 if (wdev->u.ap.ssid_len && 6761 (wdev->u.ap.ssid_len != params->ssid_len || 6762 memcmp(wdev->u.ap.ssid, params->ssid, params->ssid_len))) { 6763 /* require identical SSID for MLO */ 6764 err = -EINVAL; 6765 goto out; 6766 } 6767 } else if (wdev->valid_links) { 6768 /* require SSID for MLO */ 6769 err = -EINVAL; 6770 goto out; 6771 } 6772 6773 if (info->attrs[NL80211_ATTR_HIDDEN_SSID]) 6774 params->hidden_ssid = nla_get_u32( 6775 info->attrs[NL80211_ATTR_HIDDEN_SSID]); 6776 6777 params->privacy = !!info->attrs[NL80211_ATTR_PRIVACY]; 6778 6779 if (info->attrs[NL80211_ATTR_AUTH_TYPE]) { 6780 params->auth_type = nla_get_u32( 6781 info->attrs[NL80211_ATTR_AUTH_TYPE]); 6782 if (!nl80211_valid_auth_type(rdev, params->auth_type, 6783 NL80211_CMD_START_AP)) { 6784 err = -EINVAL; 6785 goto out; 6786 } 6787 } else 6788 params->auth_type = NL80211_AUTHTYPE_AUTOMATIC; 6789 6790 err = nl80211_crypto_settings(rdev, info, ¶ms->crypto, 6791 NL80211_MAX_NR_CIPHER_SUITES); 6792 if (err) 6793 goto out; 6794 6795 if (info->attrs[NL80211_ATTR_INACTIVITY_TIMEOUT]) { 6796 if (!(rdev->wiphy.features & NL80211_FEATURE_INACTIVITY_TIMER)) { 6797 err = -EOPNOTSUPP; 6798 goto out; 6799 } 6800 params->inactivity_timeout = nla_get_u16( 6801 info->attrs[NL80211_ATTR_INACTIVITY_TIMEOUT]); 6802 } 6803 6804 if (info->attrs[NL80211_ATTR_P2P_CTWINDOW]) { 6805 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) { 6806 err = -EINVAL; 6807 goto out; 6808 } 6809 params->p2p_ctwindow = 6810 nla_get_u8(info->attrs[NL80211_ATTR_P2P_CTWINDOW]); 6811 if (params->p2p_ctwindow != 0 && 6812 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_CTWIN)) { 6813 err = -EINVAL; 6814 goto out; 6815 } 6816 } 6817 6818 if (info->attrs[NL80211_ATTR_P2P_OPPPS]) { 6819 u8 tmp; 6820 6821 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) { 6822 err = -EINVAL; 6823 goto out; 6824 } 6825 tmp = nla_get_u8(info->attrs[NL80211_ATTR_P2P_OPPPS]); 6826 params->p2p_opp_ps = tmp; 6827 if (params->p2p_opp_ps != 0 && 6828 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_OPPPS)) { 6829 err = -EINVAL; 6830 goto out; 6831 } 6832 } 6833 6834 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { 6835 err = nl80211_parse_chandef(rdev, info->extack, info->attrs, 6836 ¶ms->chandef); 6837 if (err) 6838 goto out; 6839 } else if (wdev->valid_links) { 6840 /* with MLD need to specify the channel configuration */ 6841 err = -EINVAL; 6842 goto out; 6843 } else if (wdev->u.ap.preset_chandef.chan) { 6844 params->chandef = wdev->u.ap.preset_chandef; 6845 } else if (!nl80211_get_ap_channel(rdev, params)) { 6846 err = -EINVAL; 6847 goto out; 6848 } 6849 6850 beacon_check.iftype = wdev->iftype; 6851 beacon_check.relax = true; 6852 beacon_check.reg_power = 6853 cfg80211_get_6ghz_power_type(params->beacon.tail, 6854 params->beacon.tail_len, 0); 6855 if (!cfg80211_reg_check_beaconing(&rdev->wiphy, ¶ms->chandef, 6856 &beacon_check)) { 6857 err = -EINVAL; 6858 goto out; 6859 } 6860 6861 if (info->attrs[NL80211_ATTR_TX_RATES]) { 6862 err = nl80211_parse_tx_bitrate_mask(info, info->attrs, 6863 NL80211_ATTR_TX_RATES, 6864 ¶ms->beacon_rate, 6865 dev, false, link_id); 6866 if (err) 6867 goto out; 6868 6869 err = validate_beacon_tx_rate(rdev, params->chandef.chan->band, 6870 ¶ms->beacon_rate); 6871 if (err) 6872 goto out; 6873 } 6874 6875 params->pbss = nla_get_flag(info->attrs[NL80211_ATTR_PBSS]); 6876 if (params->pbss && !rdev->wiphy.bands[NL80211_BAND_60GHZ]) { 6877 err = -EOPNOTSUPP; 6878 goto out; 6879 } 6880 6881 if (info->attrs[NL80211_ATTR_ACL_POLICY]) { 6882 params->acl = parse_acl_data(&rdev->wiphy, info); 6883 if (IS_ERR(params->acl)) { 6884 err = PTR_ERR(params->acl); 6885 params->acl = NULL; 6886 goto out; 6887 } 6888 } 6889 6890 params->twt_responder = 6891 nla_get_flag(info->attrs[NL80211_ATTR_TWT_RESPONDER]); 6892 6893 if (info->attrs[NL80211_ATTR_HE_OBSS_PD]) { 6894 err = nl80211_parse_he_obss_pd( 6895 info->attrs[NL80211_ATTR_HE_OBSS_PD], 6896 ¶ms->he_obss_pd); 6897 if (err) 6898 goto out; 6899 } 6900 6901 if (info->attrs[NL80211_ATTR_FILS_DISCOVERY]) { 6902 err = nl80211_parse_fils_discovery(rdev, 6903 info->attrs[NL80211_ATTR_FILS_DISCOVERY], 6904 ¶ms->fils_discovery); 6905 if (err) 6906 goto out; 6907 } 6908 6909 if (info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP]) { 6910 err = nl80211_parse_unsol_bcast_probe_resp( 6911 rdev, info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP], 6912 ¶ms->unsol_bcast_probe_resp); 6913 if (err) 6914 goto out; 6915 } 6916 6917 if (info->attrs[NL80211_ATTR_MBSSID_CONFIG]) { 6918 err = nl80211_parse_mbssid_config(&rdev->wiphy, dev, link_id, 6919 info->attrs[NL80211_ATTR_MBSSID_CONFIG], 6920 ¶ms->mbssid_config, 6921 params->beacon.mbssid_ies ? 6922 params->beacon.mbssid_ies->cnt : 6923 0); 6924 if (err) 6925 goto out; 6926 } 6927 6928 if (!params->mbssid_config.ema && params->beacon.rnr_ies) { 6929 err = -EINVAL; 6930 goto out; 6931 } 6932 6933 if (info->attrs[NL80211_ATTR_S1G_SHORT_BEACON]) { 6934 if (!info->attrs[NL80211_ATTR_S1G_LONG_BEACON_PERIOD]) { 6935 err = -EINVAL; 6936 goto out; 6937 } 6938 6939 params->s1g_long_beacon_period = nla_get_u8( 6940 info->attrs[NL80211_ATTR_S1G_LONG_BEACON_PERIOD]); 6941 6942 err = nl80211_parse_s1g_short_beacon( 6943 rdev, info->attrs[NL80211_ATTR_S1G_SHORT_BEACON], 6944 ¶ms->s1g_short_beacon); 6945 if (err) 6946 goto out; 6947 } 6948 6949 err = nl80211_calculate_ap_params(params); 6950 if (err) 6951 goto out; 6952 6953 err = nl80211_validate_ap_phy_operation(params); 6954 if (err) 6955 goto out; 6956 6957 if (info->attrs[NL80211_ATTR_AP_SETTINGS_FLAGS]) 6958 params->flags = nla_get_u32( 6959 info->attrs[NL80211_ATTR_AP_SETTINGS_FLAGS]); 6960 else if (info->attrs[NL80211_ATTR_EXTERNAL_AUTH_SUPPORT]) 6961 params->flags |= NL80211_AP_SETTINGS_EXTERNAL_AUTH_SUPPORT; 6962 6963 if (wdev->conn_owner_nlportid && 6964 info->attrs[NL80211_ATTR_SOCKET_OWNER] && 6965 wdev->conn_owner_nlportid != info->snd_portid) { 6966 err = -EINVAL; 6967 goto out; 6968 } 6969 6970 /* FIXME: validate MLO/link-id against driver capabilities */ 6971 6972 err = rdev_start_ap(rdev, dev, params); 6973 if (!err) { 6974 wdev->links[link_id].ap.beacon_interval = params->beacon_interval; 6975 wdev->links[link_id].ap.chandef = params->chandef; 6976 wdev->u.ap.ssid_len = params->ssid_len; 6977 memcpy(wdev->u.ap.ssid, params->ssid, 6978 params->ssid_len); 6979 6980 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) 6981 wdev->conn_owner_nlportid = info->snd_portid; 6982 6983 nl80211_send_ap_started(wdev, link_id); 6984 } 6985 out: 6986 kfree(params->acl); 6987 kfree(params->beacon.mbssid_ies); 6988 if (params->mbssid_config.tx_wdev && 6989 params->mbssid_config.tx_wdev->netdev && 6990 params->mbssid_config.tx_wdev->netdev != dev) 6991 dev_put(params->mbssid_config.tx_wdev->netdev); 6992 kfree(params->beacon.rnr_ies); 6993 kfree(params); 6994 6995 return err; 6996 } 6997 6998 static int nl80211_set_beacon(struct sk_buff *skb, struct genl_info *info) 6999 { 7000 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 7001 struct cfg80211_beaconing_check_config beacon_check = {}; 7002 unsigned int link_id = nl80211_link_id(info->attrs); 7003 struct net_device *dev = info->user_ptr[1]; 7004 struct wireless_dev *wdev = dev->ieee80211_ptr; 7005 struct cfg80211_ap_update *params; 7006 struct nlattr *attr; 7007 int err; 7008 7009 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 7010 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 7011 return -EOPNOTSUPP; 7012 7013 if (!rdev->ops->change_beacon) 7014 return -EOPNOTSUPP; 7015 7016 if (!wdev->links[link_id].ap.beacon_interval) 7017 return -EINVAL; 7018 7019 params = kzalloc_obj(*params); 7020 if (!params) 7021 return -ENOMEM; 7022 7023 err = nl80211_parse_beacon(rdev, info->attrs, ¶ms->beacon, 7024 info->extack); 7025 if (err) 7026 goto out; 7027 7028 /* recheck beaconing is permitted with possibly changed power type */ 7029 beacon_check.iftype = wdev->iftype; 7030 beacon_check.relax = true; 7031 beacon_check.reg_power = 7032 cfg80211_get_6ghz_power_type(params->beacon.tail, 7033 params->beacon.tail_len, 0); 7034 if (!cfg80211_reg_check_beaconing(&rdev->wiphy, 7035 &wdev->links[link_id].ap.chandef, 7036 &beacon_check)) { 7037 err = -EINVAL; 7038 goto out; 7039 } 7040 7041 attr = info->attrs[NL80211_ATTR_FILS_DISCOVERY]; 7042 if (attr) { 7043 err = nl80211_parse_fils_discovery(rdev, attr, 7044 ¶ms->fils_discovery); 7045 if (err) 7046 goto out; 7047 } 7048 7049 attr = info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP]; 7050 if (attr) { 7051 err = nl80211_parse_unsol_bcast_probe_resp(rdev, attr, 7052 ¶ms->unsol_bcast_probe_resp); 7053 if (err) 7054 goto out; 7055 } 7056 7057 attr = info->attrs[NL80211_ATTR_S1G_SHORT_BEACON]; 7058 if (attr) { 7059 err = nl80211_parse_s1g_short_beacon(rdev, attr, 7060 ¶ms->s1g_short_beacon); 7061 if (err) 7062 goto out; 7063 } 7064 7065 err = rdev_change_beacon(rdev, dev, params); 7066 7067 out: 7068 kfree(params->beacon.mbssid_ies); 7069 kfree(params->beacon.rnr_ies); 7070 kfree(params); 7071 return err; 7072 } 7073 7074 static int nl80211_stop_ap(struct sk_buff *skb, struct genl_info *info) 7075 { 7076 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 7077 unsigned int link_id = nl80211_link_id(info->attrs); 7078 struct net_device *dev = info->user_ptr[1]; 7079 7080 return cfg80211_stop_ap(rdev, dev, link_id, false); 7081 } 7082 7083 static const struct nla_policy sta_flags_policy[NL80211_STA_FLAG_MAX + 1] = { 7084 [NL80211_STA_FLAG_AUTHORIZED] = { .type = NLA_FLAG }, 7085 [NL80211_STA_FLAG_SHORT_PREAMBLE] = { .type = NLA_FLAG }, 7086 [NL80211_STA_FLAG_WME] = { .type = NLA_FLAG }, 7087 [NL80211_STA_FLAG_MFP] = { .type = NLA_FLAG }, 7088 [NL80211_STA_FLAG_AUTHENTICATED] = { .type = NLA_FLAG }, 7089 [NL80211_STA_FLAG_TDLS_PEER] = { .type = NLA_FLAG }, 7090 }; 7091 7092 static int parse_station_flags(struct genl_info *info, 7093 enum nl80211_iftype iftype, 7094 struct station_parameters *params) 7095 { 7096 struct nlattr *flags[NL80211_STA_FLAG_MAX + 1]; 7097 struct nlattr *nla; 7098 int flag; 7099 7100 /* 7101 * Try parsing the new attribute first so userspace 7102 * can specify both for older kernels. 7103 */ 7104 nla = info->attrs[NL80211_ATTR_STA_FLAGS2]; 7105 if (nla) { 7106 struct nl80211_sta_flag_update *sta_flags; 7107 7108 sta_flags = nla_data(nla); 7109 params->sta_flags_mask = sta_flags->mask; 7110 params->sta_flags_set = sta_flags->set; 7111 params->sta_flags_set &= params->sta_flags_mask; 7112 if ((params->sta_flags_mask | 7113 params->sta_flags_set) & BIT(__NL80211_STA_FLAG_INVALID)) 7114 return -EINVAL; 7115 return 0; 7116 } 7117 7118 /* if present, parse the old attribute */ 7119 7120 nla = info->attrs[NL80211_ATTR_STA_FLAGS]; 7121 if (!nla) 7122 return 0; 7123 7124 if (nla_parse_nested_deprecated(flags, NL80211_STA_FLAG_MAX, nla, sta_flags_policy, info->extack)) 7125 return -EINVAL; 7126 7127 /* 7128 * Only allow certain flags for interface types so that 7129 * other attributes are silently ignored. Remember that 7130 * this is backward compatibility code with old userspace 7131 * and shouldn't be hit in other cases anyway. 7132 */ 7133 switch (iftype) { 7134 case NL80211_IFTYPE_AP: 7135 case NL80211_IFTYPE_AP_VLAN: 7136 case NL80211_IFTYPE_P2P_GO: 7137 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHORIZED) | 7138 BIT(NL80211_STA_FLAG_SHORT_PREAMBLE) | 7139 BIT(NL80211_STA_FLAG_WME) | 7140 BIT(NL80211_STA_FLAG_MFP); 7141 break; 7142 case NL80211_IFTYPE_P2P_CLIENT: 7143 case NL80211_IFTYPE_STATION: 7144 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHORIZED) | 7145 BIT(NL80211_STA_FLAG_TDLS_PEER); 7146 break; 7147 case NL80211_IFTYPE_MESH_POINT: 7148 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHENTICATED) | 7149 BIT(NL80211_STA_FLAG_MFP) | 7150 BIT(NL80211_STA_FLAG_AUTHORIZED); 7151 break; 7152 default: 7153 return -EINVAL; 7154 } 7155 7156 for (flag = 1; flag <= NL80211_STA_FLAG_MAX; flag++) { 7157 if (flags[flag]) { 7158 params->sta_flags_set |= (1<<flag); 7159 7160 /* no longer support new API additions in old API */ 7161 if (flag > NL80211_STA_FLAG_MAX_OLD_API) 7162 return -EINVAL; 7163 } 7164 } 7165 7166 return 0; 7167 } 7168 7169 bool nl80211_put_sta_rate(struct sk_buff *msg, struct rate_info *info, int attr) 7170 { 7171 struct nlattr *rate; 7172 u32 bitrate; 7173 u16 bitrate_compat; 7174 enum nl80211_rate_info rate_flg; 7175 7176 rate = nla_nest_start_noflag(msg, attr); 7177 if (!rate) 7178 return false; 7179 7180 /* cfg80211_calculate_bitrate will return 0 for mcs >= 32 */ 7181 bitrate = cfg80211_calculate_bitrate(info); 7182 /* report 16-bit bitrate only if we can */ 7183 bitrate_compat = bitrate < (1UL << 16) ? bitrate : 0; 7184 if (bitrate > 0 && 7185 nla_put_u32(msg, NL80211_RATE_INFO_BITRATE32, bitrate)) 7186 return false; 7187 if (bitrate_compat > 0 && 7188 nla_put_u16(msg, NL80211_RATE_INFO_BITRATE, bitrate_compat)) 7189 return false; 7190 7191 switch (info->bw) { 7192 case RATE_INFO_BW_1: 7193 rate_flg = NL80211_RATE_INFO_1_MHZ_WIDTH; 7194 break; 7195 case RATE_INFO_BW_2: 7196 rate_flg = NL80211_RATE_INFO_2_MHZ_WIDTH; 7197 break; 7198 case RATE_INFO_BW_4: 7199 rate_flg = NL80211_RATE_INFO_4_MHZ_WIDTH; 7200 break; 7201 case RATE_INFO_BW_5: 7202 rate_flg = NL80211_RATE_INFO_5_MHZ_WIDTH; 7203 break; 7204 case RATE_INFO_BW_8: 7205 rate_flg = NL80211_RATE_INFO_8_MHZ_WIDTH; 7206 break; 7207 case RATE_INFO_BW_10: 7208 rate_flg = NL80211_RATE_INFO_10_MHZ_WIDTH; 7209 break; 7210 case RATE_INFO_BW_16: 7211 rate_flg = NL80211_RATE_INFO_16_MHZ_WIDTH; 7212 break; 7213 default: 7214 WARN_ON(1); 7215 fallthrough; 7216 case RATE_INFO_BW_20: 7217 rate_flg = 0; 7218 break; 7219 case RATE_INFO_BW_40: 7220 rate_flg = NL80211_RATE_INFO_40_MHZ_WIDTH; 7221 break; 7222 case RATE_INFO_BW_80: 7223 rate_flg = NL80211_RATE_INFO_80_MHZ_WIDTH; 7224 break; 7225 case RATE_INFO_BW_160: 7226 rate_flg = NL80211_RATE_INFO_160_MHZ_WIDTH; 7227 break; 7228 case RATE_INFO_BW_HE_RU: 7229 rate_flg = 0; 7230 WARN_ON(!(info->flags & RATE_INFO_FLAGS_HE_MCS)); 7231 break; 7232 case RATE_INFO_BW_320: 7233 rate_flg = NL80211_RATE_INFO_320_MHZ_WIDTH; 7234 break; 7235 case RATE_INFO_BW_EHT_RU: 7236 rate_flg = 0; 7237 WARN_ON(!(info->flags & RATE_INFO_FLAGS_EHT_MCS) && 7238 !(info->flags & RATE_INFO_FLAGS_UHR_MCS)); 7239 break; 7240 } 7241 7242 if (rate_flg && nla_put_flag(msg, rate_flg)) 7243 return false; 7244 7245 if (info->flags & RATE_INFO_FLAGS_MCS) { 7246 if (nla_put_u8(msg, NL80211_RATE_INFO_MCS, info->mcs)) 7247 return false; 7248 if (info->flags & RATE_INFO_FLAGS_SHORT_GI && 7249 nla_put_flag(msg, NL80211_RATE_INFO_SHORT_GI)) 7250 return false; 7251 } else if (info->flags & RATE_INFO_FLAGS_VHT_MCS) { 7252 if (nla_put_u8(msg, NL80211_RATE_INFO_VHT_MCS, info->mcs)) 7253 return false; 7254 if (nla_put_u8(msg, NL80211_RATE_INFO_VHT_NSS, info->nss)) 7255 return false; 7256 if (info->flags & RATE_INFO_FLAGS_SHORT_GI && 7257 nla_put_flag(msg, NL80211_RATE_INFO_SHORT_GI)) 7258 return false; 7259 } else if (info->flags & RATE_INFO_FLAGS_HE_MCS) { 7260 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_MCS, info->mcs)) 7261 return false; 7262 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_NSS, info->nss)) 7263 return false; 7264 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_GI, info->he_gi)) 7265 return false; 7266 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_DCM, info->he_dcm)) 7267 return false; 7268 if (info->bw == RATE_INFO_BW_HE_RU && 7269 nla_put_u8(msg, NL80211_RATE_INFO_HE_RU_ALLOC, 7270 info->he_ru_alloc)) 7271 return false; 7272 } else if (info->flags & RATE_INFO_FLAGS_S1G_MCS) { 7273 if (nla_put_u8(msg, NL80211_RATE_INFO_S1G_MCS, info->mcs)) 7274 return false; 7275 if (nla_put_u8(msg, NL80211_RATE_INFO_S1G_NSS, info->nss)) 7276 return false; 7277 if (info->flags & RATE_INFO_FLAGS_SHORT_GI && 7278 nla_put_flag(msg, NL80211_RATE_INFO_SHORT_GI)) 7279 return false; 7280 } else if (info->flags & RATE_INFO_FLAGS_EHT_MCS) { 7281 if (nla_put_u8(msg, NL80211_RATE_INFO_EHT_MCS, info->mcs)) 7282 return false; 7283 if (nla_put_u8(msg, NL80211_RATE_INFO_EHT_NSS, info->nss)) 7284 return false; 7285 if (nla_put_u8(msg, NL80211_RATE_INFO_EHT_GI, info->eht_gi)) 7286 return false; 7287 if (info->bw == RATE_INFO_BW_EHT_RU && 7288 nla_put_u8(msg, NL80211_RATE_INFO_EHT_RU_ALLOC, 7289 info->eht_ru_alloc)) 7290 return false; 7291 } else if (info->flags & RATE_INFO_FLAGS_UHR_MCS) { 7292 if (nla_put_u8(msg, NL80211_RATE_INFO_UHR_MCS, info->mcs)) 7293 return false; 7294 if (nla_put_u8(msg, NL80211_RATE_INFO_EHT_NSS, info->nss)) 7295 return false; 7296 if (nla_put_u8(msg, NL80211_RATE_INFO_EHT_GI, info->eht_gi)) 7297 return false; 7298 if (info->bw == RATE_INFO_BW_EHT_RU && 7299 nla_put_u8(msg, NL80211_RATE_INFO_EHT_RU_ALLOC, 7300 info->eht_ru_alloc)) 7301 return false; 7302 if (info->flags & RATE_INFO_FLAGS_UHR_ELR_MCS && 7303 nla_put_flag(msg, NL80211_RATE_INFO_UHR_ELR)) 7304 return false; 7305 if (info->flags & RATE_INFO_FLAGS_UHR_IM && 7306 nla_put_flag(msg, NL80211_RATE_INFO_UHR_IM)) 7307 return false; 7308 } 7309 7310 nla_nest_end(msg, rate); 7311 return true; 7312 } 7313 7314 static bool nl80211_put_signal(struct sk_buff *msg, u8 mask, s8 *signal, 7315 int id) 7316 { 7317 void *attr; 7318 int i = 0; 7319 7320 if (!mask) 7321 return true; 7322 7323 attr = nla_nest_start_noflag(msg, id); 7324 if (!attr) 7325 return false; 7326 7327 for (i = 0; i < IEEE80211_MAX_CHAINS; i++) { 7328 if (!(mask & BIT(i))) 7329 continue; 7330 7331 if (nla_put_u8(msg, i, signal[i])) 7332 return false; 7333 } 7334 7335 nla_nest_end(msg, attr); 7336 7337 return true; 7338 } 7339 7340 static int nl80211_fill_link_station(struct sk_buff *msg, 7341 struct cfg80211_registered_device *rdev, 7342 struct link_station_info *link_sinfo) 7343 { 7344 struct nlattr *bss_param, *link_sinfoattr; 7345 7346 #define PUT_LINK_SINFO(attr, memb, type) do { \ 7347 BUILD_BUG_ON(sizeof(type) == sizeof(u64)); \ 7348 if (link_sinfo->filled & BIT_ULL(NL80211_STA_INFO_ ## attr) && \ 7349 nla_put_ ## type(msg, NL80211_STA_INFO_ ## attr, \ 7350 link_sinfo->memb)) \ 7351 goto nla_put_failure; \ 7352 } while (0) 7353 #define PUT_LINK_SINFO_U64(attr, memb) do { \ 7354 if (link_sinfo->filled & BIT_ULL(NL80211_STA_INFO_ ## attr) && \ 7355 nla_put_u64_64bit(msg, NL80211_STA_INFO_ ## attr, \ 7356 link_sinfo->memb, NL80211_STA_INFO_PAD)) \ 7357 goto nla_put_failure; \ 7358 } while (0) 7359 7360 link_sinfoattr = nla_nest_start_noflag(msg, NL80211_ATTR_STA_INFO); 7361 if (!link_sinfoattr) 7362 goto nla_put_failure; 7363 7364 PUT_LINK_SINFO(INACTIVE_TIME, inactive_time, u32); 7365 7366 if (link_sinfo->filled & (BIT_ULL(NL80211_STA_INFO_RX_BYTES) | 7367 BIT_ULL(NL80211_STA_INFO_RX_BYTES64)) && 7368 nla_put_u32(msg, NL80211_STA_INFO_RX_BYTES, 7369 (u32)link_sinfo->rx_bytes)) 7370 goto nla_put_failure; 7371 7372 if (link_sinfo->filled & (BIT_ULL(NL80211_STA_INFO_TX_BYTES) | 7373 BIT_ULL(NL80211_STA_INFO_TX_BYTES64)) && 7374 nla_put_u32(msg, NL80211_STA_INFO_TX_BYTES, 7375 (u32)link_sinfo->tx_bytes)) 7376 goto nla_put_failure; 7377 7378 PUT_LINK_SINFO_U64(RX_BYTES64, rx_bytes); 7379 PUT_LINK_SINFO_U64(TX_BYTES64, tx_bytes); 7380 PUT_LINK_SINFO_U64(RX_DURATION, rx_duration); 7381 PUT_LINK_SINFO_U64(TX_DURATION, tx_duration); 7382 7383 if (wiphy_ext_feature_isset(&rdev->wiphy, 7384 NL80211_EXT_FEATURE_AIRTIME_FAIRNESS)) 7385 PUT_LINK_SINFO(AIRTIME_WEIGHT, airtime_weight, u16); 7386 7387 switch (rdev->wiphy.signal_type) { 7388 case CFG80211_SIGNAL_TYPE_MBM: 7389 PUT_LINK_SINFO(SIGNAL, signal, u8); 7390 PUT_LINK_SINFO(SIGNAL_AVG, signal_avg, u8); 7391 break; 7392 default: 7393 break; 7394 } 7395 if (link_sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL)) { 7396 if (!nl80211_put_signal(msg, link_sinfo->chains, 7397 link_sinfo->chain_signal, 7398 NL80211_STA_INFO_CHAIN_SIGNAL)) 7399 goto nla_put_failure; 7400 } 7401 if (link_sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL_AVG)) { 7402 if (!nl80211_put_signal(msg, link_sinfo->chains, 7403 link_sinfo->chain_signal_avg, 7404 NL80211_STA_INFO_CHAIN_SIGNAL_AVG)) 7405 goto nla_put_failure; 7406 } 7407 if (link_sinfo->filled & BIT_ULL(NL80211_STA_INFO_TX_BITRATE)) { 7408 if (!nl80211_put_sta_rate(msg, &link_sinfo->txrate, 7409 NL80211_STA_INFO_TX_BITRATE)) 7410 goto nla_put_failure; 7411 } 7412 if (link_sinfo->filled & BIT_ULL(NL80211_STA_INFO_RX_BITRATE)) { 7413 if (!nl80211_put_sta_rate(msg, &link_sinfo->rxrate, 7414 NL80211_STA_INFO_RX_BITRATE)) 7415 goto nla_put_failure; 7416 } 7417 7418 PUT_LINK_SINFO(RX_PACKETS, rx_packets, u32); 7419 PUT_LINK_SINFO(TX_PACKETS, tx_packets, u32); 7420 PUT_LINK_SINFO(TX_RETRIES, tx_retries, u32); 7421 PUT_LINK_SINFO(TX_FAILED, tx_failed, u32); 7422 PUT_LINK_SINFO(EXPECTED_THROUGHPUT, expected_throughput, u32); 7423 PUT_LINK_SINFO(BEACON_LOSS, beacon_loss_count, u32); 7424 7425 if (link_sinfo->filled & BIT_ULL(NL80211_STA_INFO_BSS_PARAM)) { 7426 bss_param = nla_nest_start_noflag(msg, 7427 NL80211_STA_INFO_BSS_PARAM); 7428 if (!bss_param) 7429 goto nla_put_failure; 7430 7431 if (((link_sinfo->bss_param.flags & 7432 BSS_PARAM_FLAGS_CTS_PROT) && 7433 nla_put_flag(msg, NL80211_STA_BSS_PARAM_CTS_PROT)) || 7434 ((link_sinfo->bss_param.flags & 7435 BSS_PARAM_FLAGS_SHORT_PREAMBLE) && 7436 nla_put_flag(msg, 7437 NL80211_STA_BSS_PARAM_SHORT_PREAMBLE)) || 7438 ((link_sinfo->bss_param.flags & 7439 BSS_PARAM_FLAGS_SHORT_SLOT_TIME) && 7440 nla_put_flag(msg, 7441 NL80211_STA_BSS_PARAM_SHORT_SLOT_TIME)) || 7442 nla_put_u8(msg, NL80211_STA_BSS_PARAM_DTIM_PERIOD, 7443 link_sinfo->bss_param.dtim_period) || 7444 nla_put_u16(msg, NL80211_STA_BSS_PARAM_BEACON_INTERVAL, 7445 link_sinfo->bss_param.beacon_interval)) 7446 goto nla_put_failure; 7447 7448 nla_nest_end(msg, bss_param); 7449 } 7450 7451 PUT_LINK_SINFO_U64(RX_DROP_MISC, rx_dropped_misc); 7452 PUT_LINK_SINFO_U64(BEACON_RX, rx_beacon); 7453 PUT_LINK_SINFO(BEACON_SIGNAL_AVG, rx_beacon_signal_avg, u8); 7454 PUT_LINK_SINFO(RX_MPDUS, rx_mpdu_count, u32); 7455 PUT_LINK_SINFO(FCS_ERROR_COUNT, fcs_err_count, u32); 7456 if (wiphy_ext_feature_isset(&rdev->wiphy, 7457 NL80211_EXT_FEATURE_ACK_SIGNAL_SUPPORT)) { 7458 PUT_LINK_SINFO(ACK_SIGNAL, ack_signal, u8); 7459 PUT_LINK_SINFO(ACK_SIGNAL_AVG, avg_ack_signal, s8); 7460 } 7461 7462 #undef PUT_LINK_SINFO 7463 #undef PUT_LINK_SINFO_U64 7464 7465 if (link_sinfo->pertid) { 7466 struct nlattr *tidsattr; 7467 int tid; 7468 7469 tidsattr = nla_nest_start_noflag(msg, 7470 NL80211_STA_INFO_TID_STATS); 7471 if (!tidsattr) 7472 goto nla_put_failure; 7473 7474 for (tid = 0; tid < IEEE80211_NUM_TIDS + 1; tid++) { 7475 struct cfg80211_tid_stats *tidstats; 7476 struct nlattr *tidattr; 7477 7478 tidstats = &link_sinfo->pertid[tid]; 7479 7480 if (!tidstats->filled) 7481 continue; 7482 7483 tidattr = nla_nest_start_noflag(msg, tid + 1); 7484 if (!tidattr) 7485 goto nla_put_failure; 7486 7487 #define PUT_TIDVAL_U64(attr, memb) do { \ 7488 if (tidstats->filled & BIT(NL80211_TID_STATS_ ## attr) && \ 7489 nla_put_u64_64bit(msg, NL80211_TID_STATS_ ## attr, \ 7490 tidstats->memb, NL80211_TID_STATS_PAD)) \ 7491 goto nla_put_failure; \ 7492 } while (0) 7493 7494 PUT_TIDVAL_U64(RX_MSDU, rx_msdu); 7495 PUT_TIDVAL_U64(TX_MSDU, tx_msdu); 7496 PUT_TIDVAL_U64(TX_MSDU_RETRIES, tx_msdu_retries); 7497 PUT_TIDVAL_U64(TX_MSDU_FAILED, tx_msdu_failed); 7498 7499 #undef PUT_TIDVAL_U64 7500 if ((tidstats->filled & 7501 BIT(NL80211_TID_STATS_TXQ_STATS)) && 7502 !nl80211_put_txq_stats(msg, &tidstats->txq_stats, 7503 NL80211_TID_STATS_TXQ_STATS)) 7504 goto nla_put_failure; 7505 7506 nla_nest_end(msg, tidattr); 7507 } 7508 7509 nla_nest_end(msg, tidsattr); 7510 } 7511 7512 nla_nest_end(msg, link_sinfoattr); 7513 return 0; 7514 7515 nla_put_failure: 7516 return -EMSGSIZE; 7517 } 7518 7519 static int nl80211_send_station(struct sk_buff *msg, u32 cmd, u32 portid, 7520 u32 seq, int flags, 7521 struct cfg80211_registered_device *rdev, 7522 struct wireless_dev *wdev, 7523 const u8 *mac_addr, struct station_info *sinfo, 7524 bool link_stats) 7525 { 7526 void *hdr; 7527 struct nlattr *sinfoattr, *bss_param; 7528 struct link_station_info *link_sinfo; 7529 struct nlattr *links, *link; 7530 int link_id; 7531 7532 hdr = nl80211hdr_put(msg, portid, seq, flags, cmd); 7533 if (!hdr) { 7534 cfg80211_sinfo_release_content(sinfo); 7535 return -1; 7536 } 7537 7538 if ((wdev->netdev && 7539 nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex)) || 7540 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 7541 NL80211_ATTR_PAD) || 7542 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr) || 7543 nla_put_u32(msg, NL80211_ATTR_GENERATION, sinfo->generation)) 7544 goto nla_put_failure; 7545 7546 sinfoattr = nla_nest_start_noflag(msg, NL80211_ATTR_STA_INFO); 7547 if (!sinfoattr) 7548 goto nla_put_failure; 7549 7550 #define PUT_SINFO(attr, memb, type) do { \ 7551 BUILD_BUG_ON(sizeof(type) == sizeof(u64)); \ 7552 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_ ## attr) && \ 7553 nla_put_ ## type(msg, NL80211_STA_INFO_ ## attr, \ 7554 sinfo->memb)) \ 7555 goto nla_put_failure; \ 7556 } while (0) 7557 #define PUT_SINFO_U64(attr, memb) do { \ 7558 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_ ## attr) && \ 7559 nla_put_u64_64bit(msg, NL80211_STA_INFO_ ## attr, \ 7560 sinfo->memb, NL80211_STA_INFO_PAD)) \ 7561 goto nla_put_failure; \ 7562 } while (0) 7563 7564 PUT_SINFO(CONNECTED_TIME, connected_time, u32); 7565 PUT_SINFO(INACTIVE_TIME, inactive_time, u32); 7566 PUT_SINFO_U64(ASSOC_AT_BOOTTIME, assoc_at); 7567 7568 if (sinfo->filled & (BIT_ULL(NL80211_STA_INFO_RX_BYTES) | 7569 BIT_ULL(NL80211_STA_INFO_RX_BYTES64)) && 7570 nla_put_u32(msg, NL80211_STA_INFO_RX_BYTES, 7571 (u32)sinfo->rx_bytes)) 7572 goto nla_put_failure; 7573 7574 if (sinfo->filled & (BIT_ULL(NL80211_STA_INFO_TX_BYTES) | 7575 BIT_ULL(NL80211_STA_INFO_TX_BYTES64)) && 7576 nla_put_u32(msg, NL80211_STA_INFO_TX_BYTES, 7577 (u32)sinfo->tx_bytes)) 7578 goto nla_put_failure; 7579 7580 PUT_SINFO_U64(RX_BYTES64, rx_bytes); 7581 PUT_SINFO_U64(TX_BYTES64, tx_bytes); 7582 PUT_SINFO_U64(RX_DURATION, rx_duration); 7583 PUT_SINFO_U64(TX_DURATION, tx_duration); 7584 7585 if (wiphy_ext_feature_isset(&rdev->wiphy, 7586 NL80211_EXT_FEATURE_AIRTIME_FAIRNESS)) 7587 PUT_SINFO(AIRTIME_WEIGHT, airtime_weight, u16); 7588 7589 switch (rdev->wiphy.signal_type) { 7590 case CFG80211_SIGNAL_TYPE_MBM: 7591 PUT_SINFO(SIGNAL, signal, u8); 7592 PUT_SINFO(SIGNAL_AVG, signal_avg, u8); 7593 break; 7594 default: 7595 break; 7596 } 7597 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL)) { 7598 if (!nl80211_put_signal(msg, sinfo->chains, 7599 sinfo->chain_signal, 7600 NL80211_STA_INFO_CHAIN_SIGNAL)) 7601 goto nla_put_failure; 7602 } 7603 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL_AVG)) { 7604 if (!nl80211_put_signal(msg, sinfo->chains, 7605 sinfo->chain_signal_avg, 7606 NL80211_STA_INFO_CHAIN_SIGNAL_AVG)) 7607 goto nla_put_failure; 7608 } 7609 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_TX_BITRATE)) { 7610 if (!nl80211_put_sta_rate(msg, &sinfo->txrate, 7611 NL80211_STA_INFO_TX_BITRATE)) 7612 goto nla_put_failure; 7613 } 7614 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_RX_BITRATE)) { 7615 if (!nl80211_put_sta_rate(msg, &sinfo->rxrate, 7616 NL80211_STA_INFO_RX_BITRATE)) 7617 goto nla_put_failure; 7618 } 7619 7620 PUT_SINFO(RX_PACKETS, rx_packets, u32); 7621 PUT_SINFO(TX_PACKETS, tx_packets, u32); 7622 PUT_SINFO(TX_RETRIES, tx_retries, u32); 7623 PUT_SINFO(TX_FAILED, tx_failed, u32); 7624 PUT_SINFO(EXPECTED_THROUGHPUT, expected_throughput, u32); 7625 PUT_SINFO(BEACON_LOSS, beacon_loss_count, u32); 7626 7627 PUT_SINFO(LLID, llid, u16); 7628 PUT_SINFO(PLID, plid, u16); 7629 PUT_SINFO(PLINK_STATE, plink_state, u8); 7630 PUT_SINFO(AIRTIME_LINK_METRIC, airtime_link_metric, u32); 7631 PUT_SINFO(LOCAL_PM, local_pm, u32); 7632 PUT_SINFO(PEER_PM, peer_pm, u32); 7633 PUT_SINFO(NONPEER_PM, nonpeer_pm, u32); 7634 PUT_SINFO(CONNECTED_TO_GATE, connected_to_gate, u8); 7635 PUT_SINFO(CONNECTED_TO_AS, connected_to_as, u8); 7636 PUT_SINFO_U64(T_OFFSET, t_offset); 7637 7638 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_BSS_PARAM)) { 7639 bss_param = nla_nest_start_noflag(msg, 7640 NL80211_STA_INFO_BSS_PARAM); 7641 if (!bss_param) 7642 goto nla_put_failure; 7643 7644 if (((sinfo->bss_param.flags & BSS_PARAM_FLAGS_CTS_PROT) && 7645 nla_put_flag(msg, NL80211_STA_BSS_PARAM_CTS_PROT)) || 7646 ((sinfo->bss_param.flags & BSS_PARAM_FLAGS_SHORT_PREAMBLE) && 7647 nla_put_flag(msg, NL80211_STA_BSS_PARAM_SHORT_PREAMBLE)) || 7648 ((sinfo->bss_param.flags & BSS_PARAM_FLAGS_SHORT_SLOT_TIME) && 7649 nla_put_flag(msg, NL80211_STA_BSS_PARAM_SHORT_SLOT_TIME)) || 7650 nla_put_u8(msg, NL80211_STA_BSS_PARAM_DTIM_PERIOD, 7651 sinfo->bss_param.dtim_period) || 7652 nla_put_u16(msg, NL80211_STA_BSS_PARAM_BEACON_INTERVAL, 7653 sinfo->bss_param.beacon_interval)) 7654 goto nla_put_failure; 7655 7656 nla_nest_end(msg, bss_param); 7657 } 7658 if ((sinfo->filled & BIT_ULL(NL80211_STA_INFO_STA_FLAGS)) && 7659 nla_put(msg, NL80211_STA_INFO_STA_FLAGS, 7660 sizeof(struct nl80211_sta_flag_update), 7661 &sinfo->sta_flags)) 7662 goto nla_put_failure; 7663 7664 PUT_SINFO_U64(RX_DROP_MISC, rx_dropped_misc); 7665 PUT_SINFO_U64(BEACON_RX, rx_beacon); 7666 PUT_SINFO(BEACON_SIGNAL_AVG, rx_beacon_signal_avg, u8); 7667 PUT_SINFO(RX_MPDUS, rx_mpdu_count, u32); 7668 PUT_SINFO(FCS_ERROR_COUNT, fcs_err_count, u32); 7669 if (wiphy_ext_feature_isset(&rdev->wiphy, 7670 NL80211_EXT_FEATURE_ACK_SIGNAL_SUPPORT)) { 7671 PUT_SINFO(ACK_SIGNAL, ack_signal, u8); 7672 PUT_SINFO(ACK_SIGNAL_AVG, avg_ack_signal, s8); 7673 } 7674 7675 #undef PUT_SINFO 7676 #undef PUT_SINFO_U64 7677 7678 if (sinfo->pertid) { 7679 struct nlattr *tidsattr; 7680 int tid; 7681 7682 tidsattr = nla_nest_start_noflag(msg, 7683 NL80211_STA_INFO_TID_STATS); 7684 if (!tidsattr) 7685 goto nla_put_failure; 7686 7687 for (tid = 0; tid < IEEE80211_NUM_TIDS + 1; tid++) { 7688 struct cfg80211_tid_stats *tidstats; 7689 struct nlattr *tidattr; 7690 7691 tidstats = &sinfo->pertid[tid]; 7692 7693 if (!tidstats->filled) 7694 continue; 7695 7696 tidattr = nla_nest_start_noflag(msg, tid + 1); 7697 if (!tidattr) 7698 goto nla_put_failure; 7699 7700 #define PUT_TIDVAL_U64(attr, memb) do { \ 7701 if (tidstats->filled & BIT(NL80211_TID_STATS_ ## attr) && \ 7702 nla_put_u64_64bit(msg, NL80211_TID_STATS_ ## attr, \ 7703 tidstats->memb, NL80211_TID_STATS_PAD)) \ 7704 goto nla_put_failure; \ 7705 } while (0) 7706 7707 PUT_TIDVAL_U64(RX_MSDU, rx_msdu); 7708 PUT_TIDVAL_U64(TX_MSDU, tx_msdu); 7709 PUT_TIDVAL_U64(TX_MSDU_RETRIES, tx_msdu_retries); 7710 PUT_TIDVAL_U64(TX_MSDU_FAILED, tx_msdu_failed); 7711 7712 #undef PUT_TIDVAL_U64 7713 if ((tidstats->filled & 7714 BIT(NL80211_TID_STATS_TXQ_STATS)) && 7715 !nl80211_put_txq_stats(msg, &tidstats->txq_stats, 7716 NL80211_TID_STATS_TXQ_STATS)) 7717 goto nla_put_failure; 7718 7719 nla_nest_end(msg, tidattr); 7720 } 7721 7722 nla_nest_end(msg, tidsattr); 7723 } 7724 7725 nla_nest_end(msg, sinfoattr); 7726 7727 if (sinfo->assoc_req_ies_len && 7728 nla_put(msg, NL80211_ATTR_IE, sinfo->assoc_req_ies_len, 7729 sinfo->assoc_req_ies)) 7730 goto nla_put_failure; 7731 7732 if (sinfo->assoc_resp_ies_len && 7733 nla_put(msg, NL80211_ATTR_RESP_IE, sinfo->assoc_resp_ies_len, 7734 sinfo->assoc_resp_ies)) 7735 goto nla_put_failure; 7736 7737 if (sinfo->mlo_params_valid) { 7738 if (nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, 7739 sinfo->assoc_link_id)) 7740 goto nla_put_failure; 7741 7742 if (!is_zero_ether_addr(sinfo->mld_addr) && 7743 nla_put(msg, NL80211_ATTR_MLD_ADDR, ETH_ALEN, 7744 sinfo->mld_addr)) 7745 goto nla_put_failure; 7746 } 7747 7748 if (link_stats && sinfo->valid_links) { 7749 links = nla_nest_start(msg, NL80211_ATTR_MLO_LINKS); 7750 if (!links) 7751 goto nla_put_failure; 7752 7753 for_each_valid_link(sinfo, link_id) { 7754 link_sinfo = sinfo->links[link_id]; 7755 7756 if (WARN_ON_ONCE(!link_sinfo)) 7757 continue; 7758 7759 if (!is_valid_ether_addr(link_sinfo->addr)) 7760 continue; 7761 7762 link = nla_nest_start(msg, link_id + 1); 7763 if (!link) 7764 goto nla_put_failure; 7765 7766 if (nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, 7767 link_id)) 7768 goto nla_put_failure; 7769 7770 if (nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, 7771 link_sinfo->addr)) 7772 goto nla_put_failure; 7773 7774 if (nl80211_fill_link_station(msg, rdev, link_sinfo)) 7775 goto nla_put_failure; 7776 7777 nla_nest_end(msg, link); 7778 } 7779 nla_nest_end(msg, links); 7780 } 7781 7782 cfg80211_sinfo_release_content(sinfo); 7783 genlmsg_end(msg, hdr); 7784 return 0; 7785 7786 nla_put_failure: 7787 cfg80211_sinfo_release_content(sinfo); 7788 genlmsg_cancel(msg, hdr); 7789 return -EMSGSIZE; 7790 } 7791 7792 static void cfg80211_sta_set_mld_sinfo(struct station_info *sinfo) 7793 { 7794 struct link_station_info *link_sinfo; 7795 int link_id, init = 0; 7796 u32 link_inactive_time; 7797 7798 sinfo->signal = -99; 7799 7800 for_each_valid_link(sinfo, link_id) { 7801 link_sinfo = sinfo->links[link_id]; 7802 if (!link_sinfo) 7803 continue; 7804 7805 if ((link_sinfo->filled & 7806 BIT_ULL(NL80211_STA_INFO_TX_PACKETS))) { 7807 sinfo->tx_packets += link_sinfo->tx_packets; 7808 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_PACKETS); 7809 } 7810 7811 if ((link_sinfo->filled & 7812 BIT_ULL(NL80211_STA_INFO_RX_PACKETS))) { 7813 sinfo->rx_packets += link_sinfo->rx_packets; 7814 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_PACKETS); 7815 } 7816 7817 if (link_sinfo->filled & 7818 (BIT_ULL(NL80211_STA_INFO_TX_BYTES) | 7819 BIT_ULL(NL80211_STA_INFO_TX_BYTES64))) { 7820 sinfo->tx_bytes += link_sinfo->tx_bytes; 7821 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BYTES); 7822 } 7823 7824 if (link_sinfo->filled & 7825 (BIT_ULL(NL80211_STA_INFO_RX_BYTES) | 7826 BIT_ULL(NL80211_STA_INFO_TX_BYTES64))) { 7827 sinfo->rx_bytes += link_sinfo->rx_bytes; 7828 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_BYTES); 7829 } 7830 7831 if (link_sinfo->filled & 7832 BIT_ULL(NL80211_STA_INFO_TX_RETRIES)) { 7833 sinfo->tx_retries += link_sinfo->tx_retries; 7834 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_RETRIES); 7835 } 7836 7837 if (link_sinfo->filled & BIT_ULL(NL80211_STA_INFO_TX_FAILED)) { 7838 sinfo->tx_failed += link_sinfo->tx_failed; 7839 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_FAILED); 7840 } 7841 7842 if (link_sinfo->filled & 7843 BIT_ULL(NL80211_STA_INFO_RX_DROP_MISC)) { 7844 sinfo->rx_dropped_misc += link_sinfo->rx_dropped_misc; 7845 sinfo->filled |= 7846 BIT_ULL(NL80211_STA_INFO_RX_DROP_MISC); 7847 } 7848 7849 if (link_sinfo->filled & 7850 BIT_ULL(NL80211_STA_INFO_BEACON_LOSS)) { 7851 sinfo->beacon_loss_count += 7852 link_sinfo->beacon_loss_count; 7853 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_BEACON_LOSS); 7854 } 7855 7856 if (link_sinfo->filled & 7857 BIT_ULL(NL80211_STA_INFO_EXPECTED_THROUGHPUT)) { 7858 sinfo->expected_throughput += 7859 link_sinfo->expected_throughput; 7860 sinfo->filled |= 7861 BIT_ULL(NL80211_STA_INFO_EXPECTED_THROUGHPUT); 7862 } 7863 7864 if (link_sinfo->filled & BIT_ULL(NL80211_STA_INFO_RX_MPDUS)) { 7865 sinfo->rx_mpdu_count += link_sinfo->rx_mpdu_count; 7866 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_MPDUS); 7867 } 7868 7869 if (link_sinfo->filled & 7870 BIT_ULL(NL80211_STA_INFO_FCS_ERROR_COUNT)) { 7871 sinfo->fcs_err_count += link_sinfo->fcs_err_count; 7872 sinfo->filled |= 7873 BIT_ULL(NL80211_STA_INFO_FCS_ERROR_COUNT); 7874 } 7875 7876 if (link_sinfo->filled & 7877 BIT_ULL(NL80211_STA_INFO_BEACON_RX)) { 7878 sinfo->rx_beacon += link_sinfo->rx_beacon; 7879 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_BEACON_RX); 7880 } 7881 7882 /* Update MLO signal, signal_avg as best among links */ 7883 if ((link_sinfo->filled & BIT_ULL(NL80211_STA_INFO_SIGNAL)) && 7884 link_sinfo->signal > sinfo->signal) { 7885 sinfo->signal = link_sinfo->signal; 7886 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL); 7887 } 7888 7889 if ((link_sinfo->filled & 7890 BIT_ULL(NL80211_STA_INFO_SIGNAL_AVG)) && 7891 link_sinfo->signal_avg > sinfo->signal_avg) { 7892 sinfo->signal_avg = link_sinfo->signal_avg; 7893 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL_AVG); 7894 } 7895 7896 /* Update MLO inactive_time, bss_param based on least 7897 * value for corresponding field of link. 7898 */ 7899 if ((link_sinfo->filled & 7900 BIT_ULL(NL80211_STA_INFO_INACTIVE_TIME)) && 7901 (!init || 7902 link_inactive_time > link_sinfo->inactive_time)) { 7903 link_inactive_time = link_sinfo->inactive_time; 7904 sinfo->inactive_time = link_sinfo->inactive_time; 7905 sinfo->filled |= NL80211_STA_INFO_INACTIVE_TIME; 7906 } 7907 7908 if (link_sinfo->filled & BIT_ULL(NL80211_STA_INFO_BSS_PARAM) && 7909 (!init || 7910 sinfo->bss_param.dtim_period > 7911 link_sinfo->bss_param.dtim_period)) { 7912 sinfo->bss_param.dtim_period = 7913 link_sinfo->bss_param.dtim_period; 7914 sinfo->filled |= NL80211_STA_BSS_PARAM_DTIM_PERIOD; 7915 sinfo->bss_param.beacon_interval = 7916 link_sinfo->bss_param.beacon_interval; 7917 sinfo->filled |= NL80211_STA_BSS_PARAM_BEACON_INTERVAL; 7918 } 7919 7920 /* Update MLO rates as per last updated link rate */ 7921 if ((link_sinfo->filled & 7922 BIT_ULL(NL80211_STA_INFO_TX_BITRATE)) && 7923 (!init || 7924 link_inactive_time > link_sinfo->inactive_time)) { 7925 sinfo->txrate = link_sinfo->txrate; 7926 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE); 7927 } 7928 if ((link_sinfo->filled & 7929 BIT_ULL(NL80211_STA_INFO_RX_BITRATE)) && 7930 (!init || 7931 link_inactive_time > link_sinfo->inactive_time)) { 7932 sinfo->rxrate = link_sinfo->rxrate; 7933 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_BITRATE); 7934 } 7935 7936 if (link_sinfo->filled & 7937 BIT_ULL(NL80211_STA_INFO_TX_DURATION) && 7938 (!init || 7939 link_inactive_time > link_sinfo->inactive_time)) { 7940 sinfo->tx_duration += link_sinfo->tx_duration; 7941 sinfo->filled |= 7942 BIT_ULL(NL80211_STA_INFO_TX_DURATION); 7943 } 7944 if (link_sinfo->filled & 7945 BIT_ULL(NL80211_STA_INFO_RX_DURATION) && 7946 (!init || 7947 link_inactive_time > link_sinfo->inactive_time)) { 7948 sinfo->rx_duration += link_sinfo->rx_duration; 7949 sinfo->filled |= 7950 BIT_ULL(NL80211_STA_INFO_RX_DURATION); 7951 } 7952 init++; 7953 7954 /* pertid stats accumulate for rx/tx fields */ 7955 if (sinfo->pertid) { 7956 sinfo->pertid->rx_msdu += 7957 link_sinfo->pertid->rx_msdu; 7958 sinfo->pertid->tx_msdu += 7959 link_sinfo->pertid->tx_msdu; 7960 sinfo->pertid->tx_msdu_retries += 7961 link_sinfo->pertid->tx_msdu_retries; 7962 sinfo->pertid->tx_msdu_failed += 7963 link_sinfo->pertid->tx_msdu_failed; 7964 7965 sinfo->pertid->filled |= 7966 BIT(NL80211_TID_STATS_RX_MSDU) | 7967 BIT(NL80211_TID_STATS_TX_MSDU) | 7968 BIT(NL80211_TID_STATS_TX_MSDU_RETRIES) | 7969 BIT(NL80211_TID_STATS_TX_MSDU_FAILED); 7970 } 7971 } 7972 7973 /* Reset sinfo->filled bits to exclude fields which don't make 7974 * much sense at the MLO level. 7975 */ 7976 sinfo->filled &= ~BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL); 7977 sinfo->filled &= ~BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL_AVG); 7978 } 7979 7980 static int nl80211_dump_station(struct sk_buff *skb, 7981 struct netlink_callback *cb) 7982 { 7983 struct station_info sinfo; 7984 struct cfg80211_registered_device *rdev; 7985 struct wireless_dev *wdev; 7986 u8 mac_addr[ETH_ALEN]; 7987 int sta_idx = cb->args[2]; 7988 bool sinfo_alloc = false; 7989 int err, i; 7990 7991 err = nl80211_prepare_wdev_dump(cb, &rdev, &wdev, NULL); 7992 if (err) 7993 return err; 7994 /* nl80211_prepare_wdev_dump acquired it in the successful case */ 7995 __acquire(&rdev->wiphy.mtx); 7996 7997 if (!wdev->netdev) { 7998 err = -EINVAL; 7999 goto out_err; 8000 } 8001 8002 if (!rdev->ops->dump_station) { 8003 err = -EOPNOTSUPP; 8004 goto out_err; 8005 } 8006 8007 while (1) { 8008 memset(&sinfo, 0, sizeof(sinfo)); 8009 8010 for (i = 0; i < IEEE80211_MLD_MAX_NUM_LINKS; i++) { 8011 sinfo.links[i] = 8012 kzalloc_obj(*sinfo.links[0]); 8013 if (!sinfo.links[i]) { 8014 err = -ENOMEM; 8015 goto out_err; 8016 } 8017 sinfo_alloc = true; 8018 } 8019 8020 err = rdev_dump_station(rdev, wdev, sta_idx, 8021 mac_addr, &sinfo); 8022 if (err == -ENOENT) 8023 break; 8024 if (err) 8025 goto out_err; 8026 8027 if (sinfo.valid_links) 8028 cfg80211_sta_set_mld_sinfo(&sinfo); 8029 8030 /* reset the sinfo_alloc flag as nl80211_send_station() 8031 * always releases sinfo 8032 */ 8033 sinfo_alloc = false; 8034 8035 if (nl80211_send_station(skb, NL80211_CMD_NEW_STATION, 8036 NETLINK_CB(cb->skb).portid, 8037 cb->nlh->nlmsg_seq, NLM_F_MULTI, 8038 rdev, wdev, mac_addr, 8039 &sinfo, false) < 0) 8040 goto out; 8041 8042 sta_idx++; 8043 } 8044 8045 out: 8046 cb->args[2] = sta_idx; 8047 err = skb->len; 8048 out_err: 8049 if (sinfo_alloc) 8050 cfg80211_sinfo_release_content(&sinfo); 8051 wiphy_unlock(&rdev->wiphy); 8052 8053 return err; 8054 } 8055 8056 static int nl80211_get_station(struct sk_buff *skb, struct genl_info *info) 8057 { 8058 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 8059 struct wireless_dev *wdev = info->user_ptr[1]; 8060 struct station_info sinfo; 8061 struct sk_buff *msg; 8062 u8 *mac_addr = NULL; 8063 int err, i; 8064 8065 memset(&sinfo, 0, sizeof(sinfo)); 8066 8067 if (!wdev->netdev) 8068 return -EINVAL; 8069 8070 if (!info->attrs[NL80211_ATTR_MAC]) 8071 return -EINVAL; 8072 8073 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 8074 8075 if (!rdev->ops->get_station) 8076 return -EOPNOTSUPP; 8077 8078 for (i = 0; i < IEEE80211_MLD_MAX_NUM_LINKS; i++) { 8079 sinfo.links[i] = kzalloc_obj(*sinfo.links[0]); 8080 if (!sinfo.links[i]) { 8081 cfg80211_sinfo_release_content(&sinfo); 8082 return -ENOMEM; 8083 } 8084 } 8085 8086 err = rdev_get_station(rdev, wdev, mac_addr, &sinfo); 8087 if (err) { 8088 cfg80211_sinfo_release_content(&sinfo); 8089 return err; 8090 } 8091 8092 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 8093 if (!msg) { 8094 cfg80211_sinfo_release_content(&sinfo); 8095 return -ENOMEM; 8096 } 8097 8098 if (sinfo.valid_links) 8099 cfg80211_sta_set_mld_sinfo(&sinfo); 8100 8101 if (nl80211_send_station(msg, NL80211_CMD_NEW_STATION, 8102 info->snd_portid, info->snd_seq, 0, 8103 rdev, wdev, mac_addr, &sinfo, false) < 0) { 8104 nlmsg_free(msg); 8105 return -ENOBUFS; 8106 } 8107 8108 return genlmsg_reply(msg, info); 8109 } 8110 8111 int cfg80211_check_station_change(struct wiphy *wiphy, 8112 struct station_parameters *params, 8113 enum cfg80211_station_type statype) 8114 { 8115 if (params->listen_interval != -1 && 8116 statype != CFG80211_STA_AP_CLIENT_UNASSOC) 8117 return -EINVAL; 8118 8119 if (params->support_p2p_ps != -1 && 8120 statype != CFG80211_STA_AP_CLIENT_UNASSOC) 8121 return -EINVAL; 8122 8123 if (params->aid && 8124 !(params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) && 8125 statype != CFG80211_STA_AP_CLIENT_UNASSOC) 8126 return -EINVAL; 8127 8128 /* When you run into this, adjust the code below for the new flag */ 8129 BUILD_BUG_ON(NL80211_STA_FLAG_MAX != 8); 8130 8131 switch (statype) { 8132 case CFG80211_STA_MESH_PEER_KERNEL: 8133 case CFG80211_STA_MESH_PEER_USER: 8134 /* 8135 * No ignoring the TDLS flag here -- the userspace mesh 8136 * code doesn't have the bug of including TDLS in the 8137 * mask everywhere. 8138 */ 8139 if (params->sta_flags_mask & 8140 ~(BIT(NL80211_STA_FLAG_AUTHENTICATED) | 8141 BIT(NL80211_STA_FLAG_MFP) | 8142 BIT(NL80211_STA_FLAG_AUTHORIZED))) 8143 return -EINVAL; 8144 break; 8145 case CFG80211_STA_TDLS_PEER_SETUP: 8146 case CFG80211_STA_TDLS_PEER_ACTIVE: 8147 if (!(params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER))) 8148 return -EINVAL; 8149 /* ignore since it can't change */ 8150 params->sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER); 8151 break; 8152 default: 8153 /* disallow mesh-specific things */ 8154 if (params->plink_action != NL80211_PLINK_ACTION_NO_ACTION) 8155 return -EINVAL; 8156 if (params->local_pm) 8157 return -EINVAL; 8158 if (params->sta_modify_mask & STATION_PARAM_APPLY_PLINK_STATE) 8159 return -EINVAL; 8160 } 8161 8162 if (statype != CFG80211_STA_TDLS_PEER_SETUP && 8163 statype != CFG80211_STA_TDLS_PEER_ACTIVE) { 8164 /* TDLS can't be set, ... */ 8165 if (params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) 8166 return -EINVAL; 8167 /* 8168 * ... but don't bother the driver with it. This works around 8169 * a hostapd/wpa_supplicant issue -- it always includes the 8170 * TLDS_PEER flag in the mask even for AP mode. 8171 */ 8172 params->sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER); 8173 } 8174 8175 if (statype != CFG80211_STA_TDLS_PEER_SETUP && 8176 statype != CFG80211_STA_AP_CLIENT_UNASSOC) { 8177 /* reject other things that can't change */ 8178 if (params->sta_modify_mask & STATION_PARAM_APPLY_UAPSD) 8179 return -EINVAL; 8180 if (params->sta_modify_mask & STATION_PARAM_APPLY_CAPABILITY) 8181 return -EINVAL; 8182 if (params->link_sta_params.supported_rates) 8183 return -EINVAL; 8184 if (params->ext_capab || params->link_sta_params.ht_capa || 8185 params->link_sta_params.vht_capa || 8186 params->link_sta_params.he_capa || 8187 params->link_sta_params.eht_capa || 8188 params->link_sta_params.uhr_capa) 8189 return -EINVAL; 8190 if (params->sta_flags_mask & BIT(NL80211_STA_FLAG_SPP_AMSDU)) 8191 return -EINVAL; 8192 } 8193 8194 if (statype != CFG80211_STA_AP_CLIENT && 8195 statype != CFG80211_STA_AP_CLIENT_UNASSOC) { 8196 if (params->vlan) 8197 return -EINVAL; 8198 } 8199 8200 /* Accept EMLSR capabilities only for AP client before association */ 8201 if (statype != CFG80211_STA_AP_CLIENT_UNASSOC && 8202 params->eml_cap_present) 8203 return -EINVAL; 8204 8205 switch (statype) { 8206 case CFG80211_STA_AP_MLME_CLIENT: 8207 /* Use this only for authorizing/unauthorizing a station */ 8208 if (!(params->sta_flags_mask & BIT(NL80211_STA_FLAG_AUTHORIZED))) 8209 return -EOPNOTSUPP; 8210 break; 8211 case CFG80211_STA_AP_CLIENT: 8212 case CFG80211_STA_AP_CLIENT_UNASSOC: 8213 /* accept only the listed bits */ 8214 if (params->sta_flags_mask & 8215 ~(BIT(NL80211_STA_FLAG_AUTHORIZED) | 8216 BIT(NL80211_STA_FLAG_AUTHENTICATED) | 8217 BIT(NL80211_STA_FLAG_ASSOCIATED) | 8218 BIT(NL80211_STA_FLAG_SHORT_PREAMBLE) | 8219 BIT(NL80211_STA_FLAG_WME) | 8220 BIT(NL80211_STA_FLAG_MFP) | 8221 BIT(NL80211_STA_FLAG_SPP_AMSDU))) 8222 return -EINVAL; 8223 8224 /* but authenticated/associated only if driver handles it */ 8225 if (!(wiphy->features & NL80211_FEATURE_FULL_AP_CLIENT_STATE) && 8226 params->sta_flags_mask & 8227 (BIT(NL80211_STA_FLAG_AUTHENTICATED) | 8228 BIT(NL80211_STA_FLAG_ASSOCIATED))) 8229 return -EINVAL; 8230 break; 8231 case CFG80211_STA_IBSS: 8232 case CFG80211_STA_AP_STA: 8233 /* reject any changes other than AUTHORIZED */ 8234 if (params->sta_flags_mask & ~BIT(NL80211_STA_FLAG_AUTHORIZED)) 8235 return -EINVAL; 8236 break; 8237 case CFG80211_STA_TDLS_PEER_SETUP: 8238 /* reject any changes other than AUTHORIZED or WME */ 8239 if (params->sta_flags_mask & ~(BIT(NL80211_STA_FLAG_AUTHORIZED) | 8240 BIT(NL80211_STA_FLAG_WME))) 8241 return -EINVAL; 8242 /* force (at least) rates when authorizing */ 8243 if (params->sta_flags_set & BIT(NL80211_STA_FLAG_AUTHORIZED) && 8244 !params->link_sta_params.supported_rates) 8245 return -EINVAL; 8246 break; 8247 case CFG80211_STA_TDLS_PEER_ACTIVE: 8248 /* reject any changes */ 8249 return -EINVAL; 8250 case CFG80211_STA_MESH_PEER_KERNEL: 8251 if (params->sta_modify_mask & STATION_PARAM_APPLY_PLINK_STATE) 8252 return -EINVAL; 8253 break; 8254 case CFG80211_STA_MESH_PEER_USER: 8255 if (params->plink_action != NL80211_PLINK_ACTION_NO_ACTION && 8256 params->plink_action != NL80211_PLINK_ACTION_BLOCK) 8257 return -EINVAL; 8258 break; 8259 } 8260 8261 /* 8262 * Older kernel versions ignored this attribute entirely, so don't 8263 * reject attempts to update it but mark it as unused instead so the 8264 * driver won't look at the data. 8265 */ 8266 if (statype != CFG80211_STA_AP_CLIENT_UNASSOC && 8267 statype != CFG80211_STA_TDLS_PEER_SETUP) 8268 params->link_sta_params.opmode_notif_used = false; 8269 8270 return 0; 8271 } 8272 EXPORT_SYMBOL(cfg80211_check_station_change); 8273 8274 /* 8275 * Get vlan interface making sure it is running and on the right wiphy. 8276 */ 8277 static struct net_device *get_vlan(struct genl_info *info, 8278 struct cfg80211_registered_device *rdev) 8279 { 8280 struct nlattr *vlanattr = info->attrs[NL80211_ATTR_STA_VLAN]; 8281 struct net_device *v; 8282 int ret; 8283 8284 if (!vlanattr) 8285 return NULL; 8286 8287 v = dev_get_by_index(genl_info_net(info), nla_get_u32(vlanattr)); 8288 if (!v) 8289 return ERR_PTR(-ENODEV); 8290 8291 if (!v->ieee80211_ptr || v->ieee80211_ptr->wiphy != &rdev->wiphy) { 8292 ret = -EINVAL; 8293 goto error; 8294 } 8295 8296 if (v->ieee80211_ptr->iftype != NL80211_IFTYPE_AP_VLAN && 8297 v->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 8298 v->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) { 8299 ret = -EINVAL; 8300 goto error; 8301 } 8302 8303 if (!netif_running(v)) { 8304 ret = -ENETDOWN; 8305 goto error; 8306 } 8307 8308 return v; 8309 error: 8310 dev_put(v); 8311 return ERR_PTR(ret); 8312 } 8313 8314 static int nl80211_parse_sta_wme(struct genl_info *info, 8315 struct station_parameters *params) 8316 { 8317 struct nlattr *tb[NL80211_STA_WME_MAX + 1]; 8318 struct nlattr *nla; 8319 int err; 8320 8321 /* parse WME attributes if present */ 8322 if (!info->attrs[NL80211_ATTR_STA_WME]) 8323 return 0; 8324 8325 nla = info->attrs[NL80211_ATTR_STA_WME]; 8326 err = nla_parse_nested_deprecated(tb, NL80211_STA_WME_MAX, nla, 8327 nl80211_sta_wme_policy, 8328 info->extack); 8329 if (err) 8330 return err; 8331 8332 if (tb[NL80211_STA_WME_UAPSD_QUEUES]) 8333 params->uapsd_queues = nla_get_u8( 8334 tb[NL80211_STA_WME_UAPSD_QUEUES]); 8335 if (params->uapsd_queues & ~IEEE80211_WMM_IE_STA_QOSINFO_AC_MASK) 8336 return -EINVAL; 8337 8338 if (tb[NL80211_STA_WME_MAX_SP]) 8339 params->max_sp = nla_get_u8(tb[NL80211_STA_WME_MAX_SP]); 8340 8341 if (params->max_sp & ~IEEE80211_WMM_IE_STA_QOSINFO_SP_MASK) 8342 return -EINVAL; 8343 8344 params->sta_modify_mask |= STATION_PARAM_APPLY_UAPSD; 8345 8346 return 0; 8347 } 8348 8349 static int nl80211_parse_sta_channel_info(struct genl_info *info, 8350 struct station_parameters *params) 8351 { 8352 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]) { 8353 params->supported_channels = 8354 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]); 8355 params->supported_channels_len = 8356 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]); 8357 /* 8358 * Need to include at least one (first channel, number of 8359 * channels) tuple for each subband (checked in policy), 8360 * and must have proper tuples for the rest of the data as well. 8361 */ 8362 if (params->supported_channels_len % 2) 8363 return -EINVAL; 8364 } 8365 8366 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]) { 8367 params->supported_oper_classes = 8368 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]); 8369 params->supported_oper_classes_len = 8370 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]); 8371 } 8372 return 0; 8373 } 8374 8375 static int nl80211_set_station_tdls(struct genl_info *info, 8376 struct station_parameters *params) 8377 { 8378 int err; 8379 /* Dummy STA entry gets updated once the peer capabilities are known */ 8380 if (info->attrs[NL80211_ATTR_PEER_AID]) 8381 params->aid = nla_get_u16(info->attrs[NL80211_ATTR_PEER_AID]); 8382 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) 8383 params->link_sta_params.ht_capa = 8384 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]); 8385 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) 8386 params->link_sta_params.vht_capa = 8387 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]); 8388 if (info->attrs[NL80211_ATTR_HE_CAPABILITY]) { 8389 params->link_sta_params.he_capa = 8390 nla_data(info->attrs[NL80211_ATTR_HE_CAPABILITY]); 8391 params->link_sta_params.he_capa_len = 8392 nla_len(info->attrs[NL80211_ATTR_HE_CAPABILITY]); 8393 8394 if (info->attrs[NL80211_ATTR_EHT_CAPABILITY]) { 8395 params->link_sta_params.eht_capa = 8396 nla_data(info->attrs[NL80211_ATTR_EHT_CAPABILITY]); 8397 params->link_sta_params.eht_capa_len = 8398 nla_len(info->attrs[NL80211_ATTR_EHT_CAPABILITY]); 8399 8400 if (!ieee80211_eht_capa_size_ok((const u8 *)params->link_sta_params.he_capa, 8401 (const u8 *)params->link_sta_params.eht_capa, 8402 params->link_sta_params.eht_capa_len, 8403 false)) 8404 return -EINVAL; 8405 } 8406 } 8407 8408 if (info->attrs[NL80211_ATTR_UHR_CAPABILITY]) { 8409 if (!params->link_sta_params.eht_capa) 8410 return -EINVAL; 8411 8412 params->link_sta_params.uhr_capa = 8413 nla_data(info->attrs[NL80211_ATTR_UHR_CAPABILITY]); 8414 params->link_sta_params.uhr_capa_len = 8415 nla_len(info->attrs[NL80211_ATTR_UHR_CAPABILITY]); 8416 } 8417 8418 if (info->attrs[NL80211_ATTR_S1G_CAPABILITY]) 8419 params->link_sta_params.s1g_capa = 8420 nla_data(info->attrs[NL80211_ATTR_S1G_CAPABILITY]); 8421 8422 err = nl80211_parse_sta_channel_info(info, params); 8423 if (err) 8424 return err; 8425 8426 return nl80211_parse_sta_wme(info, params); 8427 } 8428 8429 static int nl80211_parse_sta_txpower_setting(struct genl_info *info, 8430 struct sta_txpwr *txpwr, 8431 bool *txpwr_set) 8432 { 8433 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 8434 int idx; 8435 8436 if (info->attrs[NL80211_ATTR_STA_TX_POWER_SETTING]) { 8437 if (!rdev->ops->set_tx_power || 8438 !wiphy_ext_feature_isset(&rdev->wiphy, 8439 NL80211_EXT_FEATURE_STA_TX_PWR)) 8440 return -EOPNOTSUPP; 8441 8442 idx = NL80211_ATTR_STA_TX_POWER_SETTING; 8443 txpwr->type = nla_get_u8(info->attrs[idx]); 8444 8445 if (txpwr->type == NL80211_TX_POWER_LIMITED) { 8446 idx = NL80211_ATTR_STA_TX_POWER; 8447 8448 if (info->attrs[idx]) 8449 txpwr->power = nla_get_s16(info->attrs[idx]); 8450 else 8451 return -EINVAL; 8452 } 8453 8454 *txpwr_set = true; 8455 } else { 8456 *txpwr_set = false; 8457 } 8458 8459 return 0; 8460 } 8461 8462 static int nl80211_set_station(struct sk_buff *skb, struct genl_info *info) 8463 { 8464 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 8465 struct wireless_dev *wdev = info->user_ptr[1]; 8466 struct net_device *dev = wdev->netdev; 8467 struct station_parameters params; 8468 u8 *mac_addr; 8469 int err; 8470 8471 memset(¶ms, 0, sizeof(params)); 8472 8473 if (!dev) 8474 return -EINVAL; 8475 8476 if (!rdev->ops->change_station) 8477 return -EOPNOTSUPP; 8478 8479 /* 8480 * AID and listen_interval properties can be set only for unassociated 8481 * station. Include these parameters here and will check them in 8482 * cfg80211_check_station_change(). 8483 */ 8484 if (info->attrs[NL80211_ATTR_STA_AID]) 8485 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_STA_AID]); 8486 8487 if (info->attrs[NL80211_ATTR_VLAN_ID]) 8488 params.vlan_id = nla_get_u16(info->attrs[NL80211_ATTR_VLAN_ID]); 8489 8490 if (info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]) 8491 params.listen_interval = 8492 nla_get_u16(info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]); 8493 else 8494 params.listen_interval = -1; 8495 8496 if (info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]) 8497 params.support_p2p_ps = 8498 nla_get_u8(info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]); 8499 else 8500 params.support_p2p_ps = -1; 8501 8502 if (!info->attrs[NL80211_ATTR_MAC]) 8503 return -EINVAL; 8504 8505 params.link_sta_params.link_id = 8506 nl80211_link_id_or_invalid(info->attrs); 8507 8508 if (info->attrs[NL80211_ATTR_MLD_ADDR]) { 8509 /* If MLD_ADDR attribute is set then this is an MLD station 8510 * and the MLD_ADDR attribute holds the MLD address and the 8511 * MAC attribute holds for the LINK address. 8512 * In that case, the link_id is also expected to be valid. 8513 */ 8514 if (params.link_sta_params.link_id < 0) 8515 return -EINVAL; 8516 8517 mac_addr = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]); 8518 params.link_sta_params.mld_mac = mac_addr; 8519 params.link_sta_params.link_mac = 8520 nla_data(info->attrs[NL80211_ATTR_MAC]); 8521 if (!is_valid_ether_addr(params.link_sta_params.link_mac)) 8522 return -EINVAL; 8523 } else { 8524 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 8525 } 8526 8527 8528 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) { 8529 params.link_sta_params.supported_rates = 8530 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); 8531 params.link_sta_params.supported_rates_len = 8532 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); 8533 } 8534 8535 if (info->attrs[NL80211_ATTR_STA_CAPABILITY]) { 8536 params.capability = 8537 nla_get_u16(info->attrs[NL80211_ATTR_STA_CAPABILITY]); 8538 params.sta_modify_mask |= STATION_PARAM_APPLY_CAPABILITY; 8539 } 8540 8541 if (info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]) { 8542 params.ext_capab = 8543 nla_data(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); 8544 params.ext_capab_len = 8545 nla_len(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); 8546 } 8547 8548 if (parse_station_flags(info, wdev->iftype, ¶ms)) 8549 return -EINVAL; 8550 8551 if (info->attrs[NL80211_ATTR_STA_PLINK_ACTION]) 8552 params.plink_action = 8553 nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_ACTION]); 8554 8555 if (info->attrs[NL80211_ATTR_STA_PLINK_STATE]) { 8556 params.plink_state = 8557 nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_STATE]); 8558 if (info->attrs[NL80211_ATTR_MESH_PEER_AID]) 8559 params.peer_aid = nla_get_u16( 8560 info->attrs[NL80211_ATTR_MESH_PEER_AID]); 8561 params.sta_modify_mask |= STATION_PARAM_APPLY_PLINK_STATE; 8562 } 8563 8564 if (info->attrs[NL80211_ATTR_LOCAL_MESH_POWER_MODE]) 8565 params.local_pm = nla_get_u32( 8566 info->attrs[NL80211_ATTR_LOCAL_MESH_POWER_MODE]); 8567 8568 if (info->attrs[NL80211_ATTR_OPMODE_NOTIF]) { 8569 params.link_sta_params.opmode_notif_used = true; 8570 params.link_sta_params.opmode_notif = 8571 nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]); 8572 } 8573 8574 if (info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]) 8575 params.link_sta_params.he_6ghz_capa = 8576 nla_data(info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]); 8577 8578 if (info->attrs[NL80211_ATTR_EML_CAPABILITY]) { 8579 params.eml_cap_present = true; 8580 params.eml_cap = 8581 nla_get_u16(info->attrs[NL80211_ATTR_EML_CAPABILITY]); 8582 } 8583 8584 if (info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]) 8585 params.airtime_weight = 8586 nla_get_u16(info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]); 8587 8588 if (params.airtime_weight && 8589 !wiphy_ext_feature_isset(&rdev->wiphy, 8590 NL80211_EXT_FEATURE_AIRTIME_FAIRNESS)) 8591 return -EOPNOTSUPP; 8592 8593 err = nl80211_parse_sta_txpower_setting(info, 8594 ¶ms.link_sta_params.txpwr, 8595 ¶ms.link_sta_params.txpwr_set); 8596 if (err) 8597 return err; 8598 8599 /* Include parameters for TDLS peer (will check later) */ 8600 err = nl80211_set_station_tdls(info, ¶ms); 8601 if (err) 8602 return err; 8603 8604 params.vlan = get_vlan(info, rdev); 8605 if (IS_ERR(params.vlan)) 8606 return PTR_ERR(params.vlan); 8607 8608 switch (wdev->iftype) { 8609 case NL80211_IFTYPE_AP: 8610 case NL80211_IFTYPE_AP_VLAN: 8611 case NL80211_IFTYPE_P2P_GO: 8612 case NL80211_IFTYPE_P2P_CLIENT: 8613 case NL80211_IFTYPE_STATION: 8614 case NL80211_IFTYPE_ADHOC: 8615 case NL80211_IFTYPE_MESH_POINT: 8616 break; 8617 default: 8618 err = -EOPNOTSUPP; 8619 goto out_put_vlan; 8620 } 8621 8622 /* driver will call cfg80211_check_station_change() */ 8623 err = rdev_change_station(rdev, wdev, mac_addr, ¶ms); 8624 8625 out_put_vlan: 8626 dev_put(params.vlan); 8627 8628 return err; 8629 } 8630 8631 static int nl80211_new_station(struct sk_buff *skb, struct genl_info *info) 8632 { 8633 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 8634 int err; 8635 struct wireless_dev *wdev = info->user_ptr[1]; 8636 struct net_device *dev = wdev->netdev; 8637 struct station_parameters params; 8638 u8 *mac_addr = NULL; 8639 u32 auth_assoc = BIT(NL80211_STA_FLAG_AUTHENTICATED) | 8640 BIT(NL80211_STA_FLAG_ASSOCIATED); 8641 8642 memset(¶ms, 0, sizeof(params)); 8643 8644 if (!dev) 8645 return -EINVAL; 8646 8647 if (!rdev->ops->add_station) 8648 return -EOPNOTSUPP; 8649 8650 if (!info->attrs[NL80211_ATTR_MAC]) 8651 return -EINVAL; 8652 8653 if (!info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]) 8654 return -EINVAL; 8655 8656 if (!info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) 8657 return -EINVAL; 8658 8659 if (!info->attrs[NL80211_ATTR_STA_AID] && 8660 !info->attrs[NL80211_ATTR_PEER_AID]) 8661 return -EINVAL; 8662 8663 params.link_sta_params.link_id = 8664 nl80211_link_id_or_invalid(info->attrs); 8665 8666 if (info->attrs[NL80211_ATTR_MLD_ADDR]) { 8667 mac_addr = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]); 8668 params.link_sta_params.mld_mac = mac_addr; 8669 params.link_sta_params.link_mac = 8670 nla_data(info->attrs[NL80211_ATTR_MAC]); 8671 if (!is_valid_ether_addr(params.link_sta_params.link_mac)) 8672 return -EINVAL; 8673 } else { 8674 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 8675 } 8676 8677 params.link_sta_params.supported_rates = 8678 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); 8679 params.link_sta_params.supported_rates_len = 8680 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); 8681 params.listen_interval = 8682 nla_get_u16(info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]); 8683 8684 if (info->attrs[NL80211_ATTR_VLAN_ID]) 8685 params.vlan_id = nla_get_u16(info->attrs[NL80211_ATTR_VLAN_ID]); 8686 8687 if (info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]) { 8688 params.support_p2p_ps = 8689 nla_get_u8(info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]); 8690 } else { 8691 /* 8692 * if not specified, assume it's supported for P2P GO interface, 8693 * and is NOT supported for AP interface 8694 */ 8695 params.support_p2p_ps = 8696 wdev->iftype == NL80211_IFTYPE_P2P_GO; 8697 } 8698 8699 if (info->attrs[NL80211_ATTR_PEER_AID]) 8700 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_PEER_AID]); 8701 else 8702 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_STA_AID]); 8703 8704 if (info->attrs[NL80211_ATTR_STA_CAPABILITY]) { 8705 params.capability = 8706 nla_get_u16(info->attrs[NL80211_ATTR_STA_CAPABILITY]); 8707 params.sta_modify_mask |= STATION_PARAM_APPLY_CAPABILITY; 8708 } 8709 8710 if (info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]) { 8711 params.ext_capab = 8712 nla_data(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); 8713 params.ext_capab_len = 8714 nla_len(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); 8715 } 8716 8717 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) 8718 params.link_sta_params.ht_capa = 8719 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]); 8720 8721 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) 8722 params.link_sta_params.vht_capa = 8723 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]); 8724 8725 if (info->attrs[NL80211_ATTR_HE_CAPABILITY]) { 8726 params.link_sta_params.he_capa = 8727 nla_data(info->attrs[NL80211_ATTR_HE_CAPABILITY]); 8728 params.link_sta_params.he_capa_len = 8729 nla_len(info->attrs[NL80211_ATTR_HE_CAPABILITY]); 8730 8731 if (info->attrs[NL80211_ATTR_EHT_CAPABILITY]) { 8732 params.link_sta_params.eht_capa = 8733 nla_data(info->attrs[NL80211_ATTR_EHT_CAPABILITY]); 8734 params.link_sta_params.eht_capa_len = 8735 nla_len(info->attrs[NL80211_ATTR_EHT_CAPABILITY]); 8736 8737 if (!ieee80211_eht_capa_size_ok((const u8 *)params.link_sta_params.he_capa, 8738 (const u8 *)params.link_sta_params.eht_capa, 8739 params.link_sta_params.eht_capa_len, 8740 false)) 8741 return -EINVAL; 8742 } 8743 } 8744 8745 if (info->attrs[NL80211_ATTR_UHR_CAPABILITY]) { 8746 if (!params.link_sta_params.eht_capa) 8747 return -EINVAL; 8748 8749 params.link_sta_params.uhr_capa = 8750 nla_data(info->attrs[NL80211_ATTR_UHR_CAPABILITY]); 8751 params.link_sta_params.uhr_capa_len = 8752 nla_len(info->attrs[NL80211_ATTR_UHR_CAPABILITY]); 8753 } 8754 8755 if (info->attrs[NL80211_ATTR_EML_CAPABILITY]) { 8756 params.eml_cap_present = true; 8757 params.eml_cap = 8758 nla_get_u16(info->attrs[NL80211_ATTR_EML_CAPABILITY]); 8759 } 8760 8761 if (info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]) 8762 params.link_sta_params.he_6ghz_capa = 8763 nla_data(info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]); 8764 8765 if (info->attrs[NL80211_ATTR_S1G_CAPABILITY]) 8766 params.link_sta_params.s1g_capa = 8767 nla_data(info->attrs[NL80211_ATTR_S1G_CAPABILITY]); 8768 8769 if (info->attrs[NL80211_ATTR_OPMODE_NOTIF]) { 8770 params.link_sta_params.opmode_notif_used = true; 8771 params.link_sta_params.opmode_notif = 8772 nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]); 8773 } 8774 8775 if (info->attrs[NL80211_ATTR_STA_PLINK_ACTION]) 8776 params.plink_action = 8777 nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_ACTION]); 8778 8779 if (info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]) 8780 params.airtime_weight = 8781 nla_get_u16(info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]); 8782 8783 if (params.airtime_weight && 8784 !wiphy_ext_feature_isset(&rdev->wiphy, 8785 NL80211_EXT_FEATURE_AIRTIME_FAIRNESS)) 8786 return -EOPNOTSUPP; 8787 8788 err = nl80211_parse_sta_txpower_setting(info, 8789 ¶ms.link_sta_params.txpwr, 8790 ¶ms.link_sta_params.txpwr_set); 8791 if (err) 8792 return err; 8793 8794 err = nl80211_parse_sta_channel_info(info, ¶ms); 8795 if (err) 8796 return err; 8797 8798 err = nl80211_parse_sta_wme(info, ¶ms); 8799 if (err) 8800 return err; 8801 8802 if (parse_station_flags(info, wdev->iftype, ¶ms)) 8803 return -EINVAL; 8804 8805 /* HT/VHT requires QoS, but if we don't have that just ignore HT/VHT 8806 * as userspace might just pass through the capabilities from the IEs 8807 * directly, rather than enforcing this restriction and returning an 8808 * error in this case. 8809 */ 8810 if (!(params.sta_flags_set & BIT(NL80211_STA_FLAG_WME))) { 8811 params.link_sta_params.ht_capa = NULL; 8812 params.link_sta_params.vht_capa = NULL; 8813 8814 /* HE, EHT and UHR require WME */ 8815 if (params.link_sta_params.he_capa_len || 8816 params.link_sta_params.he_6ghz_capa || 8817 params.link_sta_params.eht_capa_len || 8818 params.link_sta_params.uhr_capa_len) 8819 return -EINVAL; 8820 } 8821 8822 /* Ensure that HT/VHT capabilities are not set for 6 GHz HE STA */ 8823 if (params.link_sta_params.he_6ghz_capa && 8824 (params.link_sta_params.ht_capa || params.link_sta_params.vht_capa)) 8825 return -EINVAL; 8826 8827 /* When you run into this, adjust the code below for the new flag */ 8828 BUILD_BUG_ON(NL80211_STA_FLAG_MAX != 8); 8829 8830 switch (wdev->iftype) { 8831 case NL80211_IFTYPE_AP: 8832 case NL80211_IFTYPE_AP_VLAN: 8833 case NL80211_IFTYPE_P2P_GO: 8834 /* ignore WME attributes if iface/sta is not capable */ 8835 if (!(rdev->wiphy.flags & WIPHY_FLAG_AP_UAPSD) || 8836 !(params.sta_flags_set & BIT(NL80211_STA_FLAG_WME))) 8837 params.sta_modify_mask &= ~STATION_PARAM_APPLY_UAPSD; 8838 8839 /* TDLS peers cannot be added */ 8840 if ((params.sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) || 8841 info->attrs[NL80211_ATTR_PEER_AID]) 8842 return -EINVAL; 8843 /* but don't bother the driver with it */ 8844 params.sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER); 8845 8846 /* allow authenticated/associated only if driver handles it */ 8847 if (!(rdev->wiphy.features & 8848 NL80211_FEATURE_FULL_AP_CLIENT_STATE) && 8849 params.sta_flags_mask & auth_assoc) 8850 return -EINVAL; 8851 8852 if (!wiphy_ext_feature_isset(&rdev->wiphy, 8853 NL80211_EXT_FEATURE_SPP_AMSDU_SUPPORT) && 8854 params.sta_flags_mask & BIT(NL80211_STA_FLAG_SPP_AMSDU)) 8855 return -EINVAL; 8856 8857 /* Older userspace, or userspace wanting to be compatible with 8858 * !NL80211_FEATURE_FULL_AP_CLIENT_STATE, will not set the auth 8859 * and assoc flags in the mask, but assumes the station will be 8860 * added as associated anyway since this was the required driver 8861 * behaviour before NL80211_FEATURE_FULL_AP_CLIENT_STATE was 8862 * introduced. 8863 * In order to not bother drivers with this quirk in the API 8864 * set the flags in both the mask and set for new stations in 8865 * this case. 8866 */ 8867 if (!(params.sta_flags_mask & auth_assoc)) { 8868 params.sta_flags_mask |= auth_assoc; 8869 params.sta_flags_set |= auth_assoc; 8870 } 8871 8872 /* must be last in here for error handling */ 8873 params.vlan = get_vlan(info, rdev); 8874 if (IS_ERR(params.vlan)) 8875 return PTR_ERR(params.vlan); 8876 break; 8877 case NL80211_IFTYPE_MESH_POINT: 8878 /* ignore uAPSD data */ 8879 params.sta_modify_mask &= ~STATION_PARAM_APPLY_UAPSD; 8880 8881 /* associated is disallowed */ 8882 if (params.sta_flags_mask & BIT(NL80211_STA_FLAG_ASSOCIATED)) 8883 return -EINVAL; 8884 /* TDLS peers cannot be added */ 8885 if ((params.sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) || 8886 info->attrs[NL80211_ATTR_PEER_AID]) 8887 return -EINVAL; 8888 break; 8889 case NL80211_IFTYPE_STATION: 8890 case NL80211_IFTYPE_P2P_CLIENT: 8891 /* ignore uAPSD data */ 8892 params.sta_modify_mask &= ~STATION_PARAM_APPLY_UAPSD; 8893 8894 /* these are disallowed */ 8895 if (params.sta_flags_mask & 8896 (BIT(NL80211_STA_FLAG_ASSOCIATED) | 8897 BIT(NL80211_STA_FLAG_AUTHENTICATED))) 8898 return -EINVAL; 8899 /* Only TDLS peers can be added */ 8900 if (!(params.sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER))) 8901 return -EINVAL; 8902 /* Can only add if TDLS ... */ 8903 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS)) 8904 return -EOPNOTSUPP; 8905 /* ... with external setup is supported */ 8906 if (!(rdev->wiphy.flags & WIPHY_FLAG_TDLS_EXTERNAL_SETUP)) 8907 return -EOPNOTSUPP; 8908 /* 8909 * Older wpa_supplicant versions always mark the TDLS peer 8910 * as authorized, but it shouldn't yet be. 8911 */ 8912 params.sta_flags_mask &= ~BIT(NL80211_STA_FLAG_AUTHORIZED); 8913 break; 8914 default: 8915 return -EOPNOTSUPP; 8916 } 8917 8918 /* be aware of params.vlan when changing code here */ 8919 8920 if (wdev->valid_links) { 8921 if (params.link_sta_params.link_id < 0) { 8922 err = -EINVAL; 8923 goto out; 8924 } 8925 if (!(wdev->valid_links & BIT(params.link_sta_params.link_id))) { 8926 err = -ENOLINK; 8927 goto out; 8928 } 8929 } else { 8930 if (params.link_sta_params.link_id >= 0) { 8931 err = -EINVAL; 8932 goto out; 8933 } 8934 } 8935 8936 params.epp_peer = 8937 nla_get_flag(info->attrs[NL80211_ATTR_EPP_PEER]); 8938 8939 err = rdev_add_station(rdev, wdev, mac_addr, ¶ms); 8940 out: 8941 dev_put(params.vlan); 8942 return err; 8943 } 8944 8945 static int nl80211_del_station(struct sk_buff *skb, struct genl_info *info) 8946 { 8947 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 8948 struct wireless_dev *wdev = info->user_ptr[1]; 8949 struct net_device *dev = wdev->netdev; 8950 struct station_del_parameters params; 8951 int link_id = nl80211_link_id_or_invalid(info->attrs); 8952 8953 memset(¶ms, 0, sizeof(params)); 8954 8955 if (!dev) 8956 return -EINVAL; 8957 8958 if (info->attrs[NL80211_ATTR_MAC]) 8959 params.mac = nla_data(info->attrs[NL80211_ATTR_MAC]); 8960 8961 switch (wdev->iftype) { 8962 case NL80211_IFTYPE_AP: 8963 case NL80211_IFTYPE_AP_VLAN: 8964 case NL80211_IFTYPE_MESH_POINT: 8965 case NL80211_IFTYPE_P2P_GO: 8966 /* always accept these */ 8967 break; 8968 case NL80211_IFTYPE_ADHOC: 8969 /* conditionally accept */ 8970 if (wiphy_ext_feature_isset(&rdev->wiphy, 8971 NL80211_EXT_FEATURE_DEL_IBSS_STA)) 8972 break; 8973 return -EINVAL; 8974 default: 8975 return -EINVAL; 8976 } 8977 8978 if (!rdev->ops->del_station) 8979 return -EOPNOTSUPP; 8980 8981 if (info->attrs[NL80211_ATTR_MGMT_SUBTYPE]) { 8982 params.subtype = 8983 nla_get_u8(info->attrs[NL80211_ATTR_MGMT_SUBTYPE]); 8984 if (params.subtype != IEEE80211_STYPE_DISASSOC >> 4 && 8985 params.subtype != IEEE80211_STYPE_DEAUTH >> 4) 8986 return -EINVAL; 8987 } else { 8988 /* Default to Deauthentication frame */ 8989 params.subtype = IEEE80211_STYPE_DEAUTH >> 4; 8990 } 8991 8992 if (info->attrs[NL80211_ATTR_REASON_CODE]) { 8993 params.reason_code = 8994 nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); 8995 if (params.reason_code == 0) 8996 return -EINVAL; /* 0 is reserved */ 8997 } else { 8998 /* Default to reason code 2 */ 8999 params.reason_code = WLAN_REASON_PREV_AUTH_NOT_VALID; 9000 } 9001 9002 /* Link ID not expected in case of non-ML operation */ 9003 if (!wdev->valid_links && link_id != -1) 9004 return -EINVAL; 9005 9006 /* If given, a valid link ID should be passed during MLO */ 9007 if (wdev->valid_links && link_id >= 0 && 9008 !(wdev->valid_links & BIT(link_id))) 9009 return -EINVAL; 9010 9011 params.link_id = link_id; 9012 9013 return rdev_del_station(rdev, wdev, ¶ms); 9014 } 9015 9016 static int nl80211_send_mpath(struct sk_buff *msg, u32 portid, u32 seq, 9017 int flags, struct net_device *dev, 9018 u8 *dst, u8 *next_hop, 9019 struct mpath_info *pinfo) 9020 { 9021 void *hdr; 9022 struct nlattr *pinfoattr; 9023 9024 hdr = nl80211hdr_put(msg, portid, seq, flags, NL80211_CMD_NEW_MPATH); 9025 if (!hdr) 9026 return -1; 9027 9028 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 9029 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, dst) || 9030 nla_put(msg, NL80211_ATTR_MPATH_NEXT_HOP, ETH_ALEN, next_hop) || 9031 nla_put_u32(msg, NL80211_ATTR_GENERATION, pinfo->generation)) 9032 goto nla_put_failure; 9033 9034 pinfoattr = nla_nest_start_noflag(msg, NL80211_ATTR_MPATH_INFO); 9035 if (!pinfoattr) 9036 goto nla_put_failure; 9037 if ((pinfo->filled & MPATH_INFO_FRAME_QLEN) && 9038 nla_put_u32(msg, NL80211_MPATH_INFO_FRAME_QLEN, 9039 pinfo->frame_qlen)) 9040 goto nla_put_failure; 9041 if (((pinfo->filled & MPATH_INFO_SN) && 9042 nla_put_u32(msg, NL80211_MPATH_INFO_SN, pinfo->sn)) || 9043 ((pinfo->filled & MPATH_INFO_METRIC) && 9044 nla_put_u32(msg, NL80211_MPATH_INFO_METRIC, 9045 pinfo->metric)) || 9046 ((pinfo->filled & MPATH_INFO_EXPTIME) && 9047 nla_put_u32(msg, NL80211_MPATH_INFO_EXPTIME, 9048 pinfo->exptime)) || 9049 ((pinfo->filled & MPATH_INFO_FLAGS) && 9050 nla_put_u8(msg, NL80211_MPATH_INFO_FLAGS, 9051 pinfo->flags)) || 9052 ((pinfo->filled & MPATH_INFO_DISCOVERY_TIMEOUT) && 9053 nla_put_u32(msg, NL80211_MPATH_INFO_DISCOVERY_TIMEOUT, 9054 pinfo->discovery_timeout)) || 9055 ((pinfo->filled & MPATH_INFO_DISCOVERY_RETRIES) && 9056 nla_put_u8(msg, NL80211_MPATH_INFO_DISCOVERY_RETRIES, 9057 pinfo->discovery_retries)) || 9058 ((pinfo->filled & MPATH_INFO_HOP_COUNT) && 9059 nla_put_u8(msg, NL80211_MPATH_INFO_HOP_COUNT, 9060 pinfo->hop_count)) || 9061 ((pinfo->filled & MPATH_INFO_PATH_CHANGE) && 9062 nla_put_u32(msg, NL80211_MPATH_INFO_PATH_CHANGE, 9063 pinfo->path_change_count))) 9064 goto nla_put_failure; 9065 9066 nla_nest_end(msg, pinfoattr); 9067 9068 genlmsg_end(msg, hdr); 9069 return 0; 9070 9071 nla_put_failure: 9072 genlmsg_cancel(msg, hdr); 9073 return -EMSGSIZE; 9074 } 9075 9076 static int nl80211_dump_mpath(struct sk_buff *skb, 9077 struct netlink_callback *cb) 9078 { 9079 struct mpath_info pinfo; 9080 struct cfg80211_registered_device *rdev; 9081 struct wireless_dev *wdev; 9082 u8 dst[ETH_ALEN]; 9083 u8 next_hop[ETH_ALEN]; 9084 int path_idx = cb->args[2]; 9085 int err; 9086 9087 err = nl80211_prepare_wdev_dump(cb, &rdev, &wdev, NULL); 9088 if (err) 9089 return err; 9090 /* nl80211_prepare_wdev_dump acquired it in the successful case */ 9091 __acquire(&rdev->wiphy.mtx); 9092 9093 if (!rdev->ops->dump_mpath) { 9094 err = -EOPNOTSUPP; 9095 goto out_err; 9096 } 9097 9098 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) { 9099 err = -EOPNOTSUPP; 9100 goto out_err; 9101 } 9102 9103 while (1) { 9104 err = rdev_dump_mpath(rdev, wdev->netdev, path_idx, dst, 9105 next_hop, &pinfo); 9106 if (err == -ENOENT) 9107 break; 9108 if (err) 9109 goto out_err; 9110 9111 if (nl80211_send_mpath(skb, NETLINK_CB(cb->skb).portid, 9112 cb->nlh->nlmsg_seq, NLM_F_MULTI, 9113 wdev->netdev, dst, next_hop, 9114 &pinfo) < 0) 9115 goto out; 9116 9117 path_idx++; 9118 } 9119 9120 out: 9121 cb->args[2] = path_idx; 9122 err = skb->len; 9123 out_err: 9124 wiphy_unlock(&rdev->wiphy); 9125 return err; 9126 } 9127 9128 static int nl80211_get_mpath(struct sk_buff *skb, struct genl_info *info) 9129 { 9130 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9131 int err; 9132 struct net_device *dev = info->user_ptr[1]; 9133 struct mpath_info pinfo; 9134 struct sk_buff *msg; 9135 u8 *dst = NULL; 9136 u8 next_hop[ETH_ALEN]; 9137 9138 memset(&pinfo, 0, sizeof(pinfo)); 9139 9140 if (!info->attrs[NL80211_ATTR_MAC]) 9141 return -EINVAL; 9142 9143 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); 9144 9145 if (!rdev->ops->get_mpath) 9146 return -EOPNOTSUPP; 9147 9148 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) 9149 return -EOPNOTSUPP; 9150 9151 err = rdev_get_mpath(rdev, dev, dst, next_hop, &pinfo); 9152 if (err) 9153 return err; 9154 9155 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 9156 if (!msg) 9157 return -ENOMEM; 9158 9159 if (nl80211_send_mpath(msg, info->snd_portid, info->snd_seq, 0, 9160 dev, dst, next_hop, &pinfo) < 0) { 9161 nlmsg_free(msg); 9162 return -ENOBUFS; 9163 } 9164 9165 return genlmsg_reply(msg, info); 9166 } 9167 9168 static int nl80211_set_mpath(struct sk_buff *skb, struct genl_info *info) 9169 { 9170 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9171 struct net_device *dev = info->user_ptr[1]; 9172 u8 *dst = NULL; 9173 u8 *next_hop = NULL; 9174 9175 if (!info->attrs[NL80211_ATTR_MAC]) 9176 return -EINVAL; 9177 9178 if (!info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]) 9179 return -EINVAL; 9180 9181 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); 9182 next_hop = nla_data(info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]); 9183 9184 if (!rdev->ops->change_mpath) 9185 return -EOPNOTSUPP; 9186 9187 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) 9188 return -EOPNOTSUPP; 9189 9190 return rdev_change_mpath(rdev, dev, dst, next_hop); 9191 } 9192 9193 static int nl80211_new_mpath(struct sk_buff *skb, struct genl_info *info) 9194 { 9195 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9196 struct net_device *dev = info->user_ptr[1]; 9197 u8 *dst = NULL; 9198 u8 *next_hop = NULL; 9199 9200 if (!info->attrs[NL80211_ATTR_MAC]) 9201 return -EINVAL; 9202 9203 if (!info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]) 9204 return -EINVAL; 9205 9206 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); 9207 next_hop = nla_data(info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]); 9208 9209 if (!rdev->ops->add_mpath) 9210 return -EOPNOTSUPP; 9211 9212 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) 9213 return -EOPNOTSUPP; 9214 9215 return rdev_add_mpath(rdev, dev, dst, next_hop); 9216 } 9217 9218 static int nl80211_del_mpath(struct sk_buff *skb, struct genl_info *info) 9219 { 9220 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9221 struct net_device *dev = info->user_ptr[1]; 9222 u8 *dst = NULL; 9223 9224 if (info->attrs[NL80211_ATTR_MAC]) 9225 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); 9226 9227 if (!rdev->ops->del_mpath) 9228 return -EOPNOTSUPP; 9229 9230 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) 9231 return -EOPNOTSUPP; 9232 9233 return rdev_del_mpath(rdev, dev, dst); 9234 } 9235 9236 static int nl80211_get_mpp(struct sk_buff *skb, struct genl_info *info) 9237 { 9238 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9239 int err; 9240 struct net_device *dev = info->user_ptr[1]; 9241 struct mpath_info pinfo; 9242 struct sk_buff *msg; 9243 u8 *dst = NULL; 9244 u8 mpp[ETH_ALEN]; 9245 9246 memset(&pinfo, 0, sizeof(pinfo)); 9247 9248 if (!info->attrs[NL80211_ATTR_MAC]) 9249 return -EINVAL; 9250 9251 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); 9252 9253 if (!rdev->ops->get_mpp) 9254 return -EOPNOTSUPP; 9255 9256 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) 9257 return -EOPNOTSUPP; 9258 9259 err = rdev_get_mpp(rdev, dev, dst, mpp, &pinfo); 9260 if (err) 9261 return err; 9262 9263 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 9264 if (!msg) 9265 return -ENOMEM; 9266 9267 if (nl80211_send_mpath(msg, info->snd_portid, info->snd_seq, 0, 9268 dev, dst, mpp, &pinfo) < 0) { 9269 nlmsg_free(msg); 9270 return -ENOBUFS; 9271 } 9272 9273 return genlmsg_reply(msg, info); 9274 } 9275 9276 static int nl80211_dump_mpp(struct sk_buff *skb, 9277 struct netlink_callback *cb) 9278 { 9279 struct mpath_info pinfo; 9280 struct cfg80211_registered_device *rdev; 9281 struct wireless_dev *wdev; 9282 u8 dst[ETH_ALEN]; 9283 u8 mpp[ETH_ALEN]; 9284 int path_idx = cb->args[2]; 9285 int err; 9286 9287 err = nl80211_prepare_wdev_dump(cb, &rdev, &wdev, NULL); 9288 if (err) 9289 return err; 9290 /* nl80211_prepare_wdev_dump acquired it in the successful case */ 9291 __acquire(&rdev->wiphy.mtx); 9292 9293 if (!rdev->ops->dump_mpp) { 9294 err = -EOPNOTSUPP; 9295 goto out_err; 9296 } 9297 9298 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) { 9299 err = -EOPNOTSUPP; 9300 goto out_err; 9301 } 9302 9303 while (1) { 9304 err = rdev_dump_mpp(rdev, wdev->netdev, path_idx, dst, 9305 mpp, &pinfo); 9306 if (err == -ENOENT) 9307 break; 9308 if (err) 9309 goto out_err; 9310 9311 if (nl80211_send_mpath(skb, NETLINK_CB(cb->skb).portid, 9312 cb->nlh->nlmsg_seq, NLM_F_MULTI, 9313 wdev->netdev, dst, mpp, 9314 &pinfo) < 0) 9315 goto out; 9316 9317 path_idx++; 9318 } 9319 9320 out: 9321 cb->args[2] = path_idx; 9322 err = skb->len; 9323 out_err: 9324 wiphy_unlock(&rdev->wiphy); 9325 return err; 9326 } 9327 9328 static int nl80211_set_bss(struct sk_buff *skb, struct genl_info *info) 9329 { 9330 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9331 struct net_device *dev = info->user_ptr[1]; 9332 struct bss_parameters params; 9333 u32 bss_param_support = rdev->wiphy.bss_param_support; 9334 u32 changed = 0; 9335 bool strict; 9336 9337 memset(¶ms, 0, sizeof(params)); 9338 params.link_id = nl80211_link_id_or_invalid(info->attrs); 9339 /* default to not changing parameters */ 9340 params.use_cts_prot = -1; 9341 params.use_short_preamble = -1; 9342 params.use_short_slot_time = -1; 9343 params.ap_isolate = -1; 9344 params.ht_opmode = -1; 9345 params.p2p_ctwindow = -1; 9346 params.p2p_opp_ps = -1; 9347 9348 strict = nla_get_flag(info->attrs[NL80211_ATTR_BSS_PARAM]); 9349 if (info->attrs[NL80211_ATTR_BSS_CTS_PROT]) { 9350 if (strict && !(bss_param_support & WIPHY_BSS_PARAM_CTS_PROT)) 9351 return -EINVAL; 9352 params.use_cts_prot = 9353 nla_get_u8(info->attrs[NL80211_ATTR_BSS_CTS_PROT]); 9354 changed |= WIPHY_BSS_PARAM_CTS_PROT; 9355 } 9356 if (info->attrs[NL80211_ATTR_BSS_SHORT_PREAMBLE]) { 9357 if (strict && 9358 !(bss_param_support & WIPHY_BSS_PARAM_SHORT_PREAMBLE)) 9359 return -EINVAL; 9360 params.use_short_preamble = 9361 nla_get_u8(info->attrs[NL80211_ATTR_BSS_SHORT_PREAMBLE]); 9362 changed |= WIPHY_BSS_PARAM_SHORT_PREAMBLE; 9363 } 9364 if (info->attrs[NL80211_ATTR_BSS_SHORT_SLOT_TIME]) { 9365 if (strict && 9366 !(bss_param_support & WIPHY_BSS_PARAM_SHORT_SLOT_TIME)) 9367 return -EINVAL; 9368 params.use_short_slot_time = 9369 nla_get_u8(info->attrs[NL80211_ATTR_BSS_SHORT_SLOT_TIME]); 9370 changed |= WIPHY_BSS_PARAM_SHORT_SLOT_TIME; 9371 } 9372 if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) { 9373 if (strict && 9374 !(bss_param_support & WIPHY_BSS_PARAM_BASIC_RATES)) 9375 return -EINVAL; 9376 params.basic_rates = 9377 nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); 9378 params.basic_rates_len = 9379 nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); 9380 changed |= WIPHY_BSS_PARAM_BASIC_RATES; 9381 } 9382 if (info->attrs[NL80211_ATTR_AP_ISOLATE]) { 9383 if (strict && !(bss_param_support & WIPHY_BSS_PARAM_AP_ISOLATE)) 9384 return -EINVAL; 9385 params.ap_isolate = 9386 !!nla_get_u8(info->attrs[NL80211_ATTR_AP_ISOLATE]); 9387 changed |= WIPHY_BSS_PARAM_AP_ISOLATE; 9388 } 9389 if (info->attrs[NL80211_ATTR_BSS_HT_OPMODE]) { 9390 if (strict && !(bss_param_support & WIPHY_BSS_PARAM_HT_OPMODE)) 9391 return -EINVAL; 9392 params.ht_opmode = 9393 nla_get_u16(info->attrs[NL80211_ATTR_BSS_HT_OPMODE]); 9394 changed |= WIPHY_BSS_PARAM_HT_OPMODE; 9395 } 9396 9397 if (info->attrs[NL80211_ATTR_P2P_CTWINDOW]) { 9398 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 9399 return -EINVAL; 9400 params.p2p_ctwindow = 9401 nla_get_u8(info->attrs[NL80211_ATTR_P2P_CTWINDOW]); 9402 if (params.p2p_ctwindow != 0 && 9403 !(bss_param_support & WIPHY_BSS_PARAM_P2P_CTWINDOW)) 9404 return -EINVAL; 9405 changed |= WIPHY_BSS_PARAM_P2P_CTWINDOW; 9406 } 9407 9408 if (info->attrs[NL80211_ATTR_P2P_OPPPS]) { 9409 u8 tmp; 9410 9411 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 9412 return -EINVAL; 9413 tmp = nla_get_u8(info->attrs[NL80211_ATTR_P2P_OPPPS]); 9414 if (tmp && !(bss_param_support & WIPHY_BSS_PARAM_P2P_OPPPS)) 9415 return -EINVAL; 9416 params.p2p_opp_ps = tmp; 9417 if (params.p2p_opp_ps && 9418 !(rdev->wiphy.bss_param_support & WIPHY_BSS_PARAM_P2P_OPPPS)) 9419 return -EINVAL; 9420 } 9421 9422 if (!rdev->ops->change_bss) 9423 return -EOPNOTSUPP; 9424 9425 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 9426 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 9427 return -EOPNOTSUPP; 9428 9429 changed &= rdev->wiphy.bss_param_support; 9430 if (!changed) 9431 return 0; 9432 9433 return rdev_change_bss(rdev, dev, ¶ms); 9434 } 9435 9436 static int nl80211_req_set_reg(struct sk_buff *skb, struct genl_info *info) 9437 { 9438 char *data = NULL; 9439 bool is_indoor; 9440 enum nl80211_user_reg_hint_type user_reg_hint_type; 9441 u32 owner_nlportid; 9442 9443 /* 9444 * You should only get this when cfg80211 hasn't yet initialized 9445 * completely when built-in to the kernel right between the time 9446 * window between nl80211_init() and regulatory_init(), if that is 9447 * even possible. 9448 */ 9449 if (unlikely(!rcu_access_pointer(cfg80211_regdomain))) 9450 return -EINPROGRESS; 9451 9452 user_reg_hint_type = 9453 nla_get_u32_default(info->attrs[NL80211_ATTR_USER_REG_HINT_TYPE], 9454 NL80211_USER_REG_HINT_USER); 9455 9456 switch (user_reg_hint_type) { 9457 case NL80211_USER_REG_HINT_USER: 9458 case NL80211_USER_REG_HINT_CELL_BASE: 9459 if (!info->attrs[NL80211_ATTR_REG_ALPHA2]) 9460 return -EINVAL; 9461 9462 data = nla_data(info->attrs[NL80211_ATTR_REG_ALPHA2]); 9463 return regulatory_hint_user(data, user_reg_hint_type); 9464 case NL80211_USER_REG_HINT_INDOOR: 9465 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) { 9466 owner_nlportid = info->snd_portid; 9467 is_indoor = !!info->attrs[NL80211_ATTR_REG_INDOOR]; 9468 } else { 9469 owner_nlportid = 0; 9470 is_indoor = true; 9471 } 9472 9473 regulatory_hint_indoor(is_indoor, owner_nlportid); 9474 return 0; 9475 default: 9476 return -EINVAL; 9477 } 9478 } 9479 9480 static int nl80211_reload_regdb(struct sk_buff *skb, struct genl_info *info) 9481 { 9482 return reg_reload_regdb(); 9483 } 9484 9485 static int nl80211_get_mesh_config(struct sk_buff *skb, 9486 struct genl_info *info) 9487 { 9488 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9489 struct net_device *dev = info->user_ptr[1]; 9490 struct wireless_dev *wdev = dev->ieee80211_ptr; 9491 struct mesh_config cur_params; 9492 int err = 0; 9493 void *hdr; 9494 struct nlattr *pinfoattr; 9495 struct sk_buff *msg; 9496 9497 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) 9498 return -EOPNOTSUPP; 9499 9500 if (!rdev->ops->get_mesh_config) 9501 return -EOPNOTSUPP; 9502 9503 /* If not connected, get default parameters */ 9504 if (!wdev->u.mesh.id_len) 9505 memcpy(&cur_params, &default_mesh_config, sizeof(cur_params)); 9506 else 9507 err = rdev_get_mesh_config(rdev, dev, &cur_params); 9508 9509 if (err) 9510 return err; 9511 9512 /* Draw up a netlink message to send back */ 9513 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 9514 if (!msg) 9515 return -ENOMEM; 9516 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 9517 NL80211_CMD_GET_MESH_CONFIG); 9518 if (!hdr) 9519 goto out; 9520 pinfoattr = nla_nest_start_noflag(msg, NL80211_ATTR_MESH_CONFIG); 9521 if (!pinfoattr) 9522 goto nla_put_failure; 9523 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 9524 nla_put_u16(msg, NL80211_MESHCONF_RETRY_TIMEOUT, 9525 cur_params.dot11MeshRetryTimeout) || 9526 nla_put_u16(msg, NL80211_MESHCONF_CONFIRM_TIMEOUT, 9527 cur_params.dot11MeshConfirmTimeout) || 9528 nla_put_u16(msg, NL80211_MESHCONF_HOLDING_TIMEOUT, 9529 cur_params.dot11MeshHoldingTimeout) || 9530 nla_put_u16(msg, NL80211_MESHCONF_MAX_PEER_LINKS, 9531 cur_params.dot11MeshMaxPeerLinks) || 9532 nla_put_u8(msg, NL80211_MESHCONF_MAX_RETRIES, 9533 cur_params.dot11MeshMaxRetries) || 9534 nla_put_u8(msg, NL80211_MESHCONF_TTL, 9535 cur_params.dot11MeshTTL) || 9536 nla_put_u8(msg, NL80211_MESHCONF_ELEMENT_TTL, 9537 cur_params.element_ttl) || 9538 nla_put_u8(msg, NL80211_MESHCONF_AUTO_OPEN_PLINKS, 9539 cur_params.auto_open_plinks) || 9540 nla_put_u32(msg, NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR, 9541 cur_params.dot11MeshNbrOffsetMaxNeighbor) || 9542 nla_put_u8(msg, NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES, 9543 cur_params.dot11MeshHWMPmaxPREQretries) || 9544 nla_put_u32(msg, NL80211_MESHCONF_PATH_REFRESH_TIME, 9545 cur_params.path_refresh_time) || 9546 nla_put_u16(msg, NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT, 9547 cur_params.min_discovery_timeout) || 9548 nla_put_u32(msg, NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT, 9549 cur_params.dot11MeshHWMPactivePathTimeout) || 9550 nla_put_u16(msg, NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL, 9551 cur_params.dot11MeshHWMPpreqMinInterval) || 9552 nla_put_u16(msg, NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL, 9553 cur_params.dot11MeshHWMPperrMinInterval) || 9554 nla_put_u16(msg, NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME, 9555 cur_params.dot11MeshHWMPnetDiameterTraversalTime) || 9556 nla_put_u8(msg, NL80211_MESHCONF_HWMP_ROOTMODE, 9557 cur_params.dot11MeshHWMPRootMode) || 9558 nla_put_u16(msg, NL80211_MESHCONF_HWMP_RANN_INTERVAL, 9559 cur_params.dot11MeshHWMPRannInterval) || 9560 nla_put_u8(msg, NL80211_MESHCONF_GATE_ANNOUNCEMENTS, 9561 cur_params.dot11MeshGateAnnouncementProtocol) || 9562 nla_put_u8(msg, NL80211_MESHCONF_FORWARDING, 9563 cur_params.dot11MeshForwarding) || 9564 nla_put_s32(msg, NL80211_MESHCONF_RSSI_THRESHOLD, 9565 cur_params.rssi_threshold) || 9566 nla_put_u32(msg, NL80211_MESHCONF_HT_OPMODE, 9567 cur_params.ht_opmode) || 9568 nla_put_u32(msg, NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT, 9569 cur_params.dot11MeshHWMPactivePathToRootTimeout) || 9570 nla_put_u16(msg, NL80211_MESHCONF_HWMP_ROOT_INTERVAL, 9571 cur_params.dot11MeshHWMProotInterval) || 9572 nla_put_u16(msg, NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL, 9573 cur_params.dot11MeshHWMPconfirmationInterval) || 9574 nla_put_u32(msg, NL80211_MESHCONF_POWER_MODE, 9575 cur_params.power_mode) || 9576 nla_put_u16(msg, NL80211_MESHCONF_AWAKE_WINDOW, 9577 cur_params.dot11MeshAwakeWindowDuration) || 9578 nla_put_u32(msg, NL80211_MESHCONF_PLINK_TIMEOUT, 9579 cur_params.plink_timeout) || 9580 nla_put_u8(msg, NL80211_MESHCONF_CONNECTED_TO_GATE, 9581 cur_params.dot11MeshConnectedToMeshGate) || 9582 nla_put_u8(msg, NL80211_MESHCONF_NOLEARN, 9583 cur_params.dot11MeshNolearn) || 9584 nla_put_u8(msg, NL80211_MESHCONF_CONNECTED_TO_AS, 9585 cur_params.dot11MeshConnectedToAuthServer)) 9586 goto nla_put_failure; 9587 nla_nest_end(msg, pinfoattr); 9588 genlmsg_end(msg, hdr); 9589 return genlmsg_reply(msg, info); 9590 9591 nla_put_failure: 9592 out: 9593 nlmsg_free(msg); 9594 return -ENOBUFS; 9595 } 9596 9597 static const struct nla_policy 9598 nl80211_meshconf_params_policy[NL80211_MESHCONF_ATTR_MAX+1] = { 9599 [NL80211_MESHCONF_RETRY_TIMEOUT] = 9600 NLA_POLICY_RANGE(NLA_U16, 1, 255), 9601 [NL80211_MESHCONF_CONFIRM_TIMEOUT] = 9602 NLA_POLICY_RANGE(NLA_U16, 1, 255), 9603 [NL80211_MESHCONF_HOLDING_TIMEOUT] = 9604 NLA_POLICY_RANGE(NLA_U16, 1, 255), 9605 [NL80211_MESHCONF_MAX_PEER_LINKS] = 9606 NLA_POLICY_RANGE(NLA_U16, 0, 255), 9607 [NL80211_MESHCONF_MAX_RETRIES] = NLA_POLICY_MAX(NLA_U8, 16), 9608 [NL80211_MESHCONF_TTL] = NLA_POLICY_MIN(NLA_U8, 1), 9609 [NL80211_MESHCONF_ELEMENT_TTL] = NLA_POLICY_MIN(NLA_U8, 1), 9610 [NL80211_MESHCONF_AUTO_OPEN_PLINKS] = NLA_POLICY_MAX(NLA_U8, 1), 9611 [NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR] = 9612 NLA_POLICY_RANGE(NLA_U32, 1, 255), 9613 [NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES] = { .type = NLA_U8 }, 9614 [NL80211_MESHCONF_PATH_REFRESH_TIME] = { .type = NLA_U32 }, 9615 [NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT] = NLA_POLICY_MIN(NLA_U16, 1), 9616 [NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT] = { .type = NLA_U32 }, 9617 [NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL] = 9618 NLA_POLICY_MIN(NLA_U16, 1), 9619 [NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL] = 9620 NLA_POLICY_MIN(NLA_U16, 1), 9621 [NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME] = 9622 NLA_POLICY_MIN(NLA_U16, 1), 9623 [NL80211_MESHCONF_HWMP_ROOTMODE] = NLA_POLICY_MAX(NLA_U8, 4), 9624 [NL80211_MESHCONF_HWMP_RANN_INTERVAL] = 9625 NLA_POLICY_MIN(NLA_U16, 1), 9626 [NL80211_MESHCONF_GATE_ANNOUNCEMENTS] = NLA_POLICY_MAX(NLA_U8, 1), 9627 [NL80211_MESHCONF_FORWARDING] = NLA_POLICY_MAX(NLA_U8, 1), 9628 [NL80211_MESHCONF_RSSI_THRESHOLD] = 9629 NLA_POLICY_RANGE(NLA_S32, -255, 0), 9630 [NL80211_MESHCONF_HT_OPMODE] = { .type = NLA_U16 }, 9631 [NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT] = { .type = NLA_U32 }, 9632 [NL80211_MESHCONF_HWMP_ROOT_INTERVAL] = 9633 NLA_POLICY_MIN(NLA_U16, 1), 9634 [NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL] = 9635 NLA_POLICY_MIN(NLA_U16, 1), 9636 [NL80211_MESHCONF_POWER_MODE] = 9637 NLA_POLICY_RANGE(NLA_U32, 9638 NL80211_MESH_POWER_ACTIVE, 9639 NL80211_MESH_POWER_MAX), 9640 [NL80211_MESHCONF_AWAKE_WINDOW] = { .type = NLA_U16 }, 9641 [NL80211_MESHCONF_PLINK_TIMEOUT] = { .type = NLA_U32 }, 9642 [NL80211_MESHCONF_CONNECTED_TO_GATE] = NLA_POLICY_RANGE(NLA_U8, 0, 1), 9643 [NL80211_MESHCONF_NOLEARN] = NLA_POLICY_RANGE(NLA_U8, 0, 1), 9644 [NL80211_MESHCONF_CONNECTED_TO_AS] = NLA_POLICY_RANGE(NLA_U8, 0, 1), 9645 }; 9646 9647 static const struct nla_policy 9648 nl80211_mesh_setup_params_policy[NL80211_MESH_SETUP_ATTR_MAX+1] = { 9649 [NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC] = { .type = NLA_U8 }, 9650 [NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL] = { .type = NLA_U8 }, 9651 [NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC] = { .type = NLA_U8 }, 9652 [NL80211_MESH_SETUP_USERSPACE_AUTH] = { .type = NLA_FLAG }, 9653 [NL80211_MESH_SETUP_AUTH_PROTOCOL] = { .type = NLA_U8 }, 9654 [NL80211_MESH_SETUP_USERSPACE_MPM] = { .type = NLA_FLAG }, 9655 [NL80211_MESH_SETUP_IE] = 9656 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_ie_attr, 9657 IEEE80211_MAX_DATA_LEN), 9658 [NL80211_MESH_SETUP_USERSPACE_AMPE] = { .type = NLA_FLAG }, 9659 }; 9660 9661 static int nl80211_parse_mesh_config(struct genl_info *info, 9662 struct mesh_config *cfg, 9663 u32 *mask_out) 9664 { 9665 struct nlattr *tb[NL80211_MESHCONF_ATTR_MAX + 1]; 9666 u32 mask = 0; 9667 u16 ht_opmode; 9668 9669 #define FILL_IN_MESH_PARAM_IF_SET(tb, cfg, param, mask, attr, fn) \ 9670 do { \ 9671 if (tb[attr]) { \ 9672 cfg->param = fn(tb[attr]); \ 9673 mask |= BIT((attr) - 1); \ 9674 } \ 9675 } while (0) 9676 9677 if (!info->attrs[NL80211_ATTR_MESH_CONFIG]) 9678 return -EINVAL; 9679 if (nla_parse_nested_deprecated(tb, NL80211_MESHCONF_ATTR_MAX, info->attrs[NL80211_ATTR_MESH_CONFIG], nl80211_meshconf_params_policy, info->extack)) 9680 return -EINVAL; 9681 9682 /* This makes sure that there aren't more than 32 mesh config 9683 * parameters (otherwise our bitfield scheme would not work.) */ 9684 BUILD_BUG_ON(NL80211_MESHCONF_ATTR_MAX > 32); 9685 9686 /* Fill in the params struct */ 9687 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshRetryTimeout, mask, 9688 NL80211_MESHCONF_RETRY_TIMEOUT, nla_get_u16); 9689 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshConfirmTimeout, mask, 9690 NL80211_MESHCONF_CONFIRM_TIMEOUT, 9691 nla_get_u16); 9692 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHoldingTimeout, mask, 9693 NL80211_MESHCONF_HOLDING_TIMEOUT, 9694 nla_get_u16); 9695 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshMaxPeerLinks, mask, 9696 NL80211_MESHCONF_MAX_PEER_LINKS, 9697 nla_get_u16); 9698 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshMaxRetries, mask, 9699 NL80211_MESHCONF_MAX_RETRIES, nla_get_u8); 9700 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshTTL, mask, 9701 NL80211_MESHCONF_TTL, nla_get_u8); 9702 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, element_ttl, mask, 9703 NL80211_MESHCONF_ELEMENT_TTL, nla_get_u8); 9704 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, auto_open_plinks, mask, 9705 NL80211_MESHCONF_AUTO_OPEN_PLINKS, 9706 nla_get_u8); 9707 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshNbrOffsetMaxNeighbor, 9708 mask, 9709 NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR, 9710 nla_get_u32); 9711 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPmaxPREQretries, mask, 9712 NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES, 9713 nla_get_u8); 9714 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, path_refresh_time, mask, 9715 NL80211_MESHCONF_PATH_REFRESH_TIME, 9716 nla_get_u32); 9717 if (mask & BIT(NL80211_MESHCONF_PATH_REFRESH_TIME) && 9718 (cfg->path_refresh_time < 1 || cfg->path_refresh_time > 65535)) 9719 return -EINVAL; 9720 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, min_discovery_timeout, mask, 9721 NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT, 9722 nla_get_u16); 9723 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPactivePathTimeout, 9724 mask, 9725 NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT, 9726 nla_get_u32); 9727 if (mask & BIT(NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT) && 9728 (cfg->dot11MeshHWMPactivePathTimeout < 1 || 9729 cfg->dot11MeshHWMPactivePathTimeout > 65535)) 9730 return -EINVAL; 9731 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPpreqMinInterval, mask, 9732 NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL, 9733 nla_get_u16); 9734 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPperrMinInterval, mask, 9735 NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL, 9736 nla_get_u16); 9737 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, 9738 dot11MeshHWMPnetDiameterTraversalTime, mask, 9739 NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME, 9740 nla_get_u16); 9741 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPRootMode, mask, 9742 NL80211_MESHCONF_HWMP_ROOTMODE, nla_get_u8); 9743 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPRannInterval, mask, 9744 NL80211_MESHCONF_HWMP_RANN_INTERVAL, 9745 nla_get_u16); 9746 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshGateAnnouncementProtocol, 9747 mask, NL80211_MESHCONF_GATE_ANNOUNCEMENTS, 9748 nla_get_u8); 9749 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshForwarding, mask, 9750 NL80211_MESHCONF_FORWARDING, nla_get_u8); 9751 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, rssi_threshold, mask, 9752 NL80211_MESHCONF_RSSI_THRESHOLD, 9753 nla_get_s32); 9754 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshConnectedToMeshGate, mask, 9755 NL80211_MESHCONF_CONNECTED_TO_GATE, 9756 nla_get_u8); 9757 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshConnectedToAuthServer, mask, 9758 NL80211_MESHCONF_CONNECTED_TO_AS, 9759 nla_get_u8); 9760 /* 9761 * Check HT operation mode based on 9762 * IEEE 802.11-2016 9.4.2.57 HT Operation element. 9763 */ 9764 if (tb[NL80211_MESHCONF_HT_OPMODE]) { 9765 ht_opmode = nla_get_u16(tb[NL80211_MESHCONF_HT_OPMODE]); 9766 9767 if (ht_opmode & ~(IEEE80211_HT_OP_MODE_PROTECTION | 9768 IEEE80211_HT_OP_MODE_NON_GF_STA_PRSNT | 9769 IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT)) 9770 return -EINVAL; 9771 9772 /* NON_HT_STA bit is reserved, but some programs set it */ 9773 ht_opmode &= ~IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT; 9774 9775 cfg->ht_opmode = ht_opmode; 9776 mask |= (1 << (NL80211_MESHCONF_HT_OPMODE - 1)); 9777 } 9778 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, 9779 dot11MeshHWMPactivePathToRootTimeout, mask, 9780 NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT, 9781 nla_get_u32); 9782 if (mask & BIT(NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT) && 9783 (cfg->dot11MeshHWMPactivePathToRootTimeout < 1 || 9784 cfg->dot11MeshHWMPactivePathToRootTimeout > 65535)) 9785 return -EINVAL; 9786 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMProotInterval, mask, 9787 NL80211_MESHCONF_HWMP_ROOT_INTERVAL, 9788 nla_get_u16); 9789 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPconfirmationInterval, 9790 mask, 9791 NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL, 9792 nla_get_u16); 9793 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, power_mode, mask, 9794 NL80211_MESHCONF_POWER_MODE, nla_get_u32); 9795 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshAwakeWindowDuration, mask, 9796 NL80211_MESHCONF_AWAKE_WINDOW, nla_get_u16); 9797 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, plink_timeout, mask, 9798 NL80211_MESHCONF_PLINK_TIMEOUT, nla_get_u32); 9799 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshNolearn, mask, 9800 NL80211_MESHCONF_NOLEARN, nla_get_u8); 9801 if (mask_out) 9802 *mask_out = mask; 9803 9804 return 0; 9805 9806 #undef FILL_IN_MESH_PARAM_IF_SET 9807 } 9808 9809 static int nl80211_parse_mesh_setup(struct genl_info *info, 9810 struct mesh_setup *setup) 9811 { 9812 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9813 struct nlattr *tb[NL80211_MESH_SETUP_ATTR_MAX + 1]; 9814 9815 if (!info->attrs[NL80211_ATTR_MESH_SETUP]) 9816 return -EINVAL; 9817 if (nla_parse_nested_deprecated(tb, NL80211_MESH_SETUP_ATTR_MAX, info->attrs[NL80211_ATTR_MESH_SETUP], nl80211_mesh_setup_params_policy, info->extack)) 9818 return -EINVAL; 9819 9820 if (tb[NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC]) 9821 setup->sync_method = 9822 (nla_get_u8(tb[NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC])) ? 9823 IEEE80211_SYNC_METHOD_VENDOR : 9824 IEEE80211_SYNC_METHOD_NEIGHBOR_OFFSET; 9825 9826 if (tb[NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL]) 9827 setup->path_sel_proto = 9828 (nla_get_u8(tb[NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL])) ? 9829 IEEE80211_PATH_PROTOCOL_VENDOR : 9830 IEEE80211_PATH_PROTOCOL_HWMP; 9831 9832 if (tb[NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC]) 9833 setup->path_metric = 9834 (nla_get_u8(tb[NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC])) ? 9835 IEEE80211_PATH_METRIC_VENDOR : 9836 IEEE80211_PATH_METRIC_AIRTIME; 9837 9838 if (tb[NL80211_MESH_SETUP_IE]) { 9839 struct nlattr *ieattr = 9840 tb[NL80211_MESH_SETUP_IE]; 9841 setup->ie = nla_data(ieattr); 9842 setup->ie_len = nla_len(ieattr); 9843 } 9844 if (tb[NL80211_MESH_SETUP_USERSPACE_MPM] && 9845 !(rdev->wiphy.features & NL80211_FEATURE_USERSPACE_MPM)) 9846 return -EINVAL; 9847 setup->user_mpm = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_MPM]); 9848 setup->is_authenticated = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_AUTH]); 9849 setup->is_secure = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_AMPE]); 9850 if (setup->is_secure) 9851 setup->user_mpm = true; 9852 9853 if (tb[NL80211_MESH_SETUP_AUTH_PROTOCOL]) { 9854 if (!setup->user_mpm) 9855 return -EINVAL; 9856 setup->auth_id = 9857 nla_get_u8(tb[NL80211_MESH_SETUP_AUTH_PROTOCOL]); 9858 } 9859 9860 return 0; 9861 } 9862 9863 static int nl80211_update_mesh_config(struct sk_buff *skb, 9864 struct genl_info *info) 9865 { 9866 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9867 struct net_device *dev = info->user_ptr[1]; 9868 struct wireless_dev *wdev = dev->ieee80211_ptr; 9869 struct mesh_config cfg = {}; 9870 u32 mask; 9871 int err; 9872 9873 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) 9874 return -EOPNOTSUPP; 9875 9876 if (!rdev->ops->update_mesh_config) 9877 return -EOPNOTSUPP; 9878 9879 err = nl80211_parse_mesh_config(info, &cfg, &mask); 9880 if (err) 9881 return err; 9882 9883 if (!wdev->u.mesh.id_len) 9884 err = -ENOLINK; 9885 9886 if (!err) 9887 err = rdev_update_mesh_config(rdev, dev, mask, &cfg); 9888 9889 return err; 9890 } 9891 9892 static int nl80211_put_regdom(const struct ieee80211_regdomain *regdom, 9893 struct sk_buff *msg) 9894 { 9895 struct nlattr *nl_reg_rules; 9896 unsigned int i; 9897 9898 if (nla_put_string(msg, NL80211_ATTR_REG_ALPHA2, regdom->alpha2) || 9899 (regdom->dfs_region && 9900 nla_put_u8(msg, NL80211_ATTR_DFS_REGION, regdom->dfs_region))) 9901 goto nla_put_failure; 9902 9903 nl_reg_rules = nla_nest_start_noflag(msg, NL80211_ATTR_REG_RULES); 9904 if (!nl_reg_rules) 9905 goto nla_put_failure; 9906 9907 for (i = 0; i < regdom->n_reg_rules; i++) { 9908 struct nlattr *nl_reg_rule; 9909 const struct ieee80211_reg_rule *reg_rule; 9910 const struct ieee80211_freq_range *freq_range; 9911 const struct ieee80211_power_rule *power_rule; 9912 unsigned int max_bandwidth_khz; 9913 9914 reg_rule = ®dom->reg_rules[i]; 9915 freq_range = ®_rule->freq_range; 9916 power_rule = ®_rule->power_rule; 9917 9918 nl_reg_rule = nla_nest_start_noflag(msg, i); 9919 if (!nl_reg_rule) 9920 goto nla_put_failure; 9921 9922 max_bandwidth_khz = freq_range->max_bandwidth_khz; 9923 if (!max_bandwidth_khz) 9924 max_bandwidth_khz = reg_get_max_bandwidth(regdom, 9925 reg_rule); 9926 9927 if (nla_put_u32(msg, NL80211_ATTR_REG_RULE_FLAGS, 9928 reg_rule->flags) || 9929 nla_put_u32(msg, NL80211_ATTR_FREQ_RANGE_START, 9930 freq_range->start_freq_khz) || 9931 nla_put_u32(msg, NL80211_ATTR_FREQ_RANGE_END, 9932 freq_range->end_freq_khz) || 9933 nla_put_u32(msg, NL80211_ATTR_FREQ_RANGE_MAX_BW, 9934 max_bandwidth_khz) || 9935 nla_put_u32(msg, NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN, 9936 power_rule->max_antenna_gain) || 9937 nla_put_u32(msg, NL80211_ATTR_POWER_RULE_MAX_EIRP, 9938 power_rule->max_eirp) || 9939 nla_put_u32(msg, NL80211_ATTR_DFS_CAC_TIME, 9940 reg_rule->dfs_cac_ms)) 9941 goto nla_put_failure; 9942 9943 if ((reg_rule->flags & NL80211_RRF_PSD) && 9944 nla_put_s8(msg, NL80211_ATTR_POWER_RULE_PSD, 9945 reg_rule->psd)) 9946 goto nla_put_failure; 9947 9948 nla_nest_end(msg, nl_reg_rule); 9949 } 9950 9951 nla_nest_end(msg, nl_reg_rules); 9952 return 0; 9953 9954 nla_put_failure: 9955 return -EMSGSIZE; 9956 } 9957 9958 static int nl80211_get_reg_do(struct sk_buff *skb, struct genl_info *info) 9959 { 9960 const struct ieee80211_regdomain *regdom = NULL; 9961 struct cfg80211_registered_device *rdev; 9962 struct wiphy *wiphy = NULL; 9963 struct sk_buff *msg; 9964 int err = -EMSGSIZE; 9965 void *hdr; 9966 9967 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 9968 if (!msg) 9969 return -ENOBUFS; 9970 9971 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 9972 NL80211_CMD_GET_REG); 9973 if (!hdr) 9974 goto put_failure; 9975 9976 rtnl_lock(); 9977 9978 if (info->attrs[NL80211_ATTR_WIPHY]) { 9979 bool self_managed; 9980 9981 rdev = cfg80211_get_dev_from_info(genl_info_net(info), info); 9982 if (IS_ERR(rdev)) { 9983 err = PTR_ERR(rdev); 9984 goto nla_put_failure; 9985 } 9986 9987 wiphy = &rdev->wiphy; 9988 self_managed = wiphy->regulatory_flags & 9989 REGULATORY_WIPHY_SELF_MANAGED; 9990 9991 rcu_read_lock(); 9992 9993 regdom = get_wiphy_regdom(wiphy); 9994 9995 /* a self-managed-reg device must have a private regdom */ 9996 if (WARN_ON(!regdom && self_managed)) { 9997 err = -EINVAL; 9998 goto nla_put_failure_rcu; 9999 } 10000 10001 if (regdom && 10002 nla_put_u32(msg, NL80211_ATTR_WIPHY, get_wiphy_idx(wiphy))) 10003 goto nla_put_failure_rcu; 10004 } else { 10005 rcu_read_lock(); 10006 } 10007 10008 if (!wiphy && reg_last_request_cell_base() && 10009 nla_put_u32(msg, NL80211_ATTR_USER_REG_HINT_TYPE, 10010 NL80211_USER_REG_HINT_CELL_BASE)) 10011 goto nla_put_failure_rcu; 10012 10013 if (!regdom) 10014 regdom = rcu_dereference(cfg80211_regdomain); 10015 10016 if (nl80211_put_regdom(regdom, msg)) 10017 goto nla_put_failure_rcu; 10018 10019 rcu_read_unlock(); 10020 10021 genlmsg_end(msg, hdr); 10022 rtnl_unlock(); 10023 return genlmsg_reply(msg, info); 10024 10025 nla_put_failure_rcu: 10026 rcu_read_unlock(); 10027 nla_put_failure: 10028 rtnl_unlock(); 10029 put_failure: 10030 nlmsg_free(msg); 10031 return err; 10032 } 10033 10034 static int nl80211_send_regdom(struct sk_buff *msg, struct netlink_callback *cb, 10035 u32 seq, int flags, struct wiphy *wiphy, 10036 const struct ieee80211_regdomain *regdom) 10037 { 10038 void *hdr = nl80211hdr_put(msg, NETLINK_CB(cb->skb).portid, seq, flags, 10039 NL80211_CMD_GET_REG); 10040 10041 if (!hdr) 10042 return -1; 10043 10044 genl_dump_check_consistent(cb, hdr); 10045 10046 if (nl80211_put_regdom(regdom, msg)) 10047 goto nla_put_failure; 10048 10049 if (!wiphy && reg_last_request_cell_base() && 10050 nla_put_u32(msg, NL80211_ATTR_USER_REG_HINT_TYPE, 10051 NL80211_USER_REG_HINT_CELL_BASE)) 10052 goto nla_put_failure; 10053 10054 if (wiphy && 10055 nla_put_u32(msg, NL80211_ATTR_WIPHY, get_wiphy_idx(wiphy))) 10056 goto nla_put_failure; 10057 10058 if (wiphy && wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED && 10059 nla_put_flag(msg, NL80211_ATTR_WIPHY_SELF_MANAGED_REG)) 10060 goto nla_put_failure; 10061 10062 genlmsg_end(msg, hdr); 10063 return 0; 10064 10065 nla_put_failure: 10066 genlmsg_cancel(msg, hdr); 10067 return -EMSGSIZE; 10068 } 10069 10070 static int nl80211_get_reg_dump(struct sk_buff *skb, 10071 struct netlink_callback *cb) 10072 { 10073 const struct ieee80211_regdomain *regdom = NULL; 10074 struct cfg80211_registered_device *rdev; 10075 int err, reg_idx, start = cb->args[2]; 10076 10077 rcu_read_lock(); 10078 10079 if (cfg80211_regdomain && start == 0) { 10080 err = nl80211_send_regdom(skb, cb, cb->nlh->nlmsg_seq, 10081 NLM_F_MULTI, NULL, 10082 rcu_dereference(cfg80211_regdomain)); 10083 if (err < 0) 10084 goto out_err; 10085 } 10086 10087 /* the global regdom is idx 0 */ 10088 reg_idx = 1; 10089 list_for_each_entry_rcu(rdev, &cfg80211_rdev_list, list) { 10090 regdom = get_wiphy_regdom(&rdev->wiphy); 10091 if (!regdom) 10092 continue; 10093 10094 if (++reg_idx <= start) 10095 continue; 10096 10097 err = nl80211_send_regdom(skb, cb, cb->nlh->nlmsg_seq, 10098 NLM_F_MULTI, &rdev->wiphy, regdom); 10099 if (err < 0) { 10100 reg_idx--; 10101 break; 10102 } 10103 } 10104 10105 cb->args[2] = reg_idx; 10106 err = skb->len; 10107 out_err: 10108 rcu_read_unlock(); 10109 return err; 10110 } 10111 10112 #ifdef CONFIG_CFG80211_CRDA_SUPPORT 10113 static const struct nla_policy reg_rule_policy[NL80211_REG_RULE_ATTR_MAX + 1] = { 10114 [NL80211_ATTR_REG_RULE_FLAGS] = { .type = NLA_U32 }, 10115 [NL80211_ATTR_FREQ_RANGE_START] = { .type = NLA_U32 }, 10116 [NL80211_ATTR_FREQ_RANGE_END] = { .type = NLA_U32 }, 10117 [NL80211_ATTR_FREQ_RANGE_MAX_BW] = { .type = NLA_U32 }, 10118 [NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN] = { .type = NLA_U32 }, 10119 [NL80211_ATTR_POWER_RULE_MAX_EIRP] = { .type = NLA_U32 }, 10120 [NL80211_ATTR_DFS_CAC_TIME] = { .type = NLA_U32 }, 10121 }; 10122 10123 static int parse_reg_rule(struct nlattr *tb[], 10124 struct ieee80211_reg_rule *reg_rule) 10125 { 10126 struct ieee80211_freq_range *freq_range = ®_rule->freq_range; 10127 struct ieee80211_power_rule *power_rule = ®_rule->power_rule; 10128 10129 if (!tb[NL80211_ATTR_REG_RULE_FLAGS]) 10130 return -EINVAL; 10131 if (!tb[NL80211_ATTR_FREQ_RANGE_START]) 10132 return -EINVAL; 10133 if (!tb[NL80211_ATTR_FREQ_RANGE_END]) 10134 return -EINVAL; 10135 if (!tb[NL80211_ATTR_FREQ_RANGE_MAX_BW]) 10136 return -EINVAL; 10137 if (!tb[NL80211_ATTR_POWER_RULE_MAX_EIRP]) 10138 return -EINVAL; 10139 10140 reg_rule->flags = nla_get_u32(tb[NL80211_ATTR_REG_RULE_FLAGS]); 10141 10142 freq_range->start_freq_khz = 10143 nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_START]); 10144 freq_range->end_freq_khz = 10145 nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_END]); 10146 freq_range->max_bandwidth_khz = 10147 nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_MAX_BW]); 10148 10149 power_rule->max_eirp = 10150 nla_get_u32(tb[NL80211_ATTR_POWER_RULE_MAX_EIRP]); 10151 10152 if (tb[NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN]) 10153 power_rule->max_antenna_gain = 10154 nla_get_u32(tb[NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN]); 10155 10156 if (tb[NL80211_ATTR_DFS_CAC_TIME]) 10157 reg_rule->dfs_cac_ms = 10158 nla_get_u32(tb[NL80211_ATTR_DFS_CAC_TIME]); 10159 10160 return 0; 10161 } 10162 10163 static int nl80211_set_reg(struct sk_buff *skb, struct genl_info *info) 10164 { 10165 struct nlattr *tb[NL80211_REG_RULE_ATTR_MAX + 1]; 10166 struct nlattr *nl_reg_rule; 10167 char *alpha2; 10168 int rem_reg_rules, r; 10169 u32 num_rules = 0, rule_idx = 0; 10170 enum nl80211_dfs_regions dfs_region = NL80211_DFS_UNSET; 10171 struct ieee80211_regdomain *rd; 10172 10173 if (!info->attrs[NL80211_ATTR_REG_ALPHA2]) 10174 return -EINVAL; 10175 10176 if (!info->attrs[NL80211_ATTR_REG_RULES]) 10177 return -EINVAL; 10178 10179 alpha2 = nla_data(info->attrs[NL80211_ATTR_REG_ALPHA2]); 10180 10181 if (info->attrs[NL80211_ATTR_DFS_REGION]) 10182 dfs_region = nla_get_u8(info->attrs[NL80211_ATTR_DFS_REGION]); 10183 10184 nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES], 10185 rem_reg_rules) { 10186 num_rules++; 10187 if (num_rules > NL80211_MAX_SUPP_REG_RULES) 10188 return -EINVAL; 10189 } 10190 10191 rtnl_lock(); 10192 if (!reg_is_valid_request(alpha2)) { 10193 r = -EINVAL; 10194 goto out; 10195 } 10196 10197 rd = kzalloc_flex(*rd, reg_rules, num_rules); 10198 if (!rd) { 10199 r = -ENOMEM; 10200 goto out; 10201 } 10202 10203 rd->n_reg_rules = num_rules; 10204 rd->alpha2[0] = alpha2[0]; 10205 rd->alpha2[1] = alpha2[1]; 10206 10207 /* 10208 * Disable DFS master mode if the DFS region was 10209 * not supported or known on this kernel. 10210 */ 10211 if (reg_supported_dfs_region(dfs_region)) 10212 rd->dfs_region = dfs_region; 10213 10214 nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES], 10215 rem_reg_rules) { 10216 r = nla_parse_nested_deprecated(tb, NL80211_REG_RULE_ATTR_MAX, 10217 nl_reg_rule, reg_rule_policy, 10218 info->extack); 10219 if (r) 10220 goto bad_reg; 10221 r = parse_reg_rule(tb, &rd->reg_rules[rule_idx]); 10222 if (r) 10223 goto bad_reg; 10224 10225 rule_idx++; 10226 10227 if (rule_idx > NL80211_MAX_SUPP_REG_RULES) { 10228 r = -EINVAL; 10229 goto bad_reg; 10230 } 10231 } 10232 10233 r = set_regdom(rd, REGD_SOURCE_CRDA); 10234 /* set_regdom takes ownership of rd */ 10235 rd = NULL; 10236 bad_reg: 10237 kfree(rd); 10238 out: 10239 rtnl_unlock(); 10240 return r; 10241 } 10242 #endif /* CONFIG_CFG80211_CRDA_SUPPORT */ 10243 10244 static int validate_scan_freqs(struct nlattr *freqs) 10245 { 10246 struct nlattr *attr1, *attr2; 10247 int n_channels = 0, tmp1, tmp2; 10248 10249 nla_for_each_nested(attr1, freqs, tmp1) 10250 if (nla_len(attr1) != sizeof(u32)) 10251 return 0; 10252 10253 nla_for_each_nested(attr1, freqs, tmp1) { 10254 n_channels++; 10255 /* 10256 * Some hardware has a limited channel list for 10257 * scanning, and it is pretty much nonsensical 10258 * to scan for a channel twice, so disallow that 10259 * and don't require drivers to check that the 10260 * channel list they get isn't longer than what 10261 * they can scan, as long as they can scan all 10262 * the channels they registered at once. 10263 */ 10264 nla_for_each_nested(attr2, freqs, tmp2) 10265 if (attr1 != attr2 && 10266 nla_get_u32(attr1) == nla_get_u32(attr2)) 10267 return 0; 10268 } 10269 10270 return n_channels; 10271 } 10272 10273 static bool is_band_valid(struct wiphy *wiphy, enum nl80211_band b) 10274 { 10275 return b < NUM_NL80211_BANDS && wiphy->bands[b]; 10276 } 10277 10278 static int parse_bss_select(struct nlattr *nla, struct wiphy *wiphy, 10279 struct cfg80211_bss_selection *bss_select) 10280 { 10281 struct nlattr *attr[NL80211_BSS_SELECT_ATTR_MAX + 1]; 10282 struct nlattr *nest; 10283 int err; 10284 bool found = false; 10285 int i; 10286 10287 /* only process one nested attribute */ 10288 nest = nla_data(nla); 10289 if (!nla_ok(nest, nla_len(nest))) 10290 return -EINVAL; 10291 10292 err = nla_parse_nested_deprecated(attr, NL80211_BSS_SELECT_ATTR_MAX, 10293 nest, nl80211_bss_select_policy, 10294 NULL); 10295 if (err) 10296 return err; 10297 10298 /* only one attribute may be given */ 10299 for (i = 0; i <= NL80211_BSS_SELECT_ATTR_MAX; i++) { 10300 if (attr[i]) { 10301 if (found) 10302 return -EINVAL; 10303 found = true; 10304 } 10305 } 10306 10307 bss_select->behaviour = __NL80211_BSS_SELECT_ATTR_INVALID; 10308 10309 if (attr[NL80211_BSS_SELECT_ATTR_RSSI]) 10310 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_RSSI; 10311 10312 if (attr[NL80211_BSS_SELECT_ATTR_BAND_PREF]) { 10313 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_BAND_PREF; 10314 bss_select->param.band_pref = 10315 nla_get_u32(attr[NL80211_BSS_SELECT_ATTR_BAND_PREF]); 10316 if (!is_band_valid(wiphy, bss_select->param.band_pref)) 10317 return -EINVAL; 10318 } 10319 10320 if (attr[NL80211_BSS_SELECT_ATTR_RSSI_ADJUST]) { 10321 struct nl80211_bss_select_rssi_adjust *adj_param; 10322 10323 adj_param = nla_data(attr[NL80211_BSS_SELECT_ATTR_RSSI_ADJUST]); 10324 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_RSSI_ADJUST; 10325 bss_select->param.adjust.band = adj_param->band; 10326 bss_select->param.adjust.delta = adj_param->delta; 10327 if (!is_band_valid(wiphy, bss_select->param.adjust.band)) 10328 return -EINVAL; 10329 } 10330 10331 /* user-space did not provide behaviour attribute */ 10332 if (bss_select->behaviour == __NL80211_BSS_SELECT_ATTR_INVALID) 10333 return -EINVAL; 10334 10335 if (!(wiphy->bss_select_support & BIT(bss_select->behaviour))) 10336 return -EINVAL; 10337 10338 return 0; 10339 } 10340 10341 int nl80211_parse_random_mac(struct nlattr **attrs, 10342 u8 *mac_addr, u8 *mac_addr_mask) 10343 { 10344 int i; 10345 10346 if (!attrs[NL80211_ATTR_MAC] && !attrs[NL80211_ATTR_MAC_MASK]) { 10347 eth_zero_addr(mac_addr); 10348 eth_zero_addr(mac_addr_mask); 10349 mac_addr[0] = 0x2; 10350 mac_addr_mask[0] = 0x3; 10351 10352 return 0; 10353 } 10354 10355 /* need both or none */ 10356 if (!attrs[NL80211_ATTR_MAC] || !attrs[NL80211_ATTR_MAC_MASK]) 10357 return -EINVAL; 10358 10359 memcpy(mac_addr, nla_data(attrs[NL80211_ATTR_MAC]), ETH_ALEN); 10360 memcpy(mac_addr_mask, nla_data(attrs[NL80211_ATTR_MAC_MASK]), ETH_ALEN); 10361 10362 /* don't allow or configure an mcast address */ 10363 if (!is_multicast_ether_addr(mac_addr_mask) || 10364 is_multicast_ether_addr(mac_addr)) 10365 return -EINVAL; 10366 10367 /* 10368 * allow users to pass a MAC address that has bits set outside 10369 * of the mask, but don't bother drivers with having to deal 10370 * with such bits 10371 */ 10372 for (i = 0; i < ETH_ALEN; i++) 10373 mac_addr[i] &= mac_addr_mask[i]; 10374 10375 return 0; 10376 } 10377 10378 static bool cfg80211_off_channel_oper_allowed(struct wireless_dev *wdev, 10379 struct ieee80211_channel *chan) 10380 { 10381 unsigned int link_id; 10382 bool all_ok = true; 10383 int radio_idx; 10384 10385 lockdep_assert_wiphy(wdev->wiphy); 10386 10387 if (!cfg80211_wdev_channel_allowed(wdev, chan)) 10388 return false; 10389 10390 if (!cfg80211_beaconing_iface_active(wdev)) 10391 return true; 10392 10393 radio_idx = cfg80211_get_radio_idx_by_chan(wdev->wiphy, chan); 10394 10395 /* 10396 * FIXME: check if we have a free radio/link for chan 10397 * 10398 * This, as well as the FIXME below, requires knowing the link 10399 * capabilities of the hardware. 10400 */ 10401 10402 /* we cannot leave radar channels */ 10403 for_each_valid_link(wdev, link_id) { 10404 struct cfg80211_chan_def *chandef; 10405 int link_radio_idx; 10406 10407 chandef = wdev_chandef(wdev, link_id); 10408 if (!chandef || !chandef->chan) 10409 continue; 10410 10411 if (!(chandef->chan->flags & IEEE80211_CHAN_RADAR)) 10412 continue; 10413 10414 /* 10415 * chandef->chan is a radar channel. If the radio/link onto 10416 * which this radar channel falls is the same radio/link onto 10417 * which the input 'chan' falls, off-channel operation should 10418 * not be allowed. Hence, set 'all_ok' to false. 10419 */ 10420 10421 link_radio_idx = cfg80211_get_radio_idx_by_chan(wdev->wiphy, 10422 chandef->chan); 10423 if (link_radio_idx == radio_idx) { 10424 all_ok = false; 10425 break; 10426 } 10427 } 10428 10429 if (all_ok) 10430 return true; 10431 10432 return regulatory_pre_cac_allowed(wdev->wiphy); 10433 } 10434 10435 static bool nl80211_check_scan_feat(struct wiphy *wiphy, u32 flags, u32 flag, 10436 enum nl80211_ext_feature_index feat) 10437 { 10438 if (!(flags & flag)) 10439 return true; 10440 if (wiphy_ext_feature_isset(wiphy, feat)) 10441 return true; 10442 return false; 10443 } 10444 10445 static int 10446 nl80211_check_scan_flags(struct wiphy *wiphy, struct wireless_dev *wdev, 10447 struct nlattr **attrs, u8 *mac_addr, u8 *mac_addr_mask, 10448 u32 *flags, enum nl80211_feature_flags randomness_flag) 10449 { 10450 if (!attrs[NL80211_ATTR_SCAN_FLAGS]) 10451 return 0; 10452 10453 *flags = nla_get_u32(attrs[NL80211_ATTR_SCAN_FLAGS]); 10454 10455 if (((*flags & NL80211_SCAN_FLAG_LOW_PRIORITY) && 10456 !(wiphy->features & NL80211_FEATURE_LOW_PRIORITY_SCAN)) || 10457 !nl80211_check_scan_feat(wiphy, *flags, 10458 NL80211_SCAN_FLAG_LOW_SPAN, 10459 NL80211_EXT_FEATURE_LOW_SPAN_SCAN) || 10460 !nl80211_check_scan_feat(wiphy, *flags, 10461 NL80211_SCAN_FLAG_LOW_POWER, 10462 NL80211_EXT_FEATURE_LOW_POWER_SCAN) || 10463 !nl80211_check_scan_feat(wiphy, *flags, 10464 NL80211_SCAN_FLAG_HIGH_ACCURACY, 10465 NL80211_EXT_FEATURE_HIGH_ACCURACY_SCAN) || 10466 !nl80211_check_scan_feat(wiphy, *flags, 10467 NL80211_SCAN_FLAG_FILS_MAX_CHANNEL_TIME, 10468 NL80211_EXT_FEATURE_FILS_MAX_CHANNEL_TIME) || 10469 !nl80211_check_scan_feat(wiphy, *flags, 10470 NL80211_SCAN_FLAG_ACCEPT_BCAST_PROBE_RESP, 10471 NL80211_EXT_FEATURE_ACCEPT_BCAST_PROBE_RESP) || 10472 !nl80211_check_scan_feat(wiphy, *flags, 10473 NL80211_SCAN_FLAG_OCE_PROBE_REQ_DEFERRAL_SUPPRESSION, 10474 NL80211_EXT_FEATURE_OCE_PROBE_REQ_DEFERRAL_SUPPRESSION) || 10475 !nl80211_check_scan_feat(wiphy, *flags, 10476 NL80211_SCAN_FLAG_OCE_PROBE_REQ_HIGH_TX_RATE, 10477 NL80211_EXT_FEATURE_OCE_PROBE_REQ_HIGH_TX_RATE) || 10478 !nl80211_check_scan_feat(wiphy, *flags, 10479 NL80211_SCAN_FLAG_RANDOM_SN, 10480 NL80211_EXT_FEATURE_SCAN_RANDOM_SN) || 10481 !nl80211_check_scan_feat(wiphy, *flags, 10482 NL80211_SCAN_FLAG_MIN_PREQ_CONTENT, 10483 NL80211_EXT_FEATURE_SCAN_MIN_PREQ_CONTENT)) 10484 return -EOPNOTSUPP; 10485 10486 if (*flags & NL80211_SCAN_FLAG_RANDOM_ADDR) { 10487 int err; 10488 10489 if (!(wiphy->features & randomness_flag) || 10490 (wdev && wdev->connected)) 10491 return -EOPNOTSUPP; 10492 10493 err = nl80211_parse_random_mac(attrs, mac_addr, mac_addr_mask); 10494 if (err) 10495 return err; 10496 } 10497 10498 return 0; 10499 } 10500 10501 static int 10502 nl80211_check_scan_flags_sched(struct wiphy *wiphy, struct wireless_dev *wdev, 10503 struct nlattr **attrs, 10504 struct cfg80211_sched_scan_request *req) 10505 { 10506 return nl80211_check_scan_flags(wiphy, wdev, attrs, 10507 req->mac_addr, req->mac_addr_mask, 10508 &req->flags, 10509 wdev ? NL80211_FEATURE_SCHED_SCAN_RANDOM_MAC_ADDR : 10510 NL80211_FEATURE_ND_RANDOM_MAC_ADDR); 10511 } 10512 10513 static int 10514 nl80211_check_scan_flags_reg(struct wiphy *wiphy, struct wireless_dev *wdev, 10515 struct nlattr **attrs, 10516 struct cfg80211_scan_request_int *req) 10517 { 10518 return nl80211_check_scan_flags(wiphy, wdev, attrs, 10519 req->req.mac_addr, 10520 req->req.mac_addr_mask, 10521 &req->req.flags, 10522 NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR); 10523 } 10524 10525 static int nl80211_trigger_scan(struct sk_buff *skb, struct genl_info *info) 10526 { 10527 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 10528 struct wireless_dev *wdev = info->user_ptr[1]; 10529 struct cfg80211_scan_request_int *request; 10530 struct nlattr *scan_freqs = NULL; 10531 bool scan_freqs_khz = false; 10532 struct nlattr *attr; 10533 struct wiphy *wiphy; 10534 int err, tmp, n_ssids = 0, n_channels, i; 10535 size_t ie_len, size; 10536 size_t ssids_offset, ie_offset; 10537 10538 wiphy = &rdev->wiphy; 10539 10540 if (wdev->iftype == NL80211_IFTYPE_NAN) 10541 return -EOPNOTSUPP; 10542 10543 if (!rdev->ops->scan) 10544 return -EOPNOTSUPP; 10545 10546 if (rdev->scan_req || rdev->scan_msg) 10547 return -EBUSY; 10548 10549 if (info->attrs[NL80211_ATTR_SCAN_FREQ_KHZ]) { 10550 if (!wiphy_ext_feature_isset(wiphy, 10551 NL80211_EXT_FEATURE_SCAN_FREQ_KHZ)) 10552 return -EOPNOTSUPP; 10553 scan_freqs = info->attrs[NL80211_ATTR_SCAN_FREQ_KHZ]; 10554 scan_freqs_khz = true; 10555 } else if (info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]) 10556 scan_freqs = info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]; 10557 10558 if (scan_freqs) { 10559 n_channels = validate_scan_freqs(scan_freqs); 10560 if (!n_channels) 10561 return -EINVAL; 10562 } else { 10563 n_channels = ieee80211_get_num_supported_channels(wiphy); 10564 } 10565 10566 if (info->attrs[NL80211_ATTR_SCAN_SSIDS]) 10567 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp) 10568 n_ssids++; 10569 10570 if (n_ssids > wiphy->max_scan_ssids) 10571 return -EINVAL; 10572 10573 if (info->attrs[NL80211_ATTR_IE]) 10574 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 10575 else 10576 ie_len = 0; 10577 10578 if (ie_len > wiphy->max_scan_ie_len) 10579 return -EINVAL; 10580 10581 size = struct_size(request, req.channels, n_channels); 10582 ssids_offset = size; 10583 size = size_add(size, array_size(sizeof(*request->req.ssids), n_ssids)); 10584 ie_offset = size; 10585 size = size_add(size, ie_len); 10586 request = kzalloc(size, GFP_KERNEL); 10587 if (!request) 10588 return -ENOMEM; 10589 10590 if (n_ssids) 10591 request->req.ssids = (void *)request + ssids_offset; 10592 request->req.n_ssids = n_ssids; 10593 if (ie_len) 10594 request->req.ie = (void *)request + ie_offset; 10595 10596 i = 0; 10597 if (scan_freqs) { 10598 /* user specified, bail out if channel not found */ 10599 nla_for_each_nested(attr, scan_freqs, tmp) { 10600 struct ieee80211_channel *chan; 10601 int freq = nla_get_u32(attr); 10602 10603 if (!scan_freqs_khz) 10604 freq = MHZ_TO_KHZ(freq); 10605 10606 chan = ieee80211_get_channel_khz(wiphy, freq); 10607 if (!chan) { 10608 err = -EINVAL; 10609 goto out_free; 10610 } 10611 10612 /* Ignore disabled / no primary channels */ 10613 if (chan->flags & IEEE80211_CHAN_DISABLED || 10614 chan->flags & IEEE80211_CHAN_S1G_NO_PRIMARY || 10615 !cfg80211_wdev_channel_allowed(wdev, chan)) 10616 continue; 10617 10618 request->req.channels[i] = chan; 10619 i++; 10620 } 10621 } else { 10622 enum nl80211_band band; 10623 10624 /* all channels */ 10625 for (band = 0; band < NUM_NL80211_BANDS; band++) { 10626 int j; 10627 10628 if (!wiphy->bands[band]) 10629 continue; 10630 for (j = 0; j < wiphy->bands[band]->n_channels; j++) { 10631 struct ieee80211_channel *chan; 10632 10633 chan = &wiphy->bands[band]->channels[j]; 10634 10635 if (chan->flags & IEEE80211_CHAN_DISABLED || 10636 chan->flags & 10637 IEEE80211_CHAN_S1G_NO_PRIMARY || 10638 !cfg80211_wdev_channel_allowed(wdev, chan)) 10639 continue; 10640 10641 request->req.channels[i] = chan; 10642 i++; 10643 } 10644 } 10645 } 10646 10647 if (!i) { 10648 err = -EINVAL; 10649 goto out_free; 10650 } 10651 10652 request->req.n_channels = i; 10653 10654 for (i = 0; i < request->req.n_channels; i++) { 10655 struct ieee80211_channel *chan = request->req.channels[i]; 10656 10657 /* if we can go off-channel to the target channel we're good */ 10658 if (cfg80211_off_channel_oper_allowed(wdev, chan)) 10659 continue; 10660 10661 if (!cfg80211_wdev_on_sub_chan(wdev, chan, true)) { 10662 err = -EBUSY; 10663 goto out_free; 10664 } 10665 } 10666 10667 i = 0; 10668 if (n_ssids) { 10669 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp) { 10670 if (nla_len(attr) > IEEE80211_MAX_SSID_LEN) { 10671 err = -EINVAL; 10672 goto out_free; 10673 } 10674 request->req.ssids[i].ssid_len = nla_len(attr); 10675 memcpy(request->req.ssids[i].ssid, 10676 nla_data(attr), nla_len(attr)); 10677 i++; 10678 } 10679 } 10680 10681 if (info->attrs[NL80211_ATTR_IE]) { 10682 request->req.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 10683 memcpy((void *)request->req.ie, 10684 nla_data(info->attrs[NL80211_ATTR_IE]), 10685 request->req.ie_len); 10686 } 10687 10688 for (i = 0; i < NUM_NL80211_BANDS; i++) 10689 if (wiphy->bands[i]) 10690 request->req.rates[i] = 10691 (1 << wiphy->bands[i]->n_bitrates) - 1; 10692 10693 if (info->attrs[NL80211_ATTR_SCAN_SUPP_RATES]) { 10694 nla_for_each_nested(attr, 10695 info->attrs[NL80211_ATTR_SCAN_SUPP_RATES], 10696 tmp) { 10697 enum nl80211_band band = nla_type(attr); 10698 10699 if (band < 0 || band >= NUM_NL80211_BANDS) { 10700 err = -EINVAL; 10701 goto out_free; 10702 } 10703 10704 if (!wiphy->bands[band]) 10705 continue; 10706 10707 err = ieee80211_get_ratemask(wiphy->bands[band], 10708 nla_data(attr), 10709 nla_len(attr), 10710 &request->req.rates[band]); 10711 if (err) 10712 goto out_free; 10713 } 10714 } 10715 10716 if (info->attrs[NL80211_ATTR_MEASUREMENT_DURATION]) { 10717 request->req.duration = 10718 nla_get_u16(info->attrs[NL80211_ATTR_MEASUREMENT_DURATION]); 10719 request->req.duration_mandatory = 10720 nla_get_flag(info->attrs[NL80211_ATTR_MEASUREMENT_DURATION_MANDATORY]); 10721 } 10722 10723 err = nl80211_check_scan_flags_reg(wiphy, wdev, info->attrs, request); 10724 if (err) 10725 goto out_free; 10726 10727 request->req.no_cck = 10728 nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]); 10729 10730 /* Initial implementation used NL80211_ATTR_MAC to set the specific 10731 * BSSID to scan for. This was problematic because that same attribute 10732 * was already used for another purpose (local random MAC address). The 10733 * NL80211_ATTR_BSSID attribute was added to fix this. For backwards 10734 * compatibility with older userspace components, also use the 10735 * NL80211_ATTR_MAC value here if it can be determined to be used for 10736 * the specific BSSID use case instead of the random MAC address 10737 * (NL80211_ATTR_SCAN_FLAGS is used to enable random MAC address use). 10738 */ 10739 if (info->attrs[NL80211_ATTR_BSSID]) 10740 memcpy(request->req.bssid, 10741 nla_data(info->attrs[NL80211_ATTR_BSSID]), ETH_ALEN); 10742 else if (!(request->req.flags & NL80211_SCAN_FLAG_RANDOM_ADDR) && 10743 info->attrs[NL80211_ATTR_MAC]) 10744 memcpy(request->req.bssid, 10745 nla_data(info->attrs[NL80211_ATTR_MAC]), 10746 ETH_ALEN); 10747 else 10748 eth_broadcast_addr(request->req.bssid); 10749 10750 request->req.tsf_report_link_id = 10751 nl80211_link_id_or_invalid(info->attrs); 10752 request->req.wdev = wdev; 10753 request->req.wiphy = &rdev->wiphy; 10754 request->req.scan_start = jiffies; 10755 10756 rdev->scan_req = request; 10757 err = cfg80211_scan(rdev); 10758 10759 if (err) 10760 goto out_free; 10761 10762 nl80211_send_scan_start(rdev, wdev); 10763 dev_hold(wdev->netdev); 10764 10765 return 0; 10766 10767 out_free: 10768 rdev->scan_req = NULL; 10769 kfree(request); 10770 10771 return err; 10772 } 10773 10774 static int nl80211_abort_scan(struct sk_buff *skb, struct genl_info *info) 10775 { 10776 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 10777 struct wireless_dev *wdev = info->user_ptr[1]; 10778 10779 if (!rdev->ops->abort_scan) 10780 return -EOPNOTSUPP; 10781 10782 if (rdev->scan_msg) 10783 return 0; 10784 10785 if (!rdev->scan_req) 10786 return -ENOENT; 10787 10788 rdev_abort_scan(rdev, wdev); 10789 return 0; 10790 } 10791 10792 static int 10793 nl80211_parse_sched_scan_plans(struct wiphy *wiphy, int n_plans, 10794 struct cfg80211_sched_scan_request *request, 10795 struct nlattr **attrs) 10796 { 10797 int tmp, err, i = 0; 10798 struct nlattr *attr; 10799 10800 if (!attrs[NL80211_ATTR_SCHED_SCAN_PLANS]) { 10801 u32 interval; 10802 10803 /* 10804 * If scan plans are not specified, 10805 * %NL80211_ATTR_SCHED_SCAN_INTERVAL will be specified. In this 10806 * case one scan plan will be set with the specified scan 10807 * interval and infinite number of iterations. 10808 */ 10809 interval = nla_get_u32(attrs[NL80211_ATTR_SCHED_SCAN_INTERVAL]); 10810 if (!interval) 10811 return -EINVAL; 10812 10813 request->scan_plans[0].interval = 10814 DIV_ROUND_UP(interval, MSEC_PER_SEC); 10815 if (!request->scan_plans[0].interval) 10816 return -EINVAL; 10817 10818 if (request->scan_plans[0].interval > 10819 wiphy->max_sched_scan_plan_interval) 10820 request->scan_plans[0].interval = 10821 wiphy->max_sched_scan_plan_interval; 10822 10823 return 0; 10824 } 10825 10826 nla_for_each_nested(attr, attrs[NL80211_ATTR_SCHED_SCAN_PLANS], tmp) { 10827 struct nlattr *plan[NL80211_SCHED_SCAN_PLAN_MAX + 1]; 10828 10829 if (WARN_ON(i >= n_plans)) 10830 return -EINVAL; 10831 10832 err = nla_parse_nested_deprecated(plan, 10833 NL80211_SCHED_SCAN_PLAN_MAX, 10834 attr, nl80211_plan_policy, 10835 NULL); 10836 if (err) 10837 return err; 10838 10839 if (!plan[NL80211_SCHED_SCAN_PLAN_INTERVAL]) 10840 return -EINVAL; 10841 10842 request->scan_plans[i].interval = 10843 nla_get_u32(plan[NL80211_SCHED_SCAN_PLAN_INTERVAL]); 10844 if (!request->scan_plans[i].interval || 10845 request->scan_plans[i].interval > 10846 wiphy->max_sched_scan_plan_interval) 10847 return -EINVAL; 10848 10849 if (plan[NL80211_SCHED_SCAN_PLAN_ITERATIONS]) { 10850 request->scan_plans[i].iterations = 10851 nla_get_u32(plan[NL80211_SCHED_SCAN_PLAN_ITERATIONS]); 10852 if (!request->scan_plans[i].iterations || 10853 (request->scan_plans[i].iterations > 10854 wiphy->max_sched_scan_plan_iterations)) 10855 return -EINVAL; 10856 } else if (i < n_plans - 1) { 10857 /* 10858 * All scan plans but the last one must specify 10859 * a finite number of iterations 10860 */ 10861 return -EINVAL; 10862 } 10863 10864 i++; 10865 } 10866 10867 /* 10868 * The last scan plan must not specify the number of 10869 * iterations, it is supposed to run infinitely 10870 */ 10871 if (request->scan_plans[n_plans - 1].iterations) 10872 return -EINVAL; 10873 10874 return 0; 10875 } 10876 10877 static struct cfg80211_sched_scan_request * 10878 nl80211_parse_sched_scan(struct wiphy *wiphy, struct wireless_dev *wdev, 10879 struct nlattr **attrs, int max_match_sets) 10880 { 10881 struct cfg80211_sched_scan_request *request; 10882 struct nlattr *attr; 10883 int err, tmp, n_ssids = 0, n_match_sets = 0, n_channels, i, n_plans = 0; 10884 enum nl80211_band band; 10885 size_t ie_len, size; 10886 struct nlattr *tb[NL80211_SCHED_SCAN_MATCH_ATTR_MAX + 1]; 10887 s32 default_match_rssi = NL80211_SCAN_RSSI_THOLD_OFF; 10888 10889 if (attrs[NL80211_ATTR_SCAN_FREQUENCIES]) { 10890 n_channels = validate_scan_freqs( 10891 attrs[NL80211_ATTR_SCAN_FREQUENCIES]); 10892 if (!n_channels) 10893 return ERR_PTR(-EINVAL); 10894 } else { 10895 n_channels = ieee80211_get_num_supported_channels(wiphy); 10896 } 10897 10898 if (attrs[NL80211_ATTR_SCAN_SSIDS]) 10899 nla_for_each_nested(attr, attrs[NL80211_ATTR_SCAN_SSIDS], 10900 tmp) 10901 n_ssids++; 10902 10903 if (n_ssids > wiphy->max_sched_scan_ssids) 10904 return ERR_PTR(-EINVAL); 10905 10906 /* 10907 * First, count the number of 'real' matchsets. Due to an issue with 10908 * the old implementation, matchsets containing only the RSSI attribute 10909 * (NL80211_SCHED_SCAN_MATCH_ATTR_RSSI) are considered as the 'default' 10910 * RSSI for all matchsets, rather than their own matchset for reporting 10911 * all APs with a strong RSSI. This is needed to be compatible with 10912 * older userspace that treated a matchset with only the RSSI as the 10913 * global RSSI for all other matchsets - if there are other matchsets. 10914 */ 10915 if (attrs[NL80211_ATTR_SCHED_SCAN_MATCH]) { 10916 nla_for_each_nested(attr, 10917 attrs[NL80211_ATTR_SCHED_SCAN_MATCH], 10918 tmp) { 10919 struct nlattr *rssi; 10920 10921 err = nla_parse_nested_deprecated(tb, 10922 NL80211_SCHED_SCAN_MATCH_ATTR_MAX, 10923 attr, 10924 nl80211_match_policy, 10925 NULL); 10926 if (err) 10927 return ERR_PTR(err); 10928 10929 /* SSID and BSSID are mutually exclusive */ 10930 if (tb[NL80211_SCHED_SCAN_MATCH_ATTR_SSID] && 10931 tb[NL80211_SCHED_SCAN_MATCH_ATTR_BSSID]) 10932 return ERR_PTR(-EINVAL); 10933 10934 /* add other standalone attributes here */ 10935 if (tb[NL80211_SCHED_SCAN_MATCH_ATTR_SSID] || 10936 tb[NL80211_SCHED_SCAN_MATCH_ATTR_BSSID]) { 10937 n_match_sets++; 10938 continue; 10939 } 10940 rssi = tb[NL80211_SCHED_SCAN_MATCH_ATTR_RSSI]; 10941 if (rssi) 10942 default_match_rssi = nla_get_s32(rssi); 10943 } 10944 } 10945 10946 /* However, if there's no other matchset, add the RSSI one */ 10947 if (!n_match_sets && default_match_rssi != NL80211_SCAN_RSSI_THOLD_OFF) 10948 n_match_sets = 1; 10949 10950 if (n_match_sets > max_match_sets) 10951 return ERR_PTR(-EINVAL); 10952 10953 if (attrs[NL80211_ATTR_IE]) 10954 ie_len = nla_len(attrs[NL80211_ATTR_IE]); 10955 else 10956 ie_len = 0; 10957 10958 if (ie_len > wiphy->max_sched_scan_ie_len) 10959 return ERR_PTR(-EINVAL); 10960 10961 if (attrs[NL80211_ATTR_SCHED_SCAN_PLANS]) { 10962 /* 10963 * NL80211_ATTR_SCHED_SCAN_INTERVAL must not be specified since 10964 * each scan plan already specifies its own interval 10965 */ 10966 if (attrs[NL80211_ATTR_SCHED_SCAN_INTERVAL]) 10967 return ERR_PTR(-EINVAL); 10968 10969 nla_for_each_nested(attr, 10970 attrs[NL80211_ATTR_SCHED_SCAN_PLANS], tmp) 10971 n_plans++; 10972 } else { 10973 /* 10974 * The scan interval attribute is kept for backward 10975 * compatibility. If no scan plans are specified and sched scan 10976 * interval is specified, one scan plan will be set with this 10977 * scan interval and infinite number of iterations. 10978 */ 10979 if (!attrs[NL80211_ATTR_SCHED_SCAN_INTERVAL]) 10980 return ERR_PTR(-EINVAL); 10981 10982 n_plans = 1; 10983 } 10984 10985 if (!n_plans || n_plans > wiphy->max_sched_scan_plans) 10986 return ERR_PTR(-EINVAL); 10987 10988 if (!wiphy_ext_feature_isset( 10989 wiphy, NL80211_EXT_FEATURE_SCHED_SCAN_RELATIVE_RSSI) && 10990 (attrs[NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI] || 10991 attrs[NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST])) 10992 return ERR_PTR(-EINVAL); 10993 10994 size = struct_size(request, channels, n_channels); 10995 size = size_add(size, array_size(sizeof(*request->ssids), n_ssids)); 10996 size = size_add(size, array_size(sizeof(*request->match_sets), 10997 n_match_sets)); 10998 size = size_add(size, array_size(sizeof(*request->scan_plans), 10999 n_plans)); 11000 size = size_add(size, ie_len); 11001 request = kzalloc(size, GFP_KERNEL); 11002 if (!request) 11003 return ERR_PTR(-ENOMEM); 11004 request->n_channels = n_channels; 11005 11006 if (n_ssids) 11007 request->ssids = (void *)request + 11008 struct_size(request, channels, n_channels); 11009 request->n_ssids = n_ssids; 11010 if (ie_len) { 11011 if (n_ssids) 11012 request->ie = (void *)(request->ssids + n_ssids); 11013 else 11014 request->ie = (void *)(request->channels + n_channels); 11015 } 11016 11017 if (n_match_sets) { 11018 if (request->ie) 11019 request->match_sets = (void *)(request->ie + ie_len); 11020 else if (n_ssids) 11021 request->match_sets = 11022 (void *)(request->ssids + n_ssids); 11023 else 11024 request->match_sets = 11025 (void *)(request->channels + n_channels); 11026 } 11027 request->n_match_sets = n_match_sets; 11028 11029 if (n_match_sets) 11030 request->scan_plans = (void *)(request->match_sets + 11031 n_match_sets); 11032 else if (request->ie) 11033 request->scan_plans = (void *)(request->ie + ie_len); 11034 else if (n_ssids) 11035 request->scan_plans = (void *)(request->ssids + n_ssids); 11036 else 11037 request->scan_plans = (void *)(request->channels + n_channels); 11038 11039 request->n_scan_plans = n_plans; 11040 11041 i = 0; 11042 if (attrs[NL80211_ATTR_SCAN_FREQUENCIES]) { 11043 /* user specified, bail out if channel not found */ 11044 nla_for_each_nested(attr, 11045 attrs[NL80211_ATTR_SCAN_FREQUENCIES], 11046 tmp) { 11047 struct ieee80211_channel *chan; 11048 11049 chan = ieee80211_get_channel(wiphy, nla_get_u32(attr)); 11050 11051 if (!chan) { 11052 err = -EINVAL; 11053 goto out_free; 11054 } 11055 11056 /* ignore disabled channels */ 11057 if (chan->flags & IEEE80211_CHAN_DISABLED) 11058 continue; 11059 11060 request->channels[i] = chan; 11061 i++; 11062 } 11063 } else { 11064 /* all channels */ 11065 for (band = 0; band < NUM_NL80211_BANDS; band++) { 11066 int j; 11067 11068 if (!wiphy->bands[band]) 11069 continue; 11070 for (j = 0; j < wiphy->bands[band]->n_channels; j++) { 11071 struct ieee80211_channel *chan; 11072 11073 chan = &wiphy->bands[band]->channels[j]; 11074 11075 if (chan->flags & IEEE80211_CHAN_DISABLED) 11076 continue; 11077 11078 request->channels[i] = chan; 11079 i++; 11080 } 11081 } 11082 } 11083 11084 if (!i) { 11085 err = -EINVAL; 11086 goto out_free; 11087 } 11088 11089 request->n_channels = i; 11090 11091 i = 0; 11092 if (n_ssids) { 11093 nla_for_each_nested(attr, attrs[NL80211_ATTR_SCAN_SSIDS], 11094 tmp) { 11095 if (nla_len(attr) > IEEE80211_MAX_SSID_LEN) { 11096 err = -EINVAL; 11097 goto out_free; 11098 } 11099 request->ssids[i].ssid_len = nla_len(attr); 11100 memcpy(request->ssids[i].ssid, nla_data(attr), 11101 nla_len(attr)); 11102 i++; 11103 } 11104 } 11105 11106 i = 0; 11107 if (attrs[NL80211_ATTR_SCHED_SCAN_MATCH]) { 11108 nla_for_each_nested(attr, 11109 attrs[NL80211_ATTR_SCHED_SCAN_MATCH], 11110 tmp) { 11111 struct nlattr *ssid, *bssid, *rssi; 11112 11113 err = nla_parse_nested_deprecated(tb, 11114 NL80211_SCHED_SCAN_MATCH_ATTR_MAX, 11115 attr, 11116 nl80211_match_policy, 11117 NULL); 11118 if (err) 11119 goto out_free; 11120 ssid = tb[NL80211_SCHED_SCAN_MATCH_ATTR_SSID]; 11121 bssid = tb[NL80211_SCHED_SCAN_MATCH_ATTR_BSSID]; 11122 11123 if (!ssid && !bssid) { 11124 i++; 11125 continue; 11126 } 11127 11128 if (WARN_ON(i >= n_match_sets)) { 11129 /* this indicates a programming error, 11130 * the loop above should have verified 11131 * things properly 11132 */ 11133 err = -EINVAL; 11134 goto out_free; 11135 } 11136 11137 if (ssid) { 11138 memcpy(request->match_sets[i].ssid.ssid, 11139 nla_data(ssid), nla_len(ssid)); 11140 request->match_sets[i].ssid.ssid_len = 11141 nla_len(ssid); 11142 } 11143 if (bssid) 11144 memcpy(request->match_sets[i].bssid, 11145 nla_data(bssid), ETH_ALEN); 11146 11147 /* special attribute - old implementation w/a */ 11148 request->match_sets[i].rssi_thold = default_match_rssi; 11149 rssi = tb[NL80211_SCHED_SCAN_MATCH_ATTR_RSSI]; 11150 if (rssi) 11151 request->match_sets[i].rssi_thold = 11152 nla_get_s32(rssi); 11153 i++; 11154 } 11155 11156 /* there was no other matchset, so the RSSI one is alone */ 11157 if (i == 0 && n_match_sets) 11158 request->match_sets[0].rssi_thold = default_match_rssi; 11159 11160 request->min_rssi_thold = INT_MAX; 11161 for (i = 0; i < n_match_sets; i++) 11162 request->min_rssi_thold = 11163 min(request->match_sets[i].rssi_thold, 11164 request->min_rssi_thold); 11165 } else { 11166 request->min_rssi_thold = NL80211_SCAN_RSSI_THOLD_OFF; 11167 } 11168 11169 if (ie_len) { 11170 request->ie_len = ie_len; 11171 memcpy((void *)request->ie, 11172 nla_data(attrs[NL80211_ATTR_IE]), 11173 request->ie_len); 11174 } 11175 11176 err = nl80211_check_scan_flags_sched(wiphy, wdev, attrs, request); 11177 if (err) 11178 goto out_free; 11179 11180 if (attrs[NL80211_ATTR_SCHED_SCAN_DELAY]) 11181 request->delay = 11182 nla_get_u32(attrs[NL80211_ATTR_SCHED_SCAN_DELAY]); 11183 11184 if (attrs[NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI]) { 11185 request->relative_rssi = nla_get_s8( 11186 attrs[NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI]); 11187 request->relative_rssi_set = true; 11188 } 11189 11190 if (request->relative_rssi_set && 11191 attrs[NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST]) { 11192 struct nl80211_bss_select_rssi_adjust *rssi_adjust; 11193 11194 rssi_adjust = nla_data( 11195 attrs[NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST]); 11196 request->rssi_adjust.band = rssi_adjust->band; 11197 request->rssi_adjust.delta = rssi_adjust->delta; 11198 if (!is_band_valid(wiphy, request->rssi_adjust.band)) { 11199 err = -EINVAL; 11200 goto out_free; 11201 } 11202 } 11203 11204 err = nl80211_parse_sched_scan_plans(wiphy, n_plans, request, attrs); 11205 if (err) 11206 goto out_free; 11207 11208 request->scan_start = jiffies; 11209 11210 return request; 11211 11212 out_free: 11213 kfree(request); 11214 return ERR_PTR(err); 11215 } 11216 11217 static int nl80211_start_sched_scan(struct sk_buff *skb, 11218 struct genl_info *info) 11219 { 11220 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 11221 struct net_device *dev = info->user_ptr[1]; 11222 struct wireless_dev *wdev = dev->ieee80211_ptr; 11223 struct cfg80211_sched_scan_request *sched_scan_req; 11224 bool want_multi; 11225 int err; 11226 11227 if (!rdev->wiphy.max_sched_scan_reqs || !rdev->ops->sched_scan_start) 11228 return -EOPNOTSUPP; 11229 11230 want_multi = info->attrs[NL80211_ATTR_SCHED_SCAN_MULTI]; 11231 err = cfg80211_sched_scan_req_possible(rdev, want_multi); 11232 if (err) 11233 return err; 11234 11235 sched_scan_req = nl80211_parse_sched_scan(&rdev->wiphy, wdev, 11236 info->attrs, 11237 rdev->wiphy.max_match_sets); 11238 11239 err = PTR_ERR_OR_ZERO(sched_scan_req); 11240 if (err) 11241 goto out_err; 11242 11243 /* leave request id zero for legacy request 11244 * or if driver does not support multi-scheduled scan 11245 */ 11246 if (want_multi && rdev->wiphy.max_sched_scan_reqs > 1) 11247 sched_scan_req->reqid = cfg80211_assign_cookie(rdev); 11248 11249 err = rdev_sched_scan_start(rdev, dev, sched_scan_req); 11250 if (err) 11251 goto out_free; 11252 11253 sched_scan_req->dev = dev; 11254 sched_scan_req->wiphy = &rdev->wiphy; 11255 11256 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) 11257 sched_scan_req->owner_nlportid = info->snd_portid; 11258 11259 cfg80211_add_sched_scan_req(rdev, sched_scan_req); 11260 11261 nl80211_send_sched_scan(sched_scan_req, NL80211_CMD_START_SCHED_SCAN); 11262 return 0; 11263 11264 out_free: 11265 kfree(sched_scan_req); 11266 out_err: 11267 return err; 11268 } 11269 11270 static int nl80211_stop_sched_scan(struct sk_buff *skb, 11271 struct genl_info *info) 11272 { 11273 struct cfg80211_sched_scan_request *req; 11274 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 11275 u64 cookie; 11276 11277 if (!rdev->wiphy.max_sched_scan_reqs || !rdev->ops->sched_scan_stop) 11278 return -EOPNOTSUPP; 11279 11280 if (info->attrs[NL80211_ATTR_COOKIE]) { 11281 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); 11282 return __cfg80211_stop_sched_scan(rdev, cookie, false); 11283 } 11284 11285 req = list_first_or_null_rcu(&rdev->sched_scan_req_list, 11286 struct cfg80211_sched_scan_request, 11287 list); 11288 if (!req || req->reqid || 11289 (req->owner_nlportid && 11290 req->owner_nlportid != info->snd_portid)) 11291 return -ENOENT; 11292 11293 return cfg80211_stop_sched_scan_req(rdev, req, false); 11294 } 11295 11296 static int nl80211_start_radar_detection(struct sk_buff *skb, 11297 struct genl_info *info) 11298 { 11299 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 11300 struct net_device *dev = info->user_ptr[1]; 11301 struct wireless_dev *wdev = dev->ieee80211_ptr; 11302 int link_id = nl80211_link_id(info->attrs); 11303 struct wiphy *wiphy = wdev->wiphy; 11304 struct cfg80211_chan_def chandef; 11305 enum nl80211_dfs_regions dfs_region; 11306 unsigned int cac_time_ms; 11307 int err; 11308 11309 flush_delayed_work(&rdev->dfs_update_channels_wk); 11310 11311 switch (wdev->iftype) { 11312 case NL80211_IFTYPE_AP: 11313 case NL80211_IFTYPE_P2P_GO: 11314 case NL80211_IFTYPE_MESH_POINT: 11315 case NL80211_IFTYPE_ADHOC: 11316 break; 11317 default: 11318 /* caution - see cfg80211_beaconing_iface_active() below */ 11319 return -EINVAL; 11320 } 11321 11322 guard(wiphy)(wiphy); 11323 11324 dfs_region = reg_get_dfs_region(wiphy); 11325 if (dfs_region == NL80211_DFS_UNSET) 11326 return -EINVAL; 11327 11328 err = nl80211_parse_chandef(rdev, info->extack, info->attrs, &chandef); 11329 if (err) 11330 return err; 11331 11332 err = cfg80211_chandef_dfs_required(wiphy, &chandef, wdev->iftype); 11333 if (err < 0) 11334 return err; 11335 11336 if (err == 0) 11337 return -EINVAL; 11338 11339 if (!cfg80211_chandef_dfs_usable(wiphy, &chandef)) 11340 return -EINVAL; 11341 11342 if (nla_get_flag(info->attrs[NL80211_ATTR_RADAR_BACKGROUND])) 11343 return cfg80211_start_background_radar_detection(rdev, wdev, 11344 &chandef); 11345 11346 if (cfg80211_beaconing_iface_active(wdev)) { 11347 /* During MLO other link(s) can beacon, only the current link 11348 * can not already beacon 11349 */ 11350 if (wdev->valid_links && 11351 !wdev->links[link_id].ap.beacon_interval) { 11352 /* nothing */ 11353 } else { 11354 return -EBUSY; 11355 } 11356 } 11357 11358 if (wdev->links[link_id].cac_started) 11359 return -EBUSY; 11360 11361 /* CAC start is offloaded to HW and can't be started manually */ 11362 if (wiphy_ext_feature_isset(wiphy, NL80211_EXT_FEATURE_DFS_OFFLOAD)) 11363 return -EOPNOTSUPP; 11364 11365 if (!rdev->ops->start_radar_detection) 11366 return -EOPNOTSUPP; 11367 11368 cac_time_ms = cfg80211_chandef_dfs_cac_time(&rdev->wiphy, &chandef); 11369 if (WARN_ON(!cac_time_ms)) 11370 cac_time_ms = IEEE80211_DFS_MIN_CAC_TIME_MS; 11371 11372 err = rdev_start_radar_detection(rdev, dev, &chandef, cac_time_ms, 11373 link_id); 11374 if (err) 11375 return err; 11376 11377 switch (wdev->iftype) { 11378 case NL80211_IFTYPE_AP: 11379 case NL80211_IFTYPE_P2P_GO: 11380 wdev->links[link_id].ap.chandef = chandef; 11381 break; 11382 case NL80211_IFTYPE_ADHOC: 11383 wdev->u.ibss.chandef = chandef; 11384 break; 11385 case NL80211_IFTYPE_MESH_POINT: 11386 wdev->u.mesh.chandef = chandef; 11387 break; 11388 default: 11389 break; 11390 } 11391 wdev->links[link_id].cac_started = true; 11392 wdev->links[link_id].cac_start_time = jiffies; 11393 wdev->links[link_id].cac_time_ms = cac_time_ms; 11394 cfg80211_set_cac_state(wiphy, &chandef, true); 11395 11396 return 0; 11397 } 11398 11399 static int nl80211_notify_radar_detection(struct sk_buff *skb, 11400 struct genl_info *info) 11401 { 11402 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 11403 struct net_device *dev = info->user_ptr[1]; 11404 struct wireless_dev *wdev = dev->ieee80211_ptr; 11405 struct wiphy *wiphy = wdev->wiphy; 11406 struct cfg80211_chan_def chandef; 11407 enum nl80211_dfs_regions dfs_region; 11408 int err; 11409 11410 dfs_region = reg_get_dfs_region(wiphy); 11411 if (dfs_region == NL80211_DFS_UNSET) { 11412 GENL_SET_ERR_MSG(info, 11413 "DFS Region is not set. Unexpected Radar indication"); 11414 return -EINVAL; 11415 } 11416 11417 err = nl80211_parse_chandef(rdev, info->extack, info->attrs, &chandef); 11418 if (err) { 11419 GENL_SET_ERR_MSG(info, "Unable to extract chandef info"); 11420 return err; 11421 } 11422 11423 err = cfg80211_chandef_dfs_required(wiphy, &chandef, wdev->iftype); 11424 if (err < 0) { 11425 GENL_SET_ERR_MSG(info, "chandef is invalid"); 11426 return err; 11427 } 11428 11429 if (err == 0) { 11430 GENL_SET_ERR_MSG(info, 11431 "Unexpected Radar indication for chandef/iftype"); 11432 return -EINVAL; 11433 } 11434 11435 /* Do not process this notification if radar is already detected 11436 * by kernel on this channel, and return success. 11437 */ 11438 if (chandef.chan->dfs_state == NL80211_DFS_UNAVAILABLE) 11439 return 0; 11440 11441 cfg80211_set_dfs_state(wiphy, &chandef, NL80211_DFS_UNAVAILABLE); 11442 11443 cfg80211_sched_dfs_chan_update(rdev); 11444 11445 rdev->radar_chandef = chandef; 11446 11447 /* Propagate this notification to other radios as well */ 11448 queue_work(cfg80211_wq, &rdev->propagate_radar_detect_wk); 11449 11450 return 0; 11451 } 11452 11453 static int nl80211_parse_counter_offsets(struct cfg80211_registered_device *rdev, 11454 const u8 *data, size_t datalen, 11455 int first_count, struct nlattr *attr, 11456 const u16 **offsets, unsigned int *n_offsets) 11457 { 11458 int i; 11459 11460 *n_offsets = 0; 11461 11462 if (!attr) 11463 return 0; 11464 11465 if (!nla_len(attr) || (nla_len(attr) % sizeof(u16))) 11466 return -EINVAL; 11467 11468 *n_offsets = nla_len(attr) / sizeof(u16); 11469 if (rdev->wiphy.max_num_csa_counters && 11470 (*n_offsets > rdev->wiphy.max_num_csa_counters)) 11471 return -EINVAL; 11472 11473 *offsets = nla_data(attr); 11474 11475 /* sanity checks - counters should fit and be the same */ 11476 for (i = 0; i < *n_offsets; i++) { 11477 u16 offset = (*offsets)[i]; 11478 11479 if (offset >= datalen) 11480 return -EINVAL; 11481 11482 if (first_count != -1 && data[offset] != first_count) 11483 return -EINVAL; 11484 } 11485 11486 return 0; 11487 } 11488 11489 static int nl80211_channel_switch(struct sk_buff *skb, struct genl_info *info) 11490 { 11491 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 11492 unsigned int link_id = nl80211_link_id(info->attrs); 11493 struct net_device *dev = info->user_ptr[1]; 11494 struct wireless_dev *wdev = dev->ieee80211_ptr; 11495 struct cfg80211_csa_settings params; 11496 struct nlattr **csa_attrs = NULL; 11497 int err; 11498 bool need_new_beacon = false; 11499 bool need_handle_dfs_flag = true; 11500 u32 cs_count; 11501 11502 if (!rdev->ops->channel_switch || 11503 !(rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH)) 11504 return -EOPNOTSUPP; 11505 11506 switch (dev->ieee80211_ptr->iftype) { 11507 case NL80211_IFTYPE_AP: 11508 case NL80211_IFTYPE_P2P_GO: 11509 need_new_beacon = true; 11510 /* For all modes except AP the handle_dfs flag needs to be 11511 * supplied to tell the kernel that userspace will handle radar 11512 * events when they happen. Otherwise a switch to a channel 11513 * requiring DFS will be rejected. 11514 */ 11515 need_handle_dfs_flag = false; 11516 11517 /* useless if AP is not running */ 11518 if (!wdev->links[link_id].ap.beacon_interval) 11519 return -ENOTCONN; 11520 break; 11521 case NL80211_IFTYPE_ADHOC: 11522 if (!wdev->u.ibss.ssid_len) 11523 return -ENOTCONN; 11524 break; 11525 case NL80211_IFTYPE_MESH_POINT: 11526 if (!wdev->u.mesh.id_len) 11527 return -ENOTCONN; 11528 break; 11529 default: 11530 return -EOPNOTSUPP; 11531 } 11532 11533 memset(¶ms, 0, sizeof(params)); 11534 params.beacon_csa.ftm_responder = -1; 11535 11536 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ] || 11537 !info->attrs[NL80211_ATTR_CH_SWITCH_COUNT]) 11538 return -EINVAL; 11539 11540 /* only important for AP, IBSS and mesh create IEs internally */ 11541 if (need_new_beacon && !info->attrs[NL80211_ATTR_CSA_IES]) 11542 return -EINVAL; 11543 11544 /* Even though the attribute is u32, the specification says 11545 * u8, so let's make sure we don't overflow. 11546 */ 11547 cs_count = nla_get_u32(info->attrs[NL80211_ATTR_CH_SWITCH_COUNT]); 11548 if (cs_count > 255) 11549 return -EINVAL; 11550 11551 params.count = cs_count; 11552 11553 if (!need_new_beacon) 11554 goto skip_beacons; 11555 11556 err = nl80211_parse_beacon(rdev, info->attrs, ¶ms.beacon_after, 11557 info->extack); 11558 if (err) 11559 goto free; 11560 11561 csa_attrs = kzalloc_objs(*csa_attrs, NL80211_ATTR_MAX + 1); 11562 if (!csa_attrs) { 11563 err = -ENOMEM; 11564 goto free; 11565 } 11566 11567 err = nla_parse_nested_deprecated(csa_attrs, NL80211_ATTR_MAX, 11568 info->attrs[NL80211_ATTR_CSA_IES], 11569 nl80211_policy, info->extack); 11570 if (err) 11571 goto free; 11572 11573 err = nl80211_parse_beacon(rdev, csa_attrs, ¶ms.beacon_csa, 11574 info->extack); 11575 if (err) 11576 goto free; 11577 11578 if (!csa_attrs[NL80211_ATTR_CNTDWN_OFFS_BEACON]) { 11579 err = -EINVAL; 11580 goto free; 11581 } 11582 11583 err = nl80211_parse_counter_offsets(rdev, params.beacon_csa.tail, 11584 params.beacon_csa.tail_len, 11585 params.count, 11586 csa_attrs[NL80211_ATTR_CNTDWN_OFFS_BEACON], 11587 ¶ms.counter_offsets_beacon, 11588 ¶ms.n_counter_offsets_beacon); 11589 if (err) 11590 goto free; 11591 11592 err = nl80211_parse_counter_offsets(rdev, params.beacon_csa.probe_resp, 11593 params.beacon_csa.probe_resp_len, 11594 params.count, 11595 csa_attrs[NL80211_ATTR_CNTDWN_OFFS_PRESP], 11596 ¶ms.counter_offsets_presp, 11597 ¶ms.n_counter_offsets_presp); 11598 if (err) 11599 goto free; 11600 11601 skip_beacons: 11602 err = nl80211_parse_chandef(rdev, info->extack, info->attrs, 11603 ¶ms.chandef); 11604 if (err) 11605 goto free; 11606 11607 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, ¶ms.chandef, 11608 wdev->iftype)) { 11609 err = -EINVAL; 11610 goto free; 11611 } 11612 11613 err = cfg80211_chandef_dfs_required(wdev->wiphy, 11614 ¶ms.chandef, 11615 wdev->iftype); 11616 if (err < 0) 11617 goto free; 11618 11619 if (err > 0) { 11620 params.radar_required = true; 11621 if (need_handle_dfs_flag && 11622 !nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS])) { 11623 err = -EINVAL; 11624 goto free; 11625 } 11626 } 11627 11628 if (info->attrs[NL80211_ATTR_CH_SWITCH_BLOCK_TX]) 11629 params.block_tx = true; 11630 11631 if ((wdev->iftype == NL80211_IFTYPE_AP || 11632 wdev->iftype == NL80211_IFTYPE_P2P_GO) && 11633 info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP]) { 11634 err = nl80211_parse_unsol_bcast_probe_resp( 11635 rdev, info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP], 11636 ¶ms.unsol_bcast_probe_resp); 11637 if (err) 11638 goto free; 11639 } 11640 11641 params.link_id = link_id; 11642 err = rdev_channel_switch(rdev, dev, ¶ms); 11643 11644 free: 11645 kfree(params.beacon_after.mbssid_ies); 11646 kfree(params.beacon_csa.mbssid_ies); 11647 kfree(params.beacon_after.rnr_ies); 11648 kfree(params.beacon_csa.rnr_ies); 11649 kfree(csa_attrs); 11650 return err; 11651 } 11652 11653 static int nl80211_send_bss(struct sk_buff *msg, struct netlink_callback *cb, 11654 u32 seq, int flags, 11655 struct cfg80211_registered_device *rdev, 11656 struct wireless_dev *wdev, 11657 struct cfg80211_internal_bss *intbss) 11658 { 11659 struct cfg80211_bss *res = &intbss->pub; 11660 const struct cfg80211_bss_ies *ies; 11661 unsigned int link_id; 11662 void *hdr; 11663 struct nlattr *bss; 11664 11665 lockdep_assert_wiphy(wdev->wiphy); 11666 11667 hdr = nl80211hdr_put(msg, NETLINK_CB(cb->skb).portid, seq, flags, 11668 NL80211_CMD_NEW_SCAN_RESULTS); 11669 if (!hdr) 11670 return -1; 11671 11672 genl_dump_check_consistent(cb, hdr); 11673 11674 if (nla_put_u32(msg, NL80211_ATTR_GENERATION, rdev->bss_generation)) 11675 goto nla_put_failure; 11676 if (wdev->netdev && 11677 nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex)) 11678 goto nla_put_failure; 11679 if (nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 11680 NL80211_ATTR_PAD)) 11681 goto nla_put_failure; 11682 11683 bss = nla_nest_start_noflag(msg, NL80211_ATTR_BSS); 11684 if (!bss) 11685 goto nla_put_failure; 11686 if ((!is_zero_ether_addr(res->bssid) && 11687 nla_put(msg, NL80211_BSS_BSSID, ETH_ALEN, res->bssid))) 11688 goto nla_put_failure; 11689 11690 rcu_read_lock(); 11691 /* indicate whether we have probe response data or not */ 11692 if (rcu_access_pointer(res->proberesp_ies) && 11693 nla_put_flag(msg, NL80211_BSS_PRESP_DATA)) 11694 goto fail_unlock_rcu; 11695 11696 /* this pointer prefers to be pointed to probe response data 11697 * but is always valid 11698 */ 11699 ies = rcu_dereference(res->ies); 11700 if (ies) { 11701 if (nla_put_u64_64bit(msg, NL80211_BSS_TSF, ies->tsf, 11702 NL80211_BSS_PAD)) 11703 goto fail_unlock_rcu; 11704 if (ies->len && nla_put(msg, NL80211_BSS_INFORMATION_ELEMENTS, 11705 ies->len, ies->data)) 11706 goto fail_unlock_rcu; 11707 } 11708 11709 /* and this pointer is always (unless driver didn't know) beacon data */ 11710 ies = rcu_dereference(res->beacon_ies); 11711 if (ies && ies->from_beacon) { 11712 if (nla_put_u64_64bit(msg, NL80211_BSS_BEACON_TSF, ies->tsf, 11713 NL80211_BSS_PAD)) 11714 goto fail_unlock_rcu; 11715 if (ies->len && nla_put(msg, NL80211_BSS_BEACON_IES, 11716 ies->len, ies->data)) 11717 goto fail_unlock_rcu; 11718 } 11719 rcu_read_unlock(); 11720 11721 if (res->beacon_interval && 11722 nla_put_u16(msg, NL80211_BSS_BEACON_INTERVAL, res->beacon_interval)) 11723 goto nla_put_failure; 11724 if (nla_put_u16(msg, NL80211_BSS_CAPABILITY, res->capability) || 11725 nla_put_u32(msg, NL80211_BSS_FREQUENCY, res->channel->center_freq) || 11726 nla_put_u32(msg, NL80211_BSS_FREQUENCY_OFFSET, 11727 res->channel->freq_offset) || 11728 nla_put_u32(msg, NL80211_BSS_SEEN_MS_AGO, 11729 jiffies_to_msecs(jiffies - intbss->ts))) 11730 goto nla_put_failure; 11731 11732 if (intbss->parent_tsf && 11733 (nla_put_u64_64bit(msg, NL80211_BSS_PARENT_TSF, 11734 intbss->parent_tsf, NL80211_BSS_PAD) || 11735 nla_put(msg, NL80211_BSS_PARENT_BSSID, ETH_ALEN, 11736 intbss->parent_bssid))) 11737 goto nla_put_failure; 11738 11739 if (res->ts_boottime && 11740 nla_put_u64_64bit(msg, NL80211_BSS_LAST_SEEN_BOOTTIME, 11741 res->ts_boottime, NL80211_BSS_PAD)) 11742 goto nla_put_failure; 11743 11744 if (!nl80211_put_signal(msg, intbss->pub.chains, 11745 intbss->pub.chain_signal, 11746 NL80211_BSS_CHAIN_SIGNAL)) 11747 goto nla_put_failure; 11748 11749 if (intbss->bss_source != BSS_SOURCE_STA_PROFILE) { 11750 switch (rdev->wiphy.signal_type) { 11751 case CFG80211_SIGNAL_TYPE_MBM: 11752 if (nla_put_u32(msg, NL80211_BSS_SIGNAL_MBM, 11753 res->signal)) 11754 goto nla_put_failure; 11755 break; 11756 case CFG80211_SIGNAL_TYPE_UNSPEC: 11757 if (nla_put_u8(msg, NL80211_BSS_SIGNAL_UNSPEC, 11758 res->signal)) 11759 goto nla_put_failure; 11760 break; 11761 default: 11762 break; 11763 } 11764 } 11765 11766 switch (wdev->iftype) { 11767 case NL80211_IFTYPE_P2P_CLIENT: 11768 case NL80211_IFTYPE_STATION: 11769 for_each_valid_link(wdev, link_id) { 11770 if (intbss == wdev->links[link_id].client.current_bss && 11771 (nla_put_u32(msg, NL80211_BSS_STATUS, 11772 NL80211_BSS_STATUS_ASSOCIATED) || 11773 (wdev->valid_links && 11774 (nla_put_u8(msg, NL80211_BSS_MLO_LINK_ID, 11775 link_id) || 11776 nla_put(msg, NL80211_BSS_MLD_ADDR, ETH_ALEN, 11777 wdev->u.client.connected_addr))))) 11778 goto nla_put_failure; 11779 } 11780 break; 11781 case NL80211_IFTYPE_ADHOC: 11782 if (intbss == wdev->u.ibss.current_bss && 11783 nla_put_u32(msg, NL80211_BSS_STATUS, 11784 NL80211_BSS_STATUS_IBSS_JOINED)) 11785 goto nla_put_failure; 11786 break; 11787 default: 11788 break; 11789 } 11790 11791 if (nla_put_u32(msg, NL80211_BSS_USE_FOR, res->use_for)) 11792 goto nla_put_failure; 11793 11794 if (res->cannot_use_reasons && 11795 nla_put_u64_64bit(msg, NL80211_BSS_CANNOT_USE_REASONS, 11796 res->cannot_use_reasons, 11797 NL80211_BSS_PAD)) 11798 goto nla_put_failure; 11799 11800 nla_nest_end(msg, bss); 11801 11802 genlmsg_end(msg, hdr); 11803 return 0; 11804 11805 fail_unlock_rcu: 11806 rcu_read_unlock(); 11807 nla_put_failure: 11808 genlmsg_cancel(msg, hdr); 11809 return -EMSGSIZE; 11810 } 11811 11812 static int nl80211_dump_scan(struct sk_buff *skb, struct netlink_callback *cb) 11813 { 11814 struct cfg80211_registered_device *rdev; 11815 struct cfg80211_internal_bss *scan; 11816 struct wireless_dev *wdev; 11817 struct nlattr **attrbuf; 11818 int start = cb->args[2], idx = 0; 11819 bool dump_include_use_data; 11820 int err; 11821 11822 attrbuf = kzalloc_objs(*attrbuf, NUM_NL80211_ATTR); 11823 if (!attrbuf) 11824 return -ENOMEM; 11825 11826 err = nl80211_prepare_wdev_dump(cb, &rdev, &wdev, attrbuf); 11827 if (err) { 11828 kfree(attrbuf); 11829 return err; 11830 } 11831 /* nl80211_prepare_wdev_dump acquired it in the successful case */ 11832 __acquire(&rdev->wiphy.mtx); 11833 11834 dump_include_use_data = 11835 attrbuf[NL80211_ATTR_BSS_DUMP_INCLUDE_USE_DATA]; 11836 kfree(attrbuf); 11837 11838 spin_lock_bh(&rdev->bss_lock); 11839 11840 /* 11841 * dump_scan will be called multiple times to break up the scan results 11842 * into multiple messages. It is unlikely that any more bss-es will be 11843 * expired after the first call, so only call only call this on the 11844 * first dump_scan invocation. 11845 */ 11846 if (start == 0) 11847 cfg80211_bss_expire(rdev); 11848 11849 cb->seq = rdev->bss_generation; 11850 11851 list_for_each_entry(scan, &rdev->bss_list, list) { 11852 if (++idx <= start) 11853 continue; 11854 if (!dump_include_use_data && 11855 !(scan->pub.use_for & NL80211_BSS_USE_FOR_NORMAL)) 11856 continue; 11857 if (nl80211_send_bss(skb, cb, 11858 cb->nlh->nlmsg_seq, NLM_F_MULTI, 11859 rdev, wdev, scan) < 0) { 11860 idx--; 11861 break; 11862 } 11863 } 11864 11865 spin_unlock_bh(&rdev->bss_lock); 11866 11867 cb->args[2] = idx; 11868 wiphy_unlock(&rdev->wiphy); 11869 11870 return skb->len; 11871 } 11872 11873 static int nl80211_send_survey(struct sk_buff *msg, u32 portid, u32 seq, 11874 int flags, struct net_device *dev, 11875 bool allow_radio_stats, 11876 struct survey_info *survey) 11877 { 11878 void *hdr; 11879 struct nlattr *infoattr; 11880 11881 /* skip radio stats if userspace didn't request them */ 11882 if (!survey->channel && !allow_radio_stats) 11883 return 0; 11884 11885 hdr = nl80211hdr_put(msg, portid, seq, flags, 11886 NL80211_CMD_NEW_SURVEY_RESULTS); 11887 if (!hdr) 11888 return -ENOMEM; 11889 11890 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) 11891 goto nla_put_failure; 11892 11893 infoattr = nla_nest_start_noflag(msg, NL80211_ATTR_SURVEY_INFO); 11894 if (!infoattr) 11895 goto nla_put_failure; 11896 11897 if (survey->channel && 11898 nla_put_u32(msg, NL80211_SURVEY_INFO_FREQUENCY, 11899 survey->channel->center_freq)) 11900 goto nla_put_failure; 11901 11902 if (survey->channel && survey->channel->freq_offset && 11903 nla_put_u32(msg, NL80211_SURVEY_INFO_FREQUENCY_OFFSET, 11904 survey->channel->freq_offset)) 11905 goto nla_put_failure; 11906 11907 if ((survey->filled & SURVEY_INFO_NOISE_DBM) && 11908 nla_put_u8(msg, NL80211_SURVEY_INFO_NOISE, survey->noise)) 11909 goto nla_put_failure; 11910 if ((survey->filled & SURVEY_INFO_IN_USE) && 11911 nla_put_flag(msg, NL80211_SURVEY_INFO_IN_USE)) 11912 goto nla_put_failure; 11913 if ((survey->filled & SURVEY_INFO_TIME) && 11914 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME, 11915 survey->time, NL80211_SURVEY_INFO_PAD)) 11916 goto nla_put_failure; 11917 if ((survey->filled & SURVEY_INFO_TIME_BUSY) && 11918 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_BUSY, 11919 survey->time_busy, NL80211_SURVEY_INFO_PAD)) 11920 goto nla_put_failure; 11921 if ((survey->filled & SURVEY_INFO_TIME_EXT_BUSY) && 11922 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_EXT_BUSY, 11923 survey->time_ext_busy, NL80211_SURVEY_INFO_PAD)) 11924 goto nla_put_failure; 11925 if ((survey->filled & SURVEY_INFO_TIME_RX) && 11926 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_RX, 11927 survey->time_rx, NL80211_SURVEY_INFO_PAD)) 11928 goto nla_put_failure; 11929 if ((survey->filled & SURVEY_INFO_TIME_TX) && 11930 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_TX, 11931 survey->time_tx, NL80211_SURVEY_INFO_PAD)) 11932 goto nla_put_failure; 11933 if ((survey->filled & SURVEY_INFO_TIME_SCAN) && 11934 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_SCAN, 11935 survey->time_scan, NL80211_SURVEY_INFO_PAD)) 11936 goto nla_put_failure; 11937 if ((survey->filled & SURVEY_INFO_TIME_BSS_RX) && 11938 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_BSS_RX, 11939 survey->time_bss_rx, NL80211_SURVEY_INFO_PAD)) 11940 goto nla_put_failure; 11941 11942 nla_nest_end(msg, infoattr); 11943 11944 genlmsg_end(msg, hdr); 11945 return 0; 11946 11947 nla_put_failure: 11948 genlmsg_cancel(msg, hdr); 11949 return -EMSGSIZE; 11950 } 11951 11952 static int nl80211_dump_survey(struct sk_buff *skb, struct netlink_callback *cb) 11953 { 11954 struct nlattr **attrbuf; 11955 struct survey_info survey; 11956 struct cfg80211_registered_device *rdev; 11957 struct wireless_dev *wdev; 11958 int survey_idx = cb->args[2]; 11959 int res; 11960 bool radio_stats; 11961 11962 attrbuf = kzalloc_objs(*attrbuf, NUM_NL80211_ATTR); 11963 if (!attrbuf) 11964 return -ENOMEM; 11965 11966 res = nl80211_prepare_wdev_dump(cb, &rdev, &wdev, attrbuf); 11967 if (res) { 11968 kfree(attrbuf); 11969 return res; 11970 } 11971 /* nl80211_prepare_wdev_dump acquired it in the successful case */ 11972 __acquire(&rdev->wiphy.mtx); 11973 11974 /* prepare_wdev_dump parsed the attributes */ 11975 radio_stats = attrbuf[NL80211_ATTR_SURVEY_RADIO_STATS]; 11976 11977 if (!wdev->netdev) { 11978 res = -EINVAL; 11979 goto out_err; 11980 } 11981 11982 if (!rdev->ops->dump_survey) { 11983 res = -EOPNOTSUPP; 11984 goto out_err; 11985 } 11986 11987 while (1) { 11988 res = rdev_dump_survey(rdev, wdev->netdev, survey_idx, &survey); 11989 if (res == -ENOENT) 11990 break; 11991 if (res) 11992 goto out_err; 11993 11994 /* don't send disabled channels, but do send non-channel data */ 11995 if (survey.channel && 11996 survey.channel->flags & IEEE80211_CHAN_DISABLED) { 11997 survey_idx++; 11998 continue; 11999 } 12000 12001 if (nl80211_send_survey(skb, 12002 NETLINK_CB(cb->skb).portid, 12003 cb->nlh->nlmsg_seq, NLM_F_MULTI, 12004 wdev->netdev, radio_stats, &survey) < 0) 12005 goto out; 12006 survey_idx++; 12007 } 12008 12009 out: 12010 cb->args[2] = survey_idx; 12011 res = skb->len; 12012 out_err: 12013 kfree(attrbuf); 12014 wiphy_unlock(&rdev->wiphy); 12015 return res; 12016 } 12017 12018 static int nl80211_authenticate(struct sk_buff *skb, struct genl_info *info) 12019 { 12020 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12021 struct net_device *dev = info->user_ptr[1]; 12022 struct ieee80211_channel *chan; 12023 const u8 *bssid, *ssid; 12024 int err, ssid_len; 12025 enum nl80211_auth_type auth_type; 12026 struct key_parse key; 12027 bool local_state_change; 12028 struct cfg80211_auth_request req = {}; 12029 u32 freq; 12030 12031 if (!info->attrs[NL80211_ATTR_MAC]) 12032 return -EINVAL; 12033 12034 if (!info->attrs[NL80211_ATTR_AUTH_TYPE]) 12035 return -EINVAL; 12036 12037 if (!info->attrs[NL80211_ATTR_SSID]) 12038 return -EINVAL; 12039 12040 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ]) 12041 return -EINVAL; 12042 12043 err = nl80211_parse_key(info, &key); 12044 if (err) 12045 return err; 12046 12047 if (key.idx >= 0) { 12048 if (key.type != -1 && key.type != NL80211_KEYTYPE_GROUP) 12049 return -EINVAL; 12050 if (!key.p.key || !key.p.key_len) 12051 return -EINVAL; 12052 if ((key.p.cipher != WLAN_CIPHER_SUITE_WEP40 || 12053 key.p.key_len != WLAN_KEY_LEN_WEP40) && 12054 (key.p.cipher != WLAN_CIPHER_SUITE_WEP104 || 12055 key.p.key_len != WLAN_KEY_LEN_WEP104)) 12056 return -EINVAL; 12057 if (key.idx > 3) 12058 return -EINVAL; 12059 } else { 12060 key.p.key_len = 0; 12061 key.p.key = NULL; 12062 } 12063 12064 if (key.idx >= 0) { 12065 int i; 12066 bool ok = false; 12067 12068 for (i = 0; i < rdev->wiphy.n_cipher_suites; i++) { 12069 if (key.p.cipher == rdev->wiphy.cipher_suites[i]) { 12070 ok = true; 12071 break; 12072 } 12073 } 12074 if (!ok) 12075 return -EINVAL; 12076 } 12077 12078 if (!rdev->ops->auth) 12079 return -EOPNOTSUPP; 12080 12081 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 12082 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 12083 return -EOPNOTSUPP; 12084 12085 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 12086 freq = MHZ_TO_KHZ(nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ])); 12087 if (info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]) 12088 freq += 12089 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]); 12090 12091 chan = nl80211_get_valid_chan(&rdev->wiphy, freq); 12092 if (!chan) 12093 return -EINVAL; 12094 12095 ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); 12096 ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); 12097 12098 if (info->attrs[NL80211_ATTR_IE]) { 12099 req.ie = nla_data(info->attrs[NL80211_ATTR_IE]); 12100 req.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 12101 } 12102 12103 if (info->attrs[NL80211_ATTR_SUPPORTED_SELECTORS]) { 12104 req.supported_selectors = 12105 nla_data(info->attrs[NL80211_ATTR_SUPPORTED_SELECTORS]); 12106 req.supported_selectors_len = 12107 nla_len(info->attrs[NL80211_ATTR_SUPPORTED_SELECTORS]); 12108 } 12109 12110 auth_type = nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]); 12111 if (!nl80211_valid_auth_type(rdev, auth_type, NL80211_CMD_AUTHENTICATE)) 12112 return -EINVAL; 12113 12114 if ((auth_type == NL80211_AUTHTYPE_SAE || 12115 auth_type == NL80211_AUTHTYPE_FILS_SK || 12116 auth_type == NL80211_AUTHTYPE_FILS_SK_PFS || 12117 auth_type == NL80211_AUTHTYPE_FILS_PK || 12118 auth_type == NL80211_AUTHTYPE_EPPKE || 12119 auth_type == NL80211_AUTHTYPE_IEEE8021X) && 12120 !info->attrs[NL80211_ATTR_AUTH_DATA]) 12121 return -EINVAL; 12122 12123 if (info->attrs[NL80211_ATTR_AUTH_DATA]) { 12124 if (auth_type != NL80211_AUTHTYPE_SAE && 12125 auth_type != NL80211_AUTHTYPE_FILS_SK && 12126 auth_type != NL80211_AUTHTYPE_FILS_SK_PFS && 12127 auth_type != NL80211_AUTHTYPE_FILS_PK && 12128 auth_type != NL80211_AUTHTYPE_EPPKE && 12129 auth_type != NL80211_AUTHTYPE_IEEE8021X) 12130 return -EINVAL; 12131 req.auth_data = nla_data(info->attrs[NL80211_ATTR_AUTH_DATA]); 12132 req.auth_data_len = nla_len(info->attrs[NL80211_ATTR_AUTH_DATA]); 12133 } 12134 12135 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; 12136 12137 /* 12138 * Since we no longer track auth state, ignore 12139 * requests to only change local state. 12140 */ 12141 if (local_state_change) 12142 return 0; 12143 12144 req.auth_type = auth_type; 12145 req.key = key.p.key; 12146 req.key_len = key.p.key_len; 12147 req.key_idx = key.idx; 12148 req.link_id = nl80211_link_id_or_invalid(info->attrs); 12149 if (req.link_id >= 0) { 12150 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_MLO)) 12151 return -EINVAL; 12152 if (!info->attrs[NL80211_ATTR_MLD_ADDR]) 12153 return -EINVAL; 12154 req.ap_mld_addr = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]); 12155 if (!is_valid_ether_addr(req.ap_mld_addr)) 12156 return -EINVAL; 12157 } 12158 12159 req.bss = cfg80211_get_bss(&rdev->wiphy, chan, bssid, ssid, ssid_len, 12160 IEEE80211_BSS_TYPE_ESS, 12161 IEEE80211_PRIVACY_ANY); 12162 if (!req.bss) 12163 return -ENOENT; 12164 12165 err = cfg80211_mlme_auth(rdev, dev, &req); 12166 12167 cfg80211_put_bss(&rdev->wiphy, req.bss); 12168 12169 return err; 12170 } 12171 12172 static int validate_pae_over_nl80211(struct cfg80211_registered_device *rdev, 12173 struct genl_info *info) 12174 { 12175 if (!info->attrs[NL80211_ATTR_SOCKET_OWNER]) { 12176 GENL_SET_ERR_MSG(info, "SOCKET_OWNER not set"); 12177 return -EINVAL; 12178 } 12179 12180 if (!rdev->ops->tx_control_port || 12181 !wiphy_ext_feature_isset(&rdev->wiphy, 12182 NL80211_EXT_FEATURE_CONTROL_PORT_OVER_NL80211)) 12183 return -EOPNOTSUPP; 12184 12185 return 0; 12186 } 12187 12188 static int nl80211_crypto_settings(struct cfg80211_registered_device *rdev, 12189 struct genl_info *info, 12190 struct cfg80211_crypto_settings *settings, 12191 int cipher_limit) 12192 { 12193 memset(settings, 0, sizeof(*settings)); 12194 12195 settings->control_port = info->attrs[NL80211_ATTR_CONTROL_PORT]; 12196 12197 if (info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]) { 12198 u16 proto; 12199 12200 proto = nla_get_u16( 12201 info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]); 12202 settings->control_port_ethertype = cpu_to_be16(proto); 12203 if (!(rdev->wiphy.flags & WIPHY_FLAG_CONTROL_PORT_PROTOCOL) && 12204 proto != ETH_P_PAE) 12205 return -EINVAL; 12206 if (info->attrs[NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT]) 12207 settings->control_port_no_encrypt = true; 12208 } else 12209 settings->control_port_ethertype = cpu_to_be16(ETH_P_PAE); 12210 12211 if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) { 12212 int r = validate_pae_over_nl80211(rdev, info); 12213 12214 if (r < 0) 12215 return r; 12216 12217 settings->control_port_over_nl80211 = true; 12218 12219 if (info->attrs[NL80211_ATTR_CONTROL_PORT_NO_PREAUTH]) 12220 settings->control_port_no_preauth = true; 12221 } 12222 12223 if (info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]) { 12224 void *data; 12225 int len, i; 12226 12227 data = nla_data(info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]); 12228 len = nla_len(info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]); 12229 settings->n_ciphers_pairwise = len / sizeof(u32); 12230 12231 if (len % sizeof(u32)) 12232 return -EINVAL; 12233 12234 if (settings->n_ciphers_pairwise > cipher_limit) 12235 return -EINVAL; 12236 12237 memcpy(settings->ciphers_pairwise, data, len); 12238 12239 for (i = 0; i < settings->n_ciphers_pairwise; i++) 12240 if (!cfg80211_supported_cipher_suite( 12241 &rdev->wiphy, 12242 settings->ciphers_pairwise[i])) 12243 return -EINVAL; 12244 } 12245 12246 if (info->attrs[NL80211_ATTR_CIPHER_SUITE_GROUP]) { 12247 settings->cipher_group = 12248 nla_get_u32(info->attrs[NL80211_ATTR_CIPHER_SUITE_GROUP]); 12249 if (!cfg80211_supported_cipher_suite(&rdev->wiphy, 12250 settings->cipher_group)) 12251 return -EINVAL; 12252 } 12253 12254 if (info->attrs[NL80211_ATTR_WPA_VERSIONS]) 12255 settings->wpa_versions = 12256 nla_get_u32(info->attrs[NL80211_ATTR_WPA_VERSIONS]); 12257 12258 if (info->attrs[NL80211_ATTR_AKM_SUITES]) { 12259 void *data; 12260 int len; 12261 12262 data = nla_data(info->attrs[NL80211_ATTR_AKM_SUITES]); 12263 len = nla_len(info->attrs[NL80211_ATTR_AKM_SUITES]); 12264 settings->n_akm_suites = len / sizeof(u32); 12265 12266 if (len % sizeof(u32)) 12267 return -EINVAL; 12268 12269 if (settings->n_akm_suites > rdev->wiphy.max_num_akm_suites) 12270 return -EINVAL; 12271 12272 memcpy(settings->akm_suites, data, len); 12273 } 12274 12275 if (info->attrs[NL80211_ATTR_PMK]) { 12276 if (nla_len(info->attrs[NL80211_ATTR_PMK]) != WLAN_PMK_LEN) 12277 return -EINVAL; 12278 if (!wiphy_ext_feature_isset(&rdev->wiphy, 12279 NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_PSK) && 12280 !wiphy_ext_feature_isset(&rdev->wiphy, 12281 NL80211_EXT_FEATURE_4WAY_HANDSHAKE_AP_PSK)) 12282 return -EINVAL; 12283 settings->psk = nla_data(info->attrs[NL80211_ATTR_PMK]); 12284 } 12285 12286 if (info->attrs[NL80211_ATTR_SAE_PASSWORD]) { 12287 if (!wiphy_ext_feature_isset(&rdev->wiphy, 12288 NL80211_EXT_FEATURE_SAE_OFFLOAD) && 12289 !wiphy_ext_feature_isset(&rdev->wiphy, 12290 NL80211_EXT_FEATURE_SAE_OFFLOAD_AP)) 12291 return -EINVAL; 12292 settings->sae_pwd = 12293 nla_data(info->attrs[NL80211_ATTR_SAE_PASSWORD]); 12294 settings->sae_pwd_len = 12295 nla_len(info->attrs[NL80211_ATTR_SAE_PASSWORD]); 12296 } 12297 12298 settings->sae_pwe = 12299 nla_get_u8_default(info->attrs[NL80211_ATTR_SAE_PWE], 12300 NL80211_SAE_PWE_UNSPECIFIED); 12301 12302 return 0; 12303 } 12304 12305 static struct cfg80211_bss *nl80211_assoc_bss(struct cfg80211_registered_device *rdev, 12306 const u8 *ssid, int ssid_len, 12307 struct nlattr **attrs, 12308 int assoc_link_id, int link_id) 12309 { 12310 struct ieee80211_channel *chan; 12311 struct cfg80211_bss *bss; 12312 const u8 *bssid; 12313 u32 freq, use_for = 0; 12314 12315 if (!attrs[NL80211_ATTR_MAC] || !attrs[NL80211_ATTR_WIPHY_FREQ]) 12316 return ERR_PTR(-EINVAL); 12317 12318 bssid = nla_data(attrs[NL80211_ATTR_MAC]); 12319 12320 freq = MHZ_TO_KHZ(nla_get_u32(attrs[NL80211_ATTR_WIPHY_FREQ])); 12321 if (attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]) 12322 freq += nla_get_u32(attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]); 12323 12324 chan = nl80211_get_valid_chan(&rdev->wiphy, freq); 12325 if (!chan) 12326 return ERR_PTR(-EINVAL); 12327 12328 if (assoc_link_id >= 0) 12329 use_for = NL80211_BSS_USE_FOR_MLD_LINK; 12330 if (assoc_link_id == link_id) 12331 use_for |= NL80211_BSS_USE_FOR_NORMAL; 12332 12333 bss = __cfg80211_get_bss(&rdev->wiphy, chan, bssid, 12334 ssid, ssid_len, 12335 IEEE80211_BSS_TYPE_ESS, 12336 IEEE80211_PRIVACY_ANY, 12337 use_for); 12338 if (!bss) 12339 return ERR_PTR(-ENOENT); 12340 12341 return bss; 12342 } 12343 12344 static int nl80211_process_links(struct cfg80211_registered_device *rdev, 12345 struct cfg80211_assoc_link *links, 12346 int assoc_link_id, 12347 const u8 *ssid, int ssid_len, 12348 struct genl_info *info) 12349 { 12350 unsigned int attrsize = NUM_NL80211_ATTR * sizeof(struct nlattr *); 12351 struct nlattr **attrs __free(kfree) = kzalloc(attrsize, GFP_KERNEL); 12352 struct nlattr *link; 12353 unsigned int link_id; 12354 int rem, err; 12355 12356 if (!attrs) 12357 return -ENOMEM; 12358 12359 nla_for_each_nested(link, info->attrs[NL80211_ATTR_MLO_LINKS], rem) { 12360 memset(attrs, 0, attrsize); 12361 12362 nla_parse_nested(attrs, NL80211_ATTR_MAX, link, NULL, NULL); 12363 12364 if (!attrs[NL80211_ATTR_MLO_LINK_ID]) { 12365 NL_SET_BAD_ATTR(info->extack, link); 12366 return -EINVAL; 12367 } 12368 12369 link_id = nla_get_u8(attrs[NL80211_ATTR_MLO_LINK_ID]); 12370 /* cannot use the same link ID again */ 12371 if (links[link_id].bss) { 12372 NL_SET_BAD_ATTR(info->extack, link); 12373 return -EINVAL; 12374 } 12375 links[link_id].bss = 12376 nl80211_assoc_bss(rdev, ssid, ssid_len, attrs, 12377 assoc_link_id, link_id); 12378 if (IS_ERR(links[link_id].bss)) { 12379 err = PTR_ERR(links[link_id].bss); 12380 links[link_id].bss = NULL; 12381 NL_SET_ERR_MSG_ATTR(info->extack, link, 12382 "Error fetching BSS for link"); 12383 return err; 12384 } 12385 12386 if (attrs[NL80211_ATTR_IE]) { 12387 links[link_id].elems = nla_data(attrs[NL80211_ATTR_IE]); 12388 links[link_id].elems_len = 12389 nla_len(attrs[NL80211_ATTR_IE]); 12390 12391 if (cfg80211_find_elem(WLAN_EID_FRAGMENT, 12392 links[link_id].elems, 12393 links[link_id].elems_len)) { 12394 NL_SET_ERR_MSG_ATTR(info->extack, 12395 attrs[NL80211_ATTR_IE], 12396 "cannot deal with fragmentation"); 12397 return -EINVAL; 12398 } 12399 12400 if (cfg80211_find_ext_elem(WLAN_EID_EXT_NON_INHERITANCE, 12401 links[link_id].elems, 12402 links[link_id].elems_len)) { 12403 NL_SET_ERR_MSG_ATTR(info->extack, 12404 attrs[NL80211_ATTR_IE], 12405 "cannot deal with non-inheritance"); 12406 return -EINVAL; 12407 } 12408 } 12409 } 12410 12411 return 0; 12412 } 12413 12414 static int nl80211_associate(struct sk_buff *skb, struct genl_info *info) 12415 { 12416 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12417 struct net_device *dev = info->user_ptr[1]; 12418 struct cfg80211_assoc_request req = {}; 12419 const u8 *ap_addr, *ssid; 12420 unsigned int link_id; 12421 int err, ssid_len; 12422 12423 if (dev->ieee80211_ptr->conn_owner_nlportid && 12424 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) 12425 return -EPERM; 12426 12427 if (!info->attrs[NL80211_ATTR_SSID]) 12428 return -EINVAL; 12429 12430 if (!rdev->ops->assoc) 12431 return -EOPNOTSUPP; 12432 12433 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 12434 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 12435 return -EOPNOTSUPP; 12436 12437 ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); 12438 ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); 12439 12440 if (info->attrs[NL80211_ATTR_IE]) { 12441 req.ie = nla_data(info->attrs[NL80211_ATTR_IE]); 12442 req.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 12443 12444 if (cfg80211_find_ext_elem(WLAN_EID_EXT_NON_INHERITANCE, 12445 req.ie, req.ie_len)) { 12446 NL_SET_ERR_MSG_ATTR(info->extack, 12447 info->attrs[NL80211_ATTR_IE], 12448 "non-inheritance makes no sense"); 12449 return -EINVAL; 12450 } 12451 } 12452 12453 if (info->attrs[NL80211_ATTR_USE_MFP]) { 12454 enum nl80211_mfp mfp = 12455 nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]); 12456 if (mfp == NL80211_MFP_REQUIRED) 12457 req.use_mfp = true; 12458 else if (mfp != NL80211_MFP_NO) 12459 return -EINVAL; 12460 } 12461 12462 if (info->attrs[NL80211_ATTR_PREV_BSSID]) 12463 req.prev_bssid = nla_data(info->attrs[NL80211_ATTR_PREV_BSSID]); 12464 12465 if (info->attrs[NL80211_ATTR_SUPPORTED_SELECTORS]) { 12466 req.supported_selectors = 12467 nla_data(info->attrs[NL80211_ATTR_SUPPORTED_SELECTORS]); 12468 req.supported_selectors_len = 12469 nla_len(info->attrs[NL80211_ATTR_SUPPORTED_SELECTORS]); 12470 } 12471 12472 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HT])) 12473 req.flags |= ASSOC_REQ_DISABLE_HT; 12474 12475 if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) 12476 memcpy(&req.ht_capa_mask, 12477 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]), 12478 sizeof(req.ht_capa_mask)); 12479 12480 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) { 12481 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) 12482 return -EINVAL; 12483 memcpy(&req.ht_capa, 12484 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]), 12485 sizeof(req.ht_capa)); 12486 } 12487 12488 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_VHT])) 12489 req.flags |= ASSOC_REQ_DISABLE_VHT; 12490 12491 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HE])) 12492 req.flags |= ASSOC_REQ_DISABLE_HE; 12493 12494 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_EHT])) 12495 req.flags |= ASSOC_REQ_DISABLE_EHT; 12496 12497 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_UHR])) 12498 req.flags |= ASSOC_REQ_DISABLE_UHR; 12499 12500 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) 12501 memcpy(&req.vht_capa_mask, 12502 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]), 12503 sizeof(req.vht_capa_mask)); 12504 12505 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) { 12506 if (!info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) 12507 return -EINVAL; 12508 memcpy(&req.vht_capa, 12509 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]), 12510 sizeof(req.vht_capa)); 12511 } 12512 12513 if (nla_get_flag(info->attrs[NL80211_ATTR_USE_RRM])) { 12514 if (!((rdev->wiphy.features & 12515 NL80211_FEATURE_DS_PARAM_SET_IE_IN_PROBES) && 12516 (rdev->wiphy.features & NL80211_FEATURE_QUIET)) && 12517 !wiphy_ext_feature_isset(&rdev->wiphy, 12518 NL80211_EXT_FEATURE_RRM)) 12519 return -EINVAL; 12520 req.flags |= ASSOC_REQ_USE_RRM; 12521 } 12522 12523 if (info->attrs[NL80211_ATTR_FILS_KEK]) { 12524 req.fils_kek = nla_data(info->attrs[NL80211_ATTR_FILS_KEK]); 12525 req.fils_kek_len = nla_len(info->attrs[NL80211_ATTR_FILS_KEK]); 12526 if (!info->attrs[NL80211_ATTR_FILS_NONCES]) 12527 return -EINVAL; 12528 req.fils_nonces = 12529 nla_data(info->attrs[NL80211_ATTR_FILS_NONCES]); 12530 } 12531 12532 if (info->attrs[NL80211_ATTR_S1G_CAPABILITY_MASK]) { 12533 if (!info->attrs[NL80211_ATTR_S1G_CAPABILITY]) 12534 return -EINVAL; 12535 memcpy(&req.s1g_capa_mask, 12536 nla_data(info->attrs[NL80211_ATTR_S1G_CAPABILITY_MASK]), 12537 sizeof(req.s1g_capa_mask)); 12538 } 12539 12540 if (info->attrs[NL80211_ATTR_S1G_CAPABILITY]) { 12541 if (!info->attrs[NL80211_ATTR_S1G_CAPABILITY_MASK]) 12542 return -EINVAL; 12543 memcpy(&req.s1g_capa, 12544 nla_data(info->attrs[NL80211_ATTR_S1G_CAPABILITY]), 12545 sizeof(req.s1g_capa)); 12546 } 12547 12548 if (nla_get_flag(info->attrs[NL80211_ATTR_ASSOC_SPP_AMSDU])) { 12549 if (!wiphy_ext_feature_isset(&rdev->wiphy, 12550 NL80211_EXT_FEATURE_SPP_AMSDU_SUPPORT)) { 12551 GENL_SET_ERR_MSG(info, "SPP A-MSDUs not supported"); 12552 return -EINVAL; 12553 } 12554 req.flags |= ASSOC_REQ_SPP_AMSDU; 12555 } 12556 12557 req.link_id = nl80211_link_id_or_invalid(info->attrs); 12558 12559 if (info->attrs[NL80211_ATTR_MLO_LINKS]) { 12560 if (req.link_id < 0) 12561 return -EINVAL; 12562 12563 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_MLO)) 12564 return -EINVAL; 12565 12566 if (info->attrs[NL80211_ATTR_MAC] || 12567 info->attrs[NL80211_ATTR_WIPHY_FREQ] || 12568 !info->attrs[NL80211_ATTR_MLD_ADDR]) 12569 return -EINVAL; 12570 12571 req.ap_mld_addr = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]); 12572 ap_addr = req.ap_mld_addr; 12573 12574 err = nl80211_process_links(rdev, req.links, req.link_id, 12575 ssid, ssid_len, info); 12576 if (err) 12577 goto free; 12578 12579 if (!req.links[req.link_id].bss) { 12580 err = -EINVAL; 12581 goto free; 12582 } 12583 12584 if (req.links[req.link_id].elems_len) { 12585 GENL_SET_ERR_MSG(info, 12586 "cannot have per-link elems on assoc link"); 12587 err = -EINVAL; 12588 goto free; 12589 } 12590 12591 if (info->attrs[NL80211_ATTR_ASSOC_MLD_EXT_CAPA_OPS]) 12592 req.ext_mld_capa_ops = 12593 nla_get_u16(info->attrs[NL80211_ATTR_ASSOC_MLD_EXT_CAPA_OPS]); 12594 } else { 12595 if (req.link_id >= 0) 12596 return -EINVAL; 12597 12598 req.bss = nl80211_assoc_bss(rdev, ssid, ssid_len, info->attrs, 12599 -1, -1); 12600 if (IS_ERR(req.bss)) 12601 return PTR_ERR(req.bss); 12602 ap_addr = req.bss->bssid; 12603 12604 if (info->attrs[NL80211_ATTR_ASSOC_MLD_EXT_CAPA_OPS]) 12605 return -EINVAL; 12606 } 12607 12608 err = nl80211_crypto_settings(rdev, info, &req.crypto, 1); 12609 if (!err) { 12610 struct nlattr *link; 12611 int rem = 0; 12612 12613 err = cfg80211_mlme_assoc(rdev, dev, &req, 12614 info->extack); 12615 12616 if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) { 12617 dev->ieee80211_ptr->conn_owner_nlportid = 12618 info->snd_portid; 12619 memcpy(dev->ieee80211_ptr->disconnect_bssid, 12620 ap_addr, ETH_ALEN); 12621 } 12622 12623 /* Report error from first problematic link */ 12624 if (info->attrs[NL80211_ATTR_MLO_LINKS]) { 12625 nla_for_each_nested(link, 12626 info->attrs[NL80211_ATTR_MLO_LINKS], 12627 rem) { 12628 struct nlattr *link_id_attr = 12629 nla_find_nested(link, NL80211_ATTR_MLO_LINK_ID); 12630 12631 if (!link_id_attr) 12632 continue; 12633 12634 link_id = nla_get_u8(link_id_attr); 12635 12636 if (link_id == req.link_id) 12637 continue; 12638 12639 if (!req.links[link_id].error || 12640 WARN_ON(req.links[link_id].error > 0)) 12641 continue; 12642 12643 WARN_ON(err >= 0); 12644 12645 NL_SET_BAD_ATTR(info->extack, link); 12646 err = req.links[link_id].error; 12647 break; 12648 } 12649 } 12650 } 12651 12652 free: 12653 for (link_id = 0; link_id < ARRAY_SIZE(req.links); link_id++) 12654 cfg80211_put_bss(&rdev->wiphy, req.links[link_id].bss); 12655 cfg80211_put_bss(&rdev->wiphy, req.bss); 12656 12657 return err; 12658 } 12659 12660 static int nl80211_deauthenticate(struct sk_buff *skb, struct genl_info *info) 12661 { 12662 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12663 struct net_device *dev = info->user_ptr[1]; 12664 const u8 *ie = NULL, *bssid; 12665 int ie_len = 0; 12666 u16 reason_code; 12667 bool local_state_change; 12668 12669 if (dev->ieee80211_ptr->conn_owner_nlportid && 12670 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) 12671 return -EPERM; 12672 12673 if (!info->attrs[NL80211_ATTR_MAC]) 12674 return -EINVAL; 12675 12676 if (!info->attrs[NL80211_ATTR_REASON_CODE]) 12677 return -EINVAL; 12678 12679 if (!rdev->ops->deauth) 12680 return -EOPNOTSUPP; 12681 12682 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 12683 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 12684 return -EOPNOTSUPP; 12685 12686 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 12687 12688 reason_code = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); 12689 if (reason_code == 0) { 12690 /* Reason Code 0 is reserved */ 12691 return -EINVAL; 12692 } 12693 12694 if (info->attrs[NL80211_ATTR_IE]) { 12695 ie = nla_data(info->attrs[NL80211_ATTR_IE]); 12696 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 12697 } 12698 12699 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; 12700 12701 return cfg80211_mlme_deauth(rdev, dev, bssid, ie, ie_len, reason_code, 12702 local_state_change); 12703 } 12704 12705 static int nl80211_disassociate(struct sk_buff *skb, struct genl_info *info) 12706 { 12707 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12708 struct net_device *dev = info->user_ptr[1]; 12709 const u8 *ie = NULL, *bssid; 12710 int ie_len = 0; 12711 u16 reason_code; 12712 bool local_state_change; 12713 12714 if (dev->ieee80211_ptr->conn_owner_nlportid && 12715 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) 12716 return -EPERM; 12717 12718 if (!info->attrs[NL80211_ATTR_MAC]) 12719 return -EINVAL; 12720 12721 if (!info->attrs[NL80211_ATTR_REASON_CODE]) 12722 return -EINVAL; 12723 12724 if (!rdev->ops->disassoc) 12725 return -EOPNOTSUPP; 12726 12727 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 12728 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 12729 return -EOPNOTSUPP; 12730 12731 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 12732 12733 reason_code = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); 12734 if (reason_code == 0) { 12735 /* Reason Code 0 is reserved */ 12736 return -EINVAL; 12737 } 12738 12739 if (info->attrs[NL80211_ATTR_IE]) { 12740 ie = nla_data(info->attrs[NL80211_ATTR_IE]); 12741 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 12742 } 12743 12744 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; 12745 12746 return cfg80211_mlme_disassoc(rdev, dev, bssid, ie, ie_len, reason_code, 12747 local_state_change); 12748 } 12749 12750 static bool 12751 nl80211_parse_mcast_rate(struct cfg80211_registered_device *rdev, 12752 int mcast_rate[NUM_NL80211_BANDS], 12753 int rateval) 12754 { 12755 struct wiphy *wiphy = &rdev->wiphy; 12756 bool found = false; 12757 int band, i; 12758 12759 for (band = 0; band < NUM_NL80211_BANDS; band++) { 12760 struct ieee80211_supported_band *sband; 12761 12762 sband = wiphy->bands[band]; 12763 if (!sband) 12764 continue; 12765 12766 for (i = 0; i < sband->n_bitrates; i++) { 12767 if (sband->bitrates[i].bitrate == rateval) { 12768 mcast_rate[band] = i + 1; 12769 found = true; 12770 break; 12771 } 12772 } 12773 } 12774 12775 return found; 12776 } 12777 12778 static int nl80211_join_ibss(struct sk_buff *skb, struct genl_info *info) 12779 { 12780 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12781 struct net_device *dev = info->user_ptr[1]; 12782 struct cfg80211_ibss_params ibss; 12783 struct wiphy *wiphy; 12784 struct cfg80211_cached_keys *connkeys = NULL; 12785 int err; 12786 12787 memset(&ibss, 0, sizeof(ibss)); 12788 12789 if (!info->attrs[NL80211_ATTR_SSID] || 12790 !nla_len(info->attrs[NL80211_ATTR_SSID])) 12791 return -EINVAL; 12792 12793 ibss.beacon_interval = 100; 12794 12795 if (info->attrs[NL80211_ATTR_BEACON_INTERVAL]) 12796 ibss.beacon_interval = 12797 nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]); 12798 12799 err = cfg80211_validate_beacon_int(rdev, NL80211_IFTYPE_ADHOC, 12800 ibss.beacon_interval); 12801 if (err) 12802 return err; 12803 12804 if (!rdev->ops->join_ibss) 12805 return -EOPNOTSUPP; 12806 12807 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC) 12808 return -EOPNOTSUPP; 12809 12810 wiphy = &rdev->wiphy; 12811 12812 if (info->attrs[NL80211_ATTR_MAC]) { 12813 ibss.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 12814 12815 if (!is_valid_ether_addr(ibss.bssid)) 12816 return -EINVAL; 12817 } 12818 ibss.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); 12819 ibss.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); 12820 12821 if (info->attrs[NL80211_ATTR_IE]) { 12822 ibss.ie = nla_data(info->attrs[NL80211_ATTR_IE]); 12823 ibss.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 12824 } 12825 12826 err = nl80211_parse_chandef(rdev, info->extack, info->attrs, 12827 &ibss.chandef); 12828 if (err) 12829 return err; 12830 12831 if (!cfg80211_reg_can_beacon(&rdev->wiphy, &ibss.chandef, 12832 NL80211_IFTYPE_ADHOC)) 12833 return -EINVAL; 12834 12835 switch (ibss.chandef.width) { 12836 case NL80211_CHAN_WIDTH_5: 12837 case NL80211_CHAN_WIDTH_10: 12838 case NL80211_CHAN_WIDTH_20_NOHT: 12839 break; 12840 case NL80211_CHAN_WIDTH_20: 12841 case NL80211_CHAN_WIDTH_40: 12842 if (!(rdev->wiphy.features & NL80211_FEATURE_HT_IBSS)) 12843 return -EINVAL; 12844 break; 12845 case NL80211_CHAN_WIDTH_80: 12846 case NL80211_CHAN_WIDTH_80P80: 12847 case NL80211_CHAN_WIDTH_160: 12848 if (!(rdev->wiphy.features & NL80211_FEATURE_HT_IBSS)) 12849 return -EINVAL; 12850 if (!wiphy_ext_feature_isset(&rdev->wiphy, 12851 NL80211_EXT_FEATURE_VHT_IBSS)) 12852 return -EINVAL; 12853 break; 12854 case NL80211_CHAN_WIDTH_320: 12855 return -EINVAL; 12856 default: 12857 return -EINVAL; 12858 } 12859 12860 ibss.channel_fixed = !!info->attrs[NL80211_ATTR_FREQ_FIXED]; 12861 ibss.privacy = !!info->attrs[NL80211_ATTR_PRIVACY]; 12862 12863 if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) { 12864 u8 *rates = 12865 nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); 12866 int n_rates = 12867 nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); 12868 struct ieee80211_supported_band *sband = 12869 wiphy->bands[ibss.chandef.chan->band]; 12870 12871 err = ieee80211_get_ratemask(sband, rates, n_rates, 12872 &ibss.basic_rates); 12873 if (err) 12874 return err; 12875 } 12876 12877 if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) 12878 memcpy(&ibss.ht_capa_mask, 12879 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]), 12880 sizeof(ibss.ht_capa_mask)); 12881 12882 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) { 12883 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) 12884 return -EINVAL; 12885 memcpy(&ibss.ht_capa, 12886 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]), 12887 sizeof(ibss.ht_capa)); 12888 } 12889 12890 if (info->attrs[NL80211_ATTR_MCAST_RATE] && 12891 !nl80211_parse_mcast_rate(rdev, ibss.mcast_rate, 12892 nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]))) 12893 return -EINVAL; 12894 12895 if (ibss.privacy && info->attrs[NL80211_ATTR_KEYS]) { 12896 bool no_ht = false; 12897 12898 connkeys = nl80211_parse_connkeys(rdev, info, &no_ht); 12899 if (IS_ERR(connkeys)) 12900 return PTR_ERR(connkeys); 12901 12902 if ((ibss.chandef.width != NL80211_CHAN_WIDTH_20_NOHT) && 12903 no_ht) { 12904 kfree_sensitive(connkeys); 12905 return -EINVAL; 12906 } 12907 } 12908 12909 ibss.control_port = 12910 nla_get_flag(info->attrs[NL80211_ATTR_CONTROL_PORT]); 12911 12912 if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) { 12913 int r = validate_pae_over_nl80211(rdev, info); 12914 12915 if (r < 0) { 12916 kfree_sensitive(connkeys); 12917 return r; 12918 } 12919 12920 ibss.control_port_over_nl80211 = true; 12921 } 12922 12923 ibss.userspace_handles_dfs = 12924 nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS]); 12925 12926 err = __cfg80211_join_ibss(rdev, dev, &ibss, connkeys); 12927 if (err) 12928 kfree_sensitive(connkeys); 12929 else if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) 12930 dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid; 12931 12932 return err; 12933 } 12934 12935 static int nl80211_leave_ibss(struct sk_buff *skb, struct genl_info *info) 12936 { 12937 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12938 struct net_device *dev = info->user_ptr[1]; 12939 12940 if (!rdev->ops->leave_ibss) 12941 return -EOPNOTSUPP; 12942 12943 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC) 12944 return -EOPNOTSUPP; 12945 12946 return cfg80211_leave_ibss(rdev, dev, false); 12947 } 12948 12949 static int nl80211_set_mcast_rate(struct sk_buff *skb, struct genl_info *info) 12950 { 12951 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12952 struct net_device *dev = info->user_ptr[1]; 12953 int mcast_rate[NUM_NL80211_BANDS]; 12954 u32 nla_rate; 12955 12956 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC && 12957 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT && 12958 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_OCB) 12959 return -EOPNOTSUPP; 12960 12961 if (!rdev->ops->set_mcast_rate) 12962 return -EOPNOTSUPP; 12963 12964 memset(mcast_rate, 0, sizeof(mcast_rate)); 12965 12966 if (!info->attrs[NL80211_ATTR_MCAST_RATE]) 12967 return -EINVAL; 12968 12969 nla_rate = nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]); 12970 if (!nl80211_parse_mcast_rate(rdev, mcast_rate, nla_rate)) 12971 return -EINVAL; 12972 12973 return rdev_set_mcast_rate(rdev, dev, mcast_rate); 12974 } 12975 12976 static struct sk_buff * 12977 __cfg80211_alloc_vendor_skb(struct cfg80211_registered_device *rdev, 12978 struct wireless_dev *wdev, int approxlen, 12979 u32 portid, u32 seq, enum nl80211_commands cmd, 12980 enum nl80211_attrs attr, 12981 const struct nl80211_vendor_cmd_info *info, 12982 gfp_t gfp) 12983 { 12984 struct sk_buff *skb; 12985 void *hdr; 12986 struct nlattr *data; 12987 12988 skb = nlmsg_new(approxlen + 100, gfp); 12989 if (!skb) 12990 return NULL; 12991 12992 hdr = nl80211hdr_put(skb, portid, seq, 0, cmd); 12993 if (!hdr) { 12994 kfree_skb(skb); 12995 return NULL; 12996 } 12997 12998 if (nla_put_u32(skb, NL80211_ATTR_WIPHY, rdev->wiphy_idx)) 12999 goto nla_put_failure; 13000 13001 if (info) { 13002 if (nla_put_u32(skb, NL80211_ATTR_VENDOR_ID, 13003 info->vendor_id)) 13004 goto nla_put_failure; 13005 if (nla_put_u32(skb, NL80211_ATTR_VENDOR_SUBCMD, 13006 info->subcmd)) 13007 goto nla_put_failure; 13008 } 13009 13010 if (wdev) { 13011 if (nla_put_u64_64bit(skb, NL80211_ATTR_WDEV, 13012 wdev_id(wdev), NL80211_ATTR_PAD)) 13013 goto nla_put_failure; 13014 if (wdev->netdev && 13015 nla_put_u32(skb, NL80211_ATTR_IFINDEX, 13016 wdev->netdev->ifindex)) 13017 goto nla_put_failure; 13018 } 13019 13020 data = nla_nest_start_noflag(skb, attr); 13021 if (!data) 13022 goto nla_put_failure; 13023 13024 ((void **)skb->cb)[0] = rdev; 13025 ((void **)skb->cb)[1] = hdr; 13026 ((void **)skb->cb)[2] = data; 13027 13028 return skb; 13029 13030 nla_put_failure: 13031 kfree_skb(skb); 13032 return NULL; 13033 } 13034 13035 struct sk_buff *__cfg80211_alloc_event_skb(struct wiphy *wiphy, 13036 struct wireless_dev *wdev, 13037 enum nl80211_commands cmd, 13038 enum nl80211_attrs attr, 13039 unsigned int portid, 13040 int vendor_event_idx, 13041 int approxlen, gfp_t gfp) 13042 { 13043 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 13044 const struct nl80211_vendor_cmd_info *info; 13045 13046 switch (cmd) { 13047 case NL80211_CMD_TESTMODE: 13048 if (WARN_ON(vendor_event_idx != -1)) 13049 return NULL; 13050 info = NULL; 13051 break; 13052 case NL80211_CMD_VENDOR: 13053 if (WARN_ON(vendor_event_idx < 0 || 13054 vendor_event_idx >= wiphy->n_vendor_events)) 13055 return NULL; 13056 info = &wiphy->vendor_events[vendor_event_idx]; 13057 break; 13058 default: 13059 WARN_ON(1); 13060 return NULL; 13061 } 13062 13063 return __cfg80211_alloc_vendor_skb(rdev, wdev, approxlen, portid, 0, 13064 cmd, attr, info, gfp); 13065 } 13066 EXPORT_SYMBOL(__cfg80211_alloc_event_skb); 13067 13068 void __cfg80211_send_event_skb(struct sk_buff *skb, gfp_t gfp) 13069 { 13070 struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0]; 13071 void *hdr = ((void **)skb->cb)[1]; 13072 struct nlmsghdr *nlhdr = nlmsg_hdr(skb); 13073 struct nlattr *data = ((void **)skb->cb)[2]; 13074 enum nl80211_multicast_groups mcgrp = NL80211_MCGRP_TESTMODE; 13075 13076 /* clear CB data for netlink core to own from now on */ 13077 memset(skb->cb, 0, sizeof(skb->cb)); 13078 13079 nla_nest_end(skb, data); 13080 genlmsg_end(skb, hdr); 13081 13082 if (nlhdr->nlmsg_pid) { 13083 genlmsg_unicast(wiphy_net(&rdev->wiphy), skb, 13084 nlhdr->nlmsg_pid); 13085 } else { 13086 if (data->nla_type == NL80211_ATTR_VENDOR_DATA) 13087 mcgrp = NL80211_MCGRP_VENDOR; 13088 13089 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), 13090 skb, 0, mcgrp, gfp); 13091 } 13092 } 13093 EXPORT_SYMBOL(__cfg80211_send_event_skb); 13094 13095 #ifdef CONFIG_NL80211_TESTMODE 13096 static int nl80211_testmode_do(struct sk_buff *skb, struct genl_info *info) 13097 { 13098 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13099 struct wireless_dev *wdev; 13100 int err; 13101 13102 lockdep_assert_held(&rdev->wiphy.mtx); 13103 13104 wdev = __cfg80211_wdev_from_attrs(rdev, genl_info_net(info), 13105 info->attrs); 13106 13107 if (!rdev->ops->testmode_cmd) 13108 return -EOPNOTSUPP; 13109 13110 if (IS_ERR(wdev)) { 13111 err = PTR_ERR(wdev); 13112 if (err != -EINVAL) 13113 return err; 13114 wdev = NULL; 13115 } else if (wdev->wiphy != &rdev->wiphy) { 13116 return -EINVAL; 13117 } 13118 13119 if (!info->attrs[NL80211_ATTR_TESTDATA]) 13120 return -EINVAL; 13121 13122 rdev->cur_cmd_info = info; 13123 err = rdev_testmode_cmd(rdev, wdev, 13124 nla_data(info->attrs[NL80211_ATTR_TESTDATA]), 13125 nla_len(info->attrs[NL80211_ATTR_TESTDATA])); 13126 rdev->cur_cmd_info = NULL; 13127 13128 return err; 13129 } 13130 13131 static int nl80211_testmode_dump(struct sk_buff *skb, 13132 struct netlink_callback *cb) 13133 { 13134 struct cfg80211_registered_device *rdev; 13135 struct nlattr **attrbuf = NULL; 13136 int err; 13137 long phy_idx; 13138 void *data = NULL; 13139 int data_len = 0; 13140 13141 rtnl_lock(); 13142 13143 if (cb->args[0]) { 13144 /* 13145 * 0 is a valid index, but not valid for args[0], 13146 * so we need to offset by 1. 13147 */ 13148 phy_idx = cb->args[0] - 1; 13149 13150 rdev = cfg80211_rdev_by_wiphy_idx(phy_idx); 13151 if (!rdev) { 13152 err = -ENOENT; 13153 goto out_err; 13154 } 13155 } else { 13156 attrbuf = kzalloc_objs(*attrbuf, NUM_NL80211_ATTR); 13157 if (!attrbuf) { 13158 err = -ENOMEM; 13159 goto out_err; 13160 } 13161 13162 err = nlmsg_parse_deprecated(cb->nlh, 13163 GENL_HDRLEN + nl80211_fam.hdrsize, 13164 attrbuf, nl80211_fam.maxattr, 13165 nl80211_policy, NULL); 13166 if (err) 13167 goto out_err; 13168 13169 rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk), attrbuf); 13170 if (IS_ERR(rdev)) { 13171 err = PTR_ERR(rdev); 13172 goto out_err; 13173 } 13174 phy_idx = rdev->wiphy_idx; 13175 13176 if (attrbuf[NL80211_ATTR_TESTDATA]) 13177 cb->args[1] = (long)attrbuf[NL80211_ATTR_TESTDATA]; 13178 } 13179 13180 if (cb->args[1]) { 13181 data = nla_data((void *)cb->args[1]); 13182 data_len = nla_len((void *)cb->args[1]); 13183 } 13184 13185 if (!rdev->ops->testmode_dump) { 13186 err = -EOPNOTSUPP; 13187 goto out_err; 13188 } 13189 13190 while (1) { 13191 void *hdr = nl80211hdr_put(skb, NETLINK_CB(cb->skb).portid, 13192 cb->nlh->nlmsg_seq, NLM_F_MULTI, 13193 NL80211_CMD_TESTMODE); 13194 struct nlattr *tmdata; 13195 13196 if (!hdr) 13197 break; 13198 13199 if (nla_put_u32(skb, NL80211_ATTR_WIPHY, phy_idx)) { 13200 genlmsg_cancel(skb, hdr); 13201 break; 13202 } 13203 13204 tmdata = nla_nest_start_noflag(skb, NL80211_ATTR_TESTDATA); 13205 if (!tmdata) { 13206 genlmsg_cancel(skb, hdr); 13207 break; 13208 } 13209 err = rdev_testmode_dump(rdev, skb, cb, data, data_len); 13210 nla_nest_end(skb, tmdata); 13211 13212 if (err == -ENOBUFS || err == -ENOENT) { 13213 genlmsg_cancel(skb, hdr); 13214 break; 13215 } else if (err) { 13216 genlmsg_cancel(skb, hdr); 13217 goto out_err; 13218 } 13219 13220 genlmsg_end(skb, hdr); 13221 } 13222 13223 err = skb->len; 13224 /* see above */ 13225 cb->args[0] = phy_idx + 1; 13226 out_err: 13227 kfree(attrbuf); 13228 rtnl_unlock(); 13229 return err; 13230 } 13231 #endif 13232 13233 static int nl80211_connect(struct sk_buff *skb, struct genl_info *info) 13234 { 13235 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13236 struct net_device *dev = info->user_ptr[1]; 13237 struct cfg80211_connect_params connect; 13238 struct wiphy *wiphy; 13239 struct cfg80211_cached_keys *connkeys = NULL; 13240 u32 freq = 0; 13241 int err; 13242 13243 memset(&connect, 0, sizeof(connect)); 13244 13245 if (!info->attrs[NL80211_ATTR_SSID] || 13246 !nla_len(info->attrs[NL80211_ATTR_SSID])) 13247 return -EINVAL; 13248 13249 if (info->attrs[NL80211_ATTR_AUTH_TYPE]) { 13250 connect.auth_type = 13251 nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]); 13252 if (!nl80211_valid_auth_type(rdev, connect.auth_type, 13253 NL80211_CMD_CONNECT)) 13254 return -EINVAL; 13255 } else 13256 connect.auth_type = NL80211_AUTHTYPE_AUTOMATIC; 13257 13258 connect.privacy = info->attrs[NL80211_ATTR_PRIVACY]; 13259 13260 if (info->attrs[NL80211_ATTR_WANT_1X_4WAY_HS] && 13261 !wiphy_ext_feature_isset(&rdev->wiphy, 13262 NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_1X)) 13263 return -EINVAL; 13264 connect.want_1x = info->attrs[NL80211_ATTR_WANT_1X_4WAY_HS]; 13265 13266 err = nl80211_crypto_settings(rdev, info, &connect.crypto, 13267 NL80211_MAX_NR_CIPHER_SUITES); 13268 if (err) 13269 return err; 13270 13271 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 13272 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 13273 return -EOPNOTSUPP; 13274 13275 wiphy = &rdev->wiphy; 13276 13277 connect.bg_scan_period = -1; 13278 if (info->attrs[NL80211_ATTR_BG_SCAN_PERIOD] && 13279 (wiphy->flags & WIPHY_FLAG_SUPPORTS_FW_ROAM)) { 13280 connect.bg_scan_period = 13281 nla_get_u16(info->attrs[NL80211_ATTR_BG_SCAN_PERIOD]); 13282 } 13283 13284 if (info->attrs[NL80211_ATTR_MAC]) 13285 connect.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 13286 else if (info->attrs[NL80211_ATTR_MAC_HINT]) 13287 connect.bssid_hint = 13288 nla_data(info->attrs[NL80211_ATTR_MAC_HINT]); 13289 connect.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); 13290 connect.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); 13291 13292 if (info->attrs[NL80211_ATTR_IE]) { 13293 connect.ie = nla_data(info->attrs[NL80211_ATTR_IE]); 13294 connect.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 13295 } 13296 13297 if (info->attrs[NL80211_ATTR_USE_MFP]) { 13298 connect.mfp = nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]); 13299 if (connect.mfp == NL80211_MFP_OPTIONAL && 13300 !wiphy_ext_feature_isset(&rdev->wiphy, 13301 NL80211_EXT_FEATURE_MFP_OPTIONAL)) 13302 return -EOPNOTSUPP; 13303 } else { 13304 connect.mfp = NL80211_MFP_NO; 13305 } 13306 13307 if (info->attrs[NL80211_ATTR_PREV_BSSID]) 13308 connect.prev_bssid = 13309 nla_data(info->attrs[NL80211_ATTR_PREV_BSSID]); 13310 13311 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) 13312 freq = MHZ_TO_KHZ(nla_get_u32( 13313 info->attrs[NL80211_ATTR_WIPHY_FREQ])); 13314 if (info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]) 13315 freq += 13316 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]); 13317 13318 if (freq) { 13319 connect.channel = nl80211_get_valid_chan(wiphy, freq); 13320 if (!connect.channel) 13321 return -EINVAL; 13322 } else if (info->attrs[NL80211_ATTR_WIPHY_FREQ_HINT]) { 13323 freq = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_HINT]); 13324 freq = MHZ_TO_KHZ(freq); 13325 connect.channel_hint = nl80211_get_valid_chan(wiphy, freq); 13326 if (!connect.channel_hint) 13327 return -EINVAL; 13328 } 13329 13330 if (info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]) { 13331 connect.edmg.channels = 13332 nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]); 13333 13334 if (info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]) 13335 connect.edmg.bw_config = 13336 nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]); 13337 } 13338 13339 if (connect.privacy && info->attrs[NL80211_ATTR_KEYS]) { 13340 connkeys = nl80211_parse_connkeys(rdev, info, NULL); 13341 if (IS_ERR(connkeys)) 13342 return PTR_ERR(connkeys); 13343 } 13344 13345 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HT])) 13346 connect.flags |= ASSOC_REQ_DISABLE_HT; 13347 13348 if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) 13349 memcpy(&connect.ht_capa_mask, 13350 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]), 13351 sizeof(connect.ht_capa_mask)); 13352 13353 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) { 13354 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) { 13355 kfree_sensitive(connkeys); 13356 return -EINVAL; 13357 } 13358 memcpy(&connect.ht_capa, 13359 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]), 13360 sizeof(connect.ht_capa)); 13361 } 13362 13363 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_VHT])) 13364 connect.flags |= ASSOC_REQ_DISABLE_VHT; 13365 13366 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HE])) 13367 connect.flags |= ASSOC_REQ_DISABLE_HE; 13368 13369 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_EHT])) 13370 connect.flags |= ASSOC_REQ_DISABLE_EHT; 13371 13372 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_UHR])) 13373 connect.flags |= ASSOC_REQ_DISABLE_UHR; 13374 13375 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) 13376 memcpy(&connect.vht_capa_mask, 13377 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]), 13378 sizeof(connect.vht_capa_mask)); 13379 13380 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) { 13381 if (!info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) { 13382 kfree_sensitive(connkeys); 13383 return -EINVAL; 13384 } 13385 memcpy(&connect.vht_capa, 13386 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]), 13387 sizeof(connect.vht_capa)); 13388 } 13389 13390 if (nla_get_flag(info->attrs[NL80211_ATTR_USE_RRM])) { 13391 if (!((rdev->wiphy.features & 13392 NL80211_FEATURE_DS_PARAM_SET_IE_IN_PROBES) && 13393 (rdev->wiphy.features & NL80211_FEATURE_QUIET)) && 13394 !wiphy_ext_feature_isset(&rdev->wiphy, 13395 NL80211_EXT_FEATURE_RRM)) { 13396 kfree_sensitive(connkeys); 13397 return -EINVAL; 13398 } 13399 connect.flags |= ASSOC_REQ_USE_RRM; 13400 } 13401 13402 connect.pbss = nla_get_flag(info->attrs[NL80211_ATTR_PBSS]); 13403 if (connect.pbss && !rdev->wiphy.bands[NL80211_BAND_60GHZ]) { 13404 kfree_sensitive(connkeys); 13405 return -EOPNOTSUPP; 13406 } 13407 13408 if (info->attrs[NL80211_ATTR_BSS_SELECT]) { 13409 /* bss selection makes no sense if bssid is set */ 13410 if (connect.bssid) { 13411 kfree_sensitive(connkeys); 13412 return -EINVAL; 13413 } 13414 13415 err = parse_bss_select(info->attrs[NL80211_ATTR_BSS_SELECT], 13416 wiphy, &connect.bss_select); 13417 if (err) { 13418 kfree_sensitive(connkeys); 13419 return err; 13420 } 13421 } 13422 13423 if (wiphy_ext_feature_isset(&rdev->wiphy, 13424 NL80211_EXT_FEATURE_FILS_SK_OFFLOAD) && 13425 info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] && 13426 info->attrs[NL80211_ATTR_FILS_ERP_REALM] && 13427 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] && 13428 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { 13429 connect.fils_erp_username = 13430 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); 13431 connect.fils_erp_username_len = 13432 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); 13433 connect.fils_erp_realm = 13434 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); 13435 connect.fils_erp_realm_len = 13436 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); 13437 connect.fils_erp_next_seq_num = 13438 nla_get_u16( 13439 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM]); 13440 connect.fils_erp_rrk = 13441 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); 13442 connect.fils_erp_rrk_len = 13443 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); 13444 } else if (info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] || 13445 info->attrs[NL80211_ATTR_FILS_ERP_REALM] || 13446 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] || 13447 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { 13448 kfree_sensitive(connkeys); 13449 return -EINVAL; 13450 } 13451 13452 if (nla_get_flag(info->attrs[NL80211_ATTR_EXTERNAL_AUTH_SUPPORT])) { 13453 if (!info->attrs[NL80211_ATTR_SOCKET_OWNER]) { 13454 kfree_sensitive(connkeys); 13455 GENL_SET_ERR_MSG(info, 13456 "external auth requires connection ownership"); 13457 return -EINVAL; 13458 } 13459 connect.flags |= CONNECT_REQ_EXTERNAL_AUTH_SUPPORT; 13460 } 13461 13462 if (nla_get_flag(info->attrs[NL80211_ATTR_MLO_SUPPORT])) 13463 connect.flags |= CONNECT_REQ_MLO_SUPPORT; 13464 13465 err = cfg80211_connect(rdev, dev, &connect, connkeys, 13466 connect.prev_bssid); 13467 if (err) 13468 kfree_sensitive(connkeys); 13469 13470 if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) { 13471 dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid; 13472 if (connect.bssid) 13473 memcpy(dev->ieee80211_ptr->disconnect_bssid, 13474 connect.bssid, ETH_ALEN); 13475 else 13476 eth_zero_addr(dev->ieee80211_ptr->disconnect_bssid); 13477 } 13478 13479 return err; 13480 } 13481 13482 static int nl80211_update_connect_params(struct sk_buff *skb, 13483 struct genl_info *info) 13484 { 13485 struct cfg80211_connect_params connect = {}; 13486 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13487 struct net_device *dev = info->user_ptr[1]; 13488 struct wireless_dev *wdev = dev->ieee80211_ptr; 13489 bool fils_sk_offload; 13490 u32 auth_type; 13491 u32 changed = 0; 13492 13493 if (!rdev->ops->update_connect_params) 13494 return -EOPNOTSUPP; 13495 13496 if (info->attrs[NL80211_ATTR_IE]) { 13497 connect.ie = nla_data(info->attrs[NL80211_ATTR_IE]); 13498 connect.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 13499 changed |= UPDATE_ASSOC_IES; 13500 } 13501 13502 fils_sk_offload = wiphy_ext_feature_isset(&rdev->wiphy, 13503 NL80211_EXT_FEATURE_FILS_SK_OFFLOAD); 13504 13505 /* 13506 * when driver supports fils-sk offload all attributes must be 13507 * provided. So the else covers "fils-sk-not-all" and 13508 * "no-fils-sk-any". 13509 */ 13510 if (fils_sk_offload && 13511 info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] && 13512 info->attrs[NL80211_ATTR_FILS_ERP_REALM] && 13513 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] && 13514 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { 13515 connect.fils_erp_username = 13516 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); 13517 connect.fils_erp_username_len = 13518 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); 13519 connect.fils_erp_realm = 13520 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); 13521 connect.fils_erp_realm_len = 13522 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); 13523 connect.fils_erp_next_seq_num = 13524 nla_get_u16( 13525 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM]); 13526 connect.fils_erp_rrk = 13527 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); 13528 connect.fils_erp_rrk_len = 13529 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); 13530 changed |= UPDATE_FILS_ERP_INFO; 13531 } else if (info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] || 13532 info->attrs[NL80211_ATTR_FILS_ERP_REALM] || 13533 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] || 13534 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { 13535 return -EINVAL; 13536 } 13537 13538 if (info->attrs[NL80211_ATTR_AUTH_TYPE]) { 13539 auth_type = nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]); 13540 if (!nl80211_valid_auth_type(rdev, auth_type, 13541 NL80211_CMD_CONNECT)) 13542 return -EINVAL; 13543 13544 if (auth_type == NL80211_AUTHTYPE_FILS_SK && 13545 fils_sk_offload && !(changed & UPDATE_FILS_ERP_INFO)) 13546 return -EINVAL; 13547 13548 connect.auth_type = auth_type; 13549 changed |= UPDATE_AUTH_TYPE; 13550 } 13551 13552 if (!wdev->connected) 13553 return -ENOLINK; 13554 13555 return rdev_update_connect_params(rdev, dev, &connect, changed); 13556 } 13557 13558 static int nl80211_disconnect(struct sk_buff *skb, struct genl_info *info) 13559 { 13560 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13561 struct net_device *dev = info->user_ptr[1]; 13562 u16 reason; 13563 13564 if (dev->ieee80211_ptr->conn_owner_nlportid && 13565 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) 13566 return -EPERM; 13567 13568 reason = nla_get_u16_default(info->attrs[NL80211_ATTR_REASON_CODE], 13569 WLAN_REASON_DEAUTH_LEAVING); 13570 13571 if (reason == 0) 13572 return -EINVAL; 13573 13574 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 13575 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 13576 return -EOPNOTSUPP; 13577 13578 return cfg80211_disconnect(rdev, dev, reason, true); 13579 } 13580 13581 static int nl80211_wiphy_netns(struct sk_buff *skb, struct genl_info *info) 13582 { 13583 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13584 struct net *net; 13585 int err; 13586 13587 if (info->attrs[NL80211_ATTR_PID]) { 13588 u32 pid = nla_get_u32(info->attrs[NL80211_ATTR_PID]); 13589 13590 net = get_net_ns_by_pid(pid); 13591 } else if (info->attrs[NL80211_ATTR_NETNS_FD]) { 13592 u32 fd = nla_get_u32(info->attrs[NL80211_ATTR_NETNS_FD]); 13593 13594 net = get_net_ns_by_fd(fd); 13595 } else { 13596 return -EINVAL; 13597 } 13598 13599 if (IS_ERR(net)) 13600 return PTR_ERR(net); 13601 13602 err = 0; 13603 13604 /* check if anything to do */ 13605 if (!net_eq(wiphy_net(&rdev->wiphy), net)) 13606 err = cfg80211_switch_netns(rdev, net); 13607 13608 put_net(net); 13609 return err; 13610 } 13611 13612 static int nl80211_set_pmksa(struct sk_buff *skb, struct genl_info *info) 13613 { 13614 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13615 struct net_device *dev = info->user_ptr[1]; 13616 struct cfg80211_pmksa pmksa; 13617 bool ap_pmksa_caching_support = false; 13618 13619 memset(&pmksa, 0, sizeof(struct cfg80211_pmksa)); 13620 13621 ap_pmksa_caching_support = wiphy_ext_feature_isset(&rdev->wiphy, 13622 NL80211_EXT_FEATURE_AP_PMKSA_CACHING); 13623 13624 if (!info->attrs[NL80211_ATTR_PMKID]) 13625 return -EINVAL; 13626 13627 pmksa.pmkid = nla_data(info->attrs[NL80211_ATTR_PMKID]); 13628 13629 if (info->attrs[NL80211_ATTR_MAC]) { 13630 pmksa.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 13631 } else if (info->attrs[NL80211_ATTR_SSID] && 13632 info->attrs[NL80211_ATTR_FILS_CACHE_ID] && 13633 info->attrs[NL80211_ATTR_PMK]) { 13634 pmksa.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); 13635 pmksa.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); 13636 pmksa.cache_id = nla_data(info->attrs[NL80211_ATTR_FILS_CACHE_ID]); 13637 } else { 13638 return -EINVAL; 13639 } 13640 13641 if (info->attrs[NL80211_ATTR_PMK]) { 13642 pmksa.pmk = nla_data(info->attrs[NL80211_ATTR_PMK]); 13643 pmksa.pmk_len = nla_len(info->attrs[NL80211_ATTR_PMK]); 13644 } 13645 13646 if (info->attrs[NL80211_ATTR_PMK_LIFETIME]) 13647 pmksa.pmk_lifetime = 13648 nla_get_u32(info->attrs[NL80211_ATTR_PMK_LIFETIME]); 13649 13650 if (info->attrs[NL80211_ATTR_PMK_REAUTH_THRESHOLD]) 13651 pmksa.pmk_reauth_threshold = 13652 nla_get_u8(info->attrs[NL80211_ATTR_PMK_REAUTH_THRESHOLD]); 13653 13654 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 13655 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT && 13656 !((dev->ieee80211_ptr->iftype == NL80211_IFTYPE_AP || 13657 dev->ieee80211_ptr->iftype == NL80211_IFTYPE_P2P_GO) && 13658 ap_pmksa_caching_support)) 13659 return -EOPNOTSUPP; 13660 13661 if (!rdev->ops->set_pmksa) 13662 return -EOPNOTSUPP; 13663 13664 return rdev_set_pmksa(rdev, dev, &pmksa); 13665 } 13666 13667 static int nl80211_del_pmksa(struct sk_buff *skb, struct genl_info *info) 13668 { 13669 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13670 struct net_device *dev = info->user_ptr[1]; 13671 struct cfg80211_pmksa pmksa; 13672 bool sae_offload_support = false; 13673 bool owe_offload_support = false; 13674 bool ap_pmksa_caching_support = false; 13675 13676 memset(&pmksa, 0, sizeof(struct cfg80211_pmksa)); 13677 13678 sae_offload_support = wiphy_ext_feature_isset(&rdev->wiphy, 13679 NL80211_EXT_FEATURE_SAE_OFFLOAD); 13680 owe_offload_support = wiphy_ext_feature_isset(&rdev->wiphy, 13681 NL80211_EXT_FEATURE_OWE_OFFLOAD); 13682 ap_pmksa_caching_support = wiphy_ext_feature_isset(&rdev->wiphy, 13683 NL80211_EXT_FEATURE_AP_PMKSA_CACHING); 13684 13685 if (info->attrs[NL80211_ATTR_PMKID]) 13686 pmksa.pmkid = nla_data(info->attrs[NL80211_ATTR_PMKID]); 13687 13688 if (info->attrs[NL80211_ATTR_MAC]) { 13689 pmksa.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 13690 } else if (info->attrs[NL80211_ATTR_SSID]) { 13691 /* SSID based pmksa flush supported only for FILS, 13692 * OWE/SAE OFFLOAD cases 13693 */ 13694 if (info->attrs[NL80211_ATTR_FILS_CACHE_ID] && 13695 info->attrs[NL80211_ATTR_PMK]) { 13696 pmksa.cache_id = nla_data(info->attrs[NL80211_ATTR_FILS_CACHE_ID]); 13697 } else if (!sae_offload_support && !owe_offload_support) { 13698 return -EINVAL; 13699 } 13700 pmksa.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); 13701 pmksa.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); 13702 } else { 13703 return -EINVAL; 13704 } 13705 13706 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 13707 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT && 13708 !((dev->ieee80211_ptr->iftype == NL80211_IFTYPE_AP || 13709 dev->ieee80211_ptr->iftype == NL80211_IFTYPE_P2P_GO) && 13710 ap_pmksa_caching_support)) 13711 return -EOPNOTSUPP; 13712 13713 if (!rdev->ops->del_pmksa) 13714 return -EOPNOTSUPP; 13715 13716 return rdev_del_pmksa(rdev, dev, &pmksa); 13717 } 13718 13719 static int nl80211_flush_pmksa(struct sk_buff *skb, struct genl_info *info) 13720 { 13721 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13722 struct net_device *dev = info->user_ptr[1]; 13723 13724 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 13725 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 13726 return -EOPNOTSUPP; 13727 13728 if (!rdev->ops->flush_pmksa) 13729 return -EOPNOTSUPP; 13730 13731 return rdev_flush_pmksa(rdev, dev); 13732 } 13733 13734 static int nl80211_tdls_mgmt(struct sk_buff *skb, struct genl_info *info) 13735 { 13736 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13737 struct net_device *dev = info->user_ptr[1]; 13738 u8 action_code, dialog_token; 13739 u32 peer_capability = 0; 13740 u16 status_code; 13741 u8 *peer; 13742 int link_id; 13743 bool initiator; 13744 13745 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) || 13746 !rdev->ops->tdls_mgmt) 13747 return -EOPNOTSUPP; 13748 13749 if (!info->attrs[NL80211_ATTR_TDLS_ACTION] || 13750 !info->attrs[NL80211_ATTR_STATUS_CODE] || 13751 !info->attrs[NL80211_ATTR_TDLS_DIALOG_TOKEN] || 13752 !info->attrs[NL80211_ATTR_IE] || 13753 !info->attrs[NL80211_ATTR_MAC]) 13754 return -EINVAL; 13755 13756 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); 13757 action_code = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_ACTION]); 13758 status_code = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]); 13759 dialog_token = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_DIALOG_TOKEN]); 13760 initiator = nla_get_flag(info->attrs[NL80211_ATTR_TDLS_INITIATOR]); 13761 if (info->attrs[NL80211_ATTR_TDLS_PEER_CAPABILITY]) 13762 peer_capability = 13763 nla_get_u32(info->attrs[NL80211_ATTR_TDLS_PEER_CAPABILITY]); 13764 link_id = nl80211_link_id_or_invalid(info->attrs); 13765 13766 return rdev_tdls_mgmt(rdev, dev, peer, link_id, action_code, 13767 dialog_token, status_code, peer_capability, 13768 initiator, 13769 nla_data(info->attrs[NL80211_ATTR_IE]), 13770 nla_len(info->attrs[NL80211_ATTR_IE])); 13771 } 13772 13773 static int nl80211_tdls_oper(struct sk_buff *skb, struct genl_info *info) 13774 { 13775 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13776 struct net_device *dev = info->user_ptr[1]; 13777 enum nl80211_tdls_operation operation; 13778 u8 *peer; 13779 13780 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) || 13781 !rdev->ops->tdls_oper) 13782 return -EOPNOTSUPP; 13783 13784 if (!info->attrs[NL80211_ATTR_TDLS_OPERATION] || 13785 !info->attrs[NL80211_ATTR_MAC]) 13786 return -EINVAL; 13787 13788 operation = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_OPERATION]); 13789 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); 13790 13791 return rdev_tdls_oper(rdev, dev, peer, operation); 13792 } 13793 13794 static int nl80211_remain_on_channel(struct sk_buff *skb, 13795 struct genl_info *info) 13796 { 13797 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13798 unsigned int link_id = nl80211_link_id(info->attrs); 13799 struct wireless_dev *wdev = info->user_ptr[1]; 13800 struct cfg80211_chan_def chandef; 13801 struct sk_buff *msg; 13802 void *hdr; 13803 u64 cookie; 13804 u32 duration; 13805 int err; 13806 13807 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ] || 13808 !info->attrs[NL80211_ATTR_DURATION]) 13809 return -EINVAL; 13810 13811 duration = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]); 13812 13813 if (!rdev->ops->remain_on_channel || 13814 !(rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL)) 13815 return -EOPNOTSUPP; 13816 13817 /* 13818 * We should be on that channel for at least a minimum amount of 13819 * time (10ms) but no longer than the driver supports. 13820 */ 13821 if (duration < NL80211_MIN_REMAIN_ON_CHANNEL_TIME || 13822 duration > rdev->wiphy.max_remain_on_channel_duration) 13823 return -EINVAL; 13824 13825 err = nl80211_parse_chandef(rdev, info->extack, info->attrs, &chandef); 13826 if (err) 13827 return err; 13828 13829 if (!cfg80211_off_channel_oper_allowed(wdev, chandef.chan)) { 13830 const struct cfg80211_chan_def *oper_chandef, *compat_chandef; 13831 13832 oper_chandef = wdev_chandef(wdev, link_id); 13833 13834 if (WARN_ON(!oper_chandef)) { 13835 /* cannot happen since we must beacon to get here */ 13836 WARN_ON(1); 13837 return -EBUSY; 13838 } 13839 13840 /* note: returns first one if identical chandefs */ 13841 compat_chandef = cfg80211_chandef_compatible(&chandef, 13842 oper_chandef); 13843 13844 if (compat_chandef != &chandef) 13845 return -EBUSY; 13846 } 13847 13848 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 13849 if (!msg) 13850 return -ENOMEM; 13851 13852 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 13853 NL80211_CMD_REMAIN_ON_CHANNEL); 13854 if (!hdr) { 13855 err = -ENOBUFS; 13856 goto free_msg; 13857 } 13858 13859 err = rdev_remain_on_channel(rdev, wdev, chandef.chan, 13860 duration, &cookie); 13861 13862 if (err) 13863 goto free_msg; 13864 13865 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie, 13866 NL80211_ATTR_PAD)) 13867 goto nla_put_failure; 13868 13869 genlmsg_end(msg, hdr); 13870 13871 return genlmsg_reply(msg, info); 13872 13873 nla_put_failure: 13874 err = -ENOBUFS; 13875 free_msg: 13876 nlmsg_free(msg); 13877 return err; 13878 } 13879 13880 static int nl80211_cancel_remain_on_channel(struct sk_buff *skb, 13881 struct genl_info *info) 13882 { 13883 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13884 struct wireless_dev *wdev = info->user_ptr[1]; 13885 u64 cookie; 13886 13887 if (!info->attrs[NL80211_ATTR_COOKIE]) 13888 return -EINVAL; 13889 13890 if (!rdev->ops->cancel_remain_on_channel) 13891 return -EOPNOTSUPP; 13892 13893 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); 13894 13895 return rdev_cancel_remain_on_channel(rdev, wdev, cookie); 13896 } 13897 13898 static int nl80211_set_tx_bitrate_mask(struct sk_buff *skb, 13899 struct genl_info *info) 13900 { 13901 struct cfg80211_bitrate_mask mask; 13902 unsigned int link_id = nl80211_link_id(info->attrs); 13903 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13904 struct net_device *dev = info->user_ptr[1]; 13905 int err; 13906 13907 if (!rdev->ops->set_bitrate_mask) 13908 return -EOPNOTSUPP; 13909 13910 err = nl80211_parse_tx_bitrate_mask(info, info->attrs, 13911 NL80211_ATTR_TX_RATES, &mask, 13912 dev, true, link_id); 13913 if (err) 13914 return err; 13915 13916 return rdev_set_bitrate_mask(rdev, dev, link_id, NULL, &mask); 13917 } 13918 13919 static int nl80211_register_mgmt(struct sk_buff *skb, struct genl_info *info) 13920 { 13921 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13922 struct wireless_dev *wdev = info->user_ptr[1]; 13923 u16 frame_type = IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ACTION; 13924 13925 if (!info->attrs[NL80211_ATTR_FRAME_MATCH]) 13926 return -EINVAL; 13927 13928 if (info->attrs[NL80211_ATTR_FRAME_TYPE]) 13929 frame_type = nla_get_u16(info->attrs[NL80211_ATTR_FRAME_TYPE]); 13930 13931 switch (wdev->iftype) { 13932 case NL80211_IFTYPE_STATION: 13933 case NL80211_IFTYPE_ADHOC: 13934 case NL80211_IFTYPE_P2P_CLIENT: 13935 case NL80211_IFTYPE_AP: 13936 case NL80211_IFTYPE_AP_VLAN: 13937 case NL80211_IFTYPE_MESH_POINT: 13938 case NL80211_IFTYPE_P2P_GO: 13939 case NL80211_IFTYPE_P2P_DEVICE: 13940 break; 13941 case NL80211_IFTYPE_NAN: 13942 if (!wiphy_ext_feature_isset(wdev->wiphy, 13943 NL80211_EXT_FEATURE_SECURE_NAN) && 13944 !(wdev->wiphy->nan_capa.flags & 13945 WIPHY_NAN_FLAGS_USERSPACE_DE)) 13946 return -EOPNOTSUPP; 13947 break; 13948 default: 13949 return -EOPNOTSUPP; 13950 } 13951 13952 /* not much point in registering if we can't reply */ 13953 if (!rdev->ops->mgmt_tx) 13954 return -EOPNOTSUPP; 13955 13956 if (info->attrs[NL80211_ATTR_RECEIVE_MULTICAST] && 13957 !wiphy_ext_feature_isset(&rdev->wiphy, 13958 NL80211_EXT_FEATURE_MULTICAST_REGISTRATIONS)) { 13959 GENL_SET_ERR_MSG(info, 13960 "multicast RX registrations are not supported"); 13961 return -EOPNOTSUPP; 13962 } 13963 13964 return cfg80211_mlme_register_mgmt(wdev, info->snd_portid, frame_type, 13965 nla_data(info->attrs[NL80211_ATTR_FRAME_MATCH]), 13966 nla_len(info->attrs[NL80211_ATTR_FRAME_MATCH]), 13967 info->attrs[NL80211_ATTR_RECEIVE_MULTICAST], 13968 info->extack); 13969 } 13970 13971 static int nl80211_tx_mgmt(struct sk_buff *skb, struct genl_info *info) 13972 { 13973 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13974 struct wireless_dev *wdev = info->user_ptr[1]; 13975 struct cfg80211_chan_def chandef; 13976 int err; 13977 void *hdr = NULL; 13978 u64 cookie; 13979 struct sk_buff *msg = NULL; 13980 struct cfg80211_mgmt_tx_params params = { 13981 .dont_wait_for_ack = 13982 info->attrs[NL80211_ATTR_DONT_WAIT_FOR_ACK], 13983 }; 13984 13985 if (!info->attrs[NL80211_ATTR_FRAME]) 13986 return -EINVAL; 13987 13988 if (!rdev->ops->mgmt_tx) 13989 return -EOPNOTSUPP; 13990 13991 switch (wdev->iftype) { 13992 case NL80211_IFTYPE_P2P_DEVICE: 13993 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ]) 13994 return -EINVAL; 13995 break; 13996 case NL80211_IFTYPE_STATION: 13997 case NL80211_IFTYPE_ADHOC: 13998 case NL80211_IFTYPE_P2P_CLIENT: 13999 case NL80211_IFTYPE_AP: 14000 case NL80211_IFTYPE_AP_VLAN: 14001 case NL80211_IFTYPE_MESH_POINT: 14002 case NL80211_IFTYPE_P2P_GO: 14003 break; 14004 case NL80211_IFTYPE_NAN: 14005 if (!wiphy_ext_feature_isset(wdev->wiphy, 14006 NL80211_EXT_FEATURE_SECURE_NAN) && 14007 !(wdev->wiphy->nan_capa.flags & 14008 WIPHY_NAN_FLAGS_USERSPACE_DE)) 14009 return -EOPNOTSUPP; 14010 break; 14011 default: 14012 return -EOPNOTSUPP; 14013 } 14014 14015 if (info->attrs[NL80211_ATTR_DURATION]) { 14016 if (!(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX)) 14017 return -EINVAL; 14018 params.wait = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]); 14019 14020 /* 14021 * We should wait on the channel for at least a minimum amount 14022 * of time (10ms) but no longer than the driver supports. 14023 */ 14024 if (params.wait < NL80211_MIN_REMAIN_ON_CHANNEL_TIME || 14025 params.wait > rdev->wiphy.max_remain_on_channel_duration) 14026 return -EINVAL; 14027 } 14028 14029 params.offchan = info->attrs[NL80211_ATTR_OFFCHANNEL_TX_OK]; 14030 14031 if (params.offchan && !(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX)) 14032 return -EINVAL; 14033 14034 params.no_cck = nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]); 14035 14036 /* get the channel if any has been specified, otherwise pass NULL to 14037 * the driver. The latter will use the current one 14038 */ 14039 chandef.chan = NULL; 14040 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { 14041 err = nl80211_parse_chandef(rdev, info->extack, info->attrs, 14042 &chandef); 14043 if (err) 14044 return err; 14045 } 14046 14047 if (!chandef.chan && params.offchan) 14048 return -EINVAL; 14049 14050 if (params.offchan && 14051 !cfg80211_off_channel_oper_allowed(wdev, chandef.chan)) 14052 return -EBUSY; 14053 14054 params.link_id = nl80211_link_id_or_invalid(info->attrs); 14055 /* 14056 * This now races due to the unlock, but we cannot check 14057 * the valid links for the _station_ anyway, so that's up 14058 * to the driver. 14059 */ 14060 if (params.link_id >= 0 && 14061 !(wdev->valid_links & BIT(params.link_id))) 14062 return -EINVAL; 14063 14064 params.buf = nla_data(info->attrs[NL80211_ATTR_FRAME]); 14065 params.len = nla_len(info->attrs[NL80211_ATTR_FRAME]); 14066 14067 err = nl80211_parse_counter_offsets(rdev, NULL, params.len, -1, 14068 info->attrs[NL80211_ATTR_CSA_C_OFFSETS_TX], 14069 ¶ms.csa_offsets, 14070 ¶ms.n_csa_offsets); 14071 if (err) 14072 return err; 14073 14074 if (!params.dont_wait_for_ack) { 14075 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 14076 if (!msg) 14077 return -ENOMEM; 14078 14079 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 14080 NL80211_CMD_FRAME); 14081 if (!hdr) { 14082 err = -ENOBUFS; 14083 goto free_msg; 14084 } 14085 } 14086 14087 params.chan = chandef.chan; 14088 err = cfg80211_mlme_mgmt_tx(rdev, wdev, ¶ms, &cookie); 14089 if (err) 14090 goto free_msg; 14091 14092 if (msg) { 14093 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie, 14094 NL80211_ATTR_PAD)) 14095 goto nla_put_failure; 14096 14097 genlmsg_end(msg, hdr); 14098 return genlmsg_reply(msg, info); 14099 } 14100 14101 return 0; 14102 14103 nla_put_failure: 14104 err = -ENOBUFS; 14105 free_msg: 14106 nlmsg_free(msg); 14107 return err; 14108 } 14109 14110 static int nl80211_tx_mgmt_cancel_wait(struct sk_buff *skb, struct genl_info *info) 14111 { 14112 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14113 struct wireless_dev *wdev = info->user_ptr[1]; 14114 u64 cookie; 14115 14116 if (!info->attrs[NL80211_ATTR_COOKIE]) 14117 return -EINVAL; 14118 14119 if (!rdev->ops->mgmt_tx_cancel_wait) 14120 return -EOPNOTSUPP; 14121 14122 switch (wdev->iftype) { 14123 case NL80211_IFTYPE_STATION: 14124 case NL80211_IFTYPE_ADHOC: 14125 case NL80211_IFTYPE_P2P_CLIENT: 14126 case NL80211_IFTYPE_AP: 14127 case NL80211_IFTYPE_AP_VLAN: 14128 case NL80211_IFTYPE_P2P_GO: 14129 case NL80211_IFTYPE_P2P_DEVICE: 14130 break; 14131 case NL80211_IFTYPE_NAN: 14132 if (!wiphy_ext_feature_isset(wdev->wiphy, 14133 NL80211_EXT_FEATURE_SECURE_NAN)) 14134 return -EOPNOTSUPP; 14135 break; 14136 default: 14137 return -EOPNOTSUPP; 14138 } 14139 14140 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); 14141 14142 return rdev_mgmt_tx_cancel_wait(rdev, wdev, cookie); 14143 } 14144 14145 static int nl80211_set_power_save(struct sk_buff *skb, struct genl_info *info) 14146 { 14147 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14148 struct wireless_dev *wdev; 14149 struct net_device *dev = info->user_ptr[1]; 14150 u8 ps_state; 14151 bool state; 14152 int err; 14153 14154 if (!info->attrs[NL80211_ATTR_PS_STATE]) 14155 return -EINVAL; 14156 14157 ps_state = nla_get_u32(info->attrs[NL80211_ATTR_PS_STATE]); 14158 14159 wdev = dev->ieee80211_ptr; 14160 14161 if (!rdev->ops->set_power_mgmt) 14162 return -EOPNOTSUPP; 14163 14164 state = (ps_state == NL80211_PS_ENABLED) ? true : false; 14165 14166 if (state == wdev->ps) 14167 return 0; 14168 14169 err = rdev_set_power_mgmt(rdev, dev, state, wdev->ps_timeout); 14170 if (!err) 14171 wdev->ps = state; 14172 return err; 14173 } 14174 14175 static int nl80211_get_power_save(struct sk_buff *skb, struct genl_info *info) 14176 { 14177 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14178 enum nl80211_ps_state ps_state; 14179 struct wireless_dev *wdev; 14180 struct net_device *dev = info->user_ptr[1]; 14181 struct sk_buff *msg; 14182 void *hdr; 14183 int err; 14184 14185 wdev = dev->ieee80211_ptr; 14186 14187 if (!rdev->ops->set_power_mgmt) 14188 return -EOPNOTSUPP; 14189 14190 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 14191 if (!msg) 14192 return -ENOMEM; 14193 14194 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 14195 NL80211_CMD_GET_POWER_SAVE); 14196 if (!hdr) { 14197 err = -ENOBUFS; 14198 goto free_msg; 14199 } 14200 14201 if (wdev->ps) 14202 ps_state = NL80211_PS_ENABLED; 14203 else 14204 ps_state = NL80211_PS_DISABLED; 14205 14206 if (nla_put_u32(msg, NL80211_ATTR_PS_STATE, ps_state)) 14207 goto nla_put_failure; 14208 14209 genlmsg_end(msg, hdr); 14210 return genlmsg_reply(msg, info); 14211 14212 nla_put_failure: 14213 err = -ENOBUFS; 14214 free_msg: 14215 nlmsg_free(msg); 14216 return err; 14217 } 14218 14219 static const struct nla_policy 14220 nl80211_attr_cqm_policy[NL80211_ATTR_CQM_MAX + 1] = { 14221 [NL80211_ATTR_CQM_RSSI_THOLD] = { .type = NLA_BINARY }, 14222 [NL80211_ATTR_CQM_RSSI_HYST] = { .type = NLA_U32 }, 14223 [NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT] = { .type = NLA_U32 }, 14224 [NL80211_ATTR_CQM_TXE_RATE] = { .type = NLA_U32 }, 14225 [NL80211_ATTR_CQM_TXE_PKTS] = { .type = NLA_U32 }, 14226 [NL80211_ATTR_CQM_TXE_INTVL] = { .type = NLA_U32 }, 14227 [NL80211_ATTR_CQM_RSSI_LEVEL] = { .type = NLA_S32 }, 14228 }; 14229 14230 static int nl80211_set_cqm_txe(struct genl_info *info, 14231 u32 rate, u32 pkts, u32 intvl) 14232 { 14233 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14234 struct net_device *dev = info->user_ptr[1]; 14235 struct wireless_dev *wdev = dev->ieee80211_ptr; 14236 14237 if (rate > 100 || intvl > NL80211_CQM_TXE_MAX_INTVL) 14238 return -EINVAL; 14239 14240 if (!rdev->ops->set_cqm_txe_config) 14241 return -EOPNOTSUPP; 14242 14243 if (wdev->iftype != NL80211_IFTYPE_STATION && 14244 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) 14245 return -EOPNOTSUPP; 14246 14247 return rdev_set_cqm_txe_config(rdev, dev, rate, pkts, intvl); 14248 } 14249 14250 static int cfg80211_cqm_rssi_update(struct cfg80211_registered_device *rdev, 14251 struct net_device *dev, 14252 struct cfg80211_cqm_config *cqm_config) 14253 { 14254 struct wireless_dev *wdev = dev->ieee80211_ptr; 14255 s32 last, low, high; 14256 u32 hyst; 14257 int i, n, low_index; 14258 int err; 14259 14260 /* 14261 * Obtain current RSSI value if possible, if not and no RSSI threshold 14262 * event has been received yet, we should receive an event after a 14263 * connection is established and enough beacons received to calculate 14264 * the average. 14265 */ 14266 if (!cqm_config->last_rssi_event_value && 14267 wdev->links[0].client.current_bss && 14268 rdev->ops->get_station) { 14269 struct station_info sinfo = {}; 14270 u8 *mac_addr; 14271 14272 mac_addr = wdev->links[0].client.current_bss->pub.bssid; 14273 14274 err = rdev_get_station(rdev, wdev, mac_addr, &sinfo); 14275 if (err) 14276 return err; 14277 14278 cfg80211_sinfo_release_content(&sinfo); 14279 if (sinfo.filled & BIT_ULL(NL80211_STA_INFO_BEACON_SIGNAL_AVG)) 14280 cqm_config->last_rssi_event_value = 14281 (s8) sinfo.rx_beacon_signal_avg; 14282 } 14283 14284 last = cqm_config->last_rssi_event_value; 14285 hyst = cqm_config->rssi_hyst; 14286 n = cqm_config->n_rssi_thresholds; 14287 14288 for (i = 0; i < n; i++) { 14289 i = array_index_nospec(i, n); 14290 if (last < cqm_config->rssi_thresholds[i]) 14291 break; 14292 } 14293 14294 low_index = i - 1; 14295 if (low_index >= 0) { 14296 low_index = array_index_nospec(low_index, n); 14297 low = cqm_config->rssi_thresholds[low_index] - hyst; 14298 } else { 14299 low = S32_MIN; 14300 } 14301 if (i < n) { 14302 i = array_index_nospec(i, n); 14303 high = cqm_config->rssi_thresholds[i] + hyst - 1; 14304 } else { 14305 high = S32_MAX; 14306 } 14307 14308 return rdev_set_cqm_rssi_range_config(rdev, dev, low, high); 14309 } 14310 14311 static int nl80211_set_cqm_rssi(struct genl_info *info, 14312 const s32 *thresholds, int n_thresholds, 14313 u32 hysteresis) 14314 { 14315 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14316 struct cfg80211_cqm_config *cqm_config = NULL, *old; 14317 struct net_device *dev = info->user_ptr[1]; 14318 struct wireless_dev *wdev = dev->ieee80211_ptr; 14319 s32 prev = S32_MIN; 14320 int i, err; 14321 14322 /* Check all values negative and sorted */ 14323 for (i = 0; i < n_thresholds; i++) { 14324 if (thresholds[i] > 0 || thresholds[i] <= prev) 14325 return -EINVAL; 14326 14327 prev = thresholds[i]; 14328 } 14329 14330 if (wdev->iftype != NL80211_IFTYPE_STATION && 14331 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) 14332 return -EOPNOTSUPP; 14333 14334 if (n_thresholds == 1 && thresholds[0] == 0) /* Disabling */ 14335 n_thresholds = 0; 14336 14337 old = wiphy_dereference(wdev->wiphy, wdev->cqm_config); 14338 14339 /* if already disabled just succeed */ 14340 if (!n_thresholds && !old) 14341 return 0; 14342 14343 if (n_thresholds > 1) { 14344 if (!wiphy_ext_feature_isset(&rdev->wiphy, 14345 NL80211_EXT_FEATURE_CQM_RSSI_LIST) || 14346 !rdev->ops->set_cqm_rssi_range_config) 14347 return -EOPNOTSUPP; 14348 } else { 14349 if (!rdev->ops->set_cqm_rssi_config) 14350 return -EOPNOTSUPP; 14351 } 14352 14353 if (n_thresholds) { 14354 cqm_config = kzalloc_flex(*cqm_config, rssi_thresholds, 14355 n_thresholds); 14356 if (!cqm_config) 14357 return -ENOMEM; 14358 14359 cqm_config->rssi_hyst = hysteresis; 14360 cqm_config->n_rssi_thresholds = n_thresholds; 14361 memcpy(cqm_config->rssi_thresholds, thresholds, 14362 flex_array_size(cqm_config, rssi_thresholds, 14363 n_thresholds)); 14364 cqm_config->use_range_api = n_thresholds > 1 || 14365 !rdev->ops->set_cqm_rssi_config; 14366 14367 rcu_assign_pointer(wdev->cqm_config, cqm_config); 14368 14369 if (cqm_config->use_range_api) 14370 err = cfg80211_cqm_rssi_update(rdev, dev, cqm_config); 14371 else 14372 err = rdev_set_cqm_rssi_config(rdev, dev, 14373 thresholds[0], 14374 hysteresis); 14375 } else { 14376 RCU_INIT_POINTER(wdev->cqm_config, NULL); 14377 /* if enabled as range also disable via range */ 14378 if (old->use_range_api) 14379 err = rdev_set_cqm_rssi_range_config(rdev, dev, 0, 0); 14380 else 14381 err = rdev_set_cqm_rssi_config(rdev, dev, 0, 0); 14382 } 14383 14384 if (err) { 14385 rcu_assign_pointer(wdev->cqm_config, old); 14386 kfree_rcu(cqm_config, rcu_head); 14387 } else { 14388 kfree_rcu(old, rcu_head); 14389 } 14390 14391 return err; 14392 } 14393 14394 static int nl80211_set_cqm(struct sk_buff *skb, struct genl_info *info) 14395 { 14396 struct nlattr *attrs[NL80211_ATTR_CQM_MAX + 1]; 14397 struct nlattr *cqm; 14398 int err; 14399 14400 cqm = info->attrs[NL80211_ATTR_CQM]; 14401 if (!cqm) 14402 return -EINVAL; 14403 14404 err = nla_parse_nested_deprecated(attrs, NL80211_ATTR_CQM_MAX, cqm, 14405 nl80211_attr_cqm_policy, 14406 info->extack); 14407 if (err) 14408 return err; 14409 14410 if (attrs[NL80211_ATTR_CQM_RSSI_THOLD] && 14411 attrs[NL80211_ATTR_CQM_RSSI_HYST]) { 14412 const s32 *thresholds = 14413 nla_data(attrs[NL80211_ATTR_CQM_RSSI_THOLD]); 14414 int len = nla_len(attrs[NL80211_ATTR_CQM_RSSI_THOLD]); 14415 u32 hysteresis = nla_get_u32(attrs[NL80211_ATTR_CQM_RSSI_HYST]); 14416 14417 if (len % 4) 14418 return -EINVAL; 14419 14420 return nl80211_set_cqm_rssi(info, thresholds, len / 4, 14421 hysteresis); 14422 } 14423 14424 if (attrs[NL80211_ATTR_CQM_TXE_RATE] && 14425 attrs[NL80211_ATTR_CQM_TXE_PKTS] && 14426 attrs[NL80211_ATTR_CQM_TXE_INTVL]) { 14427 u32 rate = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_RATE]); 14428 u32 pkts = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_PKTS]); 14429 u32 intvl = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_INTVL]); 14430 14431 return nl80211_set_cqm_txe(info, rate, pkts, intvl); 14432 } 14433 14434 return -EINVAL; 14435 } 14436 14437 static int nl80211_join_ocb(struct sk_buff *skb, struct genl_info *info) 14438 { 14439 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14440 struct net_device *dev = info->user_ptr[1]; 14441 struct ocb_setup setup = {}; 14442 int err; 14443 14444 err = nl80211_parse_chandef(rdev, info->extack, info->attrs, 14445 &setup.chandef); 14446 if (err) 14447 return err; 14448 14449 return cfg80211_join_ocb(rdev, dev, &setup); 14450 } 14451 14452 static int nl80211_leave_ocb(struct sk_buff *skb, struct genl_info *info) 14453 { 14454 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14455 struct net_device *dev = info->user_ptr[1]; 14456 14457 return cfg80211_leave_ocb(rdev, dev); 14458 } 14459 14460 static int nl80211_join_mesh(struct sk_buff *skb, struct genl_info *info) 14461 { 14462 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14463 struct net_device *dev = info->user_ptr[1]; 14464 struct mesh_config cfg; 14465 struct mesh_setup setup; 14466 int err; 14467 14468 /* start with default */ 14469 memcpy(&cfg, &default_mesh_config, sizeof(cfg)); 14470 memcpy(&setup, &default_mesh_setup, sizeof(setup)); 14471 14472 if (info->attrs[NL80211_ATTR_MESH_CONFIG]) { 14473 /* and parse parameters if given */ 14474 err = nl80211_parse_mesh_config(info, &cfg, NULL); 14475 if (err) 14476 return err; 14477 } 14478 14479 if (!info->attrs[NL80211_ATTR_MESH_ID] || 14480 !nla_len(info->attrs[NL80211_ATTR_MESH_ID])) 14481 return -EINVAL; 14482 14483 setup.mesh_id = nla_data(info->attrs[NL80211_ATTR_MESH_ID]); 14484 setup.mesh_id_len = nla_len(info->attrs[NL80211_ATTR_MESH_ID]); 14485 14486 if (info->attrs[NL80211_ATTR_MCAST_RATE] && 14487 !nl80211_parse_mcast_rate(rdev, setup.mcast_rate, 14488 nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]))) 14489 return -EINVAL; 14490 14491 if (info->attrs[NL80211_ATTR_BEACON_INTERVAL]) { 14492 setup.beacon_interval = 14493 nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]); 14494 14495 err = cfg80211_validate_beacon_int(rdev, 14496 NL80211_IFTYPE_MESH_POINT, 14497 setup.beacon_interval); 14498 if (err) 14499 return err; 14500 } 14501 14502 if (info->attrs[NL80211_ATTR_DTIM_PERIOD]) { 14503 setup.dtim_period = 14504 nla_get_u32(info->attrs[NL80211_ATTR_DTIM_PERIOD]); 14505 if (setup.dtim_period < 1 || setup.dtim_period > 100) 14506 return -EINVAL; 14507 } 14508 14509 if (info->attrs[NL80211_ATTR_MESH_SETUP]) { 14510 /* parse additional setup parameters if given */ 14511 err = nl80211_parse_mesh_setup(info, &setup); 14512 if (err) 14513 return err; 14514 } 14515 14516 if (setup.user_mpm) 14517 cfg.auto_open_plinks = false; 14518 14519 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { 14520 err = nl80211_parse_chandef(rdev, info->extack, info->attrs, 14521 &setup.chandef); 14522 if (err) 14523 return err; 14524 } else { 14525 /* __cfg80211_join_mesh() will sort it out */ 14526 setup.chandef.chan = NULL; 14527 } 14528 14529 if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) { 14530 u8 *rates = nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); 14531 int n_rates = 14532 nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); 14533 struct ieee80211_supported_band *sband; 14534 14535 if (!setup.chandef.chan) 14536 return -EINVAL; 14537 14538 sband = rdev->wiphy.bands[setup.chandef.chan->band]; 14539 14540 err = ieee80211_get_ratemask(sband, rates, n_rates, 14541 &setup.basic_rates); 14542 if (err) 14543 return err; 14544 } 14545 14546 if (info->attrs[NL80211_ATTR_TX_RATES]) { 14547 err = nl80211_parse_tx_bitrate_mask(info, info->attrs, 14548 NL80211_ATTR_TX_RATES, 14549 &setup.beacon_rate, 14550 dev, false, 0); 14551 if (err) 14552 return err; 14553 14554 if (!setup.chandef.chan) 14555 return -EINVAL; 14556 14557 err = validate_beacon_tx_rate(rdev, setup.chandef.chan->band, 14558 &setup.beacon_rate); 14559 if (err) 14560 return err; 14561 } 14562 14563 setup.userspace_handles_dfs = 14564 nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS]); 14565 14566 if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) { 14567 int r = validate_pae_over_nl80211(rdev, info); 14568 14569 if (r < 0) 14570 return r; 14571 14572 setup.control_port_over_nl80211 = true; 14573 } 14574 14575 err = __cfg80211_join_mesh(rdev, dev, &setup, &cfg); 14576 if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) 14577 dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid; 14578 14579 return err; 14580 } 14581 14582 static int nl80211_leave_mesh(struct sk_buff *skb, struct genl_info *info) 14583 { 14584 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14585 struct net_device *dev = info->user_ptr[1]; 14586 14587 return cfg80211_leave_mesh(rdev, dev); 14588 } 14589 14590 #ifdef CONFIG_PM 14591 static int nl80211_send_wowlan_patterns(struct sk_buff *msg, 14592 struct cfg80211_registered_device *rdev) 14593 { 14594 struct cfg80211_wowlan *wowlan = rdev->wiphy.wowlan_config; 14595 struct nlattr *nl_pats, *nl_pat; 14596 int i, pat_len; 14597 14598 if (!wowlan->n_patterns) 14599 return 0; 14600 14601 nl_pats = nla_nest_start_noflag(msg, NL80211_WOWLAN_TRIG_PKT_PATTERN); 14602 if (!nl_pats) 14603 return -ENOBUFS; 14604 14605 for (i = 0; i < wowlan->n_patterns; i++) { 14606 nl_pat = nla_nest_start_noflag(msg, i + 1); 14607 if (!nl_pat) 14608 return -ENOBUFS; 14609 pat_len = wowlan->patterns[i].pattern_len; 14610 if (nla_put(msg, NL80211_PKTPAT_MASK, DIV_ROUND_UP(pat_len, 8), 14611 wowlan->patterns[i].mask) || 14612 nla_put(msg, NL80211_PKTPAT_PATTERN, pat_len, 14613 wowlan->patterns[i].pattern) || 14614 nla_put_u32(msg, NL80211_PKTPAT_OFFSET, 14615 wowlan->patterns[i].pkt_offset)) 14616 return -ENOBUFS; 14617 nla_nest_end(msg, nl_pat); 14618 } 14619 nla_nest_end(msg, nl_pats); 14620 14621 return 0; 14622 } 14623 14624 static int nl80211_send_wowlan_tcp(struct sk_buff *msg, 14625 struct cfg80211_wowlan_tcp *tcp) 14626 { 14627 struct nlattr *nl_tcp; 14628 14629 if (!tcp) 14630 return 0; 14631 14632 nl_tcp = nla_nest_start_noflag(msg, 14633 NL80211_WOWLAN_TRIG_TCP_CONNECTION); 14634 if (!nl_tcp) 14635 return -ENOBUFS; 14636 14637 if (nla_put_in_addr(msg, NL80211_WOWLAN_TCP_SRC_IPV4, tcp->src) || 14638 nla_put_in_addr(msg, NL80211_WOWLAN_TCP_DST_IPV4, tcp->dst) || 14639 nla_put(msg, NL80211_WOWLAN_TCP_DST_MAC, ETH_ALEN, tcp->dst_mac) || 14640 nla_put_u16(msg, NL80211_WOWLAN_TCP_SRC_PORT, tcp->src_port) || 14641 nla_put_u16(msg, NL80211_WOWLAN_TCP_DST_PORT, tcp->dst_port) || 14642 nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD, 14643 tcp->payload_len, tcp->payload) || 14644 nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_INTERVAL, 14645 tcp->data_interval) || 14646 nla_put(msg, NL80211_WOWLAN_TCP_WAKE_PAYLOAD, 14647 tcp->wake_len, tcp->wake_data) || 14648 nla_put(msg, NL80211_WOWLAN_TCP_WAKE_MASK, 14649 DIV_ROUND_UP(tcp->wake_len, 8), tcp->wake_mask)) 14650 return -ENOBUFS; 14651 14652 if (tcp->payload_seq.len && 14653 nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ, 14654 sizeof(tcp->payload_seq), &tcp->payload_seq)) 14655 return -ENOBUFS; 14656 14657 if (tcp->payload_tok.len && 14658 nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN, 14659 sizeof(tcp->payload_tok) + tcp->tokens_size, 14660 &tcp->payload_tok)) 14661 return -ENOBUFS; 14662 14663 nla_nest_end(msg, nl_tcp); 14664 14665 return 0; 14666 } 14667 14668 static int nl80211_send_wowlan_nd(struct sk_buff *msg, 14669 struct cfg80211_sched_scan_request *req) 14670 { 14671 struct nlattr *nd, *freqs, *matches, *match, *scan_plans, *scan_plan; 14672 int i; 14673 14674 if (!req) 14675 return 0; 14676 14677 nd = nla_nest_start_noflag(msg, NL80211_WOWLAN_TRIG_NET_DETECT); 14678 if (!nd) 14679 return -ENOBUFS; 14680 14681 if (req->n_scan_plans == 1 && 14682 nla_put_u32(msg, NL80211_ATTR_SCHED_SCAN_INTERVAL, 14683 req->scan_plans[0].interval * 1000)) 14684 return -ENOBUFS; 14685 14686 if (nla_put_u32(msg, NL80211_ATTR_SCHED_SCAN_DELAY, req->delay)) 14687 return -ENOBUFS; 14688 14689 if (req->relative_rssi_set) { 14690 struct nl80211_bss_select_rssi_adjust rssi_adjust; 14691 14692 if (nla_put_s8(msg, NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI, 14693 req->relative_rssi)) 14694 return -ENOBUFS; 14695 14696 rssi_adjust.band = req->rssi_adjust.band; 14697 rssi_adjust.delta = req->rssi_adjust.delta; 14698 if (nla_put(msg, NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST, 14699 sizeof(rssi_adjust), &rssi_adjust)) 14700 return -ENOBUFS; 14701 } 14702 14703 freqs = nla_nest_start_noflag(msg, NL80211_ATTR_SCAN_FREQUENCIES); 14704 if (!freqs) 14705 return -ENOBUFS; 14706 14707 for (i = 0; i < req->n_channels; i++) { 14708 if (nla_put_u32(msg, i, req->channels[i]->center_freq)) 14709 return -ENOBUFS; 14710 } 14711 14712 nla_nest_end(msg, freqs); 14713 14714 if (req->n_match_sets) { 14715 matches = nla_nest_start_noflag(msg, 14716 NL80211_ATTR_SCHED_SCAN_MATCH); 14717 if (!matches) 14718 return -ENOBUFS; 14719 14720 for (i = 0; i < req->n_match_sets; i++) { 14721 match = nla_nest_start_noflag(msg, i); 14722 if (!match) 14723 return -ENOBUFS; 14724 14725 if (nla_put(msg, NL80211_SCHED_SCAN_MATCH_ATTR_SSID, 14726 req->match_sets[i].ssid.ssid_len, 14727 req->match_sets[i].ssid.ssid)) 14728 return -ENOBUFS; 14729 nla_nest_end(msg, match); 14730 } 14731 nla_nest_end(msg, matches); 14732 } 14733 14734 scan_plans = nla_nest_start_noflag(msg, NL80211_ATTR_SCHED_SCAN_PLANS); 14735 if (!scan_plans) 14736 return -ENOBUFS; 14737 14738 for (i = 0; i < req->n_scan_plans; i++) { 14739 scan_plan = nla_nest_start_noflag(msg, i + 1); 14740 if (!scan_plan) 14741 return -ENOBUFS; 14742 14743 if (nla_put_u32(msg, NL80211_SCHED_SCAN_PLAN_INTERVAL, 14744 req->scan_plans[i].interval) || 14745 (req->scan_plans[i].iterations && 14746 nla_put_u32(msg, NL80211_SCHED_SCAN_PLAN_ITERATIONS, 14747 req->scan_plans[i].iterations))) 14748 return -ENOBUFS; 14749 nla_nest_end(msg, scan_plan); 14750 } 14751 nla_nest_end(msg, scan_plans); 14752 14753 nla_nest_end(msg, nd); 14754 14755 return 0; 14756 } 14757 14758 static int nl80211_get_wowlan(struct sk_buff *skb, struct genl_info *info) 14759 { 14760 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14761 struct sk_buff *msg; 14762 void *hdr; 14763 u32 size = NLMSG_DEFAULT_SIZE; 14764 14765 if (!rdev->wiphy.wowlan) 14766 return -EOPNOTSUPP; 14767 14768 if (rdev->wiphy.wowlan_config && rdev->wiphy.wowlan_config->tcp) { 14769 /* adjust size to have room for all the data */ 14770 size += rdev->wiphy.wowlan_config->tcp->tokens_size + 14771 rdev->wiphy.wowlan_config->tcp->payload_len + 14772 rdev->wiphy.wowlan_config->tcp->wake_len + 14773 rdev->wiphy.wowlan_config->tcp->wake_len / 8; 14774 } 14775 14776 msg = nlmsg_new(size, GFP_KERNEL); 14777 if (!msg) 14778 return -ENOMEM; 14779 14780 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 14781 NL80211_CMD_GET_WOWLAN); 14782 if (!hdr) 14783 goto nla_put_failure; 14784 14785 if (rdev->wiphy.wowlan_config) { 14786 struct nlattr *nl_wowlan; 14787 14788 nl_wowlan = nla_nest_start_noflag(msg, 14789 NL80211_ATTR_WOWLAN_TRIGGERS); 14790 if (!nl_wowlan) 14791 goto nla_put_failure; 14792 14793 if ((rdev->wiphy.wowlan_config->any && 14794 nla_put_flag(msg, NL80211_WOWLAN_TRIG_ANY)) || 14795 (rdev->wiphy.wowlan_config->disconnect && 14796 nla_put_flag(msg, NL80211_WOWLAN_TRIG_DISCONNECT)) || 14797 (rdev->wiphy.wowlan_config->magic_pkt && 14798 nla_put_flag(msg, NL80211_WOWLAN_TRIG_MAGIC_PKT)) || 14799 (rdev->wiphy.wowlan_config->gtk_rekey_failure && 14800 nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE)) || 14801 (rdev->wiphy.wowlan_config->eap_identity_req && 14802 nla_put_flag(msg, NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST)) || 14803 (rdev->wiphy.wowlan_config->four_way_handshake && 14804 nla_put_flag(msg, NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE)) || 14805 (rdev->wiphy.wowlan_config->rfkill_release && 14806 nla_put_flag(msg, NL80211_WOWLAN_TRIG_RFKILL_RELEASE))) 14807 goto nla_put_failure; 14808 14809 if (nl80211_send_wowlan_patterns(msg, rdev)) 14810 goto nla_put_failure; 14811 14812 if (nl80211_send_wowlan_tcp(msg, 14813 rdev->wiphy.wowlan_config->tcp)) 14814 goto nla_put_failure; 14815 14816 if (nl80211_send_wowlan_nd( 14817 msg, 14818 rdev->wiphy.wowlan_config->nd_config)) 14819 goto nla_put_failure; 14820 14821 nla_nest_end(msg, nl_wowlan); 14822 } 14823 14824 genlmsg_end(msg, hdr); 14825 return genlmsg_reply(msg, info); 14826 14827 nla_put_failure: 14828 nlmsg_free(msg); 14829 return -ENOBUFS; 14830 } 14831 14832 static int nl80211_parse_wowlan_tcp(struct cfg80211_registered_device *rdev, 14833 struct nlattr *attr, 14834 struct cfg80211_wowlan *trig) 14835 { 14836 struct nlattr *tb[NUM_NL80211_WOWLAN_TCP]; 14837 struct cfg80211_wowlan_tcp *cfg; 14838 struct nl80211_wowlan_tcp_data_token *tok = NULL; 14839 struct nl80211_wowlan_tcp_data_seq *seq = NULL; 14840 u32 size; 14841 u32 data_size, wake_size, tokens_size = 0, wake_mask_size; 14842 int err, port; 14843 14844 if (!rdev->wiphy.wowlan->tcp) 14845 return -EINVAL; 14846 14847 err = nla_parse_nested_deprecated(tb, MAX_NL80211_WOWLAN_TCP, attr, 14848 nl80211_wowlan_tcp_policy, NULL); 14849 if (err) 14850 return err; 14851 14852 if (!tb[NL80211_WOWLAN_TCP_SRC_IPV4] || 14853 !tb[NL80211_WOWLAN_TCP_DST_IPV4] || 14854 !tb[NL80211_WOWLAN_TCP_DST_MAC] || 14855 !tb[NL80211_WOWLAN_TCP_DST_PORT] || 14856 !tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD] || 14857 !tb[NL80211_WOWLAN_TCP_DATA_INTERVAL] || 14858 !tb[NL80211_WOWLAN_TCP_WAKE_PAYLOAD] || 14859 !tb[NL80211_WOWLAN_TCP_WAKE_MASK]) 14860 return -EINVAL; 14861 14862 data_size = nla_len(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD]); 14863 if (data_size > rdev->wiphy.wowlan->tcp->data_payload_max) 14864 return -EINVAL; 14865 14866 if (nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]) > 14867 rdev->wiphy.wowlan->tcp->data_interval_max || 14868 nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]) == 0) 14869 return -EINVAL; 14870 14871 wake_size = nla_len(tb[NL80211_WOWLAN_TCP_WAKE_PAYLOAD]); 14872 if (wake_size > rdev->wiphy.wowlan->tcp->wake_payload_max) 14873 return -EINVAL; 14874 14875 wake_mask_size = nla_len(tb[NL80211_WOWLAN_TCP_WAKE_MASK]); 14876 if (wake_mask_size != DIV_ROUND_UP(wake_size, 8)) 14877 return -EINVAL; 14878 14879 if (tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN]) { 14880 u32 tokln = nla_len(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN]); 14881 14882 tok = nla_data(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN]); 14883 tokens_size = tokln - sizeof(*tok); 14884 14885 if (!tok->len || tokens_size % tok->len) 14886 return -EINVAL; 14887 if (!rdev->wiphy.wowlan->tcp->tok) 14888 return -EINVAL; 14889 if (tok->len > rdev->wiphy.wowlan->tcp->tok->max_len) 14890 return -EINVAL; 14891 if (tok->len < rdev->wiphy.wowlan->tcp->tok->min_len) 14892 return -EINVAL; 14893 if (tokens_size > rdev->wiphy.wowlan->tcp->tok->bufsize) 14894 return -EINVAL; 14895 if (tok->offset + tok->len > data_size) 14896 return -EINVAL; 14897 } 14898 14899 if (tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ]) { 14900 seq = nla_data(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ]); 14901 if (!rdev->wiphy.wowlan->tcp->seq) 14902 return -EINVAL; 14903 if (seq->len == 0 || seq->len > 4) 14904 return -EINVAL; 14905 if (seq->len + seq->offset > data_size) 14906 return -EINVAL; 14907 } 14908 14909 size = sizeof(*cfg); 14910 size += data_size; 14911 size += wake_size + wake_mask_size; 14912 size += tokens_size; 14913 14914 cfg = kzalloc(size, GFP_KERNEL); 14915 if (!cfg) 14916 return -ENOMEM; 14917 cfg->src = nla_get_in_addr(tb[NL80211_WOWLAN_TCP_SRC_IPV4]); 14918 cfg->dst = nla_get_in_addr(tb[NL80211_WOWLAN_TCP_DST_IPV4]); 14919 memcpy(cfg->dst_mac, nla_data(tb[NL80211_WOWLAN_TCP_DST_MAC]), 14920 ETH_ALEN); 14921 port = nla_get_u16_default(tb[NL80211_WOWLAN_TCP_SRC_PORT], 0); 14922 #ifdef CONFIG_INET 14923 /* allocate a socket and port for it and use it */ 14924 err = __sock_create(wiphy_net(&rdev->wiphy), PF_INET, SOCK_STREAM, 14925 IPPROTO_TCP, &cfg->sock, 1); 14926 if (err) { 14927 kfree(cfg); 14928 return err; 14929 } 14930 if (inet_csk_get_port(cfg->sock->sk, port)) { 14931 sock_release(cfg->sock); 14932 kfree(cfg); 14933 return -EADDRINUSE; 14934 } 14935 cfg->src_port = inet_sk(cfg->sock->sk)->inet_num; 14936 #else 14937 if (!port) { 14938 kfree(cfg); 14939 return -EINVAL; 14940 } 14941 cfg->src_port = port; 14942 #endif 14943 14944 cfg->dst_port = nla_get_u16(tb[NL80211_WOWLAN_TCP_DST_PORT]); 14945 cfg->payload_len = data_size; 14946 cfg->payload = (u8 *)cfg + sizeof(*cfg) + tokens_size; 14947 memcpy((void *)cfg->payload, 14948 nla_data(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD]), 14949 data_size); 14950 if (seq) 14951 cfg->payload_seq = *seq; 14952 cfg->data_interval = nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]); 14953 cfg->wake_len = wake_size; 14954 cfg->wake_data = (u8 *)cfg + sizeof(*cfg) + tokens_size + data_size; 14955 memcpy((void *)cfg->wake_data, 14956 nla_data(tb[NL80211_WOWLAN_TCP_WAKE_PAYLOAD]), 14957 wake_size); 14958 cfg->wake_mask = (u8 *)cfg + sizeof(*cfg) + tokens_size + 14959 data_size + wake_size; 14960 memcpy((void *)cfg->wake_mask, 14961 nla_data(tb[NL80211_WOWLAN_TCP_WAKE_MASK]), 14962 wake_mask_size); 14963 if (tok) { 14964 cfg->tokens_size = tokens_size; 14965 cfg->payload_tok = *tok; 14966 memcpy(cfg->payload_tok.token_stream, tok->token_stream, 14967 tokens_size); 14968 } 14969 14970 trig->tcp = cfg; 14971 14972 return 0; 14973 } 14974 14975 static int nl80211_parse_wowlan_nd(struct cfg80211_registered_device *rdev, 14976 const struct wiphy_wowlan_support *wowlan, 14977 struct nlattr *attr, 14978 struct cfg80211_wowlan *trig) 14979 { 14980 struct nlattr **tb; 14981 int err; 14982 14983 tb = kzalloc_objs(*tb, NUM_NL80211_ATTR); 14984 if (!tb) 14985 return -ENOMEM; 14986 14987 if (!(wowlan->flags & WIPHY_WOWLAN_NET_DETECT)) { 14988 err = -EOPNOTSUPP; 14989 goto out; 14990 } 14991 14992 err = nla_parse_nested_deprecated(tb, NL80211_ATTR_MAX, attr, 14993 nl80211_policy, NULL); 14994 if (err) 14995 goto out; 14996 14997 trig->nd_config = nl80211_parse_sched_scan(&rdev->wiphy, NULL, tb, 14998 wowlan->max_nd_match_sets); 14999 err = PTR_ERR_OR_ZERO(trig->nd_config); 15000 if (err) 15001 trig->nd_config = NULL; 15002 15003 out: 15004 kfree(tb); 15005 return err; 15006 } 15007 15008 static int nl80211_set_wowlan(struct sk_buff *skb, struct genl_info *info) 15009 { 15010 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 15011 struct nlattr *tb[NUM_NL80211_WOWLAN_TRIG]; 15012 struct cfg80211_wowlan new_triggers = {}; 15013 struct cfg80211_wowlan *ntrig; 15014 const struct wiphy_wowlan_support *wowlan = rdev->wiphy.wowlan; 15015 int err, i; 15016 bool prev_enabled = rdev->wiphy.wowlan_config; 15017 bool regular = false; 15018 15019 if (!wowlan) 15020 return -EOPNOTSUPP; 15021 15022 if (!info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS]) { 15023 cfg80211_rdev_free_wowlan(rdev); 15024 rdev->wiphy.wowlan_config = NULL; 15025 goto set_wakeup; 15026 } 15027 15028 err = nla_parse_nested_deprecated(tb, MAX_NL80211_WOWLAN_TRIG, 15029 info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS], 15030 nl80211_wowlan_policy, info->extack); 15031 if (err) 15032 return err; 15033 15034 if (tb[NL80211_WOWLAN_TRIG_ANY]) { 15035 if (!(wowlan->flags & WIPHY_WOWLAN_ANY)) 15036 return -EINVAL; 15037 new_triggers.any = true; 15038 } 15039 15040 if (tb[NL80211_WOWLAN_TRIG_DISCONNECT]) { 15041 if (!(wowlan->flags & WIPHY_WOWLAN_DISCONNECT)) 15042 return -EINVAL; 15043 new_triggers.disconnect = true; 15044 regular = true; 15045 } 15046 15047 if (tb[NL80211_WOWLAN_TRIG_MAGIC_PKT]) { 15048 if (!(wowlan->flags & WIPHY_WOWLAN_MAGIC_PKT)) 15049 return -EINVAL; 15050 new_triggers.magic_pkt = true; 15051 regular = true; 15052 } 15053 15054 if (tb[NL80211_WOWLAN_TRIG_GTK_REKEY_SUPPORTED]) 15055 return -EINVAL; 15056 15057 if (tb[NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE]) { 15058 if (!(wowlan->flags & WIPHY_WOWLAN_GTK_REKEY_FAILURE)) 15059 return -EINVAL; 15060 new_triggers.gtk_rekey_failure = true; 15061 regular = true; 15062 } 15063 15064 if (tb[NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST]) { 15065 if (!(wowlan->flags & WIPHY_WOWLAN_EAP_IDENTITY_REQ)) 15066 return -EINVAL; 15067 new_triggers.eap_identity_req = true; 15068 regular = true; 15069 } 15070 15071 if (tb[NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE]) { 15072 if (!(wowlan->flags & WIPHY_WOWLAN_4WAY_HANDSHAKE)) 15073 return -EINVAL; 15074 new_triggers.four_way_handshake = true; 15075 regular = true; 15076 } 15077 15078 if (tb[NL80211_WOWLAN_TRIG_RFKILL_RELEASE]) { 15079 if (!(wowlan->flags & WIPHY_WOWLAN_RFKILL_RELEASE)) 15080 return -EINVAL; 15081 new_triggers.rfkill_release = true; 15082 regular = true; 15083 } 15084 15085 if (tb[NL80211_WOWLAN_TRIG_PKT_PATTERN]) { 15086 struct nlattr *pat; 15087 int n_patterns = 0; 15088 int rem, pat_len, mask_len, pkt_offset; 15089 struct nlattr *pat_tb[NUM_NL80211_PKTPAT]; 15090 15091 regular = true; 15092 15093 nla_for_each_nested(pat, tb[NL80211_WOWLAN_TRIG_PKT_PATTERN], 15094 rem) 15095 n_patterns++; 15096 if (n_patterns > wowlan->n_patterns) 15097 return -EINVAL; 15098 15099 new_triggers.patterns = kzalloc_objs(new_triggers.patterns[0], 15100 n_patterns); 15101 if (!new_triggers.patterns) 15102 return -ENOMEM; 15103 15104 new_triggers.n_patterns = n_patterns; 15105 i = 0; 15106 15107 nla_for_each_nested(pat, tb[NL80211_WOWLAN_TRIG_PKT_PATTERN], 15108 rem) { 15109 u8 *mask_pat; 15110 15111 err = nla_parse_nested_deprecated(pat_tb, 15112 MAX_NL80211_PKTPAT, 15113 pat, 15114 nl80211_packet_pattern_policy, 15115 info->extack); 15116 if (err) 15117 goto error; 15118 15119 err = -EINVAL; 15120 if (!pat_tb[NL80211_PKTPAT_MASK] || 15121 !pat_tb[NL80211_PKTPAT_PATTERN]) 15122 goto error; 15123 pat_len = nla_len(pat_tb[NL80211_PKTPAT_PATTERN]); 15124 mask_len = DIV_ROUND_UP(pat_len, 8); 15125 if (nla_len(pat_tb[NL80211_PKTPAT_MASK]) != mask_len) 15126 goto error; 15127 if (pat_len > wowlan->pattern_max_len || 15128 pat_len < wowlan->pattern_min_len) 15129 goto error; 15130 15131 pkt_offset = 15132 nla_get_u32_default(pat_tb[NL80211_PKTPAT_OFFSET], 15133 0); 15134 if (pkt_offset > wowlan->max_pkt_offset) 15135 goto error; 15136 new_triggers.patterns[i].pkt_offset = pkt_offset; 15137 15138 mask_pat = kmalloc(mask_len + pat_len, GFP_KERNEL); 15139 if (!mask_pat) { 15140 err = -ENOMEM; 15141 goto error; 15142 } 15143 new_triggers.patterns[i].mask = mask_pat; 15144 memcpy(mask_pat, nla_data(pat_tb[NL80211_PKTPAT_MASK]), 15145 mask_len); 15146 mask_pat += mask_len; 15147 new_triggers.patterns[i].pattern = mask_pat; 15148 new_triggers.patterns[i].pattern_len = pat_len; 15149 memcpy(mask_pat, 15150 nla_data(pat_tb[NL80211_PKTPAT_PATTERN]), 15151 pat_len); 15152 i++; 15153 } 15154 } 15155 15156 if (tb[NL80211_WOWLAN_TRIG_TCP_CONNECTION]) { 15157 regular = true; 15158 err = nl80211_parse_wowlan_tcp( 15159 rdev, tb[NL80211_WOWLAN_TRIG_TCP_CONNECTION], 15160 &new_triggers); 15161 if (err) 15162 goto error; 15163 } 15164 15165 if (tb[NL80211_WOWLAN_TRIG_NET_DETECT]) { 15166 regular = true; 15167 err = nl80211_parse_wowlan_nd( 15168 rdev, wowlan, tb[NL80211_WOWLAN_TRIG_NET_DETECT], 15169 &new_triggers); 15170 if (err) 15171 goto error; 15172 } 15173 15174 /* The 'any' trigger means the device continues operating more or less 15175 * as in its normal operation mode and wakes up the host on most of the 15176 * normal interrupts (like packet RX, ...) 15177 * It therefore makes little sense to combine with the more constrained 15178 * wakeup trigger modes. 15179 */ 15180 if (new_triggers.any && regular) { 15181 err = -EINVAL; 15182 goto error; 15183 } 15184 15185 ntrig = kmemdup(&new_triggers, sizeof(new_triggers), GFP_KERNEL); 15186 if (!ntrig) { 15187 err = -ENOMEM; 15188 goto error; 15189 } 15190 cfg80211_rdev_free_wowlan(rdev); 15191 rdev->wiphy.wowlan_config = ntrig; 15192 15193 set_wakeup: 15194 if (rdev->ops->set_wakeup && 15195 prev_enabled != !!rdev->wiphy.wowlan_config) 15196 rdev_set_wakeup(rdev, rdev->wiphy.wowlan_config); 15197 15198 return 0; 15199 error: 15200 for (i = 0; i < new_triggers.n_patterns; i++) 15201 kfree(new_triggers.patterns[i].mask); 15202 kfree(new_triggers.patterns); 15203 if (new_triggers.tcp && new_triggers.tcp->sock) 15204 sock_release(new_triggers.tcp->sock); 15205 kfree(new_triggers.tcp); 15206 kfree(new_triggers.nd_config); 15207 return err; 15208 } 15209 #endif 15210 15211 static int nl80211_send_coalesce_rules(struct sk_buff *msg, 15212 struct cfg80211_registered_device *rdev) 15213 { 15214 struct nlattr *nl_pats, *nl_pat, *nl_rule, *nl_rules; 15215 int i, j, pat_len; 15216 struct cfg80211_coalesce_rules *rule; 15217 15218 if (!rdev->coalesce->n_rules) 15219 return 0; 15220 15221 nl_rules = nla_nest_start_noflag(msg, NL80211_ATTR_COALESCE_RULE); 15222 if (!nl_rules) 15223 return -ENOBUFS; 15224 15225 for (i = 0; i < rdev->coalesce->n_rules; i++) { 15226 nl_rule = nla_nest_start_noflag(msg, i + 1); 15227 if (!nl_rule) 15228 return -ENOBUFS; 15229 15230 rule = &rdev->coalesce->rules[i]; 15231 if (nla_put_u32(msg, NL80211_ATTR_COALESCE_RULE_DELAY, 15232 rule->delay)) 15233 return -ENOBUFS; 15234 15235 if (nla_put_u32(msg, NL80211_ATTR_COALESCE_RULE_CONDITION, 15236 rule->condition)) 15237 return -ENOBUFS; 15238 15239 nl_pats = nla_nest_start_noflag(msg, 15240 NL80211_ATTR_COALESCE_RULE_PKT_PATTERN); 15241 if (!nl_pats) 15242 return -ENOBUFS; 15243 15244 for (j = 0; j < rule->n_patterns; j++) { 15245 nl_pat = nla_nest_start_noflag(msg, j + 1); 15246 if (!nl_pat) 15247 return -ENOBUFS; 15248 pat_len = rule->patterns[j].pattern_len; 15249 if (nla_put(msg, NL80211_PKTPAT_MASK, 15250 DIV_ROUND_UP(pat_len, 8), 15251 rule->patterns[j].mask) || 15252 nla_put(msg, NL80211_PKTPAT_PATTERN, pat_len, 15253 rule->patterns[j].pattern) || 15254 nla_put_u32(msg, NL80211_PKTPAT_OFFSET, 15255 rule->patterns[j].pkt_offset)) 15256 return -ENOBUFS; 15257 nla_nest_end(msg, nl_pat); 15258 } 15259 nla_nest_end(msg, nl_pats); 15260 nla_nest_end(msg, nl_rule); 15261 } 15262 nla_nest_end(msg, nl_rules); 15263 15264 return 0; 15265 } 15266 15267 static int nl80211_get_coalesce(struct sk_buff *skb, struct genl_info *info) 15268 { 15269 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 15270 struct sk_buff *msg; 15271 void *hdr; 15272 15273 if (!rdev->wiphy.coalesce) 15274 return -EOPNOTSUPP; 15275 15276 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 15277 if (!msg) 15278 return -ENOMEM; 15279 15280 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 15281 NL80211_CMD_GET_COALESCE); 15282 if (!hdr) 15283 goto nla_put_failure; 15284 15285 if (rdev->coalesce && nl80211_send_coalesce_rules(msg, rdev)) 15286 goto nla_put_failure; 15287 15288 genlmsg_end(msg, hdr); 15289 return genlmsg_reply(msg, info); 15290 15291 nla_put_failure: 15292 nlmsg_free(msg); 15293 return -ENOBUFS; 15294 } 15295 15296 void cfg80211_free_coalesce(struct cfg80211_coalesce *coalesce) 15297 { 15298 int i, j; 15299 struct cfg80211_coalesce_rules *rule; 15300 15301 if (!coalesce) 15302 return; 15303 15304 for (i = 0; i < coalesce->n_rules; i++) { 15305 rule = &coalesce->rules[i]; 15306 for (j = 0; j < rule->n_patterns; j++) 15307 kfree(rule->patterns[j].mask); 15308 kfree(rule->patterns); 15309 } 15310 kfree(coalesce); 15311 } 15312 15313 static int nl80211_parse_coalesce_rule(struct cfg80211_registered_device *rdev, 15314 struct nlattr *rule, 15315 struct cfg80211_coalesce_rules *new_rule) 15316 { 15317 int err, i; 15318 const struct wiphy_coalesce_support *coalesce = rdev->wiphy.coalesce; 15319 struct nlattr *tb[NUM_NL80211_ATTR_COALESCE_RULE], *pat; 15320 int rem, pat_len, mask_len, pkt_offset, n_patterns = 0; 15321 struct nlattr *pat_tb[NUM_NL80211_PKTPAT]; 15322 15323 err = nla_parse_nested_deprecated(tb, NL80211_ATTR_COALESCE_RULE_MAX, 15324 rule, nl80211_coalesce_policy, NULL); 15325 if (err) 15326 return err; 15327 15328 if (tb[NL80211_ATTR_COALESCE_RULE_DELAY]) 15329 new_rule->delay = 15330 nla_get_u32(tb[NL80211_ATTR_COALESCE_RULE_DELAY]); 15331 if (new_rule->delay > coalesce->max_delay) 15332 return -EINVAL; 15333 15334 if (tb[NL80211_ATTR_COALESCE_RULE_CONDITION]) 15335 new_rule->condition = 15336 nla_get_u32(tb[NL80211_ATTR_COALESCE_RULE_CONDITION]); 15337 15338 if (!tb[NL80211_ATTR_COALESCE_RULE_PKT_PATTERN]) 15339 return -EINVAL; 15340 15341 nla_for_each_nested(pat, tb[NL80211_ATTR_COALESCE_RULE_PKT_PATTERN], 15342 rem) 15343 n_patterns++; 15344 if (n_patterns > coalesce->n_patterns) 15345 return -EINVAL; 15346 15347 new_rule->patterns = kzalloc_objs(new_rule->patterns[0], n_patterns); 15348 if (!new_rule->patterns) 15349 return -ENOMEM; 15350 15351 new_rule->n_patterns = n_patterns; 15352 i = 0; 15353 15354 nla_for_each_nested(pat, tb[NL80211_ATTR_COALESCE_RULE_PKT_PATTERN], 15355 rem) { 15356 u8 *mask_pat; 15357 15358 err = nla_parse_nested_deprecated(pat_tb, MAX_NL80211_PKTPAT, 15359 pat, 15360 nl80211_packet_pattern_policy, 15361 NULL); 15362 if (err) 15363 return err; 15364 15365 if (!pat_tb[NL80211_PKTPAT_MASK] || 15366 !pat_tb[NL80211_PKTPAT_PATTERN]) 15367 return -EINVAL; 15368 pat_len = nla_len(pat_tb[NL80211_PKTPAT_PATTERN]); 15369 mask_len = DIV_ROUND_UP(pat_len, 8); 15370 if (nla_len(pat_tb[NL80211_PKTPAT_MASK]) != mask_len) 15371 return -EINVAL; 15372 if (pat_len > coalesce->pattern_max_len || 15373 pat_len < coalesce->pattern_min_len) 15374 return -EINVAL; 15375 15376 pkt_offset = nla_get_u32_default(pat_tb[NL80211_PKTPAT_OFFSET], 15377 0); 15378 if (pkt_offset > coalesce->max_pkt_offset) 15379 return -EINVAL; 15380 new_rule->patterns[i].pkt_offset = pkt_offset; 15381 15382 mask_pat = kmalloc(mask_len + pat_len, GFP_KERNEL); 15383 if (!mask_pat) 15384 return -ENOMEM; 15385 15386 new_rule->patterns[i].mask = mask_pat; 15387 memcpy(mask_pat, nla_data(pat_tb[NL80211_PKTPAT_MASK]), 15388 mask_len); 15389 15390 mask_pat += mask_len; 15391 new_rule->patterns[i].pattern = mask_pat; 15392 new_rule->patterns[i].pattern_len = pat_len; 15393 memcpy(mask_pat, nla_data(pat_tb[NL80211_PKTPAT_PATTERN]), 15394 pat_len); 15395 i++; 15396 } 15397 15398 return 0; 15399 } 15400 15401 static int nl80211_set_coalesce(struct sk_buff *skb, struct genl_info *info) 15402 { 15403 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 15404 const struct wiphy_coalesce_support *coalesce = rdev->wiphy.coalesce; 15405 struct cfg80211_coalesce *new_coalesce; 15406 int err, rem_rule, n_rules = 0, i; 15407 struct nlattr *rule; 15408 15409 if (!rdev->wiphy.coalesce || !rdev->ops->set_coalesce) 15410 return -EOPNOTSUPP; 15411 15412 if (!info->attrs[NL80211_ATTR_COALESCE_RULE]) { 15413 cfg80211_free_coalesce(rdev->coalesce); 15414 rdev->coalesce = NULL; 15415 rdev_set_coalesce(rdev, NULL); 15416 return 0; 15417 } 15418 15419 nla_for_each_nested(rule, info->attrs[NL80211_ATTR_COALESCE_RULE], 15420 rem_rule) 15421 n_rules++; 15422 if (n_rules > coalesce->n_rules) 15423 return -EINVAL; 15424 15425 new_coalesce = kzalloc_flex(*new_coalesce, rules, n_rules); 15426 if (!new_coalesce) 15427 return -ENOMEM; 15428 15429 new_coalesce->n_rules = n_rules; 15430 i = 0; 15431 15432 nla_for_each_nested(rule, info->attrs[NL80211_ATTR_COALESCE_RULE], 15433 rem_rule) { 15434 err = nl80211_parse_coalesce_rule(rdev, rule, 15435 &new_coalesce->rules[i]); 15436 if (err) 15437 goto error; 15438 15439 i++; 15440 } 15441 15442 err = rdev_set_coalesce(rdev, new_coalesce); 15443 if (err) 15444 goto error; 15445 15446 cfg80211_free_coalesce(rdev->coalesce); 15447 rdev->coalesce = new_coalesce; 15448 15449 return 0; 15450 error: 15451 cfg80211_free_coalesce(new_coalesce); 15452 15453 return err; 15454 } 15455 15456 static int nl80211_set_rekey_data(struct sk_buff *skb, struct genl_info *info) 15457 { 15458 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 15459 struct net_device *dev = info->user_ptr[1]; 15460 struct wireless_dev *wdev = dev->ieee80211_ptr; 15461 struct nlattr *tb[NUM_NL80211_REKEY_DATA]; 15462 struct cfg80211_gtk_rekey_data rekey_data = {}; 15463 int err; 15464 15465 if (!info->attrs[NL80211_ATTR_REKEY_DATA]) 15466 return -EINVAL; 15467 15468 err = nla_parse_nested_deprecated(tb, MAX_NL80211_REKEY_DATA, 15469 info->attrs[NL80211_ATTR_REKEY_DATA], 15470 nl80211_rekey_policy, info->extack); 15471 if (err) 15472 return err; 15473 15474 if (!tb[NL80211_REKEY_DATA_REPLAY_CTR] || !tb[NL80211_REKEY_DATA_KEK] || 15475 !tb[NL80211_REKEY_DATA_KCK]) 15476 return -EINVAL; 15477 if (nla_len(tb[NL80211_REKEY_DATA_KEK]) != NL80211_KEK_LEN && 15478 !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_EXT_KEK_KCK && 15479 nla_len(tb[NL80211_REKEY_DATA_KEK]) == NL80211_KEK_EXT_LEN)) 15480 return -ERANGE; 15481 if (nla_len(tb[NL80211_REKEY_DATA_KCK]) != NL80211_KCK_LEN && 15482 !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_EXT_KEK_KCK && 15483 nla_len(tb[NL80211_REKEY_DATA_KCK]) == NL80211_KCK_EXT_LEN) && 15484 !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_EXT_KCK_32 && 15485 nla_len(tb[NL80211_REKEY_DATA_KCK]) == NL80211_KCK_EXT_LEN_32)) 15486 return -ERANGE; 15487 15488 rekey_data.kek = nla_data(tb[NL80211_REKEY_DATA_KEK]); 15489 rekey_data.kck = nla_data(tb[NL80211_REKEY_DATA_KCK]); 15490 rekey_data.replay_ctr = nla_data(tb[NL80211_REKEY_DATA_REPLAY_CTR]); 15491 rekey_data.kek_len = nla_len(tb[NL80211_REKEY_DATA_KEK]); 15492 rekey_data.kck_len = nla_len(tb[NL80211_REKEY_DATA_KCK]); 15493 if (tb[NL80211_REKEY_DATA_AKM]) 15494 rekey_data.akm = nla_get_u32(tb[NL80211_REKEY_DATA_AKM]); 15495 15496 if (!wdev->connected) 15497 return -ENOTCONN; 15498 15499 if (!rdev->ops->set_rekey_data) 15500 return -EOPNOTSUPP; 15501 15502 return rdev_set_rekey_data(rdev, dev, &rekey_data); 15503 } 15504 15505 static int nl80211_register_unexpected_frame(struct sk_buff *skb, 15506 struct genl_info *info) 15507 { 15508 struct net_device *dev = info->user_ptr[1]; 15509 struct wireless_dev *wdev = dev->ieee80211_ptr; 15510 15511 if (wdev->iftype != NL80211_IFTYPE_AP && 15512 wdev->iftype != NL80211_IFTYPE_P2P_GO) 15513 return -EINVAL; 15514 15515 if (wdev->ap_unexpected_nlportid) 15516 return -EBUSY; 15517 15518 wdev->ap_unexpected_nlportid = info->snd_portid; 15519 return 0; 15520 } 15521 15522 static int nl80211_probe_client(struct sk_buff *skb, 15523 struct genl_info *info) 15524 { 15525 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 15526 struct net_device *dev = info->user_ptr[1]; 15527 struct wireless_dev *wdev = dev->ieee80211_ptr; 15528 struct sk_buff *msg; 15529 void *hdr; 15530 const u8 *addr; 15531 u64 cookie; 15532 int err; 15533 15534 if (wdev->iftype != NL80211_IFTYPE_AP && 15535 wdev->iftype != NL80211_IFTYPE_P2P_GO) 15536 return -EOPNOTSUPP; 15537 15538 if (!info->attrs[NL80211_ATTR_MAC]) 15539 return -EINVAL; 15540 15541 if (!rdev->ops->probe_client) 15542 return -EOPNOTSUPP; 15543 15544 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 15545 if (!msg) 15546 return -ENOMEM; 15547 15548 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 15549 NL80211_CMD_PROBE_CLIENT); 15550 if (!hdr) { 15551 err = -ENOBUFS; 15552 goto free_msg; 15553 } 15554 15555 addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 15556 15557 err = rdev_probe_client(rdev, dev, addr, &cookie); 15558 if (err) 15559 goto free_msg; 15560 15561 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie, 15562 NL80211_ATTR_PAD)) 15563 goto nla_put_failure; 15564 15565 genlmsg_end(msg, hdr); 15566 15567 return genlmsg_reply(msg, info); 15568 15569 nla_put_failure: 15570 err = -ENOBUFS; 15571 free_msg: 15572 nlmsg_free(msg); 15573 return err; 15574 } 15575 15576 static int nl80211_register_beacons(struct sk_buff *skb, struct genl_info *info) 15577 { 15578 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 15579 struct cfg80211_beacon_registration *reg, *nreg; 15580 int rv; 15581 15582 if (!(rdev->wiphy.flags & WIPHY_FLAG_REPORTS_OBSS)) 15583 return -EOPNOTSUPP; 15584 15585 nreg = kzalloc_obj(*nreg); 15586 if (!nreg) 15587 return -ENOMEM; 15588 15589 /* First, check if already registered. */ 15590 spin_lock_bh(&rdev->beacon_registrations_lock); 15591 list_for_each_entry(reg, &rdev->beacon_registrations, list) { 15592 if (reg->nlportid == info->snd_portid) { 15593 rv = -EALREADY; 15594 goto out_err; 15595 } 15596 } 15597 /* Add it to the list */ 15598 nreg->nlportid = info->snd_portid; 15599 list_add(&nreg->list, &rdev->beacon_registrations); 15600 15601 spin_unlock_bh(&rdev->beacon_registrations_lock); 15602 15603 return 0; 15604 out_err: 15605 spin_unlock_bh(&rdev->beacon_registrations_lock); 15606 kfree(nreg); 15607 return rv; 15608 } 15609 15610 static int nl80211_start_p2p_device(struct sk_buff *skb, struct genl_info *info) 15611 { 15612 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 15613 struct wireless_dev *wdev = info->user_ptr[1]; 15614 int err; 15615 15616 if (!rdev->ops->start_p2p_device) 15617 return -EOPNOTSUPP; 15618 15619 if (wdev->iftype != NL80211_IFTYPE_P2P_DEVICE) 15620 return -EOPNOTSUPP; 15621 15622 if (wdev_running(wdev)) 15623 return 0; 15624 15625 if (rfkill_blocked(rdev->wiphy.rfkill)) 15626 return -ERFKILL; 15627 15628 err = rdev_start_p2p_device(rdev, wdev); 15629 if (err) 15630 return err; 15631 15632 wdev->is_running = true; 15633 rdev->opencount++; 15634 15635 return 0; 15636 } 15637 15638 static int nl80211_stop_p2p_device(struct sk_buff *skb, struct genl_info *info) 15639 { 15640 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 15641 struct wireless_dev *wdev = info->user_ptr[1]; 15642 15643 if (wdev->iftype != NL80211_IFTYPE_P2P_DEVICE) 15644 return -EOPNOTSUPP; 15645 15646 if (!rdev->ops->stop_p2p_device) 15647 return -EOPNOTSUPP; 15648 15649 cfg80211_stop_p2p_device(rdev, wdev); 15650 15651 return 0; 15652 } 15653 15654 static struct ieee80211_channel *nl80211_get_nan_channel(struct wiphy *wiphy, 15655 int freq) 15656 { 15657 struct ieee80211_channel *chan; 15658 struct cfg80211_chan_def def; 15659 15660 /* Check if the frequency is valid for NAN */ 15661 if (freq != 5220 && freq != 5745 && freq != 2437) 15662 return NULL; 15663 15664 chan = ieee80211_get_channel(wiphy, freq); 15665 if (!chan) 15666 return NULL; 15667 15668 cfg80211_chandef_create(&def, chan, NL80211_CHAN_NO_HT); 15669 15670 /* Check if the channel is allowed */ 15671 if (cfg80211_reg_can_beacon(wiphy, &def, NL80211_IFTYPE_NAN)) 15672 return chan; 15673 15674 return NULL; 15675 } 15676 15677 static int nl80211_parse_nan_band_config(struct wiphy *wiphy, 15678 struct nlattr **tb, 15679 struct cfg80211_nan_band_config *cfg, 15680 enum nl80211_band band) 15681 { 15682 if (BIT(band) & ~(u32)wiphy->nan_supported_bands) 15683 return -EINVAL; 15684 15685 if (tb[NL80211_NAN_BAND_CONF_FREQ]) { 15686 u16 freq = nla_get_u16(tb[NL80211_NAN_BAND_CONF_FREQ]); 15687 15688 if (band != NL80211_BAND_5GHZ) 15689 return -EINVAL; 15690 15691 cfg->chan = nl80211_get_nan_channel(wiphy, freq); 15692 if (!cfg->chan) 15693 return -EINVAL; 15694 } 15695 15696 if (tb[NL80211_NAN_BAND_CONF_RSSI_CLOSE]) { 15697 cfg->rssi_close = 15698 nla_get_s8(tb[NL80211_NAN_BAND_CONF_RSSI_CLOSE]); 15699 if (!tb[NL80211_NAN_BAND_CONF_RSSI_MIDDLE]) 15700 return -EINVAL; 15701 } 15702 15703 if (tb[NL80211_NAN_BAND_CONF_RSSI_MIDDLE]) { 15704 cfg->rssi_middle = 15705 nla_get_s8(tb[NL80211_NAN_BAND_CONF_RSSI_MIDDLE]); 15706 if (!cfg->rssi_close || cfg->rssi_middle >= cfg->rssi_close) 15707 return -EINVAL; 15708 } 15709 15710 if (tb[NL80211_NAN_BAND_CONF_WAKE_DW]) { 15711 cfg->awake_dw_interval = 15712 nla_get_u8(tb[NL80211_NAN_BAND_CONF_WAKE_DW]); 15713 15714 if (band == NL80211_BAND_2GHZ && cfg->awake_dw_interval == 0) 15715 return -EINVAL; 15716 } 15717 15718 cfg->disable_scan = 15719 nla_get_flag(tb[NL80211_NAN_BAND_CONF_DISABLE_SCAN]); 15720 return 0; 15721 } 15722 15723 static int nl80211_parse_nan_conf(struct wiphy *wiphy, 15724 struct genl_info *info, 15725 struct cfg80211_nan_conf *conf, 15726 u32 *changed_flags, 15727 bool start) 15728 { 15729 struct nlattr *attrs[NL80211_NAN_CONF_ATTR_MAX + 1]; 15730 int err, rem; 15731 u32 changed = 0; 15732 struct nlattr *band_config; 15733 15734 if (info->attrs[NL80211_ATTR_NAN_MASTER_PREF]) { 15735 conf->master_pref = 15736 nla_get_u8(info->attrs[NL80211_ATTR_NAN_MASTER_PREF]); 15737 15738 changed |= CFG80211_NAN_CONF_CHANGED_PREF; 15739 } 15740 15741 if (info->attrs[NL80211_ATTR_BANDS]) { 15742 u32 bands = nla_get_u32(info->attrs[NL80211_ATTR_BANDS]); 15743 15744 if (bands & ~(u32)wiphy->nan_supported_bands) 15745 return -EOPNOTSUPP; 15746 15747 if (bands && !(bands & BIT(NL80211_BAND_2GHZ))) 15748 return -EINVAL; 15749 15750 conf->bands = bands; 15751 changed |= CFG80211_NAN_CONF_CHANGED_BANDS; 15752 } 15753 15754 conf->band_cfgs[NL80211_BAND_2GHZ].awake_dw_interval = 1; 15755 if (conf->bands & BIT(NL80211_BAND_5GHZ) || !conf->bands) 15756 conf->band_cfgs[NL80211_BAND_5GHZ].awake_dw_interval = 1; 15757 15758 /* On 2.4 GHz band use channel 6 */ 15759 conf->band_cfgs[NL80211_BAND_2GHZ].chan = 15760 nl80211_get_nan_channel(wiphy, 2437); 15761 if (!conf->band_cfgs[NL80211_BAND_2GHZ].chan) 15762 return -EINVAL; 15763 15764 if (!info->attrs[NL80211_ATTR_NAN_CONFIG]) 15765 goto out; 15766 15767 err = nla_parse_nested(attrs, NL80211_NAN_CONF_ATTR_MAX, 15768 info->attrs[NL80211_ATTR_NAN_CONFIG], NULL, 15769 info->extack); 15770 if (err) 15771 return err; 15772 15773 changed |= CFG80211_NAN_CONF_CHANGED_CONFIG; 15774 if (attrs[NL80211_NAN_CONF_CLUSTER_ID] && start) { 15775 ether_addr_copy(conf->cluster_id, 15776 nla_data(attrs[NL80211_NAN_CONF_CLUSTER_ID])); 15777 } else if (start) { 15778 conf->cluster_id[0] = 0x50; 15779 conf->cluster_id[1] = 0x6f; 15780 conf->cluster_id[2] = 0x9a; 15781 conf->cluster_id[3] = 0x01; 15782 get_random_bytes(&conf->cluster_id[4], 2); 15783 } 15784 15785 if (attrs[NL80211_NAN_CONF_EXTRA_ATTRS]) { 15786 conf->extra_nan_attrs = 15787 nla_data(attrs[NL80211_NAN_CONF_EXTRA_ATTRS]); 15788 conf->extra_nan_attrs_len = 15789 nla_len(attrs[NL80211_NAN_CONF_EXTRA_ATTRS]); 15790 } 15791 15792 if (attrs[NL80211_NAN_CONF_VENDOR_ELEMS]) { 15793 conf->vendor_elems = 15794 nla_data(attrs[NL80211_NAN_CONF_VENDOR_ELEMS]); 15795 conf->vendor_elems_len = 15796 nla_len(attrs[NL80211_NAN_CONF_VENDOR_ELEMS]); 15797 } 15798 15799 if (attrs[NL80211_NAN_CONF_BAND_CONFIGS]) { 15800 nla_for_each_nested(band_config, 15801 attrs[NL80211_NAN_CONF_BAND_CONFIGS], 15802 rem) { 15803 enum nl80211_band band; 15804 struct cfg80211_nan_band_config *cfg; 15805 struct nlattr *tb[NL80211_NAN_BAND_CONF_ATTR_MAX + 1]; 15806 15807 err = nla_parse_nested(tb, 15808 NL80211_NAN_BAND_CONF_ATTR_MAX, 15809 band_config, NULL, 15810 info->extack); 15811 if (err) 15812 return err; 15813 15814 if (!tb[NL80211_NAN_BAND_CONF_BAND]) 15815 return -EINVAL; 15816 15817 band = nla_get_u8(tb[NL80211_NAN_BAND_CONF_BAND]); 15818 if (conf->bands && !(conf->bands & BIT(band))) 15819 return -EINVAL; 15820 15821 cfg = &conf->band_cfgs[band]; 15822 15823 err = nl80211_parse_nan_band_config(wiphy, tb, cfg, 15824 band); 15825 if (err) 15826 return err; 15827 } 15828 } 15829 15830 if (attrs[NL80211_NAN_CONF_SCAN_PERIOD]) 15831 conf->scan_period = 15832 nla_get_u16(attrs[NL80211_NAN_CONF_SCAN_PERIOD]); 15833 15834 if (attrs[NL80211_NAN_CONF_SCAN_DWELL_TIME]) 15835 conf->scan_dwell_time = 15836 nla_get_u16(attrs[NL80211_NAN_CONF_SCAN_DWELL_TIME]); 15837 15838 if (attrs[NL80211_NAN_CONF_DISCOVERY_BEACON_INTERVAL]) 15839 conf->discovery_beacon_interval = 15840 nla_get_u8(attrs[NL80211_NAN_CONF_DISCOVERY_BEACON_INTERVAL]); 15841 15842 if (attrs[NL80211_NAN_CONF_NOTIFY_DW]) 15843 conf->enable_dw_notification = 15844 nla_get_flag(attrs[NL80211_NAN_CONF_NOTIFY_DW]); 15845 15846 out: 15847 if (!conf->band_cfgs[NL80211_BAND_5GHZ].chan && 15848 (!conf->bands || conf->bands & BIT(NL80211_BAND_5GHZ))) { 15849 /* If no 5GHz channel is specified use default, if possible */ 15850 conf->band_cfgs[NL80211_BAND_5GHZ].chan = 15851 nl80211_get_nan_channel(wiphy, 5745); 15852 if (!conf->band_cfgs[NL80211_BAND_5GHZ].chan) 15853 conf->band_cfgs[NL80211_BAND_5GHZ].chan = 15854 nl80211_get_nan_channel(wiphy, 5220); 15855 15856 /* Return error if user space asked explicitly for 5 GHz */ 15857 if (!conf->band_cfgs[NL80211_BAND_5GHZ].chan && 15858 conf->bands & BIT(NL80211_BAND_5GHZ)) { 15859 NL_SET_ERR_MSG_ATTR(info->extack, 15860 info->attrs[NL80211_ATTR_BANDS], 15861 "5 GHz band operation is not allowed"); 15862 return -EINVAL; 15863 } 15864 } 15865 15866 if (changed_flags) 15867 *changed_flags = changed; 15868 15869 return 0; 15870 } 15871 15872 static int nl80211_start_nan(struct sk_buff *skb, struct genl_info *info) 15873 { 15874 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 15875 struct wireless_dev *wdev = info->user_ptr[1]; 15876 struct cfg80211_nan_conf conf = {}; 15877 int err; 15878 15879 if (wdev->iftype != NL80211_IFTYPE_NAN) 15880 return -EOPNOTSUPP; 15881 15882 if (wdev_running(wdev)) 15883 return -EEXIST; 15884 15885 if (rfkill_blocked(rdev->wiphy.rfkill)) 15886 return -ERFKILL; 15887 15888 /* Master preference is mandatory for START_NAN */ 15889 if (!info->attrs[NL80211_ATTR_NAN_MASTER_PREF]) 15890 return -EINVAL; 15891 15892 err = nl80211_parse_nan_conf(&rdev->wiphy, info, &conf, NULL, true); 15893 if (err) 15894 return err; 15895 15896 err = rdev_start_nan(rdev, wdev, &conf); 15897 if (err) 15898 return err; 15899 15900 wdev->is_running = true; 15901 rdev->opencount++; 15902 15903 return 0; 15904 } 15905 15906 static int nl80211_stop_nan(struct sk_buff *skb, struct genl_info *info) 15907 { 15908 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 15909 struct wireless_dev *wdev = info->user_ptr[1]; 15910 15911 if (wdev->iftype != NL80211_IFTYPE_NAN) 15912 return -EOPNOTSUPP; 15913 15914 cfg80211_stop_nan(rdev, wdev); 15915 15916 return 0; 15917 } 15918 15919 static int validate_nan_filter(struct nlattr *filter_attr) 15920 { 15921 struct nlattr *attr; 15922 int len = 0, n_entries = 0, rem; 15923 15924 nla_for_each_nested(attr, filter_attr, rem) { 15925 len += nla_len(attr); 15926 n_entries++; 15927 } 15928 15929 if (len >= U8_MAX) 15930 return -EINVAL; 15931 15932 return n_entries; 15933 } 15934 15935 static int handle_nan_filter(struct nlattr *attr_filter, 15936 struct cfg80211_nan_func *func, 15937 bool tx) 15938 { 15939 struct nlattr *attr; 15940 int n_entries, rem, i; 15941 struct cfg80211_nan_func_filter *filter; 15942 15943 n_entries = validate_nan_filter(attr_filter); 15944 if (n_entries < 0) 15945 return n_entries; 15946 15947 BUILD_BUG_ON(sizeof(*func->rx_filters) != sizeof(*func->tx_filters)); 15948 15949 filter = kzalloc_objs(*func->rx_filters, n_entries); 15950 if (!filter) 15951 return -ENOMEM; 15952 15953 i = 0; 15954 nla_for_each_nested(attr, attr_filter, rem) { 15955 filter[i].filter = nla_memdup(attr, GFP_KERNEL); 15956 if (!filter[i].filter) 15957 goto err; 15958 15959 filter[i].len = nla_len(attr); 15960 i++; 15961 } 15962 if (tx) { 15963 func->num_tx_filters = n_entries; 15964 func->tx_filters = filter; 15965 } else { 15966 func->num_rx_filters = n_entries; 15967 func->rx_filters = filter; 15968 } 15969 15970 return 0; 15971 15972 err: 15973 i = 0; 15974 nla_for_each_nested(attr, attr_filter, rem) { 15975 kfree(filter[i].filter); 15976 i++; 15977 } 15978 kfree(filter); 15979 return -ENOMEM; 15980 } 15981 15982 static int nl80211_nan_add_func(struct sk_buff *skb, 15983 struct genl_info *info) 15984 { 15985 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 15986 struct wireless_dev *wdev = info->user_ptr[1]; 15987 struct nlattr *tb[NUM_NL80211_NAN_FUNC_ATTR], *func_attr; 15988 struct cfg80211_nan_func *func; 15989 struct sk_buff *msg = NULL; 15990 void *hdr = NULL; 15991 int err = 0; 15992 15993 if (wdev->iftype != NL80211_IFTYPE_NAN) 15994 return -EOPNOTSUPP; 15995 15996 if (!wdev_running(wdev)) 15997 return -ENOTCONN; 15998 15999 if (!info->attrs[NL80211_ATTR_NAN_FUNC]) 16000 return -EINVAL; 16001 16002 err = nla_parse_nested_deprecated(tb, NL80211_NAN_FUNC_ATTR_MAX, 16003 info->attrs[NL80211_ATTR_NAN_FUNC], 16004 nl80211_nan_func_policy, 16005 info->extack); 16006 if (err) 16007 return err; 16008 16009 func = kzalloc_obj(*func); 16010 if (!func) 16011 return -ENOMEM; 16012 16013 func->cookie = cfg80211_assign_cookie(rdev); 16014 16015 if (!tb[NL80211_NAN_FUNC_TYPE]) { 16016 err = -EINVAL; 16017 goto out; 16018 } 16019 16020 16021 func->type = nla_get_u8(tb[NL80211_NAN_FUNC_TYPE]); 16022 16023 if (!tb[NL80211_NAN_FUNC_SERVICE_ID]) { 16024 err = -EINVAL; 16025 goto out; 16026 } 16027 16028 memcpy(func->service_id, nla_data(tb[NL80211_NAN_FUNC_SERVICE_ID]), 16029 sizeof(func->service_id)); 16030 16031 func->close_range = 16032 nla_get_flag(tb[NL80211_NAN_FUNC_CLOSE_RANGE]); 16033 16034 if (tb[NL80211_NAN_FUNC_SERVICE_INFO]) { 16035 func->serv_spec_info_len = 16036 nla_len(tb[NL80211_NAN_FUNC_SERVICE_INFO]); 16037 func->serv_spec_info = 16038 kmemdup(nla_data(tb[NL80211_NAN_FUNC_SERVICE_INFO]), 16039 func->serv_spec_info_len, 16040 GFP_KERNEL); 16041 if (!func->serv_spec_info) { 16042 err = -ENOMEM; 16043 goto out; 16044 } 16045 } 16046 16047 if (tb[NL80211_NAN_FUNC_TTL]) 16048 func->ttl = nla_get_u32(tb[NL80211_NAN_FUNC_TTL]); 16049 16050 switch (func->type) { 16051 case NL80211_NAN_FUNC_PUBLISH: 16052 if (!tb[NL80211_NAN_FUNC_PUBLISH_TYPE]) { 16053 err = -EINVAL; 16054 goto out; 16055 } 16056 16057 func->publish_type = 16058 nla_get_u8(tb[NL80211_NAN_FUNC_PUBLISH_TYPE]); 16059 func->publish_bcast = 16060 nla_get_flag(tb[NL80211_NAN_FUNC_PUBLISH_BCAST]); 16061 16062 if ((!(func->publish_type & NL80211_NAN_SOLICITED_PUBLISH)) && 16063 func->publish_bcast) { 16064 err = -EINVAL; 16065 goto out; 16066 } 16067 break; 16068 case NL80211_NAN_FUNC_SUBSCRIBE: 16069 func->subscribe_active = 16070 nla_get_flag(tb[NL80211_NAN_FUNC_SUBSCRIBE_ACTIVE]); 16071 break; 16072 case NL80211_NAN_FUNC_FOLLOW_UP: 16073 if (!tb[NL80211_NAN_FUNC_FOLLOW_UP_ID] || 16074 !tb[NL80211_NAN_FUNC_FOLLOW_UP_REQ_ID] || 16075 !tb[NL80211_NAN_FUNC_FOLLOW_UP_DEST]) { 16076 err = -EINVAL; 16077 goto out; 16078 } 16079 16080 func->followup_id = 16081 nla_get_u8(tb[NL80211_NAN_FUNC_FOLLOW_UP_ID]); 16082 func->followup_reqid = 16083 nla_get_u8(tb[NL80211_NAN_FUNC_FOLLOW_UP_REQ_ID]); 16084 memcpy(func->followup_dest.addr, 16085 nla_data(tb[NL80211_NAN_FUNC_FOLLOW_UP_DEST]), 16086 sizeof(func->followup_dest.addr)); 16087 if (func->ttl) { 16088 err = -EINVAL; 16089 goto out; 16090 } 16091 break; 16092 default: 16093 err = -EINVAL; 16094 goto out; 16095 } 16096 16097 if (tb[NL80211_NAN_FUNC_SRF]) { 16098 struct nlattr *srf_tb[NUM_NL80211_NAN_SRF_ATTR]; 16099 16100 err = nla_parse_nested_deprecated(srf_tb, 16101 NL80211_NAN_SRF_ATTR_MAX, 16102 tb[NL80211_NAN_FUNC_SRF], 16103 nl80211_nan_srf_policy, 16104 info->extack); 16105 if (err) 16106 goto out; 16107 16108 func->srf_include = 16109 nla_get_flag(srf_tb[NL80211_NAN_SRF_INCLUDE]); 16110 16111 if (srf_tb[NL80211_NAN_SRF_BF]) { 16112 if (srf_tb[NL80211_NAN_SRF_MAC_ADDRS] || 16113 !srf_tb[NL80211_NAN_SRF_BF_IDX]) { 16114 err = -EINVAL; 16115 goto out; 16116 } 16117 16118 func->srf_bf_len = 16119 nla_len(srf_tb[NL80211_NAN_SRF_BF]); 16120 func->srf_bf = 16121 kmemdup(nla_data(srf_tb[NL80211_NAN_SRF_BF]), 16122 func->srf_bf_len, GFP_KERNEL); 16123 if (!func->srf_bf) { 16124 err = -ENOMEM; 16125 goto out; 16126 } 16127 16128 func->srf_bf_idx = 16129 nla_get_u8(srf_tb[NL80211_NAN_SRF_BF_IDX]); 16130 } else { 16131 struct nlattr *attr, *mac_attr = 16132 srf_tb[NL80211_NAN_SRF_MAC_ADDRS]; 16133 int n_entries, rem, i = 0; 16134 16135 if (!mac_attr) { 16136 err = -EINVAL; 16137 goto out; 16138 } 16139 16140 n_entries = validate_acl_mac_addrs(mac_attr); 16141 if (n_entries <= 0) { 16142 err = -EINVAL; 16143 goto out; 16144 } 16145 16146 func->srf_num_macs = n_entries; 16147 func->srf_macs = 16148 kzalloc_objs(*func->srf_macs, n_entries); 16149 if (!func->srf_macs) { 16150 err = -ENOMEM; 16151 goto out; 16152 } 16153 16154 nla_for_each_nested(attr, mac_attr, rem) 16155 memcpy(func->srf_macs[i++].addr, nla_data(attr), 16156 sizeof(*func->srf_macs)); 16157 } 16158 } 16159 16160 if (tb[NL80211_NAN_FUNC_TX_MATCH_FILTER]) { 16161 err = handle_nan_filter(tb[NL80211_NAN_FUNC_TX_MATCH_FILTER], 16162 func, true); 16163 if (err) 16164 goto out; 16165 } 16166 16167 if (tb[NL80211_NAN_FUNC_RX_MATCH_FILTER]) { 16168 err = handle_nan_filter(tb[NL80211_NAN_FUNC_RX_MATCH_FILTER], 16169 func, false); 16170 if (err) 16171 goto out; 16172 } 16173 16174 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 16175 if (!msg) { 16176 err = -ENOMEM; 16177 goto out; 16178 } 16179 16180 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 16181 NL80211_CMD_ADD_NAN_FUNCTION); 16182 /* This can't really happen - we just allocated 4KB */ 16183 if (WARN_ON(!hdr)) { 16184 err = -ENOMEM; 16185 goto out; 16186 } 16187 16188 err = rdev_add_nan_func(rdev, wdev, func); 16189 out: 16190 if (err < 0) { 16191 cfg80211_free_nan_func(func); 16192 nlmsg_free(msg); 16193 return err; 16194 } 16195 16196 /* propagate the instance id and cookie to userspace */ 16197 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, func->cookie, 16198 NL80211_ATTR_PAD)) 16199 goto nla_put_failure; 16200 16201 func_attr = nla_nest_start_noflag(msg, NL80211_ATTR_NAN_FUNC); 16202 if (!func_attr) 16203 goto nla_put_failure; 16204 16205 if (nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, 16206 func->instance_id)) 16207 goto nla_put_failure; 16208 16209 nla_nest_end(msg, func_attr); 16210 16211 genlmsg_end(msg, hdr); 16212 return genlmsg_reply(msg, info); 16213 16214 nla_put_failure: 16215 nlmsg_free(msg); 16216 return -ENOBUFS; 16217 } 16218 16219 static int nl80211_nan_del_func(struct sk_buff *skb, 16220 struct genl_info *info) 16221 { 16222 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 16223 struct wireless_dev *wdev = info->user_ptr[1]; 16224 u64 cookie; 16225 16226 if (wdev->iftype != NL80211_IFTYPE_NAN) 16227 return -EOPNOTSUPP; 16228 16229 if (!wdev_running(wdev)) 16230 return -ENOTCONN; 16231 16232 if (!info->attrs[NL80211_ATTR_COOKIE]) 16233 return -EINVAL; 16234 16235 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); 16236 16237 rdev_del_nan_func(rdev, wdev, cookie); 16238 16239 return 0; 16240 } 16241 16242 static int nl80211_nan_change_config(struct sk_buff *skb, 16243 struct genl_info *info) 16244 { 16245 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 16246 struct wireless_dev *wdev = info->user_ptr[1]; 16247 struct cfg80211_nan_conf conf = {}; 16248 u32 changed = 0; 16249 int err; 16250 16251 if (wdev->iftype != NL80211_IFTYPE_NAN) 16252 return -EOPNOTSUPP; 16253 16254 if (!wdev_running(wdev)) 16255 return -ENOTCONN; 16256 16257 err = nl80211_parse_nan_conf(&rdev->wiphy, info, &conf, &changed, false); 16258 if (err) 16259 return err; 16260 16261 if (!changed) 16262 return -EINVAL; 16263 16264 return rdev_nan_change_conf(rdev, wdev, &conf, changed); 16265 } 16266 16267 void cfg80211_nan_match(struct wireless_dev *wdev, 16268 struct cfg80211_nan_match_params *match, gfp_t gfp) 16269 { 16270 struct wiphy *wiphy = wdev->wiphy; 16271 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 16272 struct nlattr *match_attr, *local_func_attr, *peer_func_attr; 16273 struct sk_buff *msg; 16274 void *hdr; 16275 16276 if (WARN_ON(wiphy->nan_capa.flags & WIPHY_NAN_FLAGS_USERSPACE_DE)) 16277 return; 16278 16279 if (WARN_ON(!match->inst_id || !match->peer_inst_id || !match->addr)) 16280 return; 16281 16282 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 16283 if (!msg) 16284 return; 16285 16286 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NAN_MATCH); 16287 if (!hdr) { 16288 nlmsg_free(msg); 16289 return; 16290 } 16291 16292 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 16293 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 16294 wdev->netdev->ifindex)) || 16295 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 16296 NL80211_ATTR_PAD)) 16297 goto nla_put_failure; 16298 16299 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, match->cookie, 16300 NL80211_ATTR_PAD) || 16301 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, match->addr)) 16302 goto nla_put_failure; 16303 16304 match_attr = nla_nest_start_noflag(msg, NL80211_ATTR_NAN_MATCH); 16305 if (!match_attr) 16306 goto nla_put_failure; 16307 16308 local_func_attr = nla_nest_start_noflag(msg, 16309 NL80211_NAN_MATCH_FUNC_LOCAL); 16310 if (!local_func_attr) 16311 goto nla_put_failure; 16312 16313 if (nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, match->inst_id)) 16314 goto nla_put_failure; 16315 16316 nla_nest_end(msg, local_func_attr); 16317 16318 peer_func_attr = nla_nest_start_noflag(msg, 16319 NL80211_NAN_MATCH_FUNC_PEER); 16320 if (!peer_func_attr) 16321 goto nla_put_failure; 16322 16323 if (nla_put_u8(msg, NL80211_NAN_FUNC_TYPE, match->type) || 16324 nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, match->peer_inst_id)) 16325 goto nla_put_failure; 16326 16327 if (match->info && match->info_len && 16328 nla_put(msg, NL80211_NAN_FUNC_SERVICE_INFO, match->info_len, 16329 match->info)) 16330 goto nla_put_failure; 16331 16332 nla_nest_end(msg, peer_func_attr); 16333 nla_nest_end(msg, match_attr); 16334 genlmsg_end(msg, hdr); 16335 16336 if (!wdev->owner_nlportid) 16337 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), 16338 msg, 0, NL80211_MCGRP_NAN, gfp); 16339 else 16340 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, 16341 wdev->owner_nlportid); 16342 16343 return; 16344 16345 nla_put_failure: 16346 nlmsg_free(msg); 16347 } 16348 EXPORT_SYMBOL(cfg80211_nan_match); 16349 16350 void cfg80211_nan_func_terminated(struct wireless_dev *wdev, 16351 u8 inst_id, 16352 enum nl80211_nan_func_term_reason reason, 16353 u64 cookie, gfp_t gfp) 16354 { 16355 struct wiphy *wiphy = wdev->wiphy; 16356 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 16357 struct sk_buff *msg; 16358 struct nlattr *func_attr; 16359 void *hdr; 16360 16361 if (WARN_ON(wiphy->nan_capa.flags & WIPHY_NAN_FLAGS_USERSPACE_DE)) 16362 return; 16363 16364 if (WARN_ON(!inst_id)) 16365 return; 16366 16367 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 16368 if (!msg) 16369 return; 16370 16371 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_DEL_NAN_FUNCTION); 16372 if (!hdr) { 16373 nlmsg_free(msg); 16374 return; 16375 } 16376 16377 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 16378 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 16379 wdev->netdev->ifindex)) || 16380 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 16381 NL80211_ATTR_PAD)) 16382 goto nla_put_failure; 16383 16384 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie, 16385 NL80211_ATTR_PAD)) 16386 goto nla_put_failure; 16387 16388 func_attr = nla_nest_start_noflag(msg, NL80211_ATTR_NAN_FUNC); 16389 if (!func_attr) 16390 goto nla_put_failure; 16391 16392 if (nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, inst_id) || 16393 nla_put_u8(msg, NL80211_NAN_FUNC_TERM_REASON, reason)) 16394 goto nla_put_failure; 16395 16396 nla_nest_end(msg, func_attr); 16397 genlmsg_end(msg, hdr); 16398 16399 if (!wdev->owner_nlportid) 16400 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), 16401 msg, 0, NL80211_MCGRP_NAN, gfp); 16402 else 16403 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, 16404 wdev->owner_nlportid); 16405 16406 return; 16407 16408 nla_put_failure: 16409 nlmsg_free(msg); 16410 } 16411 EXPORT_SYMBOL(cfg80211_nan_func_terminated); 16412 16413 static int nl80211_get_protocol_features(struct sk_buff *skb, 16414 struct genl_info *info) 16415 { 16416 void *hdr; 16417 struct sk_buff *msg; 16418 16419 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 16420 if (!msg) 16421 return -ENOMEM; 16422 16423 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 16424 NL80211_CMD_GET_PROTOCOL_FEATURES); 16425 if (!hdr) 16426 goto nla_put_failure; 16427 16428 if (nla_put_u32(msg, NL80211_ATTR_PROTOCOL_FEATURES, 16429 NL80211_PROTOCOL_FEATURE_SPLIT_WIPHY_DUMP)) 16430 goto nla_put_failure; 16431 16432 genlmsg_end(msg, hdr); 16433 return genlmsg_reply(msg, info); 16434 16435 nla_put_failure: 16436 kfree_skb(msg); 16437 return -ENOBUFS; 16438 } 16439 16440 static int nl80211_update_ft_ies(struct sk_buff *skb, struct genl_info *info) 16441 { 16442 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 16443 struct cfg80211_update_ft_ies_params ft_params; 16444 struct net_device *dev = info->user_ptr[1]; 16445 16446 if (!rdev->ops->update_ft_ies) 16447 return -EOPNOTSUPP; 16448 16449 if (!info->attrs[NL80211_ATTR_MDID] || 16450 !info->attrs[NL80211_ATTR_IE]) 16451 return -EINVAL; 16452 16453 memset(&ft_params, 0, sizeof(ft_params)); 16454 ft_params.md = nla_get_u16(info->attrs[NL80211_ATTR_MDID]); 16455 ft_params.ie = nla_data(info->attrs[NL80211_ATTR_IE]); 16456 ft_params.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 16457 16458 return rdev_update_ft_ies(rdev, dev, &ft_params); 16459 } 16460 16461 static int nl80211_crit_protocol_start(struct sk_buff *skb, 16462 struct genl_info *info) 16463 { 16464 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 16465 struct wireless_dev *wdev = info->user_ptr[1]; 16466 enum nl80211_crit_proto_id proto = NL80211_CRIT_PROTO_UNSPEC; 16467 u16 duration; 16468 int ret; 16469 16470 if (!rdev->ops->crit_proto_start) 16471 return -EOPNOTSUPP; 16472 16473 if (WARN_ON(!rdev->ops->crit_proto_stop)) 16474 return -EINVAL; 16475 16476 if (rdev->crit_proto_nlportid) 16477 return -EBUSY; 16478 16479 /* determine protocol if provided */ 16480 if (info->attrs[NL80211_ATTR_CRIT_PROT_ID]) 16481 proto = nla_get_u16(info->attrs[NL80211_ATTR_CRIT_PROT_ID]); 16482 16483 if (proto >= NUM_NL80211_CRIT_PROTO) 16484 return -EINVAL; 16485 16486 /* timeout must be provided */ 16487 if (!info->attrs[NL80211_ATTR_MAX_CRIT_PROT_DURATION]) 16488 return -EINVAL; 16489 16490 duration = 16491 nla_get_u16(info->attrs[NL80211_ATTR_MAX_CRIT_PROT_DURATION]); 16492 16493 ret = rdev_crit_proto_start(rdev, wdev, proto, duration); 16494 if (!ret) 16495 rdev->crit_proto_nlportid = info->snd_portid; 16496 16497 return ret; 16498 } 16499 16500 static int nl80211_crit_protocol_stop(struct sk_buff *skb, 16501 struct genl_info *info) 16502 { 16503 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 16504 struct wireless_dev *wdev = info->user_ptr[1]; 16505 16506 if (!rdev->ops->crit_proto_stop) 16507 return -EOPNOTSUPP; 16508 16509 if (rdev->crit_proto_nlportid) { 16510 rdev->crit_proto_nlportid = 0; 16511 rdev_crit_proto_stop(rdev, wdev); 16512 } 16513 return 0; 16514 } 16515 16516 static int nl80211_vendor_check_policy(const struct wiphy_vendor_command *vcmd, 16517 struct nlattr *attr, 16518 struct netlink_ext_ack *extack) 16519 { 16520 if (vcmd->policy == VENDOR_CMD_RAW_DATA) { 16521 if (attr->nla_type & NLA_F_NESTED) { 16522 NL_SET_ERR_MSG_ATTR(extack, attr, 16523 "unexpected nested data"); 16524 return -EINVAL; 16525 } 16526 16527 return 0; 16528 } 16529 16530 if (!(attr->nla_type & NLA_F_NESTED)) { 16531 NL_SET_ERR_MSG_ATTR(extack, attr, "expected nested data"); 16532 return -EINVAL; 16533 } 16534 16535 return nla_validate_nested(attr, vcmd->maxattr, vcmd->policy, extack); 16536 } 16537 16538 static int nl80211_vendor_cmd(struct sk_buff *skb, struct genl_info *info) 16539 { 16540 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 16541 struct wireless_dev *wdev = 16542 __cfg80211_wdev_from_attrs(rdev, genl_info_net(info), 16543 info->attrs); 16544 int i, err; 16545 u32 vid, subcmd; 16546 16547 if (!rdev->wiphy.vendor_commands) 16548 return -EOPNOTSUPP; 16549 16550 if (IS_ERR(wdev)) { 16551 err = PTR_ERR(wdev); 16552 if (err != -EINVAL) 16553 return err; 16554 wdev = NULL; 16555 } else if (wdev->wiphy != &rdev->wiphy) { 16556 return -EINVAL; 16557 } 16558 16559 if (!info->attrs[NL80211_ATTR_VENDOR_ID] || 16560 !info->attrs[NL80211_ATTR_VENDOR_SUBCMD]) 16561 return -EINVAL; 16562 16563 vid = nla_get_u32(info->attrs[NL80211_ATTR_VENDOR_ID]); 16564 subcmd = nla_get_u32(info->attrs[NL80211_ATTR_VENDOR_SUBCMD]); 16565 for (i = 0; i < rdev->wiphy.n_vendor_commands; i++) { 16566 const struct wiphy_vendor_command *vcmd; 16567 void *data = NULL; 16568 int len = 0; 16569 16570 vcmd = &rdev->wiphy.vendor_commands[i]; 16571 16572 if (vcmd->info.vendor_id != vid || vcmd->info.subcmd != subcmd) 16573 continue; 16574 16575 if (vcmd->flags & (WIPHY_VENDOR_CMD_NEED_WDEV | 16576 WIPHY_VENDOR_CMD_NEED_NETDEV)) { 16577 if (!wdev) 16578 return -EINVAL; 16579 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_NETDEV && 16580 !wdev->netdev) 16581 return -EINVAL; 16582 16583 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_RUNNING) { 16584 if (!wdev_running(wdev)) 16585 return -ENETDOWN; 16586 } 16587 } else { 16588 wdev = NULL; 16589 } 16590 16591 if (!vcmd->doit) 16592 return -EOPNOTSUPP; 16593 16594 if (info->attrs[NL80211_ATTR_VENDOR_DATA]) { 16595 data = nla_data(info->attrs[NL80211_ATTR_VENDOR_DATA]); 16596 len = nla_len(info->attrs[NL80211_ATTR_VENDOR_DATA]); 16597 16598 err = nl80211_vendor_check_policy(vcmd, 16599 info->attrs[NL80211_ATTR_VENDOR_DATA], 16600 info->extack); 16601 if (err) 16602 return err; 16603 } 16604 16605 rdev->cur_cmd_info = info; 16606 err = vcmd->doit(&rdev->wiphy, wdev, data, len); 16607 rdev->cur_cmd_info = NULL; 16608 return err; 16609 } 16610 16611 return -EOPNOTSUPP; 16612 } 16613 16614 static int nl80211_prepare_vendor_dump(struct sk_buff *skb, 16615 struct netlink_callback *cb, 16616 struct cfg80211_registered_device **rdev, 16617 struct wireless_dev **wdev) 16618 { 16619 struct nlattr **attrbuf; 16620 u32 vid, subcmd; 16621 unsigned int i; 16622 int vcmd_idx = -1; 16623 int err; 16624 void *data = NULL; 16625 unsigned int data_len = 0; 16626 16627 if (cb->args[0]) { 16628 /* subtract the 1 again here */ 16629 struct wiphy *wiphy = wiphy_idx_to_wiphy(cb->args[0] - 1); 16630 struct wireless_dev *tmp; 16631 16632 if (!wiphy) 16633 return -ENODEV; 16634 *rdev = wiphy_to_rdev(wiphy); 16635 *wdev = NULL; 16636 16637 if (cb->args[1]) { 16638 list_for_each_entry(tmp, &wiphy->wdev_list, list) { 16639 if (tmp->identifier == cb->args[1] - 1) { 16640 *wdev = tmp; 16641 break; 16642 } 16643 } 16644 } 16645 16646 /* keep rtnl locked in successful case */ 16647 return 0; 16648 } 16649 16650 attrbuf = kzalloc_objs(*attrbuf, NUM_NL80211_ATTR); 16651 if (!attrbuf) 16652 return -ENOMEM; 16653 16654 err = nlmsg_parse_deprecated(cb->nlh, 16655 GENL_HDRLEN + nl80211_fam.hdrsize, 16656 attrbuf, nl80211_fam.maxattr, 16657 nl80211_policy, NULL); 16658 if (err) 16659 goto out; 16660 16661 if (!attrbuf[NL80211_ATTR_VENDOR_ID] || 16662 !attrbuf[NL80211_ATTR_VENDOR_SUBCMD]) { 16663 err = -EINVAL; 16664 goto out; 16665 } 16666 16667 *wdev = __cfg80211_wdev_from_attrs(NULL, sock_net(skb->sk), attrbuf); 16668 if (IS_ERR(*wdev)) 16669 *wdev = NULL; 16670 16671 *rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk), attrbuf); 16672 if (IS_ERR(*rdev)) { 16673 err = PTR_ERR(*rdev); 16674 goto out; 16675 } 16676 16677 vid = nla_get_u32(attrbuf[NL80211_ATTR_VENDOR_ID]); 16678 subcmd = nla_get_u32(attrbuf[NL80211_ATTR_VENDOR_SUBCMD]); 16679 16680 for (i = 0; i < (*rdev)->wiphy.n_vendor_commands; i++) { 16681 const struct wiphy_vendor_command *vcmd; 16682 16683 vcmd = &(*rdev)->wiphy.vendor_commands[i]; 16684 16685 if (vcmd->info.vendor_id != vid || vcmd->info.subcmd != subcmd) 16686 continue; 16687 16688 if (!vcmd->dumpit) { 16689 err = -EOPNOTSUPP; 16690 goto out; 16691 } 16692 16693 vcmd_idx = i; 16694 break; 16695 } 16696 16697 if (vcmd_idx < 0) { 16698 err = -EOPNOTSUPP; 16699 goto out; 16700 } 16701 16702 if (attrbuf[NL80211_ATTR_VENDOR_DATA]) { 16703 data = nla_data(attrbuf[NL80211_ATTR_VENDOR_DATA]); 16704 data_len = nla_len(attrbuf[NL80211_ATTR_VENDOR_DATA]); 16705 16706 err = nl80211_vendor_check_policy( 16707 &(*rdev)->wiphy.vendor_commands[vcmd_idx], 16708 attrbuf[NL80211_ATTR_VENDOR_DATA], 16709 cb->extack); 16710 if (err) 16711 goto out; 16712 } 16713 16714 /* 0 is the first index - add 1 to parse only once */ 16715 cb->args[0] = (*rdev)->wiphy_idx + 1; 16716 /* add 1 to know if it was NULL */ 16717 cb->args[1] = *wdev ? (*wdev)->identifier + 1 : 0; 16718 cb->args[2] = vcmd_idx; 16719 cb->args[3] = (unsigned long)data; 16720 cb->args[4] = data_len; 16721 16722 /* keep rtnl locked in successful case */ 16723 err = 0; 16724 out: 16725 kfree(attrbuf); 16726 return err; 16727 } 16728 16729 static int nl80211_vendor_cmd_dump(struct sk_buff *skb, 16730 struct netlink_callback *cb) 16731 { 16732 struct cfg80211_registered_device *rdev; 16733 struct wireless_dev *wdev; 16734 unsigned int vcmd_idx; 16735 const struct wiphy_vendor_command *vcmd; 16736 void *data; 16737 int data_len; 16738 int err; 16739 struct nlattr *vendor_data; 16740 16741 rtnl_lock(); 16742 err = nl80211_prepare_vendor_dump(skb, cb, &rdev, &wdev); 16743 if (err) 16744 goto out; 16745 16746 vcmd_idx = cb->args[2]; 16747 data = (void *)cb->args[3]; 16748 data_len = cb->args[4]; 16749 vcmd = &rdev->wiphy.vendor_commands[vcmd_idx]; 16750 16751 if (vcmd->flags & (WIPHY_VENDOR_CMD_NEED_WDEV | 16752 WIPHY_VENDOR_CMD_NEED_NETDEV)) { 16753 if (!wdev) { 16754 err = -EINVAL; 16755 goto out; 16756 } 16757 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_NETDEV && 16758 !wdev->netdev) { 16759 err = -EINVAL; 16760 goto out; 16761 } 16762 16763 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_RUNNING) { 16764 if (!wdev_running(wdev)) { 16765 err = -ENETDOWN; 16766 goto out; 16767 } 16768 } 16769 } 16770 16771 while (1) { 16772 void *hdr = nl80211hdr_put(skb, NETLINK_CB(cb->skb).portid, 16773 cb->nlh->nlmsg_seq, NLM_F_MULTI, 16774 NL80211_CMD_VENDOR); 16775 if (!hdr) 16776 break; 16777 16778 if (nla_put_u32(skb, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 16779 (wdev && nla_put_u64_64bit(skb, NL80211_ATTR_WDEV, 16780 wdev_id(wdev), 16781 NL80211_ATTR_PAD))) { 16782 genlmsg_cancel(skb, hdr); 16783 break; 16784 } 16785 16786 vendor_data = nla_nest_start_noflag(skb, 16787 NL80211_ATTR_VENDOR_DATA); 16788 if (!vendor_data) { 16789 genlmsg_cancel(skb, hdr); 16790 break; 16791 } 16792 16793 err = vcmd->dumpit(&rdev->wiphy, wdev, skb, data, data_len, 16794 (unsigned long *)&cb->args[5]); 16795 nla_nest_end(skb, vendor_data); 16796 16797 if (err == -ENOBUFS || err == -ENOENT) { 16798 genlmsg_cancel(skb, hdr); 16799 break; 16800 } else if (err <= 0) { 16801 genlmsg_cancel(skb, hdr); 16802 goto out; 16803 } 16804 16805 genlmsg_end(skb, hdr); 16806 } 16807 16808 err = skb->len; 16809 out: 16810 rtnl_unlock(); 16811 return err; 16812 } 16813 16814 struct sk_buff *__cfg80211_alloc_reply_skb(struct wiphy *wiphy, 16815 enum nl80211_commands cmd, 16816 enum nl80211_attrs attr, 16817 int approxlen) 16818 { 16819 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 16820 16821 if (WARN_ON(!rdev->cur_cmd_info)) 16822 return NULL; 16823 16824 return __cfg80211_alloc_vendor_skb(rdev, NULL, approxlen, 16825 rdev->cur_cmd_info->snd_portid, 16826 rdev->cur_cmd_info->snd_seq, 16827 cmd, attr, NULL, GFP_KERNEL); 16828 } 16829 EXPORT_SYMBOL(__cfg80211_alloc_reply_skb); 16830 16831 int cfg80211_vendor_cmd_reply(struct sk_buff *skb) 16832 { 16833 struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0]; 16834 void *hdr = ((void **)skb->cb)[1]; 16835 struct nlattr *data = ((void **)skb->cb)[2]; 16836 16837 /* clear CB data for netlink core to own from now on */ 16838 memset(skb->cb, 0, sizeof(skb->cb)); 16839 16840 if (WARN_ON(!rdev->cur_cmd_info)) { 16841 kfree_skb(skb); 16842 return -EINVAL; 16843 } 16844 16845 nla_nest_end(skb, data); 16846 genlmsg_end(skb, hdr); 16847 return genlmsg_reply(skb, rdev->cur_cmd_info); 16848 } 16849 EXPORT_SYMBOL_GPL(cfg80211_vendor_cmd_reply); 16850 16851 unsigned int cfg80211_vendor_cmd_get_sender(struct wiphy *wiphy) 16852 { 16853 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 16854 16855 if (WARN_ON(!rdev->cur_cmd_info)) 16856 return 0; 16857 16858 return rdev->cur_cmd_info->snd_portid; 16859 } 16860 EXPORT_SYMBOL_GPL(cfg80211_vendor_cmd_get_sender); 16861 16862 static int nl80211_set_qos_map(struct sk_buff *skb, 16863 struct genl_info *info) 16864 { 16865 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 16866 struct cfg80211_qos_map *qos_map = NULL; 16867 struct net_device *dev = info->user_ptr[1]; 16868 u8 *pos, len, num_des, des_len, des; 16869 int ret; 16870 16871 if (!rdev->ops->set_qos_map) 16872 return -EOPNOTSUPP; 16873 16874 if (info->attrs[NL80211_ATTR_QOS_MAP]) { 16875 pos = nla_data(info->attrs[NL80211_ATTR_QOS_MAP]); 16876 len = nla_len(info->attrs[NL80211_ATTR_QOS_MAP]); 16877 16878 if (len % 2) 16879 return -EINVAL; 16880 16881 qos_map = kzalloc_obj(struct cfg80211_qos_map); 16882 if (!qos_map) 16883 return -ENOMEM; 16884 16885 num_des = (len - IEEE80211_QOS_MAP_LEN_MIN) >> 1; 16886 if (num_des) { 16887 des_len = num_des * 16888 sizeof(struct cfg80211_dscp_exception); 16889 memcpy(qos_map->dscp_exception, pos, des_len); 16890 qos_map->num_des = num_des; 16891 for (des = 0; des < num_des; des++) { 16892 if (qos_map->dscp_exception[des].up > 7) { 16893 kfree(qos_map); 16894 return -EINVAL; 16895 } 16896 } 16897 pos += des_len; 16898 } 16899 memcpy(qos_map->up, pos, IEEE80211_QOS_MAP_LEN_MIN); 16900 } 16901 16902 ret = nl80211_key_allowed(dev->ieee80211_ptr); 16903 if (!ret) 16904 ret = rdev_set_qos_map(rdev, dev, qos_map); 16905 16906 kfree(qos_map); 16907 return ret; 16908 } 16909 16910 static int nl80211_add_tx_ts(struct sk_buff *skb, struct genl_info *info) 16911 { 16912 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 16913 struct net_device *dev = info->user_ptr[1]; 16914 struct wireless_dev *wdev = dev->ieee80211_ptr; 16915 const u8 *peer; 16916 u8 tsid, up; 16917 u16 admitted_time = 0; 16918 16919 if (!(rdev->wiphy.features & NL80211_FEATURE_SUPPORTS_WMM_ADMISSION)) 16920 return -EOPNOTSUPP; 16921 16922 if (!info->attrs[NL80211_ATTR_TSID] || !info->attrs[NL80211_ATTR_MAC] || 16923 !info->attrs[NL80211_ATTR_USER_PRIO]) 16924 return -EINVAL; 16925 16926 tsid = nla_get_u8(info->attrs[NL80211_ATTR_TSID]); 16927 up = nla_get_u8(info->attrs[NL80211_ATTR_USER_PRIO]); 16928 16929 /* WMM uses TIDs 0-7 even for TSPEC */ 16930 if (tsid >= IEEE80211_FIRST_TSPEC_TSID) { 16931 /* TODO: handle 802.11 TSPEC/admission control 16932 * need more attributes for that (e.g. BA session requirement); 16933 * change the WMM admission test above to allow both then 16934 */ 16935 return -EINVAL; 16936 } 16937 16938 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); 16939 16940 if (info->attrs[NL80211_ATTR_ADMITTED_TIME]) { 16941 admitted_time = 16942 nla_get_u16(info->attrs[NL80211_ATTR_ADMITTED_TIME]); 16943 if (!admitted_time) 16944 return -EINVAL; 16945 } 16946 16947 switch (wdev->iftype) { 16948 case NL80211_IFTYPE_STATION: 16949 case NL80211_IFTYPE_P2P_CLIENT: 16950 if (wdev->connected) 16951 break; 16952 return -ENOTCONN; 16953 default: 16954 return -EOPNOTSUPP; 16955 } 16956 16957 return rdev_add_tx_ts(rdev, dev, tsid, peer, up, admitted_time); 16958 } 16959 16960 static int nl80211_del_tx_ts(struct sk_buff *skb, struct genl_info *info) 16961 { 16962 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 16963 struct net_device *dev = info->user_ptr[1]; 16964 const u8 *peer; 16965 u8 tsid; 16966 16967 if (!info->attrs[NL80211_ATTR_TSID] || !info->attrs[NL80211_ATTR_MAC]) 16968 return -EINVAL; 16969 16970 tsid = nla_get_u8(info->attrs[NL80211_ATTR_TSID]); 16971 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); 16972 16973 return rdev_del_tx_ts(rdev, dev, tsid, peer); 16974 } 16975 16976 static int nl80211_tdls_channel_switch(struct sk_buff *skb, 16977 struct genl_info *info) 16978 { 16979 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 16980 struct net_device *dev = info->user_ptr[1]; 16981 struct wireless_dev *wdev = dev->ieee80211_ptr; 16982 struct cfg80211_chan_def chandef = {}; 16983 const u8 *addr; 16984 u8 oper_class; 16985 int err; 16986 16987 if (!rdev->ops->tdls_channel_switch || 16988 !(rdev->wiphy.features & NL80211_FEATURE_TDLS_CHANNEL_SWITCH)) 16989 return -EOPNOTSUPP; 16990 16991 switch (dev->ieee80211_ptr->iftype) { 16992 case NL80211_IFTYPE_STATION: 16993 case NL80211_IFTYPE_P2P_CLIENT: 16994 break; 16995 default: 16996 return -EOPNOTSUPP; 16997 } 16998 16999 if (!info->attrs[NL80211_ATTR_MAC] || 17000 !info->attrs[NL80211_ATTR_OPER_CLASS]) 17001 return -EINVAL; 17002 17003 err = nl80211_parse_chandef(rdev, info->extack, info->attrs, &chandef); 17004 if (err) 17005 return err; 17006 17007 /* 17008 * Don't allow wide channels on the 2.4Ghz band, as per IEEE802.11-2012 17009 * section 10.22.6.2.1. Disallow 5/10Mhz channels as well for now, the 17010 * specification is not defined for them. 17011 */ 17012 if (chandef.chan->band == NL80211_BAND_2GHZ && 17013 chandef.width != NL80211_CHAN_WIDTH_20_NOHT && 17014 chandef.width != NL80211_CHAN_WIDTH_20) 17015 return -EINVAL; 17016 17017 /* we will be active on the TDLS link */ 17018 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &chandef, 17019 wdev->iftype)) 17020 return -EINVAL; 17021 17022 /* don't allow switching to DFS channels */ 17023 if (cfg80211_chandef_dfs_required(wdev->wiphy, &chandef, wdev->iftype)) 17024 return -EINVAL; 17025 17026 addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 17027 oper_class = nla_get_u8(info->attrs[NL80211_ATTR_OPER_CLASS]); 17028 17029 return rdev_tdls_channel_switch(rdev, dev, addr, oper_class, &chandef); 17030 } 17031 17032 static int nl80211_tdls_cancel_channel_switch(struct sk_buff *skb, 17033 struct genl_info *info) 17034 { 17035 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 17036 struct net_device *dev = info->user_ptr[1]; 17037 const u8 *addr; 17038 17039 if (!rdev->ops->tdls_channel_switch || 17040 !rdev->ops->tdls_cancel_channel_switch || 17041 !(rdev->wiphy.features & NL80211_FEATURE_TDLS_CHANNEL_SWITCH)) 17042 return -EOPNOTSUPP; 17043 17044 switch (dev->ieee80211_ptr->iftype) { 17045 case NL80211_IFTYPE_STATION: 17046 case NL80211_IFTYPE_P2P_CLIENT: 17047 break; 17048 default: 17049 return -EOPNOTSUPP; 17050 } 17051 17052 if (!info->attrs[NL80211_ATTR_MAC]) 17053 return -EINVAL; 17054 17055 addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 17056 17057 rdev_tdls_cancel_channel_switch(rdev, dev, addr); 17058 17059 return 0; 17060 } 17061 17062 static int nl80211_set_multicast_to_unicast(struct sk_buff *skb, 17063 struct genl_info *info) 17064 { 17065 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 17066 struct net_device *dev = info->user_ptr[1]; 17067 struct wireless_dev *wdev = dev->ieee80211_ptr; 17068 const struct nlattr *nla; 17069 bool enabled; 17070 17071 if (!rdev->ops->set_multicast_to_unicast) 17072 return -EOPNOTSUPP; 17073 17074 if (wdev->iftype != NL80211_IFTYPE_AP && 17075 wdev->iftype != NL80211_IFTYPE_P2P_GO) 17076 return -EOPNOTSUPP; 17077 17078 nla = info->attrs[NL80211_ATTR_MULTICAST_TO_UNICAST_ENABLED]; 17079 enabled = nla_get_flag(nla); 17080 17081 return rdev_set_multicast_to_unicast(rdev, dev, enabled); 17082 } 17083 17084 static int nl80211_set_pmk(struct sk_buff *skb, struct genl_info *info) 17085 { 17086 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 17087 struct net_device *dev = info->user_ptr[1]; 17088 struct wireless_dev *wdev = dev->ieee80211_ptr; 17089 struct cfg80211_pmk_conf pmk_conf = {}; 17090 17091 if (wdev->iftype != NL80211_IFTYPE_STATION && 17092 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) 17093 return -EOPNOTSUPP; 17094 17095 if (!wiphy_ext_feature_isset(&rdev->wiphy, 17096 NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_1X)) 17097 return -EOPNOTSUPP; 17098 17099 if (!info->attrs[NL80211_ATTR_MAC] || !info->attrs[NL80211_ATTR_PMK]) 17100 return -EINVAL; 17101 17102 if (!wdev->connected) 17103 return -ENOTCONN; 17104 17105 pmk_conf.aa = nla_data(info->attrs[NL80211_ATTR_MAC]); 17106 if (memcmp(pmk_conf.aa, wdev->u.client.connected_addr, ETH_ALEN)) 17107 return -EINVAL; 17108 17109 pmk_conf.pmk = nla_data(info->attrs[NL80211_ATTR_PMK]); 17110 pmk_conf.pmk_len = nla_len(info->attrs[NL80211_ATTR_PMK]); 17111 if (pmk_conf.pmk_len != WLAN_PMK_LEN && 17112 pmk_conf.pmk_len != WLAN_PMK_LEN_SUITE_B_192) 17113 return -EINVAL; 17114 17115 if (info->attrs[NL80211_ATTR_PMKR0_NAME]) 17116 pmk_conf.pmk_r0_name = 17117 nla_data(info->attrs[NL80211_ATTR_PMKR0_NAME]); 17118 17119 return rdev_set_pmk(rdev, dev, &pmk_conf); 17120 } 17121 17122 static int nl80211_del_pmk(struct sk_buff *skb, struct genl_info *info) 17123 { 17124 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 17125 struct net_device *dev = info->user_ptr[1]; 17126 struct wireless_dev *wdev = dev->ieee80211_ptr; 17127 const u8 *aa; 17128 17129 if (wdev->iftype != NL80211_IFTYPE_STATION && 17130 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) 17131 return -EOPNOTSUPP; 17132 17133 if (!wiphy_ext_feature_isset(&rdev->wiphy, 17134 NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_1X)) 17135 return -EOPNOTSUPP; 17136 17137 if (!info->attrs[NL80211_ATTR_MAC]) 17138 return -EINVAL; 17139 17140 aa = nla_data(info->attrs[NL80211_ATTR_MAC]); 17141 return rdev_del_pmk(rdev, dev, aa); 17142 } 17143 17144 static int nl80211_external_auth(struct sk_buff *skb, struct genl_info *info) 17145 { 17146 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 17147 struct net_device *dev = info->user_ptr[1]; 17148 struct cfg80211_external_auth_params params; 17149 17150 if (!rdev->ops->external_auth) 17151 return -EOPNOTSUPP; 17152 17153 if (!info->attrs[NL80211_ATTR_SSID] && 17154 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 17155 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 17156 return -EINVAL; 17157 17158 if (!info->attrs[NL80211_ATTR_BSSID]) 17159 return -EINVAL; 17160 17161 if (!info->attrs[NL80211_ATTR_STATUS_CODE]) 17162 return -EINVAL; 17163 17164 memset(¶ms, 0, sizeof(params)); 17165 17166 if (info->attrs[NL80211_ATTR_SSID]) { 17167 params.ssid.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); 17168 if (params.ssid.ssid_len == 0) 17169 return -EINVAL; 17170 memcpy(params.ssid.ssid, 17171 nla_data(info->attrs[NL80211_ATTR_SSID]), 17172 params.ssid.ssid_len); 17173 } 17174 17175 memcpy(params.bssid, nla_data(info->attrs[NL80211_ATTR_BSSID]), 17176 ETH_ALEN); 17177 17178 params.status = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]); 17179 17180 if (info->attrs[NL80211_ATTR_PMKID]) 17181 params.pmkid = nla_data(info->attrs[NL80211_ATTR_PMKID]); 17182 17183 return rdev_external_auth(rdev, dev, ¶ms); 17184 } 17185 17186 static int nl80211_tx_control_port(struct sk_buff *skb, struct genl_info *info) 17187 { 17188 bool dont_wait_for_ack = info->attrs[NL80211_ATTR_DONT_WAIT_FOR_ACK]; 17189 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 17190 struct net_device *dev = info->user_ptr[1]; 17191 struct wireless_dev *wdev = dev->ieee80211_ptr; 17192 const u8 *buf; 17193 size_t len; 17194 u8 *dest; 17195 u16 proto; 17196 bool noencrypt; 17197 u64 cookie = 0; 17198 int link_id; 17199 int err; 17200 17201 if (!wiphy_ext_feature_isset(&rdev->wiphy, 17202 NL80211_EXT_FEATURE_CONTROL_PORT_OVER_NL80211)) 17203 return -EOPNOTSUPP; 17204 17205 if (!rdev->ops->tx_control_port) 17206 return -EOPNOTSUPP; 17207 17208 if (!info->attrs[NL80211_ATTR_FRAME] || 17209 !info->attrs[NL80211_ATTR_MAC] || 17210 !info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]) { 17211 GENL_SET_ERR_MSG(info, "Frame, MAC or ethertype missing"); 17212 return -EINVAL; 17213 } 17214 17215 switch (wdev->iftype) { 17216 case NL80211_IFTYPE_AP: 17217 case NL80211_IFTYPE_P2P_GO: 17218 case NL80211_IFTYPE_MESH_POINT: 17219 break; 17220 case NL80211_IFTYPE_ADHOC: 17221 if (wdev->u.ibss.current_bss) 17222 break; 17223 return -ENOTCONN; 17224 case NL80211_IFTYPE_STATION: 17225 case NL80211_IFTYPE_P2P_CLIENT: 17226 if (wdev->connected) 17227 break; 17228 return -ENOTCONN; 17229 default: 17230 return -EOPNOTSUPP; 17231 } 17232 17233 buf = nla_data(info->attrs[NL80211_ATTR_FRAME]); 17234 len = nla_len(info->attrs[NL80211_ATTR_FRAME]); 17235 dest = nla_data(info->attrs[NL80211_ATTR_MAC]); 17236 proto = nla_get_u16(info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]); 17237 noencrypt = 17238 nla_get_flag(info->attrs[NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT]); 17239 17240 link_id = nl80211_link_id_or_invalid(info->attrs); 17241 17242 err = rdev_tx_control_port(rdev, dev, buf, len, 17243 dest, cpu_to_be16(proto), noencrypt, link_id, 17244 dont_wait_for_ack ? NULL : &cookie); 17245 if (!err && !dont_wait_for_ack) 17246 nl_set_extack_cookie_u64(info->extack, cookie); 17247 return err; 17248 } 17249 17250 static int nl80211_get_ftm_responder_stats(struct sk_buff *skb, 17251 struct genl_info *info) 17252 { 17253 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 17254 struct net_device *dev = info->user_ptr[1]; 17255 struct wireless_dev *wdev = dev->ieee80211_ptr; 17256 struct cfg80211_ftm_responder_stats ftm_stats = {}; 17257 unsigned int link_id = nl80211_link_id(info->attrs); 17258 struct sk_buff *msg; 17259 void *hdr; 17260 struct nlattr *ftm_stats_attr; 17261 int err; 17262 17263 if (wdev->iftype != NL80211_IFTYPE_AP || 17264 !wdev->links[link_id].ap.beacon_interval) 17265 return -EOPNOTSUPP; 17266 17267 err = rdev_get_ftm_responder_stats(rdev, dev, &ftm_stats); 17268 if (err) 17269 return err; 17270 17271 if (!ftm_stats.filled) 17272 return -ENODATA; 17273 17274 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 17275 if (!msg) 17276 return -ENOMEM; 17277 17278 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 17279 NL80211_CMD_GET_FTM_RESPONDER_STATS); 17280 if (!hdr) 17281 goto nla_put_failure; 17282 17283 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) 17284 goto nla_put_failure; 17285 17286 ftm_stats_attr = nla_nest_start_noflag(msg, 17287 NL80211_ATTR_FTM_RESPONDER_STATS); 17288 if (!ftm_stats_attr) 17289 goto nla_put_failure; 17290 17291 #define SET_FTM(field, name, type) \ 17292 do { if ((ftm_stats.filled & BIT(NL80211_FTM_STATS_ ## name)) && \ 17293 nla_put_ ## type(msg, NL80211_FTM_STATS_ ## name, \ 17294 ftm_stats.field)) \ 17295 goto nla_put_failure; } while (0) 17296 #define SET_FTM_U64(field, name) \ 17297 do { if ((ftm_stats.filled & BIT(NL80211_FTM_STATS_ ## name)) && \ 17298 nla_put_u64_64bit(msg, NL80211_FTM_STATS_ ## name, \ 17299 ftm_stats.field, NL80211_FTM_STATS_PAD)) \ 17300 goto nla_put_failure; } while (0) 17301 17302 SET_FTM(success_num, SUCCESS_NUM, u32); 17303 SET_FTM(partial_num, PARTIAL_NUM, u32); 17304 SET_FTM(failed_num, FAILED_NUM, u32); 17305 SET_FTM(asap_num, ASAP_NUM, u32); 17306 SET_FTM(non_asap_num, NON_ASAP_NUM, u32); 17307 SET_FTM_U64(total_duration_ms, TOTAL_DURATION_MSEC); 17308 SET_FTM(unknown_triggers_num, UNKNOWN_TRIGGERS_NUM, u32); 17309 SET_FTM(reschedule_requests_num, RESCHEDULE_REQUESTS_NUM, u32); 17310 SET_FTM(out_of_window_triggers_num, OUT_OF_WINDOW_TRIGGERS_NUM, u32); 17311 #undef SET_FTM 17312 17313 nla_nest_end(msg, ftm_stats_attr); 17314 17315 genlmsg_end(msg, hdr); 17316 return genlmsg_reply(msg, info); 17317 17318 nla_put_failure: 17319 nlmsg_free(msg); 17320 return -ENOBUFS; 17321 } 17322 17323 static int nl80211_update_owe_info(struct sk_buff *skb, struct genl_info *info) 17324 { 17325 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 17326 struct cfg80211_update_owe_info owe_info; 17327 struct net_device *dev = info->user_ptr[1]; 17328 17329 if (!rdev->ops->update_owe_info) 17330 return -EOPNOTSUPP; 17331 17332 if (!info->attrs[NL80211_ATTR_STATUS_CODE] || 17333 !info->attrs[NL80211_ATTR_MAC]) 17334 return -EINVAL; 17335 17336 memset(&owe_info, 0, sizeof(owe_info)); 17337 owe_info.status = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]); 17338 nla_memcpy(owe_info.peer, info->attrs[NL80211_ATTR_MAC], ETH_ALEN); 17339 17340 if (info->attrs[NL80211_ATTR_IE]) { 17341 owe_info.ie = nla_data(info->attrs[NL80211_ATTR_IE]); 17342 owe_info.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 17343 } 17344 17345 return rdev_update_owe_info(rdev, dev, &owe_info); 17346 } 17347 17348 static int nl80211_probe_mesh_link(struct sk_buff *skb, struct genl_info *info) 17349 { 17350 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 17351 struct net_device *dev = info->user_ptr[1]; 17352 struct wireless_dev *wdev = dev->ieee80211_ptr; 17353 struct station_info sinfo = {}; 17354 const u8 *buf; 17355 size_t len; 17356 u8 *dest; 17357 int err; 17358 17359 if (!rdev->ops->probe_mesh_link || !rdev->ops->get_station) 17360 return -EOPNOTSUPP; 17361 17362 if (!info->attrs[NL80211_ATTR_MAC] || 17363 !info->attrs[NL80211_ATTR_FRAME]) { 17364 GENL_SET_ERR_MSG(info, "Frame or MAC missing"); 17365 return -EINVAL; 17366 } 17367 17368 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) 17369 return -EOPNOTSUPP; 17370 17371 dest = nla_data(info->attrs[NL80211_ATTR_MAC]); 17372 buf = nla_data(info->attrs[NL80211_ATTR_FRAME]); 17373 len = nla_len(info->attrs[NL80211_ATTR_FRAME]); 17374 17375 if (len < sizeof(struct ethhdr)) 17376 return -EINVAL; 17377 17378 if (!ether_addr_equal(buf, dest) || is_multicast_ether_addr(buf) || 17379 !ether_addr_equal(buf + ETH_ALEN, dev->dev_addr)) 17380 return -EINVAL; 17381 17382 err = rdev_get_station(rdev, wdev, dest, &sinfo); 17383 if (err) 17384 return err; 17385 17386 cfg80211_sinfo_release_content(&sinfo); 17387 17388 return rdev_probe_mesh_link(rdev, dev, dest, buf, len); 17389 } 17390 17391 static int parse_tid_conf(struct cfg80211_registered_device *rdev, 17392 struct nlattr *attrs[], struct net_device *dev, 17393 struct cfg80211_tid_cfg *tid_conf, 17394 struct genl_info *info, const u8 *peer, 17395 unsigned int link_id) 17396 { 17397 struct netlink_ext_ack *extack = info->extack; 17398 u64 mask; 17399 int err; 17400 17401 if (!attrs[NL80211_TID_CONFIG_ATTR_TIDS]) 17402 return -EINVAL; 17403 17404 tid_conf->config_override = 17405 nla_get_flag(attrs[NL80211_TID_CONFIG_ATTR_OVERRIDE]); 17406 tid_conf->tids = nla_get_u16(attrs[NL80211_TID_CONFIG_ATTR_TIDS]); 17407 17408 if (tid_conf->config_override) { 17409 if (rdev->ops->reset_tid_config) { 17410 err = rdev_reset_tid_config(rdev, dev, peer, 17411 tid_conf->tids); 17412 if (err) 17413 return err; 17414 } else { 17415 return -EINVAL; 17416 } 17417 } 17418 17419 if (attrs[NL80211_TID_CONFIG_ATTR_NOACK]) { 17420 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_NOACK); 17421 tid_conf->noack = 17422 nla_get_u8(attrs[NL80211_TID_CONFIG_ATTR_NOACK]); 17423 } 17424 17425 if (attrs[NL80211_TID_CONFIG_ATTR_RETRY_SHORT]) { 17426 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_RETRY_SHORT); 17427 tid_conf->retry_short = 17428 nla_get_u8(attrs[NL80211_TID_CONFIG_ATTR_RETRY_SHORT]); 17429 17430 if (tid_conf->retry_short > rdev->wiphy.max_data_retry_count) 17431 return -EINVAL; 17432 } 17433 17434 if (attrs[NL80211_TID_CONFIG_ATTR_RETRY_LONG]) { 17435 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_RETRY_LONG); 17436 tid_conf->retry_long = 17437 nla_get_u8(attrs[NL80211_TID_CONFIG_ATTR_RETRY_LONG]); 17438 17439 if (tid_conf->retry_long > rdev->wiphy.max_data_retry_count) 17440 return -EINVAL; 17441 } 17442 17443 if (attrs[NL80211_TID_CONFIG_ATTR_AMPDU_CTRL]) { 17444 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_AMPDU_CTRL); 17445 tid_conf->ampdu = 17446 nla_get_u8(attrs[NL80211_TID_CONFIG_ATTR_AMPDU_CTRL]); 17447 } 17448 17449 if (attrs[NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL]) { 17450 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL); 17451 tid_conf->rtscts = 17452 nla_get_u8(attrs[NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL]); 17453 } 17454 17455 if (attrs[NL80211_TID_CONFIG_ATTR_AMSDU_CTRL]) { 17456 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_AMSDU_CTRL); 17457 tid_conf->amsdu = 17458 nla_get_u8(attrs[NL80211_TID_CONFIG_ATTR_AMSDU_CTRL]); 17459 } 17460 17461 if (attrs[NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE]) { 17462 u32 idx = NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE, attr; 17463 17464 tid_conf->txrate_type = nla_get_u8(attrs[idx]); 17465 17466 if (tid_conf->txrate_type != NL80211_TX_RATE_AUTOMATIC) { 17467 attr = NL80211_TID_CONFIG_ATTR_TX_RATE; 17468 err = nl80211_parse_tx_bitrate_mask(info, attrs, attr, 17469 &tid_conf->txrate_mask, dev, 17470 true, link_id); 17471 if (err) 17472 return err; 17473 17474 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_TX_RATE); 17475 } 17476 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE); 17477 } 17478 17479 if (peer) 17480 mask = rdev->wiphy.tid_config_support.peer; 17481 else 17482 mask = rdev->wiphy.tid_config_support.vif; 17483 17484 if (tid_conf->mask & ~mask) { 17485 NL_SET_ERR_MSG(extack, "unsupported TID configuration"); 17486 return -EOPNOTSUPP; 17487 } 17488 17489 return 0; 17490 } 17491 17492 static int nl80211_set_tid_config(struct sk_buff *skb, 17493 struct genl_info *info) 17494 { 17495 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 17496 struct nlattr *attrs[NL80211_TID_CONFIG_ATTR_MAX + 1]; 17497 unsigned int link_id = nl80211_link_id(info->attrs); 17498 struct net_device *dev = info->user_ptr[1]; 17499 struct cfg80211_tid_config *tid_config; 17500 struct nlattr *tid; 17501 int conf_idx = 0, rem_conf; 17502 int ret = -EINVAL; 17503 u32 num_conf = 0; 17504 17505 if (!info->attrs[NL80211_ATTR_TID_CONFIG]) 17506 return -EINVAL; 17507 17508 if (!rdev->ops->set_tid_config) 17509 return -EOPNOTSUPP; 17510 17511 nla_for_each_nested(tid, info->attrs[NL80211_ATTR_TID_CONFIG], 17512 rem_conf) 17513 num_conf++; 17514 17515 tid_config = kzalloc_flex(*tid_config, tid_conf, num_conf); 17516 if (!tid_config) 17517 return -ENOMEM; 17518 17519 tid_config->n_tid_conf = num_conf; 17520 17521 if (info->attrs[NL80211_ATTR_MAC]) 17522 tid_config->peer = nla_data(info->attrs[NL80211_ATTR_MAC]); 17523 17524 nla_for_each_nested(tid, info->attrs[NL80211_ATTR_TID_CONFIG], 17525 rem_conf) { 17526 ret = nla_parse_nested(attrs, NL80211_TID_CONFIG_ATTR_MAX, 17527 tid, NULL, NULL); 17528 17529 if (ret) 17530 goto bad_tid_conf; 17531 17532 ret = parse_tid_conf(rdev, attrs, dev, 17533 &tid_config->tid_conf[conf_idx], 17534 info, tid_config->peer, link_id); 17535 if (ret) 17536 goto bad_tid_conf; 17537 17538 conf_idx++; 17539 } 17540 17541 ret = rdev_set_tid_config(rdev, dev, tid_config); 17542 17543 bad_tid_conf: 17544 kfree(tid_config); 17545 return ret; 17546 } 17547 17548 static int nl80211_color_change(struct sk_buff *skb, struct genl_info *info) 17549 { 17550 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 17551 struct cfg80211_color_change_settings params = {}; 17552 struct net_device *dev = info->user_ptr[1]; 17553 struct wireless_dev *wdev = dev->ieee80211_ptr; 17554 struct nlattr **tb; 17555 u16 offset; 17556 int err; 17557 17558 if (!rdev->ops->color_change) 17559 return -EOPNOTSUPP; 17560 17561 if (!wiphy_ext_feature_isset(&rdev->wiphy, 17562 NL80211_EXT_FEATURE_BSS_COLOR)) 17563 return -EOPNOTSUPP; 17564 17565 if (wdev->iftype != NL80211_IFTYPE_AP) 17566 return -EOPNOTSUPP; 17567 17568 if (!info->attrs[NL80211_ATTR_COLOR_CHANGE_COUNT] || 17569 !info->attrs[NL80211_ATTR_COLOR_CHANGE_COLOR] || 17570 !info->attrs[NL80211_ATTR_COLOR_CHANGE_ELEMS]) 17571 return -EINVAL; 17572 17573 params.count = nla_get_u8(info->attrs[NL80211_ATTR_COLOR_CHANGE_COUNT]); 17574 params.color = nla_get_u8(info->attrs[NL80211_ATTR_COLOR_CHANGE_COLOR]); 17575 17576 err = nl80211_parse_beacon(rdev, info->attrs, ¶ms.beacon_next, 17577 info->extack); 17578 if (err) 17579 return err; 17580 17581 tb = kzalloc_objs(*tb, NL80211_ATTR_MAX + 1); 17582 if (!tb) 17583 return -ENOMEM; 17584 17585 err = nla_parse_nested(tb, NL80211_ATTR_MAX, 17586 info->attrs[NL80211_ATTR_COLOR_CHANGE_ELEMS], 17587 nl80211_policy, info->extack); 17588 if (err) 17589 goto out; 17590 17591 err = nl80211_parse_beacon(rdev, tb, ¶ms.beacon_color_change, 17592 info->extack); 17593 if (err) 17594 goto out; 17595 17596 if (!tb[NL80211_ATTR_CNTDWN_OFFS_BEACON]) { 17597 err = -EINVAL; 17598 goto out; 17599 } 17600 17601 if (nla_len(tb[NL80211_ATTR_CNTDWN_OFFS_BEACON]) != sizeof(u16)) { 17602 err = -EINVAL; 17603 goto out; 17604 } 17605 17606 offset = nla_get_u16(tb[NL80211_ATTR_CNTDWN_OFFS_BEACON]); 17607 if (offset >= params.beacon_color_change.tail_len) { 17608 err = -EINVAL; 17609 goto out; 17610 } 17611 17612 if (params.beacon_color_change.tail[offset] != params.count) { 17613 err = -EINVAL; 17614 goto out; 17615 } 17616 17617 params.counter_offset_beacon = offset; 17618 17619 if (tb[NL80211_ATTR_CNTDWN_OFFS_PRESP]) { 17620 if (nla_len(tb[NL80211_ATTR_CNTDWN_OFFS_PRESP]) != 17621 sizeof(u16)) { 17622 err = -EINVAL; 17623 goto out; 17624 } 17625 17626 offset = nla_get_u16(tb[NL80211_ATTR_CNTDWN_OFFS_PRESP]); 17627 if (offset >= params.beacon_color_change.probe_resp_len) { 17628 err = -EINVAL; 17629 goto out; 17630 } 17631 17632 if (params.beacon_color_change.probe_resp[offset] != 17633 params.count) { 17634 err = -EINVAL; 17635 goto out; 17636 } 17637 17638 params.counter_offset_presp = offset; 17639 } 17640 17641 if (info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP]) { 17642 err = nl80211_parse_unsol_bcast_probe_resp( 17643 rdev, info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP], 17644 ¶ms.unsol_bcast_probe_resp); 17645 if (err) 17646 goto out; 17647 } 17648 17649 params.link_id = nl80211_link_id(info->attrs); 17650 err = rdev_color_change(rdev, dev, ¶ms); 17651 17652 out: 17653 kfree(params.beacon_next.mbssid_ies); 17654 kfree(params.beacon_color_change.mbssid_ies); 17655 kfree(params.beacon_next.rnr_ies); 17656 kfree(params.beacon_color_change.rnr_ies); 17657 kfree(tb); 17658 return err; 17659 } 17660 17661 static int nl80211_set_fils_aad(struct sk_buff *skb, 17662 struct genl_info *info) 17663 { 17664 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 17665 struct net_device *dev = info->user_ptr[1]; 17666 struct cfg80211_fils_aad fils_aad = {}; 17667 u8 *nonces; 17668 17669 if (!info->attrs[NL80211_ATTR_MAC] || 17670 !info->attrs[NL80211_ATTR_FILS_KEK] || 17671 !info->attrs[NL80211_ATTR_FILS_NONCES]) 17672 return -EINVAL; 17673 17674 fils_aad.macaddr = nla_data(info->attrs[NL80211_ATTR_MAC]); 17675 fils_aad.kek_len = nla_len(info->attrs[NL80211_ATTR_FILS_KEK]); 17676 fils_aad.kek = nla_data(info->attrs[NL80211_ATTR_FILS_KEK]); 17677 nonces = nla_data(info->attrs[NL80211_ATTR_FILS_NONCES]); 17678 fils_aad.snonce = nonces; 17679 fils_aad.anonce = nonces + FILS_NONCE_LEN; 17680 17681 return rdev_set_fils_aad(rdev, dev, &fils_aad); 17682 } 17683 17684 static int nl80211_add_link(struct sk_buff *skb, struct genl_info *info) 17685 { 17686 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 17687 unsigned int link_id = nl80211_link_id(info->attrs); 17688 struct net_device *dev = info->user_ptr[1]; 17689 struct wireless_dev *wdev = dev->ieee80211_ptr; 17690 int ret; 17691 17692 if (!(wdev->wiphy->flags & WIPHY_FLAG_SUPPORTS_MLO)) 17693 return -EINVAL; 17694 17695 switch (wdev->iftype) { 17696 case NL80211_IFTYPE_AP: 17697 break; 17698 default: 17699 return -EINVAL; 17700 } 17701 17702 if (!info->attrs[NL80211_ATTR_MAC] || 17703 !is_valid_ether_addr(nla_data(info->attrs[NL80211_ATTR_MAC]))) 17704 return -EINVAL; 17705 17706 wdev->valid_links |= BIT(link_id); 17707 ether_addr_copy(wdev->links[link_id].addr, 17708 nla_data(info->attrs[NL80211_ATTR_MAC])); 17709 17710 ret = rdev_add_intf_link(rdev, wdev, link_id); 17711 if (ret) { 17712 wdev->valid_links &= ~BIT(link_id); 17713 eth_zero_addr(wdev->links[link_id].addr); 17714 } 17715 17716 return ret; 17717 } 17718 17719 static int nl80211_remove_link(struct sk_buff *skb, struct genl_info *info) 17720 { 17721 unsigned int link_id = nl80211_link_id(info->attrs); 17722 struct net_device *dev = info->user_ptr[1]; 17723 struct wireless_dev *wdev = dev->ieee80211_ptr; 17724 17725 /* cannot remove if there's no link */ 17726 if (!info->attrs[NL80211_ATTR_MLO_LINK_ID]) 17727 return -EINVAL; 17728 17729 switch (wdev->iftype) { 17730 case NL80211_IFTYPE_AP: 17731 break; 17732 default: 17733 return -EINVAL; 17734 } 17735 17736 cfg80211_remove_link(wdev, link_id); 17737 17738 return 0; 17739 } 17740 17741 static int 17742 nl80211_add_mod_link_station(struct sk_buff *skb, struct genl_info *info, 17743 bool add) 17744 { 17745 struct link_station_parameters params = {}; 17746 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 17747 struct net_device *dev = info->user_ptr[1]; 17748 int err; 17749 17750 if ((add && !rdev->ops->add_link_station) || 17751 (!add && !rdev->ops->mod_link_station)) 17752 return -EOPNOTSUPP; 17753 17754 if (add && !info->attrs[NL80211_ATTR_MAC]) 17755 return -EINVAL; 17756 17757 if (!info->attrs[NL80211_ATTR_MLD_ADDR]) 17758 return -EINVAL; 17759 17760 if (add && !info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) 17761 return -EINVAL; 17762 17763 params.mld_mac = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]); 17764 17765 if (info->attrs[NL80211_ATTR_MAC]) { 17766 params.link_mac = nla_data(info->attrs[NL80211_ATTR_MAC]); 17767 if (!is_valid_ether_addr(params.link_mac)) 17768 return -EINVAL; 17769 } 17770 17771 if (!info->attrs[NL80211_ATTR_MLO_LINK_ID]) 17772 return -EINVAL; 17773 17774 params.link_id = nla_get_u8(info->attrs[NL80211_ATTR_MLO_LINK_ID]); 17775 17776 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) { 17777 params.supported_rates = 17778 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); 17779 params.supported_rates_len = 17780 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); 17781 } 17782 17783 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) 17784 params.ht_capa = 17785 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]); 17786 17787 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) 17788 params.vht_capa = 17789 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]); 17790 17791 if (info->attrs[NL80211_ATTR_HE_CAPABILITY]) { 17792 params.he_capa = 17793 nla_data(info->attrs[NL80211_ATTR_HE_CAPABILITY]); 17794 params.he_capa_len = 17795 nla_len(info->attrs[NL80211_ATTR_HE_CAPABILITY]); 17796 17797 if (info->attrs[NL80211_ATTR_EHT_CAPABILITY]) { 17798 params.eht_capa = 17799 nla_data(info->attrs[NL80211_ATTR_EHT_CAPABILITY]); 17800 params.eht_capa_len = 17801 nla_len(info->attrs[NL80211_ATTR_EHT_CAPABILITY]); 17802 17803 if (!ieee80211_eht_capa_size_ok((const u8 *)params.he_capa, 17804 (const u8 *)params.eht_capa, 17805 params.eht_capa_len, 17806 false)) 17807 return -EINVAL; 17808 } 17809 } 17810 17811 if (info->attrs[NL80211_ATTR_UHR_CAPABILITY]) { 17812 if (!params.eht_capa) 17813 return -EINVAL; 17814 17815 params.uhr_capa = 17816 nla_data(info->attrs[NL80211_ATTR_UHR_CAPABILITY]); 17817 params.uhr_capa_len = 17818 nla_len(info->attrs[NL80211_ATTR_UHR_CAPABILITY]); 17819 } 17820 17821 if (info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]) 17822 params.he_6ghz_capa = 17823 nla_data(info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]); 17824 17825 if (info->attrs[NL80211_ATTR_OPMODE_NOTIF]) { 17826 params.opmode_notif_used = true; 17827 params.opmode_notif = 17828 nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]); 17829 } 17830 17831 err = nl80211_parse_sta_txpower_setting(info, ¶ms.txpwr, 17832 ¶ms.txpwr_set); 17833 if (err) 17834 return err; 17835 17836 if (add) 17837 return rdev_add_link_station(rdev, dev, ¶ms); 17838 17839 return rdev_mod_link_station(rdev, dev, ¶ms); 17840 } 17841 17842 static int 17843 nl80211_add_link_station(struct sk_buff *skb, struct genl_info *info) 17844 { 17845 return nl80211_add_mod_link_station(skb, info, true); 17846 } 17847 17848 static int 17849 nl80211_modify_link_station(struct sk_buff *skb, struct genl_info *info) 17850 { 17851 return nl80211_add_mod_link_station(skb, info, false); 17852 } 17853 17854 static int 17855 nl80211_remove_link_station(struct sk_buff *skb, struct genl_info *info) 17856 { 17857 struct link_station_del_parameters params = {}; 17858 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 17859 struct net_device *dev = info->user_ptr[1]; 17860 17861 if (!rdev->ops->del_link_station) 17862 return -EOPNOTSUPP; 17863 17864 if (!info->attrs[NL80211_ATTR_MLD_ADDR] || 17865 !info->attrs[NL80211_ATTR_MLO_LINK_ID]) 17866 return -EINVAL; 17867 17868 params.mld_mac = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]); 17869 params.link_id = nla_get_u8(info->attrs[NL80211_ATTR_MLO_LINK_ID]); 17870 17871 return rdev_del_link_station(rdev, dev, ¶ms); 17872 } 17873 17874 static int nl80211_set_hw_timestamp(struct sk_buff *skb, 17875 struct genl_info *info) 17876 { 17877 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 17878 struct net_device *dev = info->user_ptr[1]; 17879 struct cfg80211_set_hw_timestamp hwts = {}; 17880 17881 if (!rdev->wiphy.hw_timestamp_max_peers) 17882 return -EOPNOTSUPP; 17883 17884 if (!info->attrs[NL80211_ATTR_MAC] && 17885 rdev->wiphy.hw_timestamp_max_peers != CFG80211_HW_TIMESTAMP_ALL_PEERS) 17886 return -EOPNOTSUPP; 17887 17888 if (info->attrs[NL80211_ATTR_MAC]) 17889 hwts.macaddr = nla_data(info->attrs[NL80211_ATTR_MAC]); 17890 17891 hwts.enable = 17892 nla_get_flag(info->attrs[NL80211_ATTR_HW_TIMESTAMP_ENABLED]); 17893 17894 return rdev_set_hw_timestamp(rdev, dev, &hwts); 17895 } 17896 17897 static int 17898 nl80211_set_ttlm(struct sk_buff *skb, struct genl_info *info) 17899 { 17900 struct cfg80211_ttlm_params params = {}; 17901 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 17902 struct net_device *dev = info->user_ptr[1]; 17903 struct wireless_dev *wdev = dev->ieee80211_ptr; 17904 17905 if (wdev->iftype != NL80211_IFTYPE_STATION && 17906 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) 17907 return -EOPNOTSUPP; 17908 17909 if (!wdev->connected) 17910 return -ENOLINK; 17911 17912 if (!info->attrs[NL80211_ATTR_MLO_TTLM_DLINK] || 17913 !info->attrs[NL80211_ATTR_MLO_TTLM_ULINK]) 17914 return -EINVAL; 17915 17916 nla_memcpy(params.dlink, 17917 info->attrs[NL80211_ATTR_MLO_TTLM_DLINK], 17918 sizeof(params.dlink)); 17919 nla_memcpy(params.ulink, 17920 info->attrs[NL80211_ATTR_MLO_TTLM_ULINK], 17921 sizeof(params.ulink)); 17922 17923 return rdev_set_ttlm(rdev, dev, ¶ms); 17924 } 17925 17926 static int nl80211_assoc_ml_reconf(struct sk_buff *skb, struct genl_info *info) 17927 { 17928 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 17929 struct net_device *dev = info->user_ptr[1]; 17930 struct wireless_dev *wdev = dev->ieee80211_ptr; 17931 struct cfg80211_ml_reconf_req req = {}; 17932 unsigned int link_id; 17933 u16 add_links; 17934 int err; 17935 17936 if (!wdev->valid_links) 17937 return -EINVAL; 17938 17939 if (dev->ieee80211_ptr->conn_owner_nlportid && 17940 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) 17941 return -EPERM; 17942 17943 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 17944 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 17945 return -EOPNOTSUPP; 17946 17947 add_links = 0; 17948 if (info->attrs[NL80211_ATTR_MLO_LINKS]) { 17949 err = nl80211_process_links(rdev, req.add_links, 17950 /* mark as MLO, but not assoc */ 17951 IEEE80211_MLD_MAX_NUM_LINKS, 17952 NULL, 0, info); 17953 if (err) 17954 return err; 17955 17956 for (link_id = 0; link_id < IEEE80211_MLD_MAX_NUM_LINKS; 17957 link_id++) { 17958 if (!req.add_links[link_id].bss) 17959 continue; 17960 add_links |= BIT(link_id); 17961 } 17962 } 17963 17964 if (info->attrs[NL80211_ATTR_MLO_RECONF_REM_LINKS]) 17965 req.rem_links = 17966 nla_get_u16(info->attrs[NL80211_ATTR_MLO_RECONF_REM_LINKS]); 17967 17968 /* Validate that existing links are not added, removed links are valid 17969 * and don't allow adding and removing the same links 17970 */ 17971 if ((add_links & req.rem_links) || !(add_links | req.rem_links) || 17972 (wdev->valid_links & add_links) || 17973 ((wdev->valid_links & req.rem_links) != req.rem_links)) { 17974 err = -EINVAL; 17975 goto out; 17976 } 17977 17978 if (info->attrs[NL80211_ATTR_ASSOC_MLD_EXT_CAPA_OPS]) 17979 req.ext_mld_capa_ops = 17980 nla_get_u16(info->attrs[NL80211_ATTR_ASSOC_MLD_EXT_CAPA_OPS]); 17981 17982 err = cfg80211_assoc_ml_reconf(rdev, dev, &req); 17983 17984 out: 17985 for (link_id = 0; link_id < ARRAY_SIZE(req.add_links); link_id++) 17986 cfg80211_put_bss(&rdev->wiphy, req.add_links[link_id].bss); 17987 17988 return err; 17989 } 17990 17991 static int 17992 nl80211_epcs_cfg(struct sk_buff *skb, struct genl_info *info) 17993 { 17994 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 17995 struct net_device *dev = info->user_ptr[1]; 17996 struct wireless_dev *wdev = dev->ieee80211_ptr; 17997 bool val; 17998 17999 if (wdev->iftype != NL80211_IFTYPE_STATION && 18000 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) 18001 return -EOPNOTSUPP; 18002 18003 if (!wdev->connected) 18004 return -ENOLINK; 18005 18006 val = nla_get_flag(info->attrs[NL80211_ATTR_EPCS]); 18007 18008 return rdev_set_epcs(rdev, dev, val); 18009 } 18010 18011 #define NL80211_FLAG_NEED_WIPHY 0x01 18012 #define NL80211_FLAG_NEED_NETDEV 0x02 18013 #define NL80211_FLAG_NEED_RTNL 0x04 18014 #define NL80211_FLAG_CHECK_NETDEV_UP 0x08 18015 #define NL80211_FLAG_NEED_NETDEV_UP (NL80211_FLAG_NEED_NETDEV |\ 18016 NL80211_FLAG_CHECK_NETDEV_UP) 18017 #define NL80211_FLAG_NEED_WDEV 0x10 18018 /* If a netdev is associated, it must be UP, P2P must be started */ 18019 #define NL80211_FLAG_NEED_WDEV_UP (NL80211_FLAG_NEED_WDEV |\ 18020 NL80211_FLAG_CHECK_NETDEV_UP) 18021 #define NL80211_FLAG_CLEAR_SKB 0x20 18022 #define NL80211_FLAG_NO_WIPHY_MTX 0x40 18023 #define NL80211_FLAG_MLO_VALID_LINK_ID 0x80 18024 #define NL80211_FLAG_MLO_UNSUPPORTED 0x100 18025 18026 #define INTERNAL_FLAG_SELECTORS(__sel) \ 18027 SELECTOR(__sel, NONE, 0) /* must be first */ \ 18028 SELECTOR(__sel, WIPHY, \ 18029 NL80211_FLAG_NEED_WIPHY) \ 18030 SELECTOR(__sel, WDEV, \ 18031 NL80211_FLAG_NEED_WDEV) \ 18032 SELECTOR(__sel, NETDEV, \ 18033 NL80211_FLAG_NEED_NETDEV) \ 18034 SELECTOR(__sel, NETDEV_LINK, \ 18035 NL80211_FLAG_NEED_NETDEV | \ 18036 NL80211_FLAG_MLO_VALID_LINK_ID) \ 18037 SELECTOR(__sel, NETDEV_NO_MLO, \ 18038 NL80211_FLAG_NEED_NETDEV | \ 18039 NL80211_FLAG_MLO_UNSUPPORTED) \ 18040 SELECTOR(__sel, WIPHY_RTNL, \ 18041 NL80211_FLAG_NEED_WIPHY | \ 18042 NL80211_FLAG_NEED_RTNL) \ 18043 SELECTOR(__sel, WIPHY_RTNL_NOMTX, \ 18044 NL80211_FLAG_NEED_WIPHY | \ 18045 NL80211_FLAG_NEED_RTNL | \ 18046 NL80211_FLAG_NO_WIPHY_MTX) \ 18047 SELECTOR(__sel, WDEV_RTNL, \ 18048 NL80211_FLAG_NEED_WDEV | \ 18049 NL80211_FLAG_NEED_RTNL) \ 18050 SELECTOR(__sel, NETDEV_RTNL, \ 18051 NL80211_FLAG_NEED_NETDEV | \ 18052 NL80211_FLAG_NEED_RTNL) \ 18053 SELECTOR(__sel, NETDEV_UP, \ 18054 NL80211_FLAG_NEED_NETDEV_UP) \ 18055 SELECTOR(__sel, NETDEV_UP_LINK, \ 18056 NL80211_FLAG_NEED_NETDEV_UP | \ 18057 NL80211_FLAG_MLO_VALID_LINK_ID) \ 18058 SELECTOR(__sel, NETDEV_UP_NO_MLO, \ 18059 NL80211_FLAG_NEED_NETDEV_UP | \ 18060 NL80211_FLAG_MLO_UNSUPPORTED) \ 18061 SELECTOR(__sel, NETDEV_UP_NO_MLO_CLEAR, \ 18062 NL80211_FLAG_NEED_NETDEV_UP | \ 18063 NL80211_FLAG_CLEAR_SKB | \ 18064 NL80211_FLAG_MLO_UNSUPPORTED) \ 18065 SELECTOR(__sel, NETDEV_UP_NOTMX, \ 18066 NL80211_FLAG_NEED_NETDEV_UP | \ 18067 NL80211_FLAG_NO_WIPHY_MTX) \ 18068 SELECTOR(__sel, NETDEV_UP_NOTMX_MLO, \ 18069 NL80211_FLAG_NEED_NETDEV_UP | \ 18070 NL80211_FLAG_NO_WIPHY_MTX | \ 18071 NL80211_FLAG_MLO_VALID_LINK_ID) \ 18072 SELECTOR(__sel, NETDEV_UP_CLEAR, \ 18073 NL80211_FLAG_NEED_NETDEV_UP | \ 18074 NL80211_FLAG_CLEAR_SKB) \ 18075 SELECTOR(__sel, WDEV_UP, \ 18076 NL80211_FLAG_NEED_WDEV_UP) \ 18077 SELECTOR(__sel, WDEV_UP_CLEAR, \ 18078 NL80211_FLAG_NEED_WDEV_UP | \ 18079 NL80211_FLAG_CLEAR_SKB) \ 18080 SELECTOR(__sel, WDEV_UP_LINK, \ 18081 NL80211_FLAG_NEED_WDEV_UP | \ 18082 NL80211_FLAG_MLO_VALID_LINK_ID) \ 18083 SELECTOR(__sel, WDEV_UP_RTNL, \ 18084 NL80211_FLAG_NEED_WDEV_UP | \ 18085 NL80211_FLAG_NEED_RTNL) \ 18086 SELECTOR(__sel, WIPHY_CLEAR, \ 18087 NL80211_FLAG_NEED_WIPHY | \ 18088 NL80211_FLAG_CLEAR_SKB) 18089 18090 enum nl80211_internal_flags_selector { 18091 #define SELECTOR(_, name, value) NL80211_IFL_SEL_##name, 18092 INTERNAL_FLAG_SELECTORS(_) 18093 #undef SELECTOR 18094 }; 18095 18096 static u32 nl80211_internal_flags[] = { 18097 #define SELECTOR(_, name, value) [NL80211_IFL_SEL_##name] = value, 18098 INTERNAL_FLAG_SELECTORS(_) 18099 #undef SELECTOR 18100 }; 18101 18102 static int nl80211_pre_doit(const struct genl_split_ops *ops, 18103 struct sk_buff *skb, 18104 struct genl_info *info) 18105 { 18106 struct cfg80211_registered_device *rdev = NULL; 18107 struct wireless_dev *wdev = NULL; 18108 struct net_device *dev = NULL; 18109 u32 internal_flags; 18110 int err; 18111 18112 if (WARN_ON(ops->internal_flags >= ARRAY_SIZE(nl80211_internal_flags))) 18113 return -EINVAL; 18114 18115 internal_flags = nl80211_internal_flags[ops->internal_flags]; 18116 18117 rtnl_lock(); 18118 if (internal_flags & NL80211_FLAG_NEED_WIPHY) { 18119 rdev = cfg80211_get_dev_from_info(genl_info_net(info), info); 18120 if (IS_ERR(rdev)) { 18121 err = PTR_ERR(rdev); 18122 goto out_unlock; 18123 } 18124 info->user_ptr[0] = rdev; 18125 } else if (internal_flags & NL80211_FLAG_NEED_NETDEV || 18126 internal_flags & NL80211_FLAG_NEED_WDEV) { 18127 wdev = __cfg80211_wdev_from_attrs(NULL, genl_info_net(info), 18128 info->attrs); 18129 if (IS_ERR(wdev)) { 18130 err = PTR_ERR(wdev); 18131 goto out_unlock; 18132 } 18133 18134 dev = wdev->netdev; 18135 dev_hold(dev); 18136 rdev = wiphy_to_rdev(wdev->wiphy); 18137 18138 if (internal_flags & NL80211_FLAG_NEED_NETDEV) { 18139 if (!dev) { 18140 err = -EINVAL; 18141 goto out_unlock; 18142 } 18143 18144 info->user_ptr[1] = dev; 18145 } else { 18146 info->user_ptr[1] = wdev; 18147 } 18148 18149 if (internal_flags & NL80211_FLAG_CHECK_NETDEV_UP && 18150 !wdev_running(wdev)) { 18151 err = -ENETDOWN; 18152 goto out_unlock; 18153 } 18154 18155 info->user_ptr[0] = rdev; 18156 } 18157 18158 if (internal_flags & NL80211_FLAG_MLO_VALID_LINK_ID) { 18159 struct nlattr *link_id = info->attrs[NL80211_ATTR_MLO_LINK_ID]; 18160 18161 if (!wdev) { 18162 err = -EINVAL; 18163 goto out_unlock; 18164 } 18165 18166 /* MLO -> require valid link ID */ 18167 if (wdev->valid_links && 18168 (!link_id || 18169 !(wdev->valid_links & BIT(nla_get_u8(link_id))))) { 18170 err = -EINVAL; 18171 goto out_unlock; 18172 } 18173 18174 /* non-MLO -> no link ID attribute accepted */ 18175 if (!wdev->valid_links && link_id) { 18176 err = -EINVAL; 18177 goto out_unlock; 18178 } 18179 } 18180 18181 if (internal_flags & NL80211_FLAG_MLO_UNSUPPORTED) { 18182 if (info->attrs[NL80211_ATTR_MLO_LINK_ID] || 18183 (wdev && wdev->valid_links)) { 18184 err = -EINVAL; 18185 goto out_unlock; 18186 } 18187 } 18188 18189 if (rdev && !(internal_flags & NL80211_FLAG_NO_WIPHY_MTX)) { 18190 wiphy_lock(&rdev->wiphy); 18191 /* we keep the mutex locked until post_doit */ 18192 __release(&rdev->wiphy.mtx); 18193 } 18194 if (!(internal_flags & NL80211_FLAG_NEED_RTNL)) 18195 rtnl_unlock(); 18196 18197 return 0; 18198 out_unlock: 18199 rtnl_unlock(); 18200 dev_put(dev); 18201 return err; 18202 } 18203 18204 static void nl80211_post_doit(const struct genl_split_ops *ops, 18205 struct sk_buff *skb, 18206 struct genl_info *info) 18207 { 18208 u32 internal_flags = nl80211_internal_flags[ops->internal_flags]; 18209 18210 if (info->user_ptr[1]) { 18211 if (internal_flags & NL80211_FLAG_NEED_WDEV) { 18212 struct wireless_dev *wdev = info->user_ptr[1]; 18213 18214 dev_put(wdev->netdev); 18215 } else { 18216 dev_put(info->user_ptr[1]); 18217 } 18218 } 18219 18220 if (info->user_ptr[0] && 18221 !(internal_flags & NL80211_FLAG_NO_WIPHY_MTX)) { 18222 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 18223 18224 /* we kept the mutex locked since pre_doit */ 18225 __acquire(&rdev->wiphy.mtx); 18226 wiphy_unlock(&rdev->wiphy); 18227 } 18228 18229 if (internal_flags & NL80211_FLAG_NEED_RTNL) 18230 rtnl_unlock(); 18231 18232 /* If needed, clear the netlink message payload from the SKB 18233 * as it might contain key data that shouldn't stick around on 18234 * the heap after the SKB is freed. The netlink message header 18235 * is still needed for further processing, so leave it intact. 18236 */ 18237 if (internal_flags & NL80211_FLAG_CLEAR_SKB) { 18238 struct nlmsghdr *nlh = nlmsg_hdr(skb); 18239 18240 memset(nlmsg_data(nlh), 0, nlmsg_len(nlh)); 18241 } 18242 } 18243 18244 static int nl80211_set_sar_sub_specs(struct cfg80211_registered_device *rdev, 18245 struct cfg80211_sar_specs *sar_specs, 18246 struct nlattr *spec[], int index) 18247 { 18248 u32 range_index, i; 18249 18250 if (!sar_specs || !spec) 18251 return -EINVAL; 18252 18253 if (!spec[NL80211_SAR_ATTR_SPECS_POWER] || 18254 !spec[NL80211_SAR_ATTR_SPECS_RANGE_INDEX]) 18255 return -EINVAL; 18256 18257 range_index = nla_get_u32(spec[NL80211_SAR_ATTR_SPECS_RANGE_INDEX]); 18258 18259 /* check if range_index exceeds num_freq_ranges */ 18260 if (range_index >= rdev->wiphy.sar_capa->num_freq_ranges) 18261 return -EINVAL; 18262 18263 /* check if range_index duplicates */ 18264 for (i = 0; i < index; i++) { 18265 if (sar_specs->sub_specs[i].freq_range_index == range_index) 18266 return -EINVAL; 18267 } 18268 18269 sar_specs->sub_specs[index].power = 18270 nla_get_s32(spec[NL80211_SAR_ATTR_SPECS_POWER]); 18271 18272 sar_specs->sub_specs[index].freq_range_index = range_index; 18273 18274 return 0; 18275 } 18276 18277 static int nl80211_set_sar_specs(struct sk_buff *skb, struct genl_info *info) 18278 { 18279 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 18280 struct nlattr *spec[NL80211_SAR_ATTR_SPECS_MAX + 1]; 18281 struct nlattr *tb[NL80211_SAR_ATTR_MAX + 1]; 18282 struct cfg80211_sar_specs *sar_spec; 18283 enum nl80211_sar_type type; 18284 struct nlattr *spec_list; 18285 u32 specs; 18286 int rem, err; 18287 18288 if (!rdev->wiphy.sar_capa || !rdev->ops->set_sar_specs) 18289 return -EOPNOTSUPP; 18290 18291 if (!info->attrs[NL80211_ATTR_SAR_SPEC]) 18292 return -EINVAL; 18293 18294 nla_parse_nested(tb, NL80211_SAR_ATTR_MAX, 18295 info->attrs[NL80211_ATTR_SAR_SPEC], 18296 NULL, NULL); 18297 18298 if (!tb[NL80211_SAR_ATTR_TYPE] || !tb[NL80211_SAR_ATTR_SPECS]) 18299 return -EINVAL; 18300 18301 type = nla_get_u32(tb[NL80211_SAR_ATTR_TYPE]); 18302 if (type != rdev->wiphy.sar_capa->type) 18303 return -EINVAL; 18304 18305 specs = 0; 18306 nla_for_each_nested(spec_list, tb[NL80211_SAR_ATTR_SPECS], rem) 18307 specs++; 18308 18309 if (specs > rdev->wiphy.sar_capa->num_freq_ranges) 18310 return -EINVAL; 18311 18312 sar_spec = kzalloc_flex(*sar_spec, sub_specs, specs); 18313 if (!sar_spec) 18314 return -ENOMEM; 18315 18316 sar_spec->num_sub_specs = specs; 18317 sar_spec->type = type; 18318 specs = 0; 18319 nla_for_each_nested(spec_list, tb[NL80211_SAR_ATTR_SPECS], rem) { 18320 nla_parse_nested(spec, NL80211_SAR_ATTR_SPECS_MAX, 18321 spec_list, NULL, NULL); 18322 18323 switch (type) { 18324 case NL80211_SAR_TYPE_POWER: 18325 if (nl80211_set_sar_sub_specs(rdev, sar_spec, 18326 spec, specs)) { 18327 err = -EINVAL; 18328 goto error; 18329 } 18330 break; 18331 default: 18332 err = -EINVAL; 18333 goto error; 18334 } 18335 specs++; 18336 } 18337 18338 sar_spec->num_sub_specs = specs; 18339 18340 rdev->cur_cmd_info = info; 18341 err = rdev_set_sar_specs(rdev, sar_spec); 18342 rdev->cur_cmd_info = NULL; 18343 error: 18344 kfree(sar_spec); 18345 return err; 18346 } 18347 18348 #define SELECTOR(__sel, name, value) \ 18349 ((__sel) == (value)) ? NL80211_IFL_SEL_##name : 18350 int __missing_selector(void); 18351 #define IFLAGS(__val) INTERNAL_FLAG_SELECTORS(__val) __missing_selector() 18352 18353 static const struct genl_ops nl80211_ops[] = { 18354 { 18355 .cmd = NL80211_CMD_GET_WIPHY, 18356 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18357 .doit = nl80211_get_wiphy, 18358 .dumpit = nl80211_dump_wiphy, 18359 .done = nl80211_dump_wiphy_done, 18360 /* can be retrieved by unprivileged users */ 18361 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY), 18362 }, 18363 }; 18364 18365 static const struct genl_small_ops nl80211_small_ops[] = { 18366 { 18367 .cmd = NL80211_CMD_SET_WIPHY, 18368 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18369 .doit = nl80211_set_wiphy, 18370 .flags = GENL_UNS_ADMIN_PERM, 18371 }, 18372 { 18373 .cmd = NL80211_CMD_GET_INTERFACE, 18374 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18375 .doit = nl80211_get_interface, 18376 .dumpit = nl80211_dump_interface, 18377 /* can be retrieved by unprivileged users */ 18378 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV), 18379 }, 18380 { 18381 .cmd = NL80211_CMD_SET_INTERFACE, 18382 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18383 .doit = nl80211_set_interface, 18384 .flags = GENL_UNS_ADMIN_PERM, 18385 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV | 18386 NL80211_FLAG_NEED_RTNL), 18387 }, 18388 { 18389 .cmd = NL80211_CMD_NEW_INTERFACE, 18390 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18391 .doit = nl80211_new_interface, 18392 .flags = GENL_UNS_ADMIN_PERM, 18393 .internal_flags = 18394 IFLAGS(NL80211_FLAG_NEED_WIPHY | 18395 NL80211_FLAG_NEED_RTNL | 18396 /* we take the wiphy mutex later ourselves */ 18397 NL80211_FLAG_NO_WIPHY_MTX), 18398 }, 18399 { 18400 .cmd = NL80211_CMD_DEL_INTERFACE, 18401 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18402 .doit = nl80211_del_interface, 18403 .flags = GENL_UNS_ADMIN_PERM, 18404 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV | 18405 NL80211_FLAG_NEED_RTNL), 18406 }, 18407 { 18408 .cmd = NL80211_CMD_GET_KEY, 18409 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18410 .doit = nl80211_get_key, 18411 .flags = GENL_UNS_ADMIN_PERM, 18412 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 18413 }, 18414 { 18415 .cmd = NL80211_CMD_SET_KEY, 18416 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18417 .doit = nl80211_set_key, 18418 .flags = GENL_UNS_ADMIN_PERM, 18419 /* cannot use NL80211_FLAG_MLO_VALID_LINK_ID, depends on key */ 18420 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP | 18421 NL80211_FLAG_CLEAR_SKB), 18422 }, 18423 { 18424 .cmd = NL80211_CMD_NEW_KEY, 18425 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18426 .doit = nl80211_new_key, 18427 .flags = GENL_UNS_ADMIN_PERM, 18428 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP | 18429 NL80211_FLAG_CLEAR_SKB), 18430 }, 18431 { 18432 .cmd = NL80211_CMD_DEL_KEY, 18433 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18434 .doit = nl80211_del_key, 18435 .flags = GENL_UNS_ADMIN_PERM, 18436 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 18437 }, 18438 { 18439 .cmd = NL80211_CMD_SET_BEACON, 18440 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18441 .flags = GENL_UNS_ADMIN_PERM, 18442 .doit = nl80211_set_beacon, 18443 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 18444 NL80211_FLAG_MLO_VALID_LINK_ID), 18445 }, 18446 { 18447 .cmd = NL80211_CMD_START_AP, 18448 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18449 .flags = GENL_UNS_ADMIN_PERM, 18450 .doit = nl80211_start_ap, 18451 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 18452 NL80211_FLAG_MLO_VALID_LINK_ID), 18453 }, 18454 { 18455 .cmd = NL80211_CMD_STOP_AP, 18456 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18457 .flags = GENL_UNS_ADMIN_PERM, 18458 .doit = nl80211_stop_ap, 18459 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 18460 NL80211_FLAG_MLO_VALID_LINK_ID), 18461 }, 18462 { 18463 .cmd = NL80211_CMD_GET_STATION, 18464 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18465 .doit = nl80211_get_station, 18466 .dumpit = nl80211_dump_station, 18467 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV), 18468 }, 18469 { 18470 .cmd = NL80211_CMD_SET_STATION, 18471 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18472 .doit = nl80211_set_station, 18473 .flags = GENL_UNS_ADMIN_PERM, 18474 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 18475 }, 18476 { 18477 .cmd = NL80211_CMD_NEW_STATION, 18478 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18479 .doit = nl80211_new_station, 18480 .flags = GENL_UNS_ADMIN_PERM, 18481 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 18482 }, 18483 { 18484 .cmd = NL80211_CMD_DEL_STATION, 18485 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18486 .doit = nl80211_del_station, 18487 .flags = GENL_UNS_ADMIN_PERM, 18488 /* cannot use NL80211_FLAG_MLO_VALID_LINK_ID, depends on 18489 * whether MAC address is passed or not. If MAC address is 18490 * passed, then even during MLO, link ID is not required. 18491 */ 18492 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 18493 }, 18494 { 18495 .cmd = NL80211_CMD_GET_MPATH, 18496 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18497 .doit = nl80211_get_mpath, 18498 .dumpit = nl80211_dump_mpath, 18499 .flags = GENL_UNS_ADMIN_PERM, 18500 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 18501 }, 18502 { 18503 .cmd = NL80211_CMD_GET_MPP, 18504 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18505 .doit = nl80211_get_mpp, 18506 .dumpit = nl80211_dump_mpp, 18507 .flags = GENL_UNS_ADMIN_PERM, 18508 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 18509 }, 18510 { 18511 .cmd = NL80211_CMD_SET_MPATH, 18512 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18513 .doit = nl80211_set_mpath, 18514 .flags = GENL_UNS_ADMIN_PERM, 18515 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 18516 }, 18517 { 18518 .cmd = NL80211_CMD_NEW_MPATH, 18519 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18520 .doit = nl80211_new_mpath, 18521 .flags = GENL_UNS_ADMIN_PERM, 18522 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 18523 }, 18524 { 18525 .cmd = NL80211_CMD_DEL_MPATH, 18526 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18527 .doit = nl80211_del_mpath, 18528 .flags = GENL_UNS_ADMIN_PERM, 18529 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 18530 }, 18531 { 18532 .cmd = NL80211_CMD_SET_BSS, 18533 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18534 .doit = nl80211_set_bss, 18535 .flags = GENL_UNS_ADMIN_PERM, 18536 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 18537 NL80211_FLAG_MLO_VALID_LINK_ID), 18538 }, 18539 { 18540 .cmd = NL80211_CMD_GET_REG, 18541 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18542 .doit = nl80211_get_reg_do, 18543 .dumpit = nl80211_get_reg_dump, 18544 /* can be retrieved by unprivileged users */ 18545 }, 18546 #ifdef CONFIG_CFG80211_CRDA_SUPPORT 18547 { 18548 .cmd = NL80211_CMD_SET_REG, 18549 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18550 .doit = nl80211_set_reg, 18551 .flags = GENL_ADMIN_PERM, 18552 }, 18553 #endif 18554 { 18555 .cmd = NL80211_CMD_REQ_SET_REG, 18556 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18557 .doit = nl80211_req_set_reg, 18558 .flags = GENL_ADMIN_PERM, 18559 }, 18560 { 18561 .cmd = NL80211_CMD_RELOAD_REGDB, 18562 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18563 .doit = nl80211_reload_regdb, 18564 .flags = GENL_ADMIN_PERM, 18565 }, 18566 { 18567 .cmd = NL80211_CMD_GET_MESH_CONFIG, 18568 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18569 .doit = nl80211_get_mesh_config, 18570 /* can be retrieved by unprivileged users */ 18571 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 18572 }, 18573 { 18574 .cmd = NL80211_CMD_SET_MESH_CONFIG, 18575 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18576 .doit = nl80211_update_mesh_config, 18577 .flags = GENL_UNS_ADMIN_PERM, 18578 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 18579 }, 18580 { 18581 .cmd = NL80211_CMD_TRIGGER_SCAN, 18582 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18583 .doit = nl80211_trigger_scan, 18584 .flags = GENL_UNS_ADMIN_PERM, 18585 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 18586 }, 18587 { 18588 .cmd = NL80211_CMD_ABORT_SCAN, 18589 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18590 .doit = nl80211_abort_scan, 18591 .flags = GENL_UNS_ADMIN_PERM, 18592 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 18593 }, 18594 { 18595 .cmd = NL80211_CMD_GET_SCAN, 18596 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18597 .dumpit = nl80211_dump_scan, 18598 }, 18599 { 18600 .cmd = NL80211_CMD_START_SCHED_SCAN, 18601 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18602 .doit = nl80211_start_sched_scan, 18603 .flags = GENL_UNS_ADMIN_PERM, 18604 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 18605 }, 18606 { 18607 .cmd = NL80211_CMD_STOP_SCHED_SCAN, 18608 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18609 .doit = nl80211_stop_sched_scan, 18610 .flags = GENL_UNS_ADMIN_PERM, 18611 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 18612 }, 18613 { 18614 .cmd = NL80211_CMD_AUTHENTICATE, 18615 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18616 .doit = nl80211_authenticate, 18617 .flags = GENL_UNS_ADMIN_PERM, 18618 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 18619 NL80211_FLAG_CLEAR_SKB), 18620 }, 18621 { 18622 .cmd = NL80211_CMD_ASSOCIATE, 18623 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18624 .doit = nl80211_associate, 18625 .flags = GENL_UNS_ADMIN_PERM, 18626 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 18627 NL80211_FLAG_CLEAR_SKB), 18628 }, 18629 { 18630 .cmd = NL80211_CMD_DEAUTHENTICATE, 18631 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18632 .doit = nl80211_deauthenticate, 18633 .flags = GENL_UNS_ADMIN_PERM, 18634 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 18635 }, 18636 { 18637 .cmd = NL80211_CMD_DISASSOCIATE, 18638 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18639 .doit = nl80211_disassociate, 18640 .flags = GENL_UNS_ADMIN_PERM, 18641 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 18642 }, 18643 { 18644 .cmd = NL80211_CMD_JOIN_IBSS, 18645 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18646 .doit = nl80211_join_ibss, 18647 .flags = GENL_UNS_ADMIN_PERM, 18648 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 18649 }, 18650 { 18651 .cmd = NL80211_CMD_LEAVE_IBSS, 18652 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18653 .doit = nl80211_leave_ibss, 18654 .flags = GENL_UNS_ADMIN_PERM, 18655 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 18656 }, 18657 #ifdef CONFIG_NL80211_TESTMODE 18658 { 18659 .cmd = NL80211_CMD_TESTMODE, 18660 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18661 .doit = nl80211_testmode_do, 18662 .dumpit = nl80211_testmode_dump, 18663 .flags = GENL_UNS_ADMIN_PERM, 18664 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY), 18665 }, 18666 #endif 18667 { 18668 .cmd = NL80211_CMD_CONNECT, 18669 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18670 .doit = nl80211_connect, 18671 .flags = GENL_UNS_ADMIN_PERM, 18672 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 18673 NL80211_FLAG_CLEAR_SKB), 18674 }, 18675 { 18676 .cmd = NL80211_CMD_UPDATE_CONNECT_PARAMS, 18677 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18678 .doit = nl80211_update_connect_params, 18679 .flags = GENL_ADMIN_PERM, 18680 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 18681 NL80211_FLAG_CLEAR_SKB), 18682 }, 18683 { 18684 .cmd = NL80211_CMD_DISCONNECT, 18685 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18686 .doit = nl80211_disconnect, 18687 .flags = GENL_UNS_ADMIN_PERM, 18688 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 18689 }, 18690 { 18691 .cmd = NL80211_CMD_SET_WIPHY_NETNS, 18692 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18693 .doit = nl80211_wiphy_netns, 18694 .flags = GENL_UNS_ADMIN_PERM, 18695 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY | 18696 NL80211_FLAG_NEED_RTNL | 18697 NL80211_FLAG_NO_WIPHY_MTX), 18698 }, 18699 { 18700 .cmd = NL80211_CMD_GET_SURVEY, 18701 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18702 .dumpit = nl80211_dump_survey, 18703 }, 18704 { 18705 .cmd = NL80211_CMD_SET_PMKSA, 18706 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18707 .doit = nl80211_set_pmksa, 18708 .flags = GENL_UNS_ADMIN_PERM, 18709 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 18710 NL80211_FLAG_CLEAR_SKB), 18711 }, 18712 { 18713 .cmd = NL80211_CMD_DEL_PMKSA, 18714 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18715 .doit = nl80211_del_pmksa, 18716 .flags = GENL_UNS_ADMIN_PERM, 18717 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 18718 }, 18719 { 18720 .cmd = NL80211_CMD_FLUSH_PMKSA, 18721 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18722 .doit = nl80211_flush_pmksa, 18723 .flags = GENL_UNS_ADMIN_PERM, 18724 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 18725 }, 18726 { 18727 .cmd = NL80211_CMD_REMAIN_ON_CHANNEL, 18728 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18729 .doit = nl80211_remain_on_channel, 18730 .flags = GENL_UNS_ADMIN_PERM, 18731 /* FIXME: requiring a link ID here is probably not good */ 18732 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP | 18733 NL80211_FLAG_MLO_VALID_LINK_ID), 18734 }, 18735 { 18736 .cmd = NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL, 18737 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18738 .doit = nl80211_cancel_remain_on_channel, 18739 .flags = GENL_UNS_ADMIN_PERM, 18740 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 18741 }, 18742 { 18743 .cmd = NL80211_CMD_SET_TX_BITRATE_MASK, 18744 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18745 .doit = nl80211_set_tx_bitrate_mask, 18746 .flags = GENL_UNS_ADMIN_PERM, 18747 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV | 18748 NL80211_FLAG_MLO_VALID_LINK_ID), 18749 }, 18750 { 18751 .cmd = NL80211_CMD_REGISTER_FRAME, 18752 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18753 .doit = nl80211_register_mgmt, 18754 .flags = GENL_UNS_ADMIN_PERM, 18755 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV), 18756 }, 18757 { 18758 .cmd = NL80211_CMD_FRAME, 18759 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18760 .doit = nl80211_tx_mgmt, 18761 .flags = GENL_UNS_ADMIN_PERM, 18762 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 18763 }, 18764 { 18765 .cmd = NL80211_CMD_FRAME_WAIT_CANCEL, 18766 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18767 .doit = nl80211_tx_mgmt_cancel_wait, 18768 .flags = GENL_UNS_ADMIN_PERM, 18769 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 18770 }, 18771 { 18772 .cmd = NL80211_CMD_SET_POWER_SAVE, 18773 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18774 .doit = nl80211_set_power_save, 18775 .flags = GENL_UNS_ADMIN_PERM, 18776 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV), 18777 }, 18778 { 18779 .cmd = NL80211_CMD_GET_POWER_SAVE, 18780 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18781 .doit = nl80211_get_power_save, 18782 /* can be retrieved by unprivileged users */ 18783 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV), 18784 }, 18785 { 18786 .cmd = NL80211_CMD_SET_CQM, 18787 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18788 .doit = nl80211_set_cqm, 18789 .flags = GENL_UNS_ADMIN_PERM, 18790 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV), 18791 }, 18792 { 18793 .cmd = NL80211_CMD_SET_CHANNEL, 18794 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18795 .doit = nl80211_set_channel, 18796 .flags = GENL_UNS_ADMIN_PERM, 18797 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV | 18798 NL80211_FLAG_MLO_VALID_LINK_ID), 18799 }, 18800 { 18801 .cmd = NL80211_CMD_JOIN_MESH, 18802 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18803 .doit = nl80211_join_mesh, 18804 .flags = GENL_UNS_ADMIN_PERM, 18805 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 18806 }, 18807 { 18808 .cmd = NL80211_CMD_LEAVE_MESH, 18809 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18810 .doit = nl80211_leave_mesh, 18811 .flags = GENL_UNS_ADMIN_PERM, 18812 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 18813 }, 18814 { 18815 .cmd = NL80211_CMD_JOIN_OCB, 18816 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18817 .doit = nl80211_join_ocb, 18818 .flags = GENL_UNS_ADMIN_PERM, 18819 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 18820 }, 18821 { 18822 .cmd = NL80211_CMD_LEAVE_OCB, 18823 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18824 .doit = nl80211_leave_ocb, 18825 .flags = GENL_UNS_ADMIN_PERM, 18826 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 18827 }, 18828 #ifdef CONFIG_PM 18829 { 18830 .cmd = NL80211_CMD_GET_WOWLAN, 18831 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18832 .doit = nl80211_get_wowlan, 18833 /* can be retrieved by unprivileged users */ 18834 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY), 18835 }, 18836 { 18837 .cmd = NL80211_CMD_SET_WOWLAN, 18838 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18839 .doit = nl80211_set_wowlan, 18840 .flags = GENL_UNS_ADMIN_PERM, 18841 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY), 18842 }, 18843 #endif 18844 { 18845 .cmd = NL80211_CMD_SET_REKEY_OFFLOAD, 18846 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18847 .doit = nl80211_set_rekey_data, 18848 .flags = GENL_UNS_ADMIN_PERM, 18849 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 18850 NL80211_FLAG_CLEAR_SKB), 18851 }, 18852 { 18853 .cmd = NL80211_CMD_TDLS_MGMT, 18854 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18855 .doit = nl80211_tdls_mgmt, 18856 .flags = GENL_UNS_ADMIN_PERM, 18857 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 18858 NL80211_FLAG_MLO_VALID_LINK_ID), 18859 }, 18860 { 18861 .cmd = NL80211_CMD_TDLS_OPER, 18862 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18863 .doit = nl80211_tdls_oper, 18864 .flags = GENL_UNS_ADMIN_PERM, 18865 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 18866 }, 18867 { 18868 .cmd = NL80211_CMD_UNEXPECTED_FRAME, 18869 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18870 .doit = nl80211_register_unexpected_frame, 18871 .flags = GENL_UNS_ADMIN_PERM, 18872 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV), 18873 }, 18874 { 18875 .cmd = NL80211_CMD_PROBE_CLIENT, 18876 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18877 .doit = nl80211_probe_client, 18878 .flags = GENL_UNS_ADMIN_PERM, 18879 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 18880 }, 18881 { 18882 .cmd = NL80211_CMD_REGISTER_BEACONS, 18883 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18884 .doit = nl80211_register_beacons, 18885 .flags = GENL_UNS_ADMIN_PERM, 18886 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY), 18887 }, 18888 { 18889 .cmd = NL80211_CMD_SET_NOACK_MAP, 18890 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18891 .doit = nl80211_set_noack_map, 18892 .flags = GENL_UNS_ADMIN_PERM, 18893 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV), 18894 }, 18895 { 18896 .cmd = NL80211_CMD_START_P2P_DEVICE, 18897 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18898 .doit = nl80211_start_p2p_device, 18899 .flags = GENL_UNS_ADMIN_PERM, 18900 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV | 18901 NL80211_FLAG_NEED_RTNL), 18902 }, 18903 { 18904 .cmd = NL80211_CMD_STOP_P2P_DEVICE, 18905 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18906 .doit = nl80211_stop_p2p_device, 18907 .flags = GENL_UNS_ADMIN_PERM, 18908 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP | 18909 NL80211_FLAG_NEED_RTNL), 18910 }, 18911 { 18912 .cmd = NL80211_CMD_START_NAN, 18913 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18914 .doit = nl80211_start_nan, 18915 .flags = GENL_ADMIN_PERM, 18916 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV | 18917 NL80211_FLAG_NEED_RTNL), 18918 }, 18919 { 18920 .cmd = NL80211_CMD_STOP_NAN, 18921 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18922 .doit = nl80211_stop_nan, 18923 .flags = GENL_ADMIN_PERM, 18924 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP | 18925 NL80211_FLAG_NEED_RTNL), 18926 }, 18927 { 18928 .cmd = NL80211_CMD_ADD_NAN_FUNCTION, 18929 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18930 .doit = nl80211_nan_add_func, 18931 .flags = GENL_ADMIN_PERM, 18932 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 18933 }, 18934 { 18935 .cmd = NL80211_CMD_DEL_NAN_FUNCTION, 18936 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18937 .doit = nl80211_nan_del_func, 18938 .flags = GENL_ADMIN_PERM, 18939 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 18940 }, 18941 { 18942 .cmd = NL80211_CMD_CHANGE_NAN_CONFIG, 18943 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18944 .doit = nl80211_nan_change_config, 18945 .flags = GENL_ADMIN_PERM, 18946 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 18947 }, 18948 { 18949 .cmd = NL80211_CMD_SET_MCAST_RATE, 18950 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18951 .doit = nl80211_set_mcast_rate, 18952 .flags = GENL_UNS_ADMIN_PERM, 18953 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV), 18954 }, 18955 { 18956 .cmd = NL80211_CMD_SET_MAC_ACL, 18957 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18958 .doit = nl80211_set_mac_acl, 18959 .flags = GENL_UNS_ADMIN_PERM, 18960 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV | 18961 NL80211_FLAG_MLO_UNSUPPORTED), 18962 }, 18963 { 18964 .cmd = NL80211_CMD_RADAR_DETECT, 18965 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18966 .doit = nl80211_start_radar_detection, 18967 .flags = GENL_UNS_ADMIN_PERM, 18968 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 18969 NL80211_FLAG_NO_WIPHY_MTX | 18970 NL80211_FLAG_MLO_VALID_LINK_ID), 18971 }, 18972 { 18973 .cmd = NL80211_CMD_GET_PROTOCOL_FEATURES, 18974 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18975 .doit = nl80211_get_protocol_features, 18976 }, 18977 { 18978 .cmd = NL80211_CMD_UPDATE_FT_IES, 18979 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18980 .doit = nl80211_update_ft_ies, 18981 .flags = GENL_UNS_ADMIN_PERM, 18982 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 18983 }, 18984 { 18985 .cmd = NL80211_CMD_CRIT_PROTOCOL_START, 18986 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18987 .doit = nl80211_crit_protocol_start, 18988 .flags = GENL_UNS_ADMIN_PERM, 18989 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 18990 }, 18991 { 18992 .cmd = NL80211_CMD_CRIT_PROTOCOL_STOP, 18993 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 18994 .doit = nl80211_crit_protocol_stop, 18995 .flags = GENL_UNS_ADMIN_PERM, 18996 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 18997 }, 18998 { 18999 .cmd = NL80211_CMD_GET_COALESCE, 19000 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19001 .doit = nl80211_get_coalesce, 19002 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY), 19003 }, 19004 { 19005 .cmd = NL80211_CMD_SET_COALESCE, 19006 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19007 .doit = nl80211_set_coalesce, 19008 .flags = GENL_UNS_ADMIN_PERM, 19009 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY), 19010 }, 19011 { 19012 .cmd = NL80211_CMD_CHANNEL_SWITCH, 19013 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19014 .doit = nl80211_channel_switch, 19015 .flags = GENL_UNS_ADMIN_PERM, 19016 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 19017 NL80211_FLAG_MLO_VALID_LINK_ID), 19018 }, 19019 { 19020 .cmd = NL80211_CMD_VENDOR, 19021 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19022 .doit = nl80211_vendor_cmd, 19023 .dumpit = nl80211_vendor_cmd_dump, 19024 .flags = GENL_UNS_ADMIN_PERM, 19025 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY | 19026 NL80211_FLAG_CLEAR_SKB), 19027 }, 19028 { 19029 .cmd = NL80211_CMD_SET_QOS_MAP, 19030 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19031 .doit = nl80211_set_qos_map, 19032 .flags = GENL_UNS_ADMIN_PERM, 19033 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 19034 }, 19035 { 19036 .cmd = NL80211_CMD_ADD_TX_TS, 19037 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19038 .doit = nl80211_add_tx_ts, 19039 .flags = GENL_UNS_ADMIN_PERM, 19040 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 19041 NL80211_FLAG_MLO_UNSUPPORTED), 19042 }, 19043 { 19044 .cmd = NL80211_CMD_DEL_TX_TS, 19045 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19046 .doit = nl80211_del_tx_ts, 19047 .flags = GENL_UNS_ADMIN_PERM, 19048 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 19049 }, 19050 { 19051 .cmd = NL80211_CMD_TDLS_CHANNEL_SWITCH, 19052 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19053 .doit = nl80211_tdls_channel_switch, 19054 .flags = GENL_UNS_ADMIN_PERM, 19055 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 19056 }, 19057 { 19058 .cmd = NL80211_CMD_TDLS_CANCEL_CHANNEL_SWITCH, 19059 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19060 .doit = nl80211_tdls_cancel_channel_switch, 19061 .flags = GENL_UNS_ADMIN_PERM, 19062 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 19063 }, 19064 { 19065 .cmd = NL80211_CMD_SET_MULTICAST_TO_UNICAST, 19066 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19067 .doit = nl80211_set_multicast_to_unicast, 19068 .flags = GENL_UNS_ADMIN_PERM, 19069 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV), 19070 }, 19071 { 19072 .cmd = NL80211_CMD_SET_PMK, 19073 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19074 .doit = nl80211_set_pmk, 19075 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 19076 NL80211_FLAG_CLEAR_SKB), 19077 }, 19078 { 19079 .cmd = NL80211_CMD_DEL_PMK, 19080 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19081 .doit = nl80211_del_pmk, 19082 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 19083 }, 19084 { 19085 .cmd = NL80211_CMD_EXTERNAL_AUTH, 19086 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19087 .doit = nl80211_external_auth, 19088 .flags = GENL_ADMIN_PERM, 19089 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 19090 }, 19091 { 19092 .cmd = NL80211_CMD_CONTROL_PORT_FRAME, 19093 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19094 .doit = nl80211_tx_control_port, 19095 .flags = GENL_UNS_ADMIN_PERM, 19096 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 19097 }, 19098 { 19099 .cmd = NL80211_CMD_GET_FTM_RESPONDER_STATS, 19100 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19101 .doit = nl80211_get_ftm_responder_stats, 19102 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV | 19103 NL80211_FLAG_MLO_VALID_LINK_ID), 19104 }, 19105 { 19106 .cmd = NL80211_CMD_PEER_MEASUREMENT_START, 19107 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19108 .doit = nl80211_pmsr_start, 19109 .flags = GENL_UNS_ADMIN_PERM, 19110 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 19111 }, 19112 { 19113 .cmd = NL80211_CMD_NOTIFY_RADAR, 19114 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19115 .doit = nl80211_notify_radar_detection, 19116 .flags = GENL_UNS_ADMIN_PERM, 19117 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 19118 }, 19119 { 19120 .cmd = NL80211_CMD_UPDATE_OWE_INFO, 19121 .doit = nl80211_update_owe_info, 19122 .flags = GENL_ADMIN_PERM, 19123 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 19124 }, 19125 { 19126 .cmd = NL80211_CMD_PROBE_MESH_LINK, 19127 .doit = nl80211_probe_mesh_link, 19128 .flags = GENL_UNS_ADMIN_PERM, 19129 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 19130 }, 19131 { 19132 .cmd = NL80211_CMD_SET_TID_CONFIG, 19133 .doit = nl80211_set_tid_config, 19134 .flags = GENL_UNS_ADMIN_PERM, 19135 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV | 19136 NL80211_FLAG_MLO_VALID_LINK_ID), 19137 }, 19138 { 19139 .cmd = NL80211_CMD_SET_SAR_SPECS, 19140 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19141 .doit = nl80211_set_sar_specs, 19142 .flags = GENL_UNS_ADMIN_PERM, 19143 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY | 19144 NL80211_FLAG_NEED_RTNL), 19145 }, 19146 { 19147 .cmd = NL80211_CMD_COLOR_CHANGE_REQUEST, 19148 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19149 .doit = nl80211_color_change, 19150 .flags = GENL_UNS_ADMIN_PERM, 19151 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 19152 NL80211_FLAG_MLO_VALID_LINK_ID), 19153 }, 19154 { 19155 .cmd = NL80211_CMD_SET_FILS_AAD, 19156 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19157 .doit = nl80211_set_fils_aad, 19158 .flags = GENL_UNS_ADMIN_PERM, 19159 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 19160 }, 19161 { 19162 .cmd = NL80211_CMD_ADD_LINK, 19163 .doit = nl80211_add_link, 19164 .flags = GENL_UNS_ADMIN_PERM, 19165 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 19166 }, 19167 { 19168 .cmd = NL80211_CMD_REMOVE_LINK, 19169 .doit = nl80211_remove_link, 19170 .flags = GENL_UNS_ADMIN_PERM, 19171 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 19172 NL80211_FLAG_MLO_VALID_LINK_ID), 19173 }, 19174 { 19175 .cmd = NL80211_CMD_ADD_LINK_STA, 19176 .doit = nl80211_add_link_station, 19177 .flags = GENL_UNS_ADMIN_PERM, 19178 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 19179 NL80211_FLAG_MLO_VALID_LINK_ID), 19180 }, 19181 { 19182 .cmd = NL80211_CMD_MODIFY_LINK_STA, 19183 .doit = nl80211_modify_link_station, 19184 .flags = GENL_UNS_ADMIN_PERM, 19185 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 19186 NL80211_FLAG_MLO_VALID_LINK_ID), 19187 }, 19188 { 19189 .cmd = NL80211_CMD_REMOVE_LINK_STA, 19190 .doit = nl80211_remove_link_station, 19191 .flags = GENL_UNS_ADMIN_PERM, 19192 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 19193 NL80211_FLAG_MLO_VALID_LINK_ID), 19194 }, 19195 { 19196 .cmd = NL80211_CMD_SET_HW_TIMESTAMP, 19197 .doit = nl80211_set_hw_timestamp, 19198 .flags = GENL_UNS_ADMIN_PERM, 19199 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 19200 }, 19201 { 19202 .cmd = NL80211_CMD_SET_TID_TO_LINK_MAPPING, 19203 .doit = nl80211_set_ttlm, 19204 .flags = GENL_UNS_ADMIN_PERM, 19205 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 19206 }, 19207 { 19208 .cmd = NL80211_CMD_ASSOC_MLO_RECONF, 19209 .doit = nl80211_assoc_ml_reconf, 19210 .flags = GENL_UNS_ADMIN_PERM, 19211 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 19212 }, 19213 { 19214 .cmd = NL80211_CMD_EPCS_CFG, 19215 .doit = nl80211_epcs_cfg, 19216 .flags = GENL_UNS_ADMIN_PERM, 19217 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 19218 }, 19219 }; 19220 19221 static struct genl_family nl80211_fam __ro_after_init = { 19222 .name = NL80211_GENL_NAME, /* have users key off the name instead */ 19223 .hdrsize = 0, /* no private header */ 19224 .version = 1, /* no particular meaning now */ 19225 .maxattr = NL80211_ATTR_MAX, 19226 .policy = nl80211_policy, 19227 .netnsok = true, 19228 .pre_doit = nl80211_pre_doit, 19229 .post_doit = nl80211_post_doit, 19230 .module = THIS_MODULE, 19231 .ops = nl80211_ops, 19232 .n_ops = ARRAY_SIZE(nl80211_ops), 19233 .small_ops = nl80211_small_ops, 19234 .n_small_ops = ARRAY_SIZE(nl80211_small_ops), 19235 .resv_start_op = NL80211_CMD_REMOVE_LINK_STA + 1, 19236 .mcgrps = nl80211_mcgrps, 19237 .n_mcgrps = ARRAY_SIZE(nl80211_mcgrps), 19238 .parallel_ops = true, 19239 }; 19240 19241 /* notification functions */ 19242 19243 void nl80211_notify_wiphy(struct cfg80211_registered_device *rdev, 19244 enum nl80211_commands cmd) 19245 { 19246 struct sk_buff *msg; 19247 struct nl80211_dump_wiphy_state state = {}; 19248 19249 WARN_ON(cmd != NL80211_CMD_NEW_WIPHY && 19250 cmd != NL80211_CMD_DEL_WIPHY); 19251 19252 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 19253 if (!msg) 19254 return; 19255 19256 if (nl80211_send_wiphy(rdev, cmd, msg, 0, 0, 0, &state) < 0) { 19257 nlmsg_free(msg); 19258 return; 19259 } 19260 19261 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 19262 NL80211_MCGRP_CONFIG, GFP_KERNEL); 19263 } 19264 19265 void nl80211_notify_iface(struct cfg80211_registered_device *rdev, 19266 struct wireless_dev *wdev, 19267 enum nl80211_commands cmd) 19268 { 19269 struct sk_buff *msg; 19270 19271 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 19272 if (!msg) 19273 return; 19274 19275 if (nl80211_send_iface(msg, 0, 0, 0, rdev, wdev, cmd) < 0) { 19276 nlmsg_free(msg); 19277 return; 19278 } 19279 19280 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 19281 NL80211_MCGRP_CONFIG, GFP_KERNEL); 19282 } 19283 19284 static int nl80211_add_scan_req(struct sk_buff *msg, 19285 struct cfg80211_registered_device *rdev) 19286 { 19287 struct cfg80211_scan_request_int *req = rdev->scan_req; 19288 struct nlattr *nest; 19289 int i; 19290 struct cfg80211_scan_info *info; 19291 19292 if (WARN_ON(!req)) 19293 return 0; 19294 19295 nest = nla_nest_start_noflag(msg, NL80211_ATTR_SCAN_SSIDS); 19296 if (!nest) 19297 goto nla_put_failure; 19298 for (i = 0; i < req->req.n_ssids; i++) { 19299 if (nla_put(msg, i, req->req.ssids[i].ssid_len, 19300 req->req.ssids[i].ssid)) 19301 goto nla_put_failure; 19302 } 19303 nla_nest_end(msg, nest); 19304 19305 if (req->req.flags & NL80211_SCAN_FLAG_FREQ_KHZ) { 19306 nest = nla_nest_start(msg, NL80211_ATTR_SCAN_FREQ_KHZ); 19307 if (!nest) 19308 goto nla_put_failure; 19309 for (i = 0; i < req->req.n_channels; i++) { 19310 if (nla_put_u32(msg, i, 19311 ieee80211_channel_to_khz(req->req.channels[i]))) 19312 goto nla_put_failure; 19313 } 19314 nla_nest_end(msg, nest); 19315 } else { 19316 nest = nla_nest_start_noflag(msg, 19317 NL80211_ATTR_SCAN_FREQUENCIES); 19318 if (!nest) 19319 goto nla_put_failure; 19320 for (i = 0; i < req->req.n_channels; i++) { 19321 if (nla_put_u32(msg, i, 19322 req->req.channels[i]->center_freq)) 19323 goto nla_put_failure; 19324 } 19325 nla_nest_end(msg, nest); 19326 } 19327 19328 if (req->req.ie && 19329 nla_put(msg, NL80211_ATTR_IE, req->req.ie_len, req->req.ie)) 19330 goto nla_put_failure; 19331 19332 if (req->req.flags && 19333 nla_put_u32(msg, NL80211_ATTR_SCAN_FLAGS, req->req.flags)) 19334 goto nla_put_failure; 19335 19336 info = rdev->int_scan_req ? &rdev->int_scan_req->info : 19337 &rdev->scan_req->info; 19338 if (info->scan_start_tsf && 19339 (nla_put_u64_64bit(msg, NL80211_ATTR_SCAN_START_TIME_TSF, 19340 info->scan_start_tsf, NL80211_BSS_PAD) || 19341 nla_put(msg, NL80211_ATTR_SCAN_START_TIME_TSF_BSSID, ETH_ALEN, 19342 info->tsf_bssid))) 19343 goto nla_put_failure; 19344 19345 return 0; 19346 nla_put_failure: 19347 return -ENOBUFS; 19348 } 19349 19350 static int nl80211_prep_scan_msg(struct sk_buff *msg, 19351 struct cfg80211_registered_device *rdev, 19352 struct wireless_dev *wdev, 19353 u32 portid, u32 seq, int flags, 19354 u32 cmd) 19355 { 19356 void *hdr; 19357 19358 hdr = nl80211hdr_put(msg, portid, seq, flags, cmd); 19359 if (!hdr) 19360 return -1; 19361 19362 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 19363 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 19364 wdev->netdev->ifindex)) || 19365 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 19366 NL80211_ATTR_PAD)) 19367 goto nla_put_failure; 19368 19369 /* ignore errors and send incomplete event anyway */ 19370 nl80211_add_scan_req(msg, rdev); 19371 19372 genlmsg_end(msg, hdr); 19373 return 0; 19374 19375 nla_put_failure: 19376 genlmsg_cancel(msg, hdr); 19377 return -EMSGSIZE; 19378 } 19379 19380 static int 19381 nl80211_prep_sched_scan_msg(struct sk_buff *msg, 19382 struct cfg80211_sched_scan_request *req, u32 cmd) 19383 { 19384 void *hdr; 19385 19386 hdr = nl80211hdr_put(msg, 0, 0, 0, cmd); 19387 if (!hdr) 19388 return -1; 19389 19390 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, 19391 wiphy_to_rdev(req->wiphy)->wiphy_idx) || 19392 nla_put_u32(msg, NL80211_ATTR_IFINDEX, req->dev->ifindex) || 19393 nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, req->reqid, 19394 NL80211_ATTR_PAD)) 19395 goto nla_put_failure; 19396 19397 genlmsg_end(msg, hdr); 19398 return 0; 19399 19400 nla_put_failure: 19401 genlmsg_cancel(msg, hdr); 19402 return -EMSGSIZE; 19403 } 19404 19405 void nl80211_send_scan_start(struct cfg80211_registered_device *rdev, 19406 struct wireless_dev *wdev) 19407 { 19408 struct sk_buff *msg; 19409 19410 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 19411 if (!msg) 19412 return; 19413 19414 if (nl80211_prep_scan_msg(msg, rdev, wdev, 0, 0, 0, 19415 NL80211_CMD_TRIGGER_SCAN) < 0) { 19416 nlmsg_free(msg); 19417 return; 19418 } 19419 19420 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 19421 NL80211_MCGRP_SCAN, GFP_KERNEL); 19422 } 19423 19424 struct sk_buff *nl80211_build_scan_msg(struct cfg80211_registered_device *rdev, 19425 struct wireless_dev *wdev, bool aborted) 19426 { 19427 struct sk_buff *msg; 19428 19429 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 19430 if (!msg) 19431 return NULL; 19432 19433 if (nl80211_prep_scan_msg(msg, rdev, wdev, 0, 0, 0, 19434 aborted ? NL80211_CMD_SCAN_ABORTED : 19435 NL80211_CMD_NEW_SCAN_RESULTS) < 0) { 19436 nlmsg_free(msg); 19437 return NULL; 19438 } 19439 19440 return msg; 19441 } 19442 19443 /* send message created by nl80211_build_scan_msg() */ 19444 void nl80211_send_scan_msg(struct cfg80211_registered_device *rdev, 19445 struct sk_buff *msg) 19446 { 19447 if (!msg) 19448 return; 19449 19450 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 19451 NL80211_MCGRP_SCAN, GFP_KERNEL); 19452 } 19453 19454 void nl80211_send_sched_scan(struct cfg80211_sched_scan_request *req, u32 cmd) 19455 { 19456 struct sk_buff *msg; 19457 19458 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 19459 if (!msg) 19460 return; 19461 19462 if (nl80211_prep_sched_scan_msg(msg, req, cmd) < 0) { 19463 nlmsg_free(msg); 19464 return; 19465 } 19466 19467 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(req->wiphy), msg, 0, 19468 NL80211_MCGRP_SCAN, GFP_KERNEL); 19469 } 19470 19471 static bool nl80211_reg_change_event_fill(struct sk_buff *msg, 19472 struct regulatory_request *request) 19473 { 19474 /* Userspace can always count this one always being set */ 19475 if (nla_put_u8(msg, NL80211_ATTR_REG_INITIATOR, request->initiator)) 19476 goto nla_put_failure; 19477 19478 if (request->alpha2[0] == '0' && request->alpha2[1] == '0') { 19479 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE, 19480 NL80211_REGDOM_TYPE_WORLD)) 19481 goto nla_put_failure; 19482 } else if (request->alpha2[0] == '9' && request->alpha2[1] == '9') { 19483 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE, 19484 NL80211_REGDOM_TYPE_CUSTOM_WORLD)) 19485 goto nla_put_failure; 19486 } else if ((request->alpha2[0] == '9' && request->alpha2[1] == '8') || 19487 request->intersect) { 19488 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE, 19489 NL80211_REGDOM_TYPE_INTERSECTION)) 19490 goto nla_put_failure; 19491 } else { 19492 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE, 19493 NL80211_REGDOM_TYPE_COUNTRY) || 19494 nla_put_string(msg, NL80211_ATTR_REG_ALPHA2, 19495 request->alpha2)) 19496 goto nla_put_failure; 19497 } 19498 19499 if (request->wiphy_idx != WIPHY_IDX_INVALID) { 19500 struct wiphy *wiphy = wiphy_idx_to_wiphy(request->wiphy_idx); 19501 19502 if (wiphy && 19503 nla_put_u32(msg, NL80211_ATTR_WIPHY, request->wiphy_idx)) 19504 goto nla_put_failure; 19505 19506 if (wiphy && 19507 wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED && 19508 nla_put_flag(msg, NL80211_ATTR_WIPHY_SELF_MANAGED_REG)) 19509 goto nla_put_failure; 19510 } 19511 19512 return true; 19513 19514 nla_put_failure: 19515 return false; 19516 } 19517 19518 /* 19519 * This can happen on global regulatory changes or device specific settings 19520 * based on custom regulatory domains. 19521 */ 19522 void nl80211_common_reg_change_event(enum nl80211_commands cmd_id, 19523 struct regulatory_request *request) 19524 { 19525 struct sk_buff *msg; 19526 void *hdr; 19527 19528 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 19529 if (!msg) 19530 return; 19531 19532 hdr = nl80211hdr_put(msg, 0, 0, 0, cmd_id); 19533 if (!hdr) 19534 goto nla_put_failure; 19535 19536 if (!nl80211_reg_change_event_fill(msg, request)) 19537 goto nla_put_failure; 19538 19539 genlmsg_end(msg, hdr); 19540 19541 genlmsg_multicast_allns(&nl80211_fam, msg, 0, 19542 NL80211_MCGRP_REGULATORY); 19543 19544 return; 19545 19546 nla_put_failure: 19547 nlmsg_free(msg); 19548 } 19549 19550 struct nl80211_mlme_event { 19551 enum nl80211_commands cmd; 19552 const u8 *buf; 19553 size_t buf_len; 19554 int uapsd_queues; 19555 const u8 *req_ies; 19556 size_t req_ies_len; 19557 bool reconnect; 19558 }; 19559 19560 static void nl80211_send_mlme_event(struct cfg80211_registered_device *rdev, 19561 struct net_device *netdev, 19562 const struct nl80211_mlme_event *event, 19563 gfp_t gfp) 19564 { 19565 struct sk_buff *msg; 19566 void *hdr; 19567 19568 msg = nlmsg_new(100 + event->buf_len + event->req_ies_len, gfp); 19569 if (!msg) 19570 return; 19571 19572 hdr = nl80211hdr_put(msg, 0, 0, 0, event->cmd); 19573 if (!hdr) { 19574 nlmsg_free(msg); 19575 return; 19576 } 19577 19578 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 19579 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 19580 nla_put(msg, NL80211_ATTR_FRAME, event->buf_len, event->buf) || 19581 (event->req_ies && 19582 nla_put(msg, NL80211_ATTR_REQ_IE, event->req_ies_len, 19583 event->req_ies))) 19584 goto nla_put_failure; 19585 19586 if (event->reconnect && 19587 nla_put_flag(msg, NL80211_ATTR_RECONNECT_REQUESTED)) 19588 goto nla_put_failure; 19589 19590 if (event->uapsd_queues >= 0) { 19591 struct nlattr *nla_wmm = 19592 nla_nest_start_noflag(msg, NL80211_ATTR_STA_WME); 19593 if (!nla_wmm) 19594 goto nla_put_failure; 19595 19596 if (nla_put_u8(msg, NL80211_STA_WME_UAPSD_QUEUES, 19597 event->uapsd_queues)) 19598 goto nla_put_failure; 19599 19600 nla_nest_end(msg, nla_wmm); 19601 } 19602 19603 genlmsg_end(msg, hdr); 19604 19605 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 19606 NL80211_MCGRP_MLME, gfp); 19607 return; 19608 19609 nla_put_failure: 19610 nlmsg_free(msg); 19611 } 19612 19613 void nl80211_send_rx_auth(struct cfg80211_registered_device *rdev, 19614 struct net_device *netdev, const u8 *buf, 19615 size_t len, gfp_t gfp) 19616 { 19617 struct nl80211_mlme_event event = { 19618 .cmd = NL80211_CMD_AUTHENTICATE, 19619 .buf = buf, 19620 .buf_len = len, 19621 .uapsd_queues = -1, 19622 }; 19623 19624 nl80211_send_mlme_event(rdev, netdev, &event, gfp); 19625 } 19626 19627 void nl80211_send_rx_assoc(struct cfg80211_registered_device *rdev, 19628 struct net_device *netdev, 19629 const struct cfg80211_rx_assoc_resp_data *data) 19630 { 19631 struct nl80211_mlme_event event = { 19632 .cmd = NL80211_CMD_ASSOCIATE, 19633 .buf = data->buf, 19634 .buf_len = data->len, 19635 .uapsd_queues = data->uapsd_queues, 19636 .req_ies = data->req_ies, 19637 .req_ies_len = data->req_ies_len, 19638 }; 19639 19640 nl80211_send_mlme_event(rdev, netdev, &event, GFP_KERNEL); 19641 } 19642 19643 void nl80211_send_deauth(struct cfg80211_registered_device *rdev, 19644 struct net_device *netdev, const u8 *buf, 19645 size_t len, bool reconnect, gfp_t gfp) 19646 { 19647 struct nl80211_mlme_event event = { 19648 .cmd = NL80211_CMD_DEAUTHENTICATE, 19649 .buf = buf, 19650 .buf_len = len, 19651 .reconnect = reconnect, 19652 .uapsd_queues = -1, 19653 }; 19654 19655 nl80211_send_mlme_event(rdev, netdev, &event, gfp); 19656 } 19657 19658 void nl80211_send_disassoc(struct cfg80211_registered_device *rdev, 19659 struct net_device *netdev, const u8 *buf, 19660 size_t len, bool reconnect, gfp_t gfp) 19661 { 19662 struct nl80211_mlme_event event = { 19663 .cmd = NL80211_CMD_DISASSOCIATE, 19664 .buf = buf, 19665 .buf_len = len, 19666 .reconnect = reconnect, 19667 .uapsd_queues = -1, 19668 }; 19669 19670 nl80211_send_mlme_event(rdev, netdev, &event, gfp); 19671 } 19672 19673 void cfg80211_rx_unprot_mlme_mgmt(struct net_device *dev, const u8 *buf, 19674 size_t len) 19675 { 19676 struct wireless_dev *wdev = dev->ieee80211_ptr; 19677 struct wiphy *wiphy = wdev->wiphy; 19678 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 19679 const struct ieee80211_mgmt *mgmt = (void *)buf; 19680 struct nl80211_mlme_event event = { 19681 .buf = buf, 19682 .buf_len = len, 19683 .uapsd_queues = -1, 19684 }; 19685 19686 if (WARN_ON(len < 2)) 19687 return; 19688 19689 if (ieee80211_is_deauth(mgmt->frame_control)) { 19690 event.cmd = NL80211_CMD_UNPROT_DEAUTHENTICATE; 19691 } else if (ieee80211_is_disassoc(mgmt->frame_control)) { 19692 event.cmd = NL80211_CMD_UNPROT_DISASSOCIATE; 19693 } else if (ieee80211_is_beacon(mgmt->frame_control)) { 19694 if (wdev->unprot_beacon_reported && 19695 elapsed_jiffies_msecs(wdev->unprot_beacon_reported) < 10000) 19696 return; 19697 event.cmd = NL80211_CMD_UNPROT_BEACON; 19698 wdev->unprot_beacon_reported = jiffies; 19699 } else { 19700 return; 19701 } 19702 19703 trace_cfg80211_rx_unprot_mlme_mgmt(dev, buf, len); 19704 nl80211_send_mlme_event(rdev, dev, &event, GFP_ATOMIC); 19705 } 19706 EXPORT_SYMBOL(cfg80211_rx_unprot_mlme_mgmt); 19707 19708 static void nl80211_send_mlme_timeout(struct cfg80211_registered_device *rdev, 19709 struct net_device *netdev, int cmd, 19710 const u8 *addr, gfp_t gfp) 19711 { 19712 struct sk_buff *msg; 19713 void *hdr; 19714 19715 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 19716 if (!msg) 19717 return; 19718 19719 hdr = nl80211hdr_put(msg, 0, 0, 0, cmd); 19720 if (!hdr) { 19721 nlmsg_free(msg); 19722 return; 19723 } 19724 19725 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 19726 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 19727 nla_put_flag(msg, NL80211_ATTR_TIMED_OUT) || 19728 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr)) 19729 goto nla_put_failure; 19730 19731 genlmsg_end(msg, hdr); 19732 19733 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 19734 NL80211_MCGRP_MLME, gfp); 19735 return; 19736 19737 nla_put_failure: 19738 nlmsg_free(msg); 19739 } 19740 19741 void nl80211_send_auth_timeout(struct cfg80211_registered_device *rdev, 19742 struct net_device *netdev, const u8 *addr, 19743 gfp_t gfp) 19744 { 19745 nl80211_send_mlme_timeout(rdev, netdev, NL80211_CMD_AUTHENTICATE, 19746 addr, gfp); 19747 } 19748 19749 void nl80211_send_assoc_timeout(struct cfg80211_registered_device *rdev, 19750 struct net_device *netdev, const u8 *addr, 19751 gfp_t gfp) 19752 { 19753 nl80211_send_mlme_timeout(rdev, netdev, NL80211_CMD_ASSOCIATE, 19754 addr, gfp); 19755 } 19756 19757 void nl80211_send_connect_result(struct cfg80211_registered_device *rdev, 19758 struct net_device *netdev, 19759 struct cfg80211_connect_resp_params *cr, 19760 gfp_t gfp) 19761 { 19762 struct sk_buff *msg; 19763 void *hdr; 19764 unsigned int link; 19765 size_t link_info_size = 0; 19766 const u8 *connected_addr = cr->valid_links ? 19767 cr->ap_mld_addr : cr->links[0].bssid; 19768 19769 if (cr->valid_links) { 19770 for_each_valid_link(cr, link) { 19771 /* Nested attribute header */ 19772 link_info_size += NLA_HDRLEN; 19773 /* Link ID */ 19774 link_info_size += nla_total_size(sizeof(u8)); 19775 link_info_size += cr->links[link].addr ? 19776 nla_total_size(ETH_ALEN) : 0; 19777 link_info_size += (cr->links[link].bssid || 19778 cr->links[link].bss) ? 19779 nla_total_size(ETH_ALEN) : 0; 19780 link_info_size += nla_total_size(sizeof(u16)); 19781 } 19782 } 19783 19784 msg = nlmsg_new(100 + cr->req_ie_len + cr->resp_ie_len + 19785 cr->fils.kek_len + cr->fils.pmk_len + 19786 (cr->fils.pmkid ? WLAN_PMKID_LEN : 0) + link_info_size, 19787 gfp); 19788 if (!msg) 19789 return; 19790 19791 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CONNECT); 19792 if (!hdr) { 19793 nlmsg_free(msg); 19794 return; 19795 } 19796 19797 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 19798 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 19799 (connected_addr && 19800 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, connected_addr)) || 19801 nla_put_u16(msg, NL80211_ATTR_STATUS_CODE, 19802 cr->status < 0 ? WLAN_STATUS_UNSPECIFIED_FAILURE : 19803 cr->status) || 19804 (cr->status < 0 && 19805 (nla_put_flag(msg, NL80211_ATTR_TIMED_OUT) || 19806 nla_put_u32(msg, NL80211_ATTR_TIMEOUT_REASON, 19807 cr->timeout_reason))) || 19808 (cr->req_ie && 19809 nla_put(msg, NL80211_ATTR_REQ_IE, cr->req_ie_len, cr->req_ie)) || 19810 (cr->resp_ie && 19811 nla_put(msg, NL80211_ATTR_RESP_IE, cr->resp_ie_len, 19812 cr->resp_ie)) || 19813 (cr->fils.update_erp_next_seq_num && 19814 nla_put_u16(msg, NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM, 19815 cr->fils.erp_next_seq_num)) || 19816 (cr->status == WLAN_STATUS_SUCCESS && 19817 ((cr->fils.kek && 19818 nla_put(msg, NL80211_ATTR_FILS_KEK, cr->fils.kek_len, 19819 cr->fils.kek)) || 19820 (cr->fils.pmk && 19821 nla_put(msg, NL80211_ATTR_PMK, cr->fils.pmk_len, cr->fils.pmk)) || 19822 (cr->fils.pmkid && 19823 nla_put(msg, NL80211_ATTR_PMKID, WLAN_PMKID_LEN, cr->fils.pmkid))))) 19824 goto nla_put_failure; 19825 19826 if (cr->valid_links) { 19827 int i = 1; 19828 struct nlattr *nested; 19829 19830 nested = nla_nest_start(msg, NL80211_ATTR_MLO_LINKS); 19831 if (!nested) 19832 goto nla_put_failure; 19833 19834 for_each_valid_link(cr, link) { 19835 struct nlattr *nested_mlo_links; 19836 const u8 *bssid = cr->links[link].bss ? 19837 cr->links[link].bss->bssid : 19838 cr->links[link].bssid; 19839 19840 nested_mlo_links = nla_nest_start(msg, i); 19841 if (!nested_mlo_links) 19842 goto nla_put_failure; 19843 19844 if (nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link) || 19845 (bssid && 19846 nla_put(msg, NL80211_ATTR_BSSID, ETH_ALEN, bssid)) || 19847 (cr->links[link].addr && 19848 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, 19849 cr->links[link].addr)) || 19850 nla_put_u16(msg, NL80211_ATTR_STATUS_CODE, 19851 cr->links[link].status)) 19852 goto nla_put_failure; 19853 19854 nla_nest_end(msg, nested_mlo_links); 19855 i++; 19856 } 19857 nla_nest_end(msg, nested); 19858 } 19859 19860 genlmsg_end(msg, hdr); 19861 19862 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 19863 NL80211_MCGRP_MLME, gfp); 19864 return; 19865 19866 nla_put_failure: 19867 nlmsg_free(msg); 19868 } 19869 19870 void nl80211_send_roamed(struct cfg80211_registered_device *rdev, 19871 struct net_device *netdev, 19872 struct cfg80211_roam_info *info, gfp_t gfp) 19873 { 19874 struct sk_buff *msg; 19875 void *hdr; 19876 size_t link_info_size = 0; 19877 unsigned int link; 19878 const u8 *connected_addr = info->ap_mld_addr ? 19879 info->ap_mld_addr : 19880 (info->links[0].bss ? 19881 info->links[0].bss->bssid : 19882 info->links[0].bssid); 19883 19884 if (info->valid_links) { 19885 for_each_valid_link(info, link) { 19886 /* Nested attribute header */ 19887 link_info_size += NLA_HDRLEN; 19888 /* Link ID */ 19889 link_info_size += nla_total_size(sizeof(u8)); 19890 link_info_size += info->links[link].addr ? 19891 nla_total_size(ETH_ALEN) : 0; 19892 link_info_size += (info->links[link].bssid || 19893 info->links[link].bss) ? 19894 nla_total_size(ETH_ALEN) : 0; 19895 } 19896 } 19897 19898 msg = nlmsg_new(100 + info->req_ie_len + info->resp_ie_len + 19899 info->fils.kek_len + info->fils.pmk_len + 19900 (info->fils.pmkid ? WLAN_PMKID_LEN : 0) + 19901 link_info_size, gfp); 19902 if (!msg) 19903 return; 19904 19905 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_ROAM); 19906 if (!hdr) { 19907 nlmsg_free(msg); 19908 return; 19909 } 19910 19911 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 19912 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 19913 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, connected_addr) || 19914 (info->req_ie && 19915 nla_put(msg, NL80211_ATTR_REQ_IE, info->req_ie_len, 19916 info->req_ie)) || 19917 (info->resp_ie && 19918 nla_put(msg, NL80211_ATTR_RESP_IE, info->resp_ie_len, 19919 info->resp_ie)) || 19920 (info->fils.update_erp_next_seq_num && 19921 nla_put_u16(msg, NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM, 19922 info->fils.erp_next_seq_num)) || 19923 (info->fils.kek && 19924 nla_put(msg, NL80211_ATTR_FILS_KEK, info->fils.kek_len, 19925 info->fils.kek)) || 19926 (info->fils.pmk && 19927 nla_put(msg, NL80211_ATTR_PMK, info->fils.pmk_len, info->fils.pmk)) || 19928 (info->fils.pmkid && 19929 nla_put(msg, NL80211_ATTR_PMKID, WLAN_PMKID_LEN, info->fils.pmkid))) 19930 goto nla_put_failure; 19931 19932 if (info->valid_links) { 19933 int i = 1; 19934 struct nlattr *nested; 19935 19936 nested = nla_nest_start(msg, NL80211_ATTR_MLO_LINKS); 19937 if (!nested) 19938 goto nla_put_failure; 19939 19940 for_each_valid_link(info, link) { 19941 struct nlattr *nested_mlo_links; 19942 const u8 *bssid = info->links[link].bss ? 19943 info->links[link].bss->bssid : 19944 info->links[link].bssid; 19945 19946 nested_mlo_links = nla_nest_start(msg, i); 19947 if (!nested_mlo_links) 19948 goto nla_put_failure; 19949 19950 if (nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link) || 19951 (bssid && 19952 nla_put(msg, NL80211_ATTR_BSSID, ETH_ALEN, bssid)) || 19953 (info->links[link].addr && 19954 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, 19955 info->links[link].addr))) 19956 goto nla_put_failure; 19957 19958 nla_nest_end(msg, nested_mlo_links); 19959 i++; 19960 } 19961 nla_nest_end(msg, nested); 19962 } 19963 19964 genlmsg_end(msg, hdr); 19965 19966 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 19967 NL80211_MCGRP_MLME, gfp); 19968 return; 19969 19970 nla_put_failure: 19971 nlmsg_free(msg); 19972 } 19973 19974 void nl80211_send_port_authorized(struct cfg80211_registered_device *rdev, 19975 struct net_device *netdev, const u8 *peer_addr, 19976 const u8 *td_bitmap, u8 td_bitmap_len) 19977 { 19978 struct sk_buff *msg; 19979 void *hdr; 19980 19981 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 19982 if (!msg) 19983 return; 19984 19985 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_PORT_AUTHORIZED); 19986 if (!hdr) { 19987 nlmsg_free(msg); 19988 return; 19989 } 19990 19991 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 19992 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 19993 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, peer_addr)) 19994 goto nla_put_failure; 19995 19996 if (td_bitmap_len > 0 && td_bitmap && 19997 nla_put(msg, NL80211_ATTR_TD_BITMAP, td_bitmap_len, td_bitmap)) 19998 goto nla_put_failure; 19999 20000 genlmsg_end(msg, hdr); 20001 20002 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 20003 NL80211_MCGRP_MLME, GFP_KERNEL); 20004 return; 20005 20006 nla_put_failure: 20007 nlmsg_free(msg); 20008 } 20009 20010 void nl80211_send_disconnected(struct cfg80211_registered_device *rdev, 20011 struct net_device *netdev, u16 reason, 20012 const u8 *ie, size_t ie_len, bool from_ap) 20013 { 20014 struct sk_buff *msg; 20015 void *hdr; 20016 20017 msg = nlmsg_new(100 + ie_len, GFP_KERNEL); 20018 if (!msg) 20019 return; 20020 20021 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_DISCONNECT); 20022 if (!hdr) { 20023 nlmsg_free(msg); 20024 return; 20025 } 20026 20027 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 20028 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 20029 (reason && 20030 nla_put_u16(msg, NL80211_ATTR_REASON_CODE, reason)) || 20031 (from_ap && 20032 nla_put_flag(msg, NL80211_ATTR_DISCONNECTED_BY_AP)) || 20033 (ie && nla_put(msg, NL80211_ATTR_IE, ie_len, ie))) 20034 goto nla_put_failure; 20035 20036 genlmsg_end(msg, hdr); 20037 20038 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 20039 NL80211_MCGRP_MLME, GFP_KERNEL); 20040 return; 20041 20042 nla_put_failure: 20043 nlmsg_free(msg); 20044 } 20045 20046 void cfg80211_links_removed(struct net_device *dev, u16 link_mask) 20047 { 20048 struct wireless_dev *wdev = dev->ieee80211_ptr; 20049 struct wiphy *wiphy = wdev->wiphy; 20050 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 20051 struct sk_buff *msg; 20052 struct nlattr *links; 20053 void *hdr; 20054 20055 lockdep_assert_wiphy(wdev->wiphy); 20056 trace_cfg80211_links_removed(dev, link_mask); 20057 20058 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_STATION && 20059 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT)) 20060 return; 20061 20062 if (WARN_ON(!wdev->valid_links || !link_mask || 20063 (wdev->valid_links & link_mask) != link_mask || 20064 wdev->valid_links == link_mask)) 20065 return; 20066 20067 cfg80211_wdev_release_link_bsses(wdev, link_mask); 20068 wdev->valid_links &= ~link_mask; 20069 20070 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 20071 if (!msg) 20072 return; 20073 20074 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_LINKS_REMOVED); 20075 if (!hdr) { 20076 nlmsg_free(msg); 20077 return; 20078 } 20079 20080 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 20081 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) 20082 goto nla_put_failure; 20083 20084 links = nla_nest_start(msg, NL80211_ATTR_MLO_LINKS); 20085 if (!links) 20086 goto nla_put_failure; 20087 20088 while (link_mask) { 20089 struct nlattr *link; 20090 int link_id = __ffs(link_mask); 20091 20092 link = nla_nest_start(msg, link_id + 1); 20093 if (!link) 20094 goto nla_put_failure; 20095 20096 if (nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link_id)) 20097 goto nla_put_failure; 20098 20099 nla_nest_end(msg, link); 20100 link_mask &= ~(1 << link_id); 20101 } 20102 20103 nla_nest_end(msg, links); 20104 20105 genlmsg_end(msg, hdr); 20106 20107 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 20108 NL80211_MCGRP_MLME, GFP_KERNEL); 20109 return; 20110 20111 nla_put_failure: 20112 nlmsg_free(msg); 20113 } 20114 EXPORT_SYMBOL(cfg80211_links_removed); 20115 20116 void nl80211_mlo_reconf_add_done(struct net_device *dev, 20117 struct cfg80211_mlo_reconf_done_data *data) 20118 { 20119 struct wireless_dev *wdev = dev->ieee80211_ptr; 20120 struct wiphy *wiphy = wdev->wiphy; 20121 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 20122 struct nl80211_mlme_event event = { 20123 .cmd = NL80211_CMD_ASSOC_MLO_RECONF, 20124 .buf = data->buf, 20125 .buf_len = data->len, 20126 .uapsd_queues = -1, 20127 }; 20128 20129 nl80211_send_mlme_event(rdev, dev, &event, GFP_KERNEL); 20130 } 20131 EXPORT_SYMBOL(nl80211_mlo_reconf_add_done); 20132 20133 void nl80211_send_ibss_bssid(struct cfg80211_registered_device *rdev, 20134 struct net_device *netdev, const u8 *bssid, 20135 gfp_t gfp) 20136 { 20137 struct sk_buff *msg; 20138 void *hdr; 20139 20140 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 20141 if (!msg) 20142 return; 20143 20144 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_JOIN_IBSS); 20145 if (!hdr) { 20146 nlmsg_free(msg); 20147 return; 20148 } 20149 20150 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 20151 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 20152 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid)) 20153 goto nla_put_failure; 20154 20155 genlmsg_end(msg, hdr); 20156 20157 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 20158 NL80211_MCGRP_MLME, gfp); 20159 return; 20160 20161 nla_put_failure: 20162 nlmsg_free(msg); 20163 } 20164 20165 void cfg80211_notify_new_peer_candidate(struct net_device *dev, const u8 *addr, 20166 const u8 *ie, u8 ie_len, 20167 int sig_dbm, gfp_t gfp) 20168 { 20169 struct wireless_dev *wdev = dev->ieee80211_ptr; 20170 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 20171 struct sk_buff *msg; 20172 void *hdr; 20173 20174 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_MESH_POINT)) 20175 return; 20176 20177 trace_cfg80211_notify_new_peer_candidate(dev, addr); 20178 20179 msg = nlmsg_new(100 + ie_len, gfp); 20180 if (!msg) 20181 return; 20182 20183 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NEW_PEER_CANDIDATE); 20184 if (!hdr) { 20185 nlmsg_free(msg); 20186 return; 20187 } 20188 20189 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 20190 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 20191 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr) || 20192 (ie_len && ie && 20193 nla_put(msg, NL80211_ATTR_IE, ie_len, ie)) || 20194 (sig_dbm && 20195 nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, sig_dbm))) 20196 goto nla_put_failure; 20197 20198 genlmsg_end(msg, hdr); 20199 20200 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 20201 NL80211_MCGRP_MLME, gfp); 20202 return; 20203 20204 nla_put_failure: 20205 nlmsg_free(msg); 20206 } 20207 EXPORT_SYMBOL(cfg80211_notify_new_peer_candidate); 20208 20209 void nl80211_michael_mic_failure(struct cfg80211_registered_device *rdev, 20210 struct net_device *netdev, const u8 *addr, 20211 enum nl80211_key_type key_type, int key_id, 20212 const u8 *tsc, gfp_t gfp) 20213 { 20214 struct sk_buff *msg; 20215 void *hdr; 20216 20217 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 20218 if (!msg) 20219 return; 20220 20221 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_MICHAEL_MIC_FAILURE); 20222 if (!hdr) { 20223 nlmsg_free(msg); 20224 return; 20225 } 20226 20227 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 20228 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 20229 (addr && nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr)) || 20230 nla_put_u32(msg, NL80211_ATTR_KEY_TYPE, key_type) || 20231 (key_id != -1 && 20232 nla_put_u8(msg, NL80211_ATTR_KEY_IDX, key_id)) || 20233 (tsc && nla_put(msg, NL80211_ATTR_KEY_SEQ, 6, tsc))) 20234 goto nla_put_failure; 20235 20236 genlmsg_end(msg, hdr); 20237 20238 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 20239 NL80211_MCGRP_MLME, gfp); 20240 return; 20241 20242 nla_put_failure: 20243 nlmsg_free(msg); 20244 } 20245 20246 void nl80211_send_beacon_hint_event(struct wiphy *wiphy, 20247 struct ieee80211_channel *channel_before, 20248 struct ieee80211_channel *channel_after) 20249 { 20250 struct sk_buff *msg; 20251 void *hdr; 20252 struct nlattr *nl_freq; 20253 20254 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC); 20255 if (!msg) 20256 return; 20257 20258 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_REG_BEACON_HINT); 20259 if (!hdr) { 20260 nlmsg_free(msg); 20261 return; 20262 } 20263 20264 /* 20265 * Since we are applying the beacon hint to a wiphy we know its 20266 * wiphy_idx is valid 20267 */ 20268 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, get_wiphy_idx(wiphy))) 20269 goto nla_put_failure; 20270 20271 /* Before */ 20272 nl_freq = nla_nest_start_noflag(msg, NL80211_ATTR_FREQ_BEFORE); 20273 if (!nl_freq) 20274 goto nla_put_failure; 20275 20276 if (nl80211_msg_put_channel(msg, wiphy, channel_before, false)) 20277 goto nla_put_failure; 20278 nla_nest_end(msg, nl_freq); 20279 20280 /* After */ 20281 nl_freq = nla_nest_start_noflag(msg, NL80211_ATTR_FREQ_AFTER); 20282 if (!nl_freq) 20283 goto nla_put_failure; 20284 20285 if (nl80211_msg_put_channel(msg, wiphy, channel_after, false)) 20286 goto nla_put_failure; 20287 nla_nest_end(msg, nl_freq); 20288 20289 genlmsg_end(msg, hdr); 20290 20291 genlmsg_multicast_allns(&nl80211_fam, msg, 0, 20292 NL80211_MCGRP_REGULATORY); 20293 20294 return; 20295 20296 nla_put_failure: 20297 nlmsg_free(msg); 20298 } 20299 20300 static void nl80211_send_remain_on_chan_event( 20301 int cmd, struct cfg80211_registered_device *rdev, 20302 struct wireless_dev *wdev, u64 cookie, 20303 struct ieee80211_channel *chan, 20304 unsigned int duration, gfp_t gfp) 20305 { 20306 struct sk_buff *msg; 20307 void *hdr; 20308 20309 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 20310 if (!msg) 20311 return; 20312 20313 hdr = nl80211hdr_put(msg, 0, 0, 0, cmd); 20314 if (!hdr) { 20315 nlmsg_free(msg); 20316 return; 20317 } 20318 20319 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 20320 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 20321 wdev->netdev->ifindex)) || 20322 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 20323 NL80211_ATTR_PAD) || 20324 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, chan->center_freq) || 20325 nla_put_u32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE, 20326 NL80211_CHAN_NO_HT) || 20327 nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie, 20328 NL80211_ATTR_PAD)) 20329 goto nla_put_failure; 20330 20331 if (cmd == NL80211_CMD_REMAIN_ON_CHANNEL && 20332 nla_put_u32(msg, NL80211_ATTR_DURATION, duration)) 20333 goto nla_put_failure; 20334 20335 genlmsg_end(msg, hdr); 20336 20337 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 20338 NL80211_MCGRP_MLME, gfp); 20339 return; 20340 20341 nla_put_failure: 20342 nlmsg_free(msg); 20343 } 20344 20345 void cfg80211_assoc_comeback(struct net_device *netdev, 20346 const u8 *ap_addr, u32 timeout) 20347 { 20348 struct wireless_dev *wdev = netdev->ieee80211_ptr; 20349 struct wiphy *wiphy = wdev->wiphy; 20350 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 20351 struct sk_buff *msg; 20352 void *hdr; 20353 20354 trace_cfg80211_assoc_comeback(wdev, ap_addr, timeout); 20355 20356 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 20357 if (!msg) 20358 return; 20359 20360 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_ASSOC_COMEBACK); 20361 if (!hdr) { 20362 nlmsg_free(msg); 20363 return; 20364 } 20365 20366 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 20367 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 20368 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, ap_addr) || 20369 nla_put_u32(msg, NL80211_ATTR_TIMEOUT, timeout)) 20370 goto nla_put_failure; 20371 20372 genlmsg_end(msg, hdr); 20373 20374 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 20375 NL80211_MCGRP_MLME, GFP_KERNEL); 20376 return; 20377 20378 nla_put_failure: 20379 nlmsg_free(msg); 20380 } 20381 EXPORT_SYMBOL(cfg80211_assoc_comeback); 20382 20383 void cfg80211_ready_on_channel(struct wireless_dev *wdev, u64 cookie, 20384 struct ieee80211_channel *chan, 20385 unsigned int duration, gfp_t gfp) 20386 { 20387 struct wiphy *wiphy = wdev->wiphy; 20388 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 20389 20390 trace_cfg80211_ready_on_channel(wdev, cookie, chan, duration); 20391 nl80211_send_remain_on_chan_event(NL80211_CMD_REMAIN_ON_CHANNEL, 20392 rdev, wdev, cookie, chan, 20393 duration, gfp); 20394 } 20395 EXPORT_SYMBOL(cfg80211_ready_on_channel); 20396 20397 void cfg80211_remain_on_channel_expired(struct wireless_dev *wdev, u64 cookie, 20398 struct ieee80211_channel *chan, 20399 gfp_t gfp) 20400 { 20401 struct wiphy *wiphy = wdev->wiphy; 20402 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 20403 20404 trace_cfg80211_ready_on_channel_expired(wdev, cookie, chan); 20405 nl80211_send_remain_on_chan_event(NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL, 20406 rdev, wdev, cookie, chan, 0, gfp); 20407 } 20408 EXPORT_SYMBOL(cfg80211_remain_on_channel_expired); 20409 20410 void cfg80211_tx_mgmt_expired(struct wireless_dev *wdev, u64 cookie, 20411 struct ieee80211_channel *chan, 20412 gfp_t gfp) 20413 { 20414 struct wiphy *wiphy = wdev->wiphy; 20415 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 20416 20417 trace_cfg80211_tx_mgmt_expired(wdev, cookie, chan); 20418 nl80211_send_remain_on_chan_event(NL80211_CMD_FRAME_WAIT_CANCEL, 20419 rdev, wdev, cookie, chan, 0, gfp); 20420 } 20421 EXPORT_SYMBOL(cfg80211_tx_mgmt_expired); 20422 20423 void cfg80211_new_sta(struct wireless_dev *wdev, const u8 *mac_addr, 20424 struct station_info *sinfo, gfp_t gfp) 20425 { 20426 struct wiphy *wiphy = wdev->wiphy; 20427 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 20428 struct sk_buff *msg; 20429 20430 trace_cfg80211_new_sta(wdev, mac_addr, sinfo); 20431 20432 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 20433 if (!msg) 20434 return; 20435 20436 if (nl80211_send_station(msg, NL80211_CMD_NEW_STATION, 0, 0, 0, 20437 rdev, wdev, mac_addr, sinfo, false) < 0) { 20438 nlmsg_free(msg); 20439 return; 20440 } 20441 20442 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 20443 NL80211_MCGRP_MLME, gfp); 20444 } 20445 EXPORT_SYMBOL(cfg80211_new_sta); 20446 20447 void cfg80211_del_sta_sinfo(struct wireless_dev *wdev, const u8 *mac_addr, 20448 struct station_info *sinfo, gfp_t gfp) 20449 { 20450 struct wiphy *wiphy = wdev->wiphy; 20451 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 20452 struct sk_buff *msg; 20453 struct station_info empty_sinfo = {}; 20454 20455 if (!sinfo) 20456 sinfo = &empty_sinfo; 20457 20458 trace_cfg80211_del_sta(wdev, mac_addr); 20459 20460 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 20461 if (!msg) { 20462 cfg80211_sinfo_release_content(sinfo); 20463 return; 20464 } 20465 20466 if (nl80211_send_station(msg, NL80211_CMD_DEL_STATION, 0, 0, 0, 20467 rdev, wdev, mac_addr, sinfo, false) < 0) { 20468 nlmsg_free(msg); 20469 return; 20470 } 20471 20472 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 20473 NL80211_MCGRP_MLME, gfp); 20474 } 20475 EXPORT_SYMBOL(cfg80211_del_sta_sinfo); 20476 20477 void cfg80211_conn_failed(struct net_device *dev, const u8 *mac_addr, 20478 enum nl80211_connect_failed_reason reason, 20479 gfp_t gfp) 20480 { 20481 struct wiphy *wiphy = dev->ieee80211_ptr->wiphy; 20482 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 20483 struct sk_buff *msg; 20484 void *hdr; 20485 20486 msg = nlmsg_new(NLMSG_GOODSIZE, gfp); 20487 if (!msg) 20488 return; 20489 20490 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CONN_FAILED); 20491 if (!hdr) { 20492 nlmsg_free(msg); 20493 return; 20494 } 20495 20496 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 20497 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr) || 20498 nla_put_u32(msg, NL80211_ATTR_CONN_FAILED_REASON, reason)) 20499 goto nla_put_failure; 20500 20501 genlmsg_end(msg, hdr); 20502 20503 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 20504 NL80211_MCGRP_MLME, gfp); 20505 return; 20506 20507 nla_put_failure: 20508 nlmsg_free(msg); 20509 } 20510 EXPORT_SYMBOL(cfg80211_conn_failed); 20511 20512 static bool __nl80211_unexpected_frame(struct net_device *dev, u8 cmd, 20513 const u8 *addr, int link_id, gfp_t gfp) 20514 { 20515 struct wireless_dev *wdev = dev->ieee80211_ptr; 20516 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 20517 struct sk_buff *msg; 20518 void *hdr; 20519 u32 nlportid = READ_ONCE(wdev->ap_unexpected_nlportid); 20520 20521 if (!nlportid) 20522 return false; 20523 20524 msg = nlmsg_new(100, gfp); 20525 if (!msg) 20526 return true; 20527 20528 hdr = nl80211hdr_put(msg, 0, 0, 0, cmd); 20529 if (!hdr) { 20530 nlmsg_free(msg); 20531 return true; 20532 } 20533 20534 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 20535 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 20536 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr) || 20537 (link_id >= 0 && 20538 nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link_id))) 20539 goto nla_put_failure; 20540 20541 genlmsg_end(msg, hdr); 20542 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); 20543 return true; 20544 20545 nla_put_failure: 20546 nlmsg_free(msg); 20547 return true; 20548 } 20549 20550 bool cfg80211_rx_spurious_frame(struct net_device *dev, const u8 *addr, 20551 int link_id, gfp_t gfp) 20552 { 20553 struct wireless_dev *wdev = dev->ieee80211_ptr; 20554 bool ret; 20555 20556 trace_cfg80211_rx_spurious_frame(dev, addr, link_id); 20557 20558 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP && 20559 wdev->iftype != NL80211_IFTYPE_P2P_GO)) { 20560 trace_cfg80211_return_bool(false); 20561 return false; 20562 } 20563 ret = __nl80211_unexpected_frame(dev, NL80211_CMD_UNEXPECTED_FRAME, 20564 addr, link_id, gfp); 20565 trace_cfg80211_return_bool(ret); 20566 return ret; 20567 } 20568 EXPORT_SYMBOL(cfg80211_rx_spurious_frame); 20569 20570 bool cfg80211_rx_unexpected_4addr_frame(struct net_device *dev, const u8 *addr, 20571 int link_id, gfp_t gfp) 20572 { 20573 struct wireless_dev *wdev = dev->ieee80211_ptr; 20574 bool ret; 20575 20576 trace_cfg80211_rx_unexpected_4addr_frame(dev, addr, link_id); 20577 20578 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP && 20579 wdev->iftype != NL80211_IFTYPE_P2P_GO && 20580 wdev->iftype != NL80211_IFTYPE_AP_VLAN)) { 20581 trace_cfg80211_return_bool(false); 20582 return false; 20583 } 20584 ret = __nl80211_unexpected_frame(dev, 20585 NL80211_CMD_UNEXPECTED_4ADDR_FRAME, 20586 addr, link_id, gfp); 20587 trace_cfg80211_return_bool(ret); 20588 return ret; 20589 } 20590 EXPORT_SYMBOL(cfg80211_rx_unexpected_4addr_frame); 20591 20592 int nl80211_send_mgmt(struct cfg80211_registered_device *rdev, 20593 struct wireless_dev *wdev, u32 nlportid, 20594 struct cfg80211_rx_info *info, gfp_t gfp) 20595 { 20596 struct net_device *netdev = wdev->netdev; 20597 struct sk_buff *msg; 20598 void *hdr; 20599 20600 msg = nlmsg_new(100 + info->len, gfp); 20601 if (!msg) 20602 return -ENOMEM; 20603 20604 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FRAME); 20605 if (!hdr) { 20606 nlmsg_free(msg); 20607 return -ENOMEM; 20608 } 20609 20610 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 20611 (netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 20612 netdev->ifindex)) || 20613 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 20614 NL80211_ATTR_PAD) || 20615 (info->have_link_id && 20616 nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, info->link_id)) || 20617 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, KHZ_TO_MHZ(info->freq)) || 20618 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ_OFFSET, info->freq % 1000) || 20619 (info->sig_dbm && 20620 nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, info->sig_dbm)) || 20621 nla_put(msg, NL80211_ATTR_FRAME, info->len, info->buf) || 20622 (info->flags && 20623 nla_put_u32(msg, NL80211_ATTR_RXMGMT_FLAGS, info->flags)) || 20624 (info->rx_tstamp && nla_put_u64_64bit(msg, 20625 NL80211_ATTR_RX_HW_TIMESTAMP, 20626 info->rx_tstamp, 20627 NL80211_ATTR_PAD)) || 20628 (info->ack_tstamp && nla_put_u64_64bit(msg, 20629 NL80211_ATTR_TX_HW_TIMESTAMP, 20630 info->ack_tstamp, 20631 NL80211_ATTR_PAD))) 20632 goto nla_put_failure; 20633 20634 genlmsg_end(msg, hdr); 20635 20636 return genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); 20637 20638 nla_put_failure: 20639 nlmsg_free(msg); 20640 return -ENOBUFS; 20641 } 20642 20643 static void nl80211_frame_tx_status(struct wireless_dev *wdev, 20644 struct cfg80211_tx_status *status, 20645 gfp_t gfp, enum nl80211_commands command) 20646 { 20647 struct wiphy *wiphy = wdev->wiphy; 20648 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 20649 struct net_device *netdev = wdev->netdev; 20650 struct sk_buff *msg; 20651 void *hdr; 20652 20653 if (command == NL80211_CMD_FRAME_TX_STATUS) 20654 trace_cfg80211_mgmt_tx_status(wdev, status->cookie, 20655 status->ack); 20656 else 20657 trace_cfg80211_control_port_tx_status(wdev, status->cookie, 20658 status->ack); 20659 20660 msg = nlmsg_new(100 + status->len, gfp); 20661 if (!msg) 20662 return; 20663 20664 hdr = nl80211hdr_put(msg, 0, 0, 0, command); 20665 if (!hdr) { 20666 nlmsg_free(msg); 20667 return; 20668 } 20669 20670 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 20671 (netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 20672 netdev->ifindex)) || 20673 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 20674 NL80211_ATTR_PAD) || 20675 nla_put(msg, NL80211_ATTR_FRAME, status->len, status->buf) || 20676 nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, status->cookie, 20677 NL80211_ATTR_PAD) || 20678 (status->ack && nla_put_flag(msg, NL80211_ATTR_ACK)) || 20679 (status->tx_tstamp && 20680 nla_put_u64_64bit(msg, NL80211_ATTR_TX_HW_TIMESTAMP, 20681 status->tx_tstamp, NL80211_ATTR_PAD)) || 20682 (status->ack_tstamp && 20683 nla_put_u64_64bit(msg, NL80211_ATTR_RX_HW_TIMESTAMP, 20684 status->ack_tstamp, NL80211_ATTR_PAD))) 20685 goto nla_put_failure; 20686 20687 genlmsg_end(msg, hdr); 20688 20689 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 20690 NL80211_MCGRP_MLME, gfp); 20691 return; 20692 20693 nla_put_failure: 20694 nlmsg_free(msg); 20695 } 20696 20697 void cfg80211_control_port_tx_status(struct wireless_dev *wdev, u64 cookie, 20698 const u8 *buf, size_t len, bool ack, 20699 gfp_t gfp) 20700 { 20701 struct cfg80211_tx_status status = { 20702 .cookie = cookie, 20703 .buf = buf, 20704 .len = len, 20705 .ack = ack 20706 }; 20707 20708 nl80211_frame_tx_status(wdev, &status, gfp, 20709 NL80211_CMD_CONTROL_PORT_FRAME_TX_STATUS); 20710 } 20711 EXPORT_SYMBOL(cfg80211_control_port_tx_status); 20712 20713 void cfg80211_mgmt_tx_status_ext(struct wireless_dev *wdev, 20714 struct cfg80211_tx_status *status, gfp_t gfp) 20715 { 20716 nl80211_frame_tx_status(wdev, status, gfp, NL80211_CMD_FRAME_TX_STATUS); 20717 } 20718 EXPORT_SYMBOL(cfg80211_mgmt_tx_status_ext); 20719 20720 static int __nl80211_rx_control_port(struct net_device *dev, 20721 struct sk_buff *skb, 20722 bool unencrypted, 20723 int link_id, 20724 gfp_t gfp) 20725 { 20726 struct wireless_dev *wdev = dev->ieee80211_ptr; 20727 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 20728 struct ethhdr *ehdr = eth_hdr(skb); 20729 const u8 *addr = ehdr->h_source; 20730 u16 proto = be16_to_cpu(skb->protocol); 20731 struct sk_buff *msg; 20732 void *hdr; 20733 struct nlattr *frame; 20734 20735 u32 nlportid = READ_ONCE(wdev->conn_owner_nlportid); 20736 20737 if (!nlportid) 20738 return -ENOENT; 20739 20740 msg = nlmsg_new(100 + skb->len, gfp); 20741 if (!msg) 20742 return -ENOMEM; 20743 20744 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CONTROL_PORT_FRAME); 20745 if (!hdr) { 20746 nlmsg_free(msg); 20747 return -ENOBUFS; 20748 } 20749 20750 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 20751 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 20752 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 20753 NL80211_ATTR_PAD) || 20754 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr) || 20755 nla_put_u16(msg, NL80211_ATTR_CONTROL_PORT_ETHERTYPE, proto) || 20756 (link_id >= 0 && 20757 nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link_id)) || 20758 (unencrypted && nla_put_flag(msg, 20759 NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT))) 20760 goto nla_put_failure; 20761 20762 frame = nla_reserve(msg, NL80211_ATTR_FRAME, skb->len); 20763 if (!frame) 20764 goto nla_put_failure; 20765 20766 skb_copy_bits(skb, 0, nla_data(frame), skb->len); 20767 genlmsg_end(msg, hdr); 20768 20769 return genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); 20770 20771 nla_put_failure: 20772 nlmsg_free(msg); 20773 return -ENOBUFS; 20774 } 20775 20776 bool cfg80211_rx_control_port(struct net_device *dev, struct sk_buff *skb, 20777 bool unencrypted, int link_id) 20778 { 20779 int ret; 20780 20781 trace_cfg80211_rx_control_port(dev, skb, unencrypted, link_id); 20782 ret = __nl80211_rx_control_port(dev, skb, unencrypted, link_id, 20783 GFP_ATOMIC); 20784 trace_cfg80211_return_bool(ret == 0); 20785 return ret == 0; 20786 } 20787 EXPORT_SYMBOL(cfg80211_rx_control_port); 20788 20789 static struct sk_buff *cfg80211_prepare_cqm(struct net_device *dev, 20790 const char *mac, gfp_t gfp) 20791 { 20792 struct wireless_dev *wdev = dev->ieee80211_ptr; 20793 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 20794 struct sk_buff *msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 20795 void **cb; 20796 20797 if (!msg) 20798 return NULL; 20799 20800 cb = (void **)msg->cb; 20801 20802 cb[0] = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NOTIFY_CQM); 20803 if (!cb[0]) { 20804 nlmsg_free(msg); 20805 return NULL; 20806 } 20807 20808 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 20809 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) 20810 goto nla_put_failure; 20811 20812 if (mac && nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac)) 20813 goto nla_put_failure; 20814 20815 cb[1] = nla_nest_start_noflag(msg, NL80211_ATTR_CQM); 20816 if (!cb[1]) 20817 goto nla_put_failure; 20818 20819 cb[2] = rdev; 20820 20821 return msg; 20822 nla_put_failure: 20823 nlmsg_free(msg); 20824 return NULL; 20825 } 20826 20827 static void cfg80211_send_cqm(struct sk_buff *msg, gfp_t gfp) 20828 { 20829 void **cb = (void **)msg->cb; 20830 struct cfg80211_registered_device *rdev = cb[2]; 20831 20832 nla_nest_end(msg, cb[1]); 20833 genlmsg_end(msg, cb[0]); 20834 20835 memset(msg->cb, 0, sizeof(msg->cb)); 20836 20837 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 20838 NL80211_MCGRP_MLME, gfp); 20839 } 20840 20841 void cfg80211_cqm_rssi_notify(struct net_device *dev, 20842 enum nl80211_cqm_rssi_threshold_event rssi_event, 20843 s32 rssi_level, gfp_t gfp) 20844 { 20845 struct wireless_dev *wdev = dev->ieee80211_ptr; 20846 struct cfg80211_cqm_config *cqm_config; 20847 20848 trace_cfg80211_cqm_rssi_notify(dev, rssi_event, rssi_level); 20849 20850 if (WARN_ON(rssi_event != NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW && 20851 rssi_event != NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH)) 20852 return; 20853 20854 rcu_read_lock(); 20855 cqm_config = rcu_dereference(wdev->cqm_config); 20856 if (cqm_config) { 20857 cqm_config->last_rssi_event_value = rssi_level; 20858 cqm_config->last_rssi_event_type = rssi_event; 20859 wiphy_work_queue(wdev->wiphy, &wdev->cqm_rssi_work); 20860 } 20861 rcu_read_unlock(); 20862 } 20863 EXPORT_SYMBOL(cfg80211_cqm_rssi_notify); 20864 20865 void cfg80211_cqm_rssi_notify_work(struct wiphy *wiphy, struct wiphy_work *work) 20866 { 20867 struct wireless_dev *wdev = container_of(work, struct wireless_dev, 20868 cqm_rssi_work); 20869 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 20870 enum nl80211_cqm_rssi_threshold_event rssi_event; 20871 struct cfg80211_cqm_config *cqm_config; 20872 struct sk_buff *msg; 20873 s32 rssi_level; 20874 20875 cqm_config = wiphy_dereference(wdev->wiphy, wdev->cqm_config); 20876 if (!cqm_config) 20877 return; 20878 20879 if (cqm_config->use_range_api) 20880 cfg80211_cqm_rssi_update(rdev, wdev->netdev, cqm_config); 20881 20882 rssi_level = cqm_config->last_rssi_event_value; 20883 rssi_event = cqm_config->last_rssi_event_type; 20884 20885 msg = cfg80211_prepare_cqm(wdev->netdev, NULL, GFP_KERNEL); 20886 if (!msg) 20887 return; 20888 20889 if (nla_put_u32(msg, NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT, 20890 rssi_event)) 20891 goto nla_put_failure; 20892 20893 if (rssi_level && nla_put_s32(msg, NL80211_ATTR_CQM_RSSI_LEVEL, 20894 rssi_level)) 20895 goto nla_put_failure; 20896 20897 cfg80211_send_cqm(msg, GFP_KERNEL); 20898 20899 return; 20900 20901 nla_put_failure: 20902 nlmsg_free(msg); 20903 } 20904 20905 void cfg80211_cqm_txe_notify(struct net_device *dev, 20906 const u8 *peer, u32 num_packets, 20907 u32 rate, u32 intvl, gfp_t gfp) 20908 { 20909 struct sk_buff *msg; 20910 20911 msg = cfg80211_prepare_cqm(dev, peer, gfp); 20912 if (!msg) 20913 return; 20914 20915 if (nla_put_u32(msg, NL80211_ATTR_CQM_TXE_PKTS, num_packets)) 20916 goto nla_put_failure; 20917 20918 if (nla_put_u32(msg, NL80211_ATTR_CQM_TXE_RATE, rate)) 20919 goto nla_put_failure; 20920 20921 if (nla_put_u32(msg, NL80211_ATTR_CQM_TXE_INTVL, intvl)) 20922 goto nla_put_failure; 20923 20924 cfg80211_send_cqm(msg, gfp); 20925 return; 20926 20927 nla_put_failure: 20928 nlmsg_free(msg); 20929 } 20930 EXPORT_SYMBOL(cfg80211_cqm_txe_notify); 20931 20932 void cfg80211_cqm_pktloss_notify(struct net_device *dev, 20933 const u8 *peer, u32 num_packets, gfp_t gfp) 20934 { 20935 struct sk_buff *msg; 20936 20937 trace_cfg80211_cqm_pktloss_notify(dev, peer, num_packets); 20938 20939 msg = cfg80211_prepare_cqm(dev, peer, gfp); 20940 if (!msg) 20941 return; 20942 20943 if (nla_put_u32(msg, NL80211_ATTR_CQM_PKT_LOSS_EVENT, num_packets)) 20944 goto nla_put_failure; 20945 20946 cfg80211_send_cqm(msg, gfp); 20947 return; 20948 20949 nla_put_failure: 20950 nlmsg_free(msg); 20951 } 20952 EXPORT_SYMBOL(cfg80211_cqm_pktloss_notify); 20953 20954 void cfg80211_cqm_beacon_loss_notify(struct net_device *dev, gfp_t gfp) 20955 { 20956 struct sk_buff *msg; 20957 20958 msg = cfg80211_prepare_cqm(dev, NULL, gfp); 20959 if (!msg) 20960 return; 20961 20962 if (nla_put_flag(msg, NL80211_ATTR_CQM_BEACON_LOSS_EVENT)) 20963 goto nla_put_failure; 20964 20965 cfg80211_send_cqm(msg, gfp); 20966 return; 20967 20968 nla_put_failure: 20969 nlmsg_free(msg); 20970 } 20971 EXPORT_SYMBOL(cfg80211_cqm_beacon_loss_notify); 20972 20973 static void nl80211_gtk_rekey_notify(struct cfg80211_registered_device *rdev, 20974 struct net_device *netdev, const u8 *bssid, 20975 const u8 *replay_ctr, gfp_t gfp) 20976 { 20977 struct sk_buff *msg; 20978 struct nlattr *rekey_attr; 20979 void *hdr; 20980 20981 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 20982 if (!msg) 20983 return; 20984 20985 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_SET_REKEY_OFFLOAD); 20986 if (!hdr) { 20987 nlmsg_free(msg); 20988 return; 20989 } 20990 20991 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 20992 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 20993 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid)) 20994 goto nla_put_failure; 20995 20996 rekey_attr = nla_nest_start_noflag(msg, NL80211_ATTR_REKEY_DATA); 20997 if (!rekey_attr) 20998 goto nla_put_failure; 20999 21000 if (nla_put(msg, NL80211_REKEY_DATA_REPLAY_CTR, 21001 NL80211_REPLAY_CTR_LEN, replay_ctr)) 21002 goto nla_put_failure; 21003 21004 nla_nest_end(msg, rekey_attr); 21005 21006 genlmsg_end(msg, hdr); 21007 21008 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21009 NL80211_MCGRP_MLME, gfp); 21010 return; 21011 21012 nla_put_failure: 21013 nlmsg_free(msg); 21014 } 21015 21016 void cfg80211_gtk_rekey_notify(struct net_device *dev, const u8 *bssid, 21017 const u8 *replay_ctr, gfp_t gfp) 21018 { 21019 struct wireless_dev *wdev = dev->ieee80211_ptr; 21020 struct wiphy *wiphy = wdev->wiphy; 21021 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 21022 21023 trace_cfg80211_gtk_rekey_notify(dev, bssid); 21024 nl80211_gtk_rekey_notify(rdev, dev, bssid, replay_ctr, gfp); 21025 } 21026 EXPORT_SYMBOL(cfg80211_gtk_rekey_notify); 21027 21028 static void 21029 nl80211_pmksa_candidate_notify(struct cfg80211_registered_device *rdev, 21030 struct net_device *netdev, int index, 21031 const u8 *bssid, bool preauth, gfp_t gfp) 21032 { 21033 struct sk_buff *msg; 21034 struct nlattr *attr; 21035 void *hdr; 21036 21037 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 21038 if (!msg) 21039 return; 21040 21041 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_PMKSA_CANDIDATE); 21042 if (!hdr) { 21043 nlmsg_free(msg); 21044 return; 21045 } 21046 21047 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 21048 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex)) 21049 goto nla_put_failure; 21050 21051 attr = nla_nest_start_noflag(msg, NL80211_ATTR_PMKSA_CANDIDATE); 21052 if (!attr) 21053 goto nla_put_failure; 21054 21055 if (nla_put_u32(msg, NL80211_PMKSA_CANDIDATE_INDEX, index) || 21056 nla_put(msg, NL80211_PMKSA_CANDIDATE_BSSID, ETH_ALEN, bssid) || 21057 (preauth && 21058 nla_put_flag(msg, NL80211_PMKSA_CANDIDATE_PREAUTH))) 21059 goto nla_put_failure; 21060 21061 nla_nest_end(msg, attr); 21062 21063 genlmsg_end(msg, hdr); 21064 21065 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21066 NL80211_MCGRP_MLME, gfp); 21067 return; 21068 21069 nla_put_failure: 21070 nlmsg_free(msg); 21071 } 21072 21073 void cfg80211_pmksa_candidate_notify(struct net_device *dev, int index, 21074 const u8 *bssid, bool preauth, gfp_t gfp) 21075 { 21076 struct wireless_dev *wdev = dev->ieee80211_ptr; 21077 struct wiphy *wiphy = wdev->wiphy; 21078 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 21079 21080 trace_cfg80211_pmksa_candidate_notify(dev, index, bssid, preauth); 21081 nl80211_pmksa_candidate_notify(rdev, dev, index, bssid, preauth, gfp); 21082 } 21083 EXPORT_SYMBOL(cfg80211_pmksa_candidate_notify); 21084 21085 static void nl80211_ch_switch_notify(struct cfg80211_registered_device *rdev, 21086 struct net_device *netdev, 21087 unsigned int link_id, 21088 struct cfg80211_chan_def *chandef, 21089 gfp_t gfp, 21090 enum nl80211_commands notif, 21091 u8 count, bool quiet) 21092 { 21093 struct wireless_dev *wdev = netdev->ieee80211_ptr; 21094 struct sk_buff *msg; 21095 void *hdr; 21096 21097 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 21098 if (!msg) 21099 return; 21100 21101 hdr = nl80211hdr_put(msg, 0, 0, 0, notif); 21102 if (!hdr) { 21103 nlmsg_free(msg); 21104 return; 21105 } 21106 21107 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex)) 21108 goto nla_put_failure; 21109 21110 if (wdev->valid_links && 21111 nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link_id)) 21112 goto nla_put_failure; 21113 21114 if (nl80211_send_chandef(msg, chandef)) 21115 goto nla_put_failure; 21116 21117 if (notif == NL80211_CMD_CH_SWITCH_STARTED_NOTIFY) { 21118 if (nla_put_u32(msg, NL80211_ATTR_CH_SWITCH_COUNT, count)) 21119 goto nla_put_failure; 21120 if (quiet && 21121 nla_put_flag(msg, NL80211_ATTR_CH_SWITCH_BLOCK_TX)) 21122 goto nla_put_failure; 21123 } 21124 21125 genlmsg_end(msg, hdr); 21126 21127 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21128 NL80211_MCGRP_MLME, gfp); 21129 return; 21130 21131 nla_put_failure: 21132 nlmsg_free(msg); 21133 } 21134 21135 void cfg80211_ch_switch_notify(struct net_device *dev, 21136 struct cfg80211_chan_def *chandef, 21137 unsigned int link_id) 21138 { 21139 struct wireless_dev *wdev = dev->ieee80211_ptr; 21140 struct wiphy *wiphy = wdev->wiphy; 21141 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 21142 21143 lockdep_assert_wiphy(wdev->wiphy); 21144 WARN_INVALID_LINK_ID(wdev, link_id); 21145 21146 trace_cfg80211_ch_switch_notify(dev, chandef, link_id); 21147 21148 switch (wdev->iftype) { 21149 case NL80211_IFTYPE_STATION: 21150 case NL80211_IFTYPE_P2P_CLIENT: 21151 if (!WARN_ON(!wdev->links[link_id].client.current_bss)) 21152 cfg80211_update_assoc_bss_entry(wdev, link_id, 21153 chandef->chan); 21154 break; 21155 case NL80211_IFTYPE_MESH_POINT: 21156 wdev->u.mesh.chandef = *chandef; 21157 wdev->u.mesh.preset_chandef = *chandef; 21158 break; 21159 case NL80211_IFTYPE_AP: 21160 case NL80211_IFTYPE_P2P_GO: 21161 wdev->links[link_id].ap.chandef = *chandef; 21162 break; 21163 case NL80211_IFTYPE_ADHOC: 21164 wdev->u.ibss.chandef = *chandef; 21165 break; 21166 default: 21167 WARN_ON(1); 21168 break; 21169 } 21170 21171 cfg80211_schedule_channels_check(wdev); 21172 cfg80211_sched_dfs_chan_update(rdev); 21173 21174 nl80211_ch_switch_notify(rdev, dev, link_id, chandef, GFP_KERNEL, 21175 NL80211_CMD_CH_SWITCH_NOTIFY, 0, false); 21176 } 21177 EXPORT_SYMBOL(cfg80211_ch_switch_notify); 21178 21179 void cfg80211_incumbent_signal_notify(struct wiphy *wiphy, 21180 const struct cfg80211_chan_def *chandef, 21181 u32 signal_interference_bitmap, 21182 gfp_t gfp) 21183 { 21184 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 21185 struct sk_buff *msg; 21186 void *hdr; 21187 21188 trace_cfg80211_incumbent_signal_notify(wiphy, chandef, signal_interference_bitmap); 21189 21190 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 21191 if (!msg) 21192 return; 21193 21194 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_INCUMBENT_SIGNAL_DETECT); 21195 if (!hdr) 21196 goto nla_put_failure; 21197 21198 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx)) 21199 goto nla_put_failure; 21200 21201 if (nl80211_send_chandef(msg, chandef)) 21202 goto nla_put_failure; 21203 21204 if (nla_put_u32(msg, NL80211_ATTR_INCUMBENT_SIGNAL_INTERFERENCE_BITMAP, 21205 signal_interference_bitmap)) 21206 goto nla_put_failure; 21207 21208 genlmsg_end(msg, hdr); 21209 21210 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21211 NL80211_MCGRP_MLME, gfp); 21212 return; 21213 21214 nla_put_failure: 21215 nlmsg_free(msg); 21216 } 21217 EXPORT_SYMBOL(cfg80211_incumbent_signal_notify); 21218 21219 void cfg80211_ch_switch_started_notify(struct net_device *dev, 21220 struct cfg80211_chan_def *chandef, 21221 unsigned int link_id, u8 count, 21222 bool quiet) 21223 { 21224 struct wireless_dev *wdev = dev->ieee80211_ptr; 21225 struct wiphy *wiphy = wdev->wiphy; 21226 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 21227 21228 lockdep_assert_wiphy(wdev->wiphy); 21229 WARN_INVALID_LINK_ID(wdev, link_id); 21230 21231 trace_cfg80211_ch_switch_started_notify(dev, chandef, link_id); 21232 21233 21234 nl80211_ch_switch_notify(rdev, dev, link_id, chandef, GFP_KERNEL, 21235 NL80211_CMD_CH_SWITCH_STARTED_NOTIFY, 21236 count, quiet); 21237 } 21238 EXPORT_SYMBOL(cfg80211_ch_switch_started_notify); 21239 21240 int cfg80211_bss_color_notify(struct net_device *dev, 21241 enum nl80211_commands cmd, u8 count, 21242 u64 color_bitmap, u8 link_id) 21243 { 21244 struct wireless_dev *wdev = dev->ieee80211_ptr; 21245 struct wiphy *wiphy = wdev->wiphy; 21246 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 21247 struct sk_buff *msg; 21248 void *hdr; 21249 21250 lockdep_assert_wiphy(wdev->wiphy); 21251 21252 trace_cfg80211_bss_color_notify(dev, cmd, count, color_bitmap); 21253 21254 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 21255 if (!msg) 21256 return -ENOMEM; 21257 21258 hdr = nl80211hdr_put(msg, 0, 0, 0, cmd); 21259 if (!hdr) 21260 goto nla_put_failure; 21261 21262 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) 21263 goto nla_put_failure; 21264 21265 if (wdev->valid_links && 21266 nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link_id)) 21267 goto nla_put_failure; 21268 21269 if (cmd == NL80211_CMD_COLOR_CHANGE_STARTED && 21270 nla_put_u32(msg, NL80211_ATTR_COLOR_CHANGE_COUNT, count)) 21271 goto nla_put_failure; 21272 21273 if (cmd == NL80211_CMD_OBSS_COLOR_COLLISION && 21274 nla_put_u64_64bit(msg, NL80211_ATTR_OBSS_COLOR_BITMAP, 21275 color_bitmap, NL80211_ATTR_PAD)) 21276 goto nla_put_failure; 21277 21278 genlmsg_end(msg, hdr); 21279 21280 return genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), 21281 msg, 0, NL80211_MCGRP_MLME, GFP_KERNEL); 21282 21283 nla_put_failure: 21284 nlmsg_free(msg); 21285 return -EINVAL; 21286 } 21287 EXPORT_SYMBOL(cfg80211_bss_color_notify); 21288 21289 void 21290 nl80211_radar_notify(struct cfg80211_registered_device *rdev, 21291 const struct cfg80211_chan_def *chandef, 21292 enum nl80211_radar_event event, 21293 struct net_device *netdev, gfp_t gfp) 21294 { 21295 struct sk_buff *msg; 21296 void *hdr; 21297 21298 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 21299 if (!msg) 21300 return; 21301 21302 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_RADAR_DETECT); 21303 if (!hdr) { 21304 nlmsg_free(msg); 21305 return; 21306 } 21307 21308 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx)) 21309 goto nla_put_failure; 21310 21311 /* NOP and radar events don't need a netdev parameter */ 21312 if (netdev) { 21313 struct wireless_dev *wdev = netdev->ieee80211_ptr; 21314 21315 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 21316 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 21317 NL80211_ATTR_PAD)) 21318 goto nla_put_failure; 21319 } 21320 21321 if (rdev->background_radar_wdev && 21322 cfg80211_chandef_identical(&rdev->background_radar_chandef, 21323 chandef)) { 21324 if (nla_put_flag(msg, NL80211_ATTR_RADAR_BACKGROUND)) 21325 goto nla_put_failure; 21326 } 21327 21328 if (nla_put_u32(msg, NL80211_ATTR_RADAR_EVENT, event)) 21329 goto nla_put_failure; 21330 21331 if (nl80211_send_chandef(msg, chandef)) 21332 goto nla_put_failure; 21333 21334 genlmsg_end(msg, hdr); 21335 21336 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21337 NL80211_MCGRP_MLME, gfp); 21338 return; 21339 21340 nla_put_failure: 21341 nlmsg_free(msg); 21342 } 21343 21344 void cfg80211_sta_opmode_change_notify(struct net_device *dev, const u8 *mac, 21345 struct sta_opmode_info *sta_opmode, 21346 gfp_t gfp) 21347 { 21348 struct sk_buff *msg; 21349 struct wireless_dev *wdev = dev->ieee80211_ptr; 21350 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 21351 void *hdr; 21352 21353 if (WARN_ON(!mac)) 21354 return; 21355 21356 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 21357 if (!msg) 21358 return; 21359 21360 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_STA_OPMODE_CHANGED); 21361 if (!hdr) { 21362 nlmsg_free(msg); 21363 return; 21364 } 21365 21366 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx)) 21367 goto nla_put_failure; 21368 21369 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) 21370 goto nla_put_failure; 21371 21372 if (nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac)) 21373 goto nla_put_failure; 21374 21375 if ((sta_opmode->changed & STA_OPMODE_SMPS_MODE_CHANGED) && 21376 nla_put_u8(msg, NL80211_ATTR_SMPS_MODE, sta_opmode->smps_mode)) 21377 goto nla_put_failure; 21378 21379 if ((sta_opmode->changed & STA_OPMODE_MAX_BW_CHANGED) && 21380 nla_put_u32(msg, NL80211_ATTR_CHANNEL_WIDTH, sta_opmode->bw)) 21381 goto nla_put_failure; 21382 21383 if ((sta_opmode->changed & STA_OPMODE_N_SS_CHANGED) && 21384 nla_put_u8(msg, NL80211_ATTR_NSS, sta_opmode->rx_nss)) 21385 goto nla_put_failure; 21386 21387 genlmsg_end(msg, hdr); 21388 21389 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21390 NL80211_MCGRP_MLME, gfp); 21391 21392 return; 21393 21394 nla_put_failure: 21395 nlmsg_free(msg); 21396 } 21397 EXPORT_SYMBOL(cfg80211_sta_opmode_change_notify); 21398 21399 void cfg80211_probe_status(struct net_device *dev, const u8 *addr, 21400 u64 cookie, bool acked, s32 ack_signal, 21401 bool is_valid_ack_signal, gfp_t gfp) 21402 { 21403 struct wireless_dev *wdev = dev->ieee80211_ptr; 21404 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 21405 struct sk_buff *msg; 21406 void *hdr; 21407 21408 trace_cfg80211_probe_status(dev, addr, cookie, acked); 21409 21410 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 21411 21412 if (!msg) 21413 return; 21414 21415 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_PROBE_CLIENT); 21416 if (!hdr) { 21417 nlmsg_free(msg); 21418 return; 21419 } 21420 21421 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 21422 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 21423 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr) || 21424 nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie, 21425 NL80211_ATTR_PAD) || 21426 (acked && nla_put_flag(msg, NL80211_ATTR_ACK)) || 21427 (is_valid_ack_signal && nla_put_s32(msg, NL80211_ATTR_ACK_SIGNAL, 21428 ack_signal))) 21429 goto nla_put_failure; 21430 21431 genlmsg_end(msg, hdr); 21432 21433 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21434 NL80211_MCGRP_MLME, gfp); 21435 return; 21436 21437 nla_put_failure: 21438 nlmsg_free(msg); 21439 } 21440 EXPORT_SYMBOL(cfg80211_probe_status); 21441 21442 void cfg80211_report_obss_beacon_khz(struct wiphy *wiphy, const u8 *frame, 21443 size_t len, int freq, int sig_dbm) 21444 { 21445 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 21446 struct sk_buff *msg; 21447 void *hdr; 21448 struct cfg80211_beacon_registration *reg; 21449 21450 trace_cfg80211_report_obss_beacon(wiphy, frame, len, freq, sig_dbm); 21451 21452 spin_lock_bh(&rdev->beacon_registrations_lock); 21453 list_for_each_entry(reg, &rdev->beacon_registrations, list) { 21454 msg = nlmsg_new(len + 100, GFP_ATOMIC); 21455 if (!msg) { 21456 spin_unlock_bh(&rdev->beacon_registrations_lock); 21457 return; 21458 } 21459 21460 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FRAME); 21461 if (!hdr) 21462 goto nla_put_failure; 21463 21464 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 21465 (freq && 21466 (nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, 21467 KHZ_TO_MHZ(freq)) || 21468 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ_OFFSET, 21469 freq % 1000))) || 21470 (sig_dbm && 21471 nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, sig_dbm)) || 21472 nla_put(msg, NL80211_ATTR_FRAME, len, frame)) 21473 goto nla_put_failure; 21474 21475 genlmsg_end(msg, hdr); 21476 21477 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, reg->nlportid); 21478 } 21479 spin_unlock_bh(&rdev->beacon_registrations_lock); 21480 return; 21481 21482 nla_put_failure: 21483 spin_unlock_bh(&rdev->beacon_registrations_lock); 21484 nlmsg_free(msg); 21485 } 21486 EXPORT_SYMBOL(cfg80211_report_obss_beacon_khz); 21487 21488 #ifdef CONFIG_PM 21489 static int cfg80211_net_detect_results(struct sk_buff *msg, 21490 struct cfg80211_wowlan_wakeup *wakeup) 21491 { 21492 struct cfg80211_wowlan_nd_info *nd = wakeup->net_detect; 21493 struct nlattr *nl_results, *nl_match, *nl_freqs; 21494 int i, j; 21495 21496 nl_results = nla_nest_start_noflag(msg, 21497 NL80211_WOWLAN_TRIG_NET_DETECT_RESULTS); 21498 if (!nl_results) 21499 return -EMSGSIZE; 21500 21501 for (i = 0; i < nd->n_matches; i++) { 21502 struct cfg80211_wowlan_nd_match *match = nd->matches[i]; 21503 21504 nl_match = nla_nest_start_noflag(msg, i); 21505 if (!nl_match) 21506 break; 21507 21508 /* The SSID attribute is optional in nl80211, but for 21509 * simplicity reasons it's always present in the 21510 * cfg80211 structure. If a driver can't pass the 21511 * SSID, that needs to be changed. A zero length SSID 21512 * is still a valid SSID (wildcard), so it cannot be 21513 * used for this purpose. 21514 */ 21515 if (nla_put(msg, NL80211_ATTR_SSID, match->ssid.ssid_len, 21516 match->ssid.ssid)) { 21517 nla_nest_cancel(msg, nl_match); 21518 goto out; 21519 } 21520 21521 if (match->n_channels) { 21522 nl_freqs = nla_nest_start_noflag(msg, 21523 NL80211_ATTR_SCAN_FREQUENCIES); 21524 if (!nl_freqs) { 21525 nla_nest_cancel(msg, nl_match); 21526 goto out; 21527 } 21528 21529 for (j = 0; j < match->n_channels; j++) { 21530 if (nla_put_u32(msg, j, match->channels[j])) { 21531 nla_nest_cancel(msg, nl_freqs); 21532 nla_nest_cancel(msg, nl_match); 21533 goto out; 21534 } 21535 } 21536 21537 nla_nest_end(msg, nl_freqs); 21538 } 21539 21540 nla_nest_end(msg, nl_match); 21541 } 21542 21543 out: 21544 nla_nest_end(msg, nl_results); 21545 return 0; 21546 } 21547 21548 void cfg80211_report_wowlan_wakeup(struct wireless_dev *wdev, 21549 struct cfg80211_wowlan_wakeup *wakeup, 21550 gfp_t gfp) 21551 { 21552 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 21553 struct sk_buff *msg; 21554 void *hdr; 21555 int size = 200; 21556 21557 trace_cfg80211_report_wowlan_wakeup(wdev->wiphy, wdev, wakeup); 21558 21559 if (wakeup) 21560 size += wakeup->packet_present_len; 21561 21562 msg = nlmsg_new(size, gfp); 21563 if (!msg) 21564 return; 21565 21566 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_SET_WOWLAN); 21567 if (!hdr) 21568 goto free_msg; 21569 21570 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 21571 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 21572 NL80211_ATTR_PAD)) 21573 goto free_msg; 21574 21575 if (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 21576 wdev->netdev->ifindex)) 21577 goto free_msg; 21578 21579 if (wakeup) { 21580 struct nlattr *reasons; 21581 21582 reasons = nla_nest_start_noflag(msg, 21583 NL80211_ATTR_WOWLAN_TRIGGERS); 21584 if (!reasons) 21585 goto free_msg; 21586 21587 if (wakeup->disconnect && 21588 nla_put_flag(msg, NL80211_WOWLAN_TRIG_DISCONNECT)) 21589 goto free_msg; 21590 if (wakeup->magic_pkt && 21591 nla_put_flag(msg, NL80211_WOWLAN_TRIG_MAGIC_PKT)) 21592 goto free_msg; 21593 if (wakeup->gtk_rekey_failure && 21594 nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE)) 21595 goto free_msg; 21596 if (wakeup->eap_identity_req && 21597 nla_put_flag(msg, NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST)) 21598 goto free_msg; 21599 if (wakeup->four_way_handshake && 21600 nla_put_flag(msg, NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE)) 21601 goto free_msg; 21602 if (wakeup->rfkill_release && 21603 nla_put_flag(msg, NL80211_WOWLAN_TRIG_RFKILL_RELEASE)) 21604 goto free_msg; 21605 21606 if (wakeup->pattern_idx >= 0 && 21607 nla_put_u32(msg, NL80211_WOWLAN_TRIG_PKT_PATTERN, 21608 wakeup->pattern_idx)) 21609 goto free_msg; 21610 21611 if (wakeup->tcp_match && 21612 nla_put_flag(msg, NL80211_WOWLAN_TRIG_WAKEUP_TCP_MATCH)) 21613 goto free_msg; 21614 21615 if (wakeup->tcp_connlost && 21616 nla_put_flag(msg, NL80211_WOWLAN_TRIG_WAKEUP_TCP_CONNLOST)) 21617 goto free_msg; 21618 21619 if (wakeup->tcp_nomoretokens && 21620 nla_put_flag(msg, 21621 NL80211_WOWLAN_TRIG_WAKEUP_TCP_NOMORETOKENS)) 21622 goto free_msg; 21623 21624 if (wakeup->unprot_deauth_disassoc && 21625 nla_put_flag(msg, 21626 NL80211_WOWLAN_TRIG_UNPROTECTED_DEAUTH_DISASSOC)) 21627 goto free_msg; 21628 21629 if (wakeup->packet) { 21630 u32 pkt_attr = NL80211_WOWLAN_TRIG_WAKEUP_PKT_80211; 21631 u32 len_attr = NL80211_WOWLAN_TRIG_WAKEUP_PKT_80211_LEN; 21632 21633 if (!wakeup->packet_80211) { 21634 pkt_attr = 21635 NL80211_WOWLAN_TRIG_WAKEUP_PKT_8023; 21636 len_attr = 21637 NL80211_WOWLAN_TRIG_WAKEUP_PKT_8023_LEN; 21638 } 21639 21640 if (wakeup->packet_len && 21641 nla_put_u32(msg, len_attr, wakeup->packet_len)) 21642 goto free_msg; 21643 21644 if (nla_put(msg, pkt_attr, wakeup->packet_present_len, 21645 wakeup->packet)) 21646 goto free_msg; 21647 } 21648 21649 if (wakeup->net_detect && 21650 cfg80211_net_detect_results(msg, wakeup)) 21651 goto free_msg; 21652 21653 nla_nest_end(msg, reasons); 21654 } 21655 21656 genlmsg_end(msg, hdr); 21657 21658 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21659 NL80211_MCGRP_MLME, gfp); 21660 return; 21661 21662 free_msg: 21663 nlmsg_free(msg); 21664 } 21665 EXPORT_SYMBOL(cfg80211_report_wowlan_wakeup); 21666 #endif 21667 21668 void cfg80211_tdls_oper_request(struct net_device *dev, const u8 *peer, 21669 enum nl80211_tdls_operation oper, 21670 u16 reason_code, gfp_t gfp) 21671 { 21672 struct wireless_dev *wdev = dev->ieee80211_ptr; 21673 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 21674 struct sk_buff *msg; 21675 void *hdr; 21676 21677 trace_cfg80211_tdls_oper_request(wdev->wiphy, dev, peer, oper, 21678 reason_code); 21679 21680 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 21681 if (!msg) 21682 return; 21683 21684 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_TDLS_OPER); 21685 if (!hdr) { 21686 nlmsg_free(msg); 21687 return; 21688 } 21689 21690 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 21691 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 21692 nla_put_u8(msg, NL80211_ATTR_TDLS_OPERATION, oper) || 21693 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, peer) || 21694 (reason_code > 0 && 21695 nla_put_u16(msg, NL80211_ATTR_REASON_CODE, reason_code))) 21696 goto nla_put_failure; 21697 21698 genlmsg_end(msg, hdr); 21699 21700 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21701 NL80211_MCGRP_MLME, gfp); 21702 return; 21703 21704 nla_put_failure: 21705 nlmsg_free(msg); 21706 } 21707 EXPORT_SYMBOL(cfg80211_tdls_oper_request); 21708 21709 static int nl80211_netlink_notify(struct notifier_block * nb, 21710 unsigned long state, 21711 void *_notify) 21712 { 21713 struct netlink_notify *notify = _notify; 21714 struct cfg80211_registered_device *rdev; 21715 struct wireless_dev *wdev; 21716 struct cfg80211_beacon_registration *reg, *tmp; 21717 21718 if (state != NETLINK_URELEASE || notify->protocol != NETLINK_GENERIC) 21719 return NOTIFY_DONE; 21720 21721 rcu_read_lock(); 21722 21723 list_for_each_entry_rcu(rdev, &cfg80211_rdev_list, list) { 21724 struct cfg80211_sched_scan_request *sched_scan_req; 21725 21726 list_for_each_entry_rcu(sched_scan_req, 21727 &rdev->sched_scan_req_list, 21728 list) { 21729 if (sched_scan_req->owner_nlportid == notify->portid) { 21730 sched_scan_req->nl_owner_dead = true; 21731 wiphy_work_queue(&rdev->wiphy, 21732 &rdev->sched_scan_stop_wk); 21733 } 21734 } 21735 21736 list_for_each_entry_rcu(wdev, &rdev->wiphy.wdev_list, list) { 21737 cfg80211_mlme_unregister_socket(wdev, notify->portid); 21738 21739 if (wdev->owner_nlportid == notify->portid) { 21740 wdev->nl_owner_dead = true; 21741 schedule_work(&rdev->destroy_work); 21742 } else if (wdev->conn_owner_nlportid == notify->portid) { 21743 schedule_work(&wdev->disconnect_wk); 21744 } 21745 21746 cfg80211_release_pmsr(wdev, notify->portid); 21747 } 21748 21749 spin_lock_bh(&rdev->beacon_registrations_lock); 21750 list_for_each_entry_safe(reg, tmp, &rdev->beacon_registrations, 21751 list) { 21752 if (reg->nlportid == notify->portid) { 21753 list_del(®->list); 21754 kfree(reg); 21755 break; 21756 } 21757 } 21758 spin_unlock_bh(&rdev->beacon_registrations_lock); 21759 } 21760 21761 rcu_read_unlock(); 21762 21763 /* 21764 * It is possible that the user space process that is controlling the 21765 * indoor setting disappeared, so notify the regulatory core. 21766 */ 21767 regulatory_netlink_notify(notify->portid); 21768 return NOTIFY_OK; 21769 } 21770 21771 static struct notifier_block nl80211_netlink_notifier = { 21772 .notifier_call = nl80211_netlink_notify, 21773 }; 21774 21775 void cfg80211_ft_event(struct net_device *netdev, 21776 struct cfg80211_ft_event_params *ft_event) 21777 { 21778 struct wiphy *wiphy = netdev->ieee80211_ptr->wiphy; 21779 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 21780 struct sk_buff *msg; 21781 void *hdr; 21782 21783 trace_cfg80211_ft_event(wiphy, netdev, ft_event); 21784 21785 if (!ft_event->target_ap) 21786 return; 21787 21788 msg = nlmsg_new(100 + ft_event->ies_len + ft_event->ric_ies_len, 21789 GFP_KERNEL); 21790 if (!msg) 21791 return; 21792 21793 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FT_EVENT); 21794 if (!hdr) 21795 goto out; 21796 21797 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 21798 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 21799 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, ft_event->target_ap)) 21800 goto out; 21801 21802 if (ft_event->ies && 21803 nla_put(msg, NL80211_ATTR_IE, ft_event->ies_len, ft_event->ies)) 21804 goto out; 21805 if (ft_event->ric_ies && 21806 nla_put(msg, NL80211_ATTR_IE_RIC, ft_event->ric_ies_len, 21807 ft_event->ric_ies)) 21808 goto out; 21809 21810 genlmsg_end(msg, hdr); 21811 21812 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21813 NL80211_MCGRP_MLME, GFP_KERNEL); 21814 return; 21815 out: 21816 nlmsg_free(msg); 21817 } 21818 EXPORT_SYMBOL(cfg80211_ft_event); 21819 21820 void cfg80211_crit_proto_stopped(struct wireless_dev *wdev, gfp_t gfp) 21821 { 21822 struct cfg80211_registered_device *rdev; 21823 struct sk_buff *msg; 21824 void *hdr; 21825 u32 nlportid; 21826 21827 rdev = wiphy_to_rdev(wdev->wiphy); 21828 if (!rdev->crit_proto_nlportid) 21829 return; 21830 21831 nlportid = rdev->crit_proto_nlportid; 21832 rdev->crit_proto_nlportid = 0; 21833 21834 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 21835 if (!msg) 21836 return; 21837 21838 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CRIT_PROTOCOL_STOP); 21839 if (!hdr) 21840 goto nla_put_failure; 21841 21842 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 21843 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 21844 NL80211_ATTR_PAD)) 21845 goto nla_put_failure; 21846 21847 genlmsg_end(msg, hdr); 21848 21849 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); 21850 return; 21851 21852 nla_put_failure: 21853 nlmsg_free(msg); 21854 } 21855 EXPORT_SYMBOL(cfg80211_crit_proto_stopped); 21856 21857 void nl80211_send_ap_stopped(struct wireless_dev *wdev, unsigned int link_id) 21858 { 21859 struct wiphy *wiphy = wdev->wiphy; 21860 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 21861 struct sk_buff *msg; 21862 void *hdr; 21863 21864 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 21865 if (!msg) 21866 return; 21867 21868 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_STOP_AP); 21869 if (!hdr) 21870 goto out; 21871 21872 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 21873 nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex) || 21874 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 21875 NL80211_ATTR_PAD) || 21876 (wdev->valid_links && 21877 nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link_id))) 21878 goto out; 21879 21880 genlmsg_end(msg, hdr); 21881 21882 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(wiphy), msg, 0, 21883 NL80211_MCGRP_MLME, GFP_KERNEL); 21884 return; 21885 out: 21886 nlmsg_free(msg); 21887 } 21888 21889 int cfg80211_external_auth_request(struct net_device *dev, 21890 struct cfg80211_external_auth_params *params, 21891 gfp_t gfp) 21892 { 21893 struct wireless_dev *wdev = dev->ieee80211_ptr; 21894 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 21895 struct sk_buff *msg; 21896 void *hdr; 21897 21898 if (!wdev->conn_owner_nlportid) 21899 return -EINVAL; 21900 21901 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 21902 if (!msg) 21903 return -ENOMEM; 21904 21905 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_EXTERNAL_AUTH); 21906 if (!hdr) 21907 goto nla_put_failure; 21908 21909 /* Some historical mistakes in drivers <-> userspace interface (notably 21910 * between drivers and wpa_supplicant) led to a big-endian conversion 21911 * being needed on NL80211_ATTR_AKM_SUITES _only_ when its value is 21912 * WLAN_AKM_SUITE_SAE. This is now fixed on userspace side, but for the 21913 * benefit of older wpa_supplicant versions, send this particular value 21914 * in big-endian. Note that newer wpa_supplicant will also detect this 21915 * particular value in big endian still, so it all continues to work. 21916 */ 21917 if (params->key_mgmt_suite == WLAN_AKM_SUITE_SAE) { 21918 if (nla_put_be32(msg, NL80211_ATTR_AKM_SUITES, 21919 cpu_to_be32(WLAN_AKM_SUITE_SAE))) 21920 goto nla_put_failure; 21921 } else { 21922 if (nla_put_u32(msg, NL80211_ATTR_AKM_SUITES, 21923 params->key_mgmt_suite)) 21924 goto nla_put_failure; 21925 } 21926 21927 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 21928 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 21929 nla_put_u32(msg, NL80211_ATTR_EXTERNAL_AUTH_ACTION, 21930 params->action) || 21931 nla_put(msg, NL80211_ATTR_BSSID, ETH_ALEN, params->bssid) || 21932 nla_put(msg, NL80211_ATTR_SSID, params->ssid.ssid_len, 21933 params->ssid.ssid) || 21934 (!is_zero_ether_addr(params->mld_addr) && 21935 nla_put(msg, NL80211_ATTR_MLD_ADDR, ETH_ALEN, params->mld_addr))) 21936 goto nla_put_failure; 21937 21938 genlmsg_end(msg, hdr); 21939 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, 21940 wdev->conn_owner_nlportid); 21941 return 0; 21942 21943 nla_put_failure: 21944 nlmsg_free(msg); 21945 return -ENOBUFS; 21946 } 21947 EXPORT_SYMBOL(cfg80211_external_auth_request); 21948 21949 void cfg80211_update_owe_info_event(struct net_device *netdev, 21950 struct cfg80211_update_owe_info *owe_info, 21951 gfp_t gfp) 21952 { 21953 struct wiphy *wiphy = netdev->ieee80211_ptr->wiphy; 21954 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 21955 struct sk_buff *msg; 21956 void *hdr; 21957 21958 trace_cfg80211_update_owe_info_event(wiphy, netdev, owe_info); 21959 21960 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 21961 if (!msg) 21962 return; 21963 21964 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_UPDATE_OWE_INFO); 21965 if (!hdr) 21966 goto nla_put_failure; 21967 21968 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 21969 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 21970 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, owe_info->peer)) 21971 goto nla_put_failure; 21972 21973 if (!owe_info->ie_len || 21974 nla_put(msg, NL80211_ATTR_IE, owe_info->ie_len, owe_info->ie)) 21975 goto nla_put_failure; 21976 21977 if (owe_info->assoc_link_id != -1) { 21978 if (nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, 21979 owe_info->assoc_link_id)) 21980 goto nla_put_failure; 21981 21982 if (!is_zero_ether_addr(owe_info->peer_mld_addr) && 21983 nla_put(msg, NL80211_ATTR_MLD_ADDR, ETH_ALEN, 21984 owe_info->peer_mld_addr)) 21985 goto nla_put_failure; 21986 } 21987 21988 genlmsg_end(msg, hdr); 21989 21990 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21991 NL80211_MCGRP_MLME, gfp); 21992 return; 21993 21994 nla_put_failure: 21995 genlmsg_cancel(msg, hdr); 21996 nlmsg_free(msg); 21997 } 21998 EXPORT_SYMBOL(cfg80211_update_owe_info_event); 21999 22000 void cfg80211_schedule_channels_check(struct wireless_dev *wdev) 22001 { 22002 struct wiphy *wiphy = wdev->wiphy; 22003 22004 /* Schedule channels check if NO_IR or DFS relaxations are supported */ 22005 if (wdev->iftype == NL80211_IFTYPE_STATION && 22006 (wiphy_ext_feature_isset(wiphy, 22007 NL80211_EXT_FEATURE_DFS_CONCURRENT) || 22008 (IS_ENABLED(CONFIG_CFG80211_REG_RELAX_NO_IR) && 22009 wiphy->regulatory_flags & REGULATORY_ENABLE_RELAX_NO_IR))) 22010 reg_check_channels(); 22011 } 22012 EXPORT_SYMBOL(cfg80211_schedule_channels_check); 22013 22014 void cfg80211_epcs_changed(struct net_device *netdev, bool enabled) 22015 { 22016 struct wireless_dev *wdev = netdev->ieee80211_ptr; 22017 struct wiphy *wiphy = wdev->wiphy; 22018 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 22019 struct sk_buff *msg; 22020 void *hdr; 22021 22022 trace_cfg80211_epcs_changed(wdev, enabled); 22023 22024 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 22025 if (!msg) 22026 return; 22027 22028 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_EPCS_CFG); 22029 if (!hdr) { 22030 nlmsg_free(msg); 22031 return; 22032 } 22033 22034 if (enabled && nla_put_flag(msg, NL80211_ATTR_EPCS)) 22035 goto nla_put_failure; 22036 22037 genlmsg_end(msg, hdr); 22038 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 22039 NL80211_MCGRP_MLME, GFP_KERNEL); 22040 return; 22041 22042 nla_put_failure: 22043 nlmsg_free(msg); 22044 } 22045 EXPORT_SYMBOL(cfg80211_epcs_changed); 22046 22047 void cfg80211_next_nan_dw_notif(struct wireless_dev *wdev, 22048 struct ieee80211_channel *chan, gfp_t gfp) 22049 { 22050 struct wiphy *wiphy = wdev->wiphy; 22051 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 22052 struct sk_buff *msg; 22053 void *hdr; 22054 22055 trace_cfg80211_next_nan_dw_notif(wdev, chan); 22056 22057 if (!wdev->owner_nlportid) 22058 return; 22059 22060 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 22061 if (!msg) 22062 return; 22063 22064 hdr = nl80211hdr_put(msg, 0, 0, 0, 22065 NL80211_CMD_NAN_NEXT_DW_NOTIFICATION); 22066 if (!hdr) 22067 goto nla_put_failure; 22068 22069 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 22070 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 22071 NL80211_ATTR_PAD) || 22072 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, chan->center_freq)) 22073 goto nla_put_failure; 22074 22075 genlmsg_end(msg, hdr); 22076 22077 genlmsg_unicast(wiphy_net(wiphy), msg, wdev->owner_nlportid); 22078 22079 return; 22080 22081 nla_put_failure: 22082 nlmsg_free(msg); 22083 } 22084 EXPORT_SYMBOL(cfg80211_next_nan_dw_notif); 22085 22086 void cfg80211_nan_cluster_joined(struct wireless_dev *wdev, 22087 const u8 *cluster_id, bool new_cluster, 22088 gfp_t gfp) 22089 { 22090 struct wiphy *wiphy = wdev->wiphy; 22091 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 22092 struct sk_buff *msg; 22093 void *hdr; 22094 22095 trace_cfg80211_nan_cluster_joined(wdev, cluster_id, new_cluster); 22096 22097 memcpy(wdev->u.nan.cluster_id, cluster_id, ETH_ALEN); 22098 22099 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 22100 if (!msg) 22101 return; 22102 22103 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NAN_CLUSTER_JOINED); 22104 if (!hdr) 22105 goto nla_put_failure; 22106 22107 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 22108 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 22109 NL80211_ATTR_PAD) || 22110 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, cluster_id) || 22111 (new_cluster && nla_put_flag(msg, NL80211_ATTR_NAN_NEW_CLUSTER))) 22112 goto nla_put_failure; 22113 22114 genlmsg_end(msg, hdr); 22115 22116 if (!wdev->owner_nlportid) 22117 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(wiphy), 22118 msg, 0, NL80211_MCGRP_NAN, gfp); 22119 else 22120 genlmsg_unicast(wiphy_net(wiphy), msg, 22121 wdev->owner_nlportid); 22122 return; 22123 22124 nla_put_failure: 22125 nlmsg_free(msg); 22126 } 22127 EXPORT_SYMBOL(cfg80211_nan_cluster_joined); 22128 22129 /* initialisation/exit functions */ 22130 22131 int __init nl80211_init(void) 22132 { 22133 int err; 22134 22135 err = genl_register_family(&nl80211_fam); 22136 if (err) 22137 return err; 22138 22139 err = netlink_register_notifier(&nl80211_netlink_notifier); 22140 if (err) 22141 goto err_out; 22142 22143 return 0; 22144 err_out: 22145 genl_unregister_family(&nl80211_fam); 22146 return err; 22147 } 22148 22149 void nl80211_exit(void) 22150 { 22151 netlink_unregister_notifier(&nl80211_netlink_notifier); 22152 genl_unregister_family(&nl80211_fam); 22153 } 22154