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_nan_avail_blob(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 u16 attr_len; 342 343 /* Need at least: Attr ID (1) + Length (2) */ 344 if (len < 3) { 345 NL_SET_ERR_MSG_FMT(extack, 346 "NAN Availability: Too short (need at least 3 bytes, have %u)", 347 len); 348 return -EINVAL; 349 } 350 351 if (data[0] != 0x12) { 352 NL_SET_ERR_MSG_FMT(extack, 353 "NAN Availability: Invalid Attribute ID 0x%02x (expected 0x12)", 354 data[0]); 355 return -EINVAL; 356 } 357 358 attr_len = get_unaligned_le16(&data[1]); 359 360 if (attr_len != len - 3) { 361 NL_SET_ERR_MSG_FMT(extack, 362 "NAN Availability: Length field (%u) doesn't match data length (%u)", 363 attr_len, len - 3); 364 return -EINVAL; 365 } 366 367 return 0; 368 } 369 370 static int validate_nan_ulw(const struct nlattr *attr, 371 struct netlink_ext_ack *extack) 372 { 373 const u8 *data = nla_data(attr); 374 unsigned int len = nla_len(attr); 375 unsigned int pos = 0; 376 377 while (pos < len) { 378 u16 attr_len; 379 380 /* Need at least: Attr ID (1) + Length (2) */ 381 if (pos + 3 > len) { 382 NL_SET_ERR_MSG_FMT(extack, 383 "ULW: Incomplete header (need 3 bytes, have %u)", 384 len - pos); 385 return -EINVAL; 386 } 387 388 if (data[pos] != 0x17) { 389 NL_SET_ERR_MSG_FMT(extack, 390 "ULW: Invalid Attribute ID 0x%02x (expected 0x17)", 391 data[pos]); 392 return -EINVAL; 393 } 394 pos++; 395 396 /* Length is in little-endian format */ 397 attr_len = get_unaligned_le16(&data[pos]); 398 pos += 2; 399 400 /* 401 * Check if length is one of the valid values: 16 (no 402 * channel/band entry included), 18 (band entry included), 403 * 21 (channel entry included without Auxiliary channel bitmap), 404 * or 23 (channel entry included with Auxiliary channel bitmap). 405 */ 406 if (attr_len != 16 && attr_len != 18 && attr_len != 21 && 407 attr_len != 23) { 408 NL_SET_ERR_MSG_FMT(extack, 409 "ULW: Invalid length %u (must be 16, 18, 21, or 23)", 410 attr_len); 411 return -EINVAL; 412 } 413 414 if (pos + attr_len > len) { 415 NL_SET_ERR_MSG_FMT(extack, 416 "ULW: Length field (%u) exceeds remaining data (%u)", 417 attr_len, len - pos); 418 return -EINVAL; 419 } 420 421 pos += attr_len; 422 } 423 424 return 0; 425 } 426 427 static int validate_uhr_capa(const struct nlattr *attr, 428 struct netlink_ext_ack *extack) 429 { 430 const u8 *data = nla_data(attr); 431 unsigned int len = nla_len(attr); 432 433 if (!ieee80211_uhr_capa_size_ok(data, len, false)) 434 return -EINVAL; 435 return 0; 436 } 437 438 static int validate_uhr_operation(const struct nlattr *attr, 439 struct netlink_ext_ack *extack) 440 { 441 const u8 *data = nla_data(attr); 442 unsigned int len = nla_len(attr); 443 444 if (!ieee80211_uhr_oper_size_ok(data, len)) 445 return -EINVAL; 446 return 0; 447 } 448 449 /* policy for the attributes */ 450 static const struct nla_policy nl80211_policy[NUM_NL80211_ATTR]; 451 452 static const struct nla_policy 453 nl80211_ftm_responder_policy[NL80211_FTM_RESP_ATTR_MAX + 1] = { 454 [NL80211_FTM_RESP_ATTR_ENABLED] = { .type = NLA_FLAG, }, 455 [NL80211_FTM_RESP_ATTR_LCI] = { .type = NLA_BINARY, 456 .len = U8_MAX }, 457 [NL80211_FTM_RESP_ATTR_CIVICLOC] = { .type = NLA_BINARY, 458 .len = U8_MAX }, 459 }; 460 461 static const struct nla_policy 462 nl80211_pmsr_ftm_req_attr_policy[NL80211_PMSR_FTM_REQ_ATTR_MAX + 1] = { 463 [NL80211_PMSR_FTM_REQ_ATTR_ASAP] = { .type = NLA_FLAG }, 464 [NL80211_PMSR_FTM_REQ_ATTR_PREAMBLE] = 465 NLA_POLICY_RANGE(NLA_U32, NL80211_PREAMBLE_LEGACY, 466 NL80211_PREAMBLE_HE), 467 [NL80211_PMSR_FTM_REQ_ATTR_NUM_BURSTS_EXP] = 468 NLA_POLICY_MAX(NLA_U8, 15), 469 [NL80211_PMSR_FTM_REQ_ATTR_BURST_PERIOD] = { .type = NLA_U16 }, 470 [NL80211_PMSR_FTM_REQ_ATTR_BURST_DURATION] = 471 NLA_POLICY_MAX(NLA_U8, 15), 472 [NL80211_PMSR_FTM_REQ_ATTR_FTMS_PER_BURST] = { .type = NLA_U8 }, 473 [NL80211_PMSR_FTM_REQ_ATTR_NUM_FTMR_RETRIES] = { .type = NLA_U8 }, 474 [NL80211_PMSR_FTM_REQ_ATTR_REQUEST_LCI] = { .type = NLA_FLAG }, 475 [NL80211_PMSR_FTM_REQ_ATTR_REQUEST_CIVICLOC] = { .type = NLA_FLAG }, 476 [NL80211_PMSR_FTM_REQ_ATTR_TRIGGER_BASED] = { .type = NLA_FLAG }, 477 [NL80211_PMSR_FTM_REQ_ATTR_NON_TRIGGER_BASED] = { .type = NLA_FLAG }, 478 [NL80211_PMSR_FTM_REQ_ATTR_LMR_FEEDBACK] = { .type = NLA_FLAG }, 479 [NL80211_PMSR_FTM_REQ_ATTR_BSS_COLOR] = { .type = NLA_U8 }, 480 [NL80211_PMSR_FTM_REQ_ATTR_RSTA] = { .type = NLA_FLAG }, 481 [NL80211_PMSR_FTM_REQ_ATTR_MIN_TIME_BETWEEN_MEASUREMENTS] = { 482 .type = NLA_U32 483 }, 484 [NL80211_PMSR_FTM_REQ_ATTR_MAX_TIME_BETWEEN_MEASUREMENTS] = { 485 .type = NLA_U32 486 }, 487 [NL80211_PMSR_FTM_REQ_ATTR_NOMINAL_TIME] = { .type = NLA_U32 }, 488 [NL80211_PMSR_FTM_REQ_ATTR_AW_DURATION] = NLA_POLICY_MAX(NLA_U32, 255), 489 [NL80211_PMSR_FTM_REQ_ATTR_NUM_MEASUREMENTS] = { .type = NLA_U32 }, 490 [NL80211_PMSR_FTM_REQ_ATTR_INGRESS] = { .type = NLA_U64 }, 491 [NL80211_PMSR_FTM_REQ_ATTR_EGRESS] = { .type = NLA_U64 }, 492 [NL80211_PMSR_FTM_REQ_ATTR_PD_SUPPRESS_RESULTS] = { .type = NLA_FLAG }, 493 }; 494 495 static const struct nla_policy 496 nl80211_pmsr_req_data_policy[NL80211_PMSR_TYPE_MAX + 1] = { 497 [NL80211_PMSR_TYPE_FTM] = 498 NLA_POLICY_NESTED(nl80211_pmsr_ftm_req_attr_policy), 499 }; 500 501 static const struct nla_policy 502 nl80211_pmsr_req_attr_policy[NL80211_PMSR_REQ_ATTR_MAX + 1] = { 503 [NL80211_PMSR_REQ_ATTR_DATA] = 504 NLA_POLICY_NESTED(nl80211_pmsr_req_data_policy), 505 [NL80211_PMSR_REQ_ATTR_GET_AP_TSF] = { .type = NLA_FLAG }, 506 }; 507 508 static const struct nla_policy 509 nl80211_pmsr_peer_attr_policy[NL80211_PMSR_PEER_ATTR_MAX + 1] = { 510 [NL80211_PMSR_PEER_ATTR_ADDR] = NLA_POLICY_ETH_ADDR, 511 [NL80211_PMSR_PEER_ATTR_CHAN] = NLA_POLICY_NESTED(nl80211_policy), 512 [NL80211_PMSR_PEER_ATTR_REQ] = 513 NLA_POLICY_NESTED(nl80211_pmsr_req_attr_policy), 514 [NL80211_PMSR_PEER_ATTR_RESP] = { .type = NLA_REJECT }, 515 [NL80211_PMSR_PEER_ATTR_REQ_TYPE] = 516 NLA_POLICY_MAX(NLA_U32, NL80211_PMSR_FTM_REQ_TYPE_MAX), 517 }; 518 519 static const struct nla_policy 520 nl80211_pmsr_attr_policy[NL80211_PMSR_ATTR_MAX + 1] = { 521 [NL80211_PMSR_ATTR_MAX_PEERS] = { .type = NLA_REJECT }, 522 [NL80211_PMSR_ATTR_REPORT_AP_TSF] = { .type = NLA_REJECT }, 523 [NL80211_PMSR_ATTR_RANDOMIZE_MAC_ADDR] = { .type = NLA_REJECT }, 524 [NL80211_PMSR_ATTR_TYPE_CAPA] = { .type = NLA_REJECT }, 525 [NL80211_PMSR_ATTR_PEERS] = 526 NLA_POLICY_NESTED_ARRAY(nl80211_pmsr_peer_attr_policy), 527 }; 528 529 static const struct nla_policy 530 he_obss_pd_policy[NL80211_HE_OBSS_PD_ATTR_MAX + 1] = { 531 [NL80211_HE_OBSS_PD_ATTR_MIN_OFFSET] = 532 NLA_POLICY_RANGE(NLA_U8, 1, 20), 533 [NL80211_HE_OBSS_PD_ATTR_MAX_OFFSET] = 534 NLA_POLICY_RANGE(NLA_U8, 1, 20), 535 [NL80211_HE_OBSS_PD_ATTR_NON_SRG_MAX_OFFSET] = 536 NLA_POLICY_RANGE(NLA_U8, 1, 20), 537 [NL80211_HE_OBSS_PD_ATTR_BSS_COLOR_BITMAP] = 538 NLA_POLICY_EXACT_LEN(8), 539 [NL80211_HE_OBSS_PD_ATTR_PARTIAL_BSSID_BITMAP] = 540 NLA_POLICY_EXACT_LEN(8), 541 [NL80211_HE_OBSS_PD_ATTR_SR_CTRL] = { .type = NLA_U8 }, 542 }; 543 544 static const struct nla_policy 545 he_bss_color_policy[NL80211_HE_BSS_COLOR_ATTR_MAX + 1] = { 546 [NL80211_HE_BSS_COLOR_ATTR_COLOR] = NLA_POLICY_RANGE(NLA_U8, 1, 63), 547 [NL80211_HE_BSS_COLOR_ATTR_DISABLED] = { .type = NLA_FLAG }, 548 [NL80211_HE_BSS_COLOR_ATTR_PARTIAL] = { .type = NLA_FLAG }, 549 }; 550 551 static const struct nla_policy nl80211_txattr_policy[NL80211_TXRATE_MAX + 1] = { 552 [NL80211_TXRATE_LEGACY] = { .type = NLA_BINARY, 553 .len = NL80211_MAX_SUPP_RATES }, 554 [NL80211_TXRATE_HT] = { .type = NLA_BINARY, 555 .len = NL80211_MAX_SUPP_HT_RATES }, 556 [NL80211_TXRATE_VHT] = NLA_POLICY_EXACT_LEN_WARN(sizeof(struct nl80211_txrate_vht)), 557 [NL80211_TXRATE_GI] = { .type = NLA_U8 }, 558 [NL80211_TXRATE_HE] = NLA_POLICY_EXACT_LEN(sizeof(struct nl80211_txrate_he)), 559 [NL80211_TXRATE_HE_GI] = NLA_POLICY_RANGE(NLA_U8, 560 NL80211_RATE_INFO_HE_GI_0_8, 561 NL80211_RATE_INFO_HE_GI_3_2), 562 [NL80211_TXRATE_HE_LTF] = NLA_POLICY_RANGE(NLA_U8, 563 NL80211_RATE_INFO_HE_1XLTF, 564 NL80211_RATE_INFO_HE_4XLTF), 565 [NL80211_TXRATE_EHT] = NLA_POLICY_EXACT_LEN(sizeof(struct nl80211_txrate_eht)), 566 [NL80211_TXRATE_EHT_GI] = NLA_POLICY_RANGE(NLA_U8, 567 NL80211_RATE_INFO_EHT_GI_0_8, 568 NL80211_RATE_INFO_EHT_GI_3_2), 569 [NL80211_TXRATE_EHT_LTF] = NLA_POLICY_RANGE(NLA_U8, 570 NL80211_RATE_INFO_EHT_1XLTF, 571 NL80211_RATE_INFO_EHT_8XLTF), 572 573 }; 574 575 static const struct nla_policy 576 nl80211_tid_config_attr_policy[NL80211_TID_CONFIG_ATTR_MAX + 1] = { 577 [NL80211_TID_CONFIG_ATTR_VIF_SUPP] = { .type = NLA_U64 }, 578 [NL80211_TID_CONFIG_ATTR_PEER_SUPP] = { .type = NLA_U64 }, 579 [NL80211_TID_CONFIG_ATTR_OVERRIDE] = { .type = NLA_FLAG }, 580 [NL80211_TID_CONFIG_ATTR_TIDS] = NLA_POLICY_RANGE(NLA_U16, 1, 0xff), 581 [NL80211_TID_CONFIG_ATTR_NOACK] = 582 NLA_POLICY_MAX(NLA_U8, NL80211_TID_CONFIG_DISABLE), 583 [NL80211_TID_CONFIG_ATTR_RETRY_SHORT] = NLA_POLICY_MIN(NLA_U8, 1), 584 [NL80211_TID_CONFIG_ATTR_RETRY_LONG] = NLA_POLICY_MIN(NLA_U8, 1), 585 [NL80211_TID_CONFIG_ATTR_AMPDU_CTRL] = 586 NLA_POLICY_MAX(NLA_U8, NL80211_TID_CONFIG_DISABLE), 587 [NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL] = 588 NLA_POLICY_MAX(NLA_U8, NL80211_TID_CONFIG_DISABLE), 589 [NL80211_TID_CONFIG_ATTR_AMSDU_CTRL] = 590 NLA_POLICY_MAX(NLA_U8, NL80211_TID_CONFIG_DISABLE), 591 [NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE] = 592 NLA_POLICY_MAX(NLA_U8, NL80211_TX_RATE_FIXED), 593 [NL80211_TID_CONFIG_ATTR_TX_RATE] = 594 NLA_POLICY_NESTED(nl80211_txattr_policy), 595 }; 596 597 static const struct nla_policy 598 nl80211_fils_discovery_policy[NL80211_FILS_DISCOVERY_ATTR_MAX + 1] = { 599 [NL80211_FILS_DISCOVERY_ATTR_INT_MIN] = NLA_POLICY_MAX(NLA_U32, 10000), 600 [NL80211_FILS_DISCOVERY_ATTR_INT_MAX] = NLA_POLICY_MAX(NLA_U32, 10000), 601 [NL80211_FILS_DISCOVERY_ATTR_TMPL] = 602 NLA_POLICY_RANGE(NLA_BINARY, 603 NL80211_FILS_DISCOVERY_TMPL_MIN_LEN, 604 IEEE80211_MAX_DATA_LEN), 605 }; 606 607 static const struct nla_policy 608 nl80211_unsol_bcast_probe_resp_policy[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_MAX + 1] = { 609 [NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_INT] = NLA_POLICY_MAX(NLA_U32, 20), 610 [NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_TMPL] = { .type = NLA_BINARY, 611 .len = IEEE80211_MAX_DATA_LEN } 612 }; 613 614 static const struct nla_policy 615 sar_specs_policy[NL80211_SAR_ATTR_SPECS_MAX + 1] = { 616 [NL80211_SAR_ATTR_SPECS_POWER] = { .type = NLA_S32 }, 617 [NL80211_SAR_ATTR_SPECS_RANGE_INDEX] = {.type = NLA_U32 }, 618 }; 619 620 static const struct nla_policy 621 sar_policy[NL80211_SAR_ATTR_MAX + 1] = { 622 [NL80211_SAR_ATTR_TYPE] = NLA_POLICY_MAX(NLA_U32, NUM_NL80211_SAR_TYPE), 623 [NL80211_SAR_ATTR_SPECS] = NLA_POLICY_NESTED_ARRAY(sar_specs_policy), 624 }; 625 626 static const struct nla_policy 627 nl80211_mbssid_config_policy[NL80211_MBSSID_CONFIG_ATTR_MAX + 1] = { 628 [NL80211_MBSSID_CONFIG_ATTR_MAX_INTERFACES] = NLA_POLICY_MIN(NLA_U8, 2), 629 [NL80211_MBSSID_CONFIG_ATTR_MAX_EMA_PROFILE_PERIODICITY] = 630 NLA_POLICY_MIN(NLA_U8, 1), 631 [NL80211_MBSSID_CONFIG_ATTR_INDEX] = { .type = NLA_U8 }, 632 [NL80211_MBSSID_CONFIG_ATTR_TX_IFINDEX] = { .type = NLA_U32 }, 633 [NL80211_MBSSID_CONFIG_ATTR_EMA] = { .type = NLA_FLAG }, 634 [NL80211_MBSSID_CONFIG_ATTR_TX_LINK_ID] = 635 NLA_POLICY_RANGE(NLA_U8, 0, IEEE80211_MLD_MAX_NUM_LINKS - 1), 636 }; 637 638 static const struct nla_policy 639 nl80211_sta_wme_policy[NL80211_STA_WME_MAX + 1] = { 640 [NL80211_STA_WME_UAPSD_QUEUES] = { .type = NLA_U8 }, 641 [NL80211_STA_WME_MAX_SP] = { .type = NLA_U8 }, 642 }; 643 644 static const struct nla_policy 645 nl80211_s1g_short_beacon[NL80211_S1G_SHORT_BEACON_ATTR_MAX + 1] = { 646 [NL80211_S1G_SHORT_BEACON_ATTR_HEAD] = 647 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_beacon_head, 648 IEEE80211_MAX_DATA_LEN), 649 [NL80211_S1G_SHORT_BEACON_ATTR_TAIL] = 650 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_ie_attr, 651 IEEE80211_MAX_DATA_LEN), 652 }; 653 654 static const struct nla_policy 655 nl80211_nan_band_conf_policy[NL80211_NAN_BAND_CONF_ATTR_MAX + 1] = { 656 [NL80211_NAN_BAND_CONF_BAND] = NLA_POLICY_MAX(NLA_U8, 657 NUM_NL80211_BANDS - 1), 658 [NL80211_NAN_BAND_CONF_FREQ] = { .type = NLA_U16 }, 659 [NL80211_NAN_BAND_CONF_RSSI_CLOSE] = NLA_POLICY_MIN(NLA_S8, -59), 660 [NL80211_NAN_BAND_CONF_RSSI_MIDDLE] = NLA_POLICY_MIN(NLA_S8, -74), 661 [NL80211_NAN_BAND_CONF_WAKE_DW] = NLA_POLICY_MAX(NLA_U8, 5), 662 [NL80211_NAN_BAND_CONF_DISABLE_SCAN] = { .type = NLA_FLAG }, 663 }; 664 665 static const struct nla_policy 666 nl80211_nan_peer_map_policy[NL80211_NAN_PEER_MAP_ATTR_MAX + 1] = { 667 [NL80211_NAN_PEER_MAP_ATTR_MAP_ID] = NLA_POLICY_MAX(NLA_U8, 15), 668 [NL80211_NAN_PEER_MAP_ATTR_TIME_SLOTS] = 669 NLA_POLICY_EXACT_LEN(CFG80211_NAN_SCHED_NUM_TIME_SLOTS), 670 }; 671 672 static const struct nla_policy 673 nl80211_nan_conf_policy[NL80211_NAN_CONF_ATTR_MAX + 1] = { 674 [NL80211_NAN_CONF_CLUSTER_ID] = 675 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_nan_cluster_id, 676 ETH_ALEN), 677 [NL80211_NAN_CONF_EXTRA_ATTRS] = { .type = NLA_BINARY, 678 .len = IEEE80211_MAX_DATA_LEN}, 679 [NL80211_NAN_CONF_VENDOR_ELEMS] = 680 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_ie_attr, 681 IEEE80211_MAX_DATA_LEN), 682 [NL80211_NAN_CONF_BAND_CONFIGS] = 683 NLA_POLICY_NESTED_ARRAY(nl80211_nan_band_conf_policy), 684 [NL80211_NAN_CONF_SCAN_PERIOD] = { .type = NLA_U16 }, 685 [NL80211_NAN_CONF_SCAN_DWELL_TIME] = NLA_POLICY_RANGE(NLA_U16, 50, 512), 686 [NL80211_NAN_CONF_DISCOVERY_BEACON_INTERVAL] = 687 NLA_POLICY_RANGE(NLA_U8, 50, 200), 688 [NL80211_NAN_CONF_NOTIFY_DW] = { .type = NLA_FLAG }, 689 }; 690 691 static const struct netlink_range_validation nl80211_punct_bitmap_range = { 692 .min = 0, 693 .max = 0xffff, 694 }; 695 696 static const struct netlink_range_validation q_range = { 697 .max = INT_MAX, 698 }; 699 700 static const struct nla_policy nl80211_policy[NUM_NL80211_ATTR] = { 701 [0] = { .strict_start_type = NL80211_ATTR_HE_OBSS_PD }, 702 [NL80211_ATTR_WIPHY] = { .type = NLA_U32 }, 703 [NL80211_ATTR_WIPHY_NAME] = { .type = NLA_NUL_STRING, 704 .len = 20-1 }, 705 [NL80211_ATTR_WIPHY_TXQ_PARAMS] = { .type = NLA_NESTED }, 706 707 [NL80211_ATTR_WIPHY_FREQ] = { .type = NLA_U32 }, 708 [NL80211_ATTR_WIPHY_CHANNEL_TYPE] = { .type = NLA_U32 }, 709 [NL80211_ATTR_WIPHY_EDMG_CHANNELS] = NLA_POLICY_RANGE(NLA_U8, 710 NL80211_EDMG_CHANNELS_MIN, 711 NL80211_EDMG_CHANNELS_MAX), 712 [NL80211_ATTR_WIPHY_EDMG_BW_CONFIG] = NLA_POLICY_RANGE(NLA_U8, 713 NL80211_EDMG_BW_CONFIG_MIN, 714 NL80211_EDMG_BW_CONFIG_MAX), 715 716 [NL80211_ATTR_CHANNEL_WIDTH] = { .type = NLA_U32 }, 717 [NL80211_ATTR_CENTER_FREQ1] = { .type = NLA_U32 }, 718 [NL80211_ATTR_CENTER_FREQ1_OFFSET] = NLA_POLICY_RANGE(NLA_U32, 0, 999), 719 [NL80211_ATTR_CENTER_FREQ2] = { .type = NLA_U32 }, 720 721 [NL80211_ATTR_WIPHY_RETRY_SHORT] = NLA_POLICY_MIN(NLA_U8, 1), 722 [NL80211_ATTR_WIPHY_RETRY_LONG] = NLA_POLICY_MIN(NLA_U8, 1), 723 [NL80211_ATTR_WIPHY_FRAG_THRESHOLD] = { .type = NLA_U32 }, 724 [NL80211_ATTR_WIPHY_RTS_THRESHOLD] = { .type = NLA_U32 }, 725 [NL80211_ATTR_WIPHY_COVERAGE_CLASS] = { .type = NLA_U8 }, 726 [NL80211_ATTR_WIPHY_DYN_ACK] = { .type = NLA_FLAG }, 727 728 [NL80211_ATTR_IFTYPE] = NLA_POLICY_MAX(NLA_U32, NL80211_IFTYPE_MAX), 729 [NL80211_ATTR_IFINDEX] = { .type = NLA_U32 }, 730 [NL80211_ATTR_IFNAME] = { .type = NLA_NUL_STRING, .len = IFNAMSIZ-1 }, 731 732 [NL80211_ATTR_MAC] = NLA_POLICY_EXACT_LEN_WARN(ETH_ALEN), 733 [NL80211_ATTR_PREV_BSSID] = NLA_POLICY_EXACT_LEN_WARN(ETH_ALEN), 734 735 [NL80211_ATTR_KEY] = { .type = NLA_NESTED, }, 736 [NL80211_ATTR_KEY_DATA] = { .type = NLA_BINARY, 737 .len = WLAN_MAX_KEY_LEN }, 738 [NL80211_ATTR_KEY_IDX] = NLA_POLICY_MAX(NLA_U8, 7), 739 [NL80211_ATTR_KEY_CIPHER] = { .type = NLA_U32 }, 740 [NL80211_ATTR_KEY_DEFAULT] = { .type = NLA_FLAG }, 741 [NL80211_ATTR_KEY_SEQ] = { .type = NLA_BINARY, .len = 16 }, 742 [NL80211_ATTR_KEY_TYPE] = 743 NLA_POLICY_MAX(NLA_U32, NUM_NL80211_KEYTYPES), 744 745 [NL80211_ATTR_BEACON_INTERVAL] = { .type = NLA_U32 }, 746 [NL80211_ATTR_DTIM_PERIOD] = { .type = NLA_U32 }, 747 [NL80211_ATTR_BEACON_HEAD] = 748 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_beacon_head, 749 IEEE80211_MAX_DATA_LEN), 750 [NL80211_ATTR_BEACON_TAIL] = 751 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_ie_attr, 752 IEEE80211_MAX_DATA_LEN), 753 [NL80211_ATTR_STA_AID] = 754 NLA_POLICY_RANGE(NLA_U16, 1, IEEE80211_MAX_AID), 755 [NL80211_ATTR_STA_FLAGS] = { .type = NLA_NESTED }, 756 [NL80211_ATTR_STA_LISTEN_INTERVAL] = { .type = NLA_U16 }, 757 [NL80211_ATTR_STA_SUPPORTED_RATES] = { .type = NLA_BINARY, 758 .len = NL80211_MAX_SUPP_RATES }, 759 [NL80211_ATTR_STA_PLINK_ACTION] = 760 NLA_POLICY_MAX(NLA_U8, NUM_NL80211_PLINK_ACTIONS - 1), 761 [NL80211_ATTR_STA_TX_POWER_SETTING] = 762 NLA_POLICY_RANGE(NLA_U8, 763 NL80211_TX_POWER_AUTOMATIC, 764 NL80211_TX_POWER_FIXED), 765 [NL80211_ATTR_STA_TX_POWER] = { .type = NLA_S16 }, 766 [NL80211_ATTR_STA_VLAN] = { .type = NLA_U32 }, 767 [NL80211_ATTR_MNTR_FLAGS] = { /* NLA_NESTED can't be empty */ }, 768 [NL80211_ATTR_MESH_ID] = { .type = NLA_BINARY, 769 .len = IEEE80211_MAX_MESH_ID_LEN }, 770 [NL80211_ATTR_MPATH_NEXT_HOP] = NLA_POLICY_ETH_ADDR_COMPAT, 771 772 /* allow 3 for NUL-termination, we used to declare this NLA_STRING */ 773 [NL80211_ATTR_REG_ALPHA2] = NLA_POLICY_RANGE(NLA_BINARY, 2, 3), 774 [NL80211_ATTR_REG_RULES] = { .type = NLA_NESTED }, 775 776 [NL80211_ATTR_BSS_CTS_PROT] = { .type = NLA_U8 }, 777 [NL80211_ATTR_BSS_SHORT_PREAMBLE] = { .type = NLA_U8 }, 778 [NL80211_ATTR_BSS_SHORT_SLOT_TIME] = { .type = NLA_U8 }, 779 [NL80211_ATTR_BSS_BASIC_RATES] = { .type = NLA_BINARY, 780 .len = NL80211_MAX_SUPP_RATES }, 781 [NL80211_ATTR_BSS_HT_OPMODE] = { .type = NLA_U16 }, 782 783 [NL80211_ATTR_MESH_CONFIG] = { .type = NLA_NESTED }, 784 [NL80211_ATTR_SUPPORT_MESH_AUTH] = { .type = NLA_FLAG }, 785 786 [NL80211_ATTR_HT_CAPABILITY] = NLA_POLICY_EXACT_LEN_WARN(NL80211_HT_CAPABILITY_LEN), 787 788 [NL80211_ATTR_MGMT_SUBTYPE] = { .type = NLA_U8 }, 789 [NL80211_ATTR_IE] = NLA_POLICY_VALIDATE_FN(NLA_BINARY, 790 validate_ie_attr, 791 IEEE80211_MAX_DATA_LEN), 792 [NL80211_ATTR_SCAN_FREQUENCIES] = { .type = NLA_NESTED }, 793 [NL80211_ATTR_SCAN_SSIDS] = { .type = NLA_NESTED }, 794 795 [NL80211_ATTR_SSID] = { .type = NLA_BINARY, 796 .len = IEEE80211_MAX_SSID_LEN }, 797 [NL80211_ATTR_AUTH_TYPE] = { .type = NLA_U32 }, 798 [NL80211_ATTR_REASON_CODE] = { .type = NLA_U16 }, 799 [NL80211_ATTR_FREQ_FIXED] = { .type = NLA_FLAG }, 800 [NL80211_ATTR_TIMED_OUT] = { .type = NLA_FLAG }, 801 [NL80211_ATTR_USE_MFP] = NLA_POLICY_RANGE(NLA_U32, 802 NL80211_MFP_NO, 803 NL80211_MFP_OPTIONAL), 804 [NL80211_ATTR_STA_FLAGS2] = 805 NLA_POLICY_EXACT_LEN_WARN(sizeof(struct nl80211_sta_flag_update)), 806 [NL80211_ATTR_CONTROL_PORT] = { .type = NLA_FLAG }, 807 [NL80211_ATTR_CONTROL_PORT_ETHERTYPE] = { .type = NLA_U16 }, 808 [NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT] = { .type = NLA_FLAG }, 809 [NL80211_ATTR_CONTROL_PORT_OVER_NL80211] = { .type = NLA_FLAG }, 810 [NL80211_ATTR_PRIVACY] = { .type = NLA_FLAG }, 811 [NL80211_ATTR_STATUS_CODE] = { .type = NLA_U16 }, 812 [NL80211_ATTR_CIPHER_SUITE_GROUP] = { .type = NLA_U32 }, 813 [NL80211_ATTR_WPA_VERSIONS] = 814 NLA_POLICY_RANGE(NLA_U32, 0, 815 NL80211_WPA_VERSION_1 | 816 NL80211_WPA_VERSION_2 | 817 NL80211_WPA_VERSION_3), 818 [NL80211_ATTR_PID] = { .type = NLA_U32 }, 819 [NL80211_ATTR_4ADDR] = { .type = NLA_U8 }, 820 [NL80211_ATTR_PMKID] = NLA_POLICY_EXACT_LEN_WARN(WLAN_PMKID_LEN), 821 [NL80211_ATTR_DURATION] = { .type = NLA_U32 }, 822 [NL80211_ATTR_COOKIE] = { .type = NLA_U64 }, 823 [NL80211_ATTR_TX_RATES] = { .type = NLA_NESTED }, 824 [NL80211_ATTR_FRAME] = { .type = NLA_BINARY, 825 .len = IEEE80211_MAX_DATA_LEN }, 826 [NL80211_ATTR_FRAME_MATCH] = { .type = NLA_BINARY, }, 827 [NL80211_ATTR_PS_STATE] = NLA_POLICY_RANGE(NLA_U32, 828 NL80211_PS_DISABLED, 829 NL80211_PS_ENABLED), 830 [NL80211_ATTR_CQM] = { .type = NLA_NESTED, }, 831 [NL80211_ATTR_LOCAL_STATE_CHANGE] = { .type = NLA_FLAG }, 832 [NL80211_ATTR_AP_ISOLATE] = { .type = NLA_U8 }, 833 [NL80211_ATTR_WIPHY_TX_POWER_SETTING] = { .type = NLA_U32 }, 834 [NL80211_ATTR_WIPHY_TX_POWER_LEVEL] = { .type = NLA_U32 }, 835 [NL80211_ATTR_FRAME_TYPE] = { .type = NLA_U16 }, 836 [NL80211_ATTR_WIPHY_ANTENNA_TX] = { .type = NLA_U32 }, 837 [NL80211_ATTR_WIPHY_ANTENNA_RX] = { .type = NLA_U32 }, 838 [NL80211_ATTR_MCAST_RATE] = { .type = NLA_U32 }, 839 [NL80211_ATTR_OFFCHANNEL_TX_OK] = { .type = NLA_FLAG }, 840 [NL80211_ATTR_KEY_DEFAULT_TYPES] = { .type = NLA_NESTED }, 841 [NL80211_ATTR_WOWLAN_TRIGGERS] = { .type = NLA_NESTED }, 842 [NL80211_ATTR_STA_PLINK_STATE] = 843 NLA_POLICY_MAX(NLA_U8, NUM_NL80211_PLINK_STATES - 1), 844 [NL80211_ATTR_MEASUREMENT_DURATION] = { .type = NLA_U16 }, 845 [NL80211_ATTR_MEASUREMENT_DURATION_MANDATORY] = { .type = NLA_FLAG }, 846 [NL80211_ATTR_MESH_PEER_AID] = 847 NLA_POLICY_RANGE(NLA_U16, 1, IEEE80211_MAX_AID), 848 [NL80211_ATTR_SCHED_SCAN_INTERVAL] = { .type = NLA_U32 }, 849 [NL80211_ATTR_REKEY_DATA] = { .type = NLA_NESTED }, 850 [NL80211_ATTR_SCAN_SUPP_RATES] = { .type = NLA_NESTED }, 851 [NL80211_ATTR_HIDDEN_SSID] = 852 NLA_POLICY_RANGE(NLA_U32, 853 NL80211_HIDDEN_SSID_NOT_IN_USE, 854 NL80211_HIDDEN_SSID_ZERO_CONTENTS), 855 [NL80211_ATTR_IE_PROBE_RESP] = 856 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_ie_attr, 857 IEEE80211_MAX_DATA_LEN), 858 [NL80211_ATTR_IE_ASSOC_RESP] = 859 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_ie_attr, 860 IEEE80211_MAX_DATA_LEN), 861 [NL80211_ATTR_ROAM_SUPPORT] = { .type = NLA_FLAG }, 862 [NL80211_ATTR_STA_WME] = NLA_POLICY_NESTED(nl80211_sta_wme_policy), 863 [NL80211_ATTR_SCHED_SCAN_MATCH] = { .type = NLA_NESTED }, 864 [NL80211_ATTR_TX_NO_CCK_RATE] = { .type = NLA_FLAG }, 865 [NL80211_ATTR_TDLS_ACTION] = { .type = NLA_U8 }, 866 [NL80211_ATTR_TDLS_DIALOG_TOKEN] = { .type = NLA_U8 }, 867 [NL80211_ATTR_TDLS_OPERATION] = { .type = NLA_U8 }, 868 [NL80211_ATTR_TDLS_SUPPORT] = { .type = NLA_FLAG }, 869 [NL80211_ATTR_TDLS_EXTERNAL_SETUP] = { .type = NLA_FLAG }, 870 [NL80211_ATTR_TDLS_INITIATOR] = { .type = NLA_FLAG }, 871 [NL80211_ATTR_DONT_WAIT_FOR_ACK] = { .type = NLA_FLAG }, 872 [NL80211_ATTR_PROBE_RESP] = { .type = NLA_BINARY, 873 .len = IEEE80211_MAX_DATA_LEN }, 874 [NL80211_ATTR_DFS_REGION] = { .type = NLA_U8 }, 875 [NL80211_ATTR_DISABLE_HT] = { .type = NLA_FLAG }, 876 [NL80211_ATTR_HT_CAPABILITY_MASK] = { 877 .len = NL80211_HT_CAPABILITY_LEN 878 }, 879 [NL80211_ATTR_NOACK_MAP] = { .type = NLA_U16 }, 880 [NL80211_ATTR_INACTIVITY_TIMEOUT] = { .type = NLA_U16 }, 881 [NL80211_ATTR_BG_SCAN_PERIOD] = { .type = NLA_U16 }, 882 [NL80211_ATTR_WDEV] = { .type = NLA_U64 }, 883 [NL80211_ATTR_USER_REG_HINT_TYPE] = { .type = NLA_U32 }, 884 885 /* need to include at least Auth Transaction and Status Code */ 886 [NL80211_ATTR_AUTH_DATA] = NLA_POLICY_MIN_LEN(4), 887 888 [NL80211_ATTR_VHT_CAPABILITY] = NLA_POLICY_EXACT_LEN_WARN(NL80211_VHT_CAPABILITY_LEN), 889 [NL80211_ATTR_SCAN_FLAGS] = { .type = NLA_U32 }, 890 [NL80211_ATTR_P2P_CTWINDOW] = NLA_POLICY_MAX(NLA_U8, 127), 891 [NL80211_ATTR_P2P_OPPPS] = NLA_POLICY_MAX(NLA_U8, 1), 892 [NL80211_ATTR_LOCAL_MESH_POWER_MODE] = 893 NLA_POLICY_RANGE(NLA_U32, 894 NL80211_MESH_POWER_UNKNOWN + 1, 895 NL80211_MESH_POWER_MAX), 896 [NL80211_ATTR_ACL_POLICY] = {. type = NLA_U32 }, 897 [NL80211_ATTR_MAC_ADDRS] = { .type = NLA_NESTED }, 898 [NL80211_ATTR_STA_CAPABILITY] = { .type = NLA_U16 }, 899 [NL80211_ATTR_STA_EXT_CAPABILITY] = { .type = NLA_BINARY, }, 900 [NL80211_ATTR_SPLIT_WIPHY_DUMP] = { .type = NLA_FLAG, }, 901 [NL80211_ATTR_DISABLE_VHT] = { .type = NLA_FLAG }, 902 [NL80211_ATTR_VHT_CAPABILITY_MASK] = { 903 .len = NL80211_VHT_CAPABILITY_LEN, 904 }, 905 [NL80211_ATTR_MDID] = { .type = NLA_U16 }, 906 [NL80211_ATTR_IE_RIC] = { .type = NLA_BINARY, 907 .len = IEEE80211_MAX_DATA_LEN }, 908 [NL80211_ATTR_CRIT_PROT_ID] = { .type = NLA_U16 }, 909 [NL80211_ATTR_MAX_CRIT_PROT_DURATION] = 910 NLA_POLICY_MAX(NLA_U16, NL80211_CRIT_PROTO_MAX_DURATION), 911 [NL80211_ATTR_PEER_AID] = 912 NLA_POLICY_RANGE(NLA_U16, 1, IEEE80211_MAX_AID), 913 [NL80211_ATTR_CH_SWITCH_COUNT] = { .type = NLA_U32 }, 914 [NL80211_ATTR_CH_SWITCH_BLOCK_TX] = { .type = NLA_FLAG }, 915 [NL80211_ATTR_CSA_IES] = { .type = NLA_NESTED }, 916 [NL80211_ATTR_CNTDWN_OFFS_BEACON] = { .type = NLA_BINARY }, 917 [NL80211_ATTR_CNTDWN_OFFS_PRESP] = { .type = NLA_BINARY }, 918 [NL80211_ATTR_STA_SUPPORTED_CHANNELS] = NLA_POLICY_MIN_LEN(2), 919 /* 920 * The value of the Length field of the Supported Operating 921 * Classes element is between 2 and 253. 922 */ 923 [NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES] = 924 NLA_POLICY_RANGE(NLA_BINARY, 2, 253), 925 [NL80211_ATTR_HANDLE_DFS] = { .type = NLA_FLAG }, 926 [NL80211_ATTR_OPMODE_NOTIF] = { .type = NLA_U8 }, 927 [NL80211_ATTR_VENDOR_ID] = { .type = NLA_U32 }, 928 [NL80211_ATTR_VENDOR_SUBCMD] = { .type = NLA_U32 }, 929 [NL80211_ATTR_VENDOR_DATA] = { .type = NLA_BINARY }, 930 [NL80211_ATTR_QOS_MAP] = NLA_POLICY_RANGE(NLA_BINARY, 931 IEEE80211_QOS_MAP_LEN_MIN, 932 IEEE80211_QOS_MAP_LEN_MAX), 933 [NL80211_ATTR_MAC_HINT] = NLA_POLICY_EXACT_LEN_WARN(ETH_ALEN), 934 [NL80211_ATTR_WIPHY_FREQ_HINT] = { .type = NLA_U32 }, 935 [NL80211_ATTR_TDLS_PEER_CAPABILITY] = { .type = NLA_U32 }, 936 [NL80211_ATTR_SOCKET_OWNER] = { .type = NLA_FLAG }, 937 [NL80211_ATTR_CSA_C_OFFSETS_TX] = { .type = NLA_BINARY }, 938 [NL80211_ATTR_USE_RRM] = { .type = NLA_FLAG }, 939 [NL80211_ATTR_TSID] = NLA_POLICY_MAX(NLA_U8, IEEE80211_NUM_TIDS - 1), 940 [NL80211_ATTR_USER_PRIO] = 941 NLA_POLICY_MAX(NLA_U8, IEEE80211_NUM_UPS - 1), 942 [NL80211_ATTR_ADMITTED_TIME] = { .type = NLA_U16 }, 943 [NL80211_ATTR_SMPS_MODE] = { .type = NLA_U8 }, 944 [NL80211_ATTR_OPER_CLASS] = { .type = NLA_U8 }, 945 [NL80211_ATTR_MAC_MASK] = NLA_POLICY_EXACT_LEN_WARN(ETH_ALEN), 946 [NL80211_ATTR_WIPHY_SELF_MANAGED_REG] = { .type = NLA_FLAG }, 947 [NL80211_ATTR_NETNS_FD] = { .type = NLA_U32 }, 948 [NL80211_ATTR_SCHED_SCAN_DELAY] = { .type = NLA_U32 }, 949 [NL80211_ATTR_REG_INDOOR] = { .type = NLA_FLAG }, 950 [NL80211_ATTR_PBSS] = { .type = NLA_FLAG }, 951 [NL80211_ATTR_BSS_SELECT] = { .type = NLA_NESTED }, 952 [NL80211_ATTR_STA_SUPPORT_P2P_PS] = 953 NLA_POLICY_MAX(NLA_U8, NUM_NL80211_P2P_PS_STATUS - 1), 954 [NL80211_ATTR_MU_MIMO_GROUP_DATA] = { 955 .len = VHT_MUMIMO_GROUPS_DATA_LEN 956 }, 957 [NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR] = NLA_POLICY_EXACT_LEN_WARN(ETH_ALEN), 958 [NL80211_ATTR_NAN_MASTER_PREF] = NLA_POLICY_MIN(NLA_U8, 1), 959 [NL80211_ATTR_BANDS] = { .type = NLA_U32 }, 960 [NL80211_ATTR_NAN_CONFIG] = NLA_POLICY_NESTED(nl80211_nan_conf_policy), 961 [NL80211_ATTR_NAN_FUNC] = { .type = NLA_NESTED }, 962 [NL80211_ATTR_FILS_KEK] = { .type = NLA_BINARY, 963 .len = FILS_MAX_KEK_LEN }, 964 [NL80211_ATTR_FILS_NONCES] = NLA_POLICY_EXACT_LEN_WARN(2 * FILS_NONCE_LEN), 965 [NL80211_ATTR_MULTICAST_TO_UNICAST_ENABLED] = { .type = NLA_FLAG, }, 966 [NL80211_ATTR_BSSID] = NLA_POLICY_EXACT_LEN_WARN(ETH_ALEN), 967 [NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI] = { .type = NLA_S8 }, 968 [NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST] = { 969 .len = sizeof(struct nl80211_bss_select_rssi_adjust) 970 }, 971 [NL80211_ATTR_TIMEOUT_REASON] = { .type = NLA_U32 }, 972 [NL80211_ATTR_FILS_ERP_USERNAME] = { .type = NLA_BINARY, 973 .len = FILS_ERP_MAX_USERNAME_LEN }, 974 [NL80211_ATTR_FILS_ERP_REALM] = { .type = NLA_BINARY, 975 .len = FILS_ERP_MAX_REALM_LEN }, 976 [NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] = { .type = NLA_U16 }, 977 [NL80211_ATTR_FILS_ERP_RRK] = { .type = NLA_BINARY, 978 .len = FILS_ERP_MAX_RRK_LEN }, 979 [NL80211_ATTR_FILS_CACHE_ID] = NLA_POLICY_EXACT_LEN_WARN(2), 980 [NL80211_ATTR_PMK] = { .type = NLA_BINARY, .len = PMK_MAX_LEN }, 981 [NL80211_ATTR_PMKR0_NAME] = NLA_POLICY_EXACT_LEN(WLAN_PMK_NAME_LEN), 982 [NL80211_ATTR_SCHED_SCAN_MULTI] = { .type = NLA_FLAG }, 983 [NL80211_ATTR_EXTERNAL_AUTH_SUPPORT] = { .type = NLA_FLAG }, 984 985 [NL80211_ATTR_TXQ_LIMIT] = { .type = NLA_U32 }, 986 [NL80211_ATTR_TXQ_MEMORY_LIMIT] = { .type = NLA_U32 }, 987 [NL80211_ATTR_TXQ_QUANTUM] = NLA_POLICY_FULL_RANGE(NLA_U32, &q_range), 988 [NL80211_ATTR_HE_CAPABILITY] = 989 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_he_capa, 990 NL80211_HE_MAX_CAPABILITY_LEN), 991 [NL80211_ATTR_FTM_RESPONDER] = 992 NLA_POLICY_NESTED(nl80211_ftm_responder_policy), 993 [NL80211_ATTR_TIMEOUT] = NLA_POLICY_MIN(NLA_U32, 1), 994 [NL80211_ATTR_PEER_MEASUREMENTS] = 995 NLA_POLICY_NESTED(nl80211_pmsr_attr_policy), 996 [NL80211_ATTR_AIRTIME_WEIGHT] = NLA_POLICY_MIN(NLA_U16, 1), 997 [NL80211_ATTR_SAE_PASSWORD] = { .type = NLA_BINARY, 998 .len = SAE_PASSWORD_MAX_LEN }, 999 [NL80211_ATTR_TWT_RESPONDER] = { .type = NLA_FLAG }, 1000 [NL80211_ATTR_HE_OBSS_PD] = NLA_POLICY_NESTED(he_obss_pd_policy), 1001 [NL80211_ATTR_VLAN_ID] = NLA_POLICY_RANGE(NLA_U16, 1, VLAN_N_VID - 2), 1002 [NL80211_ATTR_HE_BSS_COLOR] = NLA_POLICY_NESTED(he_bss_color_policy), 1003 [NL80211_ATTR_TID_CONFIG] = 1004 NLA_POLICY_NESTED_ARRAY(nl80211_tid_config_attr_policy), 1005 [NL80211_ATTR_CONTROL_PORT_NO_PREAUTH] = { .type = NLA_FLAG }, 1006 [NL80211_ATTR_PMK_LIFETIME] = NLA_POLICY_MIN(NLA_U32, 1), 1007 [NL80211_ATTR_PMK_REAUTH_THRESHOLD] = NLA_POLICY_RANGE(NLA_U8, 1, 100), 1008 [NL80211_ATTR_RECEIVE_MULTICAST] = { .type = NLA_FLAG }, 1009 [NL80211_ATTR_WIPHY_FREQ_OFFSET] = NLA_POLICY_RANGE(NLA_U32, 0, 999), 1010 [NL80211_ATTR_SCAN_FREQ_KHZ] = { .type = NLA_NESTED }, 1011 [NL80211_ATTR_HE_6GHZ_CAPABILITY] = 1012 NLA_POLICY_EXACT_LEN(sizeof(struct ieee80211_he_6ghz_capa)), 1013 [NL80211_ATTR_FILS_DISCOVERY] = 1014 NLA_POLICY_NESTED(nl80211_fils_discovery_policy), 1015 [NL80211_ATTR_UNSOL_BCAST_PROBE_RESP] = 1016 NLA_POLICY_NESTED(nl80211_unsol_bcast_probe_resp_policy), 1017 [NL80211_ATTR_S1G_CAPABILITY] = 1018 NLA_POLICY_EXACT_LEN(IEEE80211_S1G_CAPABILITY_LEN), 1019 [NL80211_ATTR_S1G_CAPABILITY_MASK] = 1020 NLA_POLICY_EXACT_LEN(IEEE80211_S1G_CAPABILITY_LEN), 1021 [NL80211_ATTR_SAE_PWE] = 1022 NLA_POLICY_RANGE(NLA_U8, NL80211_SAE_PWE_HUNT_AND_PECK, 1023 NL80211_SAE_PWE_BOTH), 1024 [NL80211_ATTR_RECONNECT_REQUESTED] = { .type = NLA_REJECT }, 1025 [NL80211_ATTR_SAR_SPEC] = NLA_POLICY_NESTED(sar_policy), 1026 [NL80211_ATTR_DISABLE_HE] = { .type = NLA_FLAG }, 1027 [NL80211_ATTR_OBSS_COLOR_BITMAP] = { .type = NLA_U64 }, 1028 [NL80211_ATTR_COLOR_CHANGE_COUNT] = { .type = NLA_U8 }, 1029 [NL80211_ATTR_COLOR_CHANGE_COLOR] = { .type = NLA_U8 }, 1030 [NL80211_ATTR_COLOR_CHANGE_ELEMS] = NLA_POLICY_NESTED(nl80211_policy), 1031 [NL80211_ATTR_MBSSID_CONFIG] = 1032 NLA_POLICY_NESTED(nl80211_mbssid_config_policy), 1033 [NL80211_ATTR_MBSSID_ELEMS] = { .type = NLA_NESTED }, 1034 [NL80211_ATTR_RADAR_BACKGROUND] = { .type = NLA_FLAG }, 1035 [NL80211_ATTR_AP_SETTINGS_FLAGS] = { .type = NLA_U32 }, 1036 [NL80211_ATTR_EHT_CAPABILITY] = 1037 NLA_POLICY_RANGE(NLA_BINARY, 1038 NL80211_EHT_MIN_CAPABILITY_LEN, 1039 NL80211_EHT_MAX_CAPABILITY_LEN), 1040 [NL80211_ATTR_DISABLE_EHT] = { .type = NLA_FLAG }, 1041 [NL80211_ATTR_MLO_LINKS] = 1042 NLA_POLICY_NESTED_ARRAY(nl80211_policy), 1043 [NL80211_ATTR_MLO_LINK_ID] = 1044 NLA_POLICY_RANGE(NLA_U8, 0, IEEE80211_MLD_MAX_NUM_LINKS - 1), 1045 [NL80211_ATTR_MLD_ADDR] = NLA_POLICY_EXACT_LEN(ETH_ALEN), 1046 [NL80211_ATTR_MLO_SUPPORT] = { .type = NLA_FLAG }, 1047 [NL80211_ATTR_MAX_NUM_AKM_SUITES] = { .type = NLA_REJECT }, 1048 [NL80211_ATTR_EML_CAPABILITY] = { .type = NLA_U16 }, 1049 [NL80211_ATTR_PUNCT_BITMAP] = 1050 NLA_POLICY_FULL_RANGE(NLA_U32, &nl80211_punct_bitmap_range), 1051 1052 [NL80211_ATTR_MAX_HW_TIMESTAMP_PEERS] = { .type = NLA_U16 }, 1053 [NL80211_ATTR_HW_TIMESTAMP_ENABLED] = { .type = NLA_FLAG }, 1054 [NL80211_ATTR_EMA_RNR_ELEMS] = { .type = NLA_NESTED }, 1055 [NL80211_ATTR_MLO_LINK_DISABLED] = { .type = NLA_FLAG }, 1056 [NL80211_ATTR_BSS_DUMP_INCLUDE_USE_DATA] = { .type = NLA_FLAG }, 1057 [NL80211_ATTR_MLO_TTLM_DLINK] = NLA_POLICY_EXACT_LEN(sizeof(u16) * 8), 1058 [NL80211_ATTR_MLO_TTLM_ULINK] = NLA_POLICY_EXACT_LEN(sizeof(u16) * 8), 1059 [NL80211_ATTR_ASSOC_SPP_AMSDU] = { .type = NLA_FLAG }, 1060 [NL80211_ATTR_VIF_RADIO_MASK] = { .type = NLA_U32 }, 1061 [NL80211_ATTR_SUPPORTED_SELECTORS] = 1062 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_supported_selectors, 1063 NL80211_MAX_SUPP_SELECTORS), 1064 [NL80211_ATTR_MLO_RECONF_REM_LINKS] = { .type = NLA_U16 }, 1065 [NL80211_ATTR_EPCS] = { .type = NLA_FLAG }, 1066 [NL80211_ATTR_EXT_MLD_CAPA_AND_OPS] = { .type = NLA_U16 }, 1067 [NL80211_ATTR_WIPHY_RADIO_INDEX] = { .type = NLA_U8 }, 1068 [NL80211_ATTR_S1G_LONG_BEACON_PERIOD] = NLA_POLICY_MIN(NLA_U8, 2), 1069 [NL80211_ATTR_S1G_SHORT_BEACON] = 1070 NLA_POLICY_NESTED(nl80211_s1g_short_beacon), 1071 [NL80211_ATTR_BSS_PARAM] = { .type = NLA_FLAG }, 1072 [NL80211_ATTR_S1G_PRIMARY_2MHZ] = { .type = NLA_FLAG }, 1073 [NL80211_ATTR_EPP_PEER] = { .type = NLA_FLAG }, 1074 [NL80211_ATTR_UHR_CAPABILITY] = 1075 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_uhr_capa, 255), 1076 [NL80211_ATTR_DISABLE_UHR] = { .type = NLA_FLAG }, 1077 [NL80211_ATTR_UHR_OPERATION] = 1078 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_uhr_operation), 1079 [NL80211_ATTR_NAN_CHANNEL] = NLA_POLICY_NESTED(nl80211_policy), 1080 [NL80211_ATTR_NAN_CHANNEL_ENTRY] = NLA_POLICY_EXACT_LEN(6), 1081 [NL80211_ATTR_NAN_RX_NSS] = { .type = NLA_U8 }, 1082 [NL80211_ATTR_NAN_TIME_SLOTS] = 1083 NLA_POLICY_EXACT_LEN(CFG80211_NAN_SCHED_NUM_TIME_SLOTS), 1084 [NL80211_ATTR_NAN_AVAIL_BLOB] = 1085 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_nan_avail_blob), 1086 [NL80211_ATTR_NAN_SCHED_DEFERRED] = { .type = NLA_FLAG }, 1087 [NL80211_ATTR_NAN_NMI_MAC] = NLA_POLICY_ETH_ADDR, 1088 [NL80211_ATTR_NAN_ULW] = 1089 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_nan_ulw), 1090 [NL80211_ATTR_NAN_COMMITTED_DW] = { .type = NLA_U16 }, 1091 [NL80211_ATTR_NAN_SEQ_ID] = { .type = NLA_U8 }, 1092 [NL80211_ATTR_NAN_MAX_CHAN_SWITCH_TIME] = { .type = NLA_U16 }, 1093 [NL80211_ATTR_NAN_PEER_MAPS] = 1094 NLA_POLICY_NESTED_ARRAY(nl80211_nan_peer_map_policy), 1095 [NL80211_ATTR_NPCA_PRIMARY_FREQ] = { .type = NLA_U32 }, 1096 [NL80211_ATTR_NPCA_PUNCT_BITMAP] = 1097 NLA_POLICY_FULL_RANGE(NLA_U32, &nl80211_punct_bitmap_range), 1098 [NL80211_ATTR_STA_DUMP_LINK_STATS] = { .type = NLA_FLAG }, 1099 }; 1100 1101 /* policy for the key attributes */ 1102 static const struct nla_policy nl80211_key_policy[NL80211_KEY_MAX + 1] = { 1103 [NL80211_KEY_DATA] = { .type = NLA_BINARY, .len = WLAN_MAX_KEY_LEN }, 1104 [NL80211_KEY_IDX] = { .type = NLA_U8 }, 1105 [NL80211_KEY_CIPHER] = { .type = NLA_U32 }, 1106 [NL80211_KEY_SEQ] = { .type = NLA_BINARY, .len = 16 }, 1107 [NL80211_KEY_DEFAULT] = { .type = NLA_FLAG }, 1108 [NL80211_KEY_DEFAULT_MGMT] = { .type = NLA_FLAG }, 1109 [NL80211_KEY_TYPE] = NLA_POLICY_MAX(NLA_U32, NUM_NL80211_KEYTYPES - 1), 1110 [NL80211_KEY_DEFAULT_TYPES] = { .type = NLA_NESTED }, 1111 [NL80211_KEY_MODE] = NLA_POLICY_RANGE(NLA_U8, 0, NL80211_KEY_SET_TX), 1112 [NL80211_KEY_LTF_SEED] = { 1113 .type = NLA_BINARY, 1114 .len = WLAN_MAX_SECURE_LTF_KEYSEED_LEN, 1115 }, 1116 }; 1117 1118 /* policy for the key default flags */ 1119 static const struct nla_policy 1120 nl80211_key_default_policy[NUM_NL80211_KEY_DEFAULT_TYPES] = { 1121 [NL80211_KEY_DEFAULT_TYPE_UNICAST] = { .type = NLA_FLAG }, 1122 [NL80211_KEY_DEFAULT_TYPE_MULTICAST] = { .type = NLA_FLAG }, 1123 }; 1124 1125 #ifdef CONFIG_PM 1126 /* policy for WoWLAN attributes */ 1127 static const struct nla_policy 1128 nl80211_wowlan_policy[NUM_NL80211_WOWLAN_TRIG] = { 1129 [NL80211_WOWLAN_TRIG_ANY] = { .type = NLA_FLAG }, 1130 [NL80211_WOWLAN_TRIG_DISCONNECT] = { .type = NLA_FLAG }, 1131 [NL80211_WOWLAN_TRIG_MAGIC_PKT] = { .type = NLA_FLAG }, 1132 [NL80211_WOWLAN_TRIG_PKT_PATTERN] = { .type = NLA_NESTED }, 1133 [NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE] = { .type = NLA_FLAG }, 1134 [NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST] = { .type = NLA_FLAG }, 1135 [NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE] = { .type = NLA_FLAG }, 1136 [NL80211_WOWLAN_TRIG_RFKILL_RELEASE] = { .type = NLA_FLAG }, 1137 [NL80211_WOWLAN_TRIG_TCP_CONNECTION] = { .type = NLA_NESTED }, 1138 [NL80211_WOWLAN_TRIG_NET_DETECT] = { .type = NLA_NESTED }, 1139 }; 1140 1141 static const struct nla_policy 1142 nl80211_wowlan_tcp_policy[NUM_NL80211_WOWLAN_TCP] = { 1143 [NL80211_WOWLAN_TCP_SRC_IPV4] = { .type = NLA_U32 }, 1144 [NL80211_WOWLAN_TCP_DST_IPV4] = { .type = NLA_U32 }, 1145 [NL80211_WOWLAN_TCP_DST_MAC] = NLA_POLICY_EXACT_LEN_WARN(ETH_ALEN), 1146 [NL80211_WOWLAN_TCP_SRC_PORT] = { .type = NLA_U16 }, 1147 [NL80211_WOWLAN_TCP_DST_PORT] = { .type = NLA_U16 }, 1148 [NL80211_WOWLAN_TCP_DATA_PAYLOAD] = NLA_POLICY_MIN_LEN(1), 1149 [NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ] = { 1150 .len = sizeof(struct nl80211_wowlan_tcp_data_seq) 1151 }, 1152 [NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN] = { 1153 .len = sizeof(struct nl80211_wowlan_tcp_data_token) 1154 }, 1155 [NL80211_WOWLAN_TCP_DATA_INTERVAL] = { .type = NLA_U32 }, 1156 [NL80211_WOWLAN_TCP_WAKE_PAYLOAD] = NLA_POLICY_MIN_LEN(1), 1157 [NL80211_WOWLAN_TCP_WAKE_MASK] = NLA_POLICY_MIN_LEN(1), 1158 }; 1159 #endif /* CONFIG_PM */ 1160 1161 /* policy for coalesce rule attributes */ 1162 static const struct nla_policy 1163 nl80211_coalesce_policy[NUM_NL80211_ATTR_COALESCE_RULE] = { 1164 [NL80211_ATTR_COALESCE_RULE_DELAY] = { .type = NLA_U32 }, 1165 [NL80211_ATTR_COALESCE_RULE_CONDITION] = 1166 NLA_POLICY_RANGE(NLA_U32, 1167 NL80211_COALESCE_CONDITION_MATCH, 1168 NL80211_COALESCE_CONDITION_NO_MATCH), 1169 [NL80211_ATTR_COALESCE_RULE_PKT_PATTERN] = { .type = NLA_NESTED }, 1170 }; 1171 1172 /* policy for GTK rekey offload attributes */ 1173 static const struct nla_policy 1174 nl80211_rekey_policy[NUM_NL80211_REKEY_DATA] = { 1175 [NL80211_REKEY_DATA_KEK] = { 1176 .type = NLA_BINARY, 1177 .len = NL80211_KEK_EXT_LEN 1178 }, 1179 [NL80211_REKEY_DATA_KCK] = { 1180 .type = NLA_BINARY, 1181 .len = NL80211_KCK_EXT_LEN_32 1182 }, 1183 [NL80211_REKEY_DATA_REPLAY_CTR] = NLA_POLICY_EXACT_LEN(NL80211_REPLAY_CTR_LEN), 1184 [NL80211_REKEY_DATA_AKM] = { .type = NLA_U32 }, 1185 }; 1186 1187 static const struct nla_policy 1188 nl80211_match_policy[NL80211_SCHED_SCAN_MATCH_ATTR_MAX + 1] = { 1189 [NL80211_SCHED_SCAN_MATCH_ATTR_SSID] = { .type = NLA_BINARY, 1190 .len = IEEE80211_MAX_SSID_LEN }, 1191 [NL80211_SCHED_SCAN_MATCH_ATTR_BSSID] = NLA_POLICY_EXACT_LEN_WARN(ETH_ALEN), 1192 [NL80211_SCHED_SCAN_MATCH_ATTR_RSSI] = { .type = NLA_U32 }, 1193 }; 1194 1195 static const struct nla_policy 1196 nl80211_plan_policy[NL80211_SCHED_SCAN_PLAN_MAX + 1] = { 1197 [NL80211_SCHED_SCAN_PLAN_INTERVAL] = { .type = NLA_U32 }, 1198 [NL80211_SCHED_SCAN_PLAN_ITERATIONS] = { .type = NLA_U32 }, 1199 }; 1200 1201 static const struct nla_policy 1202 nl80211_bss_select_policy[NL80211_BSS_SELECT_ATTR_MAX + 1] = { 1203 [NL80211_BSS_SELECT_ATTR_RSSI] = { .type = NLA_FLAG }, 1204 [NL80211_BSS_SELECT_ATTR_BAND_PREF] = { .type = NLA_U32 }, 1205 [NL80211_BSS_SELECT_ATTR_RSSI_ADJUST] = { 1206 .len = sizeof(struct nl80211_bss_select_rssi_adjust) 1207 }, 1208 }; 1209 1210 /* policy for NAN function attributes */ 1211 static const struct nla_policy 1212 nl80211_nan_func_policy[NL80211_NAN_FUNC_ATTR_MAX + 1] = { 1213 [NL80211_NAN_FUNC_TYPE] = 1214 NLA_POLICY_MAX(NLA_U8, NL80211_NAN_FUNC_MAX_TYPE), 1215 [NL80211_NAN_FUNC_SERVICE_ID] = { 1216 .len = NL80211_NAN_FUNC_SERVICE_ID_LEN }, 1217 [NL80211_NAN_FUNC_PUBLISH_TYPE] = { .type = NLA_U8 }, 1218 [NL80211_NAN_FUNC_PUBLISH_BCAST] = { .type = NLA_FLAG }, 1219 [NL80211_NAN_FUNC_SUBSCRIBE_ACTIVE] = { .type = NLA_FLAG }, 1220 [NL80211_NAN_FUNC_FOLLOW_UP_ID] = { .type = NLA_U8 }, 1221 [NL80211_NAN_FUNC_FOLLOW_UP_REQ_ID] = { .type = NLA_U8 }, 1222 [NL80211_NAN_FUNC_FOLLOW_UP_DEST] = NLA_POLICY_EXACT_LEN_WARN(ETH_ALEN), 1223 [NL80211_NAN_FUNC_CLOSE_RANGE] = { .type = NLA_FLAG }, 1224 [NL80211_NAN_FUNC_TTL] = { .type = NLA_U32 }, 1225 [NL80211_NAN_FUNC_SERVICE_INFO] = { .type = NLA_BINARY, 1226 .len = NL80211_NAN_FUNC_SERVICE_SPEC_INFO_MAX_LEN }, 1227 [NL80211_NAN_FUNC_SRF] = { .type = NLA_NESTED }, 1228 [NL80211_NAN_FUNC_RX_MATCH_FILTER] = { .type = NLA_NESTED }, 1229 [NL80211_NAN_FUNC_TX_MATCH_FILTER] = { .type = NLA_NESTED }, 1230 [NL80211_NAN_FUNC_INSTANCE_ID] = { .type = NLA_U8 }, 1231 [NL80211_NAN_FUNC_TERM_REASON] = { .type = NLA_U8 }, 1232 }; 1233 1234 /* policy for Service Response Filter attributes */ 1235 static const struct nla_policy 1236 nl80211_nan_srf_policy[NL80211_NAN_SRF_ATTR_MAX + 1] = { 1237 [NL80211_NAN_SRF_INCLUDE] = { .type = NLA_FLAG }, 1238 [NL80211_NAN_SRF_BF] = { .type = NLA_BINARY, 1239 .len = NL80211_NAN_FUNC_SRF_MAX_LEN }, 1240 [NL80211_NAN_SRF_BF_IDX] = { .type = NLA_U8 }, 1241 [NL80211_NAN_SRF_MAC_ADDRS] = { .type = NLA_NESTED }, 1242 }; 1243 1244 /* policy for packet pattern attributes */ 1245 static const struct nla_policy 1246 nl80211_packet_pattern_policy[MAX_NL80211_PKTPAT + 1] = { 1247 [NL80211_PKTPAT_MASK] = { .type = NLA_BINARY, }, 1248 [NL80211_PKTPAT_PATTERN] = { .type = NLA_BINARY, }, 1249 [NL80211_PKTPAT_OFFSET] = { .type = NLA_U32 }, 1250 }; 1251 1252 static int nl80211_prepare_wdev_dump(struct netlink_callback *cb, 1253 struct cfg80211_registered_device **rdev, 1254 struct wireless_dev **wdev, 1255 struct nlattr **attrbuf) 1256 { 1257 int err; 1258 1259 if (!cb->args[0]) { 1260 struct nlattr **attrbuf_free = NULL; 1261 1262 if (!attrbuf) { 1263 attrbuf = kzalloc_objs(*attrbuf, NUM_NL80211_ATTR); 1264 if (!attrbuf) 1265 return -ENOMEM; 1266 attrbuf_free = attrbuf; 1267 } 1268 1269 err = nlmsg_parse_deprecated(cb->nlh, 1270 GENL_HDRLEN + nl80211_fam.hdrsize, 1271 attrbuf, nl80211_fam.maxattr, 1272 nl80211_policy, NULL); 1273 if (err) { 1274 kfree(attrbuf_free); 1275 return err; 1276 } 1277 1278 rtnl_lock(); 1279 *wdev = __cfg80211_wdev_from_attrs(NULL, sock_net(cb->skb->sk), 1280 attrbuf); 1281 kfree(attrbuf_free); 1282 if (IS_ERR(*wdev)) { 1283 rtnl_unlock(); 1284 return PTR_ERR(*wdev); 1285 } 1286 *rdev = wiphy_to_rdev((*wdev)->wiphy); 1287 mutex_lock(&(*rdev)->wiphy.mtx); 1288 rtnl_unlock(); 1289 /* 0 is the first index - add 1 to parse only once */ 1290 cb->args[0] = (*rdev)->wiphy_idx + 1; 1291 cb->args[1] = (*wdev)->identifier; 1292 } else { 1293 /* subtract the 1 again here */ 1294 struct wiphy *wiphy; 1295 struct wireless_dev *tmp; 1296 1297 rtnl_lock(); 1298 wiphy = wiphy_idx_to_wiphy(cb->args[0] - 1); 1299 if (!wiphy) { 1300 rtnl_unlock(); 1301 return -ENODEV; 1302 } 1303 1304 /* 1305 * The first invocation validated the wdev's netns against 1306 * the caller via __cfg80211_wdev_from_attrs(). The wiphy 1307 * may have moved netns between dumpit invocations (via 1308 * NL80211_CMD_SET_WIPHY_NETNS), so re-check here. 1309 */ 1310 if (!net_eq(wiphy_net(wiphy), sock_net(cb->skb->sk))) { 1311 rtnl_unlock(); 1312 return -ENODEV; 1313 } 1314 1315 *rdev = wiphy_to_rdev(wiphy); 1316 *wdev = NULL; 1317 1318 list_for_each_entry(tmp, &(*rdev)->wiphy.wdev_list, list) { 1319 if (tmp->identifier == cb->args[1]) { 1320 *wdev = tmp; 1321 break; 1322 } 1323 } 1324 1325 if (!*wdev) { 1326 rtnl_unlock(); 1327 return -ENODEV; 1328 } 1329 mutex_lock(&(*rdev)->wiphy.mtx); 1330 rtnl_unlock(); 1331 } 1332 1333 return 0; 1334 } 1335 1336 /* message building helper */ 1337 void *nl80211hdr_put(struct sk_buff *skb, u32 portid, u32 seq, 1338 int flags, u8 cmd) 1339 { 1340 /* since there is no private header just add the generic one */ 1341 return genlmsg_put(skb, portid, seq, &nl80211_fam, flags, cmd); 1342 } 1343 1344 static int nl80211_msg_put_wmm_rules(struct sk_buff *msg, 1345 const struct ieee80211_reg_rule *rule) 1346 { 1347 int j; 1348 struct nlattr *nl_wmm_rules = 1349 nla_nest_start_noflag(msg, NL80211_FREQUENCY_ATTR_WMM); 1350 1351 if (!nl_wmm_rules) 1352 goto nla_put_failure; 1353 1354 for (j = 0; j < IEEE80211_NUM_ACS; j++) { 1355 struct nlattr *nl_wmm_rule = nla_nest_start_noflag(msg, j); 1356 1357 if (!nl_wmm_rule) 1358 goto nla_put_failure; 1359 1360 if (nla_put_u16(msg, NL80211_WMMR_CW_MIN, 1361 rule->wmm_rule.client[j].cw_min) || 1362 nla_put_u16(msg, NL80211_WMMR_CW_MAX, 1363 rule->wmm_rule.client[j].cw_max) || 1364 nla_put_u8(msg, NL80211_WMMR_AIFSN, 1365 rule->wmm_rule.client[j].aifsn) || 1366 nla_put_u16(msg, NL80211_WMMR_TXOP, 1367 rule->wmm_rule.client[j].cot)) 1368 goto nla_put_failure; 1369 1370 nla_nest_end(msg, nl_wmm_rule); 1371 } 1372 nla_nest_end(msg, nl_wmm_rules); 1373 1374 return 0; 1375 1376 nla_put_failure: 1377 return -ENOBUFS; 1378 } 1379 1380 static int nl80211_msg_put_channel(struct sk_buff *msg, struct wiphy *wiphy, 1381 struct ieee80211_channel *chan, 1382 bool large) 1383 { 1384 /* Some channels must be completely excluded from the 1385 * list to protect old user-space tools from breaking 1386 */ 1387 if (!large && chan->flags & 1388 (IEEE80211_CHAN_NO_10MHZ | IEEE80211_CHAN_NO_20MHZ)) 1389 return 0; 1390 if (!large && chan->freq_offset) 1391 return 0; 1392 1393 if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_FREQ, 1394 chan->center_freq)) 1395 goto nla_put_failure; 1396 1397 if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_OFFSET, chan->freq_offset)) 1398 goto nla_put_failure; 1399 1400 if ((chan->flags & IEEE80211_CHAN_PSD) && 1401 nla_put_s8(msg, NL80211_FREQUENCY_ATTR_PSD, chan->psd)) 1402 goto nla_put_failure; 1403 1404 if ((chan->flags & IEEE80211_CHAN_DISABLED) && 1405 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_DISABLED)) 1406 goto nla_put_failure; 1407 if (chan->flags & IEEE80211_CHAN_NO_IR) { 1408 if (nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_IR)) 1409 goto nla_put_failure; 1410 if (nla_put_flag(msg, __NL80211_FREQUENCY_ATTR_NO_IBSS)) 1411 goto nla_put_failure; 1412 } 1413 if (chan->flags & IEEE80211_CHAN_RADAR) { 1414 if (nla_put_flag(msg, NL80211_FREQUENCY_ATTR_RADAR)) 1415 goto nla_put_failure; 1416 if (large) { 1417 u32 time; 1418 1419 time = elapsed_jiffies_msecs(chan->dfs_state_entered); 1420 1421 if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_DFS_STATE, 1422 chan->dfs_state)) 1423 goto nla_put_failure; 1424 if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_DFS_TIME, 1425 time)) 1426 goto nla_put_failure; 1427 if (nla_put_u32(msg, 1428 NL80211_FREQUENCY_ATTR_DFS_CAC_TIME, 1429 chan->dfs_cac_ms)) 1430 goto nla_put_failure; 1431 } 1432 } 1433 1434 if (large) { 1435 if ((chan->flags & IEEE80211_CHAN_NO_HT40MINUS) && 1436 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_HT40_MINUS)) 1437 goto nla_put_failure; 1438 if ((chan->flags & IEEE80211_CHAN_NO_HT40PLUS) && 1439 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_HT40_PLUS)) 1440 goto nla_put_failure; 1441 if ((chan->flags & IEEE80211_CHAN_NO_80MHZ) && 1442 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_80MHZ)) 1443 goto nla_put_failure; 1444 if ((chan->flags & IEEE80211_CHAN_NO_160MHZ) && 1445 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_160MHZ)) 1446 goto nla_put_failure; 1447 if ((chan->flags & IEEE80211_CHAN_INDOOR_ONLY) && 1448 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_INDOOR_ONLY)) 1449 goto nla_put_failure; 1450 if ((chan->flags & IEEE80211_CHAN_IR_CONCURRENT) && 1451 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_IR_CONCURRENT)) 1452 goto nla_put_failure; 1453 if ((chan->flags & IEEE80211_CHAN_NO_20MHZ) && 1454 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_20MHZ)) 1455 goto nla_put_failure; 1456 if ((chan->flags & IEEE80211_CHAN_NO_10MHZ) && 1457 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_10MHZ)) 1458 goto nla_put_failure; 1459 if ((chan->flags & IEEE80211_CHAN_NO_HE) && 1460 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_HE)) 1461 goto nla_put_failure; 1462 if ((chan->flags & IEEE80211_CHAN_NO_320MHZ) && 1463 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_320MHZ)) 1464 goto nla_put_failure; 1465 if ((chan->flags & IEEE80211_CHAN_NO_EHT) && 1466 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_EHT)) 1467 goto nla_put_failure; 1468 if ((chan->flags & IEEE80211_CHAN_DFS_CONCURRENT) && 1469 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_DFS_CONCURRENT)) 1470 goto nla_put_failure; 1471 if ((chan->flags & IEEE80211_CHAN_NO_6GHZ_VLP_CLIENT) && 1472 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_6GHZ_VLP_CLIENT)) 1473 goto nla_put_failure; 1474 if ((chan->flags & IEEE80211_CHAN_NO_6GHZ_AFC_CLIENT) && 1475 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_6GHZ_AFC_CLIENT)) 1476 goto nla_put_failure; 1477 if ((chan->flags & IEEE80211_CHAN_CAN_MONITOR) && 1478 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_CAN_MONITOR)) 1479 goto nla_put_failure; 1480 if ((chan->flags & IEEE80211_CHAN_ALLOW_6GHZ_VLP_AP) && 1481 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_ALLOW_6GHZ_VLP_AP)) 1482 goto nla_put_failure; 1483 if ((chan->flags & IEEE80211_CHAN_ALLOW_20MHZ_ACTIVITY) && 1484 nla_put_flag(msg, 1485 NL80211_FREQUENCY_ATTR_ALLOW_20MHZ_ACTIVITY)) 1486 goto nla_put_failure; 1487 if ((chan->flags & IEEE80211_CHAN_NO_4MHZ) && 1488 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_4MHZ)) 1489 goto nla_put_failure; 1490 if ((chan->flags & IEEE80211_CHAN_NO_8MHZ) && 1491 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_8MHZ)) 1492 goto nla_put_failure; 1493 if ((chan->flags & IEEE80211_CHAN_NO_16MHZ) && 1494 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_16MHZ)) 1495 goto nla_put_failure; 1496 if ((chan->flags & IEEE80211_CHAN_S1G_NO_PRIMARY) && 1497 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_S1G_NO_PRIMARY)) 1498 goto nla_put_failure; 1499 if ((chan->flags & IEEE80211_CHAN_NO_UHR) && 1500 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_UHR)) 1501 goto nla_put_failure; 1502 if (chan->cac_start_time && 1503 nla_put_u64_64bit(msg, 1504 NL80211_FREQUENCY_ATTR_CAC_START_TIME, 1505 chan->cac_start_time, 1506 NL80211_FREQUENCY_ATTR_PAD)) 1507 goto nla_put_failure; 1508 } 1509 1510 if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_MAX_TX_POWER, 1511 DBM_TO_MBM(chan->max_power))) 1512 goto nla_put_failure; 1513 1514 if (large) { 1515 const struct ieee80211_reg_rule *rule = 1516 freq_reg_info(wiphy, MHZ_TO_KHZ(chan->center_freq)); 1517 1518 if (!IS_ERR_OR_NULL(rule) && rule->has_wmm) { 1519 if (nl80211_msg_put_wmm_rules(msg, rule)) 1520 goto nla_put_failure; 1521 } 1522 } 1523 1524 return 0; 1525 1526 nla_put_failure: 1527 return -ENOBUFS; 1528 } 1529 1530 static bool nl80211_put_txq_stats(struct sk_buff *msg, 1531 struct cfg80211_txq_stats *txqstats, 1532 int attrtype) 1533 { 1534 struct nlattr *txqattr; 1535 1536 #define PUT_TXQVAL_U32(attr, memb) do { \ 1537 if (txqstats->filled & BIT(NL80211_TXQ_STATS_ ## attr) && \ 1538 nla_put_u32(msg, NL80211_TXQ_STATS_ ## attr, txqstats->memb)) \ 1539 return false; \ 1540 } while (0) 1541 1542 txqattr = nla_nest_start_noflag(msg, attrtype); 1543 if (!txqattr) 1544 return false; 1545 1546 PUT_TXQVAL_U32(BACKLOG_BYTES, backlog_bytes); 1547 PUT_TXQVAL_U32(BACKLOG_PACKETS, backlog_packets); 1548 PUT_TXQVAL_U32(FLOWS, flows); 1549 PUT_TXQVAL_U32(DROPS, drops); 1550 PUT_TXQVAL_U32(ECN_MARKS, ecn_marks); 1551 PUT_TXQVAL_U32(OVERLIMIT, overlimit); 1552 PUT_TXQVAL_U32(OVERMEMORY, overmemory); 1553 PUT_TXQVAL_U32(COLLISIONS, collisions); 1554 PUT_TXQVAL_U32(TX_BYTES, tx_bytes); 1555 PUT_TXQVAL_U32(TX_PACKETS, tx_packets); 1556 PUT_TXQVAL_U32(MAX_FLOWS, max_flows); 1557 nla_nest_end(msg, txqattr); 1558 1559 #undef PUT_TXQVAL_U32 1560 return true; 1561 } 1562 1563 /* netlink command implementations */ 1564 1565 /** 1566 * nl80211_link_id - return link ID 1567 * @attrs: attributes to look at 1568 * 1569 * Returns: the link ID or 0 if not given 1570 * 1571 * Note this function doesn't do any validation of the link 1572 * ID validity wrt. links that were actually added, so it must 1573 * be called only from ops with %NL80211_FLAG_MLO_VALID_LINK_ID 1574 * or if additional validation is done. 1575 */ 1576 static unsigned int nl80211_link_id(struct nlattr **attrs) 1577 { 1578 struct nlattr *linkid = attrs[NL80211_ATTR_MLO_LINK_ID]; 1579 1580 return nla_get_u8_default(linkid, 0); 1581 } 1582 1583 static int nl80211_link_id_or_invalid(struct nlattr **attrs) 1584 { 1585 struct nlattr *linkid = attrs[NL80211_ATTR_MLO_LINK_ID]; 1586 1587 if (!linkid) 1588 return -1; 1589 1590 return nla_get_u8(linkid); 1591 } 1592 1593 struct key_parse { 1594 struct key_params p; 1595 int idx; 1596 int type; 1597 bool def, defmgmt, defbeacon; 1598 bool def_uni, def_multi; 1599 }; 1600 1601 static int nl80211_parse_key_new(struct genl_info *info, struct nlattr *key, 1602 struct key_parse *k) 1603 { 1604 struct nlattr *tb[NL80211_KEY_MAX + 1]; 1605 int err = nla_parse_nested_deprecated(tb, NL80211_KEY_MAX, key, 1606 nl80211_key_policy, 1607 info->extack); 1608 if (err) 1609 return err; 1610 1611 k->def = !!tb[NL80211_KEY_DEFAULT]; 1612 k->defmgmt = !!tb[NL80211_KEY_DEFAULT_MGMT]; 1613 k->defbeacon = !!tb[NL80211_KEY_DEFAULT_BEACON]; 1614 1615 if (k->def) { 1616 k->def_uni = true; 1617 k->def_multi = true; 1618 } 1619 if (k->defmgmt || k->defbeacon) 1620 k->def_multi = true; 1621 1622 if (tb[NL80211_KEY_IDX]) 1623 k->idx = nla_get_u8(tb[NL80211_KEY_IDX]); 1624 1625 if (tb[NL80211_KEY_DATA]) { 1626 k->p.key = nla_data(tb[NL80211_KEY_DATA]); 1627 k->p.key_len = nla_len(tb[NL80211_KEY_DATA]); 1628 } 1629 1630 if (tb[NL80211_KEY_SEQ]) { 1631 k->p.seq = nla_data(tb[NL80211_KEY_SEQ]); 1632 k->p.seq_len = nla_len(tb[NL80211_KEY_SEQ]); 1633 } 1634 1635 if (tb[NL80211_KEY_CIPHER]) 1636 k->p.cipher = nla_get_u32(tb[NL80211_KEY_CIPHER]); 1637 1638 if (tb[NL80211_KEY_TYPE]) 1639 k->type = nla_get_u32(tb[NL80211_KEY_TYPE]); 1640 1641 if (tb[NL80211_KEY_DEFAULT_TYPES]) { 1642 struct nlattr *kdt[NUM_NL80211_KEY_DEFAULT_TYPES]; 1643 1644 err = nla_parse_nested_deprecated(kdt, 1645 NUM_NL80211_KEY_DEFAULT_TYPES - 1, 1646 tb[NL80211_KEY_DEFAULT_TYPES], 1647 nl80211_key_default_policy, 1648 info->extack); 1649 if (err) 1650 return err; 1651 1652 k->def_uni = kdt[NL80211_KEY_DEFAULT_TYPE_UNICAST]; 1653 k->def_multi = kdt[NL80211_KEY_DEFAULT_TYPE_MULTICAST]; 1654 } 1655 1656 if (tb[NL80211_KEY_MODE]) 1657 k->p.mode = nla_get_u8(tb[NL80211_KEY_MODE]); 1658 1659 if (tb[NL80211_KEY_LTF_SEED]) { 1660 k->p.ltf_keyseed = nla_data(tb[NL80211_KEY_LTF_SEED]); 1661 k->p.ltf_keyseed_len = nla_len(tb[NL80211_KEY_LTF_SEED]); 1662 } 1663 1664 return 0; 1665 } 1666 1667 static int nl80211_parse_key_old(struct genl_info *info, struct key_parse *k) 1668 { 1669 if (info->attrs[NL80211_ATTR_KEY_DATA]) { 1670 k->p.key = nla_data(info->attrs[NL80211_ATTR_KEY_DATA]); 1671 k->p.key_len = nla_len(info->attrs[NL80211_ATTR_KEY_DATA]); 1672 } 1673 1674 if (info->attrs[NL80211_ATTR_KEY_SEQ]) { 1675 k->p.seq = nla_data(info->attrs[NL80211_ATTR_KEY_SEQ]); 1676 k->p.seq_len = nla_len(info->attrs[NL80211_ATTR_KEY_SEQ]); 1677 } 1678 1679 if (info->attrs[NL80211_ATTR_KEY_IDX]) 1680 k->idx = nla_get_u8(info->attrs[NL80211_ATTR_KEY_IDX]); 1681 1682 if (info->attrs[NL80211_ATTR_KEY_CIPHER]) 1683 k->p.cipher = nla_get_u32(info->attrs[NL80211_ATTR_KEY_CIPHER]); 1684 1685 k->def = !!info->attrs[NL80211_ATTR_KEY_DEFAULT]; 1686 k->defmgmt = !!info->attrs[NL80211_ATTR_KEY_DEFAULT_MGMT]; 1687 1688 if (k->def) { 1689 k->def_uni = true; 1690 k->def_multi = true; 1691 } 1692 if (k->defmgmt) 1693 k->def_multi = true; 1694 1695 if (info->attrs[NL80211_ATTR_KEY_TYPE]) 1696 k->type = nla_get_u32(info->attrs[NL80211_ATTR_KEY_TYPE]); 1697 1698 if (info->attrs[NL80211_ATTR_KEY_DEFAULT_TYPES]) { 1699 struct nlattr *kdt[NUM_NL80211_KEY_DEFAULT_TYPES]; 1700 int err = nla_parse_nested_deprecated(kdt, 1701 NUM_NL80211_KEY_DEFAULT_TYPES - 1, 1702 info->attrs[NL80211_ATTR_KEY_DEFAULT_TYPES], 1703 nl80211_key_default_policy, 1704 info->extack); 1705 if (err) 1706 return err; 1707 1708 k->def_uni = kdt[NL80211_KEY_DEFAULT_TYPE_UNICAST]; 1709 k->def_multi = kdt[NL80211_KEY_DEFAULT_TYPE_MULTICAST]; 1710 } 1711 1712 return 0; 1713 } 1714 1715 static int nl80211_parse_key(struct genl_info *info, struct key_parse *k) 1716 { 1717 int err; 1718 1719 memset(k, 0, sizeof(*k)); 1720 k->idx = -1; 1721 k->type = -1; 1722 1723 if (info->attrs[NL80211_ATTR_KEY]) 1724 err = nl80211_parse_key_new(info, info->attrs[NL80211_ATTR_KEY], k); 1725 else 1726 err = nl80211_parse_key_old(info, k); 1727 1728 if (err) 1729 return err; 1730 1731 if ((k->def ? 1 : 0) + (k->defmgmt ? 1 : 0) + 1732 (k->defbeacon ? 1 : 0) > 1) { 1733 GENL_SET_ERR_MSG(info, 1734 "key with multiple default flags is invalid"); 1735 return -EINVAL; 1736 } 1737 1738 if (k->defmgmt || k->defbeacon) { 1739 if (k->def_uni || !k->def_multi) { 1740 GENL_SET_ERR_MSG(info, 1741 "defmgmt/defbeacon key must be mcast"); 1742 return -EINVAL; 1743 } 1744 } 1745 1746 if (k->idx != -1) { 1747 if (k->defmgmt) { 1748 if (k->idx < 4 || k->idx > 5) { 1749 GENL_SET_ERR_MSG(info, 1750 "defmgmt key idx not 4 or 5"); 1751 return -EINVAL; 1752 } 1753 } else if (k->defbeacon) { 1754 if (k->idx < 6 || k->idx > 7) { 1755 GENL_SET_ERR_MSG(info, 1756 "defbeacon key idx not 6 or 7"); 1757 return -EINVAL; 1758 } 1759 } else if (k->def) { 1760 if (k->idx < 0 || k->idx > 3) { 1761 GENL_SET_ERR_MSG(info, "def key idx not 0-3"); 1762 return -EINVAL; 1763 } 1764 } else { 1765 if (k->idx < 0 || k->idx > 7) { 1766 GENL_SET_ERR_MSG(info, "key idx not 0-7"); 1767 return -EINVAL; 1768 } 1769 } 1770 } 1771 1772 return 0; 1773 } 1774 1775 static struct cfg80211_cached_keys * 1776 nl80211_parse_connkeys(struct cfg80211_registered_device *rdev, 1777 struct wireless_dev *wdev, 1778 struct genl_info *info, bool *no_ht) 1779 { 1780 struct nlattr *keys = info->attrs[NL80211_ATTR_KEYS]; 1781 struct key_parse parse; 1782 struct nlattr *key; 1783 struct cfg80211_cached_keys *result; 1784 int rem, err, def = 0; 1785 bool have_key = false; 1786 1787 nla_for_each_nested(key, keys, rem) { 1788 have_key = true; 1789 break; 1790 } 1791 1792 if (!have_key) 1793 return NULL; 1794 1795 result = kzalloc_obj(*result); 1796 if (!result) 1797 return ERR_PTR(-ENOMEM); 1798 1799 result->def = -1; 1800 1801 nla_for_each_nested(key, keys, rem) { 1802 memset(&parse, 0, sizeof(parse)); 1803 parse.idx = -1; 1804 1805 err = nl80211_parse_key_new(info, key, &parse); 1806 if (err) 1807 goto error; 1808 err = -EINVAL; 1809 if (!parse.p.key) 1810 goto error; 1811 if (parse.idx < 0 || parse.idx > 3) { 1812 GENL_SET_ERR_MSG(info, "key index out of range [0-3]"); 1813 goto error; 1814 } 1815 if (parse.def) { 1816 if (def) { 1817 GENL_SET_ERR_MSG(info, 1818 "only one key can be default"); 1819 goto error; 1820 } 1821 def = 1; 1822 result->def = parse.idx; 1823 if (!parse.def_uni || !parse.def_multi) 1824 goto error; 1825 } else if (parse.defmgmt) 1826 goto error; 1827 err = cfg80211_validate_key_settings(rdev, wdev, &parse.p, 1828 parse.idx, false, NULL); 1829 if (err) 1830 goto error; 1831 if (parse.p.cipher != WLAN_CIPHER_SUITE_WEP40 && 1832 parse.p.cipher != WLAN_CIPHER_SUITE_WEP104) { 1833 GENL_SET_ERR_MSG(info, "connect key must be WEP"); 1834 err = -EINVAL; 1835 goto error; 1836 } 1837 result->params[parse.idx].cipher = parse.p.cipher; 1838 result->params[parse.idx].key_len = parse.p.key_len; 1839 result->params[parse.idx].key = result->data[parse.idx]; 1840 memcpy(result->data[parse.idx], parse.p.key, parse.p.key_len); 1841 1842 /* must be WEP key if we got here */ 1843 if (no_ht) 1844 *no_ht = true; 1845 } 1846 1847 if (result->def < 0) { 1848 err = -EINVAL; 1849 GENL_SET_ERR_MSG(info, "need a default/TX key"); 1850 goto error; 1851 } 1852 1853 return result; 1854 error: 1855 kfree_sensitive(result); 1856 return ERR_PTR(err); 1857 } 1858 1859 static int nl80211_key_allowed(struct wireless_dev *wdev) 1860 { 1861 lockdep_assert_wiphy(wdev->wiphy); 1862 1863 switch (wdev->iftype) { 1864 case NL80211_IFTYPE_AP: 1865 case NL80211_IFTYPE_AP_VLAN: 1866 case NL80211_IFTYPE_P2P_GO: 1867 case NL80211_IFTYPE_MESH_POINT: 1868 break; 1869 case NL80211_IFTYPE_ADHOC: 1870 if (wdev->u.ibss.current_bss) 1871 return 0; 1872 return -ENOLINK; 1873 case NL80211_IFTYPE_STATION: 1874 case NL80211_IFTYPE_P2P_CLIENT: 1875 if (wdev->connected || 1876 (wiphy_ext_feature_isset(wdev->wiphy, 1877 NL80211_EXT_FEATURE_ASSOC_FRAME_ENCRYPTION))) 1878 return 0; 1879 return -ENOLINK; 1880 case NL80211_IFTYPE_NAN: 1881 case NL80211_IFTYPE_NAN_DATA: 1882 if (wiphy_ext_feature_isset(wdev->wiphy, 1883 NL80211_EXT_FEATURE_SECURE_NAN)) 1884 return 0; 1885 return -EINVAL; 1886 case NL80211_IFTYPE_PD: 1887 if (wiphy_ext_feature_isset(wdev->wiphy, 1888 NL80211_EXT_FEATURE_SECURE_RTT)) 1889 return 0; 1890 return -EINVAL; 1891 case NL80211_IFTYPE_UNSPECIFIED: 1892 case NL80211_IFTYPE_OCB: 1893 case NL80211_IFTYPE_MONITOR: 1894 case NL80211_IFTYPE_P2P_DEVICE: 1895 case NL80211_IFTYPE_WDS: 1896 case NUM_NL80211_IFTYPES: 1897 return -EINVAL; 1898 } 1899 1900 return 0; 1901 } 1902 1903 static struct ieee80211_channel *nl80211_get_valid_chan(struct wiphy *wiphy, 1904 u32 freq) 1905 { 1906 struct ieee80211_channel *chan; 1907 1908 chan = ieee80211_get_channel_khz(wiphy, freq); 1909 if (!chan || chan->flags & IEEE80211_CHAN_DISABLED) 1910 return NULL; 1911 return chan; 1912 } 1913 1914 static int nl80211_put_iftypes(struct sk_buff *msg, u32 attr, u16 ifmodes) 1915 { 1916 struct nlattr *nl_modes = nla_nest_start_noflag(msg, attr); 1917 int i; 1918 1919 if (!nl_modes) 1920 goto nla_put_failure; 1921 1922 i = 0; 1923 while (ifmodes) { 1924 if ((ifmodes & 1) && nla_put_flag(msg, i)) 1925 goto nla_put_failure; 1926 ifmodes >>= 1; 1927 i++; 1928 } 1929 1930 nla_nest_end(msg, nl_modes); 1931 return 0; 1932 1933 nla_put_failure: 1934 return -ENOBUFS; 1935 } 1936 1937 static int nl80211_put_ifcomb_data(struct sk_buff *msg, bool large, int idx, 1938 const struct ieee80211_iface_combination *c, 1939 u16 nested) 1940 { 1941 struct nlattr *nl_combi, *nl_limits; 1942 int i; 1943 1944 nl_combi = nla_nest_start_noflag(msg, idx | nested); 1945 if (!nl_combi) 1946 goto nla_put_failure; 1947 1948 nl_limits = nla_nest_start_noflag(msg, NL80211_IFACE_COMB_LIMITS | 1949 nested); 1950 if (!nl_limits) 1951 goto nla_put_failure; 1952 1953 for (i = 0; i < c->n_limits; i++) { 1954 struct nlattr *nl_limit; 1955 1956 nl_limit = nla_nest_start_noflag(msg, i + 1); 1957 if (!nl_limit) 1958 goto nla_put_failure; 1959 if (nla_put_u32(msg, NL80211_IFACE_LIMIT_MAX, c->limits[i].max)) 1960 goto nla_put_failure; 1961 if (nl80211_put_iftypes(msg, NL80211_IFACE_LIMIT_TYPES, 1962 c->limits[i].types)) 1963 goto nla_put_failure; 1964 nla_nest_end(msg, nl_limit); 1965 } 1966 1967 nla_nest_end(msg, nl_limits); 1968 1969 if (c->beacon_int_infra_match && 1970 nla_put_flag(msg, NL80211_IFACE_COMB_STA_AP_BI_MATCH)) 1971 goto nla_put_failure; 1972 if (nla_put_u32(msg, NL80211_IFACE_COMB_NUM_CHANNELS, 1973 c->num_different_channels) || 1974 nla_put_u32(msg, NL80211_IFACE_COMB_MAXNUM, 1975 c->max_interfaces)) 1976 goto nla_put_failure; 1977 if (large && 1978 (nla_put_u32(msg, NL80211_IFACE_COMB_RADAR_DETECT_WIDTHS, 1979 c->radar_detect_widths) || 1980 nla_put_u32(msg, NL80211_IFACE_COMB_RADAR_DETECT_REGIONS, 1981 c->radar_detect_regions))) 1982 goto nla_put_failure; 1983 if (c->beacon_int_min_gcd && 1984 nla_put_u32(msg, NL80211_IFACE_COMB_BI_MIN_GCD, 1985 c->beacon_int_min_gcd)) 1986 goto nla_put_failure; 1987 1988 nla_nest_end(msg, nl_combi); 1989 1990 return 0; 1991 nla_put_failure: 1992 return -ENOBUFS; 1993 } 1994 1995 static int nl80211_put_iface_combinations(struct wiphy *wiphy, 1996 struct sk_buff *msg, 1997 int attr, int radio, 1998 bool large, u16 nested) 1999 { 2000 const struct ieee80211_iface_combination *c; 2001 struct nlattr *nl_combis; 2002 int i, n; 2003 2004 nl_combis = nla_nest_start_noflag(msg, attr | nested); 2005 if (!nl_combis) 2006 goto nla_put_failure; 2007 2008 if (radio >= 0) { 2009 c = wiphy->radio[0].iface_combinations; 2010 n = wiphy->radio[0].n_iface_combinations; 2011 } else { 2012 c = wiphy->iface_combinations; 2013 n = wiphy->n_iface_combinations; 2014 } 2015 for (i = 0; i < n; i++) 2016 if (nl80211_put_ifcomb_data(msg, large, i + 1, &c[i], nested)) 2017 goto nla_put_failure; 2018 2019 nla_nest_end(msg, nl_combis); 2020 2021 return 0; 2022 nla_put_failure: 2023 return -ENOBUFS; 2024 } 2025 2026 #ifdef CONFIG_PM 2027 static int nl80211_send_wowlan_tcp_caps(struct cfg80211_registered_device *rdev, 2028 struct sk_buff *msg) 2029 { 2030 const struct wiphy_wowlan_tcp_support *tcp = rdev->wiphy.wowlan->tcp; 2031 struct nlattr *nl_tcp; 2032 2033 if (!tcp) 2034 return 0; 2035 2036 nl_tcp = nla_nest_start_noflag(msg, 2037 NL80211_WOWLAN_TRIG_TCP_CONNECTION); 2038 if (!nl_tcp) 2039 return -ENOBUFS; 2040 2041 if (nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD, 2042 tcp->data_payload_max)) 2043 return -ENOBUFS; 2044 2045 if (nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD, 2046 tcp->data_payload_max)) 2047 return -ENOBUFS; 2048 2049 if (tcp->seq && nla_put_flag(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ)) 2050 return -ENOBUFS; 2051 2052 if (tcp->tok && nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN, 2053 sizeof(*tcp->tok), tcp->tok)) 2054 return -ENOBUFS; 2055 2056 if (nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_INTERVAL, 2057 tcp->data_interval_max)) 2058 return -ENOBUFS; 2059 2060 if (nla_put_u32(msg, NL80211_WOWLAN_TCP_WAKE_PAYLOAD, 2061 tcp->wake_payload_max)) 2062 return -ENOBUFS; 2063 2064 nla_nest_end(msg, nl_tcp); 2065 return 0; 2066 } 2067 2068 static int nl80211_send_wowlan(struct sk_buff *msg, 2069 struct cfg80211_registered_device *rdev, 2070 bool large) 2071 { 2072 struct nlattr *nl_wowlan; 2073 2074 if (!rdev->wiphy.wowlan) 2075 return 0; 2076 2077 nl_wowlan = nla_nest_start_noflag(msg, 2078 NL80211_ATTR_WOWLAN_TRIGGERS_SUPPORTED); 2079 if (!nl_wowlan) 2080 return -ENOBUFS; 2081 2082 if (((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_ANY) && 2083 nla_put_flag(msg, NL80211_WOWLAN_TRIG_ANY)) || 2084 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_DISCONNECT) && 2085 nla_put_flag(msg, NL80211_WOWLAN_TRIG_DISCONNECT)) || 2086 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_MAGIC_PKT) && 2087 nla_put_flag(msg, NL80211_WOWLAN_TRIG_MAGIC_PKT)) || 2088 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_SUPPORTS_GTK_REKEY) && 2089 nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_SUPPORTED)) || 2090 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_GTK_REKEY_FAILURE) && 2091 nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE)) || 2092 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_EAP_IDENTITY_REQ) && 2093 nla_put_flag(msg, NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST)) || 2094 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_4WAY_HANDSHAKE) && 2095 nla_put_flag(msg, NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE)) || 2096 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_RFKILL_RELEASE) && 2097 nla_put_flag(msg, NL80211_WOWLAN_TRIG_RFKILL_RELEASE))) 2098 return -ENOBUFS; 2099 2100 if (rdev->wiphy.wowlan->n_patterns) { 2101 struct nl80211_pattern_support pat = { 2102 .max_patterns = rdev->wiphy.wowlan->n_patterns, 2103 .min_pattern_len = rdev->wiphy.wowlan->pattern_min_len, 2104 .max_pattern_len = rdev->wiphy.wowlan->pattern_max_len, 2105 .max_pkt_offset = rdev->wiphy.wowlan->max_pkt_offset, 2106 }; 2107 2108 if (nla_put(msg, NL80211_WOWLAN_TRIG_PKT_PATTERN, 2109 sizeof(pat), &pat)) 2110 return -ENOBUFS; 2111 } 2112 2113 if ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_NET_DETECT) && 2114 nla_put_u32(msg, NL80211_WOWLAN_TRIG_NET_DETECT, 2115 rdev->wiphy.wowlan->max_nd_match_sets)) 2116 return -ENOBUFS; 2117 2118 if (large && nl80211_send_wowlan_tcp_caps(rdev, msg)) 2119 return -ENOBUFS; 2120 2121 nla_nest_end(msg, nl_wowlan); 2122 2123 return 0; 2124 } 2125 #endif 2126 2127 static int nl80211_send_coalesce(struct sk_buff *msg, 2128 struct cfg80211_registered_device *rdev) 2129 { 2130 struct nl80211_coalesce_rule_support rule; 2131 2132 if (!rdev->wiphy.coalesce) 2133 return 0; 2134 2135 rule.max_rules = rdev->wiphy.coalesce->n_rules; 2136 rule.max_delay = rdev->wiphy.coalesce->max_delay; 2137 rule.pat.max_patterns = rdev->wiphy.coalesce->n_patterns; 2138 rule.pat.min_pattern_len = rdev->wiphy.coalesce->pattern_min_len; 2139 rule.pat.max_pattern_len = rdev->wiphy.coalesce->pattern_max_len; 2140 rule.pat.max_pkt_offset = rdev->wiphy.coalesce->max_pkt_offset; 2141 2142 if (nla_put(msg, NL80211_ATTR_COALESCE_RULE, sizeof(rule), &rule)) 2143 return -ENOBUFS; 2144 2145 return 0; 2146 } 2147 2148 static int 2149 nl80211_send_iftype_data(struct sk_buff *msg, 2150 const struct ieee80211_supported_band *sband, 2151 const struct ieee80211_sband_iftype_data *iftdata) 2152 { 2153 const struct ieee80211_sta_he_cap *he_cap = &iftdata->he_cap; 2154 const struct ieee80211_sta_eht_cap *eht_cap = &iftdata->eht_cap; 2155 const struct ieee80211_sta_uhr_cap *uhr_cap = &iftdata->uhr_cap; 2156 2157 if (nl80211_put_iftypes(msg, NL80211_BAND_IFTYPE_ATTR_IFTYPES, 2158 iftdata->types_mask)) 2159 return -ENOBUFS; 2160 2161 if (he_cap->has_he) { 2162 if (nla_put(msg, NL80211_BAND_IFTYPE_ATTR_HE_CAP_MAC, 2163 sizeof(he_cap->he_cap_elem.mac_cap_info), 2164 he_cap->he_cap_elem.mac_cap_info) || 2165 nla_put(msg, NL80211_BAND_IFTYPE_ATTR_HE_CAP_PHY, 2166 sizeof(he_cap->he_cap_elem.phy_cap_info), 2167 he_cap->he_cap_elem.phy_cap_info) || 2168 nla_put(msg, NL80211_BAND_IFTYPE_ATTR_HE_CAP_MCS_SET, 2169 sizeof(he_cap->he_mcs_nss_supp), 2170 &he_cap->he_mcs_nss_supp) || 2171 nla_put(msg, NL80211_BAND_IFTYPE_ATTR_HE_CAP_PPE, 2172 sizeof(he_cap->ppe_thres), he_cap->ppe_thres)) 2173 return -ENOBUFS; 2174 } 2175 2176 if (eht_cap->has_eht && he_cap->has_he) { 2177 u8 mcs_nss_size, ppe_thresh_size; 2178 u16 ppe_thres_hdr; 2179 bool is_ap; 2180 2181 is_ap = iftdata->types_mask & BIT(NL80211_IFTYPE_AP) || 2182 iftdata->types_mask & BIT(NL80211_IFTYPE_P2P_GO); 2183 2184 mcs_nss_size = 2185 ieee80211_eht_mcs_nss_size(&he_cap->he_cap_elem, 2186 &eht_cap->eht_cap_elem, 2187 is_ap); 2188 2189 ppe_thres_hdr = get_unaligned_le16(&eht_cap->eht_ppe_thres[0]); 2190 ppe_thresh_size = 2191 ieee80211_eht_ppe_size(ppe_thres_hdr, 2192 eht_cap->eht_cap_elem.phy_cap_info); 2193 2194 if (nla_put(msg, NL80211_BAND_IFTYPE_ATTR_EHT_CAP_MAC, 2195 sizeof(eht_cap->eht_cap_elem.mac_cap_info), 2196 eht_cap->eht_cap_elem.mac_cap_info) || 2197 nla_put(msg, NL80211_BAND_IFTYPE_ATTR_EHT_CAP_PHY, 2198 sizeof(eht_cap->eht_cap_elem.phy_cap_info), 2199 eht_cap->eht_cap_elem.phy_cap_info) || 2200 nla_put(msg, NL80211_BAND_IFTYPE_ATTR_EHT_CAP_MCS_SET, 2201 mcs_nss_size, &eht_cap->eht_mcs_nss_supp) || 2202 nla_put(msg, NL80211_BAND_IFTYPE_ATTR_EHT_CAP_PPE, 2203 ppe_thresh_size, eht_cap->eht_ppe_thres)) 2204 return -ENOBUFS; 2205 } 2206 2207 if (uhr_cap->has_uhr) { 2208 if (nla_put(msg, NL80211_BAND_IFTYPE_ATTR_UHR_CAP_MAC, 2209 sizeof(uhr_cap->mac), &uhr_cap->mac) || 2210 nla_put(msg, NL80211_BAND_IFTYPE_ATTR_UHR_CAP_PHY, 2211 sizeof(uhr_cap->phy), &uhr_cap->phy)) 2212 return -ENOBUFS; 2213 } 2214 2215 if (sband->band == NL80211_BAND_6GHZ && 2216 nla_put(msg, NL80211_BAND_IFTYPE_ATTR_HE_6GHZ_CAPA, 2217 sizeof(iftdata->he_6ghz_capa), 2218 &iftdata->he_6ghz_capa)) 2219 return -ENOBUFS; 2220 2221 if (iftdata->vendor_elems.data && iftdata->vendor_elems.len && 2222 nla_put(msg, NL80211_BAND_IFTYPE_ATTR_VENDOR_ELEMS, 2223 iftdata->vendor_elems.len, iftdata->vendor_elems.data)) 2224 return -ENOBUFS; 2225 2226 return 0; 2227 } 2228 2229 static int nl80211_send_band_rateinfo(struct sk_buff *msg, 2230 struct ieee80211_supported_band *sband, 2231 bool large) 2232 { 2233 struct nlattr *nl_rates, *nl_rate; 2234 struct ieee80211_rate *rate; 2235 int i; 2236 2237 /* add HT info */ 2238 if (sband->ht_cap.ht_supported && 2239 (nla_put(msg, NL80211_BAND_ATTR_HT_MCS_SET, 2240 sizeof(sband->ht_cap.mcs), 2241 &sband->ht_cap.mcs) || 2242 nla_put_u16(msg, NL80211_BAND_ATTR_HT_CAPA, 2243 sband->ht_cap.cap) || 2244 nla_put_u8(msg, NL80211_BAND_ATTR_HT_AMPDU_FACTOR, 2245 sband->ht_cap.ampdu_factor) || 2246 nla_put_u8(msg, NL80211_BAND_ATTR_HT_AMPDU_DENSITY, 2247 sband->ht_cap.ampdu_density))) 2248 return -ENOBUFS; 2249 2250 /* add VHT info */ 2251 if (sband->vht_cap.vht_supported && 2252 (nla_put(msg, NL80211_BAND_ATTR_VHT_MCS_SET, 2253 sizeof(sband->vht_cap.vht_mcs), 2254 &sband->vht_cap.vht_mcs) || 2255 nla_put_u32(msg, NL80211_BAND_ATTR_VHT_CAPA, 2256 sband->vht_cap.cap))) 2257 return -ENOBUFS; 2258 2259 if (large && sband->n_iftype_data) { 2260 struct nlattr *nl_iftype_data = 2261 nla_nest_start_noflag(msg, 2262 NL80211_BAND_ATTR_IFTYPE_DATA); 2263 const struct ieee80211_sband_iftype_data *iftd; 2264 int err; 2265 2266 if (!nl_iftype_data) 2267 return -ENOBUFS; 2268 2269 for_each_sband_iftype_data(sband, i, iftd) { 2270 struct nlattr *iftdata; 2271 2272 iftdata = nla_nest_start_noflag(msg, i + 1); 2273 if (!iftdata) 2274 return -ENOBUFS; 2275 2276 err = nl80211_send_iftype_data(msg, sband, iftd); 2277 if (err) 2278 return err; 2279 2280 nla_nest_end(msg, iftdata); 2281 } 2282 2283 nla_nest_end(msg, nl_iftype_data); 2284 } 2285 2286 /* add EDMG info */ 2287 if (large && sband->edmg_cap.channels && 2288 (nla_put_u8(msg, NL80211_BAND_ATTR_EDMG_CHANNELS, 2289 sband->edmg_cap.channels) || 2290 nla_put_u8(msg, NL80211_BAND_ATTR_EDMG_BW_CONFIG, 2291 sband->edmg_cap.bw_config))) 2292 2293 return -ENOBUFS; 2294 2295 /* add bitrates */ 2296 nl_rates = nla_nest_start_noflag(msg, NL80211_BAND_ATTR_RATES); 2297 if (!nl_rates) 2298 return -ENOBUFS; 2299 2300 for (i = 0; i < sband->n_bitrates; i++) { 2301 nl_rate = nla_nest_start_noflag(msg, i); 2302 if (!nl_rate) 2303 return -ENOBUFS; 2304 2305 rate = &sband->bitrates[i]; 2306 if (nla_put_u32(msg, NL80211_BITRATE_ATTR_RATE, 2307 rate->bitrate)) 2308 return -ENOBUFS; 2309 if ((rate->flags & IEEE80211_RATE_SHORT_PREAMBLE) && 2310 nla_put_flag(msg, 2311 NL80211_BITRATE_ATTR_2GHZ_SHORTPREAMBLE)) 2312 return -ENOBUFS; 2313 2314 nla_nest_end(msg, nl_rate); 2315 } 2316 2317 nla_nest_end(msg, nl_rates); 2318 2319 /* S1G capabilities */ 2320 if (sband->band == NL80211_BAND_S1GHZ && sband->s1g_cap.s1g && 2321 (nla_put(msg, NL80211_BAND_ATTR_S1G_CAPA, 2322 sizeof(sband->s1g_cap.cap), 2323 sband->s1g_cap.cap) || 2324 nla_put(msg, NL80211_BAND_ATTR_S1G_MCS_NSS_SET, 2325 sizeof(sband->s1g_cap.nss_mcs), 2326 sband->s1g_cap.nss_mcs))) 2327 return -ENOBUFS; 2328 2329 return 0; 2330 } 2331 2332 static int 2333 nl80211_send_mgmt_stypes(struct sk_buff *msg, 2334 const struct ieee80211_txrx_stypes *mgmt_stypes) 2335 { 2336 u16 stypes; 2337 struct nlattr *nl_ftypes, *nl_ifs; 2338 enum nl80211_iftype ift; 2339 int i; 2340 2341 if (!mgmt_stypes) 2342 return 0; 2343 2344 nl_ifs = nla_nest_start_noflag(msg, NL80211_ATTR_TX_FRAME_TYPES); 2345 if (!nl_ifs) 2346 return -ENOBUFS; 2347 2348 for (ift = 0; ift < NUM_NL80211_IFTYPES; ift++) { 2349 nl_ftypes = nla_nest_start_noflag(msg, ift); 2350 if (!nl_ftypes) 2351 return -ENOBUFS; 2352 i = 0; 2353 stypes = mgmt_stypes[ift].tx; 2354 while (stypes) { 2355 if ((stypes & 1) && 2356 nla_put_u16(msg, NL80211_ATTR_FRAME_TYPE, 2357 (i << 4) | IEEE80211_FTYPE_MGMT)) 2358 return -ENOBUFS; 2359 stypes >>= 1; 2360 i++; 2361 } 2362 nla_nest_end(msg, nl_ftypes); 2363 } 2364 2365 nla_nest_end(msg, nl_ifs); 2366 2367 nl_ifs = nla_nest_start_noflag(msg, NL80211_ATTR_RX_FRAME_TYPES); 2368 if (!nl_ifs) 2369 return -ENOBUFS; 2370 2371 for (ift = 0; ift < NUM_NL80211_IFTYPES; ift++) { 2372 nl_ftypes = nla_nest_start_noflag(msg, ift); 2373 if (!nl_ftypes) 2374 return -ENOBUFS; 2375 i = 0; 2376 stypes = mgmt_stypes[ift].rx; 2377 while (stypes) { 2378 if ((stypes & 1) && 2379 nla_put_u16(msg, NL80211_ATTR_FRAME_TYPE, 2380 (i << 4) | IEEE80211_FTYPE_MGMT)) 2381 return -ENOBUFS; 2382 stypes >>= 1; 2383 i++; 2384 } 2385 nla_nest_end(msg, nl_ftypes); 2386 } 2387 nla_nest_end(msg, nl_ifs); 2388 2389 return 0; 2390 } 2391 2392 #define CMD(op, n) \ 2393 do { \ 2394 if (rdev->ops->op) { \ 2395 i++; \ 2396 if (nla_put_u32(msg, i, NL80211_CMD_ ## n)) \ 2397 goto nla_put_failure; \ 2398 } \ 2399 } while (0) 2400 2401 static int nl80211_add_commands_unsplit(struct cfg80211_registered_device *rdev, 2402 struct sk_buff *msg) 2403 { 2404 int i = 0; 2405 2406 /* 2407 * do *NOT* add anything into this function, new things need to be 2408 * advertised only to new versions of userspace that can deal with 2409 * the split (and they can't possibly care about new features... 2410 */ 2411 CMD(add_virtual_intf, NEW_INTERFACE); 2412 CMD(change_virtual_intf, SET_INTERFACE); 2413 CMD(add_key, NEW_KEY); 2414 CMD(start_ap, START_AP); 2415 CMD(add_station, NEW_STATION); 2416 CMD(add_mpath, NEW_MPATH); 2417 CMD(update_mesh_config, SET_MESH_CONFIG); 2418 CMD(change_bss, SET_BSS); 2419 CMD(auth, AUTHENTICATE); 2420 CMD(assoc, ASSOCIATE); 2421 CMD(deauth, DEAUTHENTICATE); 2422 CMD(disassoc, DISASSOCIATE); 2423 CMD(join_ibss, JOIN_IBSS); 2424 CMD(join_mesh, JOIN_MESH); 2425 CMD(set_pmksa, SET_PMKSA); 2426 CMD(del_pmksa, DEL_PMKSA); 2427 CMD(flush_pmksa, FLUSH_PMKSA); 2428 if (rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL) 2429 CMD(remain_on_channel, REMAIN_ON_CHANNEL); 2430 CMD(set_bitrate_mask, SET_TX_BITRATE_MASK); 2431 CMD(mgmt_tx, FRAME); 2432 CMD(mgmt_tx_cancel_wait, FRAME_WAIT_CANCEL); 2433 if (rdev->wiphy.flags & WIPHY_FLAG_NETNS_OK) { 2434 i++; 2435 if (nla_put_u32(msg, i, NL80211_CMD_SET_WIPHY_NETNS)) 2436 goto nla_put_failure; 2437 } 2438 if (rdev->ops->set_monitor_channel || rdev->ops->start_ap || 2439 rdev->ops->join_mesh) { 2440 i++; 2441 if (nla_put_u32(msg, i, NL80211_CMD_SET_CHANNEL)) 2442 goto nla_put_failure; 2443 } 2444 if (rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) { 2445 CMD(tdls_mgmt, TDLS_MGMT); 2446 CMD(tdls_oper, TDLS_OPER); 2447 } 2448 if (rdev->wiphy.max_sched_scan_reqs) 2449 CMD(sched_scan_start, START_SCHED_SCAN); 2450 CMD(probe_peer, PROBE_PEER); 2451 CMD(set_noack_map, SET_NOACK_MAP); 2452 if (rdev->wiphy.flags & WIPHY_FLAG_REPORTS_OBSS) { 2453 i++; 2454 if (nla_put_u32(msg, i, NL80211_CMD_REGISTER_BEACONS)) 2455 goto nla_put_failure; 2456 } 2457 CMD(start_p2p_device, START_P2P_DEVICE); 2458 CMD(set_mcast_rate, SET_MCAST_RATE); 2459 #ifdef CONFIG_NL80211_TESTMODE 2460 CMD(testmode_cmd, TESTMODE); 2461 #endif 2462 2463 if (rdev->ops->connect || rdev->ops->auth) { 2464 i++; 2465 if (nla_put_u32(msg, i, NL80211_CMD_CONNECT)) 2466 goto nla_put_failure; 2467 } 2468 2469 if (rdev->ops->disconnect || rdev->ops->deauth) { 2470 i++; 2471 if (nla_put_u32(msg, i, NL80211_CMD_DISCONNECT)) 2472 goto nla_put_failure; 2473 } 2474 2475 return i; 2476 nla_put_failure: 2477 return -ENOBUFS; 2478 } 2479 2480 static int 2481 nl80211_send_pmsr_ftm_capa(const struct cfg80211_pmsr_capabilities *cap, 2482 struct sk_buff *msg) 2483 { 2484 struct nlattr *ftm; 2485 2486 if (!cap->ftm.supported) 2487 return 0; 2488 2489 ftm = nla_nest_start_noflag(msg, NL80211_PMSR_TYPE_FTM); 2490 if (!ftm) 2491 return -ENOBUFS; 2492 2493 if (cap->ftm.asap && nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_ASAP)) 2494 return -ENOBUFS; 2495 if (cap->ftm.non_asap && 2496 nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_NON_ASAP)) 2497 return -ENOBUFS; 2498 if (cap->ftm.request_lci && 2499 nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_REQ_LCI)) 2500 return -ENOBUFS; 2501 if (cap->ftm.request_civicloc && 2502 nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_REQ_CIVICLOC)) 2503 return -ENOBUFS; 2504 if (nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_PREAMBLES, 2505 cap->ftm.preambles)) 2506 return -ENOBUFS; 2507 if (nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_BANDWIDTHS, 2508 cap->ftm.bandwidths)) 2509 return -ENOBUFS; 2510 if (cap->ftm.max_bursts_exponent >= 0 && 2511 nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_MAX_BURSTS_EXPONENT, 2512 cap->ftm.max_bursts_exponent)) 2513 return -ENOBUFS; 2514 if (cap->ftm.max_ftms_per_burst && 2515 nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_MAX_FTMS_PER_BURST, 2516 cap->ftm.max_ftms_per_burst)) 2517 return -ENOBUFS; 2518 if (cap->ftm.trigger_based && 2519 nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_TRIGGER_BASED)) 2520 return -ENOBUFS; 2521 if (cap->ftm.non_trigger_based && 2522 nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_NON_TRIGGER_BASED)) 2523 return -ENOBUFS; 2524 if (cap->ftm.support_6ghz && 2525 nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_6GHZ_SUPPORT)) 2526 return -ENOBUFS; 2527 if (nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_MAX_TX_LTF_REP, 2528 cap->ftm.max_tx_ltf_rep)) 2529 return -ENOBUFS; 2530 if (nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_MAX_RX_LTF_REP, 2531 cap->ftm.max_rx_ltf_rep)) 2532 return -ENOBUFS; 2533 if (nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_MAX_TX_STS, 2534 cap->ftm.max_tx_sts)) 2535 return -ENOBUFS; 2536 if (nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_MAX_RX_STS, 2537 cap->ftm.max_rx_sts)) 2538 return -ENOBUFS; 2539 if (cap->ftm.max_total_ltf_tx > 0 && 2540 nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_MAX_TOTAL_LTF_TX, 2541 cap->ftm.max_total_ltf_tx)) 2542 return -ENOBUFS; 2543 if (cap->ftm.max_total_ltf_rx > 0 && 2544 nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_MAX_TOTAL_LTF_RX, 2545 cap->ftm.max_total_ltf_rx)) 2546 return -ENOBUFS; 2547 2548 if (cap->ftm.ista.support_ntb || cap->ftm.ista.support_tb || 2549 cap->ftm.ista.support_edca) { 2550 struct nlattr *ista_caps; 2551 2552 ista_caps = nla_nest_start_noflag(msg, 2553 NL80211_PMSR_FTM_CAPA_ATTR_ISTA_CAPS); 2554 if (!ista_caps) 2555 return -ENOBUFS; 2556 if (cap->ftm.ista.support_ntb && 2557 nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_SUPPORT_NTB)) 2558 return -ENOBUFS; 2559 if (cap->ftm.ista.support_tb && 2560 nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_SUPPORT_TB)) 2561 return -ENOBUFS; 2562 if (cap->ftm.ista.support_edca && 2563 nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_SUPPORT_EDCA)) 2564 return -ENOBUFS; 2565 if (cap->ftm.ista.max_peers && 2566 nla_put_u32(msg, NL80211_PMSR_ATTR_MAX_PEER_ISTA_ROLE, 2567 cap->ftm.ista.max_peers)) 2568 return -ENOBUFS; 2569 nla_nest_end(msg, ista_caps); 2570 } 2571 2572 if (cap->ftm.rsta.support_ntb || cap->ftm.rsta.support_tb || 2573 cap->ftm.rsta.support_edca) { 2574 struct nlattr *rsta_caps; 2575 2576 /* 2577 * Set the generic RSTA_SUPPORT flag if any of the specific 2578 * ranging modes is supported to maintain the backward 2579 * compatibility. 2580 */ 2581 if (nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_RSTA_SUPPORT)) 2582 return -ENOBUFS; 2583 2584 rsta_caps = nla_nest_start_noflag(msg, 2585 NL80211_PMSR_FTM_CAPA_ATTR_RSTA_CAPS); 2586 if (!rsta_caps) 2587 return -ENOBUFS; 2588 if (cap->ftm.rsta.support_ntb && 2589 nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_SUPPORT_NTB)) 2590 return -ENOBUFS; 2591 if (cap->ftm.rsta.support_tb && 2592 nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_SUPPORT_TB)) 2593 return -ENOBUFS; 2594 if (cap->ftm.rsta.support_edca && 2595 nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_SUPPORT_EDCA)) 2596 return -ENOBUFS; 2597 if (cap->ftm.rsta.max_peers && 2598 nla_put_u32(msg, NL80211_PMSR_ATTR_MAX_PEER_RSTA_ROLE, 2599 cap->ftm.rsta.max_peers)) 2600 return -ENOBUFS; 2601 nla_nest_end(msg, rsta_caps); 2602 } 2603 2604 if (cap->ftm.max_no_of_tx_antennas && 2605 nla_put_u8(msg, NL80211_PMSR_FTM_CAPA_ATTR_MAX_NUM_TX_ANTENNAS, 2606 cap->ftm.max_no_of_tx_antennas)) 2607 return -ENOBUFS; 2608 2609 if (cap->ftm.max_no_of_rx_antennas && 2610 nla_put_u8(msg, NL80211_PMSR_FTM_CAPA_ATTR_MAX_NUM_RX_ANTENNAS, 2611 cap->ftm.max_no_of_rx_antennas)) 2612 return -ENOBUFS; 2613 2614 if (cap->ftm.min_allowed_ranging_interval_edca && 2615 nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_MIN_INTERVAL_EDCA, 2616 cap->ftm.min_allowed_ranging_interval_edca)) 2617 return -ENOBUFS; 2618 2619 if (cap->ftm.min_allowed_ranging_interval_ntb && 2620 nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_MIN_INTERVAL_NTB, 2621 cap->ftm.min_allowed_ranging_interval_ntb)) 2622 return -ENOBUFS; 2623 2624 if (cap->ftm.type.infra_support || cap->ftm.type.pd_support) { 2625 struct nlattr *pd_caps; 2626 2627 pd_caps = nla_nest_start_noflag(msg, 2628 NL80211_PMSR_FTM_CAPA_ATTR_TYPE_CAPS); 2629 if (!pd_caps) 2630 return -ENOBUFS; 2631 2632 if (cap->ftm.type.infra_support && 2633 nla_put_flag(msg, NL80211_PMSR_FTM_TYPE_CAPA_ATTR_INFRA_SUPPORT)) 2634 return -ENOBUFS; 2635 2636 if (cap->ftm.type.pd_support && 2637 nla_put_flag(msg, NL80211_PMSR_FTM_TYPE_CAPA_ATTR_PD_SUPPORT)) 2638 return -ENOBUFS; 2639 2640 nla_nest_end(msg, pd_caps); 2641 } 2642 2643 if (cap->ftm.concurrent_ista_rsta_support && 2644 nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_CONCURRENT_ISTA_RSTA_SUPPORT)) 2645 return -ENOBUFS; 2646 2647 if (cap->ftm.type.pd_support) { 2648 if (cap->ftm.pd_preambles && 2649 nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_PD_PREAMBLES, 2650 cap->ftm.pd_preambles)) 2651 return -ENOBUFS; 2652 if (cap->ftm.pd_bandwidths && 2653 nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_PD_BANDWIDTHS, 2654 cap->ftm.pd_bandwidths)) 2655 return -ENOBUFS; 2656 } 2657 2658 nla_nest_end(msg, ftm); 2659 return 0; 2660 } 2661 2662 static int nl80211_send_pmsr_capa(struct cfg80211_registered_device *rdev, 2663 struct sk_buff *msg) 2664 { 2665 const struct cfg80211_pmsr_capabilities *cap = rdev->wiphy.pmsr_capa; 2666 struct nlattr *pmsr, *caps; 2667 2668 if (!cap) 2669 return 0; 2670 2671 /* 2672 * we don't need to clean up anything here since the caller 2673 * will genlmsg_cancel() if we fail 2674 */ 2675 2676 pmsr = nla_nest_start_noflag(msg, NL80211_ATTR_PEER_MEASUREMENTS); 2677 if (!pmsr) 2678 return -ENOBUFS; 2679 2680 if (nla_put_u32(msg, NL80211_PMSR_ATTR_MAX_PEERS, cap->max_peers)) 2681 return -ENOBUFS; 2682 2683 if (cap->report_ap_tsf && 2684 nla_put_flag(msg, NL80211_PMSR_ATTR_REPORT_AP_TSF)) 2685 return -ENOBUFS; 2686 2687 if (cap->randomize_mac_addr && 2688 nla_put_flag(msg, NL80211_PMSR_ATTR_RANDOMIZE_MAC_ADDR)) 2689 return -ENOBUFS; 2690 2691 caps = nla_nest_start_noflag(msg, NL80211_PMSR_ATTR_TYPE_CAPA); 2692 if (!caps) 2693 return -ENOBUFS; 2694 2695 if (nl80211_send_pmsr_ftm_capa(cap, msg)) 2696 return -ENOBUFS; 2697 2698 nla_nest_end(msg, caps); 2699 nla_nest_end(msg, pmsr); 2700 2701 return 0; 2702 } 2703 2704 static int 2705 nl80211_put_iftype_akm_suites(struct cfg80211_registered_device *rdev, 2706 struct sk_buff *msg) 2707 { 2708 int i; 2709 struct nlattr *nested, *nested_akms; 2710 const struct wiphy_iftype_akm_suites *iftype_akms; 2711 2712 if (!rdev->wiphy.num_iftype_akm_suites || 2713 !rdev->wiphy.iftype_akm_suites) 2714 return 0; 2715 2716 nested = nla_nest_start(msg, NL80211_ATTR_IFTYPE_AKM_SUITES); 2717 if (!nested) 2718 return -ENOBUFS; 2719 2720 for (i = 0; i < rdev->wiphy.num_iftype_akm_suites; i++) { 2721 nested_akms = nla_nest_start(msg, i + 1); 2722 if (!nested_akms) 2723 return -ENOBUFS; 2724 2725 iftype_akms = &rdev->wiphy.iftype_akm_suites[i]; 2726 2727 if (nl80211_put_iftypes(msg, NL80211_IFTYPE_AKM_ATTR_IFTYPES, 2728 iftype_akms->iftypes_mask)) 2729 return -ENOBUFS; 2730 2731 if (nla_put(msg, NL80211_IFTYPE_AKM_ATTR_SUITES, 2732 sizeof(u32) * iftype_akms->n_akm_suites, 2733 iftype_akms->akm_suites)) { 2734 return -ENOBUFS; 2735 } 2736 nla_nest_end(msg, nested_akms); 2737 } 2738 2739 nla_nest_end(msg, nested); 2740 2741 return 0; 2742 } 2743 2744 static int 2745 nl80211_put_tid_config_support(struct cfg80211_registered_device *rdev, 2746 struct sk_buff *msg) 2747 { 2748 struct nlattr *supp; 2749 2750 if (!rdev->wiphy.tid_config_support.vif && 2751 !rdev->wiphy.tid_config_support.peer) 2752 return 0; 2753 2754 supp = nla_nest_start(msg, NL80211_ATTR_TID_CONFIG); 2755 if (!supp) 2756 return -ENOSPC; 2757 2758 if (rdev->wiphy.tid_config_support.vif && 2759 nla_put_u64_64bit(msg, NL80211_TID_CONFIG_ATTR_VIF_SUPP, 2760 rdev->wiphy.tid_config_support.vif, 2761 NL80211_TID_CONFIG_ATTR_PAD)) 2762 goto fail; 2763 2764 if (rdev->wiphy.tid_config_support.peer && 2765 nla_put_u64_64bit(msg, NL80211_TID_CONFIG_ATTR_PEER_SUPP, 2766 rdev->wiphy.tid_config_support.peer, 2767 NL80211_TID_CONFIG_ATTR_PAD)) 2768 goto fail; 2769 2770 /* for now we just use the same value ... makes more sense */ 2771 if (nla_put_u8(msg, NL80211_TID_CONFIG_ATTR_RETRY_SHORT, 2772 rdev->wiphy.tid_config_support.max_retry)) 2773 goto fail; 2774 if (nla_put_u8(msg, NL80211_TID_CONFIG_ATTR_RETRY_LONG, 2775 rdev->wiphy.tid_config_support.max_retry)) 2776 goto fail; 2777 2778 nla_nest_end(msg, supp); 2779 2780 return 0; 2781 fail: 2782 nla_nest_cancel(msg, supp); 2783 return -ENOBUFS; 2784 } 2785 2786 static int 2787 nl80211_put_sar_specs(struct cfg80211_registered_device *rdev, 2788 struct sk_buff *msg) 2789 { 2790 struct nlattr *sar_capa, *specs, *sub_freq_range; 2791 u8 num_freq_ranges; 2792 int i; 2793 2794 if (!rdev->wiphy.sar_capa) 2795 return 0; 2796 2797 num_freq_ranges = rdev->wiphy.sar_capa->num_freq_ranges; 2798 2799 sar_capa = nla_nest_start(msg, NL80211_ATTR_SAR_SPEC); 2800 if (!sar_capa) 2801 return -ENOSPC; 2802 2803 if (nla_put_u32(msg, NL80211_SAR_ATTR_TYPE, rdev->wiphy.sar_capa->type)) 2804 goto fail; 2805 2806 specs = nla_nest_start(msg, NL80211_SAR_ATTR_SPECS); 2807 if (!specs) 2808 goto fail; 2809 2810 /* report supported freq_ranges */ 2811 for (i = 0; i < num_freq_ranges; i++) { 2812 sub_freq_range = nla_nest_start(msg, i + 1); 2813 if (!sub_freq_range) 2814 goto fail; 2815 2816 if (nla_put_u32(msg, NL80211_SAR_ATTR_SPECS_START_FREQ, 2817 rdev->wiphy.sar_capa->freq_ranges[i].start_freq)) 2818 goto fail; 2819 2820 if (nla_put_u32(msg, NL80211_SAR_ATTR_SPECS_END_FREQ, 2821 rdev->wiphy.sar_capa->freq_ranges[i].end_freq)) 2822 goto fail; 2823 2824 nla_nest_end(msg, sub_freq_range); 2825 } 2826 2827 nla_nest_end(msg, specs); 2828 nla_nest_end(msg, sar_capa); 2829 2830 return 0; 2831 fail: 2832 nla_nest_cancel(msg, sar_capa); 2833 return -ENOBUFS; 2834 } 2835 2836 static int nl80211_put_mbssid_support(struct wiphy *wiphy, struct sk_buff *msg) 2837 { 2838 struct nlattr *config; 2839 2840 if (!wiphy->mbssid_max_interfaces) 2841 return 0; 2842 2843 config = nla_nest_start(msg, NL80211_ATTR_MBSSID_CONFIG); 2844 if (!config) 2845 return -ENOBUFS; 2846 2847 if (nla_put_u8(msg, NL80211_MBSSID_CONFIG_ATTR_MAX_INTERFACES, 2848 wiphy->mbssid_max_interfaces)) 2849 goto fail; 2850 2851 if (wiphy->ema_max_profile_periodicity && 2852 nla_put_u8(msg, 2853 NL80211_MBSSID_CONFIG_ATTR_MAX_EMA_PROFILE_PERIODICITY, 2854 wiphy->ema_max_profile_periodicity)) 2855 goto fail; 2856 2857 nla_nest_end(msg, config); 2858 return 0; 2859 2860 fail: 2861 nla_nest_cancel(msg, config); 2862 return -ENOBUFS; 2863 } 2864 2865 static int nl80211_put_radio(struct wiphy *wiphy, struct sk_buff *msg, int idx) 2866 { 2867 const struct wiphy_radio *r = &wiphy->radio[idx]; 2868 const struct wiphy_radio_cfg *rcfg = &wiphy->radio_cfg[idx]; 2869 struct nlattr *radio, *freq; 2870 int i; 2871 2872 radio = nla_nest_start(msg, idx); 2873 if (!radio) 2874 return -ENOBUFS; 2875 2876 if (nla_put_u32(msg, NL80211_WIPHY_RADIO_ATTR_INDEX, idx)) 2877 goto nla_put_failure; 2878 2879 if (rcfg->rts_threshold && 2880 nla_put_u32(msg, NL80211_WIPHY_RADIO_ATTR_RTS_THRESHOLD, 2881 rcfg->rts_threshold)) 2882 goto nla_put_failure; 2883 2884 if (r->antenna_mask && 2885 nla_put_u32(msg, NL80211_WIPHY_RADIO_ATTR_ANTENNA_MASK, 2886 r->antenna_mask)) 2887 goto nla_put_failure; 2888 2889 for (i = 0; i < r->n_freq_range; i++) { 2890 const struct wiphy_radio_freq_range *range = &r->freq_range[i]; 2891 2892 freq = nla_nest_start(msg, NL80211_WIPHY_RADIO_ATTR_FREQ_RANGE); 2893 if (!freq) 2894 goto nla_put_failure; 2895 2896 if (nla_put_u32(msg, NL80211_WIPHY_RADIO_FREQ_ATTR_START, 2897 range->start_freq) || 2898 nla_put_u32(msg, NL80211_WIPHY_RADIO_FREQ_ATTR_END, 2899 range->end_freq)) 2900 goto nla_put_failure; 2901 2902 nla_nest_end(msg, freq); 2903 } 2904 2905 for (i = 0; i < r->n_iface_combinations; i++) 2906 if (nl80211_put_ifcomb_data(msg, true, 2907 NL80211_WIPHY_RADIO_ATTR_INTERFACE_COMBINATION, 2908 &r->iface_combinations[i], 2909 NLA_F_NESTED)) 2910 goto nla_put_failure; 2911 2912 nla_nest_end(msg, radio); 2913 2914 return 0; 2915 2916 nla_put_failure: 2917 return -ENOBUFS; 2918 } 2919 2920 static int nl80211_put_radios(struct wiphy *wiphy, struct sk_buff *msg) 2921 { 2922 struct nlattr *radios; 2923 int i; 2924 2925 if (!wiphy->n_radio) 2926 return 0; 2927 2928 radios = nla_nest_start(msg, NL80211_ATTR_WIPHY_RADIOS); 2929 if (!radios) 2930 return -ENOBUFS; 2931 2932 for (i = 0; i < wiphy->n_radio; i++) 2933 if (nl80211_put_radio(wiphy, msg, i)) 2934 goto fail; 2935 2936 nla_nest_end(msg, radios); 2937 2938 if (nl80211_put_iface_combinations(wiphy, msg, 2939 NL80211_ATTR_WIPHY_INTERFACE_COMBINATIONS, 2940 -1, true, NLA_F_NESTED)) 2941 return -ENOBUFS; 2942 2943 return 0; 2944 2945 fail: 2946 nla_nest_cancel(msg, radios); 2947 return -ENOBUFS; 2948 } 2949 2950 static int nl80211_put_nan_phy_cap(struct wiphy *wiphy, struct sk_buff *msg) 2951 { 2952 struct nlattr *nl_phy_cap; 2953 const struct ieee80211_sta_ht_cap *ht_cap; 2954 const struct ieee80211_sta_vht_cap *vht_cap; 2955 const struct ieee80211_sta_he_cap *he_cap; 2956 2957 if (!cfg80211_iftype_allowed(wiphy, NL80211_IFTYPE_NAN_DATA, false, 0)) 2958 return 0; 2959 2960 ht_cap = &wiphy->nan_capa.phy.ht; 2961 vht_cap = &wiphy->nan_capa.phy.vht; 2962 he_cap = &wiphy->nan_capa.phy.he; 2963 2964 /* HT is mandatory */ 2965 if (WARN_ON(!ht_cap->ht_supported)) 2966 return 0; 2967 2968 nl_phy_cap = nla_nest_start_noflag(msg, NL80211_NAN_CAPA_PHY); 2969 if (!nl_phy_cap) 2970 return -ENOBUFS; 2971 2972 if (nla_put(msg, NL80211_NAN_PHY_CAP_ATTR_HT_MCS_SET, 2973 sizeof(ht_cap->mcs), &ht_cap->mcs) || 2974 nla_put_u16(msg, NL80211_NAN_PHY_CAP_ATTR_HT_CAPA, ht_cap->cap) || 2975 nla_put_u8(msg, NL80211_NAN_PHY_CAP_ATTR_HT_AMPDU_FACTOR, 2976 ht_cap->ampdu_factor) || 2977 nla_put_u8(msg, NL80211_NAN_PHY_CAP_ATTR_HT_AMPDU_DENSITY, 2978 ht_cap->ampdu_density)) 2979 goto fail; 2980 2981 if (vht_cap->vht_supported) { 2982 if (nla_put(msg, NL80211_NAN_PHY_CAP_ATTR_VHT_MCS_SET, 2983 sizeof(vht_cap->vht_mcs), &vht_cap->vht_mcs) || 2984 nla_put_u32(msg, NL80211_NAN_PHY_CAP_ATTR_VHT_CAPA, 2985 vht_cap->cap)) 2986 goto fail; 2987 } 2988 2989 if (he_cap->has_he) { 2990 if (nla_put(msg, NL80211_NAN_PHY_CAP_ATTR_HE_MAC, 2991 sizeof(he_cap->he_cap_elem.mac_cap_info), 2992 he_cap->he_cap_elem.mac_cap_info) || 2993 nla_put(msg, NL80211_NAN_PHY_CAP_ATTR_HE_PHY, 2994 sizeof(he_cap->he_cap_elem.phy_cap_info), 2995 he_cap->he_cap_elem.phy_cap_info) || 2996 nla_put(msg, NL80211_NAN_PHY_CAP_ATTR_HE_MCS_SET, 2997 sizeof(he_cap->he_mcs_nss_supp), 2998 &he_cap->he_mcs_nss_supp) || 2999 nla_put(msg, NL80211_NAN_PHY_CAP_ATTR_HE_PPE, 3000 sizeof(he_cap->ppe_thres), he_cap->ppe_thres)) 3001 goto fail; 3002 } 3003 3004 nla_nest_end(msg, nl_phy_cap); 3005 return 0; 3006 3007 fail: 3008 nla_nest_cancel(msg, nl_phy_cap); 3009 return -ENOBUFS; 3010 } 3011 3012 static int nl80211_put_nan_capa(struct wiphy *wiphy, struct sk_buff *msg) 3013 { 3014 struct nlattr *nan_caps; 3015 3016 nan_caps = nla_nest_start(msg, NL80211_ATTR_NAN_CAPABILITIES); 3017 if (!nan_caps) 3018 return -ENOBUFS; 3019 3020 if (wiphy->nan_capa.flags & WIPHY_NAN_FLAGS_CONFIGURABLE_SYNC && 3021 nla_put_flag(msg, NL80211_NAN_CAPA_CONFIGURABLE_SYNC)) 3022 goto fail; 3023 3024 if ((wiphy->nan_capa.flags & WIPHY_NAN_FLAGS_USERSPACE_DE) && 3025 nla_put_flag(msg, NL80211_NAN_CAPA_USERSPACE_DE)) 3026 goto fail; 3027 3028 if (nla_put_u8(msg, NL80211_NAN_CAPA_OP_MODE, 3029 wiphy->nan_capa.op_mode) || 3030 nla_put_u8(msg, NL80211_NAN_CAPA_NUM_ANTENNAS, 3031 wiphy->nan_capa.n_antennas) || 3032 nla_put_u16(msg, NL80211_NAN_CAPA_MAX_CHANNEL_SWITCH_TIME, 3033 wiphy->nan_capa.max_channel_switch_time) || 3034 nla_put_u8(msg, NL80211_NAN_CAPA_CAPABILITIES, 3035 wiphy->nan_capa.dev_capabilities)) 3036 goto fail; 3037 3038 if (nl80211_put_nan_phy_cap(wiphy, msg)) 3039 goto fail; 3040 3041 nla_nest_end(msg, nan_caps); 3042 3043 return 0; 3044 3045 fail: 3046 nla_nest_cancel(msg, nan_caps); 3047 return -ENOBUFS; 3048 } 3049 3050 struct nl80211_dump_wiphy_state { 3051 s64 filter_wiphy; 3052 long start; 3053 long split_start, band_start, chan_start, capa_start; 3054 bool split; 3055 }; 3056 3057 static int nl80211_send_wiphy(struct cfg80211_registered_device *rdev, 3058 enum nl80211_commands cmd, 3059 struct sk_buff *msg, u32 portid, u32 seq, 3060 int flags, struct nl80211_dump_wiphy_state *state) 3061 { 3062 void *hdr; 3063 struct nlattr *nl_bands, *nl_band; 3064 struct nlattr *nl_freqs, *nl_freq; 3065 struct nlattr *nl_cmds; 3066 enum nl80211_band band; 3067 struct ieee80211_channel *chan; 3068 int i; 3069 const struct ieee80211_txrx_stypes *mgmt_stypes = 3070 rdev->wiphy.mgmt_stypes; 3071 u32 features; 3072 3073 hdr = nl80211hdr_put(msg, portid, seq, flags, cmd); 3074 if (!hdr) 3075 return -ENOBUFS; 3076 3077 if (WARN_ON(!state)) 3078 return -EINVAL; 3079 3080 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 3081 nla_put_string(msg, NL80211_ATTR_WIPHY_NAME, 3082 wiphy_name(&rdev->wiphy)) || 3083 nla_put_u32(msg, NL80211_ATTR_GENERATION, 3084 cfg80211_rdev_list_generation)) 3085 goto nla_put_failure; 3086 3087 if (cmd != NL80211_CMD_NEW_WIPHY) 3088 goto finish; 3089 3090 switch (state->split_start) { 3091 case 0: 3092 if (nla_put_u8(msg, NL80211_ATTR_WIPHY_RETRY_SHORT, 3093 rdev->wiphy.retry_short) || 3094 nla_put_u8(msg, NL80211_ATTR_WIPHY_RETRY_LONG, 3095 rdev->wiphy.retry_long) || 3096 nla_put_u32(msg, NL80211_ATTR_WIPHY_FRAG_THRESHOLD, 3097 rdev->wiphy.frag_threshold) || 3098 nla_put_u32(msg, NL80211_ATTR_WIPHY_RTS_THRESHOLD, 3099 rdev->wiphy.rts_threshold) || 3100 nla_put_u8(msg, NL80211_ATTR_WIPHY_COVERAGE_CLASS, 3101 rdev->wiphy.coverage_class) || 3102 nla_put_u8(msg, NL80211_ATTR_MAX_NUM_SCAN_SSIDS, 3103 rdev->wiphy.max_scan_ssids) || 3104 nla_put_u8(msg, NL80211_ATTR_MAX_NUM_SCHED_SCAN_SSIDS, 3105 rdev->wiphy.max_sched_scan_ssids) || 3106 nla_put_u16(msg, NL80211_ATTR_MAX_SCAN_IE_LEN, 3107 rdev->wiphy.max_scan_ie_len) || 3108 nla_put_u16(msg, NL80211_ATTR_MAX_SCHED_SCAN_IE_LEN, 3109 rdev->wiphy.max_sched_scan_ie_len) || 3110 nla_put_u8(msg, NL80211_ATTR_MAX_MATCH_SETS, 3111 rdev->wiphy.max_match_sets)) 3112 goto nla_put_failure; 3113 3114 if ((rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN) && 3115 nla_put_flag(msg, NL80211_ATTR_SUPPORT_IBSS_RSN)) 3116 goto nla_put_failure; 3117 if ((rdev->wiphy.flags & WIPHY_FLAG_MESH_AUTH) && 3118 nla_put_flag(msg, NL80211_ATTR_SUPPORT_MESH_AUTH)) 3119 goto nla_put_failure; 3120 if ((rdev->wiphy.flags & WIPHY_FLAG_AP_UAPSD) && 3121 nla_put_flag(msg, NL80211_ATTR_SUPPORT_AP_UAPSD)) 3122 goto nla_put_failure; 3123 if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_FW_ROAM) && 3124 nla_put_flag(msg, NL80211_ATTR_ROAM_SUPPORT)) 3125 goto nla_put_failure; 3126 if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) && 3127 nla_put_flag(msg, NL80211_ATTR_TDLS_SUPPORT)) 3128 goto nla_put_failure; 3129 if ((rdev->wiphy.flags & WIPHY_FLAG_TDLS_EXTERNAL_SETUP) && 3130 nla_put_flag(msg, NL80211_ATTR_TDLS_EXTERNAL_SETUP)) 3131 goto nla_put_failure; 3132 state->split_start++; 3133 if (state->split) 3134 break; 3135 fallthrough; 3136 case 1: 3137 if (nla_put(msg, NL80211_ATTR_CIPHER_SUITES, 3138 sizeof(u32) * rdev->wiphy.n_cipher_suites, 3139 rdev->wiphy.cipher_suites)) 3140 goto nla_put_failure; 3141 3142 if (nla_put_u8(msg, NL80211_ATTR_MAX_NUM_PMKIDS, 3143 rdev->wiphy.max_num_pmkids)) 3144 goto nla_put_failure; 3145 3146 if ((rdev->wiphy.flags & WIPHY_FLAG_CONTROL_PORT_PROTOCOL) && 3147 nla_put_flag(msg, NL80211_ATTR_CONTROL_PORT_ETHERTYPE)) 3148 goto nla_put_failure; 3149 3150 if (nla_put_u32(msg, NL80211_ATTR_WIPHY_ANTENNA_AVAIL_TX, 3151 rdev->wiphy.available_antennas_tx) || 3152 nla_put_u32(msg, NL80211_ATTR_WIPHY_ANTENNA_AVAIL_RX, 3153 rdev->wiphy.available_antennas_rx)) 3154 goto nla_put_failure; 3155 3156 if ((rdev->wiphy.flags & WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD) && 3157 nla_put_u32(msg, NL80211_ATTR_PROBE_RESP_OFFLOAD, 3158 rdev->wiphy.probe_resp_offload)) 3159 goto nla_put_failure; 3160 3161 if ((rdev->wiphy.available_antennas_tx || 3162 rdev->wiphy.available_antennas_rx) && 3163 rdev->ops->get_antenna) { 3164 u32 tx_ant = 0, rx_ant = 0; 3165 int res; 3166 3167 res = rdev_get_antenna(rdev, -1, &tx_ant, &rx_ant); 3168 if (!res) { 3169 if (nla_put_u32(msg, 3170 NL80211_ATTR_WIPHY_ANTENNA_TX, 3171 tx_ant) || 3172 nla_put_u32(msg, 3173 NL80211_ATTR_WIPHY_ANTENNA_RX, 3174 rx_ant)) 3175 goto nla_put_failure; 3176 } 3177 } 3178 3179 state->split_start++; 3180 if (state->split) 3181 break; 3182 fallthrough; 3183 case 2: 3184 if (nl80211_put_iftypes(msg, NL80211_ATTR_SUPPORTED_IFTYPES, 3185 rdev->wiphy.interface_modes)) 3186 goto nla_put_failure; 3187 state->split_start++; 3188 if (state->split) 3189 break; 3190 fallthrough; 3191 case 3: 3192 nl_bands = nla_nest_start_noflag(msg, 3193 NL80211_ATTR_WIPHY_BANDS); 3194 if (!nl_bands) 3195 goto nla_put_failure; 3196 3197 for (band = state->band_start; 3198 band < (state->split ? 3199 NUM_NL80211_BANDS : 3200 NL80211_BAND_60GHZ + 1); 3201 band++) { 3202 struct ieee80211_supported_band *sband; 3203 3204 /* omit higher bands for ancient software */ 3205 if (band > NL80211_BAND_5GHZ && !state->split) 3206 break; 3207 3208 sband = rdev->wiphy.bands[band]; 3209 3210 if (!sband) 3211 continue; 3212 3213 nl_band = nla_nest_start_noflag(msg, band); 3214 if (!nl_band) 3215 goto nla_put_failure; 3216 3217 switch (state->chan_start) { 3218 case 0: 3219 if (nl80211_send_band_rateinfo(msg, sband, 3220 state->split)) 3221 goto nla_put_failure; 3222 state->chan_start++; 3223 if (state->split) 3224 break; 3225 fallthrough; 3226 default: 3227 /* add frequencies */ 3228 nl_freqs = nla_nest_start_noflag(msg, 3229 NL80211_BAND_ATTR_FREQS); 3230 if (!nl_freqs) 3231 goto nla_put_failure; 3232 3233 for (i = state->chan_start - 1; 3234 i < sband->n_channels; 3235 i++) { 3236 nl_freq = nla_nest_start_noflag(msg, 3237 i); 3238 if (!nl_freq) 3239 goto nla_put_failure; 3240 3241 chan = &sband->channels[i]; 3242 3243 if (nl80211_msg_put_channel( 3244 msg, &rdev->wiphy, chan, 3245 state->split)) 3246 goto nla_put_failure; 3247 3248 nla_nest_end(msg, nl_freq); 3249 if (state->split) 3250 break; 3251 } 3252 if (i < sband->n_channels) 3253 state->chan_start = i + 2; 3254 else 3255 state->chan_start = 0; 3256 nla_nest_end(msg, nl_freqs); 3257 } 3258 3259 nla_nest_end(msg, nl_band); 3260 3261 if (state->split) { 3262 /* start again here */ 3263 if (state->chan_start) 3264 band--; 3265 break; 3266 } 3267 } 3268 nla_nest_end(msg, nl_bands); 3269 3270 if (band < NUM_NL80211_BANDS) 3271 state->band_start = band + 1; 3272 else 3273 state->band_start = 0; 3274 3275 /* if bands & channels are done, continue outside */ 3276 if (state->band_start == 0 && state->chan_start == 0) 3277 state->split_start++; 3278 if (state->split) 3279 break; 3280 fallthrough; 3281 case 4: 3282 nl_cmds = nla_nest_start_noflag(msg, 3283 NL80211_ATTR_SUPPORTED_COMMANDS); 3284 if (!nl_cmds) 3285 goto nla_put_failure; 3286 3287 i = nl80211_add_commands_unsplit(rdev, msg); 3288 if (i < 0) 3289 goto nla_put_failure; 3290 if (state->split) { 3291 CMD(crit_proto_start, CRIT_PROTOCOL_START); 3292 CMD(crit_proto_stop, CRIT_PROTOCOL_STOP); 3293 if (rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH) 3294 CMD(channel_switch, CHANNEL_SWITCH); 3295 CMD(set_qos_map, SET_QOS_MAP); 3296 if (rdev->wiphy.features & 3297 NL80211_FEATURE_SUPPORTS_WMM_ADMISSION) 3298 CMD(add_tx_ts, ADD_TX_TS); 3299 CMD(set_multicast_to_unicast, SET_MULTICAST_TO_UNICAST); 3300 CMD(update_connect_params, UPDATE_CONNECT_PARAMS); 3301 CMD(update_ft_ies, UPDATE_FT_IES); 3302 if (rdev->wiphy.sar_capa) 3303 CMD(set_sar_specs, SET_SAR_SPECS); 3304 CMD(assoc_ml_reconf, ASSOC_MLO_RECONF); 3305 } 3306 #undef CMD 3307 3308 nla_nest_end(msg, nl_cmds); 3309 state->split_start++; 3310 if (state->split) 3311 break; 3312 fallthrough; 3313 case 5: 3314 if (rdev->ops->remain_on_channel && 3315 (rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL) && 3316 nla_put_u32(msg, 3317 NL80211_ATTR_MAX_REMAIN_ON_CHANNEL_DURATION, 3318 rdev->wiphy.max_remain_on_channel_duration)) 3319 goto nla_put_failure; 3320 3321 if ((rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX) && 3322 nla_put_flag(msg, NL80211_ATTR_OFFCHANNEL_TX_OK)) 3323 goto nla_put_failure; 3324 3325 state->split_start++; 3326 if (state->split) 3327 break; 3328 fallthrough; 3329 case 6: 3330 #ifdef CONFIG_PM 3331 if (nl80211_send_wowlan(msg, rdev, state->split)) 3332 goto nla_put_failure; 3333 state->split_start++; 3334 if (state->split) 3335 break; 3336 #else 3337 state->split_start++; 3338 #endif 3339 fallthrough; 3340 case 7: 3341 if (nl80211_put_iftypes(msg, NL80211_ATTR_SOFTWARE_IFTYPES, 3342 rdev->wiphy.software_iftypes)) 3343 goto nla_put_failure; 3344 3345 if (nl80211_put_iface_combinations(&rdev->wiphy, msg, 3346 NL80211_ATTR_INTERFACE_COMBINATIONS, 3347 rdev->wiphy.n_radio ? 0 : -1, 3348 state->split, 0)) 3349 goto nla_put_failure; 3350 3351 state->split_start++; 3352 if (state->split) 3353 break; 3354 fallthrough; 3355 case 8: 3356 if ((rdev->wiphy.flags & WIPHY_FLAG_HAVE_AP_SME) && 3357 nla_put_u32(msg, NL80211_ATTR_DEVICE_AP_SME, 3358 rdev->wiphy.ap_sme_capa)) 3359 goto nla_put_failure; 3360 3361 features = rdev->wiphy.features; 3362 /* 3363 * We can only add the per-channel limit information if the 3364 * dump is split, otherwise it makes it too big. Therefore 3365 * only advertise it in that case. 3366 */ 3367 if (state->split) 3368 features |= NL80211_FEATURE_ADVERTISE_CHAN_LIMITS; 3369 if (nla_put_u32(msg, NL80211_ATTR_FEATURE_FLAGS, features)) 3370 goto nla_put_failure; 3371 3372 if (rdev->wiphy.ht_capa_mod_mask && 3373 nla_put(msg, NL80211_ATTR_HT_CAPABILITY_MASK, 3374 sizeof(*rdev->wiphy.ht_capa_mod_mask), 3375 rdev->wiphy.ht_capa_mod_mask)) 3376 goto nla_put_failure; 3377 3378 if (rdev->wiphy.flags & WIPHY_FLAG_HAVE_AP_SME && 3379 rdev->wiphy.max_acl_mac_addrs && 3380 nla_put_u32(msg, NL80211_ATTR_MAC_ACL_MAX, 3381 rdev->wiphy.max_acl_mac_addrs)) 3382 goto nla_put_failure; 3383 3384 /* 3385 * Any information below this point is only available to 3386 * applications that can deal with it being split. This 3387 * helps ensure that newly added capabilities don't break 3388 * older tools by overrunning their buffers. 3389 * 3390 * We still increment split_start so that in the split 3391 * case we'll continue with more data in the next round, 3392 * but break unconditionally so unsplit data stops here. 3393 */ 3394 if (state->split) 3395 state->split_start++; 3396 else 3397 state->split_start = 0; 3398 break; 3399 case 9: 3400 if (nl80211_send_mgmt_stypes(msg, mgmt_stypes)) 3401 goto nla_put_failure; 3402 3403 if (nla_put_u32(msg, NL80211_ATTR_MAX_NUM_SCHED_SCAN_PLANS, 3404 rdev->wiphy.max_sched_scan_plans) || 3405 nla_put_u32(msg, NL80211_ATTR_MAX_SCAN_PLAN_INTERVAL, 3406 rdev->wiphy.max_sched_scan_plan_interval) || 3407 nla_put_u32(msg, NL80211_ATTR_MAX_SCAN_PLAN_ITERATIONS, 3408 rdev->wiphy.max_sched_scan_plan_iterations)) 3409 goto nla_put_failure; 3410 3411 if (rdev->wiphy.extended_capabilities && 3412 (nla_put(msg, NL80211_ATTR_EXT_CAPA, 3413 rdev->wiphy.extended_capabilities_len, 3414 rdev->wiphy.extended_capabilities) || 3415 nla_put(msg, NL80211_ATTR_EXT_CAPA_MASK, 3416 rdev->wiphy.extended_capabilities_len, 3417 rdev->wiphy.extended_capabilities_mask))) 3418 goto nla_put_failure; 3419 3420 if (rdev->wiphy.vht_capa_mod_mask && 3421 nla_put(msg, NL80211_ATTR_VHT_CAPABILITY_MASK, 3422 sizeof(*rdev->wiphy.vht_capa_mod_mask), 3423 rdev->wiphy.vht_capa_mod_mask)) 3424 goto nla_put_failure; 3425 3426 if (nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, 3427 rdev->wiphy.perm_addr)) 3428 goto nla_put_failure; 3429 3430 if (!is_zero_ether_addr(rdev->wiphy.addr_mask) && 3431 nla_put(msg, NL80211_ATTR_MAC_MASK, ETH_ALEN, 3432 rdev->wiphy.addr_mask)) 3433 goto nla_put_failure; 3434 3435 if (rdev->wiphy.n_addresses > 1) { 3436 void *attr; 3437 3438 attr = nla_nest_start(msg, NL80211_ATTR_MAC_ADDRS); 3439 if (!attr) 3440 goto nla_put_failure; 3441 3442 for (i = 0; i < rdev->wiphy.n_addresses; i++) 3443 if (nla_put(msg, i + 1, ETH_ALEN, 3444 rdev->wiphy.addresses[i].addr)) 3445 goto nla_put_failure; 3446 3447 nla_nest_end(msg, attr); 3448 } 3449 3450 state->split_start++; 3451 break; 3452 case 10: 3453 if (nl80211_send_coalesce(msg, rdev)) 3454 goto nla_put_failure; 3455 3456 if (rdev->wiphy.max_ap_assoc_sta && 3457 nla_put_u32(msg, NL80211_ATTR_MAX_AP_ASSOC_STA, 3458 rdev->wiphy.max_ap_assoc_sta)) 3459 goto nla_put_failure; 3460 3461 state->split_start++; 3462 break; 3463 case 11: 3464 if (rdev->wiphy.n_vendor_commands) { 3465 const struct nl80211_vendor_cmd_info *info; 3466 struct nlattr *nested; 3467 3468 nested = nla_nest_start_noflag(msg, 3469 NL80211_ATTR_VENDOR_DATA); 3470 if (!nested) 3471 goto nla_put_failure; 3472 3473 for (i = 0; i < rdev->wiphy.n_vendor_commands; i++) { 3474 info = &rdev->wiphy.vendor_commands[i].info; 3475 if (nla_put(msg, i + 1, sizeof(*info), info)) 3476 goto nla_put_failure; 3477 } 3478 nla_nest_end(msg, nested); 3479 } 3480 3481 if (rdev->wiphy.n_vendor_events) { 3482 const struct nl80211_vendor_cmd_info *info; 3483 struct nlattr *nested; 3484 3485 nested = nla_nest_start_noflag(msg, 3486 NL80211_ATTR_VENDOR_EVENTS); 3487 if (!nested) 3488 goto nla_put_failure; 3489 3490 for (i = 0; i < rdev->wiphy.n_vendor_events; i++) { 3491 info = &rdev->wiphy.vendor_events[i]; 3492 if (nla_put(msg, i + 1, sizeof(*info), info)) 3493 goto nla_put_failure; 3494 } 3495 nla_nest_end(msg, nested); 3496 } 3497 state->split_start++; 3498 break; 3499 case 12: 3500 if (rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH && 3501 nla_put_u8(msg, NL80211_ATTR_MAX_CSA_COUNTERS, 3502 rdev->wiphy.max_num_csa_counters)) 3503 goto nla_put_failure; 3504 3505 if (rdev->wiphy.regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED && 3506 nla_put_flag(msg, NL80211_ATTR_WIPHY_SELF_MANAGED_REG)) 3507 goto nla_put_failure; 3508 3509 if (rdev->wiphy.max_sched_scan_reqs && 3510 nla_put_u32(msg, NL80211_ATTR_SCHED_SCAN_MAX_REQS, 3511 rdev->wiphy.max_sched_scan_reqs)) 3512 goto nla_put_failure; 3513 3514 if (nla_put(msg, NL80211_ATTR_EXT_FEATURES, 3515 sizeof(rdev->wiphy.ext_features), 3516 rdev->wiphy.ext_features)) 3517 goto nla_put_failure; 3518 3519 if (rdev->wiphy.bss_param_support) { 3520 struct nlattr *nested; 3521 u32 parsup = rdev->wiphy.bss_param_support; 3522 3523 nested = nla_nest_start(msg, NL80211_ATTR_BSS_PARAM); 3524 if (!nested) 3525 goto nla_put_failure; 3526 3527 if ((parsup & WIPHY_BSS_PARAM_CTS_PROT) && 3528 nla_put_flag(msg, NL80211_ATTR_BSS_CTS_PROT)) 3529 goto nla_put_failure; 3530 if ((parsup & WIPHY_BSS_PARAM_SHORT_PREAMBLE) && 3531 nla_put_flag(msg, NL80211_ATTR_BSS_SHORT_PREAMBLE)) 3532 goto nla_put_failure; 3533 if ((parsup & WIPHY_BSS_PARAM_SHORT_SLOT_TIME) && 3534 nla_put_flag(msg, NL80211_ATTR_BSS_SHORT_SLOT_TIME)) 3535 goto nla_put_failure; 3536 if ((parsup & WIPHY_BSS_PARAM_BASIC_RATES) && 3537 nla_put_flag(msg, NL80211_ATTR_BSS_BASIC_RATES)) 3538 goto nla_put_failure; 3539 if ((parsup & WIPHY_BSS_PARAM_AP_ISOLATE) && 3540 nla_put_flag(msg, NL80211_ATTR_AP_ISOLATE)) 3541 goto nla_put_failure; 3542 if ((parsup & WIPHY_BSS_PARAM_HT_OPMODE) && 3543 nla_put_flag(msg, NL80211_ATTR_BSS_HT_OPMODE)) 3544 goto nla_put_failure; 3545 if ((parsup & WIPHY_BSS_PARAM_P2P_CTWINDOW) && 3546 nla_put_flag(msg, NL80211_ATTR_P2P_CTWINDOW)) 3547 goto nla_put_failure; 3548 if ((parsup & WIPHY_BSS_PARAM_P2P_OPPPS) && 3549 nla_put_flag(msg, NL80211_ATTR_P2P_OPPPS)) 3550 goto nla_put_failure; 3551 nla_nest_end(msg, nested); 3552 } 3553 if (rdev->wiphy.bss_select_support) { 3554 struct nlattr *nested; 3555 u32 bss_select_support = rdev->wiphy.bss_select_support; 3556 3557 nested = nla_nest_start_noflag(msg, 3558 NL80211_ATTR_BSS_SELECT); 3559 if (!nested) 3560 goto nla_put_failure; 3561 3562 i = 0; 3563 while (bss_select_support) { 3564 if ((bss_select_support & 1) && 3565 nla_put_flag(msg, i)) 3566 goto nla_put_failure; 3567 i++; 3568 bss_select_support >>= 1; 3569 } 3570 nla_nest_end(msg, nested); 3571 } 3572 3573 state->split_start++; 3574 break; 3575 case 13: 3576 if (rdev->wiphy.num_iftype_ext_capab && 3577 rdev->wiphy.iftype_ext_capab) { 3578 struct nlattr *nested_ext_capab, *nested; 3579 3580 nested = nla_nest_start_noflag(msg, 3581 NL80211_ATTR_IFTYPE_EXT_CAPA); 3582 if (!nested) 3583 goto nla_put_failure; 3584 3585 for (i = state->capa_start; 3586 i < rdev->wiphy.num_iftype_ext_capab; i++) { 3587 const struct wiphy_iftype_ext_capab *capab; 3588 3589 capab = &rdev->wiphy.iftype_ext_capab[i]; 3590 3591 nested_ext_capab = nla_nest_start_noflag(msg, 3592 i); 3593 if (!nested_ext_capab || 3594 nla_put_u32(msg, NL80211_ATTR_IFTYPE, 3595 capab->iftype) || 3596 nla_put(msg, NL80211_ATTR_EXT_CAPA, 3597 capab->extended_capabilities_len, 3598 capab->extended_capabilities) || 3599 nla_put(msg, NL80211_ATTR_EXT_CAPA_MASK, 3600 capab->extended_capabilities_len, 3601 capab->extended_capabilities_mask)) 3602 goto nla_put_failure; 3603 3604 if (rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_MLO && 3605 (nla_put_u16(msg, 3606 NL80211_ATTR_EML_CAPABILITY, 3607 capab->eml_capabilities) || 3608 nla_put_u16(msg, 3609 NL80211_ATTR_MLD_CAPA_AND_OPS, 3610 capab->mld_capa_and_ops))) 3611 goto nla_put_failure; 3612 if (rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_MLO && 3613 capab->ext_mld_capa_and_ops && 3614 nla_put_u16(msg, 3615 NL80211_ATTR_EXT_MLD_CAPA_AND_OPS, 3616 capab->ext_mld_capa_and_ops)) 3617 goto nla_put_failure; 3618 3619 nla_nest_end(msg, nested_ext_capab); 3620 if (state->split) 3621 break; 3622 } 3623 nla_nest_end(msg, nested); 3624 if (i < rdev->wiphy.num_iftype_ext_capab) { 3625 state->capa_start = i + 1; 3626 break; 3627 } 3628 } 3629 3630 if (nla_put_u32(msg, NL80211_ATTR_BANDS, 3631 rdev->wiphy.nan_supported_bands)) 3632 goto nla_put_failure; 3633 3634 if (wiphy_ext_feature_isset(&rdev->wiphy, 3635 NL80211_EXT_FEATURE_TXQS)) { 3636 struct cfg80211_txq_stats txqstats = {}; 3637 int res; 3638 3639 res = rdev_get_txq_stats(rdev, NULL, &txqstats); 3640 if (!res && 3641 !nl80211_put_txq_stats(msg, &txqstats, 3642 NL80211_ATTR_TXQ_STATS)) 3643 goto nla_put_failure; 3644 3645 if (nla_put_u32(msg, NL80211_ATTR_TXQ_LIMIT, 3646 rdev->wiphy.txq_limit)) 3647 goto nla_put_failure; 3648 if (nla_put_u32(msg, NL80211_ATTR_TXQ_MEMORY_LIMIT, 3649 rdev->wiphy.txq_memory_limit)) 3650 goto nla_put_failure; 3651 if (nla_put_u32(msg, NL80211_ATTR_TXQ_QUANTUM, 3652 rdev->wiphy.txq_quantum)) 3653 goto nla_put_failure; 3654 } 3655 3656 state->split_start++; 3657 break; 3658 case 14: 3659 if (nl80211_send_pmsr_capa(rdev, msg)) 3660 goto nla_put_failure; 3661 3662 state->split_start++; 3663 break; 3664 case 15: 3665 if (rdev->wiphy.akm_suites && 3666 nla_put(msg, NL80211_ATTR_AKM_SUITES, 3667 sizeof(u32) * rdev->wiphy.n_akm_suites, 3668 rdev->wiphy.akm_suites)) 3669 goto nla_put_failure; 3670 3671 if (nl80211_put_iftype_akm_suites(rdev, msg)) 3672 goto nla_put_failure; 3673 3674 if (nl80211_put_tid_config_support(rdev, msg)) 3675 goto nla_put_failure; 3676 state->split_start++; 3677 break; 3678 case 16: 3679 if (nl80211_put_sar_specs(rdev, msg)) 3680 goto nla_put_failure; 3681 3682 if (nl80211_put_mbssid_support(&rdev->wiphy, msg)) 3683 goto nla_put_failure; 3684 3685 if (nla_put_u16(msg, NL80211_ATTR_MAX_NUM_AKM_SUITES, 3686 rdev->wiphy.max_num_akm_suites)) 3687 goto nla_put_failure; 3688 3689 if (rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_MLO) 3690 nla_put_flag(msg, NL80211_ATTR_MLO_SUPPORT); 3691 3692 if (rdev->wiphy.hw_timestamp_max_peers && 3693 nla_put_u16(msg, NL80211_ATTR_MAX_HW_TIMESTAMP_PEERS, 3694 rdev->wiphy.hw_timestamp_max_peers)) 3695 goto nla_put_failure; 3696 3697 state->split_start++; 3698 break; 3699 case 17: 3700 if (nl80211_put_radios(&rdev->wiphy, msg)) 3701 goto nla_put_failure; 3702 3703 state->split_start++; 3704 break; 3705 case 18: 3706 if (nl80211_put_nan_capa(&rdev->wiphy, msg)) 3707 goto nla_put_failure; 3708 3709 /* done */ 3710 state->split_start = 0; 3711 break; 3712 } 3713 finish: 3714 genlmsg_end(msg, hdr); 3715 return 0; 3716 3717 nla_put_failure: 3718 genlmsg_cancel(msg, hdr); 3719 return -EMSGSIZE; 3720 } 3721 3722 static int nl80211_dump_wiphy_parse(struct sk_buff *skb, 3723 struct netlink_callback *cb, 3724 struct nl80211_dump_wiphy_state *state) 3725 { 3726 struct nlattr **tb = kzalloc_objs(*tb, NUM_NL80211_ATTR); 3727 int ret; 3728 3729 if (!tb) 3730 return -ENOMEM; 3731 3732 ret = nlmsg_parse_deprecated(cb->nlh, 3733 GENL_HDRLEN + nl80211_fam.hdrsize, 3734 tb, nl80211_fam.maxattr, 3735 nl80211_policy, NULL); 3736 /* ignore parse errors for backward compatibility */ 3737 if (ret) { 3738 ret = 0; 3739 goto out; 3740 } 3741 3742 state->split = tb[NL80211_ATTR_SPLIT_WIPHY_DUMP]; 3743 if (tb[NL80211_ATTR_WIPHY]) 3744 state->filter_wiphy = nla_get_u32(tb[NL80211_ATTR_WIPHY]); 3745 if (tb[NL80211_ATTR_WDEV]) 3746 state->filter_wiphy = nla_get_u64(tb[NL80211_ATTR_WDEV]) >> 32; 3747 if (tb[NL80211_ATTR_IFINDEX]) { 3748 struct net_device *netdev; 3749 struct cfg80211_registered_device *rdev; 3750 int ifidx = nla_get_u32(tb[NL80211_ATTR_IFINDEX]); 3751 3752 netdev = __dev_get_by_index(sock_net(skb->sk), ifidx); 3753 if (!netdev) { 3754 ret = -ENODEV; 3755 goto out; 3756 } 3757 if (netdev->ieee80211_ptr) { 3758 rdev = wiphy_to_rdev( 3759 netdev->ieee80211_ptr->wiphy); 3760 state->filter_wiphy = rdev->wiphy_idx; 3761 } 3762 } 3763 3764 ret = 0; 3765 out: 3766 kfree(tb); 3767 return ret; 3768 } 3769 3770 static int nl80211_dump_wiphy(struct sk_buff *skb, struct netlink_callback *cb) 3771 { 3772 int idx = 0, ret; 3773 struct nl80211_dump_wiphy_state *state = (void *)cb->args[0]; 3774 struct cfg80211_registered_device *rdev; 3775 3776 rtnl_lock(); 3777 if (!state) { 3778 state = kzalloc_obj(*state); 3779 if (!state) { 3780 rtnl_unlock(); 3781 return -ENOMEM; 3782 } 3783 state->filter_wiphy = -1; 3784 ret = nl80211_dump_wiphy_parse(skb, cb, state); 3785 if (ret) { 3786 kfree(state); 3787 rtnl_unlock(); 3788 return ret; 3789 } 3790 cb->args[0] = (long)state; 3791 } 3792 3793 for_each_rdev(rdev) { 3794 if (!net_eq(wiphy_net(&rdev->wiphy), sock_net(skb->sk))) 3795 continue; 3796 if (++idx <= state->start) 3797 continue; 3798 if (state->filter_wiphy != -1 && 3799 state->filter_wiphy != rdev->wiphy_idx) 3800 continue; 3801 wiphy_lock(&rdev->wiphy); 3802 /* attempt to fit multiple wiphy data chunks into the skb */ 3803 do { 3804 ret = nl80211_send_wiphy(rdev, NL80211_CMD_NEW_WIPHY, 3805 skb, 3806 NETLINK_CB(cb->skb).portid, 3807 cb->nlh->nlmsg_seq, 3808 NLM_F_MULTI, state); 3809 if (ret < 0) { 3810 /* 3811 * If sending the wiphy data didn't fit (ENOBUFS 3812 * or EMSGSIZE returned), this SKB is still 3813 * empty (so it's not too big because another 3814 * wiphy dataset is already in the skb) and 3815 * we've not tried to adjust the dump allocation 3816 * yet ... then adjust the alloc size to be 3817 * bigger, and return 1 but with the empty skb. 3818 * This results in an empty message being RX'ed 3819 * in userspace, but that is ignored. 3820 * 3821 * We can then retry with the larger buffer. 3822 */ 3823 if ((ret == -ENOBUFS || ret == -EMSGSIZE) && 3824 !skb->len && !state->split && 3825 cb->min_dump_alloc < 4096) { 3826 cb->min_dump_alloc = 4096; 3827 state->split_start = 0; 3828 wiphy_unlock(&rdev->wiphy); 3829 rtnl_unlock(); 3830 return 1; 3831 } 3832 idx--; 3833 break; 3834 } 3835 } while (state->split_start > 0); 3836 wiphy_unlock(&rdev->wiphy); 3837 break; 3838 } 3839 rtnl_unlock(); 3840 3841 state->start = idx; 3842 3843 return skb->len; 3844 } 3845 3846 static int nl80211_dump_wiphy_done(struct netlink_callback *cb) 3847 { 3848 kfree((void *)cb->args[0]); 3849 return 0; 3850 } 3851 3852 static int nl80211_get_wiphy(struct sk_buff *skb, struct genl_info *info) 3853 { 3854 struct sk_buff *msg; 3855 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 3856 struct nl80211_dump_wiphy_state state = {}; 3857 3858 msg = nlmsg_new(4096, GFP_KERNEL); 3859 if (!msg) 3860 return -ENOMEM; 3861 3862 if (nl80211_send_wiphy(rdev, NL80211_CMD_NEW_WIPHY, msg, 3863 info->snd_portid, info->snd_seq, 0, 3864 &state) < 0) { 3865 nlmsg_free(msg); 3866 return -ENOBUFS; 3867 } 3868 3869 return genlmsg_reply(msg, info); 3870 } 3871 3872 static const struct nla_policy txq_params_policy[NL80211_TXQ_ATTR_MAX + 1] = { 3873 [NL80211_TXQ_ATTR_QUEUE] = { .type = NLA_U8 }, 3874 [NL80211_TXQ_ATTR_TXOP] = { .type = NLA_U16 }, 3875 [NL80211_TXQ_ATTR_CWMIN] = { .type = NLA_U16 }, 3876 [NL80211_TXQ_ATTR_CWMAX] = { .type = NLA_U16 }, 3877 [NL80211_TXQ_ATTR_AIFS] = { .type = NLA_U8 }, 3878 }; 3879 3880 static int parse_txq_params(struct nlattr *tb[], 3881 struct ieee80211_txq_params *txq_params) 3882 { 3883 u8 ac; 3884 3885 if (!tb[NL80211_TXQ_ATTR_AC] || !tb[NL80211_TXQ_ATTR_TXOP] || 3886 !tb[NL80211_TXQ_ATTR_CWMIN] || !tb[NL80211_TXQ_ATTR_CWMAX] || 3887 !tb[NL80211_TXQ_ATTR_AIFS]) 3888 return -EINVAL; 3889 3890 ac = nla_get_u8(tb[NL80211_TXQ_ATTR_AC]); 3891 txq_params->txop = nla_get_u16(tb[NL80211_TXQ_ATTR_TXOP]); 3892 txq_params->cwmin = nla_get_u16(tb[NL80211_TXQ_ATTR_CWMIN]); 3893 txq_params->cwmax = nla_get_u16(tb[NL80211_TXQ_ATTR_CWMAX]); 3894 txq_params->aifs = nla_get_u8(tb[NL80211_TXQ_ATTR_AIFS]); 3895 3896 if (ac >= NL80211_NUM_ACS) 3897 return -EINVAL; 3898 txq_params->ac = array_index_nospec(ac, NL80211_NUM_ACS); 3899 return 0; 3900 } 3901 3902 static bool nl80211_can_set_dev_channel(struct wireless_dev *wdev) 3903 { 3904 /* 3905 * You can only set the channel explicitly for some interfaces, 3906 * most have their channel managed via their respective 3907 * "establish a connection" command (connect, join, ...) 3908 * 3909 * For AP/GO and mesh mode, the channel can be set with the 3910 * channel userspace API, but is only stored and passed to the 3911 * low-level driver when the AP starts or the mesh is joined. 3912 * This is for backward compatibility, userspace can also give 3913 * the channel in the start-ap or join-mesh commands instead. 3914 * 3915 * Monitors are special as they are normally slaved to 3916 * whatever else is going on, so they have their own special 3917 * operation to set the monitor channel if possible. 3918 */ 3919 return !wdev || 3920 wdev->iftype == NL80211_IFTYPE_AP || 3921 wdev->iftype == NL80211_IFTYPE_MESH_POINT || 3922 wdev->iftype == NL80211_IFTYPE_MONITOR || 3923 wdev->iftype == NL80211_IFTYPE_P2P_GO; 3924 } 3925 3926 static int _nl80211_parse_chandef(struct cfg80211_registered_device *rdev, 3927 struct netlink_ext_ack *extack, 3928 struct nlattr **attrs, bool monitor, 3929 struct cfg80211_chan_def *chandef, 3930 bool permit_npca) 3931 { 3932 u32 control_freq; 3933 3934 if (!attrs[NL80211_ATTR_WIPHY_FREQ]) { 3935 NL_SET_ERR_MSG_ATTR(extack, attrs[NL80211_ATTR_WIPHY_FREQ], 3936 "Frequency is missing"); 3937 return -EINVAL; 3938 } 3939 3940 control_freq = MHZ_TO_KHZ( 3941 nla_get_u32(attrs[NL80211_ATTR_WIPHY_FREQ])); 3942 if (attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]) 3943 control_freq += 3944 nla_get_u32(attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]); 3945 3946 memset(chandef, 0, sizeof(*chandef)); 3947 chandef->chan = ieee80211_get_channel_khz(&rdev->wiphy, control_freq); 3948 chandef->width = NL80211_CHAN_WIDTH_20_NOHT; 3949 chandef->center_freq1 = KHZ_TO_MHZ(control_freq); 3950 chandef->freq1_offset = control_freq % 1000; 3951 chandef->center_freq2 = 0; 3952 chandef->s1g_primary_2mhz = false; 3953 3954 if (!chandef->chan) { 3955 NL_SET_ERR_MSG_ATTR(extack, attrs[NL80211_ATTR_WIPHY_FREQ], 3956 "Unknown channel"); 3957 return -EINVAL; 3958 } 3959 3960 if (cfg80211_chandef_is_s1g(chandef)) 3961 chandef->width = NL80211_CHAN_WIDTH_1; 3962 3963 if (attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE]) { 3964 enum nl80211_channel_type chantype; 3965 3966 chantype = nla_get_u32(attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE]); 3967 3968 switch (chantype) { 3969 case NL80211_CHAN_NO_HT: 3970 case NL80211_CHAN_HT20: 3971 case NL80211_CHAN_HT40PLUS: 3972 case NL80211_CHAN_HT40MINUS: 3973 if (chandef->chan->band == NL80211_BAND_60GHZ || 3974 chandef->chan->band == NL80211_BAND_S1GHZ) 3975 return -EINVAL; 3976 cfg80211_chandef_create(chandef, chandef->chan, 3977 chantype); 3978 /* user input for center_freq is incorrect */ 3979 if (attrs[NL80211_ATTR_CENTER_FREQ1] && 3980 chandef->center_freq1 != nla_get_u32(attrs[NL80211_ATTR_CENTER_FREQ1])) { 3981 NL_SET_ERR_MSG_ATTR(extack, 3982 attrs[NL80211_ATTR_CENTER_FREQ1], 3983 "bad center frequency 1"); 3984 return -EINVAL; 3985 } 3986 /* center_freq2 must be zero */ 3987 if (attrs[NL80211_ATTR_CENTER_FREQ2] && 3988 nla_get_u32(attrs[NL80211_ATTR_CENTER_FREQ2])) { 3989 NL_SET_ERR_MSG_ATTR(extack, 3990 attrs[NL80211_ATTR_CENTER_FREQ2], 3991 "center frequency 2 can't be used"); 3992 return -EINVAL; 3993 } 3994 break; 3995 default: 3996 NL_SET_ERR_MSG_ATTR(extack, 3997 attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE], 3998 "invalid channel type"); 3999 return -EINVAL; 4000 } 4001 } else if (attrs[NL80211_ATTR_CHANNEL_WIDTH]) { 4002 chandef->width = nla_get_u32(attrs[NL80211_ATTR_CHANNEL_WIDTH]); 4003 if (attrs[NL80211_ATTR_CENTER_FREQ1]) { 4004 chandef->center_freq1 = 4005 nla_get_u32(attrs[NL80211_ATTR_CENTER_FREQ1]); 4006 chandef->freq1_offset = nla_get_u32_default( 4007 attrs[NL80211_ATTR_CENTER_FREQ1_OFFSET], 0); 4008 } 4009 4010 if (attrs[NL80211_ATTR_CENTER_FREQ2]) 4011 chandef->center_freq2 = 4012 nla_get_u32(attrs[NL80211_ATTR_CENTER_FREQ2]); 4013 4014 chandef->s1g_primary_2mhz = nla_get_flag( 4015 attrs[NL80211_ATTR_S1G_PRIMARY_2MHZ]); 4016 } 4017 4018 if (attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]) { 4019 chandef->edmg.channels = 4020 nla_get_u8(attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]); 4021 4022 if (attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]) 4023 chandef->edmg.bw_config = 4024 nla_get_u8(attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]); 4025 } else { 4026 chandef->edmg.bw_config = 0; 4027 chandef->edmg.channels = 0; 4028 } 4029 4030 if (attrs[NL80211_ATTR_PUNCT_BITMAP]) { 4031 chandef->punctured = 4032 nla_get_u32(attrs[NL80211_ATTR_PUNCT_BITMAP]); 4033 4034 if (chandef->punctured && 4035 !wiphy_ext_feature_isset(&rdev->wiphy, 4036 NL80211_EXT_FEATURE_PUNCT)) { 4037 NL_SET_ERR_MSG_ATTR(extack, 4038 attrs[NL80211_ATTR_WIPHY_FREQ], 4039 "driver doesn't support puncturing"); 4040 return -EINVAL; 4041 } 4042 } 4043 4044 if (attrs[NL80211_ATTR_NPCA_PRIMARY_FREQ]) { 4045 if (!permit_npca) { 4046 NL_SET_ERR_MSG_ATTR(extack, 4047 attrs[NL80211_ATTR_NPCA_PRIMARY_FREQ], 4048 "NPCA not supported"); 4049 return -EINVAL; 4050 } 4051 4052 chandef->npca_chan = 4053 ieee80211_get_channel(&rdev->wiphy, 4054 nla_get_u32(attrs[NL80211_ATTR_NPCA_PRIMARY_FREQ])); 4055 if (!chandef->npca_chan) { 4056 NL_SET_ERR_MSG_ATTR(extack, 4057 attrs[NL80211_ATTR_NPCA_PRIMARY_FREQ], 4058 "invalid NPCA primary channel"); 4059 return -EINVAL; 4060 } 4061 4062 chandef->npca_punctured = 4063 nla_get_u32_default(attrs[NL80211_ATTR_NPCA_PUNCT_BITMAP], 4064 chandef->punctured); 4065 } else if (attrs[NL80211_ATTR_NPCA_PUNCT_BITMAP]) { 4066 NL_SET_ERR_MSG_ATTR(extack, 4067 attrs[NL80211_ATTR_NPCA_PUNCT_BITMAP], 4068 "NPCA puncturing only valid with NPCA"); 4069 return -EINVAL; 4070 } 4071 4072 if (!cfg80211_chandef_valid(chandef)) { 4073 NL_SET_ERR_MSG_ATTR(extack, attrs[NL80211_ATTR_WIPHY_FREQ], 4074 "invalid channel definition"); 4075 return -EINVAL; 4076 } 4077 4078 if (!_cfg80211_chandef_usable(&rdev->wiphy, chandef, 4079 IEEE80211_CHAN_DISABLED, 4080 monitor ? IEEE80211_CHAN_CAN_MONITOR : 0)) { 4081 NL_SET_ERR_MSG_ATTR(extack, attrs[NL80211_ATTR_WIPHY_FREQ], 4082 "(extension) channel is disabled"); 4083 return -EINVAL; 4084 } 4085 4086 if (chandef->width == NL80211_CHAN_WIDTH_5 || 4087 chandef->width == NL80211_CHAN_WIDTH_10) { 4088 NL_SET_ERR_MSG(extack, "5/10 MHz not supported any more"); 4089 return -EINVAL; 4090 } 4091 4092 return 0; 4093 } 4094 4095 int nl80211_parse_chandef(struct cfg80211_registered_device *rdev, 4096 struct netlink_ext_ack *extack, 4097 struct nlattr **attrs, 4098 struct cfg80211_chan_def *chandef, 4099 bool permit_npca) 4100 { 4101 return _nl80211_parse_chandef(rdev, extack, attrs, false, chandef, 4102 permit_npca); 4103 } 4104 4105 static int __nl80211_set_channel(struct cfg80211_registered_device *rdev, 4106 struct net_device *dev, 4107 struct genl_info *info, 4108 int _link_id) 4109 { 4110 struct cfg80211_chan_def chandef; 4111 int result; 4112 enum nl80211_iftype iftype = NL80211_IFTYPE_MONITOR; 4113 struct wireless_dev *wdev = NULL; 4114 int link_id = _link_id; 4115 bool permit_npca; 4116 4117 if (dev) 4118 wdev = dev->ieee80211_ptr; 4119 if (!nl80211_can_set_dev_channel(wdev)) 4120 return -EOPNOTSUPP; 4121 if (wdev) 4122 iftype = wdev->iftype; 4123 4124 if (link_id < 0) { 4125 if (wdev && wdev->valid_links) 4126 return -EINVAL; 4127 link_id = 0; 4128 } 4129 4130 /* allow parsing it - will check on start_ap or below */ 4131 permit_npca = iftype == NL80211_IFTYPE_AP || 4132 iftype == NL80211_IFTYPE_P2P_GO; 4133 4134 result = _nl80211_parse_chandef(rdev, info->extack, info->attrs, 4135 iftype == NL80211_IFTYPE_MONITOR, 4136 &chandef, permit_npca); 4137 if (result) 4138 return result; 4139 4140 switch (iftype) { 4141 case NL80211_IFTYPE_AP: 4142 case NL80211_IFTYPE_P2P_GO: 4143 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &chandef, 4144 iftype)) 4145 return -EINVAL; 4146 if (wdev->links[link_id].ap.beacon_interval) { 4147 struct ieee80211_channel *cur_chan; 4148 4149 if (!dev || !rdev->ops->set_ap_chanwidth || 4150 !(rdev->wiphy.features & 4151 NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE)) 4152 return -EBUSY; 4153 4154 /* Only allow dynamic channel width changes */ 4155 cur_chan = wdev->links[link_id].ap.chandef.npca_chan; 4156 if (chandef.npca_chan != cur_chan) 4157 return -EBUSY; 4158 cur_chan = wdev->links[link_id].ap.chandef.chan; 4159 if (chandef.chan != cur_chan) 4160 return -EBUSY; 4161 4162 /* only allow this for regular channel widths */ 4163 switch (wdev->links[link_id].ap.chandef.width) { 4164 case NL80211_CHAN_WIDTH_20_NOHT: 4165 case NL80211_CHAN_WIDTH_20: 4166 case NL80211_CHAN_WIDTH_40: 4167 case NL80211_CHAN_WIDTH_80: 4168 case NL80211_CHAN_WIDTH_80P80: 4169 case NL80211_CHAN_WIDTH_160: 4170 case NL80211_CHAN_WIDTH_320: 4171 break; 4172 default: 4173 return -EINVAL; 4174 } 4175 4176 switch (chandef.width) { 4177 case NL80211_CHAN_WIDTH_20_NOHT: 4178 case NL80211_CHAN_WIDTH_20: 4179 case NL80211_CHAN_WIDTH_40: 4180 case NL80211_CHAN_WIDTH_80: 4181 case NL80211_CHAN_WIDTH_80P80: 4182 case NL80211_CHAN_WIDTH_160: 4183 case NL80211_CHAN_WIDTH_320: 4184 break; 4185 default: 4186 return -EINVAL; 4187 } 4188 4189 result = rdev_set_ap_chanwidth(rdev, dev, link_id, 4190 &chandef); 4191 if (result) 4192 return result; 4193 wdev->links[link_id].ap.chandef = chandef; 4194 } else { 4195 wdev->u.ap.preset_chandef = chandef; 4196 } 4197 return 0; 4198 case NL80211_IFTYPE_MESH_POINT: 4199 return cfg80211_set_mesh_channel(rdev, wdev, &chandef); 4200 case NL80211_IFTYPE_MONITOR: 4201 return cfg80211_set_monitor_channel(rdev, dev, &chandef); 4202 default: 4203 break; 4204 } 4205 4206 return -EINVAL; 4207 } 4208 4209 static int nl80211_set_channel(struct sk_buff *skb, struct genl_info *info) 4210 { 4211 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 4212 int link_id = nl80211_link_id_or_invalid(info->attrs); 4213 struct net_device *netdev = info->user_ptr[1]; 4214 4215 return __nl80211_set_channel(rdev, netdev, info, link_id); 4216 } 4217 4218 static int nl80211_set_wiphy_radio(struct genl_info *info, 4219 struct cfg80211_registered_device *rdev, 4220 int radio_idx) 4221 { 4222 u32 rts_threshold = 0, old_rts, changed = 0; 4223 int result; 4224 4225 if (!rdev->ops->set_wiphy_params) 4226 return -EOPNOTSUPP; 4227 4228 if (info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]) { 4229 rts_threshold = nla_get_u32( 4230 info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]); 4231 changed |= WIPHY_PARAM_RTS_THRESHOLD; 4232 } 4233 4234 old_rts = rdev->wiphy.radio_cfg[radio_idx].rts_threshold; 4235 4236 rdev->wiphy.radio_cfg[radio_idx].rts_threshold = rts_threshold; 4237 4238 result = rdev_set_wiphy_params(rdev, radio_idx, changed); 4239 if (result) 4240 rdev->wiphy.radio_cfg[radio_idx].rts_threshold = old_rts; 4241 4242 return 0; 4243 } 4244 4245 static int nl80211_set_wiphy(struct sk_buff *skb, struct genl_info *info) 4246 { 4247 struct cfg80211_registered_device *rdev = NULL; 4248 struct net_device *netdev = NULL; 4249 struct wireless_dev *wdev; 4250 int result = 0, rem_txq_params = 0; 4251 struct nlattr *nl_txq_params; 4252 u32 changed; 4253 u8 retry_short = 0, retry_long = 0; 4254 u32 frag_threshold = 0, rts_threshold = 0; 4255 u8 coverage_class = 0; 4256 u32 txq_limit = 0, txq_memory_limit = 0, txq_quantum = 0; 4257 int radio_idx = -1; 4258 4259 rtnl_lock(); 4260 /* 4261 * Try to find the wiphy and netdev. Normally this 4262 * function shouldn't need the netdev, but this is 4263 * done for backward compatibility -- previously 4264 * setting the channel was done per wiphy, but now 4265 * it is per netdev. Previous userland like hostapd 4266 * also passed a netdev to set_wiphy, so that it is 4267 * possible to let that go to the right netdev! 4268 */ 4269 4270 if (info->attrs[NL80211_ATTR_IFINDEX]) { 4271 int ifindex = nla_get_u32(info->attrs[NL80211_ATTR_IFINDEX]); 4272 4273 netdev = __dev_get_by_index(genl_info_net(info), ifindex); 4274 if (netdev && netdev->ieee80211_ptr) 4275 rdev = wiphy_to_rdev(netdev->ieee80211_ptr->wiphy); 4276 else 4277 netdev = NULL; 4278 } 4279 4280 if (!netdev) { 4281 rdev = __cfg80211_rdev_from_attrs(genl_info_net(info), 4282 info->attrs); 4283 if (IS_ERR(rdev)) { 4284 rtnl_unlock(); 4285 return PTR_ERR(rdev); 4286 } 4287 wdev = NULL; 4288 netdev = NULL; 4289 result = 0; 4290 } else 4291 wdev = netdev->ieee80211_ptr; 4292 4293 guard(wiphy)(&rdev->wiphy); 4294 4295 /* 4296 * end workaround code, by now the rdev is available 4297 * and locked, and wdev may or may not be NULL. 4298 */ 4299 4300 if (info->attrs[NL80211_ATTR_WIPHY_NAME]) 4301 result = cfg80211_dev_rename( 4302 rdev, nla_data(info->attrs[NL80211_ATTR_WIPHY_NAME])); 4303 rtnl_unlock(); 4304 4305 if (result) 4306 return result; 4307 4308 if (info->attrs[NL80211_ATTR_WIPHY_RADIO_INDEX]) { 4309 /* Radio idx is not expected for non-multi radio wiphy */ 4310 if (rdev->wiphy.n_radio <= 0) 4311 return -EINVAL; 4312 4313 radio_idx = nla_get_u8( 4314 info->attrs[NL80211_ATTR_WIPHY_RADIO_INDEX]); 4315 if (radio_idx >= rdev->wiphy.n_radio) 4316 return -EINVAL; 4317 4318 return nl80211_set_wiphy_radio(info, rdev, radio_idx); 4319 } 4320 4321 if (info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS]) { 4322 struct ieee80211_txq_params txq_params; 4323 struct nlattr *tb[NL80211_TXQ_ATTR_MAX + 1]; 4324 4325 if (!rdev->ops->set_txq_params) 4326 return -EOPNOTSUPP; 4327 4328 if (!netdev) 4329 return -EINVAL; 4330 4331 if (netdev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 4332 netdev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 4333 return -EINVAL; 4334 4335 if (!netif_running(netdev)) 4336 return -ENETDOWN; 4337 4338 nla_for_each_nested(nl_txq_params, 4339 info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS], 4340 rem_txq_params) { 4341 result = nla_parse_nested_deprecated(tb, 4342 NL80211_TXQ_ATTR_MAX, 4343 nl_txq_params, 4344 txq_params_policy, 4345 info->extack); 4346 if (result) 4347 return result; 4348 4349 result = parse_txq_params(tb, &txq_params); 4350 if (result) 4351 return result; 4352 4353 txq_params.link_id = 4354 nl80211_link_id_or_invalid(info->attrs); 4355 4356 if (txq_params.link_id >= 0 && 4357 !(netdev->ieee80211_ptr->valid_links & 4358 BIT(txq_params.link_id))) 4359 result = -ENOLINK; 4360 else if (txq_params.link_id >= 0 && 4361 !netdev->ieee80211_ptr->valid_links) 4362 result = -EINVAL; 4363 else 4364 result = rdev_set_txq_params(rdev, netdev, 4365 &txq_params); 4366 if (result) 4367 return result; 4368 } 4369 } 4370 4371 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { 4372 int link_id = nl80211_link_id_or_invalid(info->attrs); 4373 4374 if (wdev) { 4375 result = __nl80211_set_channel( 4376 rdev, 4377 nl80211_can_set_dev_channel(wdev) ? netdev : NULL, 4378 info, link_id); 4379 } else { 4380 result = __nl80211_set_channel(rdev, netdev, info, link_id); 4381 } 4382 4383 if (result) 4384 return result; 4385 } 4386 4387 if (info->attrs[NL80211_ATTR_WIPHY_TX_POWER_SETTING]) { 4388 struct wireless_dev *txp_wdev = wdev; 4389 enum nl80211_tx_power_setting type; 4390 int idx, mbm = 0; 4391 4392 if (!(rdev->wiphy.features & NL80211_FEATURE_VIF_TXPOWER)) 4393 txp_wdev = NULL; 4394 4395 if (!rdev->ops->set_tx_power) 4396 return -EOPNOTSUPP; 4397 4398 idx = NL80211_ATTR_WIPHY_TX_POWER_SETTING; 4399 type = nla_get_u32(info->attrs[idx]); 4400 4401 if (!info->attrs[NL80211_ATTR_WIPHY_TX_POWER_LEVEL] && 4402 (type != NL80211_TX_POWER_AUTOMATIC)) 4403 return -EINVAL; 4404 4405 if (type != NL80211_TX_POWER_AUTOMATIC) { 4406 idx = NL80211_ATTR_WIPHY_TX_POWER_LEVEL; 4407 mbm = nla_get_u32(info->attrs[idx]); 4408 } 4409 4410 result = rdev_set_tx_power(rdev, txp_wdev, radio_idx, type, 4411 mbm); 4412 if (result) 4413 return result; 4414 } 4415 4416 if (info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX] && 4417 info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]) { 4418 u32 tx_ant, rx_ant; 4419 4420 if ((!rdev->wiphy.available_antennas_tx && 4421 !rdev->wiphy.available_antennas_rx) || 4422 !rdev->ops->set_antenna) 4423 return -EOPNOTSUPP; 4424 4425 tx_ant = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX]); 4426 rx_ant = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]); 4427 4428 /* reject antenna configurations which don't match the 4429 * available antenna masks, except for the "all" mask */ 4430 if ((~tx_ant && (tx_ant & ~rdev->wiphy.available_antennas_tx)) || 4431 (~rx_ant && (rx_ant & ~rdev->wiphy.available_antennas_rx))) 4432 return -EINVAL; 4433 4434 tx_ant = tx_ant & rdev->wiphy.available_antennas_tx; 4435 rx_ant = rx_ant & rdev->wiphy.available_antennas_rx; 4436 4437 result = rdev_set_antenna(rdev, radio_idx, tx_ant, rx_ant); 4438 if (result) 4439 return result; 4440 } 4441 4442 changed = 0; 4443 4444 if (info->attrs[NL80211_ATTR_WIPHY_RETRY_SHORT]) { 4445 retry_short = nla_get_u8( 4446 info->attrs[NL80211_ATTR_WIPHY_RETRY_SHORT]); 4447 4448 changed |= WIPHY_PARAM_RETRY_SHORT; 4449 } 4450 4451 if (info->attrs[NL80211_ATTR_WIPHY_RETRY_LONG]) { 4452 retry_long = nla_get_u8( 4453 info->attrs[NL80211_ATTR_WIPHY_RETRY_LONG]); 4454 4455 changed |= WIPHY_PARAM_RETRY_LONG; 4456 } 4457 4458 if (info->attrs[NL80211_ATTR_WIPHY_FRAG_THRESHOLD]) { 4459 frag_threshold = nla_get_u32( 4460 info->attrs[NL80211_ATTR_WIPHY_FRAG_THRESHOLD]); 4461 if (frag_threshold < 256) 4462 return -EINVAL; 4463 4464 if (frag_threshold != (u32) -1) { 4465 /* 4466 * Fragments (apart from the last one) are required to 4467 * have even length. Make the fragmentation code 4468 * simpler by stripping LSB should someone try to use 4469 * odd threshold value. 4470 */ 4471 frag_threshold &= ~0x1; 4472 } 4473 changed |= WIPHY_PARAM_FRAG_THRESHOLD; 4474 } 4475 4476 if (info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]) { 4477 rts_threshold = nla_get_u32( 4478 info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]); 4479 changed |= WIPHY_PARAM_RTS_THRESHOLD; 4480 } 4481 4482 if (info->attrs[NL80211_ATTR_WIPHY_COVERAGE_CLASS]) { 4483 if (info->attrs[NL80211_ATTR_WIPHY_DYN_ACK]) 4484 return -EINVAL; 4485 4486 coverage_class = nla_get_u8( 4487 info->attrs[NL80211_ATTR_WIPHY_COVERAGE_CLASS]); 4488 changed |= WIPHY_PARAM_COVERAGE_CLASS; 4489 } 4490 4491 if (info->attrs[NL80211_ATTR_WIPHY_DYN_ACK]) { 4492 if (!(rdev->wiphy.features & NL80211_FEATURE_ACKTO_ESTIMATION)) 4493 return -EOPNOTSUPP; 4494 4495 changed |= WIPHY_PARAM_DYN_ACK; 4496 } 4497 4498 if (info->attrs[NL80211_ATTR_TXQ_LIMIT]) { 4499 if (!wiphy_ext_feature_isset(&rdev->wiphy, 4500 NL80211_EXT_FEATURE_TXQS)) 4501 return -EOPNOTSUPP; 4502 4503 txq_limit = nla_get_u32( 4504 info->attrs[NL80211_ATTR_TXQ_LIMIT]); 4505 changed |= WIPHY_PARAM_TXQ_LIMIT; 4506 } 4507 4508 if (info->attrs[NL80211_ATTR_TXQ_MEMORY_LIMIT]) { 4509 if (!wiphy_ext_feature_isset(&rdev->wiphy, 4510 NL80211_EXT_FEATURE_TXQS)) 4511 return -EOPNOTSUPP; 4512 4513 txq_memory_limit = nla_get_u32( 4514 info->attrs[NL80211_ATTR_TXQ_MEMORY_LIMIT]); 4515 changed |= WIPHY_PARAM_TXQ_MEMORY_LIMIT; 4516 } 4517 4518 if (info->attrs[NL80211_ATTR_TXQ_QUANTUM]) { 4519 if (!wiphy_ext_feature_isset(&rdev->wiphy, 4520 NL80211_EXT_FEATURE_TXQS)) 4521 return -EOPNOTSUPP; 4522 4523 txq_quantum = nla_get_u32( 4524 info->attrs[NL80211_ATTR_TXQ_QUANTUM]); 4525 changed |= WIPHY_PARAM_TXQ_QUANTUM; 4526 } 4527 4528 if (changed) { 4529 u8 old_retry_short, old_retry_long; 4530 u32 old_frag_threshold, old_rts_threshold; 4531 u8 old_coverage_class, i; 4532 u32 old_txq_limit, old_txq_memory_limit, old_txq_quantum; 4533 u32 *old_radio_rts_threshold = NULL; 4534 4535 if (!rdev->ops->set_wiphy_params) 4536 return -EOPNOTSUPP; 4537 4538 if (rdev->wiphy.n_radio) { 4539 old_radio_rts_threshold = kcalloc(rdev->wiphy.n_radio, 4540 sizeof(u32), 4541 GFP_KERNEL); 4542 if (!old_radio_rts_threshold) 4543 return -ENOMEM; 4544 } 4545 4546 old_retry_short = rdev->wiphy.retry_short; 4547 old_retry_long = rdev->wiphy.retry_long; 4548 old_frag_threshold = rdev->wiphy.frag_threshold; 4549 old_rts_threshold = rdev->wiphy.rts_threshold; 4550 if (old_radio_rts_threshold) { 4551 for (i = 0 ; i < rdev->wiphy.n_radio; i++) 4552 old_radio_rts_threshold[i] = 4553 rdev->wiphy.radio_cfg[i].rts_threshold; 4554 } 4555 old_coverage_class = rdev->wiphy.coverage_class; 4556 old_txq_limit = rdev->wiphy.txq_limit; 4557 old_txq_memory_limit = rdev->wiphy.txq_memory_limit; 4558 old_txq_quantum = rdev->wiphy.txq_quantum; 4559 4560 if (changed & WIPHY_PARAM_RETRY_SHORT) 4561 rdev->wiphy.retry_short = retry_short; 4562 if (changed & WIPHY_PARAM_RETRY_LONG) 4563 rdev->wiphy.retry_long = retry_long; 4564 if (changed & WIPHY_PARAM_FRAG_THRESHOLD) 4565 rdev->wiphy.frag_threshold = frag_threshold; 4566 if (changed & WIPHY_PARAM_RTS_THRESHOLD) { 4567 rdev->wiphy.rts_threshold = rts_threshold; 4568 if (old_radio_rts_threshold) { 4569 for (i = 0; i < rdev->wiphy.n_radio; i++) 4570 rdev->wiphy.radio_cfg[i].rts_threshold = 4571 rdev->wiphy.rts_threshold; 4572 } 4573 } 4574 if (changed & WIPHY_PARAM_COVERAGE_CLASS) 4575 rdev->wiphy.coverage_class = coverage_class; 4576 if (changed & WIPHY_PARAM_TXQ_LIMIT) 4577 rdev->wiphy.txq_limit = txq_limit; 4578 if (changed & WIPHY_PARAM_TXQ_MEMORY_LIMIT) 4579 rdev->wiphy.txq_memory_limit = txq_memory_limit; 4580 if (changed & WIPHY_PARAM_TXQ_QUANTUM) 4581 rdev->wiphy.txq_quantum = txq_quantum; 4582 4583 result = rdev_set_wiphy_params(rdev, radio_idx, changed); 4584 if (result) { 4585 rdev->wiphy.retry_short = old_retry_short; 4586 rdev->wiphy.retry_long = old_retry_long; 4587 rdev->wiphy.frag_threshold = old_frag_threshold; 4588 rdev->wiphy.rts_threshold = old_rts_threshold; 4589 if (old_radio_rts_threshold) { 4590 for (i = 0 ; i < rdev->wiphy.n_radio; i++) 4591 rdev->wiphy.radio_cfg[i].rts_threshold = 4592 old_radio_rts_threshold[i]; 4593 } 4594 rdev->wiphy.coverage_class = old_coverage_class; 4595 rdev->wiphy.txq_limit = old_txq_limit; 4596 rdev->wiphy.txq_memory_limit = old_txq_memory_limit; 4597 rdev->wiphy.txq_quantum = old_txq_quantum; 4598 } 4599 4600 kfree(old_radio_rts_threshold); 4601 return result; 4602 } 4603 4604 return 0; 4605 } 4606 4607 int nl80211_send_chandef(struct sk_buff *msg, const struct cfg80211_chan_def *chandef) 4608 { 4609 if (WARN_ON(!cfg80211_chandef_valid(chandef))) 4610 return -EINVAL; 4611 4612 if (nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, 4613 chandef->chan->center_freq)) 4614 return -ENOBUFS; 4615 if (nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ_OFFSET, 4616 chandef->chan->freq_offset)) 4617 return -ENOBUFS; 4618 switch (chandef->width) { 4619 case NL80211_CHAN_WIDTH_20_NOHT: 4620 case NL80211_CHAN_WIDTH_20: 4621 case NL80211_CHAN_WIDTH_40: 4622 if (nla_put_u32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE, 4623 cfg80211_get_chandef_type(chandef))) 4624 return -ENOBUFS; 4625 break; 4626 default: 4627 break; 4628 } 4629 if (nla_put_u32(msg, NL80211_ATTR_CHANNEL_WIDTH, chandef->width)) 4630 return -ENOBUFS; 4631 if (nla_put_u32(msg, NL80211_ATTR_CENTER_FREQ1, chandef->center_freq1)) 4632 return -ENOBUFS; 4633 if (chandef->freq1_offset && 4634 nla_put_u32(msg, NL80211_ATTR_CENTER_FREQ1_OFFSET, 4635 chandef->freq1_offset)) 4636 return -ENOBUFS; 4637 if (chandef->center_freq2 && 4638 nla_put_u32(msg, NL80211_ATTR_CENTER_FREQ2, chandef->center_freq2)) 4639 return -ENOBUFS; 4640 if (chandef->punctured && 4641 nla_put_u32(msg, NL80211_ATTR_PUNCT_BITMAP, chandef->punctured)) 4642 return -ENOBUFS; 4643 if (chandef->s1g_primary_2mhz && 4644 nla_put_flag(msg, NL80211_ATTR_S1G_PRIMARY_2MHZ)) 4645 return -ENOBUFS; 4646 4647 if (chandef->npca_chan && 4648 nla_put_u32(msg, NL80211_ATTR_NPCA_PRIMARY_FREQ, 4649 chandef->npca_chan->center_freq)) 4650 return -ENOBUFS; 4651 if (chandef->npca_punctured && 4652 nla_put_u32(msg, NL80211_ATTR_NPCA_PUNCT_BITMAP, 4653 chandef->npca_punctured)) 4654 return -ENOBUFS; 4655 4656 return 0; 4657 } 4658 EXPORT_SYMBOL(nl80211_send_chandef); 4659 4660 static int nl80211_send_iface(struct sk_buff *msg, u32 portid, u32 seq, int flags, 4661 struct cfg80211_registered_device *rdev, 4662 struct wireless_dev *wdev, 4663 enum nl80211_commands cmd) 4664 { 4665 struct net_device *dev = wdev->netdev; 4666 void *hdr; 4667 4668 lockdep_assert_wiphy(&rdev->wiphy); 4669 4670 WARN_ON(cmd != NL80211_CMD_NEW_INTERFACE && 4671 cmd != NL80211_CMD_DEL_INTERFACE && 4672 cmd != NL80211_CMD_SET_INTERFACE); 4673 4674 hdr = nl80211hdr_put(msg, portid, seq, flags, cmd); 4675 if (!hdr) 4676 return -1; 4677 4678 if (dev && 4679 (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 4680 nla_put_string(msg, NL80211_ATTR_IFNAME, dev->name))) 4681 goto nla_put_failure; 4682 4683 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 4684 nla_put_u32(msg, NL80211_ATTR_IFTYPE, wdev->iftype) || 4685 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 4686 NL80211_ATTR_PAD) || 4687 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, wdev_address(wdev)) || 4688 nla_put_u32(msg, NL80211_ATTR_GENERATION, 4689 rdev->devlist_generation ^ 4690 (cfg80211_rdev_list_generation << 2)) || 4691 nla_put_u8(msg, NL80211_ATTR_4ADDR, wdev->use_4addr) || 4692 nla_put_u32(msg, NL80211_ATTR_VIF_RADIO_MASK, wdev->radio_mask)) 4693 goto nla_put_failure; 4694 4695 if (rdev->ops->get_channel && !wdev->valid_links) { 4696 struct cfg80211_chan_def chandef = {}; 4697 int ret; 4698 4699 ret = rdev_get_channel(rdev, wdev, 0, &chandef); 4700 if (ret == 0 && nl80211_send_chandef(msg, &chandef)) 4701 goto nla_put_failure; 4702 } 4703 4704 if (rdev->ops->get_tx_power && !wdev->valid_links) { 4705 int dbm, ret; 4706 4707 ret = rdev_get_tx_power(rdev, wdev, -1, 0, &dbm); 4708 if (ret == 0 && 4709 nla_put_u32(msg, NL80211_ATTR_WIPHY_TX_POWER_LEVEL, 4710 DBM_TO_MBM(dbm))) 4711 goto nla_put_failure; 4712 } 4713 4714 switch (wdev->iftype) { 4715 case NL80211_IFTYPE_AP: 4716 case NL80211_IFTYPE_P2P_GO: 4717 if (wdev->u.ap.ssid_len && 4718 nla_put(msg, NL80211_ATTR_SSID, wdev->u.ap.ssid_len, 4719 wdev->u.ap.ssid)) 4720 goto nla_put_failure; 4721 break; 4722 case NL80211_IFTYPE_STATION: 4723 case NL80211_IFTYPE_P2P_CLIENT: 4724 if (wdev->u.client.ssid_len && 4725 nla_put(msg, NL80211_ATTR_SSID, wdev->u.client.ssid_len, 4726 wdev->u.client.ssid)) 4727 goto nla_put_failure; 4728 break; 4729 case NL80211_IFTYPE_ADHOC: 4730 if (wdev->u.ibss.ssid_len && 4731 nla_put(msg, NL80211_ATTR_SSID, wdev->u.ibss.ssid_len, 4732 wdev->u.ibss.ssid)) 4733 goto nla_put_failure; 4734 break; 4735 default: 4736 /* nothing */ 4737 break; 4738 } 4739 4740 if (rdev->ops->get_txq_stats) { 4741 struct cfg80211_txq_stats txqstats = {}; 4742 int ret = rdev_get_txq_stats(rdev, wdev, &txqstats); 4743 4744 if (ret == 0 && 4745 !nl80211_put_txq_stats(msg, &txqstats, 4746 NL80211_ATTR_TXQ_STATS)) 4747 goto nla_put_failure; 4748 } 4749 4750 if (wdev->valid_links) { 4751 unsigned int link_id; 4752 struct nlattr *links = nla_nest_start(msg, 4753 NL80211_ATTR_MLO_LINKS); 4754 4755 if (!links) 4756 goto nla_put_failure; 4757 4758 for_each_valid_link(wdev, link_id) { 4759 struct nlattr *link = nla_nest_start(msg, link_id + 1); 4760 struct cfg80211_chan_def chandef = {}; 4761 int ret; 4762 4763 if (!link) 4764 goto nla_put_failure; 4765 4766 if (nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link_id)) 4767 goto nla_put_failure; 4768 if (nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, 4769 wdev->links[link_id].addr)) 4770 goto nla_put_failure; 4771 4772 ret = rdev_get_channel(rdev, wdev, link_id, &chandef); 4773 if (ret == 0 && nl80211_send_chandef(msg, &chandef)) 4774 goto nla_put_failure; 4775 4776 if (rdev->ops->get_tx_power) { 4777 int dbm, ret; 4778 4779 ret = rdev_get_tx_power(rdev, wdev, -1, link_id, &dbm); 4780 if (ret == 0 && 4781 nla_put_u32(msg, NL80211_ATTR_WIPHY_TX_POWER_LEVEL, 4782 DBM_TO_MBM(dbm))) 4783 goto nla_put_failure; 4784 } 4785 nla_nest_end(msg, link); 4786 } 4787 4788 nla_nest_end(msg, links); 4789 } 4790 4791 genlmsg_end(msg, hdr); 4792 return 0; 4793 4794 nla_put_failure: 4795 genlmsg_cancel(msg, hdr); 4796 return -EMSGSIZE; 4797 } 4798 4799 static int nl80211_dump_interface(struct sk_buff *skb, struct netlink_callback *cb) 4800 { 4801 int wp_idx = 0; 4802 int if_idx = 0; 4803 int wp_start = cb->args[0]; 4804 int if_start = cb->args[1]; 4805 int filter_wiphy = -1; 4806 struct cfg80211_registered_device *rdev; 4807 struct wireless_dev *wdev; 4808 int ret; 4809 4810 rtnl_lock(); 4811 if (!cb->args[2]) { 4812 struct nl80211_dump_wiphy_state state = { 4813 .filter_wiphy = -1, 4814 }; 4815 4816 ret = nl80211_dump_wiphy_parse(skb, cb, &state); 4817 if (ret) 4818 goto out_unlock; 4819 4820 filter_wiphy = state.filter_wiphy; 4821 4822 /* 4823 * if filtering, set cb->args[2] to +1 since 0 is the default 4824 * value needed to determine that parsing is necessary. 4825 */ 4826 if (filter_wiphy >= 0) 4827 cb->args[2] = filter_wiphy + 1; 4828 else 4829 cb->args[2] = -1; 4830 } else if (cb->args[2] > 0) { 4831 filter_wiphy = cb->args[2] - 1; 4832 } 4833 4834 for_each_rdev(rdev) { 4835 if (!net_eq(wiphy_net(&rdev->wiphy), sock_net(skb->sk))) 4836 continue; 4837 if (wp_idx < wp_start) { 4838 wp_idx++; 4839 continue; 4840 } 4841 4842 if (filter_wiphy >= 0 && filter_wiphy != rdev->wiphy_idx) 4843 continue; 4844 4845 if_idx = 0; 4846 4847 guard(wiphy)(&rdev->wiphy); 4848 4849 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) { 4850 if (if_idx < if_start) { 4851 if_idx++; 4852 continue; 4853 } 4854 4855 if (nl80211_send_iface(skb, NETLINK_CB(cb->skb).portid, 4856 cb->nlh->nlmsg_seq, NLM_F_MULTI, 4857 rdev, wdev, 4858 NL80211_CMD_NEW_INTERFACE) < 0) 4859 goto out; 4860 4861 if_idx++; 4862 } 4863 4864 if_start = 0; 4865 wp_idx++; 4866 } 4867 out: 4868 cb->args[0] = wp_idx; 4869 cb->args[1] = if_idx; 4870 4871 ret = skb->len; 4872 out_unlock: 4873 rtnl_unlock(); 4874 4875 return ret; 4876 } 4877 4878 static int nl80211_get_interface(struct sk_buff *skb, struct genl_info *info) 4879 { 4880 struct sk_buff *msg; 4881 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 4882 struct wireless_dev *wdev = info->user_ptr[1]; 4883 4884 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 4885 if (!msg) 4886 return -ENOMEM; 4887 4888 if (nl80211_send_iface(msg, info->snd_portid, info->snd_seq, 0, 4889 rdev, wdev, NL80211_CMD_NEW_INTERFACE) < 0) { 4890 nlmsg_free(msg); 4891 return -ENOBUFS; 4892 } 4893 4894 return genlmsg_reply(msg, info); 4895 } 4896 4897 static const struct nla_policy mntr_flags_policy[NL80211_MNTR_FLAG_MAX + 1] = { 4898 [NL80211_MNTR_FLAG_FCSFAIL] = { .type = NLA_FLAG }, 4899 [NL80211_MNTR_FLAG_PLCPFAIL] = { .type = NLA_FLAG }, 4900 [NL80211_MNTR_FLAG_CONTROL] = { .type = NLA_FLAG }, 4901 [NL80211_MNTR_FLAG_OTHER_BSS] = { .type = NLA_FLAG }, 4902 [NL80211_MNTR_FLAG_COOK_FRAMES] = { .type = NLA_FLAG }, 4903 [NL80211_MNTR_FLAG_ACTIVE] = { .type = NLA_FLAG }, 4904 [NL80211_MNTR_FLAG_SKIP_TX] = { .type = NLA_FLAG }, 4905 }; 4906 4907 static int parse_monitor_flags(struct nlattr *nla, u32 *mntrflags) 4908 { 4909 struct nlattr *flags[NL80211_MNTR_FLAG_MAX + 1]; 4910 int flag; 4911 4912 *mntrflags = 0; 4913 4914 if (!nla) 4915 return -EINVAL; 4916 4917 if (nla_parse_nested_deprecated(flags, NL80211_MNTR_FLAG_MAX, nla, mntr_flags_policy, NULL)) 4918 return -EINVAL; 4919 4920 for (flag = 1; flag <= NL80211_MNTR_FLAG_MAX; flag++) 4921 if (flags[flag]) 4922 *mntrflags |= (1<<flag); 4923 4924 /* cooked monitor mode is incompatible with other modes */ 4925 if (*mntrflags & MONITOR_FLAG_COOK_FRAMES && 4926 *mntrflags != MONITOR_FLAG_COOK_FRAMES) 4927 return -EOPNOTSUPP; 4928 4929 *mntrflags |= MONITOR_FLAG_CHANGED; 4930 4931 return 0; 4932 } 4933 4934 static int nl80211_parse_mon_options(struct cfg80211_registered_device *rdev, 4935 enum nl80211_iftype type, 4936 struct genl_info *info, 4937 struct vif_params *params) 4938 { 4939 bool change = false; 4940 int err; 4941 4942 if (info->attrs[NL80211_ATTR_MNTR_FLAGS]) { 4943 if (type != NL80211_IFTYPE_MONITOR) 4944 return -EINVAL; 4945 4946 err = parse_monitor_flags(info->attrs[NL80211_ATTR_MNTR_FLAGS], 4947 ¶ms->flags); 4948 if (err) 4949 return err; 4950 4951 change = true; 4952 } 4953 4954 /* MONITOR_FLAG_COOK_FRAMES is deprecated, refuse cooperation */ 4955 if (params->flags & MONITOR_FLAG_COOK_FRAMES) 4956 return -EOPNOTSUPP; 4957 4958 if (params->flags & MONITOR_FLAG_ACTIVE && 4959 !(rdev->wiphy.features & NL80211_FEATURE_ACTIVE_MONITOR)) 4960 return -EOPNOTSUPP; 4961 4962 if (info->attrs[NL80211_ATTR_MU_MIMO_GROUP_DATA]) { 4963 const u8 *mumimo_groups; 4964 u32 cap_flag = NL80211_EXT_FEATURE_MU_MIMO_AIR_SNIFFER; 4965 4966 if (type != NL80211_IFTYPE_MONITOR) 4967 return -EINVAL; 4968 4969 if (!wiphy_ext_feature_isset(&rdev->wiphy, cap_flag)) 4970 return -EOPNOTSUPP; 4971 4972 mumimo_groups = 4973 nla_data(info->attrs[NL80211_ATTR_MU_MIMO_GROUP_DATA]); 4974 4975 /* bits 0 and 63 are reserved and must be zero */ 4976 if ((mumimo_groups[0] & BIT(0)) || 4977 (mumimo_groups[VHT_MUMIMO_GROUPS_DATA_LEN - 1] & BIT(7))) 4978 return -EINVAL; 4979 4980 params->vht_mumimo_groups = mumimo_groups; 4981 change = true; 4982 } 4983 4984 if (info->attrs[NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR]) { 4985 u32 cap_flag = NL80211_EXT_FEATURE_MU_MIMO_AIR_SNIFFER; 4986 4987 if (type != NL80211_IFTYPE_MONITOR) 4988 return -EINVAL; 4989 4990 if (!wiphy_ext_feature_isset(&rdev->wiphy, cap_flag)) 4991 return -EOPNOTSUPP; 4992 4993 params->vht_mumimo_follow_addr = 4994 nla_data(info->attrs[NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR]); 4995 change = true; 4996 } 4997 4998 return change ? 1 : 0; 4999 } 5000 5001 static int nl80211_valid_4addr(struct cfg80211_registered_device *rdev, 5002 struct net_device *netdev, u8 use_4addr, 5003 enum nl80211_iftype iftype) 5004 { 5005 if (!use_4addr) { 5006 if (netdev && netif_is_bridge_port(netdev)) 5007 return -EBUSY; 5008 return 0; 5009 } 5010 5011 switch (iftype) { 5012 case NL80211_IFTYPE_AP_VLAN: 5013 if (rdev->wiphy.flags & WIPHY_FLAG_4ADDR_AP) 5014 return 0; 5015 break; 5016 case NL80211_IFTYPE_STATION: 5017 if (rdev->wiphy.flags & WIPHY_FLAG_4ADDR_STATION) 5018 return 0; 5019 break; 5020 default: 5021 break; 5022 } 5023 5024 return -EOPNOTSUPP; 5025 } 5026 5027 static int nl80211_parse_vif_radio_mask(struct genl_info *info, 5028 u32 *radio_mask) 5029 { 5030 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 5031 struct nlattr *attr = info->attrs[NL80211_ATTR_VIF_RADIO_MASK]; 5032 u32 mask, allowed; 5033 5034 if (!attr) { 5035 *radio_mask = 0; 5036 return 0; 5037 } 5038 5039 allowed = BIT(rdev->wiphy.n_radio) - 1; 5040 mask = nla_get_u32(attr); 5041 if (mask & ~allowed) 5042 return -EINVAL; 5043 if (!mask) 5044 mask = allowed; 5045 *radio_mask = mask; 5046 5047 return 1; 5048 } 5049 5050 static int nl80211_set_interface(struct sk_buff *skb, struct genl_info *info) 5051 { 5052 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 5053 struct vif_params params; 5054 int err; 5055 enum nl80211_iftype otype, ntype; 5056 struct net_device *dev = info->user_ptr[1]; 5057 struct wireless_dev *wdev = dev->ieee80211_ptr; 5058 u32 radio_mask = 0; 5059 bool change = false; 5060 5061 memset(¶ms, 0, sizeof(params)); 5062 5063 otype = ntype = dev->ieee80211_ptr->iftype; 5064 5065 if (info->attrs[NL80211_ATTR_IFTYPE]) { 5066 ntype = nla_get_u32(info->attrs[NL80211_ATTR_IFTYPE]); 5067 if (otype != ntype) 5068 change = true; 5069 } 5070 5071 if (info->attrs[NL80211_ATTR_MESH_ID]) { 5072 if (ntype != NL80211_IFTYPE_MESH_POINT) 5073 return -EINVAL; 5074 if (otype != NL80211_IFTYPE_MESH_POINT) 5075 return -EINVAL; 5076 if (netif_running(dev)) 5077 return -EBUSY; 5078 5079 wdev->u.mesh.id_up_len = 5080 nla_len(info->attrs[NL80211_ATTR_MESH_ID]); 5081 memcpy(wdev->u.mesh.id, 5082 nla_data(info->attrs[NL80211_ATTR_MESH_ID]), 5083 wdev->u.mesh.id_up_len); 5084 } 5085 5086 if (info->attrs[NL80211_ATTR_4ADDR]) { 5087 params.use_4addr = !!nla_get_u8(info->attrs[NL80211_ATTR_4ADDR]); 5088 change = true; 5089 err = nl80211_valid_4addr(rdev, dev, params.use_4addr, ntype); 5090 if (err) 5091 return err; 5092 } else { 5093 params.use_4addr = -1; 5094 } 5095 5096 err = nl80211_parse_mon_options(rdev, ntype, info, ¶ms); 5097 if (err < 0) 5098 return err; 5099 if (err > 0) 5100 change = true; 5101 5102 err = nl80211_parse_vif_radio_mask(info, &radio_mask); 5103 if (err < 0) 5104 return err; 5105 if (err && netif_running(dev)) 5106 return -EBUSY; 5107 5108 if (change) 5109 err = cfg80211_change_iface(rdev, dev, ntype, ¶ms); 5110 else 5111 err = 0; 5112 5113 if (!err && params.use_4addr != -1) 5114 dev->ieee80211_ptr->use_4addr = params.use_4addr; 5115 5116 if (radio_mask) 5117 wdev->radio_mask = radio_mask; 5118 5119 if (change && !err) 5120 nl80211_notify_iface(rdev, wdev, NL80211_CMD_SET_INTERFACE); 5121 5122 return err; 5123 } 5124 5125 static int _nl80211_new_interface(struct sk_buff *skb, struct genl_info *info) 5126 { 5127 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 5128 struct vif_params params; 5129 struct wireless_dev *wdev; 5130 struct sk_buff *msg; 5131 u32 radio_mask; 5132 int err; 5133 enum nl80211_iftype type = NL80211_IFTYPE_UNSPECIFIED; 5134 5135 memset(¶ms, 0, sizeof(params)); 5136 5137 if (!info->attrs[NL80211_ATTR_IFNAME]) 5138 return -EINVAL; 5139 5140 if (info->attrs[NL80211_ATTR_IFTYPE]) 5141 type = nla_get_u32(info->attrs[NL80211_ATTR_IFTYPE]); 5142 5143 if (!rdev->ops->add_virtual_intf) 5144 return -EOPNOTSUPP; 5145 5146 if ((type == NL80211_IFTYPE_P2P_DEVICE || type == NL80211_IFTYPE_NAN || 5147 type == NL80211_IFTYPE_PD || 5148 rdev->wiphy.features & NL80211_FEATURE_MAC_ON_CREATE) && 5149 info->attrs[NL80211_ATTR_MAC]) { 5150 nla_memcpy(params.macaddr, info->attrs[NL80211_ATTR_MAC], 5151 ETH_ALEN); 5152 if (!is_valid_ether_addr(params.macaddr)) 5153 return -EADDRNOTAVAIL; 5154 } 5155 5156 if (info->attrs[NL80211_ATTR_4ADDR]) { 5157 params.use_4addr = !!nla_get_u8(info->attrs[NL80211_ATTR_4ADDR]); 5158 err = nl80211_valid_4addr(rdev, NULL, params.use_4addr, type); 5159 if (err) 5160 return err; 5161 } 5162 5163 if (!cfg80211_iftype_allowed(&rdev->wiphy, type, params.use_4addr, 0)) 5164 return -EOPNOTSUPP; 5165 5166 err = nl80211_parse_mon_options(rdev, type, info, ¶ms); 5167 if (err < 0) 5168 return err; 5169 5170 err = nl80211_parse_vif_radio_mask(info, &radio_mask); 5171 if (err < 0) 5172 return err; 5173 5174 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 5175 if (!msg) 5176 return -ENOMEM; 5177 5178 wdev = rdev_add_virtual_intf(rdev, 5179 nla_data(info->attrs[NL80211_ATTR_IFNAME]), 5180 NET_NAME_USER, type, ¶ms); 5181 if (WARN_ON(!wdev)) { 5182 nlmsg_free(msg); 5183 return -EPROTO; 5184 } else if (IS_ERR(wdev)) { 5185 nlmsg_free(msg); 5186 return PTR_ERR(wdev); 5187 } 5188 5189 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) 5190 wdev->owner_nlportid = info->snd_portid; 5191 5192 switch (type) { 5193 case NL80211_IFTYPE_MESH_POINT: 5194 if (!info->attrs[NL80211_ATTR_MESH_ID]) 5195 break; 5196 wdev->u.mesh.id_up_len = 5197 nla_len(info->attrs[NL80211_ATTR_MESH_ID]); 5198 memcpy(wdev->u.mesh.id, 5199 nla_data(info->attrs[NL80211_ATTR_MESH_ID]), 5200 wdev->u.mesh.id_up_len); 5201 break; 5202 case NL80211_IFTYPE_NAN: 5203 case NL80211_IFTYPE_P2P_DEVICE: 5204 case NL80211_IFTYPE_PD: 5205 /* 5206 * P2P Device, NAN and PD do not have a netdev, so don't go 5207 * through the netdev notifier and must be added here 5208 */ 5209 cfg80211_init_wdev(wdev); 5210 cfg80211_register_wdev(rdev, wdev); 5211 break; 5212 default: 5213 break; 5214 } 5215 5216 if (radio_mask) 5217 wdev->radio_mask = radio_mask; 5218 5219 if (nl80211_send_iface(msg, info->snd_portid, info->snd_seq, 0, 5220 rdev, wdev, NL80211_CMD_NEW_INTERFACE) < 0) { 5221 nlmsg_free(msg); 5222 return -ENOBUFS; 5223 } 5224 5225 return genlmsg_reply(msg, info); 5226 } 5227 5228 static int nl80211_new_interface(struct sk_buff *skb, struct genl_info *info) 5229 { 5230 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 5231 5232 /* to avoid failing a new interface creation due to pending removal */ 5233 cfg80211_destroy_ifaces(rdev); 5234 5235 guard(wiphy)(&rdev->wiphy); 5236 5237 return _nl80211_new_interface(skb, info); 5238 } 5239 5240 static int nl80211_del_interface(struct sk_buff *skb, struct genl_info *info) 5241 { 5242 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 5243 struct wireless_dev *wdev = info->user_ptr[1]; 5244 5245 if (!rdev->ops->del_virtual_intf) 5246 return -EOPNOTSUPP; 5247 5248 /* 5249 * We hold RTNL, so this is safe, without RTNL opencount cannot 5250 * reach 0, and thus the rdev cannot be deleted. 5251 * 5252 * We need to do it for the dev_close(), since that will call 5253 * the netdev notifiers, and we need to acquire the mutex there 5254 * but don't know if we get there from here or from some other 5255 * place (e.g. "ip link set ... down"). 5256 */ 5257 mutex_unlock(&rdev->wiphy.mtx); 5258 5259 /* 5260 * If we remove a wireless device without a netdev then clear 5261 * user_ptr[1] so that nl80211_post_doit won't dereference it 5262 * to check if it needs to do dev_put(). Otherwise it crashes 5263 * since the wdev has been freed, unlike with a netdev where 5264 * we need the dev_put() for the netdev to really be freed. 5265 */ 5266 if (!wdev->netdev) 5267 info->user_ptr[1] = NULL; 5268 else 5269 dev_close(wdev->netdev); 5270 5271 cfg80211_close_dependents(rdev, wdev); 5272 5273 mutex_lock(&rdev->wiphy.mtx); 5274 5275 return cfg80211_remove_virtual_intf(rdev, wdev); 5276 } 5277 5278 static int nl80211_set_noack_map(struct sk_buff *skb, struct genl_info *info) 5279 { 5280 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 5281 struct net_device *dev = info->user_ptr[1]; 5282 u16 noack_map; 5283 5284 if (!info->attrs[NL80211_ATTR_NOACK_MAP]) 5285 return -EINVAL; 5286 5287 if (!rdev->ops->set_noack_map) 5288 return -EOPNOTSUPP; 5289 5290 noack_map = nla_get_u16(info->attrs[NL80211_ATTR_NOACK_MAP]); 5291 5292 return rdev_set_noack_map(rdev, dev, noack_map); 5293 } 5294 5295 static int nl80211_validate_key_link_id(struct genl_info *info, 5296 struct wireless_dev *wdev, 5297 int link_id, bool pairwise) 5298 { 5299 if (pairwise) { 5300 if (link_id != -1) { 5301 GENL_SET_ERR_MSG(info, 5302 "link ID not allowed for pairwise key"); 5303 return -EINVAL; 5304 } 5305 5306 return 0; 5307 } 5308 5309 if (wdev->valid_links) { 5310 if (link_id == -1) { 5311 GENL_SET_ERR_MSG(info, 5312 "link ID must be set for MLO group key"); 5313 return -EINVAL; 5314 } 5315 if (!(wdev->valid_links & BIT(link_id))) { 5316 GENL_SET_ERR_MSG(info, "invalid link ID for MLO group key"); 5317 return -EINVAL; 5318 } 5319 } else if (link_id != -1) { 5320 GENL_SET_ERR_MSG(info, "link ID not allowed for non-MLO group key"); 5321 return -EINVAL; 5322 } 5323 5324 return 0; 5325 } 5326 5327 struct get_key_cookie { 5328 struct sk_buff *msg; 5329 int error; 5330 int idx; 5331 }; 5332 5333 static void get_key_callback(void *c, struct key_params *params) 5334 { 5335 struct nlattr *key; 5336 struct get_key_cookie *cookie = c; 5337 5338 if ((params->seq && 5339 nla_put(cookie->msg, NL80211_ATTR_KEY_SEQ, 5340 params->seq_len, params->seq)) || 5341 (params->cipher && 5342 nla_put_u32(cookie->msg, NL80211_ATTR_KEY_CIPHER, 5343 params->cipher))) 5344 goto nla_put_failure; 5345 5346 key = nla_nest_start_noflag(cookie->msg, NL80211_ATTR_KEY); 5347 if (!key) 5348 goto nla_put_failure; 5349 5350 if ((params->seq && 5351 nla_put(cookie->msg, NL80211_KEY_SEQ, 5352 params->seq_len, params->seq)) || 5353 (params->cipher && 5354 nla_put_u32(cookie->msg, NL80211_KEY_CIPHER, 5355 params->cipher))) 5356 goto nla_put_failure; 5357 5358 if (nla_put_u8(cookie->msg, NL80211_KEY_IDX, cookie->idx)) 5359 goto nla_put_failure; 5360 5361 nla_nest_end(cookie->msg, key); 5362 5363 return; 5364 nla_put_failure: 5365 cookie->error = 1; 5366 } 5367 5368 static int nl80211_get_key(struct sk_buff *skb, struct genl_info *info) 5369 { 5370 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 5371 int err; 5372 struct wireless_dev *wdev = info->user_ptr[1]; 5373 u8 key_idx = 0; 5374 const u8 *mac_addr = NULL; 5375 bool pairwise; 5376 struct get_key_cookie cookie = { 5377 .error = 0, 5378 }; 5379 void *hdr; 5380 struct sk_buff *msg; 5381 bool bigtk_support = false; 5382 int link_id = nl80211_link_id_or_invalid(info->attrs); 5383 5384 if (wiphy_ext_feature_isset(&rdev->wiphy, 5385 NL80211_EXT_FEATURE_BEACON_PROTECTION)) 5386 bigtk_support = true; 5387 5388 if ((wdev->iftype == NL80211_IFTYPE_STATION || 5389 wdev->iftype == NL80211_IFTYPE_P2P_CLIENT) && 5390 wiphy_ext_feature_isset(&rdev->wiphy, 5391 NL80211_EXT_FEATURE_BEACON_PROTECTION_CLIENT)) 5392 bigtk_support = true; 5393 5394 if (info->attrs[NL80211_ATTR_KEY_IDX]) { 5395 key_idx = nla_get_u8(info->attrs[NL80211_ATTR_KEY_IDX]); 5396 5397 if (key_idx >= 6 && key_idx <= 7 && !bigtk_support) { 5398 GENL_SET_ERR_MSG(info, "BIGTK not supported"); 5399 return -EINVAL; 5400 } 5401 } 5402 5403 if (info->attrs[NL80211_ATTR_MAC]) 5404 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 5405 5406 pairwise = !!mac_addr; 5407 if (info->attrs[NL80211_ATTR_KEY_TYPE]) { 5408 u32 kt = nla_get_u32(info->attrs[NL80211_ATTR_KEY_TYPE]); 5409 5410 if (kt != NL80211_KEYTYPE_GROUP && 5411 kt != NL80211_KEYTYPE_PAIRWISE) 5412 return -EINVAL; 5413 pairwise = kt == NL80211_KEYTYPE_PAIRWISE; 5414 } 5415 5416 if (!rdev->ops->get_key) 5417 return -EOPNOTSUPP; 5418 5419 if (!cfg80211_valid_key_idx(wdev, key_idx, pairwise, mac_addr)) 5420 return -ENOENT; 5421 5422 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 5423 if (!msg) 5424 return -ENOMEM; 5425 5426 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 5427 NL80211_CMD_NEW_KEY); 5428 if (!hdr) 5429 goto nla_put_failure; 5430 5431 cookie.msg = msg; 5432 cookie.idx = key_idx; 5433 5434 if ((wdev->netdev && 5435 nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex)) || 5436 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 5437 NL80211_ATTR_PAD) || 5438 nla_put_u8(msg, NL80211_ATTR_KEY_IDX, key_idx)) 5439 goto nla_put_failure; 5440 if (mac_addr && 5441 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr)) 5442 goto nla_put_failure; 5443 5444 err = nl80211_validate_key_link_id(info, wdev, link_id, pairwise); 5445 if (err) 5446 goto free_msg; 5447 5448 err = rdev_get_key(rdev, wdev, link_id, key_idx, pairwise, mac_addr, 5449 &cookie, get_key_callback); 5450 5451 if (err) 5452 goto free_msg; 5453 5454 if (cookie.error) 5455 goto nla_put_failure; 5456 5457 genlmsg_end(msg, hdr); 5458 return genlmsg_reply(msg, info); 5459 5460 nla_put_failure: 5461 err = -ENOBUFS; 5462 free_msg: 5463 nlmsg_free(msg); 5464 return err; 5465 } 5466 5467 static int nl80211_set_key(struct sk_buff *skb, struct genl_info *info) 5468 { 5469 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 5470 struct key_parse key; 5471 int err; 5472 struct wireless_dev *wdev = info->user_ptr[1]; 5473 int link_id = nl80211_link_id_or_invalid(info->attrs); 5474 5475 err = nl80211_parse_key(info, &key); 5476 if (err) 5477 return err; 5478 5479 if (key.idx < 0) 5480 return -EINVAL; 5481 5482 /* Only support setting default key and 5483 * Extended Key ID action NL80211_KEY_SET_TX. 5484 */ 5485 if (!key.def && !key.defmgmt && !key.defbeacon && 5486 !(key.p.mode == NL80211_KEY_SET_TX)) 5487 return -EINVAL; 5488 5489 if (key.def) { 5490 if (!rdev->ops->set_default_key) 5491 return -EOPNOTSUPP; 5492 5493 if (!wdev->netdev) 5494 return -EINVAL; 5495 5496 err = nl80211_key_allowed(wdev); 5497 if (err) 5498 return err; 5499 5500 err = nl80211_validate_key_link_id(info, wdev, link_id, false); 5501 if (err) 5502 return err; 5503 5504 err = rdev_set_default_key(rdev, wdev->netdev, link_id, key.idx, 5505 key.def_uni, key.def_multi); 5506 5507 if (err) 5508 return err; 5509 5510 #ifdef CONFIG_CFG80211_WEXT 5511 wdev->wext.default_key = key.idx; 5512 #endif 5513 return 0; 5514 } else if (key.defmgmt) { 5515 if (key.def_uni || !key.def_multi) 5516 return -EINVAL; 5517 5518 if (!rdev->ops->set_default_mgmt_key) 5519 return -EOPNOTSUPP; 5520 5521 err = nl80211_key_allowed(wdev); 5522 if (err) 5523 return err; 5524 5525 err = nl80211_validate_key_link_id(info, wdev, link_id, false); 5526 if (err) 5527 return err; 5528 5529 err = rdev_set_default_mgmt_key(rdev, wdev, link_id, key.idx); 5530 if (err) 5531 return err; 5532 5533 #ifdef CONFIG_CFG80211_WEXT 5534 wdev->wext.default_mgmt_key = key.idx; 5535 #endif 5536 return 0; 5537 } else if (key.defbeacon) { 5538 if (key.def_uni || !key.def_multi) 5539 return -EINVAL; 5540 5541 if (!rdev->ops->set_default_beacon_key) 5542 return -EOPNOTSUPP; 5543 5544 err = nl80211_key_allowed(wdev); 5545 if (err) 5546 return err; 5547 5548 err = nl80211_validate_key_link_id(info, wdev, link_id, false); 5549 if (err) 5550 return err; 5551 5552 return rdev_set_default_beacon_key(rdev, wdev, link_id, 5553 key.idx); 5554 } else if (key.p.mode == NL80211_KEY_SET_TX && 5555 wiphy_ext_feature_isset(&rdev->wiphy, 5556 NL80211_EXT_FEATURE_EXT_KEY_ID)) { 5557 u8 *mac_addr = NULL; 5558 5559 if (info->attrs[NL80211_ATTR_MAC]) 5560 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 5561 5562 if (!mac_addr || key.idx < 0 || key.idx > 1) 5563 return -EINVAL; 5564 5565 err = nl80211_validate_key_link_id(info, wdev, link_id, true); 5566 if (err) 5567 return err; 5568 5569 return rdev_add_key(rdev, wdev, link_id, key.idx, 5570 NL80211_KEYTYPE_PAIRWISE, 5571 mac_addr, &key.p); 5572 } 5573 5574 return -EINVAL; 5575 } 5576 5577 static int nl80211_new_key(struct sk_buff *skb, struct genl_info *info) 5578 { 5579 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 5580 int err; 5581 struct wireless_dev *wdev = info->user_ptr[1]; 5582 struct key_parse key; 5583 const u8 *mac_addr = NULL; 5584 int link_id = nl80211_link_id_or_invalid(info->attrs); 5585 5586 err = nl80211_parse_key(info, &key); 5587 if (err) 5588 return err; 5589 5590 if (!key.p.key) { 5591 GENL_SET_ERR_MSG(info, "no key"); 5592 return -EINVAL; 5593 } 5594 5595 if (info->attrs[NL80211_ATTR_MAC]) 5596 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 5597 5598 if (key.type == -1) { 5599 if (mac_addr) 5600 key.type = NL80211_KEYTYPE_PAIRWISE; 5601 else 5602 key.type = NL80211_KEYTYPE_GROUP; 5603 } 5604 5605 /* for now */ 5606 if (key.type != NL80211_KEYTYPE_PAIRWISE && 5607 key.type != NL80211_KEYTYPE_GROUP) { 5608 GENL_SET_ERR_MSG(info, "key type not pairwise or group"); 5609 return -EINVAL; 5610 } 5611 5612 if (key.type == NL80211_KEYTYPE_GROUP && 5613 info->attrs[NL80211_ATTR_VLAN_ID]) 5614 key.p.vlan_id = nla_get_u16(info->attrs[NL80211_ATTR_VLAN_ID]); 5615 5616 if (!rdev->ops->add_key) 5617 return -EOPNOTSUPP; 5618 5619 if (cfg80211_validate_key_settings(rdev, wdev, &key.p, key.idx, 5620 key.type == NL80211_KEYTYPE_PAIRWISE, 5621 mac_addr)) { 5622 GENL_SET_ERR_MSG(info, "key setting validation failed"); 5623 return -EINVAL; 5624 } 5625 5626 err = nl80211_key_allowed(wdev); 5627 if (err) 5628 GENL_SET_ERR_MSG(info, "key not allowed"); 5629 5630 if (!err) 5631 err = nl80211_validate_key_link_id(info, wdev, link_id, 5632 key.type == NL80211_KEYTYPE_PAIRWISE); 5633 5634 if (!err) { 5635 err = rdev_add_key(rdev, wdev, link_id, key.idx, 5636 key.type == NL80211_KEYTYPE_PAIRWISE, 5637 mac_addr, &key.p); 5638 if (err) 5639 GENL_SET_ERR_MSG(info, "key addition failed"); 5640 } 5641 5642 return err; 5643 } 5644 5645 static int nl80211_del_key(struct sk_buff *skb, struct genl_info *info) 5646 { 5647 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 5648 int err; 5649 struct wireless_dev *wdev = info->user_ptr[1]; 5650 u8 *mac_addr = NULL; 5651 struct key_parse key; 5652 int link_id = nl80211_link_id_or_invalid(info->attrs); 5653 5654 err = nl80211_parse_key(info, &key); 5655 if (err) 5656 return err; 5657 5658 if (info->attrs[NL80211_ATTR_MAC]) 5659 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 5660 5661 if (key.type == -1) { 5662 if (mac_addr) 5663 key.type = NL80211_KEYTYPE_PAIRWISE; 5664 else 5665 key.type = NL80211_KEYTYPE_GROUP; 5666 } 5667 5668 /* for now */ 5669 if (key.type != NL80211_KEYTYPE_PAIRWISE && 5670 key.type != NL80211_KEYTYPE_GROUP) 5671 return -EINVAL; 5672 5673 if (!cfg80211_valid_key_idx(wdev, key.idx, 5674 key.type == NL80211_KEYTYPE_PAIRWISE, 5675 mac_addr)) 5676 return -EINVAL; 5677 5678 if (!rdev->ops->del_key) 5679 return -EOPNOTSUPP; 5680 5681 err = nl80211_key_allowed(wdev); 5682 5683 if (!err) 5684 err = nl80211_validate_key_link_id(info, wdev, link_id, 5685 key.type == NL80211_KEYTYPE_PAIRWISE); 5686 5687 if (!err) 5688 err = rdev_del_key(rdev, wdev, link_id, key.idx, 5689 key.type == NL80211_KEYTYPE_PAIRWISE, 5690 mac_addr); 5691 5692 #ifdef CONFIG_CFG80211_WEXT 5693 if (!err) { 5694 if (key.idx == wdev->wext.default_key) 5695 wdev->wext.default_key = -1; 5696 else if (key.idx == wdev->wext.default_mgmt_key) 5697 wdev->wext.default_mgmt_key = -1; 5698 } 5699 #endif 5700 5701 return err; 5702 } 5703 5704 /* This function returns an error or the number of nested attributes */ 5705 static int validate_acl_mac_addrs(struct nlattr *nl_attr) 5706 { 5707 struct nlattr *attr; 5708 int n_entries = 0, tmp; 5709 5710 nla_for_each_nested(attr, nl_attr, tmp) { 5711 if (nla_len(attr) != ETH_ALEN) 5712 return -EINVAL; 5713 5714 n_entries++; 5715 } 5716 5717 return n_entries; 5718 } 5719 5720 /* 5721 * This function parses ACL information and allocates memory for ACL data. 5722 * On successful return, the calling function is responsible to free the 5723 * ACL buffer returned by this function. 5724 */ 5725 static struct cfg80211_acl_data *parse_acl_data(struct wiphy *wiphy, 5726 struct genl_info *info) 5727 { 5728 enum nl80211_acl_policy acl_policy; 5729 struct nlattr *attr; 5730 struct cfg80211_acl_data *acl; 5731 int i = 0, n_entries, tmp; 5732 5733 if (!wiphy->max_acl_mac_addrs) 5734 return ERR_PTR(-EOPNOTSUPP); 5735 5736 if (!info->attrs[NL80211_ATTR_ACL_POLICY]) 5737 return ERR_PTR(-EINVAL); 5738 5739 acl_policy = nla_get_u32(info->attrs[NL80211_ATTR_ACL_POLICY]); 5740 if (acl_policy != NL80211_ACL_POLICY_ACCEPT_UNLESS_LISTED && 5741 acl_policy != NL80211_ACL_POLICY_DENY_UNLESS_LISTED) 5742 return ERR_PTR(-EINVAL); 5743 5744 if (!info->attrs[NL80211_ATTR_MAC_ADDRS]) 5745 return ERR_PTR(-EINVAL); 5746 5747 n_entries = validate_acl_mac_addrs(info->attrs[NL80211_ATTR_MAC_ADDRS]); 5748 if (n_entries < 0) 5749 return ERR_PTR(n_entries); 5750 5751 if (n_entries > wiphy->max_acl_mac_addrs) 5752 return ERR_PTR(-EOPNOTSUPP); 5753 5754 acl = kzalloc_flex(*acl, mac_addrs, n_entries); 5755 if (!acl) 5756 return ERR_PTR(-ENOMEM); 5757 acl->n_acl_entries = n_entries; 5758 5759 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_MAC_ADDRS], tmp) { 5760 memcpy(acl->mac_addrs[i].addr, nla_data(attr), ETH_ALEN); 5761 i++; 5762 } 5763 acl->acl_policy = acl_policy; 5764 5765 return acl; 5766 } 5767 5768 static int nl80211_set_mac_acl(struct sk_buff *skb, struct genl_info *info) 5769 { 5770 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 5771 struct net_device *dev = info->user_ptr[1]; 5772 struct cfg80211_acl_data *acl; 5773 int err; 5774 5775 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 5776 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 5777 return -EOPNOTSUPP; 5778 5779 if (!dev->ieee80211_ptr->links[0].ap.beacon_interval) 5780 return -EINVAL; 5781 5782 acl = parse_acl_data(&rdev->wiphy, info); 5783 if (IS_ERR(acl)) 5784 return PTR_ERR(acl); 5785 5786 err = rdev_set_mac_acl(rdev, dev, acl); 5787 5788 kfree(acl); 5789 5790 return err; 5791 } 5792 5793 static u32 rateset_to_mask(struct ieee80211_supported_band *sband, 5794 u8 *rates, u8 rates_len) 5795 { 5796 u8 i; 5797 u32 mask = 0; 5798 5799 for (i = 0; i < rates_len; i++) { 5800 int rate = (rates[i] & 0x7f) * 5; 5801 int ridx; 5802 5803 for (ridx = 0; ridx < sband->n_bitrates; ridx++) { 5804 struct ieee80211_rate *srate = 5805 &sband->bitrates[ridx]; 5806 if (rate == srate->bitrate) { 5807 mask |= 1 << ridx; 5808 break; 5809 } 5810 } 5811 if (ridx == sband->n_bitrates) 5812 return 0; /* rate not found */ 5813 } 5814 5815 return mask; 5816 } 5817 5818 static bool ht_rateset_to_mask(struct ieee80211_supported_band *sband, 5819 u8 *rates, u8 rates_len, 5820 u8 mcs[IEEE80211_HT_MCS_MASK_LEN]) 5821 { 5822 u8 i; 5823 5824 memset(mcs, 0, IEEE80211_HT_MCS_MASK_LEN); 5825 5826 for (i = 0; i < rates_len; i++) { 5827 int ridx, rbit; 5828 5829 ridx = rates[i] / 8; 5830 rbit = BIT(rates[i] % 8); 5831 5832 /* check validity */ 5833 if ((ridx < 0) || (ridx >= IEEE80211_HT_MCS_MASK_LEN)) 5834 return false; 5835 5836 /* check availability */ 5837 ridx = array_index_nospec(ridx, IEEE80211_HT_MCS_MASK_LEN); 5838 if (sband->ht_cap.mcs.rx_mask[ridx] & rbit) 5839 mcs[ridx] |= rbit; 5840 else 5841 return false; 5842 } 5843 5844 return true; 5845 } 5846 5847 static u16 vht_mcs_map_to_mcs_mask(u8 vht_mcs_map) 5848 { 5849 u16 mcs_mask = 0; 5850 5851 switch (vht_mcs_map) { 5852 case IEEE80211_VHT_MCS_NOT_SUPPORTED: 5853 break; 5854 case IEEE80211_VHT_MCS_SUPPORT_0_7: 5855 mcs_mask = 0x00FF; 5856 break; 5857 case IEEE80211_VHT_MCS_SUPPORT_0_8: 5858 mcs_mask = 0x01FF; 5859 break; 5860 case IEEE80211_VHT_MCS_SUPPORT_0_9: 5861 mcs_mask = 0x03FF; 5862 break; 5863 default: 5864 break; 5865 } 5866 5867 return mcs_mask; 5868 } 5869 5870 static void vht_build_mcs_mask(u16 vht_mcs_map, 5871 u16 vht_mcs_mask[NL80211_VHT_NSS_MAX]) 5872 { 5873 u8 nss; 5874 5875 for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++) { 5876 vht_mcs_mask[nss] = vht_mcs_map_to_mcs_mask(vht_mcs_map & 0x03); 5877 vht_mcs_map >>= 2; 5878 } 5879 } 5880 5881 static bool vht_set_mcs_mask(struct ieee80211_supported_band *sband, 5882 struct nl80211_txrate_vht *txrate, 5883 u16 mcs[NL80211_VHT_NSS_MAX]) 5884 { 5885 u16 tx_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map); 5886 u16 tx_mcs_mask[NL80211_VHT_NSS_MAX] = {}; 5887 u8 i; 5888 5889 if (!sband->vht_cap.vht_supported) 5890 return false; 5891 5892 memset(mcs, 0, sizeof(u16) * NL80211_VHT_NSS_MAX); 5893 5894 /* Build vht_mcs_mask from VHT capabilities */ 5895 vht_build_mcs_mask(tx_mcs_map, tx_mcs_mask); 5896 5897 for (i = 0; i < NL80211_VHT_NSS_MAX; i++) { 5898 if ((tx_mcs_mask[i] & txrate->mcs[i]) == txrate->mcs[i]) 5899 mcs[i] = txrate->mcs[i]; 5900 else 5901 return false; 5902 } 5903 5904 return true; 5905 } 5906 5907 static u16 he_mcs_map_to_mcs_mask(u8 he_mcs_map) 5908 { 5909 switch (he_mcs_map) { 5910 case IEEE80211_HE_MCS_NOT_SUPPORTED: 5911 return 0; 5912 case IEEE80211_HE_MCS_SUPPORT_0_7: 5913 return 0x00FF; 5914 case IEEE80211_HE_MCS_SUPPORT_0_9: 5915 return 0x03FF; 5916 case IEEE80211_HE_MCS_SUPPORT_0_11: 5917 return 0xFFF; 5918 default: 5919 break; 5920 } 5921 return 0; 5922 } 5923 5924 static void he_build_mcs_mask(u16 he_mcs_map, 5925 u16 he_mcs_mask[NL80211_HE_NSS_MAX]) 5926 { 5927 u8 nss; 5928 5929 for (nss = 0; nss < NL80211_HE_NSS_MAX; nss++) { 5930 he_mcs_mask[nss] = he_mcs_map_to_mcs_mask(he_mcs_map & 0x03); 5931 he_mcs_map >>= 2; 5932 } 5933 } 5934 5935 static u16 he_get_txmcsmap(struct genl_info *info, unsigned int link_id, 5936 const struct ieee80211_sta_he_cap *he_cap) 5937 { 5938 struct net_device *dev = info->user_ptr[1]; 5939 struct wireless_dev *wdev = dev->ieee80211_ptr; 5940 struct cfg80211_chan_def *chandef; 5941 __le16 tx_mcs; 5942 5943 chandef = wdev_chandef(wdev, link_id); 5944 if (!chandef) { 5945 /* 5946 * This is probably broken, but we never maintained 5947 * a chandef in these cases, so it always was. 5948 */ 5949 return le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_80); 5950 } 5951 5952 switch (chandef->width) { 5953 case NL80211_CHAN_WIDTH_80P80: 5954 tx_mcs = he_cap->he_mcs_nss_supp.tx_mcs_80p80; 5955 break; 5956 case NL80211_CHAN_WIDTH_160: 5957 tx_mcs = he_cap->he_mcs_nss_supp.tx_mcs_160; 5958 break; 5959 default: 5960 tx_mcs = he_cap->he_mcs_nss_supp.tx_mcs_80; 5961 break; 5962 } 5963 5964 return le16_to_cpu(tx_mcs); 5965 } 5966 5967 static bool he_set_mcs_mask(struct genl_info *info, 5968 struct wireless_dev *wdev, 5969 struct ieee80211_supported_band *sband, 5970 struct nl80211_txrate_he *txrate, 5971 u16 mcs[NL80211_HE_NSS_MAX], 5972 unsigned int link_id) 5973 { 5974 const struct ieee80211_sta_he_cap *he_cap; 5975 u16 tx_mcs_mask[NL80211_HE_NSS_MAX] = {}; 5976 u16 tx_mcs_map = 0; 5977 u8 i; 5978 5979 he_cap = ieee80211_get_he_iftype_cap(sband, wdev->iftype); 5980 if (!he_cap) 5981 return false; 5982 5983 memset(mcs, 0, sizeof(u16) * NL80211_HE_NSS_MAX); 5984 5985 tx_mcs_map = he_get_txmcsmap(info, link_id, he_cap); 5986 5987 /* Build he_mcs_mask from HE capabilities */ 5988 he_build_mcs_mask(tx_mcs_map, tx_mcs_mask); 5989 5990 for (i = 0; i < NL80211_HE_NSS_MAX; i++) { 5991 if ((tx_mcs_mask[i] & txrate->mcs[i]) == txrate->mcs[i]) 5992 mcs[i] = txrate->mcs[i]; 5993 else 5994 return false; 5995 } 5996 5997 return true; 5998 } 5999 6000 static void eht_build_mcs_mask(struct genl_info *info, 6001 const struct ieee80211_sta_eht_cap *eht_cap, 6002 u8 mcs_nss_len, u16 *mcs_mask) 6003 { 6004 struct net_device *dev = info->user_ptr[1]; 6005 struct wireless_dev *wdev = dev->ieee80211_ptr; 6006 u8 nss, mcs_7 = 0, mcs_9 = 0, mcs_11 = 0, mcs_13 = 0; 6007 unsigned int link_id = nl80211_link_id(info->attrs); 6008 6009 if (mcs_nss_len == 4) { 6010 const struct ieee80211_eht_mcs_nss_supp_20mhz_only *mcs = 6011 &eht_cap->eht_mcs_nss_supp.only_20mhz; 6012 6013 mcs_7 = u8_get_bits(mcs->rx_tx_mcs7_max_nss, 6014 IEEE80211_EHT_MCS_NSS_TX); 6015 mcs_9 = u8_get_bits(mcs->rx_tx_mcs9_max_nss, 6016 IEEE80211_EHT_MCS_NSS_TX); 6017 mcs_11 = u8_get_bits(mcs->rx_tx_mcs11_max_nss, 6018 IEEE80211_EHT_MCS_NSS_TX); 6019 mcs_13 = u8_get_bits(mcs->rx_tx_mcs13_max_nss, 6020 IEEE80211_EHT_MCS_NSS_TX); 6021 6022 } else { 6023 const struct ieee80211_eht_mcs_nss_supp_bw *mcs; 6024 enum nl80211_chan_width width; 6025 6026 switch (wdev->iftype) { 6027 case NL80211_IFTYPE_ADHOC: 6028 width = wdev->u.ibss.chandef.width; 6029 break; 6030 case NL80211_IFTYPE_MESH_POINT: 6031 width = wdev->u.mesh.chandef.width; 6032 break; 6033 case NL80211_IFTYPE_OCB: 6034 width = wdev->u.ocb.chandef.width; 6035 break; 6036 default: 6037 if (wdev->valid_links) 6038 width = wdev->links[link_id].ap.chandef.width; 6039 else 6040 width = wdev->u.ap.preset_chandef.width; 6041 break; 6042 } 6043 6044 switch (width) { 6045 case NL80211_CHAN_WIDTH_320: 6046 mcs = &eht_cap->eht_mcs_nss_supp.bw._320; 6047 break; 6048 case NL80211_CHAN_WIDTH_160: 6049 mcs = &eht_cap->eht_mcs_nss_supp.bw._160; 6050 break; 6051 default: 6052 mcs = &eht_cap->eht_mcs_nss_supp.bw._80; 6053 break; 6054 } 6055 6056 mcs_7 = u8_get_bits(mcs->rx_tx_mcs9_max_nss, 6057 IEEE80211_EHT_MCS_NSS_TX); 6058 mcs_9 = u8_get_bits(mcs->rx_tx_mcs9_max_nss, 6059 IEEE80211_EHT_MCS_NSS_TX); 6060 mcs_11 = u8_get_bits(mcs->rx_tx_mcs11_max_nss, 6061 IEEE80211_EHT_MCS_NSS_TX); 6062 mcs_13 = u8_get_bits(mcs->rx_tx_mcs13_max_nss, 6063 IEEE80211_EHT_MCS_NSS_TX); 6064 } 6065 6066 /* Enable MCS 14 for NSS 0 */ 6067 if (eht_cap->eht_cap_elem.phy_cap_info[6] & 6068 IEEE80211_EHT_PHY_CAP6_EHT_DUP_6GHZ_SUPP) 6069 mcs_mask[0] |= 0x4000; 6070 6071 /* Enable MCS 15 for NSS 0 */ 6072 mcs_mask[0] |= 0x8000; 6073 6074 for (nss = 0; nss < NL80211_EHT_NSS_MAX; nss++) { 6075 if (!mcs_7) 6076 continue; 6077 mcs_mask[nss] |= 0x00FF; 6078 mcs_7--; 6079 6080 if (!mcs_9) 6081 continue; 6082 mcs_mask[nss] |= 0x0300; 6083 mcs_9--; 6084 6085 if (!mcs_11) 6086 continue; 6087 mcs_mask[nss] |= 0x0C00; 6088 mcs_11--; 6089 6090 if (!mcs_13) 6091 continue; 6092 mcs_mask[nss] |= 0x3000; 6093 mcs_13--; 6094 } 6095 } 6096 6097 static bool eht_set_mcs_mask(struct genl_info *info, struct wireless_dev *wdev, 6098 struct ieee80211_supported_band *sband, 6099 struct nl80211_txrate_eht *txrate, 6100 u16 mcs[NL80211_EHT_NSS_MAX]) 6101 { 6102 const struct ieee80211_sta_he_cap *he_cap; 6103 const struct ieee80211_sta_eht_cap *eht_cap; 6104 u16 tx_mcs_mask[NL80211_EHT_NSS_MAX] = { 0 }; 6105 u8 i, mcs_nss_len; 6106 6107 he_cap = ieee80211_get_he_iftype_cap(sband, wdev->iftype); 6108 if (!he_cap) 6109 return false; 6110 6111 eht_cap = ieee80211_get_eht_iftype_cap(sband, wdev->iftype); 6112 if (!eht_cap) 6113 return false; 6114 6115 /* Checks for MCS 14 */ 6116 if (txrate->mcs[0] & 0x4000) { 6117 if (sband->band != NL80211_BAND_6GHZ) 6118 return false; 6119 6120 if (!(eht_cap->eht_cap_elem.phy_cap_info[6] & 6121 IEEE80211_EHT_PHY_CAP6_EHT_DUP_6GHZ_SUPP)) 6122 return false; 6123 } 6124 6125 mcs_nss_len = ieee80211_eht_mcs_nss_size(&he_cap->he_cap_elem, 6126 &eht_cap->eht_cap_elem, 6127 wdev->iftype == 6128 NL80211_IFTYPE_STATION); 6129 6130 if (mcs_nss_len == 3) { 6131 /* Supported iftypes for setting non-20 MHZ only EHT MCS */ 6132 switch (wdev->iftype) { 6133 case NL80211_IFTYPE_ADHOC: 6134 case NL80211_IFTYPE_AP: 6135 case NL80211_IFTYPE_P2P_GO: 6136 case NL80211_IFTYPE_MESH_POINT: 6137 case NL80211_IFTYPE_OCB: 6138 break; 6139 default: 6140 return false; 6141 } 6142 } 6143 6144 /* Build eht_mcs_mask from EHT and HE capabilities */ 6145 eht_build_mcs_mask(info, eht_cap, mcs_nss_len, tx_mcs_mask); 6146 6147 memset(mcs, 0, sizeof(u16) * NL80211_EHT_NSS_MAX); 6148 for (i = 0; i < NL80211_EHT_NSS_MAX; i++) { 6149 if ((tx_mcs_mask[i] & txrate->mcs[i]) == txrate->mcs[i]) 6150 mcs[i] = txrate->mcs[i]; 6151 else 6152 return false; 6153 } 6154 6155 return true; 6156 } 6157 6158 static int nl80211_parse_tx_bitrate_mask(struct genl_info *info, 6159 struct nlattr *attrs[], 6160 enum nl80211_attrs attr, 6161 struct cfg80211_bitrate_mask *mask, 6162 struct net_device *dev, 6163 bool default_all_enabled, 6164 unsigned int link_id) 6165 { 6166 struct nlattr *tb[NL80211_TXRATE_MAX + 1]; 6167 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 6168 struct wireless_dev *wdev = dev->ieee80211_ptr; 6169 int rem, i; 6170 struct nlattr *tx_rates; 6171 struct ieee80211_supported_band *sband; 6172 u16 vht_tx_mcs_map, he_tx_mcs_map; 6173 6174 memset(mask, 0, sizeof(*mask)); 6175 /* Default to all rates enabled */ 6176 for (i = 0; i < NUM_NL80211_BANDS; i++) { 6177 const struct ieee80211_sta_he_cap *he_cap; 6178 const struct ieee80211_sta_eht_cap *eht_cap; 6179 u8 mcs_nss_len; 6180 6181 if (!default_all_enabled) 6182 break; 6183 6184 sband = rdev->wiphy.bands[i]; 6185 6186 if (!sband) 6187 continue; 6188 6189 mask->control[i].legacy = (1 << sband->n_bitrates) - 1; 6190 memcpy(mask->control[i].ht_mcs, 6191 sband->ht_cap.mcs.rx_mask, 6192 sizeof(mask->control[i].ht_mcs)); 6193 6194 if (sband->vht_cap.vht_supported) { 6195 vht_tx_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map); 6196 vht_build_mcs_mask(vht_tx_mcs_map, mask->control[i].vht_mcs); 6197 } 6198 6199 he_cap = ieee80211_get_he_iftype_cap(sband, wdev->iftype); 6200 if (!he_cap) 6201 continue; 6202 6203 he_tx_mcs_map = he_get_txmcsmap(info, link_id, he_cap); 6204 he_build_mcs_mask(he_tx_mcs_map, mask->control[i].he_mcs); 6205 6206 mask->control[i].he_gi = 0xFF; 6207 mask->control[i].he_ltf = 0xFF; 6208 6209 eht_cap = ieee80211_get_eht_iftype_cap(sband, wdev->iftype); 6210 if (!eht_cap) 6211 continue; 6212 6213 mcs_nss_len = ieee80211_eht_mcs_nss_size(&he_cap->he_cap_elem, 6214 &eht_cap->eht_cap_elem, 6215 wdev->iftype == 6216 NL80211_IFTYPE_STATION); 6217 6218 eht_build_mcs_mask(info, eht_cap, mcs_nss_len, 6219 mask->control[i].eht_mcs); 6220 6221 mask->control[i].eht_gi = 0xFF; 6222 mask->control[i].eht_ltf = 0xFF; 6223 } 6224 6225 /* if no rates are given set it back to the defaults */ 6226 if (!attrs[attr]) 6227 goto out; 6228 6229 /* The nested attribute uses enum nl80211_band as the index. This maps 6230 * directly to the enum nl80211_band values used in cfg80211. 6231 */ 6232 BUILD_BUG_ON(NL80211_MAX_SUPP_HT_RATES > IEEE80211_HT_MCS_MASK_LEN * 8); 6233 nla_for_each_nested(tx_rates, attrs[attr], rem) { 6234 int band = nla_type(tx_rates); 6235 int err; 6236 6237 if (band < 0 || band >= NUM_NL80211_BANDS) 6238 return -EINVAL; 6239 sband = rdev->wiphy.bands[band]; 6240 if (sband == NULL) 6241 return -EINVAL; 6242 err = nla_parse_nested_deprecated(tb, NL80211_TXRATE_MAX, 6243 tx_rates, 6244 nl80211_txattr_policy, 6245 info->extack); 6246 if (err) 6247 return err; 6248 if (tb[NL80211_TXRATE_LEGACY]) { 6249 mask->control[band].legacy = rateset_to_mask( 6250 sband, 6251 nla_data(tb[NL80211_TXRATE_LEGACY]), 6252 nla_len(tb[NL80211_TXRATE_LEGACY])); 6253 if ((mask->control[band].legacy == 0) && 6254 nla_len(tb[NL80211_TXRATE_LEGACY])) 6255 return -EINVAL; 6256 } 6257 if (tb[NL80211_TXRATE_HT]) { 6258 if (!ht_rateset_to_mask( 6259 sband, 6260 nla_data(tb[NL80211_TXRATE_HT]), 6261 nla_len(tb[NL80211_TXRATE_HT]), 6262 mask->control[band].ht_mcs)) 6263 return -EINVAL; 6264 } 6265 6266 if (tb[NL80211_TXRATE_VHT]) { 6267 if (!vht_set_mcs_mask( 6268 sband, 6269 nla_data(tb[NL80211_TXRATE_VHT]), 6270 mask->control[band].vht_mcs)) 6271 return -EINVAL; 6272 } 6273 6274 if (tb[NL80211_TXRATE_GI]) { 6275 mask->control[band].gi = 6276 nla_get_u8(tb[NL80211_TXRATE_GI]); 6277 if (mask->control[band].gi > NL80211_TXRATE_FORCE_LGI) 6278 return -EINVAL; 6279 } 6280 if (tb[NL80211_TXRATE_HE] && 6281 !he_set_mcs_mask(info, wdev, sband, 6282 nla_data(tb[NL80211_TXRATE_HE]), 6283 mask->control[band].he_mcs, 6284 link_id)) 6285 return -EINVAL; 6286 6287 if (tb[NL80211_TXRATE_HE_GI]) 6288 mask->control[band].he_gi = 6289 nla_get_u8(tb[NL80211_TXRATE_HE_GI]); 6290 if (tb[NL80211_TXRATE_HE_LTF]) 6291 mask->control[band].he_ltf = 6292 nla_get_u8(tb[NL80211_TXRATE_HE_LTF]); 6293 6294 if (tb[NL80211_TXRATE_EHT] && 6295 !eht_set_mcs_mask(info, wdev, sband, 6296 nla_data(tb[NL80211_TXRATE_EHT]), 6297 mask->control[band].eht_mcs)) 6298 return -EINVAL; 6299 6300 if (tb[NL80211_TXRATE_EHT_GI]) 6301 mask->control[band].eht_gi = 6302 nla_get_u8(tb[NL80211_TXRATE_EHT_GI]); 6303 if (tb[NL80211_TXRATE_EHT_LTF]) 6304 mask->control[band].eht_ltf = 6305 nla_get_u8(tb[NL80211_TXRATE_EHT_LTF]); 6306 6307 if (mask->control[band].legacy == 0) { 6308 /* don't allow empty legacy rates if HT, VHT, HE or EHT 6309 * are not even supported. 6310 */ 6311 if (!(rdev->wiphy.bands[band]->ht_cap.ht_supported || 6312 rdev->wiphy.bands[band]->vht_cap.vht_supported || 6313 ieee80211_get_he_iftype_cap(sband, wdev->iftype) || 6314 ieee80211_get_eht_iftype_cap(sband, wdev->iftype))) 6315 return -EINVAL; 6316 6317 for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++) 6318 if (mask->control[band].ht_mcs[i]) 6319 goto out; 6320 6321 for (i = 0; i < NL80211_VHT_NSS_MAX; i++) 6322 if (mask->control[band].vht_mcs[i]) 6323 goto out; 6324 6325 for (i = 0; i < NL80211_HE_NSS_MAX; i++) 6326 if (mask->control[band].he_mcs[i]) 6327 goto out; 6328 6329 for (i = 0; i < NL80211_EHT_NSS_MAX; i++) 6330 if (mask->control[band].eht_mcs[i]) 6331 goto out; 6332 6333 /* legacy and mcs rates may not be both empty */ 6334 return -EINVAL; 6335 } 6336 } 6337 6338 out: 6339 return 0; 6340 } 6341 6342 static int validate_beacon_tx_rate(struct cfg80211_registered_device *rdev, 6343 enum nl80211_band band, 6344 struct cfg80211_bitrate_mask *beacon_rate) 6345 { 6346 u32 count_ht, count_vht, count_he, count_eht, i; 6347 u32 rate = beacon_rate->control[band].legacy; 6348 6349 /* Allow only one rate */ 6350 if (hweight32(rate) > 1) 6351 return -EINVAL; 6352 6353 count_ht = 0; 6354 for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++) { 6355 if (hweight8(beacon_rate->control[band].ht_mcs[i]) > 1) { 6356 return -EINVAL; 6357 } else if (beacon_rate->control[band].ht_mcs[i]) { 6358 count_ht++; 6359 if (count_ht > 1) 6360 return -EINVAL; 6361 } 6362 if (count_ht && rate) 6363 return -EINVAL; 6364 } 6365 6366 count_vht = 0; 6367 for (i = 0; i < NL80211_VHT_NSS_MAX; i++) { 6368 if (hweight16(beacon_rate->control[band].vht_mcs[i]) > 1) { 6369 return -EINVAL; 6370 } else if (beacon_rate->control[band].vht_mcs[i]) { 6371 count_vht++; 6372 if (count_vht > 1) 6373 return -EINVAL; 6374 } 6375 if (count_vht && rate) 6376 return -EINVAL; 6377 } 6378 6379 count_he = 0; 6380 for (i = 0; i < NL80211_HE_NSS_MAX; i++) { 6381 if (hweight16(beacon_rate->control[band].he_mcs[i]) > 1) { 6382 return -EINVAL; 6383 } else if (beacon_rate->control[band].he_mcs[i]) { 6384 count_he++; 6385 if (count_he > 1) 6386 return -EINVAL; 6387 } 6388 if (count_he && rate) 6389 return -EINVAL; 6390 } 6391 6392 count_eht = 0; 6393 for (i = 0; i < NL80211_EHT_NSS_MAX; i++) { 6394 if (hweight16(beacon_rate->control[band].eht_mcs[i]) > 1) { 6395 return -EINVAL; 6396 } else if (beacon_rate->control[band].eht_mcs[i]) { 6397 count_eht++; 6398 if (count_eht > 1) 6399 return -EINVAL; 6400 } 6401 if (count_eht && rate) 6402 return -EINVAL; 6403 } 6404 6405 if ((count_ht && count_vht && count_he && count_eht) || 6406 (!rate && !count_ht && !count_vht && !count_he && !count_eht)) 6407 return -EINVAL; 6408 6409 if (rate && 6410 !wiphy_ext_feature_isset(&rdev->wiphy, 6411 NL80211_EXT_FEATURE_BEACON_RATE_LEGACY)) 6412 return -EINVAL; 6413 if (count_ht && 6414 !wiphy_ext_feature_isset(&rdev->wiphy, 6415 NL80211_EXT_FEATURE_BEACON_RATE_HT)) 6416 return -EINVAL; 6417 if (count_vht && 6418 !wiphy_ext_feature_isset(&rdev->wiphy, 6419 NL80211_EXT_FEATURE_BEACON_RATE_VHT)) 6420 return -EINVAL; 6421 if (count_he && 6422 !wiphy_ext_feature_isset(&rdev->wiphy, 6423 NL80211_EXT_FEATURE_BEACON_RATE_HE)) 6424 return -EINVAL; 6425 6426 if (count_eht && 6427 !wiphy_ext_feature_isset(&rdev->wiphy, 6428 NL80211_EXT_FEATURE_BEACON_RATE_EHT)) 6429 return -EINVAL; 6430 6431 return 0; 6432 } 6433 6434 static int nl80211_parse_mbssid_config(struct wiphy *wiphy, 6435 struct net_device *dev, 6436 unsigned int link_id, 6437 struct nlattr *attrs, 6438 struct cfg80211_mbssid_config *config, 6439 u8 num_elems) 6440 { 6441 struct nlattr *tb[NL80211_MBSSID_CONFIG_ATTR_MAX + 1]; 6442 int tx_link_id = -1; 6443 6444 if (!wiphy->mbssid_max_interfaces) 6445 return -EOPNOTSUPP; 6446 6447 if (nla_parse_nested(tb, NL80211_MBSSID_CONFIG_ATTR_MAX, attrs, NULL, 6448 NULL) || 6449 !tb[NL80211_MBSSID_CONFIG_ATTR_INDEX]) 6450 return -EINVAL; 6451 6452 config->ema = nla_get_flag(tb[NL80211_MBSSID_CONFIG_ATTR_EMA]); 6453 if (config->ema) { 6454 if (!wiphy->ema_max_profile_periodicity) 6455 return -EOPNOTSUPP; 6456 6457 if (num_elems > wiphy->ema_max_profile_periodicity) 6458 return -EINVAL; 6459 } 6460 6461 config->index = nla_get_u8(tb[NL80211_MBSSID_CONFIG_ATTR_INDEX]); 6462 if (config->index >= wiphy->mbssid_max_interfaces || 6463 (!config->index && !num_elems)) 6464 return -EINVAL; 6465 6466 if (tb[NL80211_MBSSID_CONFIG_ATTR_TX_LINK_ID]) 6467 tx_link_id = nla_get_u8(tb[NL80211_MBSSID_CONFIG_ATTR_TX_LINK_ID]); 6468 6469 if (tb[NL80211_MBSSID_CONFIG_ATTR_TX_IFINDEX]) { 6470 u32 tx_ifindex = 6471 nla_get_u32(tb[NL80211_MBSSID_CONFIG_ATTR_TX_IFINDEX]); 6472 6473 if ((!config->index && tx_ifindex != dev->ifindex) || 6474 (config->index && tx_ifindex == dev->ifindex)) 6475 return -EINVAL; 6476 6477 if (tx_ifindex != dev->ifindex) { 6478 struct net_device *tx_netdev = 6479 dev_get_by_index(wiphy_net(wiphy), tx_ifindex); 6480 6481 if (!tx_netdev || !tx_netdev->ieee80211_ptr || 6482 tx_netdev->ieee80211_ptr->wiphy != wiphy || 6483 tx_netdev->ieee80211_ptr->iftype != 6484 NL80211_IFTYPE_AP) { 6485 dev_put(tx_netdev); 6486 return -EINVAL; 6487 } 6488 6489 config->tx_wdev = tx_netdev->ieee80211_ptr; 6490 /* Caller should call dev_put(config->tx_wdev) from this point */ 6491 6492 if (config->tx_wdev->valid_links) { 6493 if (tx_link_id == -1 || 6494 !(config->tx_wdev->valid_links & BIT(tx_link_id))) 6495 return -ENOLINK; 6496 6497 config->tx_link_id = tx_link_id; 6498 } 6499 } else { 6500 if (tx_link_id >= 0 && tx_link_id != link_id) 6501 return -EINVAL; 6502 6503 config->tx_wdev = dev->ieee80211_ptr; 6504 } 6505 } else if (!config->index) { 6506 if (tx_link_id >= 0 && tx_link_id != link_id) 6507 return -EINVAL; 6508 6509 config->tx_wdev = dev->ieee80211_ptr; 6510 } else { 6511 return -EINVAL; 6512 } 6513 6514 return 0; 6515 } 6516 6517 static struct cfg80211_mbssid_elems * 6518 nl80211_parse_mbssid_elems(struct wiphy *wiphy, struct nlattr *attrs, 6519 struct netlink_ext_ack *extack) 6520 { 6521 struct nlattr *nl_elems; 6522 struct cfg80211_mbssid_elems *elems; 6523 int rem_elems; 6524 u8 i = 0, num_elems = 0; 6525 6526 if (!wiphy->mbssid_max_interfaces) 6527 return ERR_PTR(-EINVAL); 6528 6529 nla_for_each_nested(nl_elems, attrs, rem_elems) { 6530 int ret; 6531 6532 ret = validate_ie_attr(nl_elems, extack); 6533 if (ret) 6534 return ERR_PTR(ret); 6535 6536 if (num_elems >= 255) 6537 return ERR_PTR(-EINVAL); 6538 num_elems++; 6539 } 6540 6541 elems = kzalloc_flex(*elems, elem, num_elems); 6542 if (!elems) 6543 return ERR_PTR(-ENOMEM); 6544 elems->cnt = num_elems; 6545 6546 nla_for_each_nested(nl_elems, attrs, rem_elems) { 6547 elems->elem[i].data = nla_data(nl_elems); 6548 elems->elem[i].len = nla_len(nl_elems); 6549 i++; 6550 } 6551 return elems; 6552 } 6553 6554 static struct cfg80211_rnr_elems * 6555 nl80211_parse_rnr_elems(struct wiphy *wiphy, struct nlattr *attrs, 6556 struct netlink_ext_ack *extack) 6557 { 6558 struct nlattr *nl_elems; 6559 struct cfg80211_rnr_elems *elems; 6560 int rem_elems; 6561 u8 i = 0, num_elems = 0; 6562 6563 nla_for_each_nested(nl_elems, attrs, rem_elems) { 6564 int ret; 6565 6566 ret = validate_ie_attr(nl_elems, extack); 6567 if (ret) 6568 return ERR_PTR(ret); 6569 6570 if (num_elems >= 255) 6571 return ERR_PTR(-EINVAL); 6572 6573 num_elems++; 6574 } 6575 6576 elems = kzalloc_flex(*elems, elem, num_elems); 6577 if (!elems) 6578 return ERR_PTR(-ENOMEM); 6579 elems->cnt = num_elems; 6580 6581 nla_for_each_nested(nl_elems, attrs, rem_elems) { 6582 elems->elem[i].data = nla_data(nl_elems); 6583 elems->elem[i].len = nla_len(nl_elems); 6584 i++; 6585 } 6586 return elems; 6587 } 6588 6589 static int nl80211_parse_he_bss_color(struct nlattr *attrs, 6590 struct cfg80211_he_bss_color *he_bss_color) 6591 { 6592 struct nlattr *tb[NL80211_HE_BSS_COLOR_ATTR_MAX + 1]; 6593 int err; 6594 6595 err = nla_parse_nested(tb, NL80211_HE_BSS_COLOR_ATTR_MAX, attrs, 6596 he_bss_color_policy, NULL); 6597 if (err) 6598 return err; 6599 6600 if (!tb[NL80211_HE_BSS_COLOR_ATTR_COLOR]) 6601 return -EINVAL; 6602 6603 he_bss_color->color = 6604 nla_get_u8(tb[NL80211_HE_BSS_COLOR_ATTR_COLOR]); 6605 he_bss_color->enabled = 6606 !nla_get_flag(tb[NL80211_HE_BSS_COLOR_ATTR_DISABLED]); 6607 he_bss_color->partial = 6608 nla_get_flag(tb[NL80211_HE_BSS_COLOR_ATTR_PARTIAL]); 6609 6610 return 0; 6611 } 6612 6613 static void nl80211_check_ap_rate_selectors(struct cfg80211_beacon_data *bcn, 6614 const struct element *rates) 6615 { 6616 int i; 6617 6618 if (!rates) 6619 return; 6620 6621 for (i = 0; i < rates->datalen; i++) { 6622 if (rates->data[i] == BSS_MEMBERSHIP_SELECTOR_HT_PHY) 6623 bcn->ht_required = true; 6624 if (rates->data[i] == BSS_MEMBERSHIP_SELECTOR_VHT_PHY) 6625 bcn->vht_required = true; 6626 } 6627 } 6628 6629 /* 6630 * Since the nl80211 API didn't include, from the beginning, attributes about 6631 * HT/VHT/... operation, we parse them out of the elements and check for 6632 * validity for use by drivers/mac80211. 6633 */ 6634 static int nl80211_calculate_ap_operation(struct nlattr *attrs[], 6635 struct cfg80211_beacon_data *bcn, 6636 struct netlink_ext_ack *extack) 6637 { 6638 size_t ies_len = bcn->tail_len; 6639 const u8 *ies = bcn->tail; 6640 const struct element *rates; 6641 const struct element *op; 6642 6643 rates = cfg80211_find_elem(WLAN_EID_SUPP_RATES, ies, ies_len); 6644 nl80211_check_ap_rate_selectors(bcn, rates); 6645 6646 rates = cfg80211_find_elem(WLAN_EID_EXT_SUPP_RATES, ies, ies_len); 6647 nl80211_check_ap_rate_selectors(bcn, rates); 6648 6649 op = cfg80211_find_ext_elem(WLAN_EID_EXT_HE_OPERATION, ies, ies_len); 6650 if (op) { 6651 if (op->datalen < sizeof(*bcn->he_oper) + 1) { 6652 NL_SET_ERR_MSG(extack, "bad HE operation in beacon"); 6653 return -EINVAL; 6654 } 6655 bcn->he_oper = (void *)(op->data + 1); 6656 /* takes extension ID into account */ 6657 if (op->datalen < ieee80211_he_oper_size((void *)bcn->he_oper)) { 6658 NL_SET_ERR_MSG(extack, "bad HE operation in beacon"); 6659 return -EINVAL; 6660 } 6661 } 6662 6663 op = cfg80211_find_elem(WLAN_EID_HT_OPERATION, ies, ies_len); 6664 if (op) { 6665 if (op->datalen < sizeof(*bcn->ht_oper)) { 6666 NL_SET_ERR_MSG(extack, "bad HT operation in beacon"); 6667 return -EINVAL; 6668 } 6669 bcn->ht_oper = (void *)op->data; 6670 } 6671 6672 op = cfg80211_find_elem(WLAN_EID_VHT_OPERATION, ies, ies_len); 6673 if (op) { 6674 if (op->datalen < sizeof(*bcn->vht_oper)) { 6675 NL_SET_ERR_MSG(extack, "bad VHT operation in beacon"); 6676 return -EINVAL; 6677 } 6678 bcn->vht_oper = (void *)op->data; 6679 } 6680 6681 op = cfg80211_find_ext_elem(WLAN_EID_EXT_EHT_OPERATION, ies, ies_len); 6682 if (op) { 6683 if (!ieee80211_eht_oper_size_ok(op->data + 1, 6684 op->datalen - 1)) { 6685 NL_SET_ERR_MSG(extack, "bad EHT operation in beacon"); 6686 return -EINVAL; 6687 } 6688 bcn->eht_oper = (void *)(op->data + 1); 6689 } 6690 6691 op = cfg80211_find_ext_elem(WLAN_EID_EXT_UHR_OPER, ies, ies_len); 6692 if (op) { 6693 /* need full UHR operation separately */ 6694 if (!attrs[NL80211_ATTR_UHR_OPERATION]) { 6695 NL_SET_ERR_MSG(extack, "missing UHR operation"); 6696 return -EINVAL; 6697 } 6698 bcn->uhr_oper = nla_data(attrs[NL80211_ATTR_UHR_OPERATION]); 6699 } else if (attrs[NL80211_ATTR_UHR_OPERATION]) { 6700 NL_SET_ERR_MSG(extack, "unexpected UHR operation"); 6701 return -EINVAL; 6702 } 6703 6704 return 0; 6705 } 6706 6707 static int nl80211_parse_beacon(struct cfg80211_registered_device *rdev, 6708 struct nlattr *attrs[], 6709 struct cfg80211_beacon_data *bcn, 6710 struct ieee80211_channel *chan, 6711 struct netlink_ext_ack *extack) 6712 { 6713 bool haveinfo = false; 6714 int err; 6715 6716 memset(bcn, 0, sizeof(*bcn)); 6717 6718 bcn->link_id = nl80211_link_id(attrs); 6719 6720 if (attrs[NL80211_ATTR_BEACON_HEAD]) { 6721 bcn->head = nla_data(attrs[NL80211_ATTR_BEACON_HEAD]); 6722 bcn->head_len = nla_len(attrs[NL80211_ATTR_BEACON_HEAD]); 6723 if (!bcn->head_len) 6724 return -EINVAL; 6725 haveinfo = true; 6726 } 6727 6728 if (attrs[NL80211_ATTR_BEACON_TAIL]) { 6729 bcn->tail = nla_data(attrs[NL80211_ATTR_BEACON_TAIL]); 6730 bcn->tail_len = nla_len(attrs[NL80211_ATTR_BEACON_TAIL]); 6731 haveinfo = true; 6732 } 6733 6734 if (!haveinfo) 6735 return -EINVAL; 6736 6737 if (attrs[NL80211_ATTR_IE]) { 6738 bcn->beacon_ies = nla_data(attrs[NL80211_ATTR_IE]); 6739 bcn->beacon_ies_len = nla_len(attrs[NL80211_ATTR_IE]); 6740 } 6741 6742 if (attrs[NL80211_ATTR_IE_PROBE_RESP]) { 6743 bcn->proberesp_ies = 6744 nla_data(attrs[NL80211_ATTR_IE_PROBE_RESP]); 6745 bcn->proberesp_ies_len = 6746 nla_len(attrs[NL80211_ATTR_IE_PROBE_RESP]); 6747 } 6748 6749 if (attrs[NL80211_ATTR_IE_ASSOC_RESP]) { 6750 bcn->assocresp_ies = 6751 nla_data(attrs[NL80211_ATTR_IE_ASSOC_RESP]); 6752 bcn->assocresp_ies_len = 6753 nla_len(attrs[NL80211_ATTR_IE_ASSOC_RESP]); 6754 } 6755 6756 if (attrs[NL80211_ATTR_PROBE_RESP]) { 6757 bcn->probe_resp = nla_data(attrs[NL80211_ATTR_PROBE_RESP]); 6758 bcn->probe_resp_len = nla_len(attrs[NL80211_ATTR_PROBE_RESP]); 6759 } 6760 6761 if (attrs[NL80211_ATTR_FTM_RESPONDER]) { 6762 struct nlattr *tb[NL80211_FTM_RESP_ATTR_MAX + 1]; 6763 6764 err = nla_parse_nested_deprecated(tb, 6765 NL80211_FTM_RESP_ATTR_MAX, 6766 attrs[NL80211_ATTR_FTM_RESPONDER], 6767 NULL, NULL); 6768 if (err) 6769 return err; 6770 6771 if (tb[NL80211_FTM_RESP_ATTR_ENABLED] && 6772 wiphy_ext_feature_isset(&rdev->wiphy, 6773 NL80211_EXT_FEATURE_ENABLE_FTM_RESPONDER)) 6774 bcn->ftm_responder = 1; 6775 else 6776 return -EOPNOTSUPP; 6777 6778 if (tb[NL80211_FTM_RESP_ATTR_LCI]) { 6779 bcn->lci = nla_data(tb[NL80211_FTM_RESP_ATTR_LCI]); 6780 bcn->lci_len = nla_len(tb[NL80211_FTM_RESP_ATTR_LCI]); 6781 } 6782 6783 if (tb[NL80211_FTM_RESP_ATTR_CIVICLOC]) { 6784 bcn->civicloc = nla_data(tb[NL80211_FTM_RESP_ATTR_CIVICLOC]); 6785 bcn->civicloc_len = nla_len(tb[NL80211_FTM_RESP_ATTR_CIVICLOC]); 6786 } 6787 } else { 6788 bcn->ftm_responder = -1; 6789 } 6790 6791 if (attrs[NL80211_ATTR_HE_BSS_COLOR]) { 6792 err = nl80211_parse_he_bss_color(attrs[NL80211_ATTR_HE_BSS_COLOR], 6793 &bcn->he_bss_color); 6794 if (err) 6795 return err; 6796 bcn->he_bss_color_valid = true; 6797 } 6798 6799 if (attrs[NL80211_ATTR_MBSSID_ELEMS]) { 6800 struct cfg80211_mbssid_elems *mbssid = 6801 nl80211_parse_mbssid_elems(&rdev->wiphy, 6802 attrs[NL80211_ATTR_MBSSID_ELEMS], 6803 extack); 6804 6805 if (IS_ERR(mbssid)) 6806 return PTR_ERR(mbssid); 6807 6808 bcn->mbssid_ies = mbssid; 6809 6810 if (bcn->mbssid_ies && attrs[NL80211_ATTR_EMA_RNR_ELEMS]) { 6811 struct cfg80211_rnr_elems *rnr = 6812 nl80211_parse_rnr_elems(&rdev->wiphy, 6813 attrs[NL80211_ATTR_EMA_RNR_ELEMS], 6814 extack); 6815 6816 if (IS_ERR(rnr)) 6817 return PTR_ERR(rnr); 6818 6819 if (rnr && rnr->cnt < bcn->mbssid_ies->cnt) { 6820 kfree(rnr); 6821 return -EINVAL; 6822 } 6823 6824 bcn->rnr_ies = rnr; 6825 } 6826 } 6827 6828 err = nl80211_calculate_ap_operation(attrs, bcn, extack); 6829 if (err) 6830 return err; 6831 6832 if (bcn->he_oper && (chan->flags & IEEE80211_CHAN_NO_HE)) 6833 return -EOPNOTSUPP; 6834 6835 if (bcn->eht_oper && (chan->flags & IEEE80211_CHAN_NO_EHT)) 6836 return -EOPNOTSUPP; 6837 6838 if (bcn->uhr_oper && (chan->flags & IEEE80211_CHAN_NO_UHR)) 6839 return -EOPNOTSUPP; 6840 6841 return 0; 6842 } 6843 6844 static int nl80211_parse_he_obss_pd(struct nlattr *attrs, 6845 struct ieee80211_he_obss_pd *he_obss_pd) 6846 { 6847 struct nlattr *tb[NL80211_HE_OBSS_PD_ATTR_MAX + 1]; 6848 int err; 6849 6850 err = nla_parse_nested(tb, NL80211_HE_OBSS_PD_ATTR_MAX, attrs, 6851 he_obss_pd_policy, NULL); 6852 if (err) 6853 return err; 6854 6855 if (!tb[NL80211_HE_OBSS_PD_ATTR_SR_CTRL]) 6856 return -EINVAL; 6857 6858 he_obss_pd->sr_ctrl = nla_get_u8(tb[NL80211_HE_OBSS_PD_ATTR_SR_CTRL]); 6859 6860 if (tb[NL80211_HE_OBSS_PD_ATTR_MIN_OFFSET]) 6861 he_obss_pd->min_offset = 6862 nla_get_u8(tb[NL80211_HE_OBSS_PD_ATTR_MIN_OFFSET]); 6863 if (tb[NL80211_HE_OBSS_PD_ATTR_MAX_OFFSET]) 6864 he_obss_pd->max_offset = 6865 nla_get_u8(tb[NL80211_HE_OBSS_PD_ATTR_MAX_OFFSET]); 6866 if (tb[NL80211_HE_OBSS_PD_ATTR_NON_SRG_MAX_OFFSET]) 6867 he_obss_pd->non_srg_max_offset = 6868 nla_get_u8(tb[NL80211_HE_OBSS_PD_ATTR_NON_SRG_MAX_OFFSET]); 6869 6870 if (he_obss_pd->min_offset > he_obss_pd->max_offset) 6871 return -EINVAL; 6872 6873 if (tb[NL80211_HE_OBSS_PD_ATTR_BSS_COLOR_BITMAP]) 6874 memcpy(he_obss_pd->bss_color_bitmap, 6875 nla_data(tb[NL80211_HE_OBSS_PD_ATTR_BSS_COLOR_BITMAP]), 6876 sizeof(he_obss_pd->bss_color_bitmap)); 6877 6878 if (tb[NL80211_HE_OBSS_PD_ATTR_PARTIAL_BSSID_BITMAP]) 6879 memcpy(he_obss_pd->partial_bssid_bitmap, 6880 nla_data(tb[NL80211_HE_OBSS_PD_ATTR_PARTIAL_BSSID_BITMAP]), 6881 sizeof(he_obss_pd->partial_bssid_bitmap)); 6882 6883 he_obss_pd->enable = true; 6884 6885 return 0; 6886 } 6887 6888 static int nl80211_parse_fils_discovery(struct cfg80211_registered_device *rdev, 6889 struct nlattr *attrs, 6890 struct cfg80211_fils_discovery *fd) 6891 { 6892 struct nlattr *tb[NL80211_FILS_DISCOVERY_ATTR_MAX + 1]; 6893 int ret; 6894 6895 if (!wiphy_ext_feature_isset(&rdev->wiphy, 6896 NL80211_EXT_FEATURE_FILS_DISCOVERY)) 6897 return -EINVAL; 6898 6899 ret = nla_parse_nested(tb, NL80211_FILS_DISCOVERY_ATTR_MAX, attrs, 6900 NULL, NULL); 6901 if (ret) 6902 return ret; 6903 6904 if (!tb[NL80211_FILS_DISCOVERY_ATTR_INT_MIN] && 6905 !tb[NL80211_FILS_DISCOVERY_ATTR_INT_MAX] && 6906 !tb[NL80211_FILS_DISCOVERY_ATTR_TMPL]) { 6907 fd->update = true; 6908 return 0; 6909 } 6910 6911 if (!tb[NL80211_FILS_DISCOVERY_ATTR_INT_MIN] || 6912 !tb[NL80211_FILS_DISCOVERY_ATTR_INT_MAX] || 6913 !tb[NL80211_FILS_DISCOVERY_ATTR_TMPL]) 6914 return -EINVAL; 6915 6916 fd->tmpl_len = nla_len(tb[NL80211_FILS_DISCOVERY_ATTR_TMPL]); 6917 fd->tmpl = nla_data(tb[NL80211_FILS_DISCOVERY_ATTR_TMPL]); 6918 fd->min_interval = nla_get_u32(tb[NL80211_FILS_DISCOVERY_ATTR_INT_MIN]); 6919 fd->max_interval = nla_get_u32(tb[NL80211_FILS_DISCOVERY_ATTR_INT_MAX]); 6920 fd->update = true; 6921 return 0; 6922 } 6923 6924 static int 6925 nl80211_parse_unsol_bcast_probe_resp(struct cfg80211_registered_device *rdev, 6926 struct nlattr *attrs, 6927 struct cfg80211_unsol_bcast_probe_resp *presp) 6928 { 6929 struct nlattr *tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_MAX + 1]; 6930 int ret; 6931 6932 if (!wiphy_ext_feature_isset(&rdev->wiphy, 6933 NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP)) 6934 return -EINVAL; 6935 6936 ret = nla_parse_nested(tb, NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_MAX, 6937 attrs, NULL, NULL); 6938 if (ret) 6939 return ret; 6940 6941 if (!tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_INT] && 6942 !tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_TMPL]) { 6943 presp->update = true; 6944 return 0; 6945 } 6946 6947 if (!tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_INT] || 6948 !tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_TMPL]) 6949 return -EINVAL; 6950 6951 presp->tmpl = nla_data(tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_TMPL]); 6952 presp->tmpl_len = nla_len(tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_TMPL]); 6953 presp->interval = nla_get_u32(tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_INT]); 6954 presp->update = true; 6955 return 0; 6956 } 6957 6958 /* 6959 * Since the nl80211 API didn't include, from the beginning, attributes about 6960 * HT/VHT/... capabilities, we parse them out of the elements and check for 6961 * validity for use by drivers/mac80211. 6962 */ 6963 static int nl80211_calculate_ap_capabilities(struct genl_info *info, 6964 struct cfg80211_ap_settings *params) 6965 { 6966 size_t ies_len = params->beacon.tail_len; 6967 const u8 *ies = params->beacon.tail; 6968 const struct element *cap; 6969 6970 cap = cfg80211_find_elem(WLAN_EID_HT_CAPABILITY, ies, ies_len); 6971 if (cap) { 6972 if (cap->datalen < sizeof(*params->ht_cap)) { 6973 GENL_SET_ERR_MSG(info, "bad HT capability in beacon"); 6974 return -EINVAL; 6975 } 6976 params->ht_cap = (void *)cap->data; 6977 } 6978 6979 cap = cfg80211_find_elem(WLAN_EID_VHT_CAPABILITY, ies, ies_len); 6980 if (cap) { 6981 if (cap->datalen < sizeof(*params->vht_cap)) { 6982 GENL_SET_ERR_MSG(info, "bad VHT capability in beacon"); 6983 return -EINVAL; 6984 } 6985 params->vht_cap = (void *)cap->data; 6986 } 6987 6988 cap = cfg80211_find_ext_elem(WLAN_EID_EXT_HE_CAPABILITY, ies, ies_len); 6989 if (cap) { 6990 if (cap->datalen < sizeof(*params->he_cap) + 1) { 6991 GENL_SET_ERR_MSG(info, "bad HE capability in beacon"); 6992 return -EINVAL; 6993 } 6994 params->he_cap = (void *)(cap->data + 1); 6995 } 6996 6997 cap = cfg80211_find_ext_elem(WLAN_EID_EXT_EHT_CAPABILITY, ies, ies_len); 6998 if (cap) { 6999 params->eht_cap = (void *)(cap->data + 1); 7000 if (!ieee80211_eht_capa_size_ok((const u8 *)params->he_cap, 7001 (const u8 *)params->eht_cap, 7002 cap->datalen - 1, true)) { 7003 GENL_SET_ERR_MSG(info, "bad EHT capability in beacon"); 7004 return -EINVAL; 7005 } 7006 } 7007 7008 if (!!params->he_cap != !!params->beacon.he_oper) 7009 return -EINVAL; 7010 7011 if (!!params->eht_cap != !!params->beacon.eht_oper) 7012 return -EINVAL; 7013 7014 return 0; 7015 } 7016 7017 static bool nl80211_get_ap_channel(struct cfg80211_registered_device *rdev, 7018 struct cfg80211_ap_settings *params) 7019 { 7020 struct wireless_dev *wdev; 7021 7022 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) { 7023 if (wdev->iftype != NL80211_IFTYPE_AP && 7024 wdev->iftype != NL80211_IFTYPE_P2P_GO) 7025 continue; 7026 7027 if (!wdev->u.ap.preset_chandef.chan) 7028 continue; 7029 7030 params->chandef = wdev->u.ap.preset_chandef; 7031 return true; 7032 } 7033 7034 return false; 7035 } 7036 7037 static bool nl80211_valid_auth_type(struct cfg80211_registered_device *rdev, 7038 enum nl80211_auth_type auth_type, 7039 enum nl80211_commands cmd) 7040 { 7041 if (auth_type > NL80211_AUTHTYPE_MAX) 7042 return false; 7043 7044 switch (cmd) { 7045 case NL80211_CMD_AUTHENTICATE: 7046 if (!(rdev->wiphy.features & NL80211_FEATURE_SAE) && 7047 auth_type == NL80211_AUTHTYPE_SAE) 7048 return false; 7049 if (!wiphy_ext_feature_isset(&rdev->wiphy, 7050 NL80211_EXT_FEATURE_FILS_STA) && 7051 (auth_type == NL80211_AUTHTYPE_FILS_SK || 7052 auth_type == NL80211_AUTHTYPE_FILS_SK_PFS || 7053 auth_type == NL80211_AUTHTYPE_FILS_PK)) 7054 return false; 7055 if (!wiphy_ext_feature_isset(&rdev->wiphy, 7056 NL80211_EXT_FEATURE_EPPKE) && 7057 auth_type == NL80211_AUTHTYPE_EPPKE) 7058 return false; 7059 if (!wiphy_ext_feature_isset(&rdev->wiphy, 7060 NL80211_EXT_FEATURE_IEEE8021X_AUTH) && 7061 auth_type == NL80211_AUTHTYPE_IEEE8021X) 7062 return false; 7063 return true; 7064 case NL80211_CMD_CONNECT: 7065 if (!(rdev->wiphy.features & NL80211_FEATURE_SAE) && 7066 !wiphy_ext_feature_isset(&rdev->wiphy, 7067 NL80211_EXT_FEATURE_SAE_OFFLOAD) && 7068 auth_type == NL80211_AUTHTYPE_SAE) 7069 return false; 7070 7071 /* FILS with SK PFS or PK not supported yet */ 7072 if (auth_type == NL80211_AUTHTYPE_FILS_SK_PFS || 7073 auth_type == NL80211_AUTHTYPE_FILS_PK) 7074 return false; 7075 if (!wiphy_ext_feature_isset( 7076 &rdev->wiphy, 7077 NL80211_EXT_FEATURE_FILS_SK_OFFLOAD) && 7078 auth_type == NL80211_AUTHTYPE_FILS_SK) 7079 return false; 7080 if (!wiphy_ext_feature_isset(&rdev->wiphy, 7081 NL80211_EXT_FEATURE_EPPKE) && 7082 auth_type == NL80211_AUTHTYPE_EPPKE) 7083 return false; 7084 if (!wiphy_ext_feature_isset(&rdev->wiphy, 7085 NL80211_EXT_FEATURE_IEEE8021X_AUTH) && 7086 auth_type == NL80211_AUTHTYPE_IEEE8021X) 7087 return false; 7088 return true; 7089 case NL80211_CMD_START_AP: 7090 if (!wiphy_ext_feature_isset(&rdev->wiphy, 7091 NL80211_EXT_FEATURE_SAE_OFFLOAD_AP) && 7092 auth_type == NL80211_AUTHTYPE_SAE) 7093 return false; 7094 /* FILS not supported yet */ 7095 if (auth_type == NL80211_AUTHTYPE_FILS_SK || 7096 auth_type == NL80211_AUTHTYPE_FILS_SK_PFS || 7097 auth_type == NL80211_AUTHTYPE_FILS_PK) 7098 return false; 7099 return true; 7100 default: 7101 return false; 7102 } 7103 } 7104 7105 static void nl80211_send_ap_started(struct wireless_dev *wdev, 7106 unsigned int link_id) 7107 { 7108 struct wiphy *wiphy = wdev->wiphy; 7109 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 7110 struct sk_buff *msg; 7111 void *hdr; 7112 7113 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 7114 if (!msg) 7115 return; 7116 7117 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_START_AP); 7118 if (!hdr) 7119 goto out; 7120 7121 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 7122 nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex) || 7123 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 7124 NL80211_ATTR_PAD) || 7125 (wdev->u.ap.ssid_len && 7126 nla_put(msg, NL80211_ATTR_SSID, wdev->u.ap.ssid_len, 7127 wdev->u.ap.ssid)) || 7128 (wdev->valid_links && 7129 nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link_id))) 7130 goto out; 7131 7132 genlmsg_end(msg, hdr); 7133 7134 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(wiphy), msg, 0, 7135 NL80211_MCGRP_MLME, GFP_KERNEL); 7136 return; 7137 out: 7138 nlmsg_free(msg); 7139 } 7140 7141 static int 7142 nl80211_parse_s1g_short_beacon(struct cfg80211_registered_device *rdev, 7143 struct nlattr *attrs, 7144 struct cfg80211_s1g_short_beacon *sb) 7145 { 7146 struct nlattr *tb[NL80211_S1G_SHORT_BEACON_ATTR_MAX + 1]; 7147 int ret; 7148 7149 if (!rdev->wiphy.bands[NL80211_BAND_S1GHZ]) 7150 return -EINVAL; 7151 7152 ret = nla_parse_nested(tb, NL80211_S1G_SHORT_BEACON_ATTR_MAX, attrs, 7153 NULL, NULL); 7154 if (ret) 7155 return ret; 7156 7157 /* Short beacon tail is optional (i.e might only include the TIM) */ 7158 if (!tb[NL80211_S1G_SHORT_BEACON_ATTR_HEAD]) 7159 return -EINVAL; 7160 7161 sb->short_head = nla_data(tb[NL80211_S1G_SHORT_BEACON_ATTR_HEAD]); 7162 sb->short_head_len = nla_len(tb[NL80211_S1G_SHORT_BEACON_ATTR_HEAD]); 7163 sb->short_tail_len = 0; 7164 7165 if (tb[NL80211_S1G_SHORT_BEACON_ATTR_TAIL]) { 7166 sb->short_tail = 7167 nla_data(tb[NL80211_S1G_SHORT_BEACON_ATTR_TAIL]); 7168 sb->short_tail_len = 7169 nla_len(tb[NL80211_S1G_SHORT_BEACON_ATTR_TAIL]); 7170 } 7171 7172 sb->update = true; 7173 return 0; 7174 } 7175 7176 static int nl80211_check_npca(struct cfg80211_registered_device *rdev, 7177 const struct cfg80211_chan_def *chandef, 7178 enum nl80211_iftype iftype, 7179 struct netlink_ext_ack *extack) 7180 { 7181 const struct ieee80211_supported_band *sband; 7182 const struct ieee80211_sta_uhr_cap *uhr_cap; 7183 7184 if (!chandef->npca_chan) 7185 return 0; 7186 7187 sband = rdev->wiphy.bands[chandef->chan->band]; 7188 uhr_cap = ieee80211_get_uhr_iftype_cap(sband, iftype); 7189 7190 if (uhr_cap && 7191 (uhr_cap->mac.mac_cap[0] & IEEE80211_UHR_MAC_CAP0_NPCA_SUPP)) 7192 return 0; 7193 7194 NL_SET_ERR_MSG(extack, "NPCA not supported"); 7195 return -EINVAL; 7196 } 7197 7198 static int nl80211_start_ap(struct sk_buff *skb, struct genl_info *info) 7199 { 7200 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 7201 struct cfg80211_beaconing_check_config beacon_check = {}; 7202 unsigned int link_id = nl80211_link_id(info->attrs); 7203 struct net_device *dev = info->user_ptr[1]; 7204 struct wireless_dev *wdev = dev->ieee80211_ptr; 7205 struct cfg80211_ap_settings *params; 7206 int err; 7207 7208 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 7209 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 7210 return -EOPNOTSUPP; 7211 7212 if (!rdev->ops->start_ap) 7213 return -EOPNOTSUPP; 7214 7215 if (wdev->links[link_id].cac_started) 7216 return -EBUSY; 7217 7218 if (wdev->links[link_id].ap.beacon_interval) 7219 return -EALREADY; 7220 7221 /* these are required for START_AP */ 7222 if (!info->attrs[NL80211_ATTR_BEACON_INTERVAL] || 7223 !info->attrs[NL80211_ATTR_DTIM_PERIOD] || 7224 !info->attrs[NL80211_ATTR_BEACON_HEAD]) 7225 return -EINVAL; 7226 7227 if (info->attrs[NL80211_ATTR_SMPS_MODE] && 7228 nla_get_u8(info->attrs[NL80211_ATTR_SMPS_MODE]) != NL80211_SMPS_OFF) 7229 return -EOPNOTSUPP; 7230 7231 params = kzalloc_obj(*params); 7232 if (!params) 7233 return -ENOMEM; 7234 7235 params->beacon_interval = 7236 nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]); 7237 params->dtim_period = 7238 nla_get_u32(info->attrs[NL80211_ATTR_DTIM_PERIOD]); 7239 7240 err = cfg80211_validate_beacon_int(rdev, dev->ieee80211_ptr->iftype, 7241 params->beacon_interval); 7242 if (err) 7243 goto out; 7244 7245 /* 7246 * In theory, some of these attributes should be required here 7247 * but since they were not used when the command was originally 7248 * added, keep them optional for old user space programs to let 7249 * them continue to work with drivers that do not need the 7250 * additional information -- drivers must check! 7251 */ 7252 if (info->attrs[NL80211_ATTR_SSID]) { 7253 params->ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); 7254 params->ssid_len = 7255 nla_len(info->attrs[NL80211_ATTR_SSID]); 7256 if (params->ssid_len == 0) { 7257 err = -EINVAL; 7258 goto out; 7259 } 7260 7261 if (wdev->u.ap.ssid_len && 7262 (wdev->u.ap.ssid_len != params->ssid_len || 7263 memcmp(wdev->u.ap.ssid, params->ssid, params->ssid_len))) { 7264 /* require identical SSID for MLO */ 7265 err = -EINVAL; 7266 goto out; 7267 } 7268 } else if (wdev->valid_links) { 7269 /* require SSID for MLO */ 7270 err = -EINVAL; 7271 goto out; 7272 } 7273 7274 if (info->attrs[NL80211_ATTR_HIDDEN_SSID]) 7275 params->hidden_ssid = nla_get_u32( 7276 info->attrs[NL80211_ATTR_HIDDEN_SSID]); 7277 7278 params->privacy = !!info->attrs[NL80211_ATTR_PRIVACY]; 7279 7280 if (info->attrs[NL80211_ATTR_AUTH_TYPE]) { 7281 params->auth_type = nla_get_u32( 7282 info->attrs[NL80211_ATTR_AUTH_TYPE]); 7283 if (!nl80211_valid_auth_type(rdev, params->auth_type, 7284 NL80211_CMD_START_AP)) { 7285 err = -EINVAL; 7286 goto out; 7287 } 7288 } else 7289 params->auth_type = NL80211_AUTHTYPE_AUTOMATIC; 7290 7291 err = nl80211_crypto_settings(rdev, info, ¶ms->crypto, 7292 NL80211_MAX_NR_CIPHER_SUITES); 7293 if (err) 7294 goto out; 7295 7296 if (info->attrs[NL80211_ATTR_INACTIVITY_TIMEOUT]) { 7297 if (!(rdev->wiphy.features & NL80211_FEATURE_INACTIVITY_TIMER)) { 7298 err = -EOPNOTSUPP; 7299 goto out; 7300 } 7301 params->inactivity_timeout = nla_get_u16( 7302 info->attrs[NL80211_ATTR_INACTIVITY_TIMEOUT]); 7303 } 7304 7305 if (info->attrs[NL80211_ATTR_P2P_CTWINDOW]) { 7306 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) { 7307 err = -EINVAL; 7308 goto out; 7309 } 7310 params->p2p_ctwindow = 7311 nla_get_u8(info->attrs[NL80211_ATTR_P2P_CTWINDOW]); 7312 if (params->p2p_ctwindow != 0 && 7313 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_CTWIN)) { 7314 err = -EINVAL; 7315 goto out; 7316 } 7317 } 7318 7319 if (info->attrs[NL80211_ATTR_P2P_OPPPS]) { 7320 u8 tmp; 7321 7322 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) { 7323 err = -EINVAL; 7324 goto out; 7325 } 7326 tmp = nla_get_u8(info->attrs[NL80211_ATTR_P2P_OPPPS]); 7327 params->p2p_opp_ps = tmp; 7328 if (params->p2p_opp_ps != 0 && 7329 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_OPPPS)) { 7330 err = -EINVAL; 7331 goto out; 7332 } 7333 } 7334 7335 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { 7336 err = nl80211_parse_chandef(rdev, info->extack, info->attrs, 7337 ¶ms->chandef, true); 7338 if (err) 7339 goto out; 7340 } else if (wdev->valid_links) { 7341 /* with MLD need to specify the channel configuration */ 7342 err = -EINVAL; 7343 goto out; 7344 } else if (wdev->u.ap.preset_chandef.chan) { 7345 params->chandef = wdev->u.ap.preset_chandef; 7346 } else if (!nl80211_get_ap_channel(rdev, params)) { 7347 err = -EINVAL; 7348 goto out; 7349 } 7350 7351 err = nl80211_parse_beacon(rdev, info->attrs, ¶ms->beacon, 7352 params->chandef.chan, info->extack); 7353 if (err) 7354 goto out; 7355 7356 err = nl80211_check_npca(rdev, ¶ms->chandef, wdev->iftype, 7357 info->extack); 7358 if (err) 7359 goto out; 7360 7361 beacon_check.iftype = wdev->iftype; 7362 beacon_check.relax = true; 7363 beacon_check.reg_power = 7364 cfg80211_get_6ghz_power_type(params->beacon.tail, 7365 params->beacon.tail_len, 0); 7366 if (!cfg80211_reg_check_beaconing(&rdev->wiphy, ¶ms->chandef, 7367 &beacon_check)) { 7368 err = -EINVAL; 7369 goto out; 7370 } 7371 7372 if (info->attrs[NL80211_ATTR_TX_RATES]) { 7373 err = nl80211_parse_tx_bitrate_mask(info, info->attrs, 7374 NL80211_ATTR_TX_RATES, 7375 ¶ms->beacon_rate, 7376 dev, false, link_id); 7377 if (err) 7378 goto out; 7379 7380 err = validate_beacon_tx_rate(rdev, params->chandef.chan->band, 7381 ¶ms->beacon_rate); 7382 if (err) 7383 goto out; 7384 } 7385 7386 params->pbss = nla_get_flag(info->attrs[NL80211_ATTR_PBSS]); 7387 if (params->pbss && !rdev->wiphy.bands[NL80211_BAND_60GHZ]) { 7388 err = -EOPNOTSUPP; 7389 goto out; 7390 } 7391 7392 if (info->attrs[NL80211_ATTR_ACL_POLICY]) { 7393 params->acl = parse_acl_data(&rdev->wiphy, info); 7394 if (IS_ERR(params->acl)) { 7395 err = PTR_ERR(params->acl); 7396 params->acl = NULL; 7397 goto out; 7398 } 7399 } 7400 7401 params->twt_responder = 7402 nla_get_flag(info->attrs[NL80211_ATTR_TWT_RESPONDER]); 7403 7404 if (info->attrs[NL80211_ATTR_HE_OBSS_PD]) { 7405 err = nl80211_parse_he_obss_pd( 7406 info->attrs[NL80211_ATTR_HE_OBSS_PD], 7407 ¶ms->he_obss_pd); 7408 if (err) 7409 goto out; 7410 } 7411 7412 if (info->attrs[NL80211_ATTR_FILS_DISCOVERY]) { 7413 err = nl80211_parse_fils_discovery(rdev, 7414 info->attrs[NL80211_ATTR_FILS_DISCOVERY], 7415 ¶ms->fils_discovery); 7416 if (err) 7417 goto out; 7418 } 7419 7420 if (info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP]) { 7421 err = nl80211_parse_unsol_bcast_probe_resp( 7422 rdev, info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP], 7423 ¶ms->unsol_bcast_probe_resp); 7424 if (err) 7425 goto out; 7426 } 7427 7428 if (info->attrs[NL80211_ATTR_MBSSID_CONFIG]) { 7429 err = nl80211_parse_mbssid_config(&rdev->wiphy, dev, link_id, 7430 info->attrs[NL80211_ATTR_MBSSID_CONFIG], 7431 ¶ms->mbssid_config, 7432 params->beacon.mbssid_ies ? 7433 params->beacon.mbssid_ies->cnt : 7434 0); 7435 if (err) 7436 goto out; 7437 } 7438 7439 if (!params->mbssid_config.ema && params->beacon.rnr_ies) { 7440 err = -EINVAL; 7441 goto out; 7442 } 7443 7444 if (info->attrs[NL80211_ATTR_S1G_SHORT_BEACON]) { 7445 if (!info->attrs[NL80211_ATTR_S1G_LONG_BEACON_PERIOD]) { 7446 err = -EINVAL; 7447 goto out; 7448 } 7449 7450 params->s1g_long_beacon_period = nla_get_u8( 7451 info->attrs[NL80211_ATTR_S1G_LONG_BEACON_PERIOD]); 7452 7453 err = nl80211_parse_s1g_short_beacon( 7454 rdev, info->attrs[NL80211_ATTR_S1G_SHORT_BEACON], 7455 ¶ms->s1g_short_beacon); 7456 if (err) 7457 goto out; 7458 } 7459 7460 err = nl80211_calculate_ap_capabilities(info, params); 7461 if (err) 7462 goto out; 7463 7464 if (info->attrs[NL80211_ATTR_AP_SETTINGS_FLAGS]) 7465 params->flags = nla_get_u32( 7466 info->attrs[NL80211_ATTR_AP_SETTINGS_FLAGS]); 7467 else if (info->attrs[NL80211_ATTR_EXTERNAL_AUTH_SUPPORT]) 7468 params->flags |= NL80211_AP_SETTINGS_EXTERNAL_AUTH_SUPPORT; 7469 7470 if (wdev->conn_owner_nlportid && 7471 info->attrs[NL80211_ATTR_SOCKET_OWNER] && 7472 wdev->conn_owner_nlportid != info->snd_portid) { 7473 err = -EINVAL; 7474 goto out; 7475 } 7476 7477 /* FIXME: validate MLO/link-id against driver capabilities */ 7478 7479 err = rdev_start_ap(rdev, dev, params); 7480 if (!err) { 7481 wdev->links[link_id].ap.beacon_interval = params->beacon_interval; 7482 wdev->links[link_id].ap.chandef = params->chandef; 7483 wdev->u.ap.ssid_len = params->ssid_len; 7484 memcpy(wdev->u.ap.ssid, params->ssid, 7485 params->ssid_len); 7486 7487 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) 7488 wdev->conn_owner_nlportid = info->snd_portid; 7489 7490 nl80211_send_ap_started(wdev, link_id); 7491 } 7492 out: 7493 kfree(params->acl); 7494 kfree(params->beacon.mbssid_ies); 7495 if (params->mbssid_config.tx_wdev && 7496 params->mbssid_config.tx_wdev->netdev && 7497 params->mbssid_config.tx_wdev->netdev != dev) 7498 dev_put(params->mbssid_config.tx_wdev->netdev); 7499 kfree(params->beacon.rnr_ies); 7500 kfree(params); 7501 7502 return err; 7503 } 7504 7505 static int nl80211_set_beacon(struct sk_buff *skb, struct genl_info *info) 7506 { 7507 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 7508 struct cfg80211_beaconing_check_config beacon_check = {}; 7509 unsigned int link_id = nl80211_link_id(info->attrs); 7510 struct net_device *dev = info->user_ptr[1]; 7511 struct wireless_dev *wdev = dev->ieee80211_ptr; 7512 struct cfg80211_ap_update *params; 7513 struct nlattr *attr; 7514 int err; 7515 7516 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 7517 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 7518 return -EOPNOTSUPP; 7519 7520 if (!rdev->ops->change_beacon) 7521 return -EOPNOTSUPP; 7522 7523 if (!wdev->links[link_id].ap.beacon_interval) 7524 return -EINVAL; 7525 7526 params = kzalloc_obj(*params); 7527 if (!params) 7528 return -ENOMEM; 7529 7530 err = nl80211_parse_beacon(rdev, info->attrs, ¶ms->beacon, 7531 wdev->links[link_id].ap.chandef.chan, 7532 info->extack); 7533 if (err) 7534 goto out; 7535 7536 /* recheck beaconing is permitted with possibly changed power type */ 7537 beacon_check.iftype = wdev->iftype; 7538 beacon_check.relax = true; 7539 beacon_check.reg_power = 7540 cfg80211_get_6ghz_power_type(params->beacon.tail, 7541 params->beacon.tail_len, 0); 7542 if (!cfg80211_reg_check_beaconing(&rdev->wiphy, 7543 &wdev->links[link_id].ap.chandef, 7544 &beacon_check)) { 7545 err = -EINVAL; 7546 goto out; 7547 } 7548 7549 attr = info->attrs[NL80211_ATTR_FILS_DISCOVERY]; 7550 if (attr) { 7551 err = nl80211_parse_fils_discovery(rdev, attr, 7552 ¶ms->fils_discovery); 7553 if (err) 7554 goto out; 7555 } 7556 7557 attr = info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP]; 7558 if (attr) { 7559 err = nl80211_parse_unsol_bcast_probe_resp(rdev, attr, 7560 ¶ms->unsol_bcast_probe_resp); 7561 if (err) 7562 goto out; 7563 } 7564 7565 attr = info->attrs[NL80211_ATTR_S1G_SHORT_BEACON]; 7566 if (attr) { 7567 err = nl80211_parse_s1g_short_beacon(rdev, attr, 7568 ¶ms->s1g_short_beacon); 7569 if (err) 7570 goto out; 7571 } 7572 7573 err = rdev_change_beacon(rdev, dev, params); 7574 7575 out: 7576 kfree(params->beacon.mbssid_ies); 7577 kfree(params->beacon.rnr_ies); 7578 kfree(params); 7579 return err; 7580 } 7581 7582 static int nl80211_stop_ap(struct sk_buff *skb, struct genl_info *info) 7583 { 7584 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 7585 unsigned int link_id = nl80211_link_id(info->attrs); 7586 struct net_device *dev = info->user_ptr[1]; 7587 7588 return cfg80211_stop_ap(rdev, dev, link_id, false); 7589 } 7590 7591 static const struct nla_policy sta_flags_policy[NL80211_STA_FLAG_MAX + 1] = { 7592 [NL80211_STA_FLAG_AUTHORIZED] = { .type = NLA_FLAG }, 7593 [NL80211_STA_FLAG_SHORT_PREAMBLE] = { .type = NLA_FLAG }, 7594 [NL80211_STA_FLAG_WME] = { .type = NLA_FLAG }, 7595 [NL80211_STA_FLAG_MFP] = { .type = NLA_FLAG }, 7596 [NL80211_STA_FLAG_AUTHENTICATED] = { .type = NLA_FLAG }, 7597 [NL80211_STA_FLAG_TDLS_PEER] = { .type = NLA_FLAG }, 7598 }; 7599 7600 static int parse_station_flags(struct genl_info *info, 7601 enum nl80211_iftype iftype, 7602 struct station_parameters *params) 7603 { 7604 struct nlattr *flags[NL80211_STA_FLAG_MAX + 1]; 7605 struct nlattr *nla; 7606 int flag; 7607 7608 /* 7609 * Try parsing the new attribute first so userspace 7610 * can specify both for older kernels. 7611 */ 7612 nla = info->attrs[NL80211_ATTR_STA_FLAGS2]; 7613 if (nla) { 7614 struct nl80211_sta_flag_update *sta_flags; 7615 7616 sta_flags = nla_data(nla); 7617 params->sta_flags_mask = sta_flags->mask; 7618 params->sta_flags_set = sta_flags->set; 7619 params->sta_flags_set &= params->sta_flags_mask; 7620 if ((params->sta_flags_mask | 7621 params->sta_flags_set) & BIT(__NL80211_STA_FLAG_INVALID)) 7622 return -EINVAL; 7623 7624 if ((iftype == NL80211_IFTYPE_NAN || 7625 iftype == NL80211_IFTYPE_NAN_DATA) && 7626 params->sta_flags_mask & 7627 ~(BIT(NL80211_STA_FLAG_AUTHENTICATED) | 7628 BIT(NL80211_STA_FLAG_ASSOCIATED) | 7629 BIT(NL80211_STA_FLAG_AUTHORIZED) | 7630 BIT(NL80211_STA_FLAG_MFP))) 7631 return -EINVAL; 7632 7633 /* WME is always used in NAN */ 7634 if (iftype == NL80211_IFTYPE_NAN_DATA) { 7635 /* but don't let userspace control it */ 7636 if (params->sta_flags_mask & BIT(NL80211_STA_FLAG_WME)) 7637 return -EINVAL; 7638 7639 params->sta_flags_mask |= BIT(NL80211_STA_FLAG_WME); 7640 params->sta_flags_set |= BIT(NL80211_STA_FLAG_WME); 7641 } 7642 7643 return 0; 7644 } 7645 7646 /* if present, parse the old attribute */ 7647 7648 nla = info->attrs[NL80211_ATTR_STA_FLAGS]; 7649 if (!nla) 7650 return 0; 7651 7652 if (nla_parse_nested_deprecated(flags, NL80211_STA_FLAG_MAX, nla, sta_flags_policy, info->extack)) 7653 return -EINVAL; 7654 7655 /* 7656 * Only allow certain flags for interface types so that 7657 * other attributes are silently ignored. Remember that 7658 * this is backward compatibility code with old userspace 7659 * and shouldn't be hit in other cases anyway. 7660 */ 7661 switch (iftype) { 7662 case NL80211_IFTYPE_AP: 7663 case NL80211_IFTYPE_AP_VLAN: 7664 case NL80211_IFTYPE_P2P_GO: 7665 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHORIZED) | 7666 BIT(NL80211_STA_FLAG_SHORT_PREAMBLE) | 7667 BIT(NL80211_STA_FLAG_WME) | 7668 BIT(NL80211_STA_FLAG_MFP); 7669 break; 7670 case NL80211_IFTYPE_P2P_CLIENT: 7671 case NL80211_IFTYPE_STATION: 7672 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHORIZED) | 7673 BIT(NL80211_STA_FLAG_TDLS_PEER); 7674 break; 7675 case NL80211_IFTYPE_MESH_POINT: 7676 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHENTICATED) | 7677 BIT(NL80211_STA_FLAG_MFP) | 7678 BIT(NL80211_STA_FLAG_AUTHORIZED); 7679 break; 7680 default: 7681 return -EINVAL; 7682 } 7683 7684 for (flag = 1; flag <= NL80211_STA_FLAG_MAX; flag++) { 7685 if (flags[flag]) { 7686 params->sta_flags_set |= (1<<flag); 7687 7688 /* no longer support new API additions in old API */ 7689 if (flag > NL80211_STA_FLAG_MAX_OLD_API) 7690 return -EINVAL; 7691 } 7692 } 7693 7694 return 0; 7695 } 7696 7697 bool nl80211_put_sta_rate(struct sk_buff *msg, struct rate_info *info, int attr) 7698 { 7699 struct nlattr *rate; 7700 u32 bitrate; 7701 u16 bitrate_compat; 7702 enum nl80211_rate_info rate_flg; 7703 7704 rate = nla_nest_start_noflag(msg, attr); 7705 if (!rate) 7706 return false; 7707 7708 /* cfg80211_calculate_bitrate will return 0 for mcs >= 32 */ 7709 bitrate = cfg80211_calculate_bitrate(info); 7710 /* report 16-bit bitrate only if we can */ 7711 bitrate_compat = bitrate < (1UL << 16) ? bitrate : 0; 7712 if (bitrate > 0 && 7713 nla_put_u32(msg, NL80211_RATE_INFO_BITRATE32, bitrate)) 7714 return false; 7715 if (bitrate_compat > 0 && 7716 nla_put_u16(msg, NL80211_RATE_INFO_BITRATE, bitrate_compat)) 7717 return false; 7718 7719 switch (info->bw) { 7720 case RATE_INFO_BW_1: 7721 rate_flg = NL80211_RATE_INFO_1_MHZ_WIDTH; 7722 break; 7723 case RATE_INFO_BW_2: 7724 rate_flg = NL80211_RATE_INFO_2_MHZ_WIDTH; 7725 break; 7726 case RATE_INFO_BW_4: 7727 rate_flg = NL80211_RATE_INFO_4_MHZ_WIDTH; 7728 break; 7729 case RATE_INFO_BW_5: 7730 rate_flg = NL80211_RATE_INFO_5_MHZ_WIDTH; 7731 break; 7732 case RATE_INFO_BW_8: 7733 rate_flg = NL80211_RATE_INFO_8_MHZ_WIDTH; 7734 break; 7735 case RATE_INFO_BW_10: 7736 rate_flg = NL80211_RATE_INFO_10_MHZ_WIDTH; 7737 break; 7738 case RATE_INFO_BW_16: 7739 rate_flg = NL80211_RATE_INFO_16_MHZ_WIDTH; 7740 break; 7741 default: 7742 WARN_ON(1); 7743 fallthrough; 7744 case RATE_INFO_BW_20: 7745 rate_flg = 0; 7746 break; 7747 case RATE_INFO_BW_40: 7748 rate_flg = NL80211_RATE_INFO_40_MHZ_WIDTH; 7749 break; 7750 case RATE_INFO_BW_80: 7751 rate_flg = NL80211_RATE_INFO_80_MHZ_WIDTH; 7752 break; 7753 case RATE_INFO_BW_160: 7754 rate_flg = NL80211_RATE_INFO_160_MHZ_WIDTH; 7755 break; 7756 case RATE_INFO_BW_HE_RU: 7757 rate_flg = 0; 7758 WARN_ON(!(info->flags & RATE_INFO_FLAGS_HE_MCS)); 7759 break; 7760 case RATE_INFO_BW_320: 7761 rate_flg = NL80211_RATE_INFO_320_MHZ_WIDTH; 7762 break; 7763 case RATE_INFO_BW_EHT_RU: 7764 rate_flg = 0; 7765 WARN_ON(!(info->flags & RATE_INFO_FLAGS_EHT_MCS) && 7766 !(info->flags & RATE_INFO_FLAGS_UHR_MCS)); 7767 break; 7768 } 7769 7770 if (rate_flg && nla_put_flag(msg, rate_flg)) 7771 return false; 7772 7773 if (info->flags & RATE_INFO_FLAGS_MCS) { 7774 if (nla_put_u8(msg, NL80211_RATE_INFO_MCS, info->mcs)) 7775 return false; 7776 if (info->flags & RATE_INFO_FLAGS_SHORT_GI && 7777 nla_put_flag(msg, NL80211_RATE_INFO_SHORT_GI)) 7778 return false; 7779 } else if (info->flags & RATE_INFO_FLAGS_VHT_MCS) { 7780 if (nla_put_u8(msg, NL80211_RATE_INFO_VHT_MCS, info->mcs)) 7781 return false; 7782 if (nla_put_u8(msg, NL80211_RATE_INFO_VHT_NSS, info->nss)) 7783 return false; 7784 if (info->flags & RATE_INFO_FLAGS_SHORT_GI && 7785 nla_put_flag(msg, NL80211_RATE_INFO_SHORT_GI)) 7786 return false; 7787 } else if (info->flags & RATE_INFO_FLAGS_HE_MCS) { 7788 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_MCS, info->mcs)) 7789 return false; 7790 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_NSS, info->nss)) 7791 return false; 7792 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_GI, info->he_gi)) 7793 return false; 7794 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_DCM, info->he_dcm)) 7795 return false; 7796 if (info->bw == RATE_INFO_BW_HE_RU && 7797 nla_put_u8(msg, NL80211_RATE_INFO_HE_RU_ALLOC, 7798 info->he_ru_alloc)) 7799 return false; 7800 } else if (info->flags & RATE_INFO_FLAGS_S1G_MCS) { 7801 if (nla_put_u8(msg, NL80211_RATE_INFO_S1G_MCS, info->mcs)) 7802 return false; 7803 if (nla_put_u8(msg, NL80211_RATE_INFO_S1G_NSS, info->nss)) 7804 return false; 7805 if (info->flags & RATE_INFO_FLAGS_SHORT_GI && 7806 nla_put_flag(msg, NL80211_RATE_INFO_SHORT_GI)) 7807 return false; 7808 } else if (info->flags & RATE_INFO_FLAGS_EHT_MCS) { 7809 if (nla_put_u8(msg, NL80211_RATE_INFO_EHT_MCS, info->mcs)) 7810 return false; 7811 if (nla_put_u8(msg, NL80211_RATE_INFO_EHT_NSS, info->nss)) 7812 return false; 7813 if (nla_put_u8(msg, NL80211_RATE_INFO_EHT_GI, info->eht_gi)) 7814 return false; 7815 if (info->bw == RATE_INFO_BW_EHT_RU && 7816 nla_put_u8(msg, NL80211_RATE_INFO_EHT_RU_ALLOC, 7817 info->eht_ru_alloc)) 7818 return false; 7819 } else if (info->flags & RATE_INFO_FLAGS_UHR_MCS) { 7820 if (nla_put_u8(msg, NL80211_RATE_INFO_UHR_MCS, info->mcs)) 7821 return false; 7822 if (nla_put_u8(msg, NL80211_RATE_INFO_EHT_NSS, info->nss)) 7823 return false; 7824 if (nla_put_u8(msg, NL80211_RATE_INFO_EHT_GI, info->eht_gi)) 7825 return false; 7826 if (info->bw == RATE_INFO_BW_EHT_RU && 7827 nla_put_u8(msg, NL80211_RATE_INFO_EHT_RU_ALLOC, 7828 info->eht_ru_alloc)) 7829 return false; 7830 if (info->flags & RATE_INFO_FLAGS_UHR_ELR_MCS && 7831 nla_put_flag(msg, NL80211_RATE_INFO_UHR_ELR)) 7832 return false; 7833 if (info->flags & RATE_INFO_FLAGS_UHR_IM && 7834 nla_put_flag(msg, NL80211_RATE_INFO_UHR_IM)) 7835 return false; 7836 } 7837 7838 nla_nest_end(msg, rate); 7839 return true; 7840 } 7841 7842 static bool nl80211_put_signal(struct sk_buff *msg, u8 mask, s8 *signal, 7843 int id) 7844 { 7845 void *attr; 7846 int i = 0; 7847 7848 if (!mask) 7849 return true; 7850 7851 attr = nla_nest_start_noflag(msg, id); 7852 if (!attr) 7853 return false; 7854 7855 for (i = 0; i < IEEE80211_MAX_CHAINS; i++) { 7856 if (!(mask & BIT(i))) 7857 continue; 7858 7859 if (nla_put_u8(msg, i, signal[i])) 7860 return false; 7861 } 7862 7863 nla_nest_end(msg, attr); 7864 7865 return true; 7866 } 7867 7868 static int nl80211_fill_link_station(struct sk_buff *msg, 7869 struct cfg80211_registered_device *rdev, 7870 struct link_station_info *link_sinfo) 7871 { 7872 struct nlattr *bss_param, *link_sinfoattr; 7873 7874 #define PUT_LINK_SINFO(attr, memb, type) do { \ 7875 BUILD_BUG_ON(sizeof(type) == sizeof(u64)); \ 7876 if (link_sinfo->filled & BIT_ULL(NL80211_STA_INFO_ ## attr) && \ 7877 nla_put_ ## type(msg, NL80211_STA_INFO_ ## attr, \ 7878 link_sinfo->memb)) \ 7879 goto nla_put_failure; \ 7880 } while (0) 7881 #define PUT_LINK_SINFO_U64(attr, memb) do { \ 7882 if (link_sinfo->filled & BIT_ULL(NL80211_STA_INFO_ ## attr) && \ 7883 nla_put_u64_64bit(msg, NL80211_STA_INFO_ ## attr, \ 7884 link_sinfo->memb, NL80211_STA_INFO_PAD)) \ 7885 goto nla_put_failure; \ 7886 } while (0) 7887 7888 link_sinfoattr = nla_nest_start(msg, NL80211_ATTR_STA_INFO); 7889 if (!link_sinfoattr) 7890 goto nla_put_failure; 7891 7892 PUT_LINK_SINFO(INACTIVE_TIME, inactive_time, u32); 7893 7894 if (link_sinfo->filled & (BIT_ULL(NL80211_STA_INFO_RX_BYTES) | 7895 BIT_ULL(NL80211_STA_INFO_RX_BYTES64)) && 7896 nla_put_u32(msg, NL80211_STA_INFO_RX_BYTES, 7897 (u32)link_sinfo->rx_bytes)) 7898 goto nla_put_failure; 7899 7900 if (link_sinfo->filled & (BIT_ULL(NL80211_STA_INFO_TX_BYTES) | 7901 BIT_ULL(NL80211_STA_INFO_TX_BYTES64)) && 7902 nla_put_u32(msg, NL80211_STA_INFO_TX_BYTES, 7903 (u32)link_sinfo->tx_bytes)) 7904 goto nla_put_failure; 7905 7906 PUT_LINK_SINFO_U64(RX_BYTES64, rx_bytes); 7907 PUT_LINK_SINFO_U64(TX_BYTES64, tx_bytes); 7908 PUT_LINK_SINFO_U64(RX_DURATION, rx_duration); 7909 PUT_LINK_SINFO_U64(TX_DURATION, tx_duration); 7910 7911 if (wiphy_ext_feature_isset(&rdev->wiphy, 7912 NL80211_EXT_FEATURE_AIRTIME_FAIRNESS)) 7913 PUT_LINK_SINFO(AIRTIME_WEIGHT, airtime_weight, u16); 7914 7915 switch (rdev->wiphy.signal_type) { 7916 case CFG80211_SIGNAL_TYPE_MBM: 7917 PUT_LINK_SINFO(SIGNAL, signal, u8); 7918 PUT_LINK_SINFO(SIGNAL_AVG, signal_avg, u8); 7919 break; 7920 default: 7921 break; 7922 } 7923 if (link_sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL)) { 7924 if (!nl80211_put_signal(msg, link_sinfo->chains, 7925 link_sinfo->chain_signal, 7926 NL80211_STA_INFO_CHAIN_SIGNAL)) 7927 goto nla_put_failure; 7928 } 7929 if (link_sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL_AVG)) { 7930 if (!nl80211_put_signal(msg, link_sinfo->chains, 7931 link_sinfo->chain_signal_avg, 7932 NL80211_STA_INFO_CHAIN_SIGNAL_AVG)) 7933 goto nla_put_failure; 7934 } 7935 if (link_sinfo->filled & BIT_ULL(NL80211_STA_INFO_TX_BITRATE)) { 7936 if (!nl80211_put_sta_rate(msg, &link_sinfo->txrate, 7937 NL80211_STA_INFO_TX_BITRATE)) 7938 goto nla_put_failure; 7939 } 7940 if (link_sinfo->filled & BIT_ULL(NL80211_STA_INFO_RX_BITRATE)) { 7941 if (!nl80211_put_sta_rate(msg, &link_sinfo->rxrate, 7942 NL80211_STA_INFO_RX_BITRATE)) 7943 goto nla_put_failure; 7944 } 7945 7946 PUT_LINK_SINFO(RX_PACKETS, rx_packets, u32); 7947 PUT_LINK_SINFO(TX_PACKETS, tx_packets, u32); 7948 PUT_LINK_SINFO(TX_RETRIES, tx_retries, u32); 7949 PUT_LINK_SINFO(TX_FAILED, tx_failed, u32); 7950 PUT_LINK_SINFO(EXPECTED_THROUGHPUT, expected_throughput, u32); 7951 PUT_LINK_SINFO(BEACON_LOSS, beacon_loss_count, u32); 7952 7953 if (link_sinfo->filled & BIT_ULL(NL80211_STA_INFO_BSS_PARAM)) { 7954 bss_param = nla_nest_start(msg, 7955 NL80211_STA_INFO_BSS_PARAM); 7956 if (!bss_param) 7957 goto nla_put_failure; 7958 7959 if (((link_sinfo->bss_param.flags & 7960 BSS_PARAM_FLAGS_CTS_PROT) && 7961 nla_put_flag(msg, NL80211_STA_BSS_PARAM_CTS_PROT)) || 7962 ((link_sinfo->bss_param.flags & 7963 BSS_PARAM_FLAGS_SHORT_PREAMBLE) && 7964 nla_put_flag(msg, 7965 NL80211_STA_BSS_PARAM_SHORT_PREAMBLE)) || 7966 ((link_sinfo->bss_param.flags & 7967 BSS_PARAM_FLAGS_SHORT_SLOT_TIME) && 7968 nla_put_flag(msg, 7969 NL80211_STA_BSS_PARAM_SHORT_SLOT_TIME)) || 7970 nla_put_u8(msg, NL80211_STA_BSS_PARAM_DTIM_PERIOD, 7971 link_sinfo->bss_param.dtim_period) || 7972 nla_put_u16(msg, NL80211_STA_BSS_PARAM_BEACON_INTERVAL, 7973 link_sinfo->bss_param.beacon_interval)) 7974 goto nla_put_failure; 7975 7976 nla_nest_end(msg, bss_param); 7977 } 7978 7979 PUT_LINK_SINFO_U64(RX_DROP_MISC, rx_dropped_misc); 7980 PUT_LINK_SINFO_U64(BEACON_RX, rx_beacon); 7981 PUT_LINK_SINFO(BEACON_SIGNAL_AVG, rx_beacon_signal_avg, u8); 7982 PUT_LINK_SINFO(RX_MPDUS, rx_mpdu_count, u32); 7983 PUT_LINK_SINFO(FCS_ERROR_COUNT, fcs_err_count, u32); 7984 if (wiphy_ext_feature_isset(&rdev->wiphy, 7985 NL80211_EXT_FEATURE_ACK_SIGNAL_SUPPORT)) { 7986 PUT_LINK_SINFO(ACK_SIGNAL, ack_signal, u8); 7987 PUT_LINK_SINFO(ACK_SIGNAL_AVG, avg_ack_signal, s8); 7988 } 7989 7990 #undef PUT_LINK_SINFO 7991 #undef PUT_LINK_SINFO_U64 7992 7993 if (link_sinfo->pertid) { 7994 struct nlattr *tidsattr; 7995 int tid; 7996 7997 tidsattr = nla_nest_start(msg, NL80211_STA_INFO_TID_STATS); 7998 if (!tidsattr) 7999 goto nla_put_failure; 8000 8001 for (tid = 0; tid < IEEE80211_NUM_TIDS + 1; tid++) { 8002 struct cfg80211_tid_stats *tidstats; 8003 struct nlattr *tidattr; 8004 8005 tidstats = &link_sinfo->pertid[tid]; 8006 8007 if (!tidstats->filled) 8008 continue; 8009 8010 tidattr = nla_nest_start(msg, tid + 1); 8011 if (!tidattr) 8012 goto nla_put_failure; 8013 8014 #define PUT_TIDVAL_U64(attr, memb) do { \ 8015 if (tidstats->filled & BIT(NL80211_TID_STATS_ ## attr) && \ 8016 nla_put_u64_64bit(msg, NL80211_TID_STATS_ ## attr, \ 8017 tidstats->memb, NL80211_TID_STATS_PAD)) \ 8018 goto nla_put_failure; \ 8019 } while (0) 8020 8021 PUT_TIDVAL_U64(RX_MSDU, rx_msdu); 8022 PUT_TIDVAL_U64(TX_MSDU, tx_msdu); 8023 PUT_TIDVAL_U64(TX_MSDU_RETRIES, tx_msdu_retries); 8024 PUT_TIDVAL_U64(TX_MSDU_FAILED, tx_msdu_failed); 8025 8026 #undef PUT_TIDVAL_U64 8027 if ((tidstats->filled & 8028 BIT(NL80211_TID_STATS_TXQ_STATS)) && 8029 !nl80211_put_txq_stats(msg, &tidstats->txq_stats, 8030 NL80211_TID_STATS_TXQ_STATS)) 8031 goto nla_put_failure; 8032 8033 nla_nest_end(msg, tidattr); 8034 } 8035 8036 nla_nest_end(msg, tidsattr); 8037 } 8038 8039 nla_nest_end(msg, link_sinfoattr); 8040 return 0; 8041 8042 nla_put_failure: 8043 return -EMSGSIZE; 8044 } 8045 8046 static int nl80211_put_sta_info_common(struct sk_buff *msg, 8047 struct cfg80211_registered_device *rdev, 8048 struct station_info *sinfo) 8049 { 8050 struct nlattr *sinfoattr, *bss_param; 8051 8052 sinfoattr = nla_nest_start(msg, NL80211_ATTR_STA_INFO); 8053 if (!sinfoattr) 8054 return -EMSGSIZE; 8055 8056 #define PUT_SINFO(attr, memb, type) do { \ 8057 BUILD_BUG_ON(sizeof(type) == sizeof(u64)); \ 8058 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_ ## attr) && \ 8059 nla_put_ ## type(msg, NL80211_STA_INFO_ ## attr, \ 8060 sinfo->memb)) \ 8061 goto nla_put_failure; \ 8062 } while (0) 8063 #define PUT_SINFO_U64(attr, memb) do { \ 8064 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_ ## attr) && \ 8065 nla_put_u64_64bit(msg, NL80211_STA_INFO_ ## attr, \ 8066 sinfo->memb, NL80211_STA_INFO_PAD)) \ 8067 goto nla_put_failure; \ 8068 } while (0) 8069 8070 PUT_SINFO(CONNECTED_TIME, connected_time, u32); 8071 PUT_SINFO(INACTIVE_TIME, inactive_time, u32); 8072 PUT_SINFO_U64(ASSOC_AT_BOOTTIME, assoc_at); 8073 8074 if (sinfo->filled & (BIT_ULL(NL80211_STA_INFO_RX_BYTES) | 8075 BIT_ULL(NL80211_STA_INFO_RX_BYTES64)) && 8076 nla_put_u32(msg, NL80211_STA_INFO_RX_BYTES, 8077 (u32)sinfo->rx_bytes)) 8078 goto nla_put_failure; 8079 8080 if (sinfo->filled & (BIT_ULL(NL80211_STA_INFO_TX_BYTES) | 8081 BIT_ULL(NL80211_STA_INFO_TX_BYTES64)) && 8082 nla_put_u32(msg, NL80211_STA_INFO_TX_BYTES, 8083 (u32)sinfo->tx_bytes)) 8084 goto nla_put_failure; 8085 8086 PUT_SINFO_U64(RX_BYTES64, rx_bytes); 8087 PUT_SINFO_U64(TX_BYTES64, tx_bytes); 8088 PUT_SINFO_U64(RX_DURATION, rx_duration); 8089 PUT_SINFO_U64(TX_DURATION, tx_duration); 8090 8091 if (wiphy_ext_feature_isset(&rdev->wiphy, 8092 NL80211_EXT_FEATURE_AIRTIME_FAIRNESS)) 8093 PUT_SINFO(AIRTIME_WEIGHT, airtime_weight, u16); 8094 8095 switch (rdev->wiphy.signal_type) { 8096 case CFG80211_SIGNAL_TYPE_MBM: 8097 PUT_SINFO(SIGNAL, signal, u8); 8098 PUT_SINFO(SIGNAL_AVG, signal_avg, u8); 8099 break; 8100 default: 8101 break; 8102 } 8103 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL)) { 8104 if (!nl80211_put_signal(msg, sinfo->chains, 8105 sinfo->chain_signal, 8106 NL80211_STA_INFO_CHAIN_SIGNAL)) 8107 goto nla_put_failure; 8108 } 8109 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL_AVG)) { 8110 if (!nl80211_put_signal(msg, sinfo->chains, 8111 sinfo->chain_signal_avg, 8112 NL80211_STA_INFO_CHAIN_SIGNAL_AVG)) 8113 goto nla_put_failure; 8114 } 8115 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_TX_BITRATE)) { 8116 if (!nl80211_put_sta_rate(msg, &sinfo->txrate, 8117 NL80211_STA_INFO_TX_BITRATE)) 8118 goto nla_put_failure; 8119 } 8120 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_RX_BITRATE)) { 8121 if (!nl80211_put_sta_rate(msg, &sinfo->rxrate, 8122 NL80211_STA_INFO_RX_BITRATE)) 8123 goto nla_put_failure; 8124 } 8125 8126 PUT_SINFO(RX_PACKETS, rx_packets, u32); 8127 PUT_SINFO(TX_PACKETS, tx_packets, u32); 8128 PUT_SINFO(TX_RETRIES, tx_retries, u32); 8129 PUT_SINFO(TX_FAILED, tx_failed, u32); 8130 PUT_SINFO(EXPECTED_THROUGHPUT, expected_throughput, u32); 8131 PUT_SINFO(BEACON_LOSS, beacon_loss_count, u32); 8132 8133 PUT_SINFO(LLID, llid, u16); 8134 PUT_SINFO(PLID, plid, u16); 8135 PUT_SINFO(PLINK_STATE, plink_state, u8); 8136 PUT_SINFO(AIRTIME_LINK_METRIC, airtime_link_metric, u32); 8137 PUT_SINFO(LOCAL_PM, local_pm, u32); 8138 PUT_SINFO(PEER_PM, peer_pm, u32); 8139 PUT_SINFO(NONPEER_PM, nonpeer_pm, u32); 8140 PUT_SINFO(CONNECTED_TO_GATE, connected_to_gate, u8); 8141 PUT_SINFO(CONNECTED_TO_AS, connected_to_as, u8); 8142 PUT_SINFO_U64(T_OFFSET, t_offset); 8143 8144 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_BSS_PARAM)) { 8145 bss_param = nla_nest_start(msg, NL80211_STA_INFO_BSS_PARAM); 8146 if (!bss_param) 8147 goto nla_put_failure; 8148 8149 if (((sinfo->bss_param.flags & BSS_PARAM_FLAGS_CTS_PROT) && 8150 nla_put_flag(msg, NL80211_STA_BSS_PARAM_CTS_PROT)) || 8151 ((sinfo->bss_param.flags & BSS_PARAM_FLAGS_SHORT_PREAMBLE) && 8152 nla_put_flag(msg, NL80211_STA_BSS_PARAM_SHORT_PREAMBLE)) || 8153 ((sinfo->bss_param.flags & BSS_PARAM_FLAGS_SHORT_SLOT_TIME) && 8154 nla_put_flag(msg, NL80211_STA_BSS_PARAM_SHORT_SLOT_TIME)) || 8155 nla_put_u8(msg, NL80211_STA_BSS_PARAM_DTIM_PERIOD, 8156 sinfo->bss_param.dtim_period) || 8157 nla_put_u16(msg, NL80211_STA_BSS_PARAM_BEACON_INTERVAL, 8158 sinfo->bss_param.beacon_interval)) 8159 goto nla_put_failure; 8160 8161 nla_nest_end(msg, bss_param); 8162 } 8163 if ((sinfo->filled & BIT_ULL(NL80211_STA_INFO_STA_FLAGS)) && 8164 nla_put(msg, NL80211_STA_INFO_STA_FLAGS, 8165 sizeof(struct nl80211_sta_flag_update), 8166 &sinfo->sta_flags)) 8167 goto nla_put_failure; 8168 8169 PUT_SINFO_U64(RX_DROP_MISC, rx_dropped_misc); 8170 PUT_SINFO_U64(BEACON_RX, rx_beacon); 8171 PUT_SINFO(BEACON_SIGNAL_AVG, rx_beacon_signal_avg, u8); 8172 PUT_SINFO(RX_MPDUS, rx_mpdu_count, u32); 8173 PUT_SINFO(FCS_ERROR_COUNT, fcs_err_count, u32); 8174 if (wiphy_ext_feature_isset(&rdev->wiphy, 8175 NL80211_EXT_FEATURE_ACK_SIGNAL_SUPPORT)) { 8176 PUT_SINFO(ACK_SIGNAL, ack_signal, u8); 8177 PUT_SINFO(ACK_SIGNAL_AVG, avg_ack_signal, s8); 8178 } 8179 8180 #undef PUT_SINFO 8181 #undef PUT_SINFO_U64 8182 8183 if (sinfo->pertid) { 8184 struct nlattr *tidsattr; 8185 int tid; 8186 8187 tidsattr = nla_nest_start(msg, NL80211_STA_INFO_TID_STATS); 8188 if (!tidsattr) 8189 goto nla_put_failure; 8190 8191 for (tid = 0; tid < IEEE80211_NUM_TIDS + 1; tid++) { 8192 struct cfg80211_tid_stats *tidstats; 8193 struct nlattr *tidattr; 8194 8195 tidstats = &sinfo->pertid[tid]; 8196 8197 if (!tidstats->filled) 8198 continue; 8199 8200 tidattr = nla_nest_start(msg, tid + 1); 8201 if (!tidattr) 8202 goto nla_put_failure; 8203 8204 #define PUT_TIDVAL_U64(attr, memb) do { \ 8205 if (tidstats->filled & BIT(NL80211_TID_STATS_ ## attr) && \ 8206 nla_put_u64_64bit(msg, NL80211_TID_STATS_ ## attr, \ 8207 tidstats->memb, NL80211_TID_STATS_PAD)) \ 8208 goto nla_put_failure; \ 8209 } while (0) 8210 8211 PUT_TIDVAL_U64(RX_MSDU, rx_msdu); 8212 PUT_TIDVAL_U64(TX_MSDU, tx_msdu); 8213 PUT_TIDVAL_U64(TX_MSDU_RETRIES, tx_msdu_retries); 8214 PUT_TIDVAL_U64(TX_MSDU_FAILED, tx_msdu_failed); 8215 8216 #undef PUT_TIDVAL_U64 8217 if ((tidstats->filled & 8218 BIT(NL80211_TID_STATS_TXQ_STATS)) && 8219 !nl80211_put_txq_stats(msg, &tidstats->txq_stats, 8220 NL80211_TID_STATS_TXQ_STATS)) 8221 goto nla_put_failure; 8222 8223 nla_nest_end(msg, tidattr); 8224 } 8225 8226 nla_nest_end(msg, tidsattr); 8227 } 8228 8229 nla_nest_end(msg, sinfoattr); 8230 return 0; 8231 8232 nla_put_failure: 8233 nla_nest_cancel(msg, sinfoattr); 8234 return -EMSGSIZE; 8235 } 8236 8237 static int nl80211_send_station(struct sk_buff *msg, u32 cmd, u32 portid, 8238 u32 seq, int flags, 8239 struct cfg80211_registered_device *rdev, 8240 struct wireless_dev *wdev, 8241 const u8 *mac_addr, struct station_info *sinfo) 8242 { 8243 void *hdr; 8244 8245 hdr = nl80211hdr_put(msg, portid, seq, flags, cmd); 8246 if (!hdr) { 8247 cfg80211_sinfo_release_content(sinfo); 8248 return -1; 8249 } 8250 8251 if ((wdev->netdev && 8252 nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex)) || 8253 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 8254 NL80211_ATTR_PAD) || 8255 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr) || 8256 nla_put_u32(msg, NL80211_ATTR_GENERATION, sinfo->generation)) 8257 goto nla_put_failure; 8258 8259 if (nl80211_put_sta_info_common(msg, rdev, sinfo)) 8260 goto nla_put_failure; 8261 8262 if (sinfo->assoc_req_ies_len && 8263 nla_put(msg, NL80211_ATTR_IE, sinfo->assoc_req_ies_len, 8264 sinfo->assoc_req_ies)) 8265 goto nla_put_failure; 8266 8267 if (sinfo->assoc_resp_ies_len && 8268 nla_put(msg, NL80211_ATTR_RESP_IE, sinfo->assoc_resp_ies_len, 8269 sinfo->assoc_resp_ies)) 8270 goto nla_put_failure; 8271 8272 if (sinfo->mlo_params_valid) { 8273 if (nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, 8274 sinfo->assoc_link_id)) 8275 goto nla_put_failure; 8276 8277 if (!is_zero_ether_addr(sinfo->mld_addr) && 8278 nla_put(msg, NL80211_ATTR_MLD_ADDR, ETH_ALEN, 8279 sinfo->mld_addr)) 8280 goto nla_put_failure; 8281 } 8282 8283 cfg80211_sinfo_release_content(sinfo); 8284 genlmsg_end(msg, hdr); 8285 return 0; 8286 8287 nla_put_failure: 8288 cfg80211_sinfo_release_content(sinfo); 8289 genlmsg_cancel(msg, hdr); 8290 return -EMSGSIZE; 8291 } 8292 8293 static void cfg80211_sta_set_mld_sinfo(struct station_info *sinfo) 8294 { 8295 struct link_station_info *link_sinfo; 8296 int link_id, init = 0; 8297 u32 link_inactive_time; 8298 8299 sinfo->signal = -99; 8300 8301 for_each_valid_link(sinfo, link_id) { 8302 link_sinfo = sinfo->links[link_id]; 8303 if (!link_sinfo) 8304 continue; 8305 8306 if ((link_sinfo->filled & 8307 BIT_ULL(NL80211_STA_INFO_TX_PACKETS))) { 8308 sinfo->tx_packets += link_sinfo->tx_packets; 8309 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_PACKETS); 8310 } 8311 8312 if ((link_sinfo->filled & 8313 BIT_ULL(NL80211_STA_INFO_RX_PACKETS))) { 8314 sinfo->rx_packets += link_sinfo->rx_packets; 8315 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_PACKETS); 8316 } 8317 8318 if (link_sinfo->filled & 8319 (BIT_ULL(NL80211_STA_INFO_TX_BYTES) | 8320 BIT_ULL(NL80211_STA_INFO_TX_BYTES64))) { 8321 sinfo->tx_bytes += link_sinfo->tx_bytes; 8322 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BYTES); 8323 } 8324 8325 if (link_sinfo->filled & 8326 (BIT_ULL(NL80211_STA_INFO_RX_BYTES) | 8327 BIT_ULL(NL80211_STA_INFO_TX_BYTES64))) { 8328 sinfo->rx_bytes += link_sinfo->rx_bytes; 8329 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_BYTES); 8330 } 8331 8332 if (link_sinfo->filled & 8333 BIT_ULL(NL80211_STA_INFO_TX_RETRIES)) { 8334 sinfo->tx_retries += link_sinfo->tx_retries; 8335 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_RETRIES); 8336 } 8337 8338 if (link_sinfo->filled & BIT_ULL(NL80211_STA_INFO_TX_FAILED)) { 8339 sinfo->tx_failed += link_sinfo->tx_failed; 8340 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_FAILED); 8341 } 8342 8343 if (link_sinfo->filled & 8344 BIT_ULL(NL80211_STA_INFO_RX_DROP_MISC)) { 8345 sinfo->rx_dropped_misc += link_sinfo->rx_dropped_misc; 8346 sinfo->filled |= 8347 BIT_ULL(NL80211_STA_INFO_RX_DROP_MISC); 8348 } 8349 8350 if (link_sinfo->filled & 8351 BIT_ULL(NL80211_STA_INFO_BEACON_LOSS)) { 8352 sinfo->beacon_loss_count += 8353 link_sinfo->beacon_loss_count; 8354 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_BEACON_LOSS); 8355 } 8356 8357 if (link_sinfo->filled & 8358 BIT_ULL(NL80211_STA_INFO_EXPECTED_THROUGHPUT)) { 8359 sinfo->expected_throughput += 8360 link_sinfo->expected_throughput; 8361 sinfo->filled |= 8362 BIT_ULL(NL80211_STA_INFO_EXPECTED_THROUGHPUT); 8363 } 8364 8365 if (link_sinfo->filled & BIT_ULL(NL80211_STA_INFO_RX_MPDUS)) { 8366 sinfo->rx_mpdu_count += link_sinfo->rx_mpdu_count; 8367 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_MPDUS); 8368 } 8369 8370 if (link_sinfo->filled & 8371 BIT_ULL(NL80211_STA_INFO_FCS_ERROR_COUNT)) { 8372 sinfo->fcs_err_count += link_sinfo->fcs_err_count; 8373 sinfo->filled |= 8374 BIT_ULL(NL80211_STA_INFO_FCS_ERROR_COUNT); 8375 } 8376 8377 if (link_sinfo->filled & 8378 BIT_ULL(NL80211_STA_INFO_BEACON_RX)) { 8379 sinfo->rx_beacon += link_sinfo->rx_beacon; 8380 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_BEACON_RX); 8381 } 8382 8383 /* Update MLO signal, signal_avg as best among links */ 8384 if ((link_sinfo->filled & BIT_ULL(NL80211_STA_INFO_SIGNAL)) && 8385 link_sinfo->signal > sinfo->signal) { 8386 sinfo->signal = link_sinfo->signal; 8387 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL); 8388 } 8389 8390 if ((link_sinfo->filled & 8391 BIT_ULL(NL80211_STA_INFO_SIGNAL_AVG)) && 8392 link_sinfo->signal_avg > sinfo->signal_avg) { 8393 sinfo->signal_avg = link_sinfo->signal_avg; 8394 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL_AVG); 8395 } 8396 8397 /* Update MLO inactive_time, bss_param based on least 8398 * value for corresponding field of link. 8399 */ 8400 if ((link_sinfo->filled & 8401 BIT_ULL(NL80211_STA_INFO_INACTIVE_TIME)) && 8402 (!init || 8403 link_inactive_time > link_sinfo->inactive_time)) { 8404 link_inactive_time = link_sinfo->inactive_time; 8405 sinfo->inactive_time = link_sinfo->inactive_time; 8406 sinfo->filled |= NL80211_STA_INFO_INACTIVE_TIME; 8407 } 8408 8409 if (link_sinfo->filled & BIT_ULL(NL80211_STA_INFO_BSS_PARAM) && 8410 (!init || 8411 sinfo->bss_param.dtim_period > 8412 link_sinfo->bss_param.dtim_period)) { 8413 sinfo->bss_param.dtim_period = 8414 link_sinfo->bss_param.dtim_period; 8415 sinfo->filled |= NL80211_STA_BSS_PARAM_DTIM_PERIOD; 8416 sinfo->bss_param.beacon_interval = 8417 link_sinfo->bss_param.beacon_interval; 8418 sinfo->filled |= NL80211_STA_BSS_PARAM_BEACON_INTERVAL; 8419 } 8420 8421 /* Update MLO rates as per last updated link rate */ 8422 if ((link_sinfo->filled & 8423 BIT_ULL(NL80211_STA_INFO_TX_BITRATE)) && 8424 (!init || 8425 link_inactive_time > link_sinfo->inactive_time)) { 8426 sinfo->txrate = link_sinfo->txrate; 8427 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE); 8428 } 8429 if ((link_sinfo->filled & 8430 BIT_ULL(NL80211_STA_INFO_RX_BITRATE)) && 8431 (!init || 8432 link_inactive_time > link_sinfo->inactive_time)) { 8433 sinfo->rxrate = link_sinfo->rxrate; 8434 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_BITRATE); 8435 } 8436 8437 if (link_sinfo->filled & 8438 BIT_ULL(NL80211_STA_INFO_TX_DURATION) && 8439 (!init || 8440 link_inactive_time > link_sinfo->inactive_time)) { 8441 sinfo->tx_duration += link_sinfo->tx_duration; 8442 sinfo->filled |= 8443 BIT_ULL(NL80211_STA_INFO_TX_DURATION); 8444 } 8445 if (link_sinfo->filled & 8446 BIT_ULL(NL80211_STA_INFO_RX_DURATION) && 8447 (!init || 8448 link_inactive_time > link_sinfo->inactive_time)) { 8449 sinfo->rx_duration += link_sinfo->rx_duration; 8450 sinfo->filled |= 8451 BIT_ULL(NL80211_STA_INFO_RX_DURATION); 8452 } 8453 init++; 8454 8455 /* pertid stats accumulate for rx/tx fields */ 8456 if (sinfo->pertid) { 8457 sinfo->pertid->rx_msdu += 8458 link_sinfo->pertid->rx_msdu; 8459 sinfo->pertid->tx_msdu += 8460 link_sinfo->pertid->tx_msdu; 8461 sinfo->pertid->tx_msdu_retries += 8462 link_sinfo->pertid->tx_msdu_retries; 8463 sinfo->pertid->tx_msdu_failed += 8464 link_sinfo->pertid->tx_msdu_failed; 8465 8466 sinfo->pertid->filled |= 8467 BIT(NL80211_TID_STATS_RX_MSDU) | 8468 BIT(NL80211_TID_STATS_TX_MSDU) | 8469 BIT(NL80211_TID_STATS_TX_MSDU_RETRIES) | 8470 BIT(NL80211_TID_STATS_TX_MSDU_FAILED); 8471 } 8472 } 8473 8474 /* Reset sinfo->filled bits to exclude fields which don't make 8475 * much sense at the MLO level. 8476 */ 8477 sinfo->filled &= ~BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL); 8478 sinfo->filled &= ~BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL_AVG); 8479 } 8480 8481 enum nl80211_dump_station_phase { 8482 NL80211_DUMP_STA_PHASE_AGGREGATED = 0, 8483 NL80211_DUMP_STA_PHASE_PER_LINK = 1, 8484 }; 8485 8486 struct nl80211_dump_station_ctx { 8487 int sta_idx; 8488 int link_idx; 8489 enum nl80211_dump_station_phase phase; 8490 bool dump_link_stats; 8491 bool filter_mac; 8492 u8 filter_mac_addr[ETH_ALEN]; 8493 u8 mac_addr[ETH_ALEN]; 8494 struct station_info sinfo; 8495 }; 8496 8497 static int nl80211_put_link_station_payload(struct sk_buff *msg, 8498 struct cfg80211_registered_device *rdev, 8499 struct station_info *sinfo, 8500 int link_idx) 8501 { 8502 struct link_station_info *link_sinfo = sinfo->links[link_idx]; 8503 struct nlattr *links, *link; 8504 8505 if (WARN_ON_ONCE(!link_sinfo)) 8506 return -ENOENT; 8507 8508 if (!is_valid_ether_addr(link_sinfo->addr)) 8509 return -EADDRNOTAVAIL; 8510 8511 links = nla_nest_start(msg, NL80211_ATTR_MLO_LINKS); 8512 if (!links) 8513 return -EMSGSIZE; 8514 8515 link = nla_nest_start(msg, link_idx + 1); 8516 if (!link) 8517 goto nla_put_failure; 8518 8519 if (nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link_idx) || 8520 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, link_sinfo->addr)) 8521 goto nla_put_failure; 8522 8523 if (nl80211_fill_link_station(msg, rdev, link_sinfo)) 8524 goto nla_put_failure; 8525 8526 nla_nest_end(msg, link); 8527 nla_nest_end(msg, links); 8528 return 0; 8529 8530 nla_put_failure: 8531 nla_nest_cancel(msg, links); 8532 return -EMSGSIZE; 8533 } 8534 8535 static int nl80211_dump_station(struct sk_buff *skb, 8536 struct netlink_callback *cb) 8537 { 8538 struct cfg80211_registered_device *rdev; 8539 struct wireless_dev *wdev; 8540 struct nl80211_dump_station_ctx *ctx = (void *)cb->args[2]; 8541 struct nlattr **attrbuf __free(kfree) = NULL; 8542 int err; 8543 8544 if (!ctx) { 8545 attrbuf = kzalloc_objs(*attrbuf, NUM_NL80211_ATTR); 8546 if (!attrbuf) 8547 return -ENOMEM; 8548 } 8549 8550 err = nl80211_prepare_wdev_dump(cb, &rdev, &wdev, attrbuf); 8551 if (err) 8552 return err; 8553 /* nl80211_prepare_wdev_dump acquired it in the successful case */ 8554 __acquire(&rdev->wiphy.mtx); 8555 8556 if (!ctx) { 8557 ctx = kzalloc_obj(*ctx); 8558 if (!ctx) { 8559 err = -ENOMEM; 8560 goto out_err; 8561 } 8562 cb->args[2] = (long)ctx; 8563 ctx->phase = NL80211_DUMP_STA_PHASE_AGGREGATED; 8564 ctx->dump_link_stats = 8565 !!attrbuf[NL80211_ATTR_STA_DUMP_LINK_STATS]; 8566 if (attrbuf[NL80211_ATTR_MAC]) { 8567 const u8 *mac = nla_data(attrbuf[NL80211_ATTR_MAC]); 8568 8569 if (!is_valid_ether_addr(mac)) { 8570 kfree(ctx); 8571 cb->args[2] = 0; 8572 err = -EINVAL; 8573 goto out_err; 8574 } 8575 ctx->filter_mac = true; 8576 memcpy(ctx->filter_mac_addr, mac, ETH_ALEN); 8577 } 8578 } 8579 8580 if (!wdev->netdev && wdev->iftype != NL80211_IFTYPE_NAN) { 8581 err = -EINVAL; 8582 goto out_err; 8583 } 8584 8585 if (ctx->filter_mac) { 8586 if (!rdev->ops->get_station) { 8587 err = -EOPNOTSUPP; 8588 goto out_err; 8589 } 8590 } else if (!rdev->ops->dump_station) { 8591 err = -EOPNOTSUPP; 8592 goto out_err; 8593 } 8594 8595 while (true) { 8596 void *hdr; 8597 int ret; 8598 8599 /* AGGREGATED phase: fetch sinfo from driver once per station */ 8600 if (ctx->phase == NL80211_DUMP_STA_PHASE_AGGREGATED) { 8601 memset(&ctx->sinfo, 0, sizeof(ctx->sinfo)); 8602 for (int i = 0; i < IEEE80211_MLD_MAX_NUM_LINKS; i++) { 8603 ctx->sinfo.links[i] = 8604 kzalloc_obj(*ctx->sinfo.links[0]); 8605 if (!ctx->sinfo.links[i]) { 8606 err = -ENOMEM; 8607 goto out_err_release; 8608 } 8609 } 8610 8611 if (ctx->filter_mac) { 8612 if (ctx->sta_idx > 0) { 8613 err = skb->len; 8614 goto out_err_release; 8615 } 8616 err = rdev_get_station(rdev, wdev, 8617 ctx->filter_mac_addr, 8618 &ctx->sinfo); 8619 if (!err) 8620 memcpy(ctx->mac_addr, 8621 ctx->filter_mac_addr, ETH_ALEN); 8622 } else { 8623 err = rdev_dump_station(rdev, wdev, ctx->sta_idx, 8624 ctx->mac_addr, 8625 &ctx->sinfo); 8626 } 8627 if (err == -ENOENT) { 8628 err = skb->len; 8629 goto out_err_release; 8630 } 8631 if (err) 8632 goto out_err_release; 8633 8634 if (ctx->sinfo.valid_links) 8635 cfg80211_sta_set_mld_sinfo(&ctx->sinfo); 8636 } else { 8637 /* PER_LINK phase: advance to next valid link */ 8638 while (ctx->link_idx < IEEE80211_MLD_MAX_NUM_LINKS && 8639 !(ctx->sinfo.valid_links & BIT(ctx->link_idx))) 8640 ctx->link_idx++; 8641 8642 if (ctx->link_idx >= IEEE80211_MLD_MAX_NUM_LINKS) { 8643 cfg80211_sinfo_release_content(&ctx->sinfo); 8644 ctx->sta_idx++; 8645 ctx->phase = NL80211_DUMP_STA_PHASE_AGGREGATED; 8646 continue; 8647 } 8648 } 8649 8650 /* Build common header for both phases */ 8651 hdr = nl80211hdr_put(skb, NETLINK_CB(cb->skb).portid, 8652 cb->nlh->nlmsg_seq, NLM_F_MULTI, 8653 NL80211_CMD_NEW_STATION); 8654 if (!hdr) { 8655 err = skb->len; 8656 if (ctx->phase == NL80211_DUMP_STA_PHASE_PER_LINK) 8657 goto out_err; 8658 goto out_err_release; 8659 } 8660 8661 if ((wdev->netdev && 8662 nla_put_u32(skb, NL80211_ATTR_IFINDEX, 8663 wdev->netdev->ifindex)) || 8664 nla_put_u64_64bit(skb, NL80211_ATTR_WDEV, 8665 wdev_id(wdev), NL80211_ATTR_PAD) || 8666 nla_put(skb, NL80211_ATTR_MAC, ETH_ALEN, ctx->mac_addr) || 8667 nla_put_u32(skb, NL80211_ATTR_GENERATION, 8668 ctx->sinfo.generation)) { 8669 genlmsg_cancel(skb, hdr); 8670 err = skb->len; 8671 if (ctx->phase == NL80211_DUMP_STA_PHASE_PER_LINK) 8672 goto out_err; 8673 goto out_err_release; 8674 } 8675 8676 switch (ctx->phase) { 8677 case NL80211_DUMP_STA_PHASE_AGGREGATED: 8678 ret = nl80211_put_sta_info_common(skb, rdev, &ctx->sinfo); 8679 if (ret) { 8680 genlmsg_cancel(skb, hdr); 8681 err = ret; 8682 goto out_err_release; 8683 } 8684 genlmsg_end(skb, hdr); 8685 8686 if (ctx->dump_link_stats && ctx->sinfo.valid_links) { 8687 ctx->phase = NL80211_DUMP_STA_PHASE_PER_LINK; 8688 ctx->link_idx = 0; 8689 } else { 8690 cfg80211_sinfo_release_content(&ctx->sinfo); 8691 ctx->sta_idx++; 8692 } 8693 break; 8694 8695 case NL80211_DUMP_STA_PHASE_PER_LINK: 8696 ret = nl80211_put_link_station_payload(skb, rdev, 8697 &ctx->sinfo, 8698 ctx->link_idx); 8699 if (ret == -EMSGSIZE) { 8700 genlmsg_cancel(skb, hdr); 8701 err = skb->len; 8702 goto out_err; 8703 } 8704 if (ret) { 8705 /* skip invalid link, do not abort the dump */ 8706 genlmsg_cancel(skb, hdr); 8707 ctx->link_idx++; 8708 continue; 8709 } 8710 genlmsg_end(skb, hdr); 8711 ctx->link_idx++; 8712 break; 8713 } 8714 } 8715 8716 out_err_release: 8717 cfg80211_sinfo_release_content(&ctx->sinfo); 8718 memset(&ctx->sinfo, 0, sizeof(ctx->sinfo)); 8719 out_err: 8720 wiphy_unlock(&rdev->wiphy); 8721 8722 return err; 8723 } 8724 8725 static int nl80211_dump_station_done(struct netlink_callback *cb) 8726 { 8727 struct nl80211_dump_station_ctx *ctx = (void *)cb->args[2]; 8728 8729 if (ctx) { 8730 cfg80211_sinfo_release_content(&ctx->sinfo); 8731 kfree(ctx); 8732 } 8733 return 0; 8734 } 8735 8736 static int nl80211_get_station(struct sk_buff *skb, struct genl_info *info) 8737 { 8738 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 8739 struct wireless_dev *wdev = info->user_ptr[1]; 8740 struct station_info sinfo; 8741 struct sk_buff *msg; 8742 u8 *mac_addr = NULL; 8743 int err, i; 8744 8745 memset(&sinfo, 0, sizeof(sinfo)); 8746 8747 if (!wdev->netdev) 8748 return -EINVAL; 8749 8750 if (!info->attrs[NL80211_ATTR_MAC]) 8751 return -EINVAL; 8752 8753 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 8754 8755 if (!rdev->ops->get_station) 8756 return -EOPNOTSUPP; 8757 8758 for (i = 0; i < IEEE80211_MLD_MAX_NUM_LINKS; i++) { 8759 sinfo.links[i] = kzalloc_obj(*sinfo.links[0]); 8760 if (!sinfo.links[i]) { 8761 cfg80211_sinfo_release_content(&sinfo); 8762 return -ENOMEM; 8763 } 8764 } 8765 8766 err = rdev_get_station(rdev, wdev, mac_addr, &sinfo); 8767 if (err) { 8768 cfg80211_sinfo_release_content(&sinfo); 8769 return err; 8770 } 8771 8772 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 8773 if (!msg) { 8774 cfg80211_sinfo_release_content(&sinfo); 8775 return -ENOMEM; 8776 } 8777 8778 if (sinfo.valid_links) 8779 cfg80211_sta_set_mld_sinfo(&sinfo); 8780 8781 if (nl80211_send_station(msg, NL80211_CMD_NEW_STATION, 8782 info->snd_portid, info->snd_seq, 0, 8783 rdev, wdev, mac_addr, &sinfo) < 0) { 8784 nlmsg_free(msg); 8785 return -ENOBUFS; 8786 } 8787 8788 return genlmsg_reply(msg, info); 8789 } 8790 8791 int cfg80211_check_station_change(struct wiphy *wiphy, 8792 struct station_parameters *params, 8793 enum cfg80211_station_type statype) 8794 { 8795 if (params->listen_interval != -1 && 8796 statype != CFG80211_STA_AP_CLIENT_UNASSOC) 8797 return -EINVAL; 8798 8799 if (params->support_p2p_ps != -1 && 8800 statype != CFG80211_STA_AP_CLIENT_UNASSOC) 8801 return -EINVAL; 8802 8803 if (params->aid && 8804 !(params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) && 8805 statype != CFG80211_STA_AP_CLIENT_UNASSOC) 8806 return -EINVAL; 8807 8808 /* When you run into this, adjust the code below for the new flag */ 8809 BUILD_BUG_ON(NL80211_STA_FLAG_MAX != 8); 8810 8811 switch (statype) { 8812 case CFG80211_STA_MESH_PEER_KERNEL: 8813 case CFG80211_STA_MESH_PEER_USER: 8814 /* 8815 * No ignoring the TDLS flag here -- the userspace mesh 8816 * code doesn't have the bug of including TDLS in the 8817 * mask everywhere. 8818 */ 8819 if (params->sta_flags_mask & 8820 ~(BIT(NL80211_STA_FLAG_AUTHENTICATED) | 8821 BIT(NL80211_STA_FLAG_MFP) | 8822 BIT(NL80211_STA_FLAG_AUTHORIZED))) 8823 return -EINVAL; 8824 break; 8825 case CFG80211_STA_TDLS_PEER_SETUP: 8826 case CFG80211_STA_TDLS_PEER_ACTIVE: 8827 if (!(params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER))) 8828 return -EINVAL; 8829 /* ignore since it can't change */ 8830 params->sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER); 8831 break; 8832 default: 8833 /* disallow mesh-specific things */ 8834 if (params->plink_action != NL80211_PLINK_ACTION_NO_ACTION) 8835 return -EINVAL; 8836 if (params->local_pm) 8837 return -EINVAL; 8838 if (params->sta_modify_mask & STATION_PARAM_APPLY_PLINK_STATE) 8839 return -EINVAL; 8840 } 8841 8842 if (statype != CFG80211_STA_TDLS_PEER_SETUP && 8843 statype != CFG80211_STA_TDLS_PEER_ACTIVE) { 8844 /* TDLS can't be set, ... */ 8845 if (params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) 8846 return -EINVAL; 8847 /* 8848 * ... but don't bother the driver with it. This works around 8849 * a hostapd/wpa_supplicant issue -- it always includes the 8850 * TLDS_PEER flag in the mask even for AP mode. 8851 */ 8852 params->sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER); 8853 } 8854 8855 if (statype != CFG80211_STA_TDLS_PEER_SETUP && 8856 statype != CFG80211_STA_AP_CLIENT_UNASSOC) { 8857 /* reject other things that can't change */ 8858 if (params->sta_modify_mask & STATION_PARAM_APPLY_UAPSD) 8859 return -EINVAL; 8860 if (params->sta_modify_mask & STATION_PARAM_APPLY_CAPABILITY) 8861 return -EINVAL; 8862 if (params->link_sta_params.supported_rates) 8863 return -EINVAL; 8864 if (statype != CFG80211_STA_NAN_MGMT && 8865 (params->link_sta_params.ht_capa || 8866 params->link_sta_params.vht_capa || 8867 params->link_sta_params.he_capa)) 8868 return -EINVAL; 8869 if (params->ext_capab || params->link_sta_params.eht_capa || 8870 params->link_sta_params.uhr_capa) 8871 return -EINVAL; 8872 if (params->sta_flags_mask & BIT(NL80211_STA_FLAG_SPP_AMSDU)) 8873 return -EINVAL; 8874 } 8875 8876 if (statype != CFG80211_STA_AP_CLIENT && 8877 statype != CFG80211_STA_AP_CLIENT_UNASSOC) { 8878 if (params->vlan) 8879 return -EINVAL; 8880 } 8881 8882 /* Accept EMLSR capabilities only for AP client before association */ 8883 if (statype != CFG80211_STA_AP_CLIENT_UNASSOC && 8884 params->eml_cap_present) 8885 return -EINVAL; 8886 8887 switch (statype) { 8888 case CFG80211_STA_AP_MLME_CLIENT: 8889 /* Use this only for authorizing/unauthorizing a station */ 8890 if (!(params->sta_flags_mask & BIT(NL80211_STA_FLAG_AUTHORIZED))) 8891 return -EOPNOTSUPP; 8892 break; 8893 case CFG80211_STA_AP_CLIENT: 8894 case CFG80211_STA_AP_CLIENT_UNASSOC: 8895 /* accept only the listed bits */ 8896 if (params->sta_flags_mask & 8897 ~(BIT(NL80211_STA_FLAG_AUTHORIZED) | 8898 BIT(NL80211_STA_FLAG_AUTHENTICATED) | 8899 BIT(NL80211_STA_FLAG_ASSOCIATED) | 8900 BIT(NL80211_STA_FLAG_SHORT_PREAMBLE) | 8901 BIT(NL80211_STA_FLAG_WME) | 8902 BIT(NL80211_STA_FLAG_MFP) | 8903 BIT(NL80211_STA_FLAG_SPP_AMSDU))) 8904 return -EINVAL; 8905 8906 /* but authenticated/associated only if driver handles it */ 8907 if (!(wiphy->features & NL80211_FEATURE_FULL_AP_CLIENT_STATE) && 8908 params->sta_flags_mask & 8909 (BIT(NL80211_STA_FLAG_AUTHENTICATED) | 8910 BIT(NL80211_STA_FLAG_ASSOCIATED))) 8911 return -EINVAL; 8912 break; 8913 case CFG80211_STA_IBSS: 8914 case CFG80211_STA_AP_STA: 8915 /* reject any changes other than AUTHORIZED */ 8916 if (params->sta_flags_mask & ~BIT(NL80211_STA_FLAG_AUTHORIZED)) 8917 return -EINVAL; 8918 break; 8919 case CFG80211_STA_TDLS_PEER_SETUP: 8920 /* reject any changes other than AUTHORIZED or WME */ 8921 if (params->sta_flags_mask & ~(BIT(NL80211_STA_FLAG_AUTHORIZED) | 8922 BIT(NL80211_STA_FLAG_WME))) 8923 return -EINVAL; 8924 /* force (at least) rates when authorizing */ 8925 if (params->sta_flags_set & BIT(NL80211_STA_FLAG_AUTHORIZED) && 8926 !params->link_sta_params.supported_rates) 8927 return -EINVAL; 8928 break; 8929 case CFG80211_STA_TDLS_PEER_ACTIVE: 8930 /* reject any changes */ 8931 return -EINVAL; 8932 case CFG80211_STA_MESH_PEER_KERNEL: 8933 if (params->sta_modify_mask & STATION_PARAM_APPLY_PLINK_STATE) 8934 return -EINVAL; 8935 break; 8936 case CFG80211_STA_MESH_PEER_USER: 8937 if (params->plink_action != NL80211_PLINK_ACTION_NO_ACTION && 8938 params->plink_action != NL80211_PLINK_ACTION_BLOCK) 8939 return -EINVAL; 8940 break; 8941 case CFG80211_STA_NAN_MGMT: 8942 if (params->sta_flags_mask & 8943 ~(BIT(NL80211_STA_FLAG_AUTHORIZED) | 8944 BIT(NL80211_STA_FLAG_MFP))) 8945 return -EINVAL; 8946 break; 8947 case CFG80211_STA_NAN_DATA: 8948 if (params->sta_flags_mask & 8949 ~(BIT(NL80211_STA_FLAG_AUTHORIZED) | 8950 BIT(NL80211_STA_FLAG_MFP) | 8951 BIT(NL80211_STA_FLAG_WME))) 8952 return -EINVAL; 8953 break; 8954 } 8955 8956 /* 8957 * Older kernel versions ignored this attribute entirely, so don't 8958 * reject attempts to update it but mark it as unused instead so the 8959 * driver won't look at the data. 8960 */ 8961 if (statype != CFG80211_STA_AP_CLIENT_UNASSOC && 8962 statype != CFG80211_STA_TDLS_PEER_SETUP) 8963 params->link_sta_params.opmode_notif_used = false; 8964 8965 return 0; 8966 } 8967 EXPORT_SYMBOL(cfg80211_check_station_change); 8968 8969 /* 8970 * Get vlan interface making sure it is running, on the right wiphy 8971 * and actually belongs to the given AP/P2P_GO interface. 8972 */ 8973 static struct net_device *get_vlan(struct genl_info *info, 8974 struct cfg80211_registered_device *rdev, 8975 struct net_device *dev) 8976 { 8977 struct nlattr *vlanattr = info->attrs[NL80211_ATTR_STA_VLAN]; 8978 struct net_device *v; 8979 int ret; 8980 8981 if (!vlanattr) 8982 return NULL; 8983 8984 v = dev_get_by_index(genl_info_net(info), nla_get_u32(vlanattr)); 8985 if (!v) 8986 return ERR_PTR(-ENODEV); 8987 8988 if (!v->ieee80211_ptr || v->ieee80211_ptr->wiphy != &rdev->wiphy) { 8989 ret = -EINVAL; 8990 goto error; 8991 } 8992 8993 if (v->ieee80211_ptr->iftype != NL80211_IFTYPE_AP_VLAN && 8994 v->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 8995 v->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) { 8996 ret = -EINVAL; 8997 goto error; 8998 } 8999 9000 if (!netif_running(v)) { 9001 ret = -ENETDOWN; 9002 goto error; 9003 } 9004 9005 /* Check if the VLAN interface belongs to the AP interface */ 9006 if (!dev || !ether_addr_equal(v->dev_addr, dev->dev_addr)) { 9007 ret = -EINVAL; 9008 goto error; 9009 } 9010 9011 return v; 9012 error: 9013 dev_put(v); 9014 return ERR_PTR(ret); 9015 } 9016 9017 static int nl80211_parse_sta_wme(struct genl_info *info, 9018 struct station_parameters *params) 9019 { 9020 struct nlattr *tb[NL80211_STA_WME_MAX + 1]; 9021 struct nlattr *nla; 9022 int err; 9023 9024 /* parse WME attributes if present */ 9025 if (!info->attrs[NL80211_ATTR_STA_WME]) 9026 return 0; 9027 9028 nla = info->attrs[NL80211_ATTR_STA_WME]; 9029 err = nla_parse_nested_deprecated(tb, NL80211_STA_WME_MAX, nla, 9030 nl80211_sta_wme_policy, 9031 info->extack); 9032 if (err) 9033 return err; 9034 9035 if (tb[NL80211_STA_WME_UAPSD_QUEUES]) 9036 params->uapsd_queues = nla_get_u8( 9037 tb[NL80211_STA_WME_UAPSD_QUEUES]); 9038 if (params->uapsd_queues & ~IEEE80211_WMM_IE_STA_QOSINFO_AC_MASK) 9039 return -EINVAL; 9040 9041 if (tb[NL80211_STA_WME_MAX_SP]) 9042 params->max_sp = nla_get_u8(tb[NL80211_STA_WME_MAX_SP]); 9043 9044 if (params->max_sp & ~IEEE80211_WMM_IE_STA_QOSINFO_SP_MASK) 9045 return -EINVAL; 9046 9047 params->sta_modify_mask |= STATION_PARAM_APPLY_UAPSD; 9048 9049 return 0; 9050 } 9051 9052 static int nl80211_parse_sta_channel_info(struct genl_info *info, 9053 struct station_parameters *params) 9054 { 9055 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]) { 9056 params->supported_channels = 9057 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]); 9058 params->supported_channels_len = 9059 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]); 9060 /* 9061 * Need to include at least one (first channel, number of 9062 * channels) tuple for each subband (checked in policy), 9063 * and must have proper tuples for the rest of the data as well. 9064 */ 9065 if (params->supported_channels_len % 2) 9066 return -EINVAL; 9067 } 9068 9069 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]) { 9070 params->supported_oper_classes = 9071 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]); 9072 params->supported_oper_classes_len = 9073 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]); 9074 } 9075 return 0; 9076 } 9077 9078 static int nl80211_set_station_tdls(struct genl_info *info, 9079 struct station_parameters *params) 9080 { 9081 int err; 9082 /* Dummy STA entry gets updated once the peer capabilities are known */ 9083 if (info->attrs[NL80211_ATTR_PEER_AID]) 9084 params->aid = nla_get_u16(info->attrs[NL80211_ATTR_PEER_AID]); 9085 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) 9086 params->link_sta_params.ht_capa = 9087 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]); 9088 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) 9089 params->link_sta_params.vht_capa = 9090 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]); 9091 if (info->attrs[NL80211_ATTR_HE_CAPABILITY]) { 9092 params->link_sta_params.he_capa = 9093 nla_data(info->attrs[NL80211_ATTR_HE_CAPABILITY]); 9094 params->link_sta_params.he_capa_len = 9095 nla_len(info->attrs[NL80211_ATTR_HE_CAPABILITY]); 9096 9097 if (info->attrs[NL80211_ATTR_EHT_CAPABILITY]) { 9098 params->link_sta_params.eht_capa = 9099 nla_data(info->attrs[NL80211_ATTR_EHT_CAPABILITY]); 9100 params->link_sta_params.eht_capa_len = 9101 nla_len(info->attrs[NL80211_ATTR_EHT_CAPABILITY]); 9102 9103 if (!ieee80211_eht_capa_size_ok((const u8 *)params->link_sta_params.he_capa, 9104 (const u8 *)params->link_sta_params.eht_capa, 9105 params->link_sta_params.eht_capa_len, 9106 false)) 9107 return -EINVAL; 9108 } 9109 } 9110 9111 if (info->attrs[NL80211_ATTR_UHR_CAPABILITY]) { 9112 if (!params->link_sta_params.eht_capa) 9113 return -EINVAL; 9114 9115 params->link_sta_params.uhr_capa = 9116 nla_data(info->attrs[NL80211_ATTR_UHR_CAPABILITY]); 9117 params->link_sta_params.uhr_capa_len = 9118 nla_len(info->attrs[NL80211_ATTR_UHR_CAPABILITY]); 9119 } 9120 9121 if (info->attrs[NL80211_ATTR_S1G_CAPABILITY]) 9122 params->link_sta_params.s1g_capa = 9123 nla_data(info->attrs[NL80211_ATTR_S1G_CAPABILITY]); 9124 9125 err = nl80211_parse_sta_channel_info(info, params); 9126 if (err) 9127 return err; 9128 9129 return nl80211_parse_sta_wme(info, params); 9130 } 9131 9132 static int nl80211_parse_sta_txpower_setting(struct genl_info *info, 9133 struct sta_txpwr *txpwr, 9134 bool *txpwr_set) 9135 { 9136 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9137 int idx; 9138 9139 if (info->attrs[NL80211_ATTR_STA_TX_POWER_SETTING]) { 9140 if (!rdev->ops->set_tx_power || 9141 !wiphy_ext_feature_isset(&rdev->wiphy, 9142 NL80211_EXT_FEATURE_STA_TX_PWR)) 9143 return -EOPNOTSUPP; 9144 9145 idx = NL80211_ATTR_STA_TX_POWER_SETTING; 9146 txpwr->type = nla_get_u8(info->attrs[idx]); 9147 9148 if (txpwr->type == NL80211_TX_POWER_LIMITED) { 9149 idx = NL80211_ATTR_STA_TX_POWER; 9150 9151 if (info->attrs[idx]) 9152 txpwr->power = nla_get_s16(info->attrs[idx]); 9153 else 9154 return -EINVAL; 9155 } 9156 9157 *txpwr_set = true; 9158 } else { 9159 *txpwr_set = false; 9160 } 9161 9162 return 0; 9163 } 9164 9165 static int nl80211_set_station(struct sk_buff *skb, struct genl_info *info) 9166 { 9167 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9168 struct wireless_dev *wdev = info->user_ptr[1]; 9169 struct net_device *dev = wdev->netdev; 9170 struct station_parameters params; 9171 u8 *mac_addr; 9172 int err; 9173 9174 memset(¶ms, 0, sizeof(params)); 9175 9176 if (!dev && wdev->iftype != NL80211_IFTYPE_NAN && 9177 wdev->iftype != NL80211_IFTYPE_NAN_DATA) 9178 return -EINVAL; 9179 9180 if (!rdev->ops->change_station) 9181 return -EOPNOTSUPP; 9182 9183 /* 9184 * AID and listen_interval properties can be set only for unassociated 9185 * station. Include these parameters here and will check them in 9186 * cfg80211_check_station_change(). 9187 */ 9188 if (info->attrs[NL80211_ATTR_STA_AID]) 9189 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_STA_AID]); 9190 9191 if (info->attrs[NL80211_ATTR_VLAN_ID]) 9192 params.vlan_id = nla_get_u16(info->attrs[NL80211_ATTR_VLAN_ID]); 9193 9194 if (info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]) 9195 params.listen_interval = 9196 nla_get_u16(info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]); 9197 else 9198 params.listen_interval = -1; 9199 9200 if (info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]) 9201 params.support_p2p_ps = 9202 nla_get_u8(info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]); 9203 else 9204 params.support_p2p_ps = -1; 9205 9206 if (!info->attrs[NL80211_ATTR_MAC]) 9207 return -EINVAL; 9208 9209 params.link_sta_params.link_id = 9210 nl80211_link_id_or_invalid(info->attrs); 9211 9212 if (info->attrs[NL80211_ATTR_MLD_ADDR]) { 9213 /* If MLD_ADDR attribute is set then this is an MLD station 9214 * and the MLD_ADDR attribute holds the MLD address and the 9215 * MAC attribute holds for the LINK address. 9216 * In that case, the link_id is also expected to be valid. 9217 */ 9218 if (params.link_sta_params.link_id < 0) 9219 return -EINVAL; 9220 9221 mac_addr = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]); 9222 params.link_sta_params.mld_mac = mac_addr; 9223 params.link_sta_params.link_mac = 9224 nla_data(info->attrs[NL80211_ATTR_MAC]); 9225 if (!is_valid_ether_addr(params.link_sta_params.link_mac)) 9226 return -EINVAL; 9227 } else { 9228 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 9229 } 9230 9231 9232 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) { 9233 params.link_sta_params.supported_rates = 9234 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); 9235 params.link_sta_params.supported_rates_len = 9236 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); 9237 } 9238 9239 if (info->attrs[NL80211_ATTR_STA_CAPABILITY]) { 9240 params.capability = 9241 nla_get_u16(info->attrs[NL80211_ATTR_STA_CAPABILITY]); 9242 params.sta_modify_mask |= STATION_PARAM_APPLY_CAPABILITY; 9243 } 9244 9245 if (info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]) { 9246 params.ext_capab = 9247 nla_data(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); 9248 params.ext_capab_len = 9249 nla_len(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); 9250 } 9251 9252 if (parse_station_flags(info, wdev->iftype, ¶ms)) 9253 return -EINVAL; 9254 9255 if (info->attrs[NL80211_ATTR_STA_PLINK_ACTION]) 9256 params.plink_action = 9257 nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_ACTION]); 9258 9259 if (info->attrs[NL80211_ATTR_STA_PLINK_STATE]) { 9260 params.plink_state = 9261 nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_STATE]); 9262 if (info->attrs[NL80211_ATTR_MESH_PEER_AID]) 9263 params.peer_aid = nla_get_u16( 9264 info->attrs[NL80211_ATTR_MESH_PEER_AID]); 9265 params.sta_modify_mask |= STATION_PARAM_APPLY_PLINK_STATE; 9266 } 9267 9268 if (info->attrs[NL80211_ATTR_LOCAL_MESH_POWER_MODE]) 9269 params.local_pm = nla_get_u32( 9270 info->attrs[NL80211_ATTR_LOCAL_MESH_POWER_MODE]); 9271 9272 if (info->attrs[NL80211_ATTR_OPMODE_NOTIF]) { 9273 params.link_sta_params.opmode_notif_used = true; 9274 params.link_sta_params.opmode_notif = 9275 nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]); 9276 } 9277 9278 if (info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]) 9279 params.link_sta_params.he_6ghz_capa = 9280 nla_data(info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]); 9281 9282 if (info->attrs[NL80211_ATTR_EML_CAPABILITY]) { 9283 params.eml_cap_present = true; 9284 params.eml_cap = 9285 nla_get_u16(info->attrs[NL80211_ATTR_EML_CAPABILITY]); 9286 } 9287 9288 if (info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]) 9289 params.airtime_weight = 9290 nla_get_u16(info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]); 9291 9292 if (params.airtime_weight && 9293 !wiphy_ext_feature_isset(&rdev->wiphy, 9294 NL80211_EXT_FEATURE_AIRTIME_FAIRNESS)) 9295 return -EOPNOTSUPP; 9296 9297 err = nl80211_parse_sta_txpower_setting(info, 9298 ¶ms.link_sta_params.txpwr, 9299 ¶ms.link_sta_params.txpwr_set); 9300 if (err) 9301 return err; 9302 9303 /* Include parameters for TDLS peer (will check later) */ 9304 err = nl80211_set_station_tdls(info, ¶ms); 9305 if (err) 9306 return err; 9307 9308 params.vlan = get_vlan(info, rdev, dev); 9309 if (IS_ERR(params.vlan)) 9310 return PTR_ERR(params.vlan); 9311 9312 switch (wdev->iftype) { 9313 case NL80211_IFTYPE_AP: 9314 case NL80211_IFTYPE_AP_VLAN: 9315 case NL80211_IFTYPE_P2P_GO: 9316 case NL80211_IFTYPE_P2P_CLIENT: 9317 case NL80211_IFTYPE_STATION: 9318 case NL80211_IFTYPE_ADHOC: 9319 case NL80211_IFTYPE_MESH_POINT: 9320 case NL80211_IFTYPE_NAN: 9321 case NL80211_IFTYPE_NAN_DATA: 9322 break; 9323 default: 9324 err = -EOPNOTSUPP; 9325 goto out_put_vlan; 9326 } 9327 9328 /* driver will call cfg80211_check_station_change() */ 9329 err = rdev_change_station(rdev, wdev, mac_addr, ¶ms); 9330 9331 out_put_vlan: 9332 dev_put(params.vlan); 9333 9334 return err; 9335 } 9336 9337 static int nl80211_new_station(struct sk_buff *skb, struct genl_info *info) 9338 { 9339 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9340 int err, link_id; 9341 struct wireless_dev *wdev = info->user_ptr[1]; 9342 struct net_device *dev = wdev->netdev; 9343 struct station_parameters params; 9344 u8 *mac_addr = NULL; 9345 u32 auth_assoc = BIT(NL80211_STA_FLAG_AUTHENTICATED) | 9346 BIT(NL80211_STA_FLAG_ASSOCIATED); 9347 9348 memset(¶ms, 0, sizeof(params)); 9349 9350 if (!dev && wdev->iftype != NL80211_IFTYPE_NAN) 9351 return -EINVAL; 9352 9353 if (!rdev->ops->add_station) 9354 return -EOPNOTSUPP; 9355 9356 if (!info->attrs[NL80211_ATTR_MAC]) 9357 return -EINVAL; 9358 9359 if (wdev->iftype == NL80211_IFTYPE_NAN || 9360 wdev->iftype == NL80211_IFTYPE_NAN_DATA) { 9361 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) 9362 return -EINVAL; 9363 if (wdev->iftype == NL80211_IFTYPE_NAN_DATA) { 9364 if (!info->attrs[NL80211_ATTR_NAN_NMI_MAC]) 9365 return -EINVAL; 9366 9367 /* Only NMI stations receive the HT/VHT/HE capabilities */ 9368 if (info->attrs[NL80211_ATTR_HT_CAPABILITY] || 9369 info->attrs[NL80211_ATTR_VHT_CAPABILITY] || 9370 info->attrs[NL80211_ATTR_HE_CAPABILITY]) 9371 return -EINVAL; 9372 } 9373 } else { 9374 if (!info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]) 9375 return -EINVAL; 9376 9377 if (!info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) 9378 return -EINVAL; 9379 9380 if (!info->attrs[NL80211_ATTR_STA_AID] && 9381 !info->attrs[NL80211_ATTR_PEER_AID]) 9382 return -EINVAL; 9383 } 9384 9385 params.link_sta_params.link_id = 9386 nl80211_link_id_or_invalid(info->attrs); 9387 9388 if (wdev->valid_links) { 9389 if (params.link_sta_params.link_id < 0) 9390 return -EINVAL; 9391 if (!(wdev->valid_links & BIT(params.link_sta_params.link_id))) 9392 return -ENOLINK; 9393 } else { 9394 if (params.link_sta_params.link_id >= 0) 9395 return -EINVAL; 9396 } 9397 9398 if (info->attrs[NL80211_ATTR_MLD_ADDR]) { 9399 mac_addr = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]); 9400 params.link_sta_params.mld_mac = mac_addr; 9401 params.link_sta_params.link_mac = 9402 nla_data(info->attrs[NL80211_ATTR_MAC]); 9403 if (!is_valid_ether_addr(params.link_sta_params.link_mac)) 9404 return -EINVAL; 9405 } else { 9406 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 9407 } 9408 9409 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) { 9410 params.link_sta_params.supported_rates = 9411 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); 9412 params.link_sta_params.supported_rates_len = 9413 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); 9414 } 9415 9416 if (info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]) 9417 params.listen_interval = 9418 nla_get_u16(info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]); 9419 9420 if (info->attrs[NL80211_ATTR_VLAN_ID]) 9421 params.vlan_id = nla_get_u16(info->attrs[NL80211_ATTR_VLAN_ID]); 9422 9423 if (info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]) { 9424 params.support_p2p_ps = 9425 nla_get_u8(info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]); 9426 } else { 9427 /* 9428 * if not specified, assume it's supported for P2P GO interface, 9429 * and is NOT supported for AP interface 9430 */ 9431 params.support_p2p_ps = 9432 wdev->iftype == NL80211_IFTYPE_P2P_GO; 9433 } 9434 9435 if (info->attrs[NL80211_ATTR_PEER_AID]) 9436 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_PEER_AID]); 9437 else if (info->attrs[NL80211_ATTR_STA_AID]) 9438 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_STA_AID]); 9439 9440 if (info->attrs[NL80211_ATTR_STA_CAPABILITY]) { 9441 params.capability = 9442 nla_get_u16(info->attrs[NL80211_ATTR_STA_CAPABILITY]); 9443 params.sta_modify_mask |= STATION_PARAM_APPLY_CAPABILITY; 9444 } 9445 9446 if (info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]) { 9447 params.ext_capab = 9448 nla_data(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); 9449 params.ext_capab_len = 9450 nla_len(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); 9451 } 9452 9453 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) 9454 params.link_sta_params.ht_capa = 9455 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]); 9456 9457 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) 9458 params.link_sta_params.vht_capa = 9459 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]); 9460 9461 if (info->attrs[NL80211_ATTR_HE_CAPABILITY]) { 9462 params.link_sta_params.he_capa = 9463 nla_data(info->attrs[NL80211_ATTR_HE_CAPABILITY]); 9464 params.link_sta_params.he_capa_len = 9465 nla_len(info->attrs[NL80211_ATTR_HE_CAPABILITY]); 9466 9467 if (info->attrs[NL80211_ATTR_EHT_CAPABILITY]) { 9468 params.link_sta_params.eht_capa = 9469 nla_data(info->attrs[NL80211_ATTR_EHT_CAPABILITY]); 9470 params.link_sta_params.eht_capa_len = 9471 nla_len(info->attrs[NL80211_ATTR_EHT_CAPABILITY]); 9472 9473 if (!ieee80211_eht_capa_size_ok((const u8 *)params.link_sta_params.he_capa, 9474 (const u8 *)params.link_sta_params.eht_capa, 9475 params.link_sta_params.eht_capa_len, 9476 false)) 9477 return -EINVAL; 9478 } 9479 } 9480 9481 if (info->attrs[NL80211_ATTR_UHR_CAPABILITY]) { 9482 if (!params.link_sta_params.eht_capa) 9483 return -EINVAL; 9484 9485 params.link_sta_params.uhr_capa = 9486 nla_data(info->attrs[NL80211_ATTR_UHR_CAPABILITY]); 9487 params.link_sta_params.uhr_capa_len = 9488 nla_len(info->attrs[NL80211_ATTR_UHR_CAPABILITY]); 9489 } 9490 9491 if (info->attrs[NL80211_ATTR_EML_CAPABILITY]) { 9492 params.eml_cap_present = true; 9493 params.eml_cap = 9494 nla_get_u16(info->attrs[NL80211_ATTR_EML_CAPABILITY]); 9495 } 9496 9497 if (info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]) 9498 params.link_sta_params.he_6ghz_capa = 9499 nla_data(info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]); 9500 9501 if (info->attrs[NL80211_ATTR_S1G_CAPABILITY]) 9502 params.link_sta_params.s1g_capa = 9503 nla_data(info->attrs[NL80211_ATTR_S1G_CAPABILITY]); 9504 9505 if (info->attrs[NL80211_ATTR_OPMODE_NOTIF]) { 9506 params.link_sta_params.opmode_notif_used = true; 9507 params.link_sta_params.opmode_notif = 9508 nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]); 9509 } 9510 9511 if (info->attrs[NL80211_ATTR_STA_PLINK_ACTION]) 9512 params.plink_action = 9513 nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_ACTION]); 9514 9515 if (info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]) 9516 params.airtime_weight = 9517 nla_get_u16(info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]); 9518 9519 if (params.airtime_weight && 9520 !wiphy_ext_feature_isset(&rdev->wiphy, 9521 NL80211_EXT_FEATURE_AIRTIME_FAIRNESS)) 9522 return -EOPNOTSUPP; 9523 9524 err = nl80211_parse_sta_txpower_setting(info, 9525 ¶ms.link_sta_params.txpwr, 9526 ¶ms.link_sta_params.txpwr_set); 9527 if (err) 9528 return err; 9529 9530 err = nl80211_parse_sta_channel_info(info, ¶ms); 9531 if (err) 9532 return err; 9533 9534 err = nl80211_parse_sta_wme(info, ¶ms); 9535 if (err) 9536 return err; 9537 9538 if (parse_station_flags(info, wdev->iftype, ¶ms)) 9539 return -EINVAL; 9540 9541 /* HT/VHT requires QoS, but if we don't have that just ignore HT/VHT 9542 * as userspace might just pass through the capabilities from the IEs 9543 * directly, rather than enforcing this restriction and returning an 9544 * error in this case. 9545 */ 9546 if (!(params.sta_flags_set & BIT(NL80211_STA_FLAG_WME))) { 9547 params.link_sta_params.ht_capa = NULL; 9548 params.link_sta_params.vht_capa = NULL; 9549 9550 /* HE, EHT and UHR require WME */ 9551 if (params.link_sta_params.he_capa_len || 9552 params.link_sta_params.he_6ghz_capa || 9553 params.link_sta_params.eht_capa_len || 9554 params.link_sta_params.uhr_capa_len) 9555 return -EINVAL; 9556 } 9557 9558 if (wdev->iftype == NL80211_IFTYPE_NAN || 9559 wdev->iftype == NL80211_IFTYPE_NAN_DATA) { 9560 if (params.sta_modify_mask & STATION_PARAM_APPLY_UAPSD) 9561 return -EINVAL; 9562 /* NAN NMI station must be added in associated or authorized state */ 9563 if (!(params.sta_flags_set & (BIT(NL80211_STA_FLAG_ASSOCIATED) | 9564 BIT(NL80211_STA_FLAG_AUTHENTICATED)))) 9565 return -EINVAL; 9566 } 9567 9568 /* Ensure that HT/VHT capabilities are not set for 6 GHz HE STA */ 9569 if (params.link_sta_params.he_6ghz_capa && 9570 (params.link_sta_params.ht_capa || params.link_sta_params.vht_capa)) 9571 return -EINVAL; 9572 9573 /* When you run into this, adjust the code below for the new flag */ 9574 BUILD_BUG_ON(NL80211_STA_FLAG_MAX != 8); 9575 9576 switch (wdev->iftype) { 9577 case NL80211_IFTYPE_AP: 9578 case NL80211_IFTYPE_P2P_GO: 9579 /* Add a new station only after the AP and link has been started */ 9580 link_id = wdev->valid_links ? params.link_sta_params.link_id : 0; 9581 if (!wdev->links[link_id].ap.beacon_interval) 9582 return -ENETDOWN; 9583 9584 /* ignore WME attributes if iface/sta is not capable */ 9585 if (!(rdev->wiphy.flags & WIPHY_FLAG_AP_UAPSD) || 9586 !(params.sta_flags_set & BIT(NL80211_STA_FLAG_WME))) 9587 params.sta_modify_mask &= ~STATION_PARAM_APPLY_UAPSD; 9588 9589 /* TDLS peers cannot be added */ 9590 if ((params.sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) || 9591 info->attrs[NL80211_ATTR_PEER_AID]) 9592 return -EINVAL; 9593 /* but don't bother the driver with it */ 9594 params.sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER); 9595 9596 /* allow authenticated/associated only if driver handles it */ 9597 if (!(rdev->wiphy.features & 9598 NL80211_FEATURE_FULL_AP_CLIENT_STATE) && 9599 params.sta_flags_mask & auth_assoc) 9600 return -EINVAL; 9601 9602 if (!wiphy_ext_feature_isset(&rdev->wiphy, 9603 NL80211_EXT_FEATURE_SPP_AMSDU_SUPPORT) && 9604 params.sta_flags_mask & BIT(NL80211_STA_FLAG_SPP_AMSDU)) 9605 return -EINVAL; 9606 9607 /* Older userspace, or userspace wanting to be compatible with 9608 * !NL80211_FEATURE_FULL_AP_CLIENT_STATE, will not set the auth 9609 * and assoc flags in the mask, but assumes the station will be 9610 * added as associated anyway since this was the required driver 9611 * behaviour before NL80211_FEATURE_FULL_AP_CLIENT_STATE was 9612 * introduced. 9613 * In order to not bother drivers with this quirk in the API 9614 * set the flags in both the mask and set for new stations in 9615 * this case. 9616 */ 9617 if (!(params.sta_flags_mask & auth_assoc)) { 9618 params.sta_flags_mask |= auth_assoc; 9619 params.sta_flags_set |= auth_assoc; 9620 } 9621 9622 /* must be last in here for error handling */ 9623 params.vlan = get_vlan(info, rdev, dev); 9624 if (IS_ERR(params.vlan)) 9625 return PTR_ERR(params.vlan); 9626 break; 9627 case NL80211_IFTYPE_MESH_POINT: 9628 /* 9629 * Add a new station only after the mesh has been started. 9630 * libertas doesn't implement join_mesh(); it configures the 9631 * mesh via sysfs and joins it when the channel is set, so 9632 * use that as the started indication instead. 9633 */ 9634 if (rdev->ops->libertas_set_mesh_channel) { 9635 if (!wdev->u.mesh.chandef.chan) 9636 return -ENETDOWN; 9637 } else if (!wdev->u.mesh.beacon_interval) { 9638 return -ENETDOWN; 9639 } 9640 9641 /* ignore uAPSD data */ 9642 params.sta_modify_mask &= ~STATION_PARAM_APPLY_UAPSD; 9643 9644 /* associated is disallowed */ 9645 if (params.sta_flags_mask & BIT(NL80211_STA_FLAG_ASSOCIATED)) 9646 return -EINVAL; 9647 /* TDLS peers cannot be added */ 9648 if ((params.sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) || 9649 info->attrs[NL80211_ATTR_PEER_AID]) 9650 return -EINVAL; 9651 break; 9652 case NL80211_IFTYPE_STATION: 9653 case NL80211_IFTYPE_P2P_CLIENT: 9654 /* ignore uAPSD data */ 9655 params.sta_modify_mask &= ~STATION_PARAM_APPLY_UAPSD; 9656 9657 /* these are disallowed */ 9658 if (params.sta_flags_mask & 9659 (BIT(NL80211_STA_FLAG_ASSOCIATED) | 9660 BIT(NL80211_STA_FLAG_AUTHENTICATED))) 9661 return -EINVAL; 9662 /* Only TDLS peers can be added */ 9663 if (!(params.sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER))) 9664 return -EINVAL; 9665 /* Can only add if TDLS ... */ 9666 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS)) 9667 return -EOPNOTSUPP; 9668 /* ... with external setup is supported */ 9669 if (!(rdev->wiphy.flags & WIPHY_FLAG_TDLS_EXTERNAL_SETUP)) 9670 return -EOPNOTSUPP; 9671 /* 9672 * Older wpa_supplicant versions always mark the TDLS peer 9673 * as authorized, but it shouldn't yet be. 9674 */ 9675 params.sta_flags_mask &= ~BIT(NL80211_STA_FLAG_AUTHORIZED); 9676 break; 9677 case NL80211_IFTYPE_NAN: 9678 break; 9679 case NL80211_IFTYPE_NAN_DATA: 9680 params.nmi_mac = nla_data(info->attrs[NL80211_ATTR_NAN_NMI_MAC]); 9681 break; 9682 default: 9683 return -EOPNOTSUPP; 9684 } 9685 9686 /* be aware of params.vlan when changing code here */ 9687 9688 params.epp_peer = 9689 nla_get_flag(info->attrs[NL80211_ATTR_EPP_PEER]); 9690 9691 err = rdev_add_station(rdev, wdev, mac_addr, ¶ms); 9692 dev_put(params.vlan); 9693 return err; 9694 } 9695 9696 static int nl80211_del_station(struct sk_buff *skb, struct genl_info *info) 9697 { 9698 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9699 struct wireless_dev *wdev = info->user_ptr[1]; 9700 struct net_device *dev = wdev->netdev; 9701 struct station_del_parameters params; 9702 int link_id = nl80211_link_id_or_invalid(info->attrs); 9703 9704 memset(¶ms, 0, sizeof(params)); 9705 9706 if (!dev && wdev->iftype != NL80211_IFTYPE_NAN) 9707 return -EINVAL; 9708 9709 if (info->attrs[NL80211_ATTR_MAC]) 9710 params.mac = nla_data(info->attrs[NL80211_ATTR_MAC]); 9711 9712 switch (wdev->iftype) { 9713 case NL80211_IFTYPE_AP: 9714 case NL80211_IFTYPE_AP_VLAN: 9715 case NL80211_IFTYPE_MESH_POINT: 9716 case NL80211_IFTYPE_P2P_GO: 9717 case NL80211_IFTYPE_NAN: 9718 case NL80211_IFTYPE_NAN_DATA: 9719 /* always accept these */ 9720 break; 9721 case NL80211_IFTYPE_ADHOC: 9722 /* conditionally accept */ 9723 if (wiphy_ext_feature_isset(&rdev->wiphy, 9724 NL80211_EXT_FEATURE_DEL_IBSS_STA)) 9725 break; 9726 return -EINVAL; 9727 default: 9728 return -EINVAL; 9729 } 9730 9731 if (!rdev->ops->del_station) 9732 return -EOPNOTSUPP; 9733 9734 if (info->attrs[NL80211_ATTR_MGMT_SUBTYPE]) { 9735 params.subtype = 9736 nla_get_u8(info->attrs[NL80211_ATTR_MGMT_SUBTYPE]); 9737 if (params.subtype != IEEE80211_STYPE_DISASSOC >> 4 && 9738 params.subtype != IEEE80211_STYPE_DEAUTH >> 4) 9739 return -EINVAL; 9740 } else { 9741 /* Default to Deauthentication frame */ 9742 params.subtype = IEEE80211_STYPE_DEAUTH >> 4; 9743 } 9744 9745 if (info->attrs[NL80211_ATTR_REASON_CODE]) { 9746 params.reason_code = 9747 nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); 9748 if (params.reason_code == 0) 9749 return -EINVAL; /* 0 is reserved */ 9750 } else { 9751 /* Default to reason code 2 */ 9752 params.reason_code = WLAN_REASON_PREV_AUTH_NOT_VALID; 9753 } 9754 9755 /* Link ID not expected in case of non-ML operation */ 9756 if (!wdev->valid_links && link_id != -1) 9757 return -EINVAL; 9758 9759 /* If given, a valid link ID should be passed during MLO */ 9760 if (wdev->valid_links && link_id >= 0 && 9761 !(wdev->valid_links & BIT(link_id))) 9762 return -EINVAL; 9763 9764 params.link_id = link_id; 9765 9766 return rdev_del_station(rdev, wdev, ¶ms); 9767 } 9768 9769 static int nl80211_send_mpath(struct sk_buff *msg, u32 portid, u32 seq, 9770 int flags, struct net_device *dev, 9771 u8 *dst, u8 *next_hop, 9772 struct mpath_info *pinfo) 9773 { 9774 void *hdr; 9775 struct nlattr *pinfoattr; 9776 9777 hdr = nl80211hdr_put(msg, portid, seq, flags, NL80211_CMD_NEW_MPATH); 9778 if (!hdr) 9779 return -1; 9780 9781 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 9782 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, dst) || 9783 nla_put(msg, NL80211_ATTR_MPATH_NEXT_HOP, ETH_ALEN, next_hop) || 9784 nla_put_u32(msg, NL80211_ATTR_GENERATION, pinfo->generation)) 9785 goto nla_put_failure; 9786 9787 pinfoattr = nla_nest_start_noflag(msg, NL80211_ATTR_MPATH_INFO); 9788 if (!pinfoattr) 9789 goto nla_put_failure; 9790 if ((pinfo->filled & MPATH_INFO_FRAME_QLEN) && 9791 nla_put_u32(msg, NL80211_MPATH_INFO_FRAME_QLEN, 9792 pinfo->frame_qlen)) 9793 goto nla_put_failure; 9794 if (((pinfo->filled & MPATH_INFO_SN) && 9795 nla_put_u32(msg, NL80211_MPATH_INFO_SN, pinfo->sn)) || 9796 ((pinfo->filled & MPATH_INFO_METRIC) && 9797 nla_put_u32(msg, NL80211_MPATH_INFO_METRIC, 9798 pinfo->metric)) || 9799 ((pinfo->filled & MPATH_INFO_EXPTIME) && 9800 nla_put_u32(msg, NL80211_MPATH_INFO_EXPTIME, 9801 pinfo->exptime)) || 9802 ((pinfo->filled & MPATH_INFO_FLAGS) && 9803 nla_put_u8(msg, NL80211_MPATH_INFO_FLAGS, 9804 pinfo->flags)) || 9805 ((pinfo->filled & MPATH_INFO_DISCOVERY_TIMEOUT) && 9806 nla_put_u32(msg, NL80211_MPATH_INFO_DISCOVERY_TIMEOUT, 9807 pinfo->discovery_timeout)) || 9808 ((pinfo->filled & MPATH_INFO_DISCOVERY_RETRIES) && 9809 nla_put_u8(msg, NL80211_MPATH_INFO_DISCOVERY_RETRIES, 9810 pinfo->discovery_retries)) || 9811 ((pinfo->filled & MPATH_INFO_HOP_COUNT) && 9812 nla_put_u8(msg, NL80211_MPATH_INFO_HOP_COUNT, 9813 pinfo->hop_count)) || 9814 ((pinfo->filled & MPATH_INFO_PATH_CHANGE) && 9815 nla_put_u32(msg, NL80211_MPATH_INFO_PATH_CHANGE, 9816 pinfo->path_change_count))) 9817 goto nla_put_failure; 9818 9819 nla_nest_end(msg, pinfoattr); 9820 9821 genlmsg_end(msg, hdr); 9822 return 0; 9823 9824 nla_put_failure: 9825 genlmsg_cancel(msg, hdr); 9826 return -EMSGSIZE; 9827 } 9828 9829 static int nl80211_dump_mpath(struct sk_buff *skb, 9830 struct netlink_callback *cb) 9831 { 9832 struct mpath_info pinfo; 9833 struct cfg80211_registered_device *rdev; 9834 struct wireless_dev *wdev; 9835 u8 dst[ETH_ALEN]; 9836 u8 next_hop[ETH_ALEN]; 9837 int path_idx = cb->args[2]; 9838 int err; 9839 9840 err = nl80211_prepare_wdev_dump(cb, &rdev, &wdev, NULL); 9841 if (err) 9842 return err; 9843 /* nl80211_prepare_wdev_dump acquired it in the successful case */ 9844 __acquire(&rdev->wiphy.mtx); 9845 9846 if (!rdev->ops->dump_mpath) { 9847 err = -EOPNOTSUPP; 9848 goto out_err; 9849 } 9850 9851 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) { 9852 err = -EOPNOTSUPP; 9853 goto out_err; 9854 } 9855 9856 while (1) { 9857 err = rdev_dump_mpath(rdev, wdev->netdev, path_idx, dst, 9858 next_hop, &pinfo); 9859 if (err == -ENOENT) 9860 break; 9861 if (err) 9862 goto out_err; 9863 9864 if (nl80211_send_mpath(skb, NETLINK_CB(cb->skb).portid, 9865 cb->nlh->nlmsg_seq, NLM_F_MULTI, 9866 wdev->netdev, dst, next_hop, 9867 &pinfo) < 0) 9868 goto out; 9869 9870 path_idx++; 9871 } 9872 9873 out: 9874 cb->args[2] = path_idx; 9875 err = skb->len; 9876 out_err: 9877 wiphy_unlock(&rdev->wiphy); 9878 return err; 9879 } 9880 9881 static int nl80211_get_mpath(struct sk_buff *skb, struct genl_info *info) 9882 { 9883 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9884 int err; 9885 struct net_device *dev = info->user_ptr[1]; 9886 struct mpath_info pinfo; 9887 struct sk_buff *msg; 9888 u8 *dst = NULL; 9889 u8 next_hop[ETH_ALEN]; 9890 9891 memset(&pinfo, 0, sizeof(pinfo)); 9892 9893 if (!info->attrs[NL80211_ATTR_MAC]) 9894 return -EINVAL; 9895 9896 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); 9897 9898 if (!rdev->ops->get_mpath) 9899 return -EOPNOTSUPP; 9900 9901 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) 9902 return -EOPNOTSUPP; 9903 9904 err = rdev_get_mpath(rdev, dev, dst, next_hop, &pinfo); 9905 if (err) 9906 return err; 9907 9908 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 9909 if (!msg) 9910 return -ENOMEM; 9911 9912 if (nl80211_send_mpath(msg, info->snd_portid, info->snd_seq, 0, 9913 dev, dst, next_hop, &pinfo) < 0) { 9914 nlmsg_free(msg); 9915 return -ENOBUFS; 9916 } 9917 9918 return genlmsg_reply(msg, info); 9919 } 9920 9921 static int nl80211_set_mpath(struct sk_buff *skb, struct genl_info *info) 9922 { 9923 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9924 struct net_device *dev = info->user_ptr[1]; 9925 u8 *dst = NULL; 9926 u8 *next_hop = NULL; 9927 9928 if (!info->attrs[NL80211_ATTR_MAC]) 9929 return -EINVAL; 9930 9931 if (!info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]) 9932 return -EINVAL; 9933 9934 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); 9935 next_hop = nla_data(info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]); 9936 9937 if (!rdev->ops->change_mpath) 9938 return -EOPNOTSUPP; 9939 9940 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) 9941 return -EOPNOTSUPP; 9942 9943 return rdev_change_mpath(rdev, dev, dst, next_hop); 9944 } 9945 9946 static int nl80211_new_mpath(struct sk_buff *skb, struct genl_info *info) 9947 { 9948 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9949 struct net_device *dev = info->user_ptr[1]; 9950 u8 *dst = NULL; 9951 u8 *next_hop = NULL; 9952 9953 if (!info->attrs[NL80211_ATTR_MAC]) 9954 return -EINVAL; 9955 9956 if (!info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]) 9957 return -EINVAL; 9958 9959 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); 9960 next_hop = nla_data(info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]); 9961 9962 if (!rdev->ops->add_mpath) 9963 return -EOPNOTSUPP; 9964 9965 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) 9966 return -EOPNOTSUPP; 9967 9968 return rdev_add_mpath(rdev, dev, dst, next_hop); 9969 } 9970 9971 static int nl80211_del_mpath(struct sk_buff *skb, struct genl_info *info) 9972 { 9973 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9974 struct net_device *dev = info->user_ptr[1]; 9975 u8 *dst = NULL; 9976 9977 if (info->attrs[NL80211_ATTR_MAC]) 9978 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); 9979 9980 if (!rdev->ops->del_mpath) 9981 return -EOPNOTSUPP; 9982 9983 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) 9984 return -EOPNOTSUPP; 9985 9986 return rdev_del_mpath(rdev, dev, dst); 9987 } 9988 9989 static int nl80211_get_mpp(struct sk_buff *skb, struct genl_info *info) 9990 { 9991 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9992 int err; 9993 struct net_device *dev = info->user_ptr[1]; 9994 struct mpath_info pinfo; 9995 struct sk_buff *msg; 9996 u8 *dst = NULL; 9997 u8 mpp[ETH_ALEN]; 9998 9999 memset(&pinfo, 0, sizeof(pinfo)); 10000 10001 if (!info->attrs[NL80211_ATTR_MAC]) 10002 return -EINVAL; 10003 10004 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); 10005 10006 if (!rdev->ops->get_mpp) 10007 return -EOPNOTSUPP; 10008 10009 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) 10010 return -EOPNOTSUPP; 10011 10012 err = rdev_get_mpp(rdev, dev, dst, mpp, &pinfo); 10013 if (err) 10014 return err; 10015 10016 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 10017 if (!msg) 10018 return -ENOMEM; 10019 10020 if (nl80211_send_mpath(msg, info->snd_portid, info->snd_seq, 0, 10021 dev, dst, mpp, &pinfo) < 0) { 10022 nlmsg_free(msg); 10023 return -ENOBUFS; 10024 } 10025 10026 return genlmsg_reply(msg, info); 10027 } 10028 10029 static int nl80211_dump_mpp(struct sk_buff *skb, 10030 struct netlink_callback *cb) 10031 { 10032 struct mpath_info pinfo; 10033 struct cfg80211_registered_device *rdev; 10034 struct wireless_dev *wdev; 10035 u8 dst[ETH_ALEN]; 10036 u8 mpp[ETH_ALEN]; 10037 int path_idx = cb->args[2]; 10038 int err; 10039 10040 err = nl80211_prepare_wdev_dump(cb, &rdev, &wdev, NULL); 10041 if (err) 10042 return err; 10043 /* nl80211_prepare_wdev_dump acquired it in the successful case */ 10044 __acquire(&rdev->wiphy.mtx); 10045 10046 if (!rdev->ops->dump_mpp) { 10047 err = -EOPNOTSUPP; 10048 goto out_err; 10049 } 10050 10051 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) { 10052 err = -EOPNOTSUPP; 10053 goto out_err; 10054 } 10055 10056 while (1) { 10057 err = rdev_dump_mpp(rdev, wdev->netdev, path_idx, dst, 10058 mpp, &pinfo); 10059 if (err == -ENOENT) 10060 break; 10061 if (err) 10062 goto out_err; 10063 10064 if (nl80211_send_mpath(skb, NETLINK_CB(cb->skb).portid, 10065 cb->nlh->nlmsg_seq, NLM_F_MULTI, 10066 wdev->netdev, dst, mpp, 10067 &pinfo) < 0) 10068 goto out; 10069 10070 path_idx++; 10071 } 10072 10073 out: 10074 cb->args[2] = path_idx; 10075 err = skb->len; 10076 out_err: 10077 wiphy_unlock(&rdev->wiphy); 10078 return err; 10079 } 10080 10081 static int nl80211_set_bss(struct sk_buff *skb, struct genl_info *info) 10082 { 10083 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 10084 struct net_device *dev = info->user_ptr[1]; 10085 struct bss_parameters params; 10086 u32 bss_param_support = rdev->wiphy.bss_param_support; 10087 u32 changed = 0; 10088 bool strict; 10089 10090 memset(¶ms, 0, sizeof(params)); 10091 params.link_id = nl80211_link_id_or_invalid(info->attrs); 10092 /* default to not changing parameters */ 10093 params.use_cts_prot = -1; 10094 params.use_short_preamble = -1; 10095 params.use_short_slot_time = -1; 10096 params.ap_isolate = -1; 10097 params.ht_opmode = -1; 10098 params.p2p_ctwindow = -1; 10099 params.p2p_opp_ps = -1; 10100 10101 strict = nla_get_flag(info->attrs[NL80211_ATTR_BSS_PARAM]); 10102 if (info->attrs[NL80211_ATTR_BSS_CTS_PROT]) { 10103 if (strict && !(bss_param_support & WIPHY_BSS_PARAM_CTS_PROT)) 10104 return -EINVAL; 10105 params.use_cts_prot = 10106 nla_get_u8(info->attrs[NL80211_ATTR_BSS_CTS_PROT]); 10107 changed |= WIPHY_BSS_PARAM_CTS_PROT; 10108 } 10109 if (info->attrs[NL80211_ATTR_BSS_SHORT_PREAMBLE]) { 10110 if (strict && 10111 !(bss_param_support & WIPHY_BSS_PARAM_SHORT_PREAMBLE)) 10112 return -EINVAL; 10113 params.use_short_preamble = 10114 nla_get_u8(info->attrs[NL80211_ATTR_BSS_SHORT_PREAMBLE]); 10115 changed |= WIPHY_BSS_PARAM_SHORT_PREAMBLE; 10116 } 10117 if (info->attrs[NL80211_ATTR_BSS_SHORT_SLOT_TIME]) { 10118 if (strict && 10119 !(bss_param_support & WIPHY_BSS_PARAM_SHORT_SLOT_TIME)) 10120 return -EINVAL; 10121 params.use_short_slot_time = 10122 nla_get_u8(info->attrs[NL80211_ATTR_BSS_SHORT_SLOT_TIME]); 10123 changed |= WIPHY_BSS_PARAM_SHORT_SLOT_TIME; 10124 } 10125 if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) { 10126 if (strict && 10127 !(bss_param_support & WIPHY_BSS_PARAM_BASIC_RATES)) 10128 return -EINVAL; 10129 params.basic_rates = 10130 nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); 10131 params.basic_rates_len = 10132 nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); 10133 changed |= WIPHY_BSS_PARAM_BASIC_RATES; 10134 } 10135 if (info->attrs[NL80211_ATTR_AP_ISOLATE]) { 10136 if (strict && !(bss_param_support & WIPHY_BSS_PARAM_AP_ISOLATE)) 10137 return -EINVAL; 10138 params.ap_isolate = 10139 !!nla_get_u8(info->attrs[NL80211_ATTR_AP_ISOLATE]); 10140 changed |= WIPHY_BSS_PARAM_AP_ISOLATE; 10141 } 10142 if (info->attrs[NL80211_ATTR_BSS_HT_OPMODE]) { 10143 if (strict && !(bss_param_support & WIPHY_BSS_PARAM_HT_OPMODE)) 10144 return -EINVAL; 10145 params.ht_opmode = 10146 nla_get_u16(info->attrs[NL80211_ATTR_BSS_HT_OPMODE]); 10147 changed |= WIPHY_BSS_PARAM_HT_OPMODE; 10148 } 10149 10150 if (info->attrs[NL80211_ATTR_P2P_CTWINDOW]) { 10151 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 10152 return -EINVAL; 10153 params.p2p_ctwindow = 10154 nla_get_u8(info->attrs[NL80211_ATTR_P2P_CTWINDOW]); 10155 if (params.p2p_ctwindow != 0 && 10156 !(bss_param_support & WIPHY_BSS_PARAM_P2P_CTWINDOW)) 10157 return -EINVAL; 10158 changed |= WIPHY_BSS_PARAM_P2P_CTWINDOW; 10159 } 10160 10161 if (info->attrs[NL80211_ATTR_P2P_OPPPS]) { 10162 u8 tmp; 10163 10164 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 10165 return -EINVAL; 10166 tmp = nla_get_u8(info->attrs[NL80211_ATTR_P2P_OPPPS]); 10167 if (tmp && !(bss_param_support & WIPHY_BSS_PARAM_P2P_OPPPS)) 10168 return -EINVAL; 10169 params.p2p_opp_ps = tmp; 10170 if (params.p2p_opp_ps && 10171 !(rdev->wiphy.bss_param_support & WIPHY_BSS_PARAM_P2P_OPPPS)) 10172 return -EINVAL; 10173 } 10174 10175 if (!rdev->ops->change_bss) 10176 return -EOPNOTSUPP; 10177 10178 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 10179 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 10180 return -EOPNOTSUPP; 10181 10182 changed &= rdev->wiphy.bss_param_support; 10183 if (!changed) 10184 return 0; 10185 10186 return rdev_change_bss(rdev, dev, ¶ms); 10187 } 10188 10189 static int nl80211_req_set_reg(struct sk_buff *skb, struct genl_info *info) 10190 { 10191 char *data = NULL; 10192 bool is_indoor; 10193 enum nl80211_user_reg_hint_type user_reg_hint_type; 10194 u32 owner_nlportid; 10195 10196 /* 10197 * You should only get this when cfg80211 hasn't yet initialized 10198 * completely when built-in to the kernel right between the time 10199 * window between nl80211_init() and regulatory_init(), if that is 10200 * even possible. 10201 */ 10202 if (unlikely(!rcu_access_pointer(cfg80211_regdomain))) 10203 return -EINPROGRESS; 10204 10205 user_reg_hint_type = 10206 nla_get_u32_default(info->attrs[NL80211_ATTR_USER_REG_HINT_TYPE], 10207 NL80211_USER_REG_HINT_USER); 10208 10209 switch (user_reg_hint_type) { 10210 case NL80211_USER_REG_HINT_USER: 10211 case NL80211_USER_REG_HINT_CELL_BASE: 10212 if (!info->attrs[NL80211_ATTR_REG_ALPHA2]) 10213 return -EINVAL; 10214 10215 data = nla_data(info->attrs[NL80211_ATTR_REG_ALPHA2]); 10216 return regulatory_hint_user(data, user_reg_hint_type); 10217 case NL80211_USER_REG_HINT_INDOOR: 10218 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) { 10219 owner_nlportid = info->snd_portid; 10220 is_indoor = !!info->attrs[NL80211_ATTR_REG_INDOOR]; 10221 } else { 10222 owner_nlportid = 0; 10223 is_indoor = true; 10224 } 10225 10226 regulatory_hint_indoor(is_indoor, owner_nlportid); 10227 return 0; 10228 default: 10229 return -EINVAL; 10230 } 10231 } 10232 10233 static int nl80211_reload_regdb(struct sk_buff *skb, struct genl_info *info) 10234 { 10235 return reg_reload_regdb(); 10236 } 10237 10238 static int nl80211_get_mesh_config(struct sk_buff *skb, 10239 struct genl_info *info) 10240 { 10241 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 10242 struct net_device *dev = info->user_ptr[1]; 10243 struct wireless_dev *wdev = dev->ieee80211_ptr; 10244 struct mesh_config cur_params; 10245 int err = 0; 10246 void *hdr; 10247 struct nlattr *pinfoattr; 10248 struct sk_buff *msg; 10249 10250 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) 10251 return -EOPNOTSUPP; 10252 10253 if (!rdev->ops->get_mesh_config) 10254 return -EOPNOTSUPP; 10255 10256 /* If not connected, get default parameters */ 10257 if (!wdev->u.mesh.id_len) 10258 memcpy(&cur_params, &default_mesh_config, sizeof(cur_params)); 10259 else 10260 err = rdev_get_mesh_config(rdev, dev, &cur_params); 10261 10262 if (err) 10263 return err; 10264 10265 /* Draw up a netlink message to send back */ 10266 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 10267 if (!msg) 10268 return -ENOMEM; 10269 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 10270 NL80211_CMD_GET_MESH_CONFIG); 10271 if (!hdr) 10272 goto out; 10273 pinfoattr = nla_nest_start_noflag(msg, NL80211_ATTR_MESH_CONFIG); 10274 if (!pinfoattr) 10275 goto nla_put_failure; 10276 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 10277 nla_put_u16(msg, NL80211_MESHCONF_RETRY_TIMEOUT, 10278 cur_params.dot11MeshRetryTimeout) || 10279 nla_put_u16(msg, NL80211_MESHCONF_CONFIRM_TIMEOUT, 10280 cur_params.dot11MeshConfirmTimeout) || 10281 nla_put_u16(msg, NL80211_MESHCONF_HOLDING_TIMEOUT, 10282 cur_params.dot11MeshHoldingTimeout) || 10283 nla_put_u16(msg, NL80211_MESHCONF_MAX_PEER_LINKS, 10284 cur_params.dot11MeshMaxPeerLinks) || 10285 nla_put_u8(msg, NL80211_MESHCONF_MAX_RETRIES, 10286 cur_params.dot11MeshMaxRetries) || 10287 nla_put_u8(msg, NL80211_MESHCONF_TTL, 10288 cur_params.dot11MeshTTL) || 10289 nla_put_u8(msg, NL80211_MESHCONF_ELEMENT_TTL, 10290 cur_params.element_ttl) || 10291 nla_put_u8(msg, NL80211_MESHCONF_AUTO_OPEN_PLINKS, 10292 cur_params.auto_open_plinks) || 10293 nla_put_u32(msg, NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR, 10294 cur_params.dot11MeshNbrOffsetMaxNeighbor) || 10295 nla_put_u8(msg, NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES, 10296 cur_params.dot11MeshHWMPmaxPREQretries) || 10297 nla_put_u32(msg, NL80211_MESHCONF_PATH_REFRESH_TIME, 10298 cur_params.path_refresh_time) || 10299 nla_put_u16(msg, NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT, 10300 cur_params.min_discovery_timeout) || 10301 nla_put_u32(msg, NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT, 10302 cur_params.dot11MeshHWMPactivePathTimeout) || 10303 nla_put_u16(msg, NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL, 10304 cur_params.dot11MeshHWMPpreqMinInterval) || 10305 nla_put_u16(msg, NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL, 10306 cur_params.dot11MeshHWMPperrMinInterval) || 10307 nla_put_u16(msg, NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME, 10308 cur_params.dot11MeshHWMPnetDiameterTraversalTime) || 10309 nla_put_u8(msg, NL80211_MESHCONF_HWMP_ROOTMODE, 10310 cur_params.dot11MeshHWMPRootMode) || 10311 nla_put_u16(msg, NL80211_MESHCONF_HWMP_RANN_INTERVAL, 10312 cur_params.dot11MeshHWMPRannInterval) || 10313 nla_put_u8(msg, NL80211_MESHCONF_GATE_ANNOUNCEMENTS, 10314 cur_params.dot11MeshGateAnnouncementProtocol) || 10315 nla_put_u8(msg, NL80211_MESHCONF_FORWARDING, 10316 cur_params.dot11MeshForwarding) || 10317 nla_put_s32(msg, NL80211_MESHCONF_RSSI_THRESHOLD, 10318 cur_params.rssi_threshold) || 10319 nla_put_u32(msg, NL80211_MESHCONF_HT_OPMODE, 10320 cur_params.ht_opmode) || 10321 nla_put_u32(msg, NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT, 10322 cur_params.dot11MeshHWMPactivePathToRootTimeout) || 10323 nla_put_u16(msg, NL80211_MESHCONF_HWMP_ROOT_INTERVAL, 10324 cur_params.dot11MeshHWMProotInterval) || 10325 nla_put_u16(msg, NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL, 10326 cur_params.dot11MeshHWMPconfirmationInterval) || 10327 nla_put_u32(msg, NL80211_MESHCONF_POWER_MODE, 10328 cur_params.power_mode) || 10329 nla_put_u16(msg, NL80211_MESHCONF_AWAKE_WINDOW, 10330 cur_params.dot11MeshAwakeWindowDuration) || 10331 nla_put_u32(msg, NL80211_MESHCONF_PLINK_TIMEOUT, 10332 cur_params.plink_timeout) || 10333 nla_put_u8(msg, NL80211_MESHCONF_CONNECTED_TO_GATE, 10334 cur_params.dot11MeshConnectedToMeshGate) || 10335 nla_put_u8(msg, NL80211_MESHCONF_NOLEARN, 10336 cur_params.dot11MeshNolearn) || 10337 nla_put_u8(msg, NL80211_MESHCONF_CONNECTED_TO_AS, 10338 cur_params.dot11MeshConnectedToAuthServer)) 10339 goto nla_put_failure; 10340 nla_nest_end(msg, pinfoattr); 10341 genlmsg_end(msg, hdr); 10342 return genlmsg_reply(msg, info); 10343 10344 nla_put_failure: 10345 out: 10346 nlmsg_free(msg); 10347 return -ENOBUFS; 10348 } 10349 10350 static const struct nla_policy 10351 nl80211_meshconf_params_policy[NL80211_MESHCONF_ATTR_MAX+1] = { 10352 [NL80211_MESHCONF_RETRY_TIMEOUT] = 10353 NLA_POLICY_RANGE(NLA_U16, 1, 255), 10354 [NL80211_MESHCONF_CONFIRM_TIMEOUT] = 10355 NLA_POLICY_RANGE(NLA_U16, 1, 255), 10356 [NL80211_MESHCONF_HOLDING_TIMEOUT] = 10357 NLA_POLICY_RANGE(NLA_U16, 1, 255), 10358 [NL80211_MESHCONF_MAX_PEER_LINKS] = 10359 NLA_POLICY_RANGE(NLA_U16, 0, 255), 10360 [NL80211_MESHCONF_MAX_RETRIES] = NLA_POLICY_MAX(NLA_U8, 16), 10361 [NL80211_MESHCONF_TTL] = NLA_POLICY_MIN(NLA_U8, 1), 10362 [NL80211_MESHCONF_ELEMENT_TTL] = NLA_POLICY_MIN(NLA_U8, 1), 10363 [NL80211_MESHCONF_AUTO_OPEN_PLINKS] = NLA_POLICY_MAX(NLA_U8, 1), 10364 [NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR] = 10365 NLA_POLICY_RANGE(NLA_U32, 1, 255), 10366 [NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES] = { .type = NLA_U8 }, 10367 [NL80211_MESHCONF_PATH_REFRESH_TIME] = { .type = NLA_U32 }, 10368 [NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT] = NLA_POLICY_MIN(NLA_U16, 1), 10369 [NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT] = { .type = NLA_U32 }, 10370 [NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL] = 10371 NLA_POLICY_MIN(NLA_U16, 1), 10372 [NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL] = 10373 NLA_POLICY_MIN(NLA_U16, 1), 10374 [NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME] = 10375 NLA_POLICY_MIN(NLA_U16, 1), 10376 [NL80211_MESHCONF_HWMP_ROOTMODE] = NLA_POLICY_MAX(NLA_U8, 4), 10377 [NL80211_MESHCONF_HWMP_RANN_INTERVAL] = 10378 NLA_POLICY_MIN(NLA_U16, 1), 10379 [NL80211_MESHCONF_GATE_ANNOUNCEMENTS] = NLA_POLICY_MAX(NLA_U8, 1), 10380 [NL80211_MESHCONF_FORWARDING] = NLA_POLICY_MAX(NLA_U8, 1), 10381 [NL80211_MESHCONF_RSSI_THRESHOLD] = 10382 NLA_POLICY_RANGE(NLA_S32, -255, 0), 10383 [NL80211_MESHCONF_HT_OPMODE] = { .type = NLA_U16 }, 10384 [NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT] = { .type = NLA_U32 }, 10385 [NL80211_MESHCONF_HWMP_ROOT_INTERVAL] = 10386 NLA_POLICY_MIN(NLA_U16, 1), 10387 [NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL] = 10388 NLA_POLICY_MIN(NLA_U16, 1), 10389 [NL80211_MESHCONF_POWER_MODE] = 10390 NLA_POLICY_RANGE(NLA_U32, 10391 NL80211_MESH_POWER_ACTIVE, 10392 NL80211_MESH_POWER_MAX), 10393 [NL80211_MESHCONF_AWAKE_WINDOW] = { .type = NLA_U16 }, 10394 [NL80211_MESHCONF_PLINK_TIMEOUT] = { .type = NLA_U32 }, 10395 [NL80211_MESHCONF_CONNECTED_TO_GATE] = NLA_POLICY_RANGE(NLA_U8, 0, 1), 10396 [NL80211_MESHCONF_NOLEARN] = NLA_POLICY_RANGE(NLA_U8, 0, 1), 10397 [NL80211_MESHCONF_CONNECTED_TO_AS] = NLA_POLICY_RANGE(NLA_U8, 0, 1), 10398 }; 10399 10400 static const struct nla_policy 10401 nl80211_mesh_setup_params_policy[NL80211_MESH_SETUP_ATTR_MAX+1] = { 10402 [NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC] = { .type = NLA_U8 }, 10403 [NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL] = { .type = NLA_U8 }, 10404 [NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC] = { .type = NLA_U8 }, 10405 [NL80211_MESH_SETUP_USERSPACE_AUTH] = { .type = NLA_FLAG }, 10406 [NL80211_MESH_SETUP_AUTH_PROTOCOL] = { .type = NLA_U8 }, 10407 [NL80211_MESH_SETUP_USERSPACE_MPM] = { .type = NLA_FLAG }, 10408 [NL80211_MESH_SETUP_IE] = 10409 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_ie_attr, 10410 IEEE80211_MAX_DATA_LEN), 10411 [NL80211_MESH_SETUP_USERSPACE_AMPE] = { .type = NLA_FLAG }, 10412 }; 10413 10414 static int nl80211_parse_mesh_config(struct genl_info *info, 10415 struct mesh_config *cfg, 10416 u32 *mask_out) 10417 { 10418 struct nlattr *tb[NL80211_MESHCONF_ATTR_MAX + 1]; 10419 u32 mask = 0; 10420 u16 ht_opmode; 10421 10422 #define FILL_IN_MESH_PARAM_IF_SET(tb, cfg, param, mask, attr, fn) \ 10423 do { \ 10424 if (tb[attr]) { \ 10425 cfg->param = fn(tb[attr]); \ 10426 mask |= BIT((attr) - 1); \ 10427 } \ 10428 } while (0) 10429 10430 if (!info->attrs[NL80211_ATTR_MESH_CONFIG]) 10431 return -EINVAL; 10432 if (nla_parse_nested_deprecated(tb, NL80211_MESHCONF_ATTR_MAX, info->attrs[NL80211_ATTR_MESH_CONFIG], nl80211_meshconf_params_policy, info->extack)) 10433 return -EINVAL; 10434 10435 /* This makes sure that there aren't more than 32 mesh config 10436 * parameters (otherwise our bitfield scheme would not work.) */ 10437 BUILD_BUG_ON(NL80211_MESHCONF_ATTR_MAX > 32); 10438 10439 /* Fill in the params struct */ 10440 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshRetryTimeout, mask, 10441 NL80211_MESHCONF_RETRY_TIMEOUT, nla_get_u16); 10442 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshConfirmTimeout, mask, 10443 NL80211_MESHCONF_CONFIRM_TIMEOUT, 10444 nla_get_u16); 10445 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHoldingTimeout, mask, 10446 NL80211_MESHCONF_HOLDING_TIMEOUT, 10447 nla_get_u16); 10448 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshMaxPeerLinks, mask, 10449 NL80211_MESHCONF_MAX_PEER_LINKS, 10450 nla_get_u16); 10451 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshMaxRetries, mask, 10452 NL80211_MESHCONF_MAX_RETRIES, nla_get_u8); 10453 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshTTL, mask, 10454 NL80211_MESHCONF_TTL, nla_get_u8); 10455 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, element_ttl, mask, 10456 NL80211_MESHCONF_ELEMENT_TTL, nla_get_u8); 10457 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, auto_open_plinks, mask, 10458 NL80211_MESHCONF_AUTO_OPEN_PLINKS, 10459 nla_get_u8); 10460 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshNbrOffsetMaxNeighbor, 10461 mask, 10462 NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR, 10463 nla_get_u32); 10464 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPmaxPREQretries, mask, 10465 NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES, 10466 nla_get_u8); 10467 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, path_refresh_time, mask, 10468 NL80211_MESHCONF_PATH_REFRESH_TIME, 10469 nla_get_u32); 10470 if (mask & BIT(NL80211_MESHCONF_PATH_REFRESH_TIME) && 10471 (cfg->path_refresh_time < 1 || cfg->path_refresh_time > 65535)) 10472 return -EINVAL; 10473 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, min_discovery_timeout, mask, 10474 NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT, 10475 nla_get_u16); 10476 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPactivePathTimeout, 10477 mask, 10478 NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT, 10479 nla_get_u32); 10480 if (mask & BIT(NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT) && 10481 (cfg->dot11MeshHWMPactivePathTimeout < 1 || 10482 cfg->dot11MeshHWMPactivePathTimeout > 65535)) 10483 return -EINVAL; 10484 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPpreqMinInterval, mask, 10485 NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL, 10486 nla_get_u16); 10487 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPperrMinInterval, mask, 10488 NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL, 10489 nla_get_u16); 10490 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, 10491 dot11MeshHWMPnetDiameterTraversalTime, mask, 10492 NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME, 10493 nla_get_u16); 10494 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPRootMode, mask, 10495 NL80211_MESHCONF_HWMP_ROOTMODE, nla_get_u8); 10496 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPRannInterval, mask, 10497 NL80211_MESHCONF_HWMP_RANN_INTERVAL, 10498 nla_get_u16); 10499 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshGateAnnouncementProtocol, 10500 mask, NL80211_MESHCONF_GATE_ANNOUNCEMENTS, 10501 nla_get_u8); 10502 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshForwarding, mask, 10503 NL80211_MESHCONF_FORWARDING, nla_get_u8); 10504 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, rssi_threshold, mask, 10505 NL80211_MESHCONF_RSSI_THRESHOLD, 10506 nla_get_s32); 10507 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshConnectedToMeshGate, mask, 10508 NL80211_MESHCONF_CONNECTED_TO_GATE, 10509 nla_get_u8); 10510 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshConnectedToAuthServer, mask, 10511 NL80211_MESHCONF_CONNECTED_TO_AS, 10512 nla_get_u8); 10513 /* 10514 * Check HT operation mode based on 10515 * IEEE 802.11-2016 9.4.2.57 HT Operation element. 10516 */ 10517 if (tb[NL80211_MESHCONF_HT_OPMODE]) { 10518 ht_opmode = nla_get_u16(tb[NL80211_MESHCONF_HT_OPMODE]); 10519 10520 if (ht_opmode & ~(IEEE80211_HT_OP_MODE_PROTECTION | 10521 IEEE80211_HT_OP_MODE_NON_GF_STA_PRSNT | 10522 IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT)) 10523 return -EINVAL; 10524 10525 /* NON_HT_STA bit is reserved, but some programs set it */ 10526 ht_opmode &= ~IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT; 10527 10528 cfg->ht_opmode = ht_opmode; 10529 mask |= (1 << (NL80211_MESHCONF_HT_OPMODE - 1)); 10530 } 10531 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, 10532 dot11MeshHWMPactivePathToRootTimeout, mask, 10533 NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT, 10534 nla_get_u32); 10535 if (mask & BIT(NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT) && 10536 (cfg->dot11MeshHWMPactivePathToRootTimeout < 1 || 10537 cfg->dot11MeshHWMPactivePathToRootTimeout > 65535)) 10538 return -EINVAL; 10539 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMProotInterval, mask, 10540 NL80211_MESHCONF_HWMP_ROOT_INTERVAL, 10541 nla_get_u16); 10542 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPconfirmationInterval, 10543 mask, 10544 NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL, 10545 nla_get_u16); 10546 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, power_mode, mask, 10547 NL80211_MESHCONF_POWER_MODE, nla_get_u32); 10548 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshAwakeWindowDuration, mask, 10549 NL80211_MESHCONF_AWAKE_WINDOW, nla_get_u16); 10550 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, plink_timeout, mask, 10551 NL80211_MESHCONF_PLINK_TIMEOUT, nla_get_u32); 10552 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshNolearn, mask, 10553 NL80211_MESHCONF_NOLEARN, nla_get_u8); 10554 if (mask_out) 10555 *mask_out = mask; 10556 10557 return 0; 10558 10559 #undef FILL_IN_MESH_PARAM_IF_SET 10560 } 10561 10562 static int nl80211_parse_mesh_setup(struct genl_info *info, 10563 struct mesh_setup *setup) 10564 { 10565 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 10566 struct nlattr *tb[NL80211_MESH_SETUP_ATTR_MAX + 1]; 10567 10568 if (!info->attrs[NL80211_ATTR_MESH_SETUP]) 10569 return -EINVAL; 10570 if (nla_parse_nested_deprecated(tb, NL80211_MESH_SETUP_ATTR_MAX, info->attrs[NL80211_ATTR_MESH_SETUP], nl80211_mesh_setup_params_policy, info->extack)) 10571 return -EINVAL; 10572 10573 if (tb[NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC]) 10574 setup->sync_method = 10575 (nla_get_u8(tb[NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC])) ? 10576 IEEE80211_SYNC_METHOD_VENDOR : 10577 IEEE80211_SYNC_METHOD_NEIGHBOR_OFFSET; 10578 10579 if (tb[NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL]) 10580 setup->path_sel_proto = 10581 (nla_get_u8(tb[NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL])) ? 10582 IEEE80211_PATH_PROTOCOL_VENDOR : 10583 IEEE80211_PATH_PROTOCOL_HWMP; 10584 10585 if (tb[NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC]) 10586 setup->path_metric = 10587 (nla_get_u8(tb[NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC])) ? 10588 IEEE80211_PATH_METRIC_VENDOR : 10589 IEEE80211_PATH_METRIC_AIRTIME; 10590 10591 if (tb[NL80211_MESH_SETUP_IE]) { 10592 struct nlattr *ieattr = 10593 tb[NL80211_MESH_SETUP_IE]; 10594 setup->ie = nla_data(ieattr); 10595 setup->ie_len = nla_len(ieattr); 10596 } 10597 if (tb[NL80211_MESH_SETUP_USERSPACE_MPM] && 10598 !(rdev->wiphy.features & NL80211_FEATURE_USERSPACE_MPM)) 10599 return -EINVAL; 10600 setup->user_mpm = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_MPM]); 10601 setup->is_authenticated = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_AUTH]); 10602 setup->is_secure = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_AMPE]); 10603 if (setup->is_secure) 10604 setup->user_mpm = true; 10605 10606 if (tb[NL80211_MESH_SETUP_AUTH_PROTOCOL]) { 10607 if (!setup->user_mpm) 10608 return -EINVAL; 10609 setup->auth_id = 10610 nla_get_u8(tb[NL80211_MESH_SETUP_AUTH_PROTOCOL]); 10611 } 10612 10613 return 0; 10614 } 10615 10616 static int nl80211_update_mesh_config(struct sk_buff *skb, 10617 struct genl_info *info) 10618 { 10619 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 10620 struct net_device *dev = info->user_ptr[1]; 10621 struct wireless_dev *wdev = dev->ieee80211_ptr; 10622 struct mesh_config cfg = {}; 10623 u32 mask; 10624 int err; 10625 10626 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) 10627 return -EOPNOTSUPP; 10628 10629 if (!rdev->ops->update_mesh_config) 10630 return -EOPNOTSUPP; 10631 10632 err = nl80211_parse_mesh_config(info, &cfg, &mask); 10633 if (err) 10634 return err; 10635 10636 if (!wdev->u.mesh.id_len) 10637 err = -ENOLINK; 10638 10639 if (!err) 10640 err = rdev_update_mesh_config(rdev, dev, mask, &cfg); 10641 10642 return err; 10643 } 10644 10645 static int nl80211_put_regdom(const struct ieee80211_regdomain *regdom, 10646 struct sk_buff *msg) 10647 { 10648 struct nlattr *nl_reg_rules; 10649 unsigned int i; 10650 10651 if (nla_put_string(msg, NL80211_ATTR_REG_ALPHA2, regdom->alpha2) || 10652 (regdom->dfs_region && 10653 nla_put_u8(msg, NL80211_ATTR_DFS_REGION, regdom->dfs_region))) 10654 goto nla_put_failure; 10655 10656 nl_reg_rules = nla_nest_start_noflag(msg, NL80211_ATTR_REG_RULES); 10657 if (!nl_reg_rules) 10658 goto nla_put_failure; 10659 10660 for (i = 0; i < regdom->n_reg_rules; i++) { 10661 struct nlattr *nl_reg_rule; 10662 const struct ieee80211_reg_rule *reg_rule; 10663 const struct ieee80211_freq_range *freq_range; 10664 const struct ieee80211_power_rule *power_rule; 10665 unsigned int max_bandwidth_khz; 10666 10667 reg_rule = ®dom->reg_rules[i]; 10668 freq_range = ®_rule->freq_range; 10669 power_rule = ®_rule->power_rule; 10670 10671 nl_reg_rule = nla_nest_start_noflag(msg, i); 10672 if (!nl_reg_rule) 10673 goto nla_put_failure; 10674 10675 max_bandwidth_khz = freq_range->max_bandwidth_khz; 10676 if (!max_bandwidth_khz) 10677 max_bandwidth_khz = reg_get_max_bandwidth(regdom, 10678 reg_rule); 10679 10680 if (nla_put_u32(msg, NL80211_ATTR_REG_RULE_FLAGS, 10681 reg_rule->flags) || 10682 nla_put_u32(msg, NL80211_ATTR_FREQ_RANGE_START, 10683 freq_range->start_freq_khz) || 10684 nla_put_u32(msg, NL80211_ATTR_FREQ_RANGE_END, 10685 freq_range->end_freq_khz) || 10686 nla_put_u32(msg, NL80211_ATTR_FREQ_RANGE_MAX_BW, 10687 max_bandwidth_khz) || 10688 nla_put_u32(msg, NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN, 10689 power_rule->max_antenna_gain) || 10690 nla_put_u32(msg, NL80211_ATTR_POWER_RULE_MAX_EIRP, 10691 power_rule->max_eirp) || 10692 nla_put_u32(msg, NL80211_ATTR_DFS_CAC_TIME, 10693 reg_rule->dfs_cac_ms)) 10694 goto nla_put_failure; 10695 10696 if ((reg_rule->flags & NL80211_RRF_PSD) && 10697 nla_put_s8(msg, NL80211_ATTR_POWER_RULE_PSD, 10698 reg_rule->psd)) 10699 goto nla_put_failure; 10700 10701 nla_nest_end(msg, nl_reg_rule); 10702 } 10703 10704 nla_nest_end(msg, nl_reg_rules); 10705 return 0; 10706 10707 nla_put_failure: 10708 return -EMSGSIZE; 10709 } 10710 10711 static int nl80211_get_reg_do(struct sk_buff *skb, struct genl_info *info) 10712 { 10713 const struct ieee80211_regdomain *regdom = NULL; 10714 struct cfg80211_registered_device *rdev; 10715 struct wiphy *wiphy = NULL; 10716 struct sk_buff *msg; 10717 int err = -EMSGSIZE; 10718 void *hdr; 10719 10720 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 10721 if (!msg) 10722 return -ENOBUFS; 10723 10724 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 10725 NL80211_CMD_GET_REG); 10726 if (!hdr) 10727 goto put_failure; 10728 10729 rtnl_lock(); 10730 10731 if (info->attrs[NL80211_ATTR_WIPHY]) { 10732 bool self_managed; 10733 10734 rdev = cfg80211_get_dev_from_info(genl_info_net(info), info); 10735 if (IS_ERR(rdev)) { 10736 err = PTR_ERR(rdev); 10737 goto nla_put_failure; 10738 } 10739 10740 wiphy = &rdev->wiphy; 10741 self_managed = wiphy->regulatory_flags & 10742 REGULATORY_WIPHY_SELF_MANAGED; 10743 10744 rcu_read_lock(); 10745 10746 regdom = get_wiphy_regdom(wiphy); 10747 10748 /* a self-managed-reg device must have a private regdom */ 10749 if (WARN_ON(!regdom && self_managed)) { 10750 err = -EINVAL; 10751 goto nla_put_failure_rcu; 10752 } 10753 10754 if (regdom && 10755 nla_put_u32(msg, NL80211_ATTR_WIPHY, get_wiphy_idx(wiphy))) 10756 goto nla_put_failure_rcu; 10757 } else { 10758 rcu_read_lock(); 10759 } 10760 10761 if (!wiphy && reg_last_request_cell_base() && 10762 nla_put_u32(msg, NL80211_ATTR_USER_REG_HINT_TYPE, 10763 NL80211_USER_REG_HINT_CELL_BASE)) 10764 goto nla_put_failure_rcu; 10765 10766 if (!regdom) 10767 regdom = rcu_dereference(cfg80211_regdomain); 10768 10769 if (nl80211_put_regdom(regdom, msg)) 10770 goto nla_put_failure_rcu; 10771 10772 rcu_read_unlock(); 10773 10774 genlmsg_end(msg, hdr); 10775 rtnl_unlock(); 10776 return genlmsg_reply(msg, info); 10777 10778 nla_put_failure_rcu: 10779 rcu_read_unlock(); 10780 nla_put_failure: 10781 rtnl_unlock(); 10782 put_failure: 10783 nlmsg_free(msg); 10784 return err; 10785 } 10786 10787 static int nl80211_send_regdom(struct sk_buff *msg, struct netlink_callback *cb, 10788 u32 seq, int flags, struct wiphy *wiphy, 10789 const struct ieee80211_regdomain *regdom) 10790 { 10791 void *hdr = nl80211hdr_put(msg, NETLINK_CB(cb->skb).portid, seq, flags, 10792 NL80211_CMD_GET_REG); 10793 10794 if (!hdr) 10795 return -1; 10796 10797 genl_dump_check_consistent(cb, hdr); 10798 10799 if (nl80211_put_regdom(regdom, msg)) 10800 goto nla_put_failure; 10801 10802 if (!wiphy && reg_last_request_cell_base() && 10803 nla_put_u32(msg, NL80211_ATTR_USER_REG_HINT_TYPE, 10804 NL80211_USER_REG_HINT_CELL_BASE)) 10805 goto nla_put_failure; 10806 10807 if (wiphy && 10808 nla_put_u32(msg, NL80211_ATTR_WIPHY, get_wiphy_idx(wiphy))) 10809 goto nla_put_failure; 10810 10811 if (wiphy && wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED && 10812 nla_put_flag(msg, NL80211_ATTR_WIPHY_SELF_MANAGED_REG)) 10813 goto nla_put_failure; 10814 10815 genlmsg_end(msg, hdr); 10816 return 0; 10817 10818 nla_put_failure: 10819 genlmsg_cancel(msg, hdr); 10820 return -EMSGSIZE; 10821 } 10822 10823 static int nl80211_get_reg_dump(struct sk_buff *skb, 10824 struct netlink_callback *cb) 10825 { 10826 const struct ieee80211_regdomain *regdom = NULL; 10827 struct cfg80211_registered_device *rdev; 10828 int err, reg_idx, start = cb->args[2]; 10829 10830 rcu_read_lock(); 10831 10832 if (cfg80211_regdomain && start == 0) { 10833 err = nl80211_send_regdom(skb, cb, cb->nlh->nlmsg_seq, 10834 NLM_F_MULTI, NULL, 10835 rcu_dereference(cfg80211_regdomain)); 10836 if (err < 0) 10837 goto out_err; 10838 } 10839 10840 /* the global regdom is idx 0 */ 10841 reg_idx = 1; 10842 list_for_each_entry_rcu(rdev, &cfg80211_rdev_list, list) { 10843 regdom = get_wiphy_regdom(&rdev->wiphy); 10844 if (!regdom) 10845 continue; 10846 10847 if (++reg_idx <= start) 10848 continue; 10849 10850 err = nl80211_send_regdom(skb, cb, cb->nlh->nlmsg_seq, 10851 NLM_F_MULTI, &rdev->wiphy, regdom); 10852 if (err < 0) { 10853 reg_idx--; 10854 break; 10855 } 10856 } 10857 10858 cb->args[2] = reg_idx; 10859 err = skb->len; 10860 out_err: 10861 rcu_read_unlock(); 10862 return err; 10863 } 10864 10865 #ifdef CONFIG_CFG80211_CRDA_SUPPORT 10866 static const struct nla_policy reg_rule_policy[NL80211_REG_RULE_ATTR_MAX + 1] = { 10867 [NL80211_ATTR_REG_RULE_FLAGS] = { .type = NLA_U32 }, 10868 [NL80211_ATTR_FREQ_RANGE_START] = { .type = NLA_U32 }, 10869 [NL80211_ATTR_FREQ_RANGE_END] = { .type = NLA_U32 }, 10870 [NL80211_ATTR_FREQ_RANGE_MAX_BW] = { .type = NLA_U32 }, 10871 [NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN] = { .type = NLA_U32 }, 10872 [NL80211_ATTR_POWER_RULE_MAX_EIRP] = { .type = NLA_U32 }, 10873 [NL80211_ATTR_DFS_CAC_TIME] = { .type = NLA_U32 }, 10874 }; 10875 10876 static int parse_reg_rule(struct nlattr *tb[], 10877 struct ieee80211_reg_rule *reg_rule) 10878 { 10879 struct ieee80211_freq_range *freq_range = ®_rule->freq_range; 10880 struct ieee80211_power_rule *power_rule = ®_rule->power_rule; 10881 10882 if (!tb[NL80211_ATTR_REG_RULE_FLAGS]) 10883 return -EINVAL; 10884 if (!tb[NL80211_ATTR_FREQ_RANGE_START]) 10885 return -EINVAL; 10886 if (!tb[NL80211_ATTR_FREQ_RANGE_END]) 10887 return -EINVAL; 10888 if (!tb[NL80211_ATTR_FREQ_RANGE_MAX_BW]) 10889 return -EINVAL; 10890 if (!tb[NL80211_ATTR_POWER_RULE_MAX_EIRP]) 10891 return -EINVAL; 10892 10893 reg_rule->flags = nla_get_u32(tb[NL80211_ATTR_REG_RULE_FLAGS]); 10894 10895 freq_range->start_freq_khz = 10896 nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_START]); 10897 freq_range->end_freq_khz = 10898 nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_END]); 10899 freq_range->max_bandwidth_khz = 10900 nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_MAX_BW]); 10901 10902 power_rule->max_eirp = 10903 nla_get_u32(tb[NL80211_ATTR_POWER_RULE_MAX_EIRP]); 10904 10905 if (tb[NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN]) 10906 power_rule->max_antenna_gain = 10907 nla_get_u32(tb[NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN]); 10908 10909 if (tb[NL80211_ATTR_DFS_CAC_TIME]) 10910 reg_rule->dfs_cac_ms = 10911 nla_get_u32(tb[NL80211_ATTR_DFS_CAC_TIME]); 10912 10913 return 0; 10914 } 10915 10916 static int nl80211_set_reg(struct sk_buff *skb, struct genl_info *info) 10917 { 10918 struct nlattr *tb[NL80211_REG_RULE_ATTR_MAX + 1]; 10919 struct nlattr *nl_reg_rule; 10920 char *alpha2; 10921 int rem_reg_rules, r; 10922 u32 num_rules = 0, rule_idx = 0; 10923 enum nl80211_dfs_regions dfs_region = NL80211_DFS_UNSET; 10924 struct ieee80211_regdomain *rd; 10925 10926 if (!info->attrs[NL80211_ATTR_REG_ALPHA2]) 10927 return -EINVAL; 10928 10929 if (!info->attrs[NL80211_ATTR_REG_RULES]) 10930 return -EINVAL; 10931 10932 alpha2 = nla_data(info->attrs[NL80211_ATTR_REG_ALPHA2]); 10933 10934 if (info->attrs[NL80211_ATTR_DFS_REGION]) 10935 dfs_region = nla_get_u8(info->attrs[NL80211_ATTR_DFS_REGION]); 10936 10937 nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES], 10938 rem_reg_rules) { 10939 num_rules++; 10940 if (num_rules > NL80211_MAX_SUPP_REG_RULES) 10941 return -EINVAL; 10942 } 10943 10944 rtnl_lock(); 10945 if (!reg_is_valid_request(alpha2)) { 10946 r = -EINVAL; 10947 goto out; 10948 } 10949 10950 rd = kzalloc_flex(*rd, reg_rules, num_rules); 10951 if (!rd) { 10952 r = -ENOMEM; 10953 goto out; 10954 } 10955 10956 rd->n_reg_rules = num_rules; 10957 rd->alpha2[0] = alpha2[0]; 10958 rd->alpha2[1] = alpha2[1]; 10959 10960 /* 10961 * Disable DFS master mode if the DFS region was 10962 * not supported or known on this kernel. 10963 */ 10964 if (reg_supported_dfs_region(dfs_region)) 10965 rd->dfs_region = dfs_region; 10966 10967 nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES], 10968 rem_reg_rules) { 10969 r = nla_parse_nested_deprecated(tb, NL80211_REG_RULE_ATTR_MAX, 10970 nl_reg_rule, reg_rule_policy, 10971 info->extack); 10972 if (r) 10973 goto bad_reg; 10974 r = parse_reg_rule(tb, &rd->reg_rules[rule_idx]); 10975 if (r) 10976 goto bad_reg; 10977 10978 rule_idx++; 10979 10980 if (rule_idx > NL80211_MAX_SUPP_REG_RULES) { 10981 r = -EINVAL; 10982 goto bad_reg; 10983 } 10984 } 10985 10986 r = set_regdom(rd, REGD_SOURCE_CRDA); 10987 /* set_regdom takes ownership of rd */ 10988 rd = NULL; 10989 bad_reg: 10990 kfree(rd); 10991 out: 10992 rtnl_unlock(); 10993 return r; 10994 } 10995 #endif /* CONFIG_CFG80211_CRDA_SUPPORT */ 10996 10997 static int validate_scan_freqs(struct nlattr *freqs) 10998 { 10999 struct nlattr *attr1, *attr2; 11000 int n_channels = 0, tmp1, tmp2; 11001 11002 nla_for_each_nested(attr1, freqs, tmp1) 11003 if (nla_len(attr1) != sizeof(u32)) 11004 return 0; 11005 11006 nla_for_each_nested(attr1, freqs, tmp1) { 11007 n_channels++; 11008 /* 11009 * Some hardware has a limited channel list for 11010 * scanning, and it is pretty much nonsensical 11011 * to scan for a channel twice, so disallow that 11012 * and don't require drivers to check that the 11013 * channel list they get isn't longer than what 11014 * they can scan, as long as they can scan all 11015 * the channels they registered at once. 11016 */ 11017 nla_for_each_nested(attr2, freqs, tmp2) 11018 if (attr1 != attr2 && 11019 nla_get_u32(attr1) == nla_get_u32(attr2)) 11020 return 0; 11021 } 11022 11023 return n_channels; 11024 } 11025 11026 static bool is_band_valid(struct wiphy *wiphy, enum nl80211_band b) 11027 { 11028 return b < NUM_NL80211_BANDS && wiphy->bands[b]; 11029 } 11030 11031 static int parse_bss_select(struct nlattr *nla, struct wiphy *wiphy, 11032 struct cfg80211_bss_selection *bss_select) 11033 { 11034 struct nlattr *attr[NL80211_BSS_SELECT_ATTR_MAX + 1]; 11035 struct nlattr *nest; 11036 int err; 11037 bool found = false; 11038 int i; 11039 11040 /* only process one nested attribute */ 11041 nest = nla_data(nla); 11042 if (!nla_ok(nest, nla_len(nest))) 11043 return -EINVAL; 11044 11045 err = nla_parse_nested_deprecated(attr, NL80211_BSS_SELECT_ATTR_MAX, 11046 nest, nl80211_bss_select_policy, 11047 NULL); 11048 if (err) 11049 return err; 11050 11051 /* only one attribute may be given */ 11052 for (i = 0; i <= NL80211_BSS_SELECT_ATTR_MAX; i++) { 11053 if (attr[i]) { 11054 if (found) 11055 return -EINVAL; 11056 found = true; 11057 } 11058 } 11059 11060 bss_select->behaviour = __NL80211_BSS_SELECT_ATTR_INVALID; 11061 11062 if (attr[NL80211_BSS_SELECT_ATTR_RSSI]) 11063 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_RSSI; 11064 11065 if (attr[NL80211_BSS_SELECT_ATTR_BAND_PREF]) { 11066 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_BAND_PREF; 11067 bss_select->param.band_pref = 11068 nla_get_u32(attr[NL80211_BSS_SELECT_ATTR_BAND_PREF]); 11069 if (!is_band_valid(wiphy, bss_select->param.band_pref)) 11070 return -EINVAL; 11071 } 11072 11073 if (attr[NL80211_BSS_SELECT_ATTR_RSSI_ADJUST]) { 11074 struct nl80211_bss_select_rssi_adjust *adj_param; 11075 11076 adj_param = nla_data(attr[NL80211_BSS_SELECT_ATTR_RSSI_ADJUST]); 11077 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_RSSI_ADJUST; 11078 bss_select->param.adjust.band = adj_param->band; 11079 bss_select->param.adjust.delta = adj_param->delta; 11080 if (!is_band_valid(wiphy, bss_select->param.adjust.band)) 11081 return -EINVAL; 11082 } 11083 11084 /* user-space did not provide behaviour attribute */ 11085 if (bss_select->behaviour == __NL80211_BSS_SELECT_ATTR_INVALID) 11086 return -EINVAL; 11087 11088 if (!(wiphy->bss_select_support & BIT(bss_select->behaviour))) 11089 return -EINVAL; 11090 11091 return 0; 11092 } 11093 11094 int nl80211_parse_random_mac(struct nlattr **attrs, 11095 u8 *mac_addr, u8 *mac_addr_mask) 11096 { 11097 int i; 11098 11099 if (!attrs[NL80211_ATTR_MAC] && !attrs[NL80211_ATTR_MAC_MASK]) { 11100 eth_zero_addr(mac_addr); 11101 eth_zero_addr(mac_addr_mask); 11102 mac_addr[0] = 0x2; 11103 mac_addr_mask[0] = 0x3; 11104 11105 return 0; 11106 } 11107 11108 /* need both or none */ 11109 if (!attrs[NL80211_ATTR_MAC] || !attrs[NL80211_ATTR_MAC_MASK]) 11110 return -EINVAL; 11111 11112 memcpy(mac_addr, nla_data(attrs[NL80211_ATTR_MAC]), ETH_ALEN); 11113 memcpy(mac_addr_mask, nla_data(attrs[NL80211_ATTR_MAC_MASK]), ETH_ALEN); 11114 11115 /* don't allow or configure an mcast address */ 11116 if (!is_multicast_ether_addr(mac_addr_mask) || 11117 is_multicast_ether_addr(mac_addr)) 11118 return -EINVAL; 11119 11120 /* 11121 * allow users to pass a MAC address that has bits set outside 11122 * of the mask, but don't bother drivers with having to deal 11123 * with such bits 11124 */ 11125 for (i = 0; i < ETH_ALEN; i++) 11126 mac_addr[i] &= mac_addr_mask[i]; 11127 11128 return 0; 11129 } 11130 11131 static bool cfg80211_off_channel_oper_allowed(struct wireless_dev *wdev, 11132 struct ieee80211_channel *chan) 11133 { 11134 unsigned int link_id; 11135 bool all_ok = true; 11136 int radio_idx; 11137 11138 lockdep_assert_wiphy(wdev->wiphy); 11139 11140 if (!cfg80211_wdev_channel_allowed(wdev, chan)) 11141 return false; 11142 11143 if (!cfg80211_beaconing_iface_active(wdev)) 11144 return true; 11145 11146 radio_idx = cfg80211_get_radio_idx_by_chan(wdev->wiphy, chan); 11147 11148 /* 11149 * FIXME: check if we have a free radio/link for chan 11150 * 11151 * This, as well as the FIXME below, requires knowing the link 11152 * capabilities of the hardware. 11153 */ 11154 11155 /* we cannot leave radar channels */ 11156 for_each_valid_link(wdev, link_id) { 11157 struct cfg80211_chan_def *chandef; 11158 int link_radio_idx; 11159 11160 chandef = wdev_chandef(wdev, link_id); 11161 if (!chandef || !chandef->chan) 11162 continue; 11163 11164 if (!(chandef->chan->flags & IEEE80211_CHAN_RADAR)) 11165 continue; 11166 11167 /* 11168 * chandef->chan is a radar channel. If the radio/link onto 11169 * which this radar channel falls is the same radio/link onto 11170 * which the input 'chan' falls, off-channel operation should 11171 * not be allowed. Hence, set 'all_ok' to false. 11172 */ 11173 11174 link_radio_idx = cfg80211_get_radio_idx_by_chan(wdev->wiphy, 11175 chandef->chan); 11176 if (link_radio_idx == radio_idx) { 11177 all_ok = false; 11178 break; 11179 } 11180 } 11181 11182 if (all_ok) 11183 return true; 11184 11185 return regulatory_pre_cac_allowed(wdev->wiphy); 11186 } 11187 11188 static bool nl80211_check_scan_feat(struct wiphy *wiphy, u32 flags, u32 flag, 11189 enum nl80211_ext_feature_index feat) 11190 { 11191 if (!(flags & flag)) 11192 return true; 11193 if (wiphy_ext_feature_isset(wiphy, feat)) 11194 return true; 11195 return false; 11196 } 11197 11198 static int 11199 nl80211_check_scan_flags(struct wiphy *wiphy, struct wireless_dev *wdev, 11200 struct nlattr **attrs, u8 *mac_addr, u8 *mac_addr_mask, 11201 u32 *flags, enum nl80211_feature_flags randomness_flag) 11202 { 11203 if (!attrs[NL80211_ATTR_SCAN_FLAGS]) 11204 return 0; 11205 11206 *flags = nla_get_u32(attrs[NL80211_ATTR_SCAN_FLAGS]); 11207 11208 if (((*flags & NL80211_SCAN_FLAG_LOW_PRIORITY) && 11209 !(wiphy->features & NL80211_FEATURE_LOW_PRIORITY_SCAN)) || 11210 !nl80211_check_scan_feat(wiphy, *flags, 11211 NL80211_SCAN_FLAG_LOW_SPAN, 11212 NL80211_EXT_FEATURE_LOW_SPAN_SCAN) || 11213 !nl80211_check_scan_feat(wiphy, *flags, 11214 NL80211_SCAN_FLAG_LOW_POWER, 11215 NL80211_EXT_FEATURE_LOW_POWER_SCAN) || 11216 !nl80211_check_scan_feat(wiphy, *flags, 11217 NL80211_SCAN_FLAG_HIGH_ACCURACY, 11218 NL80211_EXT_FEATURE_HIGH_ACCURACY_SCAN) || 11219 !nl80211_check_scan_feat(wiphy, *flags, 11220 NL80211_SCAN_FLAG_FILS_MAX_CHANNEL_TIME, 11221 NL80211_EXT_FEATURE_FILS_MAX_CHANNEL_TIME) || 11222 !nl80211_check_scan_feat(wiphy, *flags, 11223 NL80211_SCAN_FLAG_ACCEPT_BCAST_PROBE_RESP, 11224 NL80211_EXT_FEATURE_ACCEPT_BCAST_PROBE_RESP) || 11225 !nl80211_check_scan_feat(wiphy, *flags, 11226 NL80211_SCAN_FLAG_OCE_PROBE_REQ_DEFERRAL_SUPPRESSION, 11227 NL80211_EXT_FEATURE_OCE_PROBE_REQ_DEFERRAL_SUPPRESSION) || 11228 !nl80211_check_scan_feat(wiphy, *flags, 11229 NL80211_SCAN_FLAG_OCE_PROBE_REQ_HIGH_TX_RATE, 11230 NL80211_EXT_FEATURE_OCE_PROBE_REQ_HIGH_TX_RATE) || 11231 !nl80211_check_scan_feat(wiphy, *flags, 11232 NL80211_SCAN_FLAG_RANDOM_SN, 11233 NL80211_EXT_FEATURE_SCAN_RANDOM_SN) || 11234 !nl80211_check_scan_feat(wiphy, *flags, 11235 NL80211_SCAN_FLAG_MIN_PREQ_CONTENT, 11236 NL80211_EXT_FEATURE_SCAN_MIN_PREQ_CONTENT)) 11237 return -EOPNOTSUPP; 11238 11239 if (*flags & NL80211_SCAN_FLAG_RANDOM_ADDR) { 11240 int err; 11241 11242 if (!(wiphy->features & randomness_flag) || 11243 (wdev && wdev->connected)) 11244 return -EOPNOTSUPP; 11245 11246 err = nl80211_parse_random_mac(attrs, mac_addr, mac_addr_mask); 11247 if (err) 11248 return err; 11249 } 11250 11251 return 0; 11252 } 11253 11254 static int 11255 nl80211_check_scan_flags_sched(struct wiphy *wiphy, struct wireless_dev *wdev, 11256 struct nlattr **attrs, 11257 struct cfg80211_sched_scan_request *req) 11258 { 11259 return nl80211_check_scan_flags(wiphy, wdev, attrs, 11260 req->mac_addr, req->mac_addr_mask, 11261 &req->flags, 11262 wdev ? NL80211_FEATURE_SCHED_SCAN_RANDOM_MAC_ADDR : 11263 NL80211_FEATURE_ND_RANDOM_MAC_ADDR); 11264 } 11265 11266 static int 11267 nl80211_check_scan_flags_reg(struct wiphy *wiphy, struct wireless_dev *wdev, 11268 struct nlattr **attrs, 11269 struct cfg80211_scan_request_int *req) 11270 { 11271 return nl80211_check_scan_flags(wiphy, wdev, attrs, 11272 req->req.mac_addr, 11273 req->req.mac_addr_mask, 11274 &req->req.flags, 11275 NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR); 11276 } 11277 11278 static int nl80211_trigger_scan(struct sk_buff *skb, struct genl_info *info) 11279 { 11280 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 11281 struct wireless_dev *wdev = info->user_ptr[1]; 11282 struct cfg80211_scan_request_int *request; 11283 struct nlattr *scan_freqs = NULL; 11284 bool scan_freqs_khz = false; 11285 struct nlattr *attr; 11286 struct wiphy *wiphy; 11287 int err, tmp, n_ssids = 0, n_channels, i; 11288 size_t ie_len, size; 11289 size_t ssids_offset, ie_offset; 11290 11291 wiphy = &rdev->wiphy; 11292 11293 if (wdev->iftype == NL80211_IFTYPE_NAN || 11294 wdev->iftype == NL80211_IFTYPE_PD) 11295 return -EOPNOTSUPP; 11296 11297 if (!rdev->ops->scan) 11298 return -EOPNOTSUPP; 11299 11300 if (rdev->scan_req || rdev->scan_msg) 11301 return -EBUSY; 11302 11303 if (info->attrs[NL80211_ATTR_SCAN_FREQ_KHZ]) { 11304 if (!wiphy_ext_feature_isset(wiphy, 11305 NL80211_EXT_FEATURE_SCAN_FREQ_KHZ)) 11306 return -EOPNOTSUPP; 11307 scan_freqs = info->attrs[NL80211_ATTR_SCAN_FREQ_KHZ]; 11308 scan_freqs_khz = true; 11309 } else if (info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]) 11310 scan_freqs = info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]; 11311 11312 if (scan_freqs) { 11313 n_channels = validate_scan_freqs(scan_freqs); 11314 if (!n_channels) 11315 return -EINVAL; 11316 } else { 11317 n_channels = ieee80211_get_num_supported_channels(wiphy); 11318 } 11319 11320 if (info->attrs[NL80211_ATTR_SCAN_SSIDS]) 11321 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp) 11322 n_ssids++; 11323 11324 if (n_ssids > wiphy->max_scan_ssids) 11325 return -EINVAL; 11326 11327 if (info->attrs[NL80211_ATTR_IE]) 11328 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 11329 else 11330 ie_len = 0; 11331 11332 if (ie_len > wiphy->max_scan_ie_len) 11333 return -EINVAL; 11334 11335 size = struct_size(request, req.channels, n_channels); 11336 ssids_offset = size; 11337 size = size_add(size, array_size(sizeof(*request->req.ssids), n_ssids)); 11338 ie_offset = size; 11339 size = size_add(size, ie_len); 11340 request = kzalloc(size, GFP_KERNEL); 11341 if (!request) 11342 return -ENOMEM; 11343 11344 if (n_ssids) 11345 request->req.ssids = (void *)request + ssids_offset; 11346 request->req.n_ssids = n_ssids; 11347 if (ie_len) 11348 request->req.ie = (void *)request + ie_offset; 11349 11350 i = 0; 11351 if (scan_freqs) { 11352 /* user specified, bail out if channel not found */ 11353 nla_for_each_nested(attr, scan_freqs, tmp) { 11354 struct ieee80211_channel *chan; 11355 int freq = nla_get_u32(attr); 11356 11357 if (!scan_freqs_khz) 11358 freq = MHZ_TO_KHZ(freq); 11359 11360 chan = ieee80211_get_channel_khz(wiphy, freq); 11361 if (!chan) { 11362 err = -EINVAL; 11363 goto out_free; 11364 } 11365 11366 /* Ignore disabled / no primary channels */ 11367 if (chan->flags & IEEE80211_CHAN_DISABLED || 11368 chan->flags & IEEE80211_CHAN_S1G_NO_PRIMARY || 11369 !cfg80211_wdev_channel_allowed(wdev, chan)) 11370 continue; 11371 11372 request->req.channels[i] = chan; 11373 i++; 11374 } 11375 } else { 11376 enum nl80211_band band; 11377 11378 /* all channels */ 11379 for (band = 0; band < NUM_NL80211_BANDS; band++) { 11380 int j; 11381 11382 if (!wiphy->bands[band]) 11383 continue; 11384 for (j = 0; j < wiphy->bands[band]->n_channels; j++) { 11385 struct ieee80211_channel *chan; 11386 11387 chan = &wiphy->bands[band]->channels[j]; 11388 11389 if (chan->flags & IEEE80211_CHAN_DISABLED || 11390 chan->flags & 11391 IEEE80211_CHAN_S1G_NO_PRIMARY || 11392 !cfg80211_wdev_channel_allowed(wdev, chan)) 11393 continue; 11394 11395 request->req.channels[i] = chan; 11396 i++; 11397 } 11398 } 11399 } 11400 11401 if (!i) { 11402 err = -EINVAL; 11403 goto out_free; 11404 } 11405 11406 request->req.n_channels = i; 11407 11408 for (i = 0; i < request->req.n_channels; i++) { 11409 struct ieee80211_channel *chan = request->req.channels[i]; 11410 11411 /* if we can go off-channel to the target channel we're good */ 11412 if (cfg80211_off_channel_oper_allowed(wdev, chan)) 11413 continue; 11414 11415 if (!cfg80211_wdev_on_sub_chan(wdev, chan, true)) { 11416 err = -EBUSY; 11417 goto out_free; 11418 } 11419 } 11420 11421 i = 0; 11422 if (n_ssids) { 11423 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp) { 11424 if (nla_len(attr) > IEEE80211_MAX_SSID_LEN) { 11425 err = -EINVAL; 11426 goto out_free; 11427 } 11428 request->req.ssids[i].ssid_len = nla_len(attr); 11429 memcpy(request->req.ssids[i].ssid, 11430 nla_data(attr), nla_len(attr)); 11431 i++; 11432 } 11433 } 11434 11435 if (info->attrs[NL80211_ATTR_IE]) { 11436 request->req.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 11437 memcpy((void *)request->req.ie, 11438 nla_data(info->attrs[NL80211_ATTR_IE]), 11439 request->req.ie_len); 11440 } 11441 11442 for (i = 0; i < NUM_NL80211_BANDS; i++) 11443 if (wiphy->bands[i]) 11444 request->req.rates[i] = 11445 (1 << wiphy->bands[i]->n_bitrates) - 1; 11446 11447 if (info->attrs[NL80211_ATTR_SCAN_SUPP_RATES]) { 11448 nla_for_each_nested(attr, 11449 info->attrs[NL80211_ATTR_SCAN_SUPP_RATES], 11450 tmp) { 11451 int band = nla_type(attr); 11452 11453 if (band < 0 || band >= NUM_NL80211_BANDS) { 11454 err = -EINVAL; 11455 goto out_free; 11456 } 11457 11458 if (!wiphy->bands[band]) 11459 continue; 11460 11461 err = ieee80211_get_ratemask(wiphy->bands[band], 11462 nla_data(attr), 11463 nla_len(attr), 11464 &request->req.rates[band]); 11465 if (err) 11466 goto out_free; 11467 } 11468 } 11469 11470 if (info->attrs[NL80211_ATTR_MEASUREMENT_DURATION]) { 11471 request->req.duration = 11472 nla_get_u16(info->attrs[NL80211_ATTR_MEASUREMENT_DURATION]); 11473 request->req.duration_mandatory = 11474 nla_get_flag(info->attrs[NL80211_ATTR_MEASUREMENT_DURATION_MANDATORY]); 11475 } 11476 11477 err = nl80211_check_scan_flags_reg(wiphy, wdev, info->attrs, request); 11478 if (err) 11479 goto out_free; 11480 11481 request->req.no_cck = 11482 nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]); 11483 11484 /* Initial implementation used NL80211_ATTR_MAC to set the specific 11485 * BSSID to scan for. This was problematic because that same attribute 11486 * was already used for another purpose (local random MAC address). The 11487 * NL80211_ATTR_BSSID attribute was added to fix this. For backwards 11488 * compatibility with older userspace components, also use the 11489 * NL80211_ATTR_MAC value here if it can be determined to be used for 11490 * the specific BSSID use case instead of the random MAC address 11491 * (NL80211_ATTR_SCAN_FLAGS is used to enable random MAC address use). 11492 */ 11493 if (info->attrs[NL80211_ATTR_BSSID]) 11494 memcpy(request->req.bssid, 11495 nla_data(info->attrs[NL80211_ATTR_BSSID]), ETH_ALEN); 11496 else if (!(request->req.flags & NL80211_SCAN_FLAG_RANDOM_ADDR) && 11497 info->attrs[NL80211_ATTR_MAC]) 11498 memcpy(request->req.bssid, 11499 nla_data(info->attrs[NL80211_ATTR_MAC]), 11500 ETH_ALEN); 11501 else 11502 eth_broadcast_addr(request->req.bssid); 11503 11504 request->req.tsf_report_link_id = 11505 nl80211_link_id_or_invalid(info->attrs); 11506 request->req.wdev = wdev; 11507 request->req.wiphy = &rdev->wiphy; 11508 request->req.scan_start = jiffies; 11509 11510 rdev->scan_req = request; 11511 err = cfg80211_scan(rdev); 11512 11513 if (err) 11514 goto out_free; 11515 11516 nl80211_send_scan_start(rdev, wdev); 11517 dev_hold(wdev->netdev); 11518 11519 return 0; 11520 11521 out_free: 11522 rdev->scan_req = NULL; 11523 kfree(request); 11524 11525 return err; 11526 } 11527 11528 static int nl80211_abort_scan(struct sk_buff *skb, struct genl_info *info) 11529 { 11530 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 11531 struct wireless_dev *wdev = info->user_ptr[1]; 11532 11533 if (!rdev->ops->abort_scan) 11534 return -EOPNOTSUPP; 11535 11536 if (rdev->scan_msg) 11537 return 0; 11538 11539 if (!rdev->scan_req) 11540 return -ENOENT; 11541 11542 rdev_abort_scan(rdev, wdev); 11543 return 0; 11544 } 11545 11546 static int 11547 nl80211_parse_sched_scan_plans(struct wiphy *wiphy, int n_plans, 11548 struct cfg80211_sched_scan_request *request, 11549 struct nlattr **attrs) 11550 { 11551 int tmp, err, i = 0; 11552 struct nlattr *attr; 11553 11554 if (!attrs[NL80211_ATTR_SCHED_SCAN_PLANS]) { 11555 u32 interval; 11556 11557 /* 11558 * If scan plans are not specified, 11559 * %NL80211_ATTR_SCHED_SCAN_INTERVAL will be specified. In this 11560 * case one scan plan will be set with the specified scan 11561 * interval and infinite number of iterations. 11562 */ 11563 interval = nla_get_u32(attrs[NL80211_ATTR_SCHED_SCAN_INTERVAL]); 11564 if (!interval) 11565 return -EINVAL; 11566 11567 request->scan_plans[0].interval = 11568 DIV_ROUND_UP(interval, MSEC_PER_SEC); 11569 if (!request->scan_plans[0].interval) 11570 return -EINVAL; 11571 11572 if (request->scan_plans[0].interval > 11573 wiphy->max_sched_scan_plan_interval) 11574 request->scan_plans[0].interval = 11575 wiphy->max_sched_scan_plan_interval; 11576 11577 return 0; 11578 } 11579 11580 nla_for_each_nested(attr, attrs[NL80211_ATTR_SCHED_SCAN_PLANS], tmp) { 11581 struct nlattr *plan[NL80211_SCHED_SCAN_PLAN_MAX + 1]; 11582 11583 if (WARN_ON(i >= n_plans)) 11584 return -EINVAL; 11585 11586 err = nla_parse_nested_deprecated(plan, 11587 NL80211_SCHED_SCAN_PLAN_MAX, 11588 attr, nl80211_plan_policy, 11589 NULL); 11590 if (err) 11591 return err; 11592 11593 if (!plan[NL80211_SCHED_SCAN_PLAN_INTERVAL]) 11594 return -EINVAL; 11595 11596 request->scan_plans[i].interval = 11597 nla_get_u32(plan[NL80211_SCHED_SCAN_PLAN_INTERVAL]); 11598 if (!request->scan_plans[i].interval || 11599 request->scan_plans[i].interval > 11600 wiphy->max_sched_scan_plan_interval) 11601 return -EINVAL; 11602 11603 if (plan[NL80211_SCHED_SCAN_PLAN_ITERATIONS]) { 11604 request->scan_plans[i].iterations = 11605 nla_get_u32(plan[NL80211_SCHED_SCAN_PLAN_ITERATIONS]); 11606 if (!request->scan_plans[i].iterations || 11607 (request->scan_plans[i].iterations > 11608 wiphy->max_sched_scan_plan_iterations)) 11609 return -EINVAL; 11610 } else if (i < n_plans - 1) { 11611 /* 11612 * All scan plans but the last one must specify 11613 * a finite number of iterations 11614 */ 11615 return -EINVAL; 11616 } 11617 11618 i++; 11619 } 11620 11621 /* 11622 * The last scan plan must not specify the number of 11623 * iterations, it is supposed to run infinitely 11624 */ 11625 if (request->scan_plans[n_plans - 1].iterations) 11626 return -EINVAL; 11627 11628 return 0; 11629 } 11630 11631 static struct cfg80211_sched_scan_request * 11632 nl80211_parse_sched_scan(struct wiphy *wiphy, struct wireless_dev *wdev, 11633 struct nlattr **attrs, int max_match_sets) 11634 { 11635 struct cfg80211_sched_scan_request *request; 11636 struct nlattr *attr; 11637 int err, tmp, n_ssids = 0, n_match_sets = 0, n_channels, i, n_plans = 0; 11638 enum nl80211_band band; 11639 size_t ie_len, size; 11640 struct nlattr *tb[NL80211_SCHED_SCAN_MATCH_ATTR_MAX + 1]; 11641 s32 default_match_rssi = NL80211_SCAN_RSSI_THOLD_OFF; 11642 11643 if (attrs[NL80211_ATTR_SCAN_FREQUENCIES]) { 11644 n_channels = validate_scan_freqs( 11645 attrs[NL80211_ATTR_SCAN_FREQUENCIES]); 11646 if (!n_channels) 11647 return ERR_PTR(-EINVAL); 11648 } else { 11649 n_channels = ieee80211_get_num_supported_channels(wiphy); 11650 } 11651 11652 if (attrs[NL80211_ATTR_SCAN_SSIDS]) 11653 nla_for_each_nested(attr, attrs[NL80211_ATTR_SCAN_SSIDS], 11654 tmp) 11655 n_ssids++; 11656 11657 if (n_ssids > wiphy->max_sched_scan_ssids) 11658 return ERR_PTR(-EINVAL); 11659 11660 /* 11661 * First, count the number of 'real' matchsets. Due to an issue with 11662 * the old implementation, matchsets containing only the RSSI attribute 11663 * (NL80211_SCHED_SCAN_MATCH_ATTR_RSSI) are considered as the 'default' 11664 * RSSI for all matchsets, rather than their own matchset for reporting 11665 * all APs with a strong RSSI. This is needed to be compatible with 11666 * older userspace that treated a matchset with only the RSSI as the 11667 * global RSSI for all other matchsets - if there are other matchsets. 11668 */ 11669 if (attrs[NL80211_ATTR_SCHED_SCAN_MATCH]) { 11670 nla_for_each_nested(attr, 11671 attrs[NL80211_ATTR_SCHED_SCAN_MATCH], 11672 tmp) { 11673 struct nlattr *rssi; 11674 11675 err = nla_parse_nested_deprecated(tb, 11676 NL80211_SCHED_SCAN_MATCH_ATTR_MAX, 11677 attr, 11678 nl80211_match_policy, 11679 NULL); 11680 if (err) 11681 return ERR_PTR(err); 11682 11683 /* SSID and BSSID are mutually exclusive */ 11684 if (tb[NL80211_SCHED_SCAN_MATCH_ATTR_SSID] && 11685 tb[NL80211_SCHED_SCAN_MATCH_ATTR_BSSID]) 11686 return ERR_PTR(-EINVAL); 11687 11688 /* add other standalone attributes here */ 11689 if (tb[NL80211_SCHED_SCAN_MATCH_ATTR_SSID] || 11690 tb[NL80211_SCHED_SCAN_MATCH_ATTR_BSSID]) { 11691 n_match_sets++; 11692 continue; 11693 } 11694 rssi = tb[NL80211_SCHED_SCAN_MATCH_ATTR_RSSI]; 11695 if (rssi) 11696 default_match_rssi = nla_get_s32(rssi); 11697 } 11698 } 11699 11700 /* However, if there's no other matchset, add the RSSI one */ 11701 if (!n_match_sets && default_match_rssi != NL80211_SCAN_RSSI_THOLD_OFF) 11702 n_match_sets = 1; 11703 11704 if (n_match_sets > max_match_sets) 11705 return ERR_PTR(-EINVAL); 11706 11707 if (attrs[NL80211_ATTR_IE]) 11708 ie_len = nla_len(attrs[NL80211_ATTR_IE]); 11709 else 11710 ie_len = 0; 11711 11712 if (ie_len > wiphy->max_sched_scan_ie_len) 11713 return ERR_PTR(-EINVAL); 11714 11715 if (attrs[NL80211_ATTR_SCHED_SCAN_PLANS]) { 11716 /* 11717 * NL80211_ATTR_SCHED_SCAN_INTERVAL must not be specified since 11718 * each scan plan already specifies its own interval 11719 */ 11720 if (attrs[NL80211_ATTR_SCHED_SCAN_INTERVAL]) 11721 return ERR_PTR(-EINVAL); 11722 11723 nla_for_each_nested(attr, 11724 attrs[NL80211_ATTR_SCHED_SCAN_PLANS], tmp) 11725 n_plans++; 11726 } else { 11727 /* 11728 * The scan interval attribute is kept for backward 11729 * compatibility. If no scan plans are specified and sched scan 11730 * interval is specified, one scan plan will be set with this 11731 * scan interval and infinite number of iterations. 11732 */ 11733 if (!attrs[NL80211_ATTR_SCHED_SCAN_INTERVAL]) 11734 return ERR_PTR(-EINVAL); 11735 11736 n_plans = 1; 11737 } 11738 11739 if (!n_plans || n_plans > wiphy->max_sched_scan_plans) 11740 return ERR_PTR(-EINVAL); 11741 11742 if (!wiphy_ext_feature_isset( 11743 wiphy, NL80211_EXT_FEATURE_SCHED_SCAN_RELATIVE_RSSI) && 11744 (attrs[NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI] || 11745 attrs[NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST])) 11746 return ERR_PTR(-EINVAL); 11747 11748 size = struct_size(request, channels, n_channels); 11749 size = size_add(size, array_size(sizeof(*request->ssids), n_ssids)); 11750 size = size_add(size, array_size(sizeof(*request->match_sets), 11751 n_match_sets)); 11752 size = size_add(size, array_size(sizeof(*request->scan_plans), 11753 n_plans)); 11754 size = size_add(size, ie_len); 11755 request = kzalloc(size, GFP_KERNEL); 11756 if (!request) 11757 return ERR_PTR(-ENOMEM); 11758 request->n_channels = n_channels; 11759 11760 if (n_ssids) 11761 request->ssids = (void *)request + 11762 struct_size(request, channels, n_channels); 11763 request->n_ssids = n_ssids; 11764 if (ie_len) { 11765 if (n_ssids) 11766 request->ie = (void *)(request->ssids + n_ssids); 11767 else 11768 request->ie = (void *)(request->channels + n_channels); 11769 } 11770 11771 if (n_match_sets) { 11772 if (request->ie) 11773 request->match_sets = (void *)(request->ie + ie_len); 11774 else if (n_ssids) 11775 request->match_sets = 11776 (void *)(request->ssids + n_ssids); 11777 else 11778 request->match_sets = 11779 (void *)(request->channels + n_channels); 11780 } 11781 request->n_match_sets = n_match_sets; 11782 11783 if (n_match_sets) 11784 request->scan_plans = (void *)(request->match_sets + 11785 n_match_sets); 11786 else if (request->ie) 11787 request->scan_plans = (void *)(request->ie + ie_len); 11788 else if (n_ssids) 11789 request->scan_plans = (void *)(request->ssids + n_ssids); 11790 else 11791 request->scan_plans = (void *)(request->channels + n_channels); 11792 11793 request->n_scan_plans = n_plans; 11794 11795 i = 0; 11796 if (attrs[NL80211_ATTR_SCAN_FREQUENCIES]) { 11797 /* user specified, bail out if channel not found */ 11798 nla_for_each_nested(attr, 11799 attrs[NL80211_ATTR_SCAN_FREQUENCIES], 11800 tmp) { 11801 struct ieee80211_channel *chan; 11802 11803 chan = ieee80211_get_channel(wiphy, nla_get_u32(attr)); 11804 11805 if (!chan) { 11806 err = -EINVAL; 11807 goto out_free; 11808 } 11809 11810 /* ignore disabled channels */ 11811 if (chan->flags & IEEE80211_CHAN_DISABLED) 11812 continue; 11813 11814 request->channels[i] = chan; 11815 i++; 11816 } 11817 } else { 11818 /* all channels */ 11819 for (band = 0; band < NUM_NL80211_BANDS; band++) { 11820 int j; 11821 11822 if (!wiphy->bands[band]) 11823 continue; 11824 for (j = 0; j < wiphy->bands[band]->n_channels; j++) { 11825 struct ieee80211_channel *chan; 11826 11827 chan = &wiphy->bands[band]->channels[j]; 11828 11829 if (chan->flags & IEEE80211_CHAN_DISABLED) 11830 continue; 11831 11832 request->channels[i] = chan; 11833 i++; 11834 } 11835 } 11836 } 11837 11838 if (!i) { 11839 err = -EINVAL; 11840 goto out_free; 11841 } 11842 11843 request->n_channels = i; 11844 11845 i = 0; 11846 if (n_ssids) { 11847 nla_for_each_nested(attr, attrs[NL80211_ATTR_SCAN_SSIDS], 11848 tmp) { 11849 if (nla_len(attr) > IEEE80211_MAX_SSID_LEN) { 11850 err = -EINVAL; 11851 goto out_free; 11852 } 11853 request->ssids[i].ssid_len = nla_len(attr); 11854 memcpy(request->ssids[i].ssid, nla_data(attr), 11855 nla_len(attr)); 11856 i++; 11857 } 11858 } 11859 11860 i = 0; 11861 if (attrs[NL80211_ATTR_SCHED_SCAN_MATCH]) { 11862 nla_for_each_nested(attr, 11863 attrs[NL80211_ATTR_SCHED_SCAN_MATCH], 11864 tmp) { 11865 struct nlattr *ssid, *bssid, *rssi; 11866 11867 err = nla_parse_nested_deprecated(tb, 11868 NL80211_SCHED_SCAN_MATCH_ATTR_MAX, 11869 attr, 11870 nl80211_match_policy, 11871 NULL); 11872 if (err) 11873 goto out_free; 11874 ssid = tb[NL80211_SCHED_SCAN_MATCH_ATTR_SSID]; 11875 bssid = tb[NL80211_SCHED_SCAN_MATCH_ATTR_BSSID]; 11876 11877 if (!ssid && !bssid) { 11878 i++; 11879 continue; 11880 } 11881 11882 if (WARN_ON(i >= n_match_sets)) { 11883 /* this indicates a programming error, 11884 * the loop above should have verified 11885 * things properly 11886 */ 11887 err = -EINVAL; 11888 goto out_free; 11889 } 11890 11891 if (ssid) { 11892 memcpy(request->match_sets[i].ssid.ssid, 11893 nla_data(ssid), nla_len(ssid)); 11894 request->match_sets[i].ssid.ssid_len = 11895 nla_len(ssid); 11896 } 11897 if (bssid) 11898 memcpy(request->match_sets[i].bssid, 11899 nla_data(bssid), ETH_ALEN); 11900 11901 /* special attribute - old implementation w/a */ 11902 request->match_sets[i].rssi_thold = default_match_rssi; 11903 rssi = tb[NL80211_SCHED_SCAN_MATCH_ATTR_RSSI]; 11904 if (rssi) 11905 request->match_sets[i].rssi_thold = 11906 nla_get_s32(rssi); 11907 i++; 11908 } 11909 11910 /* there was no other matchset, so the RSSI one is alone */ 11911 if (i == 0 && n_match_sets) 11912 request->match_sets[0].rssi_thold = default_match_rssi; 11913 11914 request->min_rssi_thold = INT_MAX; 11915 for (i = 0; i < n_match_sets; i++) 11916 request->min_rssi_thold = 11917 min(request->match_sets[i].rssi_thold, 11918 request->min_rssi_thold); 11919 } else { 11920 request->min_rssi_thold = NL80211_SCAN_RSSI_THOLD_OFF; 11921 } 11922 11923 if (ie_len) { 11924 request->ie_len = ie_len; 11925 memcpy((void *)request->ie, 11926 nla_data(attrs[NL80211_ATTR_IE]), 11927 request->ie_len); 11928 } 11929 11930 err = nl80211_check_scan_flags_sched(wiphy, wdev, attrs, request); 11931 if (err) 11932 goto out_free; 11933 11934 if (attrs[NL80211_ATTR_SCHED_SCAN_DELAY]) 11935 request->delay = 11936 nla_get_u32(attrs[NL80211_ATTR_SCHED_SCAN_DELAY]); 11937 11938 if (attrs[NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI]) { 11939 request->relative_rssi = nla_get_s8( 11940 attrs[NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI]); 11941 request->relative_rssi_set = true; 11942 } 11943 11944 if (request->relative_rssi_set && 11945 attrs[NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST]) { 11946 struct nl80211_bss_select_rssi_adjust *rssi_adjust; 11947 11948 rssi_adjust = nla_data( 11949 attrs[NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST]); 11950 request->rssi_adjust.band = rssi_adjust->band; 11951 request->rssi_adjust.delta = rssi_adjust->delta; 11952 if (!is_band_valid(wiphy, request->rssi_adjust.band)) { 11953 err = -EINVAL; 11954 goto out_free; 11955 } 11956 } 11957 11958 err = nl80211_parse_sched_scan_plans(wiphy, n_plans, request, attrs); 11959 if (err) 11960 goto out_free; 11961 11962 request->scan_start = jiffies; 11963 11964 return request; 11965 11966 out_free: 11967 kfree(request); 11968 return ERR_PTR(err); 11969 } 11970 11971 static int nl80211_start_sched_scan(struct sk_buff *skb, 11972 struct genl_info *info) 11973 { 11974 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 11975 struct net_device *dev = info->user_ptr[1]; 11976 struct wireless_dev *wdev = dev->ieee80211_ptr; 11977 struct cfg80211_sched_scan_request *sched_scan_req; 11978 bool want_multi; 11979 int err; 11980 11981 if (!rdev->wiphy.max_sched_scan_reqs || !rdev->ops->sched_scan_start) 11982 return -EOPNOTSUPP; 11983 11984 want_multi = info->attrs[NL80211_ATTR_SCHED_SCAN_MULTI]; 11985 err = cfg80211_sched_scan_req_possible(rdev, want_multi); 11986 if (err) 11987 return err; 11988 11989 sched_scan_req = nl80211_parse_sched_scan(&rdev->wiphy, wdev, 11990 info->attrs, 11991 rdev->wiphy.max_match_sets); 11992 11993 err = PTR_ERR_OR_ZERO(sched_scan_req); 11994 if (err) 11995 goto out_err; 11996 11997 /* leave request id zero for legacy request 11998 * or if driver does not support multi-scheduled scan 11999 */ 12000 if (want_multi && rdev->wiphy.max_sched_scan_reqs > 1) 12001 sched_scan_req->reqid = cfg80211_assign_cookie(rdev); 12002 12003 err = rdev_sched_scan_start(rdev, dev, sched_scan_req); 12004 if (err) 12005 goto out_free; 12006 12007 sched_scan_req->dev = dev; 12008 sched_scan_req->wiphy = &rdev->wiphy; 12009 12010 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) 12011 sched_scan_req->owner_nlportid = info->snd_portid; 12012 12013 cfg80211_add_sched_scan_req(rdev, sched_scan_req); 12014 12015 nl80211_send_sched_scan(sched_scan_req, NL80211_CMD_START_SCHED_SCAN); 12016 return 0; 12017 12018 out_free: 12019 kfree(sched_scan_req); 12020 out_err: 12021 return err; 12022 } 12023 12024 static int nl80211_stop_sched_scan(struct sk_buff *skb, 12025 struct genl_info *info) 12026 { 12027 struct cfg80211_sched_scan_request *req; 12028 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12029 u64 cookie; 12030 12031 if (!rdev->wiphy.max_sched_scan_reqs || !rdev->ops->sched_scan_stop) 12032 return -EOPNOTSUPP; 12033 12034 if (info->attrs[NL80211_ATTR_COOKIE]) { 12035 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); 12036 return __cfg80211_stop_sched_scan(rdev, cookie, false); 12037 } 12038 12039 req = list_first_or_null_rcu(&rdev->sched_scan_req_list, 12040 struct cfg80211_sched_scan_request, 12041 list); 12042 if (!req || req->reqid || 12043 (req->owner_nlportid && 12044 req->owner_nlportid != info->snd_portid)) 12045 return -ENOENT; 12046 12047 return cfg80211_stop_sched_scan_req(rdev, req, false); 12048 } 12049 12050 static int nl80211_start_radar_detection(struct sk_buff *skb, 12051 struct genl_info *info) 12052 { 12053 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12054 struct net_device *dev = info->user_ptr[1]; 12055 struct wireless_dev *wdev = dev->ieee80211_ptr; 12056 int link_id = nl80211_link_id(info->attrs); 12057 struct wiphy *wiphy = wdev->wiphy; 12058 struct cfg80211_chan_def chandef; 12059 enum nl80211_dfs_regions dfs_region; 12060 unsigned int cac_time_ms; 12061 int err; 12062 12063 flush_delayed_work(&rdev->dfs_update_channels_wk); 12064 12065 switch (wdev->iftype) { 12066 case NL80211_IFTYPE_AP: 12067 case NL80211_IFTYPE_P2P_GO: 12068 case NL80211_IFTYPE_MESH_POINT: 12069 case NL80211_IFTYPE_ADHOC: 12070 break; 12071 default: 12072 /* caution - see cfg80211_beaconing_iface_active() below */ 12073 return -EINVAL; 12074 } 12075 12076 guard(wiphy)(wiphy); 12077 12078 dfs_region = reg_get_dfs_region(wiphy); 12079 if (dfs_region == NL80211_DFS_UNSET) 12080 return -EINVAL; 12081 12082 err = nl80211_parse_chandef(rdev, info->extack, info->attrs, &chandef, 12083 false); 12084 if (err) 12085 return err; 12086 12087 err = cfg80211_chandef_dfs_required(wiphy, &chandef, wdev->iftype); 12088 if (err < 0) 12089 return err; 12090 12091 if (err == 0) 12092 return -EINVAL; 12093 12094 if (!cfg80211_chandef_dfs_usable(wiphy, &chandef)) 12095 return -EINVAL; 12096 12097 if (nla_get_flag(info->attrs[NL80211_ATTR_RADAR_BACKGROUND])) 12098 return cfg80211_start_background_radar_detection(rdev, wdev, 12099 &chandef); 12100 12101 if (cfg80211_beaconing_iface_active(wdev)) { 12102 /* During MLO other link(s) can beacon, only the current link 12103 * can not already beacon 12104 */ 12105 if (wdev->valid_links && 12106 !wdev->links[link_id].ap.beacon_interval) { 12107 /* nothing */ 12108 } else { 12109 return -EBUSY; 12110 } 12111 } 12112 12113 if (wdev->links[link_id].cac_started) 12114 return -EBUSY; 12115 12116 /* CAC start is offloaded to HW and can't be started manually */ 12117 if (wiphy_ext_feature_isset(wiphy, NL80211_EXT_FEATURE_DFS_OFFLOAD)) 12118 return -EOPNOTSUPP; 12119 12120 if (!rdev->ops->start_radar_detection) 12121 return -EOPNOTSUPP; 12122 12123 cac_time_ms = cfg80211_chandef_dfs_cac_time(&rdev->wiphy, &chandef); 12124 if (WARN_ON(!cac_time_ms)) 12125 cac_time_ms = IEEE80211_DFS_MIN_CAC_TIME_MS; 12126 12127 err = rdev_start_radar_detection(rdev, dev, &chandef, cac_time_ms, 12128 link_id); 12129 if (err) 12130 return err; 12131 12132 switch (wdev->iftype) { 12133 case NL80211_IFTYPE_AP: 12134 case NL80211_IFTYPE_P2P_GO: 12135 wdev->links[link_id].ap.chandef = chandef; 12136 break; 12137 case NL80211_IFTYPE_ADHOC: 12138 wdev->u.ibss.chandef = chandef; 12139 break; 12140 case NL80211_IFTYPE_MESH_POINT: 12141 wdev->u.mesh.chandef = chandef; 12142 break; 12143 default: 12144 break; 12145 } 12146 wdev->links[link_id].cac_started = true; 12147 wdev->links[link_id].cac_start_time = jiffies; 12148 wdev->links[link_id].cac_time_ms = cac_time_ms; 12149 cfg80211_set_cac_state(wiphy, &chandef, true); 12150 12151 return 0; 12152 } 12153 12154 static int nl80211_notify_radar_detection(struct sk_buff *skb, 12155 struct genl_info *info) 12156 { 12157 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12158 struct net_device *dev = info->user_ptr[1]; 12159 struct wireless_dev *wdev = dev->ieee80211_ptr; 12160 struct wiphy *wiphy = wdev->wiphy; 12161 struct cfg80211_chan_def chandef; 12162 enum nl80211_dfs_regions dfs_region; 12163 int err; 12164 12165 dfs_region = reg_get_dfs_region(wiphy); 12166 if (dfs_region == NL80211_DFS_UNSET) { 12167 GENL_SET_ERR_MSG(info, 12168 "DFS Region is not set. Unexpected Radar indication"); 12169 return -EINVAL; 12170 } 12171 12172 err = nl80211_parse_chandef(rdev, info->extack, info->attrs, &chandef, 12173 false); 12174 if (err) { 12175 GENL_SET_ERR_MSG(info, "Unable to extract chandef info"); 12176 return err; 12177 } 12178 12179 err = cfg80211_chandef_dfs_required(wiphy, &chandef, wdev->iftype); 12180 if (err < 0) { 12181 GENL_SET_ERR_MSG(info, "chandef is invalid"); 12182 return err; 12183 } 12184 12185 if (err == 0) { 12186 GENL_SET_ERR_MSG(info, 12187 "Unexpected Radar indication for chandef/iftype"); 12188 return -EINVAL; 12189 } 12190 12191 /* Do not process this notification if radar is already detected 12192 * by kernel on this channel, and return success. 12193 */ 12194 if (chandef.chan->dfs_state == NL80211_DFS_UNAVAILABLE) 12195 return 0; 12196 12197 cfg80211_set_dfs_state(wiphy, &chandef, NL80211_DFS_UNAVAILABLE); 12198 12199 cfg80211_sched_dfs_chan_update(rdev); 12200 12201 rdev->radar_chandef = chandef; 12202 12203 /* Propagate this notification to other radios as well */ 12204 queue_work(cfg80211_wq, &rdev->propagate_radar_detect_wk); 12205 12206 return 0; 12207 } 12208 12209 static int nl80211_parse_counter_offsets(struct cfg80211_registered_device *rdev, 12210 const u8 *data, size_t datalen, 12211 int first_count, struct nlattr *attr, 12212 const u16 **offsets, unsigned int *n_offsets) 12213 { 12214 int i; 12215 12216 *n_offsets = 0; 12217 12218 if (!attr) 12219 return 0; 12220 12221 if (!nla_len(attr) || (nla_len(attr) % sizeof(u16))) 12222 return -EINVAL; 12223 12224 *n_offsets = nla_len(attr) / sizeof(u16); 12225 if (rdev->wiphy.max_num_csa_counters && 12226 (*n_offsets > rdev->wiphy.max_num_csa_counters)) 12227 return -EINVAL; 12228 12229 *offsets = nla_data(attr); 12230 12231 /* sanity checks - counters should fit and be the same */ 12232 for (i = 0; i < *n_offsets; i++) { 12233 u16 offset = (*offsets)[i]; 12234 12235 if (offset >= datalen) 12236 return -EINVAL; 12237 12238 if (first_count != -1 && data[offset] != first_count) 12239 return -EINVAL; 12240 } 12241 12242 return 0; 12243 } 12244 12245 static int nl80211_channel_switch(struct sk_buff *skb, struct genl_info *info) 12246 { 12247 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12248 unsigned int link_id = nl80211_link_id(info->attrs); 12249 struct net_device *dev = info->user_ptr[1]; 12250 struct wireless_dev *wdev = dev->ieee80211_ptr; 12251 struct cfg80211_csa_settings params; 12252 struct nlattr **csa_attrs = NULL; 12253 int err; 12254 bool need_new_beacon = false; 12255 bool need_handle_dfs_flag = true; 12256 bool permit_npca = false; 12257 u32 cs_count; 12258 12259 if (!rdev->ops->channel_switch || 12260 !(rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH)) 12261 return -EOPNOTSUPP; 12262 12263 switch (dev->ieee80211_ptr->iftype) { 12264 case NL80211_IFTYPE_AP: 12265 case NL80211_IFTYPE_P2P_GO: 12266 need_new_beacon = true; 12267 /* For all modes except AP the handle_dfs flag needs to be 12268 * supplied to tell the kernel that userspace will handle radar 12269 * events when they happen. Otherwise a switch to a channel 12270 * requiring DFS will be rejected. 12271 */ 12272 need_handle_dfs_flag = false; 12273 12274 permit_npca = true; 12275 12276 /* useless if AP is not running */ 12277 if (!wdev->links[link_id].ap.beacon_interval) 12278 return -ENOTCONN; 12279 break; 12280 case NL80211_IFTYPE_ADHOC: 12281 if (!wdev->u.ibss.ssid_len) 12282 return -ENOTCONN; 12283 break; 12284 case NL80211_IFTYPE_MESH_POINT: 12285 if (!wdev->u.mesh.id_len) 12286 return -ENOTCONN; 12287 break; 12288 default: 12289 return -EOPNOTSUPP; 12290 } 12291 12292 memset(¶ms, 0, sizeof(params)); 12293 params.beacon_csa.ftm_responder = -1; 12294 12295 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ] || 12296 !info->attrs[NL80211_ATTR_CH_SWITCH_COUNT]) 12297 return -EINVAL; 12298 12299 /* only important for AP, IBSS and mesh create IEs internally */ 12300 if (need_new_beacon && !info->attrs[NL80211_ATTR_CSA_IES]) 12301 return -EINVAL; 12302 12303 /* Even though the attribute is u32, the specification says 12304 * u8, so let's make sure we don't overflow. 12305 */ 12306 cs_count = nla_get_u32(info->attrs[NL80211_ATTR_CH_SWITCH_COUNT]); 12307 if (cs_count > 255) 12308 return -EINVAL; 12309 12310 params.count = cs_count; 12311 12312 err = nl80211_parse_chandef(rdev, info->extack, info->attrs, 12313 ¶ms.chandef, permit_npca); 12314 if (err) 12315 goto free; 12316 12317 err = nl80211_check_npca(rdev, ¶ms.chandef, wdev->iftype, 12318 info->extack); 12319 if (err) 12320 goto free; 12321 12322 if (!need_new_beacon) 12323 goto skip_beacons; 12324 12325 err = nl80211_parse_beacon(rdev, info->attrs, ¶ms.beacon_after, 12326 params.chandef.chan, info->extack); 12327 if (err) 12328 goto free; 12329 12330 csa_attrs = kzalloc_objs(*csa_attrs, NL80211_ATTR_MAX + 1); 12331 if (!csa_attrs) { 12332 err = -ENOMEM; 12333 goto free; 12334 } 12335 12336 err = nla_parse_nested_deprecated(csa_attrs, NL80211_ATTR_MAX, 12337 info->attrs[NL80211_ATTR_CSA_IES], 12338 nl80211_policy, info->extack); 12339 if (err) 12340 goto free; 12341 12342 err = nl80211_parse_beacon(rdev, csa_attrs, ¶ms.beacon_csa, 12343 wdev->links[link_id].ap.chandef.chan, 12344 info->extack); 12345 if (err) 12346 goto free; 12347 12348 if (!csa_attrs[NL80211_ATTR_CNTDWN_OFFS_BEACON]) { 12349 err = -EINVAL; 12350 goto free; 12351 } 12352 12353 err = nl80211_parse_counter_offsets(rdev, params.beacon_csa.tail, 12354 params.beacon_csa.tail_len, 12355 params.count, 12356 csa_attrs[NL80211_ATTR_CNTDWN_OFFS_BEACON], 12357 ¶ms.counter_offsets_beacon, 12358 ¶ms.n_counter_offsets_beacon); 12359 if (err) 12360 goto free; 12361 12362 err = nl80211_parse_counter_offsets(rdev, params.beacon_csa.probe_resp, 12363 params.beacon_csa.probe_resp_len, 12364 params.count, 12365 csa_attrs[NL80211_ATTR_CNTDWN_OFFS_PRESP], 12366 ¶ms.counter_offsets_presp, 12367 ¶ms.n_counter_offsets_presp); 12368 if (err) 12369 goto free; 12370 12371 skip_beacons: 12372 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, ¶ms.chandef, 12373 wdev->iftype)) { 12374 err = -EINVAL; 12375 goto free; 12376 } 12377 12378 err = cfg80211_chandef_dfs_required(wdev->wiphy, 12379 ¶ms.chandef, 12380 wdev->iftype); 12381 if (err < 0) 12382 goto free; 12383 12384 if (err > 0) { 12385 params.radar_required = true; 12386 if (need_handle_dfs_flag && 12387 !nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS])) { 12388 err = -EINVAL; 12389 goto free; 12390 } 12391 } 12392 12393 if (info->attrs[NL80211_ATTR_CH_SWITCH_BLOCK_TX]) 12394 params.block_tx = true; 12395 12396 if ((wdev->iftype == NL80211_IFTYPE_AP || 12397 wdev->iftype == NL80211_IFTYPE_P2P_GO) && 12398 info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP]) { 12399 err = nl80211_parse_unsol_bcast_probe_resp( 12400 rdev, info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP], 12401 ¶ms.unsol_bcast_probe_resp); 12402 if (err) 12403 goto free; 12404 } 12405 12406 params.link_id = link_id; 12407 err = rdev_channel_switch(rdev, dev, ¶ms); 12408 12409 free: 12410 kfree(params.beacon_after.mbssid_ies); 12411 kfree(params.beacon_csa.mbssid_ies); 12412 kfree(params.beacon_after.rnr_ies); 12413 kfree(params.beacon_csa.rnr_ies); 12414 kfree(csa_attrs); 12415 return err; 12416 } 12417 12418 static int nl80211_send_bss(struct sk_buff *msg, struct netlink_callback *cb, 12419 u32 seq, int flags, 12420 struct cfg80211_registered_device *rdev, 12421 struct wireless_dev *wdev, 12422 struct cfg80211_internal_bss *intbss) 12423 { 12424 struct cfg80211_bss *res = &intbss->pub; 12425 const struct cfg80211_bss_ies *ies; 12426 unsigned int link_id; 12427 void *hdr; 12428 struct nlattr *bss; 12429 12430 lockdep_assert_wiphy(wdev->wiphy); 12431 12432 hdr = nl80211hdr_put(msg, NETLINK_CB(cb->skb).portid, seq, flags, 12433 NL80211_CMD_NEW_SCAN_RESULTS); 12434 if (!hdr) 12435 return -1; 12436 12437 genl_dump_check_consistent(cb, hdr); 12438 12439 if (nla_put_u32(msg, NL80211_ATTR_GENERATION, rdev->bss_generation)) 12440 goto nla_put_failure; 12441 if (wdev->netdev && 12442 nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex)) 12443 goto nla_put_failure; 12444 if (nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 12445 NL80211_ATTR_PAD)) 12446 goto nla_put_failure; 12447 12448 bss = nla_nest_start_noflag(msg, NL80211_ATTR_BSS); 12449 if (!bss) 12450 goto nla_put_failure; 12451 if ((!is_zero_ether_addr(res->bssid) && 12452 nla_put(msg, NL80211_BSS_BSSID, ETH_ALEN, res->bssid))) 12453 goto nla_put_failure; 12454 12455 rcu_read_lock(); 12456 /* indicate whether we have probe response data or not */ 12457 if (rcu_access_pointer(res->proberesp_ies) && 12458 nla_put_flag(msg, NL80211_BSS_PRESP_DATA)) 12459 goto fail_unlock_rcu; 12460 12461 /* this pointer prefers to be pointed to probe response data 12462 * but is always valid 12463 */ 12464 ies = rcu_dereference(res->ies); 12465 if (ies) { 12466 if (nla_put_u64_64bit(msg, NL80211_BSS_TSF, ies->tsf, 12467 NL80211_BSS_PAD)) 12468 goto fail_unlock_rcu; 12469 if (ies->len && nla_put(msg, NL80211_BSS_INFORMATION_ELEMENTS, 12470 ies->len, ies->data)) 12471 goto fail_unlock_rcu; 12472 } 12473 12474 /* and this pointer is always (unless driver didn't know) beacon data */ 12475 ies = rcu_dereference(res->beacon_ies); 12476 if (ies && ies->from_beacon) { 12477 if (nla_put_u64_64bit(msg, NL80211_BSS_BEACON_TSF, ies->tsf, 12478 NL80211_BSS_PAD)) 12479 goto fail_unlock_rcu; 12480 if (ies->len && nla_put(msg, NL80211_BSS_BEACON_IES, 12481 ies->len, ies->data)) 12482 goto fail_unlock_rcu; 12483 } 12484 rcu_read_unlock(); 12485 12486 if (res->beacon_interval && 12487 nla_put_u16(msg, NL80211_BSS_BEACON_INTERVAL, res->beacon_interval)) 12488 goto nla_put_failure; 12489 if (nla_put_u16(msg, NL80211_BSS_CAPABILITY, res->capability) || 12490 nla_put_u32(msg, NL80211_BSS_FREQUENCY, res->channel->center_freq) || 12491 nla_put_u32(msg, NL80211_BSS_FREQUENCY_OFFSET, 12492 res->channel->freq_offset) || 12493 nla_put_u32(msg, NL80211_BSS_SEEN_MS_AGO, 12494 jiffies_to_msecs(jiffies - intbss->ts))) 12495 goto nla_put_failure; 12496 12497 if (intbss->parent_tsf && 12498 (nla_put_u64_64bit(msg, NL80211_BSS_PARENT_TSF, 12499 intbss->parent_tsf, NL80211_BSS_PAD) || 12500 nla_put(msg, NL80211_BSS_PARENT_BSSID, ETH_ALEN, 12501 intbss->parent_bssid))) 12502 goto nla_put_failure; 12503 12504 if (res->ts_boottime && 12505 nla_put_u64_64bit(msg, NL80211_BSS_LAST_SEEN_BOOTTIME, 12506 res->ts_boottime, NL80211_BSS_PAD)) 12507 goto nla_put_failure; 12508 12509 if (!nl80211_put_signal(msg, intbss->pub.chains, 12510 intbss->pub.chain_signal, 12511 NL80211_BSS_CHAIN_SIGNAL)) 12512 goto nla_put_failure; 12513 12514 if (intbss->bss_source != BSS_SOURCE_STA_PROFILE) { 12515 switch (rdev->wiphy.signal_type) { 12516 case CFG80211_SIGNAL_TYPE_MBM: 12517 if (nla_put_u32(msg, NL80211_BSS_SIGNAL_MBM, 12518 res->signal)) 12519 goto nla_put_failure; 12520 break; 12521 case CFG80211_SIGNAL_TYPE_UNSPEC: 12522 if (nla_put_u8(msg, NL80211_BSS_SIGNAL_UNSPEC, 12523 res->signal)) 12524 goto nla_put_failure; 12525 break; 12526 default: 12527 break; 12528 } 12529 } 12530 12531 switch (wdev->iftype) { 12532 case NL80211_IFTYPE_P2P_CLIENT: 12533 case NL80211_IFTYPE_STATION: 12534 for_each_valid_link(wdev, link_id) { 12535 if (intbss == wdev->links[link_id].client.current_bss && 12536 (nla_put_u32(msg, NL80211_BSS_STATUS, 12537 NL80211_BSS_STATUS_ASSOCIATED) || 12538 (wdev->valid_links && 12539 (nla_put_u8(msg, NL80211_BSS_MLO_LINK_ID, 12540 link_id) || 12541 nla_put(msg, NL80211_BSS_MLD_ADDR, ETH_ALEN, 12542 wdev->u.client.connected_addr))))) 12543 goto nla_put_failure; 12544 } 12545 break; 12546 case NL80211_IFTYPE_ADHOC: 12547 if (intbss == wdev->u.ibss.current_bss && 12548 nla_put_u32(msg, NL80211_BSS_STATUS, 12549 NL80211_BSS_STATUS_IBSS_JOINED)) 12550 goto nla_put_failure; 12551 break; 12552 default: 12553 break; 12554 } 12555 12556 if (nla_put_u32(msg, NL80211_BSS_USE_FOR, res->use_for)) 12557 goto nla_put_failure; 12558 12559 if (res->cannot_use_reasons && 12560 nla_put_u64_64bit(msg, NL80211_BSS_CANNOT_USE_REASONS, 12561 res->cannot_use_reasons, 12562 NL80211_BSS_PAD)) 12563 goto nla_put_failure; 12564 12565 nla_nest_end(msg, bss); 12566 12567 genlmsg_end(msg, hdr); 12568 return 0; 12569 12570 fail_unlock_rcu: 12571 rcu_read_unlock(); 12572 nla_put_failure: 12573 genlmsg_cancel(msg, hdr); 12574 return -EMSGSIZE; 12575 } 12576 12577 static int nl80211_dump_scan(struct sk_buff *skb, struct netlink_callback *cb) 12578 { 12579 struct cfg80211_registered_device *rdev; 12580 struct cfg80211_internal_bss *scan; 12581 struct wireless_dev *wdev; 12582 struct nlattr **attrbuf; 12583 int start = cb->args[2], idx = 0; 12584 bool dump_include_use_data; 12585 int err; 12586 12587 attrbuf = kzalloc_objs(*attrbuf, NUM_NL80211_ATTR); 12588 if (!attrbuf) 12589 return -ENOMEM; 12590 12591 err = nl80211_prepare_wdev_dump(cb, &rdev, &wdev, attrbuf); 12592 if (err) { 12593 kfree(attrbuf); 12594 return err; 12595 } 12596 /* nl80211_prepare_wdev_dump acquired it in the successful case */ 12597 __acquire(&rdev->wiphy.mtx); 12598 12599 dump_include_use_data = 12600 attrbuf[NL80211_ATTR_BSS_DUMP_INCLUDE_USE_DATA]; 12601 kfree(attrbuf); 12602 12603 spin_lock_bh(&rdev->bss_lock); 12604 12605 /* 12606 * dump_scan will be called multiple times to break up the scan results 12607 * into multiple messages. It is unlikely that any more bss-es will be 12608 * expired after the first call, so only call only call this on the 12609 * first dump_scan invocation. 12610 */ 12611 if (start == 0) 12612 cfg80211_bss_expire(rdev); 12613 12614 cb->seq = rdev->bss_generation; 12615 12616 list_for_each_entry(scan, &rdev->bss_list, list) { 12617 if (++idx <= start) 12618 continue; 12619 if (!dump_include_use_data && 12620 !(scan->pub.use_for & NL80211_BSS_USE_FOR_NORMAL)) 12621 continue; 12622 if (nl80211_send_bss(skb, cb, 12623 cb->nlh->nlmsg_seq, NLM_F_MULTI, 12624 rdev, wdev, scan) < 0) { 12625 idx--; 12626 break; 12627 } 12628 } 12629 12630 spin_unlock_bh(&rdev->bss_lock); 12631 12632 cb->args[2] = idx; 12633 wiphy_unlock(&rdev->wiphy); 12634 12635 return skb->len; 12636 } 12637 12638 static int nl80211_send_survey(struct sk_buff *msg, u32 portid, u32 seq, 12639 int flags, struct net_device *dev, 12640 bool allow_radio_stats, 12641 struct survey_info *survey) 12642 { 12643 void *hdr; 12644 struct nlattr *infoattr; 12645 12646 /* skip radio stats if userspace didn't request them */ 12647 if (!survey->channel && !allow_radio_stats) 12648 return 0; 12649 12650 hdr = nl80211hdr_put(msg, portid, seq, flags, 12651 NL80211_CMD_NEW_SURVEY_RESULTS); 12652 if (!hdr) 12653 return -ENOMEM; 12654 12655 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) 12656 goto nla_put_failure; 12657 12658 infoattr = nla_nest_start_noflag(msg, NL80211_ATTR_SURVEY_INFO); 12659 if (!infoattr) 12660 goto nla_put_failure; 12661 12662 if (survey->channel && 12663 nla_put_u32(msg, NL80211_SURVEY_INFO_FREQUENCY, 12664 survey->channel->center_freq)) 12665 goto nla_put_failure; 12666 12667 if (survey->channel && survey->channel->freq_offset && 12668 nla_put_u32(msg, NL80211_SURVEY_INFO_FREQUENCY_OFFSET, 12669 survey->channel->freq_offset)) 12670 goto nla_put_failure; 12671 12672 if ((survey->filled & SURVEY_INFO_NOISE_DBM) && 12673 nla_put_u8(msg, NL80211_SURVEY_INFO_NOISE, survey->noise)) 12674 goto nla_put_failure; 12675 if ((survey->filled & SURVEY_INFO_IN_USE) && 12676 nla_put_flag(msg, NL80211_SURVEY_INFO_IN_USE)) 12677 goto nla_put_failure; 12678 if ((survey->filled & SURVEY_INFO_TIME) && 12679 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME, 12680 survey->time, NL80211_SURVEY_INFO_PAD)) 12681 goto nla_put_failure; 12682 if ((survey->filled & SURVEY_INFO_TIME_BUSY) && 12683 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_BUSY, 12684 survey->time_busy, NL80211_SURVEY_INFO_PAD)) 12685 goto nla_put_failure; 12686 if ((survey->filled & SURVEY_INFO_TIME_EXT_BUSY) && 12687 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_EXT_BUSY, 12688 survey->time_ext_busy, NL80211_SURVEY_INFO_PAD)) 12689 goto nla_put_failure; 12690 if ((survey->filled & SURVEY_INFO_TIME_RX) && 12691 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_RX, 12692 survey->time_rx, NL80211_SURVEY_INFO_PAD)) 12693 goto nla_put_failure; 12694 if ((survey->filled & SURVEY_INFO_TIME_TX) && 12695 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_TX, 12696 survey->time_tx, NL80211_SURVEY_INFO_PAD)) 12697 goto nla_put_failure; 12698 if ((survey->filled & SURVEY_INFO_TIME_SCAN) && 12699 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_SCAN, 12700 survey->time_scan, NL80211_SURVEY_INFO_PAD)) 12701 goto nla_put_failure; 12702 if ((survey->filled & SURVEY_INFO_TIME_BSS_RX) && 12703 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_BSS_RX, 12704 survey->time_bss_rx, NL80211_SURVEY_INFO_PAD)) 12705 goto nla_put_failure; 12706 12707 nla_nest_end(msg, infoattr); 12708 12709 genlmsg_end(msg, hdr); 12710 return 0; 12711 12712 nla_put_failure: 12713 genlmsg_cancel(msg, hdr); 12714 return -EMSGSIZE; 12715 } 12716 12717 static int nl80211_dump_survey(struct sk_buff *skb, struct netlink_callback *cb) 12718 { 12719 struct nlattr **attrbuf; 12720 struct survey_info survey; 12721 struct cfg80211_registered_device *rdev; 12722 struct wireless_dev *wdev; 12723 int survey_idx = cb->args[2]; 12724 int res; 12725 bool radio_stats; 12726 12727 attrbuf = kzalloc_objs(*attrbuf, NUM_NL80211_ATTR); 12728 if (!attrbuf) 12729 return -ENOMEM; 12730 12731 res = nl80211_prepare_wdev_dump(cb, &rdev, &wdev, attrbuf); 12732 if (res) { 12733 kfree(attrbuf); 12734 return res; 12735 } 12736 /* nl80211_prepare_wdev_dump acquired it in the successful case */ 12737 __acquire(&rdev->wiphy.mtx); 12738 12739 /* prepare_wdev_dump parsed the attributes */ 12740 radio_stats = attrbuf[NL80211_ATTR_SURVEY_RADIO_STATS]; 12741 12742 if (!wdev->netdev) { 12743 res = -EINVAL; 12744 goto out_err; 12745 } 12746 12747 if (!rdev->ops->dump_survey) { 12748 res = -EOPNOTSUPP; 12749 goto out_err; 12750 } 12751 12752 while (1) { 12753 res = rdev_dump_survey(rdev, wdev->netdev, survey_idx, &survey); 12754 if (res == -ENOENT) 12755 break; 12756 if (res) 12757 goto out_err; 12758 12759 /* don't send disabled channels, but do send non-channel data */ 12760 if (survey.channel && 12761 survey.channel->flags & IEEE80211_CHAN_DISABLED) { 12762 survey_idx++; 12763 continue; 12764 } 12765 12766 if (nl80211_send_survey(skb, 12767 NETLINK_CB(cb->skb).portid, 12768 cb->nlh->nlmsg_seq, NLM_F_MULTI, 12769 wdev->netdev, radio_stats, &survey) < 0) 12770 goto out; 12771 survey_idx++; 12772 } 12773 12774 out: 12775 cb->args[2] = survey_idx; 12776 res = skb->len; 12777 out_err: 12778 kfree(attrbuf); 12779 wiphy_unlock(&rdev->wiphy); 12780 return res; 12781 } 12782 12783 static int nl80211_authenticate(struct sk_buff *skb, struct genl_info *info) 12784 { 12785 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12786 struct net_device *dev = info->user_ptr[1]; 12787 struct ieee80211_channel *chan; 12788 const u8 *bssid, *ssid; 12789 int err, ssid_len; 12790 enum nl80211_auth_type auth_type; 12791 struct key_parse key; 12792 bool local_state_change; 12793 struct cfg80211_auth_request req = {}; 12794 u32 freq; 12795 12796 if (!info->attrs[NL80211_ATTR_MAC]) 12797 return -EINVAL; 12798 12799 if (!info->attrs[NL80211_ATTR_AUTH_TYPE]) 12800 return -EINVAL; 12801 12802 if (!info->attrs[NL80211_ATTR_SSID]) 12803 return -EINVAL; 12804 12805 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ]) 12806 return -EINVAL; 12807 12808 err = nl80211_parse_key(info, &key); 12809 if (err) 12810 return err; 12811 12812 if (key.idx >= 0) { 12813 if (key.type != -1 && key.type != NL80211_KEYTYPE_GROUP) 12814 return -EINVAL; 12815 if (!key.p.key || !key.p.key_len) 12816 return -EINVAL; 12817 if ((key.p.cipher != WLAN_CIPHER_SUITE_WEP40 || 12818 key.p.key_len != WLAN_KEY_LEN_WEP40) && 12819 (key.p.cipher != WLAN_CIPHER_SUITE_WEP104 || 12820 key.p.key_len != WLAN_KEY_LEN_WEP104)) 12821 return -EINVAL; 12822 if (key.idx > 3) 12823 return -EINVAL; 12824 } else { 12825 key.p.key_len = 0; 12826 key.p.key = NULL; 12827 } 12828 12829 if (key.idx >= 0) { 12830 int i; 12831 bool ok = false; 12832 12833 for (i = 0; i < rdev->wiphy.n_cipher_suites; i++) { 12834 if (key.p.cipher == rdev->wiphy.cipher_suites[i]) { 12835 ok = true; 12836 break; 12837 } 12838 } 12839 if (!ok) 12840 return -EINVAL; 12841 } 12842 12843 if (!rdev->ops->auth) 12844 return -EOPNOTSUPP; 12845 12846 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 12847 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 12848 return -EOPNOTSUPP; 12849 12850 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 12851 freq = MHZ_TO_KHZ(nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ])); 12852 if (info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]) 12853 freq += 12854 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]); 12855 12856 chan = nl80211_get_valid_chan(&rdev->wiphy, freq); 12857 if (!chan) 12858 return -EINVAL; 12859 12860 ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); 12861 ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); 12862 12863 if (info->attrs[NL80211_ATTR_IE]) { 12864 req.ie = nla_data(info->attrs[NL80211_ATTR_IE]); 12865 req.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 12866 } 12867 12868 if (info->attrs[NL80211_ATTR_SUPPORTED_SELECTORS]) { 12869 req.supported_selectors = 12870 nla_data(info->attrs[NL80211_ATTR_SUPPORTED_SELECTORS]); 12871 req.supported_selectors_len = 12872 nla_len(info->attrs[NL80211_ATTR_SUPPORTED_SELECTORS]); 12873 } 12874 12875 auth_type = nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]); 12876 if (!nl80211_valid_auth_type(rdev, auth_type, NL80211_CMD_AUTHENTICATE)) 12877 return -EINVAL; 12878 12879 if ((auth_type == NL80211_AUTHTYPE_SAE || 12880 auth_type == NL80211_AUTHTYPE_FILS_SK || 12881 auth_type == NL80211_AUTHTYPE_FILS_SK_PFS || 12882 auth_type == NL80211_AUTHTYPE_FILS_PK || 12883 auth_type == NL80211_AUTHTYPE_EPPKE || 12884 auth_type == NL80211_AUTHTYPE_IEEE8021X) && 12885 !info->attrs[NL80211_ATTR_AUTH_DATA]) 12886 return -EINVAL; 12887 12888 if (info->attrs[NL80211_ATTR_AUTH_DATA]) { 12889 if (auth_type != NL80211_AUTHTYPE_SAE && 12890 auth_type != NL80211_AUTHTYPE_FILS_SK && 12891 auth_type != NL80211_AUTHTYPE_FILS_SK_PFS && 12892 auth_type != NL80211_AUTHTYPE_FILS_PK && 12893 auth_type != NL80211_AUTHTYPE_EPPKE && 12894 auth_type != NL80211_AUTHTYPE_IEEE8021X) 12895 return -EINVAL; 12896 req.auth_data = nla_data(info->attrs[NL80211_ATTR_AUTH_DATA]); 12897 req.auth_data_len = nla_len(info->attrs[NL80211_ATTR_AUTH_DATA]); 12898 } 12899 12900 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; 12901 12902 /* 12903 * Since we no longer track auth state, ignore 12904 * requests to only change local state. 12905 */ 12906 if (local_state_change) 12907 return 0; 12908 12909 req.auth_type = auth_type; 12910 req.key = key.p.key; 12911 req.key_len = key.p.key_len; 12912 req.key_idx = key.idx; 12913 req.link_id = nl80211_link_id_or_invalid(info->attrs); 12914 if (req.link_id >= 0) { 12915 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_MLO)) 12916 return -EINVAL; 12917 if (!info->attrs[NL80211_ATTR_MLD_ADDR]) 12918 return -EINVAL; 12919 req.ap_mld_addr = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]); 12920 if (!is_valid_ether_addr(req.ap_mld_addr)) 12921 return -EINVAL; 12922 } 12923 12924 req.bss = __cfg80211_get_bss(&rdev->wiphy, chan, bssid, ssid, ssid_len, 12925 IEEE80211_BSS_TYPE_ESS, 12926 IEEE80211_PRIVACY_ANY, 12927 NL80211_BSS_USE_FOR_NORMAL, 12928 info->extack); 12929 if (!req.bss) 12930 return -ENOENT; 12931 12932 err = cfg80211_mlme_auth(rdev, dev, &req); 12933 12934 cfg80211_put_bss(&rdev->wiphy, req.bss); 12935 12936 return err; 12937 } 12938 12939 static int validate_pae_over_nl80211(struct cfg80211_registered_device *rdev, 12940 struct genl_info *info) 12941 { 12942 if (!info->attrs[NL80211_ATTR_SOCKET_OWNER]) { 12943 GENL_SET_ERR_MSG(info, "SOCKET_OWNER not set"); 12944 return -EINVAL; 12945 } 12946 12947 if (!rdev->ops->tx_control_port || 12948 !wiphy_ext_feature_isset(&rdev->wiphy, 12949 NL80211_EXT_FEATURE_CONTROL_PORT_OVER_NL80211)) 12950 return -EOPNOTSUPP; 12951 12952 return 0; 12953 } 12954 12955 static int nl80211_crypto_settings(struct cfg80211_registered_device *rdev, 12956 struct genl_info *info, 12957 struct cfg80211_crypto_settings *settings, 12958 int cipher_limit) 12959 { 12960 memset(settings, 0, sizeof(*settings)); 12961 12962 settings->control_port = info->attrs[NL80211_ATTR_CONTROL_PORT]; 12963 12964 if (info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]) { 12965 u16 proto; 12966 12967 proto = nla_get_u16( 12968 info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]); 12969 settings->control_port_ethertype = cpu_to_be16(proto); 12970 if (!(rdev->wiphy.flags & WIPHY_FLAG_CONTROL_PORT_PROTOCOL) && 12971 proto != ETH_P_PAE) 12972 return -EINVAL; 12973 if (info->attrs[NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT]) 12974 settings->control_port_no_encrypt = true; 12975 } else 12976 settings->control_port_ethertype = cpu_to_be16(ETH_P_PAE); 12977 12978 if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) { 12979 int r = validate_pae_over_nl80211(rdev, info); 12980 12981 if (r < 0) 12982 return r; 12983 12984 settings->control_port_over_nl80211 = true; 12985 12986 if (info->attrs[NL80211_ATTR_CONTROL_PORT_NO_PREAUTH]) 12987 settings->control_port_no_preauth = true; 12988 } 12989 12990 if (info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]) { 12991 void *data; 12992 int len, i; 12993 12994 data = nla_data(info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]); 12995 len = nla_len(info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]); 12996 settings->n_ciphers_pairwise = len / sizeof(u32); 12997 12998 if (len % sizeof(u32)) 12999 return -EINVAL; 13000 13001 if (settings->n_ciphers_pairwise > cipher_limit) 13002 return -EINVAL; 13003 13004 memcpy(settings->ciphers_pairwise, data, len); 13005 13006 for (i = 0; i < settings->n_ciphers_pairwise; i++) 13007 if (!cfg80211_supported_cipher_suite( 13008 &rdev->wiphy, 13009 settings->ciphers_pairwise[i])) 13010 return -EINVAL; 13011 } 13012 13013 if (info->attrs[NL80211_ATTR_CIPHER_SUITE_GROUP]) { 13014 settings->cipher_group = 13015 nla_get_u32(info->attrs[NL80211_ATTR_CIPHER_SUITE_GROUP]); 13016 if (!cfg80211_supported_cipher_suite(&rdev->wiphy, 13017 settings->cipher_group)) 13018 return -EINVAL; 13019 } 13020 13021 if (info->attrs[NL80211_ATTR_WPA_VERSIONS]) 13022 settings->wpa_versions = 13023 nla_get_u32(info->attrs[NL80211_ATTR_WPA_VERSIONS]); 13024 13025 if (info->attrs[NL80211_ATTR_AKM_SUITES]) { 13026 void *data; 13027 int len; 13028 13029 data = nla_data(info->attrs[NL80211_ATTR_AKM_SUITES]); 13030 len = nla_len(info->attrs[NL80211_ATTR_AKM_SUITES]); 13031 settings->n_akm_suites = len / sizeof(u32); 13032 13033 if (len % sizeof(u32)) 13034 return -EINVAL; 13035 13036 if (settings->n_akm_suites > rdev->wiphy.max_num_akm_suites) 13037 return -EINVAL; 13038 13039 memcpy(settings->akm_suites, data, len); 13040 } 13041 13042 if (info->attrs[NL80211_ATTR_PMK]) { 13043 if (nla_len(info->attrs[NL80211_ATTR_PMK]) != WLAN_PMK_LEN) 13044 return -EINVAL; 13045 if (!wiphy_ext_feature_isset(&rdev->wiphy, 13046 NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_PSK) && 13047 !wiphy_ext_feature_isset(&rdev->wiphy, 13048 NL80211_EXT_FEATURE_4WAY_HANDSHAKE_AP_PSK)) 13049 return -EINVAL; 13050 settings->psk = nla_data(info->attrs[NL80211_ATTR_PMK]); 13051 } 13052 13053 if (info->attrs[NL80211_ATTR_SAE_PASSWORD]) { 13054 if (!wiphy_ext_feature_isset(&rdev->wiphy, 13055 NL80211_EXT_FEATURE_SAE_OFFLOAD) && 13056 !wiphy_ext_feature_isset(&rdev->wiphy, 13057 NL80211_EXT_FEATURE_SAE_OFFLOAD_AP)) 13058 return -EINVAL; 13059 settings->sae_pwd = 13060 nla_data(info->attrs[NL80211_ATTR_SAE_PASSWORD]); 13061 settings->sae_pwd_len = 13062 nla_len(info->attrs[NL80211_ATTR_SAE_PASSWORD]); 13063 } 13064 13065 settings->sae_pwe = 13066 nla_get_u8_default(info->attrs[NL80211_ATTR_SAE_PWE], 13067 NL80211_SAE_PWE_UNSPECIFIED); 13068 13069 return 0; 13070 } 13071 13072 static struct cfg80211_bss *nl80211_assoc_bss(struct cfg80211_registered_device *rdev, 13073 struct genl_info *info, 13074 const u8 *ssid, int ssid_len, 13075 struct nlattr **attrs, 13076 int assoc_link_id, int link_id) 13077 { 13078 struct ieee80211_channel *chan; 13079 struct cfg80211_bss *bss; 13080 const u8 *bssid; 13081 u32 freq, use_for = 0; 13082 13083 if (!attrs[NL80211_ATTR_MAC] || !attrs[NL80211_ATTR_WIPHY_FREQ]) { 13084 GENL_SET_ERR_MSG(info, "BSSID or frequency missing"); 13085 return ERR_PTR(-EINVAL); 13086 } 13087 13088 bssid = nla_data(attrs[NL80211_ATTR_MAC]); 13089 13090 freq = MHZ_TO_KHZ(nla_get_u32(attrs[NL80211_ATTR_WIPHY_FREQ])); 13091 if (attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]) 13092 freq += nla_get_u32(attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]); 13093 13094 chan = nl80211_get_valid_chan(&rdev->wiphy, freq); 13095 if (!chan) { 13096 GENL_SET_ERR_MSG(info, "invalid or disabled channel"); 13097 return ERR_PTR(-EINVAL); 13098 } 13099 13100 if (assoc_link_id >= 0) 13101 use_for = NL80211_BSS_USE_FOR_MLD_LINK; 13102 if (assoc_link_id == link_id) 13103 use_for |= NL80211_BSS_USE_FOR_NORMAL; 13104 13105 bss = __cfg80211_get_bss(&rdev->wiphy, chan, bssid, 13106 ssid, ssid_len, 13107 IEEE80211_BSS_TYPE_ESS, 13108 IEEE80211_PRIVACY_ANY, 13109 use_for, info->extack); 13110 if (!bss) 13111 return ERR_PTR(-ENOENT); 13112 13113 return bss; 13114 } 13115 13116 static int nl80211_process_links(struct cfg80211_registered_device *rdev, 13117 struct cfg80211_assoc_link *links, 13118 int assoc_link_id, 13119 const u8 *ssid, int ssid_len, 13120 struct genl_info *info) 13121 { 13122 unsigned int attrsize = NUM_NL80211_ATTR * sizeof(struct nlattr *); 13123 struct nlattr **attrs __free(kfree) = kzalloc(attrsize, GFP_KERNEL); 13124 struct nlattr *link; 13125 unsigned int link_id; 13126 int rem, err; 13127 13128 if (!attrs) 13129 return -ENOMEM; 13130 13131 nla_for_each_nested(link, info->attrs[NL80211_ATTR_MLO_LINKS], rem) { 13132 memset(attrs, 0, attrsize); 13133 13134 nla_parse_nested(attrs, NL80211_ATTR_MAX, link, NULL, NULL); 13135 13136 if (!attrs[NL80211_ATTR_MLO_LINK_ID]) { 13137 NL_SET_BAD_ATTR(info->extack, link); 13138 return -EINVAL; 13139 } 13140 13141 link_id = nla_get_u8(attrs[NL80211_ATTR_MLO_LINK_ID]); 13142 /* cannot use the same link ID again */ 13143 if (links[link_id].bss) { 13144 NL_SET_BAD_ATTR(info->extack, link); 13145 return -EINVAL; 13146 } 13147 links[link_id].bss = 13148 nl80211_assoc_bss(rdev, info, ssid, ssid_len, attrs, 13149 assoc_link_id, link_id); 13150 if (IS_ERR(links[link_id].bss)) { 13151 err = PTR_ERR(links[link_id].bss); 13152 links[link_id].bss = NULL; 13153 /* the BSS lookup set the specific message already */ 13154 NL_SET_BAD_ATTR(info->extack, link); 13155 return err; 13156 } 13157 13158 if (attrs[NL80211_ATTR_IE]) { 13159 links[link_id].elems = nla_data(attrs[NL80211_ATTR_IE]); 13160 links[link_id].elems_len = 13161 nla_len(attrs[NL80211_ATTR_IE]); 13162 13163 if (cfg80211_find_elem(WLAN_EID_FRAGMENT, 13164 links[link_id].elems, 13165 links[link_id].elems_len)) { 13166 NL_SET_ERR_MSG_ATTR(info->extack, 13167 attrs[NL80211_ATTR_IE], 13168 "cannot deal with fragmentation"); 13169 return -EINVAL; 13170 } 13171 13172 if (cfg80211_find_ext_elem(WLAN_EID_EXT_NON_INHERITANCE, 13173 links[link_id].elems, 13174 links[link_id].elems_len)) { 13175 NL_SET_ERR_MSG_ATTR(info->extack, 13176 attrs[NL80211_ATTR_IE], 13177 "cannot deal with non-inheritance"); 13178 return -EINVAL; 13179 } 13180 } 13181 } 13182 13183 return 0; 13184 } 13185 13186 static int nl80211_associate(struct sk_buff *skb, struct genl_info *info) 13187 { 13188 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13189 struct net_device *dev = info->user_ptr[1]; 13190 struct cfg80211_assoc_request req = {}; 13191 const u8 *ap_addr, *ssid; 13192 unsigned int link_id; 13193 int err, ssid_len; 13194 13195 if (dev->ieee80211_ptr->conn_owner_nlportid && 13196 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) 13197 return -EPERM; 13198 13199 if (!info->attrs[NL80211_ATTR_SSID]) 13200 return -EINVAL; 13201 13202 if (!rdev->ops->assoc) 13203 return -EOPNOTSUPP; 13204 13205 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 13206 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 13207 return -EOPNOTSUPP; 13208 13209 ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); 13210 ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); 13211 13212 if (info->attrs[NL80211_ATTR_IE]) { 13213 req.ie = nla_data(info->attrs[NL80211_ATTR_IE]); 13214 req.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 13215 13216 if (cfg80211_find_ext_elem(WLAN_EID_EXT_NON_INHERITANCE, 13217 req.ie, req.ie_len)) { 13218 NL_SET_ERR_MSG_ATTR(info->extack, 13219 info->attrs[NL80211_ATTR_IE], 13220 "non-inheritance makes no sense"); 13221 return -EINVAL; 13222 } 13223 } 13224 13225 if (info->attrs[NL80211_ATTR_USE_MFP]) { 13226 enum nl80211_mfp mfp = 13227 nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]); 13228 if (mfp == NL80211_MFP_REQUIRED) 13229 req.use_mfp = true; 13230 else if (mfp != NL80211_MFP_NO) 13231 return -EINVAL; 13232 } 13233 13234 if (info->attrs[NL80211_ATTR_PREV_BSSID]) 13235 req.prev_bssid = nla_data(info->attrs[NL80211_ATTR_PREV_BSSID]); 13236 13237 if (info->attrs[NL80211_ATTR_SUPPORTED_SELECTORS]) { 13238 req.supported_selectors = 13239 nla_data(info->attrs[NL80211_ATTR_SUPPORTED_SELECTORS]); 13240 req.supported_selectors_len = 13241 nla_len(info->attrs[NL80211_ATTR_SUPPORTED_SELECTORS]); 13242 } 13243 13244 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HT])) 13245 req.flags |= ASSOC_REQ_DISABLE_HT; 13246 13247 if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) 13248 memcpy(&req.ht_capa_mask, 13249 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]), 13250 sizeof(req.ht_capa_mask)); 13251 13252 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) { 13253 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) 13254 return -EINVAL; 13255 memcpy(&req.ht_capa, 13256 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]), 13257 sizeof(req.ht_capa)); 13258 } 13259 13260 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_VHT])) 13261 req.flags |= ASSOC_REQ_DISABLE_VHT; 13262 13263 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HE])) 13264 req.flags |= ASSOC_REQ_DISABLE_HE; 13265 13266 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_EHT])) 13267 req.flags |= ASSOC_REQ_DISABLE_EHT; 13268 13269 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_UHR])) 13270 req.flags |= ASSOC_REQ_DISABLE_UHR; 13271 13272 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) 13273 memcpy(&req.vht_capa_mask, 13274 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]), 13275 sizeof(req.vht_capa_mask)); 13276 13277 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) { 13278 if (!info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) 13279 return -EINVAL; 13280 memcpy(&req.vht_capa, 13281 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]), 13282 sizeof(req.vht_capa)); 13283 } 13284 13285 if (nla_get_flag(info->attrs[NL80211_ATTR_USE_RRM])) { 13286 if (!((rdev->wiphy.features & 13287 NL80211_FEATURE_DS_PARAM_SET_IE_IN_PROBES) && 13288 (rdev->wiphy.features & NL80211_FEATURE_QUIET)) && 13289 !wiphy_ext_feature_isset(&rdev->wiphy, 13290 NL80211_EXT_FEATURE_RRM)) 13291 return -EINVAL; 13292 req.flags |= ASSOC_REQ_USE_RRM; 13293 } 13294 13295 if (info->attrs[NL80211_ATTR_FILS_KEK]) { 13296 req.fils_kek = nla_data(info->attrs[NL80211_ATTR_FILS_KEK]); 13297 req.fils_kek_len = nla_len(info->attrs[NL80211_ATTR_FILS_KEK]); 13298 if (!info->attrs[NL80211_ATTR_FILS_NONCES]) 13299 return -EINVAL; 13300 req.fils_nonces = 13301 nla_data(info->attrs[NL80211_ATTR_FILS_NONCES]); 13302 } 13303 13304 if (info->attrs[NL80211_ATTR_S1G_CAPABILITY_MASK]) { 13305 if (!info->attrs[NL80211_ATTR_S1G_CAPABILITY]) 13306 return -EINVAL; 13307 memcpy(&req.s1g_capa_mask, 13308 nla_data(info->attrs[NL80211_ATTR_S1G_CAPABILITY_MASK]), 13309 sizeof(req.s1g_capa_mask)); 13310 } 13311 13312 if (info->attrs[NL80211_ATTR_S1G_CAPABILITY]) { 13313 if (!info->attrs[NL80211_ATTR_S1G_CAPABILITY_MASK]) 13314 return -EINVAL; 13315 memcpy(&req.s1g_capa, 13316 nla_data(info->attrs[NL80211_ATTR_S1G_CAPABILITY]), 13317 sizeof(req.s1g_capa)); 13318 } 13319 13320 if (nla_get_flag(info->attrs[NL80211_ATTR_ASSOC_SPP_AMSDU])) { 13321 if (!wiphy_ext_feature_isset(&rdev->wiphy, 13322 NL80211_EXT_FEATURE_SPP_AMSDU_SUPPORT)) { 13323 GENL_SET_ERR_MSG(info, "SPP A-MSDUs not supported"); 13324 return -EINVAL; 13325 } 13326 req.flags |= ASSOC_REQ_SPP_AMSDU; 13327 } 13328 13329 req.link_id = nl80211_link_id_or_invalid(info->attrs); 13330 13331 if (info->attrs[NL80211_ATTR_MLO_LINKS]) { 13332 if (req.link_id < 0) 13333 return -EINVAL; 13334 13335 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_MLO)) 13336 return -EINVAL; 13337 13338 if (info->attrs[NL80211_ATTR_MAC] || 13339 info->attrs[NL80211_ATTR_WIPHY_FREQ] || 13340 !info->attrs[NL80211_ATTR_MLD_ADDR]) 13341 return -EINVAL; 13342 13343 req.ap_mld_addr = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]); 13344 ap_addr = req.ap_mld_addr; 13345 13346 err = nl80211_process_links(rdev, req.links, req.link_id, 13347 ssid, ssid_len, info); 13348 if (err) 13349 goto free; 13350 13351 if (!req.links[req.link_id].bss) { 13352 err = -EINVAL; 13353 goto free; 13354 } 13355 13356 if (req.links[req.link_id].elems_len) { 13357 GENL_SET_ERR_MSG(info, 13358 "cannot have per-link elems on assoc link"); 13359 err = -EINVAL; 13360 goto free; 13361 } 13362 13363 if (info->attrs[NL80211_ATTR_EXT_MLD_CAPA_AND_OPS]) 13364 req.ext_mld_capa_ops = 13365 nla_get_u16(info->attrs[NL80211_ATTR_EXT_MLD_CAPA_AND_OPS]); 13366 } else { 13367 if (req.link_id >= 0) 13368 return -EINVAL; 13369 13370 req.bss = nl80211_assoc_bss(rdev, info, ssid, ssid_len, info->attrs, 13371 -1, -1); 13372 if (IS_ERR(req.bss)) 13373 return PTR_ERR(req.bss); 13374 ap_addr = req.bss->bssid; 13375 13376 if (info->attrs[NL80211_ATTR_EXT_MLD_CAPA_AND_OPS]) 13377 return -EINVAL; 13378 } 13379 13380 err = nl80211_crypto_settings(rdev, info, &req.crypto, 1); 13381 if (!err) { 13382 struct nlattr *link; 13383 int rem = 0; 13384 13385 err = cfg80211_mlme_assoc(rdev, dev, &req, 13386 info->extack); 13387 13388 if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) { 13389 dev->ieee80211_ptr->conn_owner_nlportid = 13390 info->snd_portid; 13391 memcpy(dev->ieee80211_ptr->disconnect_bssid, 13392 ap_addr, ETH_ALEN); 13393 } 13394 13395 /* Report error from first problematic link */ 13396 if (info->attrs[NL80211_ATTR_MLO_LINKS]) { 13397 nla_for_each_nested(link, 13398 info->attrs[NL80211_ATTR_MLO_LINKS], 13399 rem) { 13400 struct nlattr *link_id_attr = 13401 nla_find_nested(link, NL80211_ATTR_MLO_LINK_ID); 13402 13403 if (!link_id_attr) 13404 continue; 13405 13406 link_id = nla_get_u8(link_id_attr); 13407 13408 if (link_id == req.link_id) 13409 continue; 13410 13411 if (!req.links[link_id].error || 13412 WARN_ON(req.links[link_id].error > 0)) 13413 continue; 13414 13415 WARN_ON(err >= 0); 13416 13417 NL_SET_BAD_ATTR(info->extack, link); 13418 err = req.links[link_id].error; 13419 break; 13420 } 13421 } 13422 } 13423 13424 free: 13425 for (link_id = 0; link_id < ARRAY_SIZE(req.links); link_id++) 13426 cfg80211_put_bss(&rdev->wiphy, req.links[link_id].bss); 13427 cfg80211_put_bss(&rdev->wiphy, req.bss); 13428 13429 return err; 13430 } 13431 13432 static int nl80211_deauthenticate(struct sk_buff *skb, struct genl_info *info) 13433 { 13434 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13435 struct net_device *dev = info->user_ptr[1]; 13436 const u8 *ie = NULL, *bssid; 13437 int ie_len = 0; 13438 u16 reason_code; 13439 bool local_state_change; 13440 13441 if (dev->ieee80211_ptr->conn_owner_nlportid && 13442 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) 13443 return -EPERM; 13444 13445 if (!info->attrs[NL80211_ATTR_MAC]) 13446 return -EINVAL; 13447 13448 if (!info->attrs[NL80211_ATTR_REASON_CODE]) 13449 return -EINVAL; 13450 13451 if (!rdev->ops->deauth) 13452 return -EOPNOTSUPP; 13453 13454 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 13455 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 13456 return -EOPNOTSUPP; 13457 13458 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 13459 13460 reason_code = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); 13461 if (reason_code == 0) { 13462 /* Reason Code 0 is reserved */ 13463 return -EINVAL; 13464 } 13465 13466 if (info->attrs[NL80211_ATTR_IE]) { 13467 ie = nla_data(info->attrs[NL80211_ATTR_IE]); 13468 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 13469 } 13470 13471 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; 13472 13473 return cfg80211_mlme_deauth(rdev, dev, bssid, ie, ie_len, reason_code, 13474 local_state_change); 13475 } 13476 13477 static int nl80211_disassociate(struct sk_buff *skb, struct genl_info *info) 13478 { 13479 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13480 struct net_device *dev = info->user_ptr[1]; 13481 const u8 *ie = NULL, *bssid; 13482 int ie_len = 0; 13483 u16 reason_code; 13484 bool local_state_change; 13485 13486 if (dev->ieee80211_ptr->conn_owner_nlportid && 13487 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) 13488 return -EPERM; 13489 13490 if (!info->attrs[NL80211_ATTR_MAC]) 13491 return -EINVAL; 13492 13493 if (!info->attrs[NL80211_ATTR_REASON_CODE]) 13494 return -EINVAL; 13495 13496 if (!rdev->ops->disassoc) 13497 return -EOPNOTSUPP; 13498 13499 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 13500 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 13501 return -EOPNOTSUPP; 13502 13503 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 13504 13505 reason_code = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); 13506 if (reason_code == 0) { 13507 /* Reason Code 0 is reserved */ 13508 return -EINVAL; 13509 } 13510 13511 if (info->attrs[NL80211_ATTR_IE]) { 13512 ie = nla_data(info->attrs[NL80211_ATTR_IE]); 13513 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 13514 } 13515 13516 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; 13517 13518 return cfg80211_mlme_disassoc(rdev, dev, bssid, ie, ie_len, reason_code, 13519 local_state_change); 13520 } 13521 13522 static bool 13523 nl80211_parse_mcast_rate(struct cfg80211_registered_device *rdev, 13524 int mcast_rate[NUM_NL80211_BANDS], 13525 int rateval) 13526 { 13527 struct wiphy *wiphy = &rdev->wiphy; 13528 bool found = false; 13529 int band, i; 13530 13531 for (band = 0; band < NUM_NL80211_BANDS; band++) { 13532 struct ieee80211_supported_band *sband; 13533 13534 sband = wiphy->bands[band]; 13535 if (!sband) 13536 continue; 13537 13538 for (i = 0; i < sband->n_bitrates; i++) { 13539 if (sband->bitrates[i].bitrate == rateval) { 13540 mcast_rate[band] = i + 1; 13541 found = true; 13542 break; 13543 } 13544 } 13545 } 13546 13547 return found; 13548 } 13549 13550 static int nl80211_join_ibss(struct sk_buff *skb, struct genl_info *info) 13551 { 13552 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13553 struct net_device *dev = info->user_ptr[1]; 13554 struct cfg80211_ibss_params ibss; 13555 struct wiphy *wiphy; 13556 struct cfg80211_cached_keys *connkeys = NULL; 13557 int err; 13558 13559 memset(&ibss, 0, sizeof(ibss)); 13560 13561 if (!info->attrs[NL80211_ATTR_SSID] || 13562 !nla_len(info->attrs[NL80211_ATTR_SSID])) 13563 return -EINVAL; 13564 13565 ibss.beacon_interval = 100; 13566 13567 if (info->attrs[NL80211_ATTR_BEACON_INTERVAL]) 13568 ibss.beacon_interval = 13569 nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]); 13570 13571 err = cfg80211_validate_beacon_int(rdev, NL80211_IFTYPE_ADHOC, 13572 ibss.beacon_interval); 13573 if (err) 13574 return err; 13575 13576 if (!rdev->ops->join_ibss) 13577 return -EOPNOTSUPP; 13578 13579 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC) 13580 return -EOPNOTSUPP; 13581 13582 wiphy = &rdev->wiphy; 13583 13584 if (info->attrs[NL80211_ATTR_MAC]) { 13585 ibss.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 13586 13587 if (!is_valid_ether_addr(ibss.bssid)) 13588 return -EINVAL; 13589 } 13590 ibss.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); 13591 ibss.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); 13592 13593 if (info->attrs[NL80211_ATTR_IE]) { 13594 ibss.ie = nla_data(info->attrs[NL80211_ATTR_IE]); 13595 ibss.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 13596 } 13597 13598 err = nl80211_parse_chandef(rdev, info->extack, info->attrs, 13599 &ibss.chandef, false); 13600 if (err) 13601 return err; 13602 13603 if (!cfg80211_reg_can_beacon(&rdev->wiphy, &ibss.chandef, 13604 NL80211_IFTYPE_ADHOC)) 13605 return -EINVAL; 13606 13607 switch (ibss.chandef.width) { 13608 case NL80211_CHAN_WIDTH_20_NOHT: 13609 break; 13610 case NL80211_CHAN_WIDTH_20: 13611 case NL80211_CHAN_WIDTH_40: 13612 if (!(rdev->wiphy.features & NL80211_FEATURE_HT_IBSS)) 13613 return -EINVAL; 13614 break; 13615 case NL80211_CHAN_WIDTH_80: 13616 case NL80211_CHAN_WIDTH_80P80: 13617 case NL80211_CHAN_WIDTH_160: 13618 if (!(rdev->wiphy.features & NL80211_FEATURE_HT_IBSS)) 13619 return -EINVAL; 13620 if (!wiphy_ext_feature_isset(&rdev->wiphy, 13621 NL80211_EXT_FEATURE_VHT_IBSS)) 13622 return -EINVAL; 13623 break; 13624 case NL80211_CHAN_WIDTH_320: 13625 return -EINVAL; 13626 default: 13627 return -EINVAL; 13628 } 13629 13630 ibss.channel_fixed = !!info->attrs[NL80211_ATTR_FREQ_FIXED]; 13631 ibss.privacy = !!info->attrs[NL80211_ATTR_PRIVACY]; 13632 13633 if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) { 13634 u8 *rates = 13635 nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); 13636 int n_rates = 13637 nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); 13638 struct ieee80211_supported_band *sband = 13639 wiphy->bands[ibss.chandef.chan->band]; 13640 13641 err = ieee80211_get_ratemask(sband, rates, n_rates, 13642 &ibss.basic_rates); 13643 if (err) 13644 return err; 13645 } 13646 13647 if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) 13648 memcpy(&ibss.ht_capa_mask, 13649 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]), 13650 sizeof(ibss.ht_capa_mask)); 13651 13652 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) { 13653 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) 13654 return -EINVAL; 13655 memcpy(&ibss.ht_capa, 13656 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]), 13657 sizeof(ibss.ht_capa)); 13658 } 13659 13660 if (info->attrs[NL80211_ATTR_MCAST_RATE] && 13661 !nl80211_parse_mcast_rate(rdev, ibss.mcast_rate, 13662 nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]))) 13663 return -EINVAL; 13664 13665 if (ibss.privacy && info->attrs[NL80211_ATTR_KEYS]) { 13666 bool no_ht = false; 13667 13668 connkeys = nl80211_parse_connkeys(rdev, dev->ieee80211_ptr, 13669 info, &no_ht); 13670 if (IS_ERR(connkeys)) 13671 return PTR_ERR(connkeys); 13672 13673 if ((ibss.chandef.width != NL80211_CHAN_WIDTH_20_NOHT) && 13674 no_ht) { 13675 kfree_sensitive(connkeys); 13676 return -EINVAL; 13677 } 13678 } 13679 13680 ibss.control_port = 13681 nla_get_flag(info->attrs[NL80211_ATTR_CONTROL_PORT]); 13682 13683 if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) { 13684 int r = validate_pae_over_nl80211(rdev, info); 13685 13686 if (r < 0) { 13687 kfree_sensitive(connkeys); 13688 return r; 13689 } 13690 13691 ibss.control_port_over_nl80211 = true; 13692 } 13693 13694 ibss.userspace_handles_dfs = 13695 nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS]); 13696 13697 err = __cfg80211_join_ibss(rdev, dev, &ibss, connkeys); 13698 if (err) 13699 kfree_sensitive(connkeys); 13700 else if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) 13701 dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid; 13702 13703 return err; 13704 } 13705 13706 static int nl80211_leave_ibss(struct sk_buff *skb, struct genl_info *info) 13707 { 13708 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13709 struct net_device *dev = info->user_ptr[1]; 13710 13711 if (!rdev->ops->leave_ibss) 13712 return -EOPNOTSUPP; 13713 13714 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC) 13715 return -EOPNOTSUPP; 13716 13717 return cfg80211_leave_ibss(rdev, dev, false); 13718 } 13719 13720 static int nl80211_set_mcast_rate(struct sk_buff *skb, struct genl_info *info) 13721 { 13722 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13723 struct net_device *dev = info->user_ptr[1]; 13724 int mcast_rate[NUM_NL80211_BANDS]; 13725 u32 nla_rate; 13726 13727 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC && 13728 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT && 13729 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_OCB) 13730 return -EOPNOTSUPP; 13731 13732 if (!rdev->ops->set_mcast_rate) 13733 return -EOPNOTSUPP; 13734 13735 memset(mcast_rate, 0, sizeof(mcast_rate)); 13736 13737 if (!info->attrs[NL80211_ATTR_MCAST_RATE]) 13738 return -EINVAL; 13739 13740 nla_rate = nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]); 13741 if (!nl80211_parse_mcast_rate(rdev, mcast_rate, nla_rate)) 13742 return -EINVAL; 13743 13744 return rdev_set_mcast_rate(rdev, dev, mcast_rate); 13745 } 13746 13747 static struct sk_buff * 13748 __cfg80211_alloc_vendor_skb(struct cfg80211_registered_device *rdev, 13749 struct wireless_dev *wdev, int approxlen, 13750 u32 portid, u32 seq, enum nl80211_commands cmd, 13751 enum nl80211_attrs attr, 13752 const struct nl80211_vendor_cmd_info *info, 13753 gfp_t gfp) 13754 { 13755 struct sk_buff *skb; 13756 void *hdr; 13757 struct nlattr *data; 13758 13759 skb = nlmsg_new(approxlen + 100, gfp); 13760 if (!skb) 13761 return NULL; 13762 13763 hdr = nl80211hdr_put(skb, portid, seq, 0, cmd); 13764 if (!hdr) { 13765 kfree_skb(skb); 13766 return NULL; 13767 } 13768 13769 if (nla_put_u32(skb, NL80211_ATTR_WIPHY, rdev->wiphy_idx)) 13770 goto nla_put_failure; 13771 13772 if (info) { 13773 if (nla_put_u32(skb, NL80211_ATTR_VENDOR_ID, 13774 info->vendor_id)) 13775 goto nla_put_failure; 13776 if (nla_put_u32(skb, NL80211_ATTR_VENDOR_SUBCMD, 13777 info->subcmd)) 13778 goto nla_put_failure; 13779 } 13780 13781 if (wdev) { 13782 if (nla_put_u64_64bit(skb, NL80211_ATTR_WDEV, 13783 wdev_id(wdev), NL80211_ATTR_PAD)) 13784 goto nla_put_failure; 13785 if (wdev->netdev && 13786 nla_put_u32(skb, NL80211_ATTR_IFINDEX, 13787 wdev->netdev->ifindex)) 13788 goto nla_put_failure; 13789 } 13790 13791 data = nla_nest_start_noflag(skb, attr); 13792 if (!data) 13793 goto nla_put_failure; 13794 13795 ((void **)skb->cb)[0] = rdev; 13796 ((void **)skb->cb)[1] = hdr; 13797 ((void **)skb->cb)[2] = data; 13798 13799 return skb; 13800 13801 nla_put_failure: 13802 kfree_skb(skb); 13803 return NULL; 13804 } 13805 13806 struct sk_buff *__cfg80211_alloc_event_skb(struct wiphy *wiphy, 13807 struct wireless_dev *wdev, 13808 enum nl80211_commands cmd, 13809 enum nl80211_attrs attr, 13810 unsigned int portid, 13811 int vendor_event_idx, 13812 int approxlen, gfp_t gfp) 13813 { 13814 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 13815 const struct nl80211_vendor_cmd_info *info; 13816 13817 switch (cmd) { 13818 case NL80211_CMD_TESTMODE: 13819 if (WARN_ON(vendor_event_idx != -1)) 13820 return NULL; 13821 info = NULL; 13822 break; 13823 case NL80211_CMD_VENDOR: 13824 if (WARN_ON(vendor_event_idx < 0 || 13825 vendor_event_idx >= wiphy->n_vendor_events)) 13826 return NULL; 13827 info = &wiphy->vendor_events[vendor_event_idx]; 13828 break; 13829 default: 13830 WARN_ON(1); 13831 return NULL; 13832 } 13833 13834 return __cfg80211_alloc_vendor_skb(rdev, wdev, approxlen, portid, 0, 13835 cmd, attr, info, gfp); 13836 } 13837 EXPORT_SYMBOL(__cfg80211_alloc_event_skb); 13838 13839 void __cfg80211_send_event_skb(struct sk_buff *skb, gfp_t gfp) 13840 { 13841 struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0]; 13842 void *hdr = ((void **)skb->cb)[1]; 13843 struct nlmsghdr *nlhdr = nlmsg_hdr(skb); 13844 struct nlattr *data = ((void **)skb->cb)[2]; 13845 enum nl80211_multicast_groups mcgrp = NL80211_MCGRP_TESTMODE; 13846 13847 /* clear CB data for netlink core to own from now on */ 13848 memset(skb->cb, 0, sizeof(skb->cb)); 13849 13850 nla_nest_end(skb, data); 13851 genlmsg_end(skb, hdr); 13852 13853 if (nlhdr->nlmsg_pid) { 13854 genlmsg_unicast(wiphy_net(&rdev->wiphy), skb, 13855 nlhdr->nlmsg_pid); 13856 } else { 13857 if (data->nla_type == NL80211_ATTR_VENDOR_DATA) 13858 mcgrp = NL80211_MCGRP_VENDOR; 13859 13860 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), 13861 skb, 0, mcgrp, gfp); 13862 } 13863 } 13864 EXPORT_SYMBOL(__cfg80211_send_event_skb); 13865 13866 #ifdef CONFIG_NL80211_TESTMODE 13867 static int nl80211_testmode_do(struct sk_buff *skb, struct genl_info *info) 13868 { 13869 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13870 struct wireless_dev *wdev; 13871 int err; 13872 13873 lockdep_assert_held(&rdev->wiphy.mtx); 13874 13875 wdev = __cfg80211_wdev_from_attrs(rdev, genl_info_net(info), 13876 info->attrs); 13877 13878 if (!rdev->ops->testmode_cmd) 13879 return -EOPNOTSUPP; 13880 13881 if (IS_ERR(wdev)) { 13882 err = PTR_ERR(wdev); 13883 if (err != -EINVAL) 13884 return err; 13885 wdev = NULL; 13886 } else if (wdev->wiphy != &rdev->wiphy) { 13887 return -EINVAL; 13888 } 13889 13890 if (!info->attrs[NL80211_ATTR_TESTDATA]) 13891 return -EINVAL; 13892 13893 rdev->cur_cmd_info = info; 13894 err = rdev_testmode_cmd(rdev, wdev, 13895 nla_data(info->attrs[NL80211_ATTR_TESTDATA]), 13896 nla_len(info->attrs[NL80211_ATTR_TESTDATA])); 13897 rdev->cur_cmd_info = NULL; 13898 13899 return err; 13900 } 13901 13902 static int nl80211_testmode_dump(struct sk_buff *skb, 13903 struct netlink_callback *cb) 13904 { 13905 struct cfg80211_registered_device *rdev; 13906 struct nlattr **attrbuf = NULL; 13907 int err; 13908 long phy_idx; 13909 void *data = NULL; 13910 int data_len = 0; 13911 13912 rtnl_lock(); 13913 13914 if (cb->args[0]) { 13915 /* 13916 * 0 is a valid index, but not valid for args[0], 13917 * so we need to offset by 1. 13918 */ 13919 phy_idx = cb->args[0] - 1; 13920 13921 rdev = cfg80211_rdev_by_wiphy_idx(phy_idx); 13922 if (!rdev) { 13923 err = -ENOENT; 13924 goto out_err; 13925 } 13926 13927 /* 13928 * The wiphy may have moved netns between dumpit 13929 * invocations (via NL80211_CMD_SET_WIPHY_NETNS), so 13930 * re-check that it still matches the caller's netns. 13931 */ 13932 if (!net_eq(wiphy_net(&rdev->wiphy), sock_net(skb->sk))) { 13933 err = -ENODEV; 13934 goto out_err; 13935 } 13936 } else { 13937 attrbuf = kzalloc_objs(*attrbuf, NUM_NL80211_ATTR); 13938 if (!attrbuf) { 13939 err = -ENOMEM; 13940 goto out_err; 13941 } 13942 13943 err = nlmsg_parse_deprecated(cb->nlh, 13944 GENL_HDRLEN + nl80211_fam.hdrsize, 13945 attrbuf, nl80211_fam.maxattr, 13946 nl80211_policy, NULL); 13947 if (err) 13948 goto out_err; 13949 13950 rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk), attrbuf); 13951 if (IS_ERR(rdev)) { 13952 err = PTR_ERR(rdev); 13953 goto out_err; 13954 } 13955 phy_idx = rdev->wiphy_idx; 13956 13957 if (attrbuf[NL80211_ATTR_TESTDATA]) 13958 cb->args[1] = (long)attrbuf[NL80211_ATTR_TESTDATA]; 13959 } 13960 13961 if (cb->args[1]) { 13962 data = nla_data((void *)cb->args[1]); 13963 data_len = nla_len((void *)cb->args[1]); 13964 } 13965 13966 if (!rdev->ops->testmode_dump) { 13967 err = -EOPNOTSUPP; 13968 goto out_err; 13969 } 13970 13971 while (1) { 13972 void *hdr = nl80211hdr_put(skb, NETLINK_CB(cb->skb).portid, 13973 cb->nlh->nlmsg_seq, NLM_F_MULTI, 13974 NL80211_CMD_TESTMODE); 13975 struct nlattr *tmdata; 13976 13977 if (!hdr) 13978 break; 13979 13980 if (nla_put_u32(skb, NL80211_ATTR_WIPHY, phy_idx)) { 13981 genlmsg_cancel(skb, hdr); 13982 break; 13983 } 13984 13985 tmdata = nla_nest_start_noflag(skb, NL80211_ATTR_TESTDATA); 13986 if (!tmdata) { 13987 genlmsg_cancel(skb, hdr); 13988 break; 13989 } 13990 err = rdev_testmode_dump(rdev, skb, cb, data, data_len); 13991 nla_nest_end(skb, tmdata); 13992 13993 if (err == -ENOBUFS || err == -ENOENT) { 13994 genlmsg_cancel(skb, hdr); 13995 break; 13996 } else if (err) { 13997 genlmsg_cancel(skb, hdr); 13998 goto out_err; 13999 } 14000 14001 genlmsg_end(skb, hdr); 14002 } 14003 14004 err = skb->len; 14005 /* see above */ 14006 cb->args[0] = phy_idx + 1; 14007 out_err: 14008 kfree(attrbuf); 14009 rtnl_unlock(); 14010 return err; 14011 } 14012 #endif 14013 14014 static int nl80211_connect(struct sk_buff *skb, struct genl_info *info) 14015 { 14016 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14017 struct net_device *dev = info->user_ptr[1]; 14018 struct cfg80211_connect_params connect; 14019 struct wiphy *wiphy; 14020 struct cfg80211_cached_keys *connkeys = NULL; 14021 u32 freq = 0; 14022 int err; 14023 14024 memset(&connect, 0, sizeof(connect)); 14025 14026 if (!info->attrs[NL80211_ATTR_SSID] || 14027 !nla_len(info->attrs[NL80211_ATTR_SSID])) 14028 return -EINVAL; 14029 14030 if (info->attrs[NL80211_ATTR_AUTH_TYPE]) { 14031 connect.auth_type = 14032 nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]); 14033 if (!nl80211_valid_auth_type(rdev, connect.auth_type, 14034 NL80211_CMD_CONNECT)) 14035 return -EINVAL; 14036 } else 14037 connect.auth_type = NL80211_AUTHTYPE_AUTOMATIC; 14038 14039 connect.privacy = info->attrs[NL80211_ATTR_PRIVACY]; 14040 14041 if (info->attrs[NL80211_ATTR_WANT_1X_4WAY_HS] && 14042 !wiphy_ext_feature_isset(&rdev->wiphy, 14043 NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_1X)) 14044 return -EINVAL; 14045 connect.want_1x = info->attrs[NL80211_ATTR_WANT_1X_4WAY_HS]; 14046 14047 err = nl80211_crypto_settings(rdev, info, &connect.crypto, 14048 NL80211_MAX_NR_CIPHER_SUITES); 14049 if (err) 14050 return err; 14051 14052 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 14053 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 14054 return -EOPNOTSUPP; 14055 14056 wiphy = &rdev->wiphy; 14057 14058 connect.bg_scan_period = -1; 14059 if (info->attrs[NL80211_ATTR_BG_SCAN_PERIOD] && 14060 (wiphy->flags & WIPHY_FLAG_SUPPORTS_FW_ROAM)) { 14061 connect.bg_scan_period = 14062 nla_get_u16(info->attrs[NL80211_ATTR_BG_SCAN_PERIOD]); 14063 } 14064 14065 if (info->attrs[NL80211_ATTR_MAC]) 14066 connect.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 14067 else if (info->attrs[NL80211_ATTR_MAC_HINT]) 14068 connect.bssid_hint = 14069 nla_data(info->attrs[NL80211_ATTR_MAC_HINT]); 14070 connect.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); 14071 connect.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); 14072 14073 if (info->attrs[NL80211_ATTR_IE]) { 14074 connect.ie = nla_data(info->attrs[NL80211_ATTR_IE]); 14075 connect.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 14076 } 14077 14078 if (info->attrs[NL80211_ATTR_USE_MFP]) { 14079 connect.mfp = nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]); 14080 if (connect.mfp == NL80211_MFP_OPTIONAL && 14081 !wiphy_ext_feature_isset(&rdev->wiphy, 14082 NL80211_EXT_FEATURE_MFP_OPTIONAL)) 14083 return -EOPNOTSUPP; 14084 } else { 14085 connect.mfp = NL80211_MFP_NO; 14086 } 14087 14088 if (info->attrs[NL80211_ATTR_PREV_BSSID]) 14089 connect.prev_bssid = 14090 nla_data(info->attrs[NL80211_ATTR_PREV_BSSID]); 14091 14092 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) 14093 freq = MHZ_TO_KHZ(nla_get_u32( 14094 info->attrs[NL80211_ATTR_WIPHY_FREQ])); 14095 if (info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]) 14096 freq += 14097 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]); 14098 14099 if (freq) { 14100 connect.channel = nl80211_get_valid_chan(wiphy, freq); 14101 if (!connect.channel) 14102 return -EINVAL; 14103 } else if (info->attrs[NL80211_ATTR_WIPHY_FREQ_HINT]) { 14104 freq = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_HINT]); 14105 freq = MHZ_TO_KHZ(freq); 14106 connect.channel_hint = nl80211_get_valid_chan(wiphy, freq); 14107 if (!connect.channel_hint) 14108 return -EINVAL; 14109 } 14110 14111 if (info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]) { 14112 connect.edmg.channels = 14113 nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]); 14114 14115 if (info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]) 14116 connect.edmg.bw_config = 14117 nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]); 14118 } 14119 14120 if (connect.privacy && info->attrs[NL80211_ATTR_KEYS]) { 14121 connkeys = nl80211_parse_connkeys(rdev, dev->ieee80211_ptr, 14122 info, NULL); 14123 if (IS_ERR(connkeys)) 14124 return PTR_ERR(connkeys); 14125 } 14126 14127 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HT])) 14128 connect.flags |= ASSOC_REQ_DISABLE_HT; 14129 14130 if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) 14131 memcpy(&connect.ht_capa_mask, 14132 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]), 14133 sizeof(connect.ht_capa_mask)); 14134 14135 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) { 14136 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) { 14137 kfree_sensitive(connkeys); 14138 return -EINVAL; 14139 } 14140 memcpy(&connect.ht_capa, 14141 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]), 14142 sizeof(connect.ht_capa)); 14143 } 14144 14145 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_VHT])) 14146 connect.flags |= ASSOC_REQ_DISABLE_VHT; 14147 14148 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HE])) 14149 connect.flags |= ASSOC_REQ_DISABLE_HE; 14150 14151 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_EHT])) 14152 connect.flags |= ASSOC_REQ_DISABLE_EHT; 14153 14154 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_UHR])) 14155 connect.flags |= ASSOC_REQ_DISABLE_UHR; 14156 14157 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) 14158 memcpy(&connect.vht_capa_mask, 14159 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]), 14160 sizeof(connect.vht_capa_mask)); 14161 14162 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) { 14163 if (!info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) { 14164 kfree_sensitive(connkeys); 14165 return -EINVAL; 14166 } 14167 memcpy(&connect.vht_capa, 14168 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]), 14169 sizeof(connect.vht_capa)); 14170 } 14171 14172 if (nla_get_flag(info->attrs[NL80211_ATTR_USE_RRM])) { 14173 if (!((rdev->wiphy.features & 14174 NL80211_FEATURE_DS_PARAM_SET_IE_IN_PROBES) && 14175 (rdev->wiphy.features & NL80211_FEATURE_QUIET)) && 14176 !wiphy_ext_feature_isset(&rdev->wiphy, 14177 NL80211_EXT_FEATURE_RRM)) { 14178 kfree_sensitive(connkeys); 14179 return -EINVAL; 14180 } 14181 connect.flags |= ASSOC_REQ_USE_RRM; 14182 } 14183 14184 connect.pbss = nla_get_flag(info->attrs[NL80211_ATTR_PBSS]); 14185 if (connect.pbss && !rdev->wiphy.bands[NL80211_BAND_60GHZ]) { 14186 kfree_sensitive(connkeys); 14187 return -EOPNOTSUPP; 14188 } 14189 14190 if (info->attrs[NL80211_ATTR_BSS_SELECT]) { 14191 /* bss selection makes no sense if bssid is set */ 14192 if (connect.bssid) { 14193 kfree_sensitive(connkeys); 14194 return -EINVAL; 14195 } 14196 14197 err = parse_bss_select(info->attrs[NL80211_ATTR_BSS_SELECT], 14198 wiphy, &connect.bss_select); 14199 if (err) { 14200 kfree_sensitive(connkeys); 14201 return err; 14202 } 14203 } 14204 14205 if (wiphy_ext_feature_isset(&rdev->wiphy, 14206 NL80211_EXT_FEATURE_FILS_SK_OFFLOAD) && 14207 info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] && 14208 info->attrs[NL80211_ATTR_FILS_ERP_REALM] && 14209 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] && 14210 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { 14211 connect.fils_erp_username = 14212 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); 14213 connect.fils_erp_username_len = 14214 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); 14215 connect.fils_erp_realm = 14216 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); 14217 connect.fils_erp_realm_len = 14218 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); 14219 connect.fils_erp_next_seq_num = 14220 nla_get_u16( 14221 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM]); 14222 connect.fils_erp_rrk = 14223 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); 14224 connect.fils_erp_rrk_len = 14225 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); 14226 } else if (info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] || 14227 info->attrs[NL80211_ATTR_FILS_ERP_REALM] || 14228 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] || 14229 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { 14230 kfree_sensitive(connkeys); 14231 return -EINVAL; 14232 } 14233 14234 if (nla_get_flag(info->attrs[NL80211_ATTR_EXTERNAL_AUTH_SUPPORT])) { 14235 if (!info->attrs[NL80211_ATTR_SOCKET_OWNER]) { 14236 kfree_sensitive(connkeys); 14237 GENL_SET_ERR_MSG(info, 14238 "external auth requires connection ownership"); 14239 return -EINVAL; 14240 } 14241 connect.flags |= CONNECT_REQ_EXTERNAL_AUTH_SUPPORT; 14242 } 14243 14244 if (nla_get_flag(info->attrs[NL80211_ATTR_MLO_SUPPORT])) 14245 connect.flags |= CONNECT_REQ_MLO_SUPPORT; 14246 14247 err = cfg80211_connect(rdev, dev, &connect, connkeys, 14248 connect.prev_bssid); 14249 if (err) 14250 kfree_sensitive(connkeys); 14251 14252 if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) { 14253 dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid; 14254 if (connect.bssid) 14255 memcpy(dev->ieee80211_ptr->disconnect_bssid, 14256 connect.bssid, ETH_ALEN); 14257 else 14258 eth_zero_addr(dev->ieee80211_ptr->disconnect_bssid); 14259 } 14260 14261 return err; 14262 } 14263 14264 static int nl80211_update_connect_params(struct sk_buff *skb, 14265 struct genl_info *info) 14266 { 14267 struct cfg80211_connect_params connect = {}; 14268 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14269 struct net_device *dev = info->user_ptr[1]; 14270 struct wireless_dev *wdev = dev->ieee80211_ptr; 14271 bool fils_sk_offload; 14272 u32 auth_type; 14273 u32 changed = 0; 14274 14275 if (!rdev->ops->update_connect_params) 14276 return -EOPNOTSUPP; 14277 14278 if (info->attrs[NL80211_ATTR_IE]) { 14279 connect.ie = nla_data(info->attrs[NL80211_ATTR_IE]); 14280 connect.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 14281 changed |= UPDATE_ASSOC_IES; 14282 } 14283 14284 fils_sk_offload = wiphy_ext_feature_isset(&rdev->wiphy, 14285 NL80211_EXT_FEATURE_FILS_SK_OFFLOAD); 14286 14287 /* 14288 * when driver supports fils-sk offload all attributes must be 14289 * provided. So the else covers "fils-sk-not-all" and 14290 * "no-fils-sk-any". 14291 */ 14292 if (fils_sk_offload && 14293 info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] && 14294 info->attrs[NL80211_ATTR_FILS_ERP_REALM] && 14295 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] && 14296 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { 14297 connect.fils_erp_username = 14298 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); 14299 connect.fils_erp_username_len = 14300 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); 14301 connect.fils_erp_realm = 14302 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); 14303 connect.fils_erp_realm_len = 14304 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); 14305 connect.fils_erp_next_seq_num = 14306 nla_get_u16( 14307 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM]); 14308 connect.fils_erp_rrk = 14309 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); 14310 connect.fils_erp_rrk_len = 14311 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); 14312 changed |= UPDATE_FILS_ERP_INFO; 14313 } else if (info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] || 14314 info->attrs[NL80211_ATTR_FILS_ERP_REALM] || 14315 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] || 14316 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { 14317 return -EINVAL; 14318 } 14319 14320 if (info->attrs[NL80211_ATTR_AUTH_TYPE]) { 14321 auth_type = nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]); 14322 if (!nl80211_valid_auth_type(rdev, auth_type, 14323 NL80211_CMD_CONNECT)) 14324 return -EINVAL; 14325 14326 if (auth_type == NL80211_AUTHTYPE_FILS_SK && 14327 fils_sk_offload && !(changed & UPDATE_FILS_ERP_INFO)) 14328 return -EINVAL; 14329 14330 connect.auth_type = auth_type; 14331 changed |= UPDATE_AUTH_TYPE; 14332 } 14333 14334 if (!wdev->connected) 14335 return -ENOLINK; 14336 14337 return rdev_update_connect_params(rdev, dev, &connect, changed); 14338 } 14339 14340 static int nl80211_disconnect(struct sk_buff *skb, struct genl_info *info) 14341 { 14342 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14343 struct net_device *dev = info->user_ptr[1]; 14344 u16 reason; 14345 14346 if (dev->ieee80211_ptr->conn_owner_nlportid && 14347 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) 14348 return -EPERM; 14349 14350 reason = nla_get_u16_default(info->attrs[NL80211_ATTR_REASON_CODE], 14351 WLAN_REASON_DEAUTH_LEAVING); 14352 14353 if (reason == 0) 14354 return -EINVAL; 14355 14356 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 14357 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 14358 return -EOPNOTSUPP; 14359 14360 return cfg80211_disconnect(rdev, dev, reason, true); 14361 } 14362 14363 static int nl80211_wiphy_netns(struct sk_buff *skb, struct genl_info *info) 14364 { 14365 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14366 struct net *net; 14367 int err; 14368 14369 if (info->attrs[NL80211_ATTR_PID]) { 14370 u32 pid = nla_get_u32(info->attrs[NL80211_ATTR_PID]); 14371 14372 net = get_net_ns_by_pid(pid); 14373 } else if (info->attrs[NL80211_ATTR_NETNS_FD]) { 14374 u32 fd = nla_get_u32(info->attrs[NL80211_ATTR_NETNS_FD]); 14375 14376 net = get_net_ns_by_fd(fd); 14377 } else { 14378 return -EINVAL; 14379 } 14380 14381 if (IS_ERR(net)) 14382 return PTR_ERR(net); 14383 14384 /* 14385 * The caller already has CAP_NET_ADMIN over the source netns 14386 * (enforced by GENL_UNS_ADMIN_PERM on the genl op). Mirror the 14387 * convention used by net/core/rtnetlink.c::rtnl_get_net_ns_capable() 14388 * and require CAP_NET_ADMIN over the target netns as well, so that 14389 * a caller that is privileged in their own user namespace cannot 14390 * push a wiphy into a netns where they have no privilege. 14391 */ 14392 if (!ns_capable(net->user_ns, CAP_NET_ADMIN)) { 14393 put_net(net); 14394 return -EPERM; 14395 } 14396 14397 err = 0; 14398 14399 /* check if anything to do */ 14400 if (!net_eq(wiphy_net(&rdev->wiphy), net)) 14401 err = cfg80211_switch_netns(rdev, net); 14402 14403 put_net(net); 14404 return err; 14405 } 14406 14407 static int nl80211_set_pmksa(struct sk_buff *skb, struct genl_info *info) 14408 { 14409 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14410 struct net_device *dev = info->user_ptr[1]; 14411 struct cfg80211_pmksa pmksa; 14412 bool ap_pmksa_caching_support = false; 14413 14414 memset(&pmksa, 0, sizeof(struct cfg80211_pmksa)); 14415 14416 ap_pmksa_caching_support = wiphy_ext_feature_isset(&rdev->wiphy, 14417 NL80211_EXT_FEATURE_AP_PMKSA_CACHING); 14418 14419 if (!info->attrs[NL80211_ATTR_PMKID]) 14420 return -EINVAL; 14421 14422 pmksa.pmkid = nla_data(info->attrs[NL80211_ATTR_PMKID]); 14423 14424 if (info->attrs[NL80211_ATTR_MAC]) { 14425 pmksa.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 14426 } else if (info->attrs[NL80211_ATTR_SSID] && 14427 info->attrs[NL80211_ATTR_FILS_CACHE_ID] && 14428 info->attrs[NL80211_ATTR_PMK]) { 14429 pmksa.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); 14430 pmksa.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); 14431 pmksa.cache_id = nla_data(info->attrs[NL80211_ATTR_FILS_CACHE_ID]); 14432 } else { 14433 return -EINVAL; 14434 } 14435 14436 if (info->attrs[NL80211_ATTR_PMK]) { 14437 pmksa.pmk = nla_data(info->attrs[NL80211_ATTR_PMK]); 14438 pmksa.pmk_len = nla_len(info->attrs[NL80211_ATTR_PMK]); 14439 } 14440 14441 if (info->attrs[NL80211_ATTR_PMK_LIFETIME]) 14442 pmksa.pmk_lifetime = 14443 nla_get_u32(info->attrs[NL80211_ATTR_PMK_LIFETIME]); 14444 14445 if (info->attrs[NL80211_ATTR_PMK_REAUTH_THRESHOLD]) 14446 pmksa.pmk_reauth_threshold = 14447 nla_get_u8(info->attrs[NL80211_ATTR_PMK_REAUTH_THRESHOLD]); 14448 14449 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 14450 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT && 14451 !((dev->ieee80211_ptr->iftype == NL80211_IFTYPE_AP || 14452 dev->ieee80211_ptr->iftype == NL80211_IFTYPE_P2P_GO) && 14453 ap_pmksa_caching_support)) 14454 return -EOPNOTSUPP; 14455 14456 if (!rdev->ops->set_pmksa) 14457 return -EOPNOTSUPP; 14458 14459 return rdev_set_pmksa(rdev, dev, &pmksa); 14460 } 14461 14462 static int nl80211_del_pmksa(struct sk_buff *skb, struct genl_info *info) 14463 { 14464 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14465 struct net_device *dev = info->user_ptr[1]; 14466 struct cfg80211_pmksa pmksa; 14467 bool sae_offload_support = false; 14468 bool owe_offload_support = false; 14469 bool ap_pmksa_caching_support = false; 14470 14471 memset(&pmksa, 0, sizeof(struct cfg80211_pmksa)); 14472 14473 sae_offload_support = wiphy_ext_feature_isset(&rdev->wiphy, 14474 NL80211_EXT_FEATURE_SAE_OFFLOAD); 14475 owe_offload_support = wiphy_ext_feature_isset(&rdev->wiphy, 14476 NL80211_EXT_FEATURE_OWE_OFFLOAD); 14477 ap_pmksa_caching_support = wiphy_ext_feature_isset(&rdev->wiphy, 14478 NL80211_EXT_FEATURE_AP_PMKSA_CACHING); 14479 14480 if (info->attrs[NL80211_ATTR_PMKID]) 14481 pmksa.pmkid = nla_data(info->attrs[NL80211_ATTR_PMKID]); 14482 14483 if (info->attrs[NL80211_ATTR_MAC]) { 14484 pmksa.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 14485 } else if (info->attrs[NL80211_ATTR_SSID]) { 14486 /* SSID based pmksa flush supported only for FILS, 14487 * OWE/SAE OFFLOAD cases 14488 */ 14489 if (info->attrs[NL80211_ATTR_FILS_CACHE_ID] && 14490 info->attrs[NL80211_ATTR_PMK]) { 14491 pmksa.cache_id = nla_data(info->attrs[NL80211_ATTR_FILS_CACHE_ID]); 14492 } else if (!sae_offload_support && !owe_offload_support) { 14493 return -EINVAL; 14494 } 14495 pmksa.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); 14496 pmksa.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); 14497 } else { 14498 return -EINVAL; 14499 } 14500 14501 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 14502 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT && 14503 !((dev->ieee80211_ptr->iftype == NL80211_IFTYPE_AP || 14504 dev->ieee80211_ptr->iftype == NL80211_IFTYPE_P2P_GO) && 14505 ap_pmksa_caching_support)) 14506 return -EOPNOTSUPP; 14507 14508 if (!rdev->ops->del_pmksa) 14509 return -EOPNOTSUPP; 14510 14511 return rdev_del_pmksa(rdev, dev, &pmksa); 14512 } 14513 14514 static int nl80211_flush_pmksa(struct sk_buff *skb, struct genl_info *info) 14515 { 14516 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14517 struct net_device *dev = info->user_ptr[1]; 14518 14519 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 14520 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 14521 return -EOPNOTSUPP; 14522 14523 if (!rdev->ops->flush_pmksa) 14524 return -EOPNOTSUPP; 14525 14526 return rdev_flush_pmksa(rdev, dev); 14527 } 14528 14529 static int nl80211_tdls_mgmt(struct sk_buff *skb, struct genl_info *info) 14530 { 14531 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14532 struct net_device *dev = info->user_ptr[1]; 14533 u8 action_code, dialog_token; 14534 u32 peer_capability = 0; 14535 u16 status_code; 14536 u8 *peer; 14537 int link_id; 14538 bool initiator; 14539 14540 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) || 14541 !rdev->ops->tdls_mgmt) 14542 return -EOPNOTSUPP; 14543 14544 if (!info->attrs[NL80211_ATTR_TDLS_ACTION] || 14545 !info->attrs[NL80211_ATTR_STATUS_CODE] || 14546 !info->attrs[NL80211_ATTR_TDLS_DIALOG_TOKEN] || 14547 !info->attrs[NL80211_ATTR_IE] || 14548 !info->attrs[NL80211_ATTR_MAC]) 14549 return -EINVAL; 14550 14551 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); 14552 action_code = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_ACTION]); 14553 status_code = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]); 14554 dialog_token = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_DIALOG_TOKEN]); 14555 initiator = nla_get_flag(info->attrs[NL80211_ATTR_TDLS_INITIATOR]); 14556 if (info->attrs[NL80211_ATTR_TDLS_PEER_CAPABILITY]) 14557 peer_capability = 14558 nla_get_u32(info->attrs[NL80211_ATTR_TDLS_PEER_CAPABILITY]); 14559 link_id = nl80211_link_id_or_invalid(info->attrs); 14560 14561 return rdev_tdls_mgmt(rdev, dev, peer, link_id, action_code, 14562 dialog_token, status_code, peer_capability, 14563 initiator, 14564 nla_data(info->attrs[NL80211_ATTR_IE]), 14565 nla_len(info->attrs[NL80211_ATTR_IE])); 14566 } 14567 14568 static int nl80211_tdls_oper(struct sk_buff *skb, struct genl_info *info) 14569 { 14570 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14571 struct net_device *dev = info->user_ptr[1]; 14572 enum nl80211_tdls_operation operation; 14573 u8 *peer; 14574 14575 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) || 14576 !rdev->ops->tdls_oper) 14577 return -EOPNOTSUPP; 14578 14579 if (!info->attrs[NL80211_ATTR_TDLS_OPERATION] || 14580 !info->attrs[NL80211_ATTR_MAC]) 14581 return -EINVAL; 14582 14583 operation = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_OPERATION]); 14584 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); 14585 14586 return rdev_tdls_oper(rdev, dev, peer, operation); 14587 } 14588 14589 static int nl80211_remain_on_channel(struct sk_buff *skb, 14590 struct genl_info *info) 14591 { 14592 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14593 unsigned int link_id = nl80211_link_id(info->attrs); 14594 struct wireless_dev *wdev = info->user_ptr[1]; 14595 struct cfg80211_chan_def chandef; 14596 const u8 *rx_addr = NULL; 14597 struct sk_buff *msg; 14598 void *hdr; 14599 u64 cookie; 14600 u32 duration; 14601 int err; 14602 14603 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ] || 14604 !info->attrs[NL80211_ATTR_DURATION]) 14605 return -EINVAL; 14606 14607 duration = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]); 14608 14609 if (info->attrs[NL80211_ATTR_MAC]) 14610 rx_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 14611 14612 if (rx_addr && 14613 !wiphy_ext_feature_isset(wdev->wiphy, 14614 NL80211_EXT_FEATURE_ROC_ADDR_FILTER)) 14615 return -EOPNOTSUPP; 14616 14617 if (!rdev->ops->remain_on_channel || 14618 !(rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL)) 14619 return -EOPNOTSUPP; 14620 14621 /* 14622 * We should be on that channel for at least a minimum amount of 14623 * time (10ms) but no longer than the driver supports. 14624 */ 14625 if (duration < NL80211_MIN_REMAIN_ON_CHANNEL_TIME || 14626 duration > rdev->wiphy.max_remain_on_channel_duration) 14627 return -EINVAL; 14628 14629 err = nl80211_parse_chandef(rdev, info->extack, info->attrs, &chandef, 14630 false); 14631 if (err) 14632 return err; 14633 14634 if (!cfg80211_off_channel_oper_allowed(wdev, chandef.chan)) { 14635 const struct cfg80211_chan_def *oper_chandef, *compat_chandef; 14636 14637 oper_chandef = wdev_chandef(wdev, link_id); 14638 14639 if (WARN_ON(!oper_chandef)) { 14640 /* cannot happen since we must beacon to get here */ 14641 WARN_ON(1); 14642 return -EBUSY; 14643 } 14644 14645 /* note: returns first one if identical chandefs */ 14646 compat_chandef = cfg80211_chandef_compatible(&chandef, 14647 oper_chandef); 14648 14649 if (compat_chandef != &chandef) 14650 return -EBUSY; 14651 } 14652 14653 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 14654 if (!msg) 14655 return -ENOMEM; 14656 14657 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 14658 NL80211_CMD_REMAIN_ON_CHANNEL); 14659 if (!hdr) { 14660 err = -ENOBUFS; 14661 goto free_msg; 14662 } 14663 14664 cookie = cfg80211_assign_cookie(rdev); 14665 err = rdev_remain_on_channel(rdev, wdev, chandef.chan, 14666 duration, cookie, rx_addr); 14667 14668 if (err) 14669 goto free_msg; 14670 14671 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie, 14672 NL80211_ATTR_PAD)) 14673 goto nla_put_failure; 14674 14675 genlmsg_end(msg, hdr); 14676 14677 return genlmsg_reply(msg, info); 14678 14679 nla_put_failure: 14680 err = -ENOBUFS; 14681 free_msg: 14682 nlmsg_free(msg); 14683 return err; 14684 } 14685 14686 static int nl80211_cancel_remain_on_channel(struct sk_buff *skb, 14687 struct genl_info *info) 14688 { 14689 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14690 struct wireless_dev *wdev = info->user_ptr[1]; 14691 u64 cookie; 14692 14693 if (!info->attrs[NL80211_ATTR_COOKIE]) 14694 return -EINVAL; 14695 14696 if (!rdev->ops->cancel_remain_on_channel) 14697 return -EOPNOTSUPP; 14698 14699 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); 14700 14701 return rdev_cancel_remain_on_channel(rdev, wdev, cookie); 14702 } 14703 14704 static int nl80211_set_tx_bitrate_mask(struct sk_buff *skb, 14705 struct genl_info *info) 14706 { 14707 struct cfg80211_bitrate_mask mask; 14708 unsigned int link_id = nl80211_link_id(info->attrs); 14709 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14710 struct net_device *dev = info->user_ptr[1]; 14711 int err; 14712 14713 if (!rdev->ops->set_bitrate_mask) 14714 return -EOPNOTSUPP; 14715 14716 err = nl80211_parse_tx_bitrate_mask(info, info->attrs, 14717 NL80211_ATTR_TX_RATES, &mask, 14718 dev, true, link_id); 14719 if (err) 14720 return err; 14721 14722 return rdev_set_bitrate_mask(rdev, dev, link_id, NULL, &mask); 14723 } 14724 14725 static int nl80211_register_mgmt(struct sk_buff *skb, struct genl_info *info) 14726 { 14727 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14728 struct wireless_dev *wdev = info->user_ptr[1]; 14729 u16 frame_type = IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ACTION; 14730 14731 if (!info->attrs[NL80211_ATTR_FRAME_MATCH]) 14732 return -EINVAL; 14733 14734 if (info->attrs[NL80211_ATTR_FRAME_TYPE]) 14735 frame_type = nla_get_u16(info->attrs[NL80211_ATTR_FRAME_TYPE]); 14736 14737 switch (wdev->iftype) { 14738 case NL80211_IFTYPE_STATION: 14739 case NL80211_IFTYPE_ADHOC: 14740 case NL80211_IFTYPE_P2P_CLIENT: 14741 case NL80211_IFTYPE_AP: 14742 case NL80211_IFTYPE_AP_VLAN: 14743 case NL80211_IFTYPE_MESH_POINT: 14744 case NL80211_IFTYPE_P2P_GO: 14745 case NL80211_IFTYPE_P2P_DEVICE: 14746 break; 14747 case NL80211_IFTYPE_NAN: 14748 case NL80211_IFTYPE_NAN_DATA: 14749 if (!wiphy_ext_feature_isset(wdev->wiphy, 14750 NL80211_EXT_FEATURE_SECURE_NAN) && 14751 !(wdev->wiphy->nan_capa.flags & 14752 WIPHY_NAN_FLAGS_USERSPACE_DE)) 14753 return -EOPNOTSUPP; 14754 break; 14755 case NL80211_IFTYPE_PD: 14756 if (!wiphy_ext_feature_isset(wdev->wiphy, 14757 NL80211_EXT_FEATURE_SECURE_RTT)) 14758 return -EOPNOTSUPP; 14759 break; 14760 default: 14761 return -EOPNOTSUPP; 14762 } 14763 14764 /* not much point in registering if we can't reply */ 14765 if (!rdev->ops->mgmt_tx) 14766 return -EOPNOTSUPP; 14767 14768 if (info->attrs[NL80211_ATTR_RECEIVE_MULTICAST] && 14769 !wiphy_ext_feature_isset(&rdev->wiphy, 14770 NL80211_EXT_FEATURE_MULTICAST_REGISTRATIONS)) { 14771 GENL_SET_ERR_MSG(info, 14772 "multicast RX registrations are not supported"); 14773 return -EOPNOTSUPP; 14774 } 14775 14776 return cfg80211_mlme_register_mgmt(wdev, info->snd_portid, frame_type, 14777 nla_data(info->attrs[NL80211_ATTR_FRAME_MATCH]), 14778 nla_len(info->attrs[NL80211_ATTR_FRAME_MATCH]), 14779 info->attrs[NL80211_ATTR_RECEIVE_MULTICAST], 14780 info->extack); 14781 } 14782 14783 static int nl80211_tx_mgmt(struct sk_buff *skb, struct genl_info *info) 14784 { 14785 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14786 struct wireless_dev *wdev = info->user_ptr[1]; 14787 struct cfg80211_chan_def chandef; 14788 int err; 14789 void *hdr = NULL; 14790 u64 cookie; 14791 struct sk_buff *msg = NULL; 14792 struct cfg80211_mgmt_tx_params params = { 14793 .dont_wait_for_ack = 14794 info->attrs[NL80211_ATTR_DONT_WAIT_FOR_ACK], 14795 }; 14796 14797 if (!info->attrs[NL80211_ATTR_FRAME]) 14798 return -EINVAL; 14799 14800 if (!rdev->ops->mgmt_tx) 14801 return -EOPNOTSUPP; 14802 14803 switch (wdev->iftype) { 14804 case NL80211_IFTYPE_P2P_DEVICE: 14805 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ]) 14806 return -EINVAL; 14807 break; 14808 case NL80211_IFTYPE_STATION: 14809 case NL80211_IFTYPE_ADHOC: 14810 case NL80211_IFTYPE_P2P_CLIENT: 14811 case NL80211_IFTYPE_AP: 14812 case NL80211_IFTYPE_AP_VLAN: 14813 case NL80211_IFTYPE_MESH_POINT: 14814 case NL80211_IFTYPE_P2P_GO: 14815 break; 14816 case NL80211_IFTYPE_NAN: 14817 case NL80211_IFTYPE_NAN_DATA: 14818 if (!wiphy_ext_feature_isset(wdev->wiphy, 14819 NL80211_EXT_FEATURE_SECURE_NAN) && 14820 !(wdev->wiphy->nan_capa.flags & 14821 WIPHY_NAN_FLAGS_USERSPACE_DE)) 14822 return -EOPNOTSUPP; 14823 break; 14824 case NL80211_IFTYPE_PD: 14825 if (!wiphy_ext_feature_isset(wdev->wiphy, 14826 NL80211_EXT_FEATURE_SECURE_RTT)) 14827 return -EOPNOTSUPP; 14828 break; 14829 default: 14830 return -EOPNOTSUPP; 14831 } 14832 14833 if (info->attrs[NL80211_ATTR_DURATION]) { 14834 if (!(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX)) 14835 return -EINVAL; 14836 params.wait = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]); 14837 14838 /* 14839 * We should wait on the channel for at least a minimum amount 14840 * of time (10ms) but no longer than the driver supports. 14841 */ 14842 if (params.wait < NL80211_MIN_REMAIN_ON_CHANNEL_TIME || 14843 params.wait > rdev->wiphy.max_remain_on_channel_duration) 14844 return -EINVAL; 14845 } 14846 14847 params.offchan = info->attrs[NL80211_ATTR_OFFCHANNEL_TX_OK]; 14848 14849 if (params.offchan && !(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX)) 14850 return -EINVAL; 14851 14852 params.no_cck = nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]); 14853 14854 /* get the channel if any has been specified, otherwise pass NULL to 14855 * the driver. The latter will use the current one 14856 */ 14857 chandef.chan = NULL; 14858 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { 14859 err = nl80211_parse_chandef(rdev, info->extack, info->attrs, 14860 &chandef, false); 14861 if (err) 14862 return err; 14863 } 14864 14865 if (!chandef.chan && params.offchan) 14866 return -EINVAL; 14867 14868 if (params.offchan && 14869 !cfg80211_off_channel_oper_allowed(wdev, chandef.chan)) 14870 return -EBUSY; 14871 14872 params.link_id = nl80211_link_id_or_invalid(info->attrs); 14873 /* 14874 * This now races due to the unlock, but we cannot check 14875 * the valid links for the _station_ anyway, so that's up 14876 * to the driver. 14877 */ 14878 if (params.link_id >= 0 && 14879 !(wdev->valid_links & BIT(params.link_id))) 14880 return -EINVAL; 14881 14882 params.buf = nla_data(info->attrs[NL80211_ATTR_FRAME]); 14883 params.len = nla_len(info->attrs[NL80211_ATTR_FRAME]); 14884 14885 err = nl80211_parse_counter_offsets(rdev, NULL, params.len, -1, 14886 info->attrs[NL80211_ATTR_CSA_C_OFFSETS_TX], 14887 ¶ms.csa_offsets, 14888 ¶ms.n_csa_offsets); 14889 if (err) 14890 return err; 14891 14892 if (!params.dont_wait_for_ack) { 14893 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 14894 if (!msg) 14895 return -ENOMEM; 14896 14897 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 14898 NL80211_CMD_FRAME); 14899 if (!hdr) { 14900 err = -ENOBUFS; 14901 goto free_msg; 14902 } 14903 } 14904 14905 params.chan = chandef.chan; 14906 cookie = cfg80211_assign_cookie(rdev); 14907 err = cfg80211_mlme_mgmt_tx(rdev, wdev, ¶ms, cookie); 14908 if (err) 14909 goto free_msg; 14910 14911 if (msg) { 14912 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie, 14913 NL80211_ATTR_PAD)) 14914 goto nla_put_failure; 14915 14916 genlmsg_end(msg, hdr); 14917 return genlmsg_reply(msg, info); 14918 } 14919 14920 return 0; 14921 14922 nla_put_failure: 14923 err = -ENOBUFS; 14924 free_msg: 14925 nlmsg_free(msg); 14926 return err; 14927 } 14928 14929 static int nl80211_tx_mgmt_cancel_wait(struct sk_buff *skb, struct genl_info *info) 14930 { 14931 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14932 struct wireless_dev *wdev = info->user_ptr[1]; 14933 u64 cookie; 14934 14935 if (!info->attrs[NL80211_ATTR_COOKIE]) 14936 return -EINVAL; 14937 14938 if (!rdev->ops->mgmt_tx_cancel_wait) 14939 return -EOPNOTSUPP; 14940 14941 switch (wdev->iftype) { 14942 case NL80211_IFTYPE_STATION: 14943 case NL80211_IFTYPE_ADHOC: 14944 case NL80211_IFTYPE_P2P_CLIENT: 14945 case NL80211_IFTYPE_AP: 14946 case NL80211_IFTYPE_AP_VLAN: 14947 case NL80211_IFTYPE_P2P_GO: 14948 case NL80211_IFTYPE_P2P_DEVICE: 14949 break; 14950 case NL80211_IFTYPE_NAN: 14951 if (!wiphy_ext_feature_isset(wdev->wiphy, 14952 NL80211_EXT_FEATURE_SECURE_NAN)) 14953 return -EOPNOTSUPP; 14954 break; 14955 case NL80211_IFTYPE_PD: 14956 if (!wiphy_ext_feature_isset(wdev->wiphy, 14957 NL80211_EXT_FEATURE_SECURE_RTT)) 14958 return -EOPNOTSUPP; 14959 break; 14960 default: 14961 return -EOPNOTSUPP; 14962 } 14963 14964 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); 14965 14966 return rdev_mgmt_tx_cancel_wait(rdev, wdev, cookie); 14967 } 14968 14969 static int nl80211_set_power_save(struct sk_buff *skb, struct genl_info *info) 14970 { 14971 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14972 struct wireless_dev *wdev; 14973 struct net_device *dev = info->user_ptr[1]; 14974 u8 ps_state; 14975 bool state; 14976 int err; 14977 14978 if (!info->attrs[NL80211_ATTR_PS_STATE]) 14979 return -EINVAL; 14980 14981 ps_state = nla_get_u32(info->attrs[NL80211_ATTR_PS_STATE]); 14982 14983 wdev = dev->ieee80211_ptr; 14984 14985 if (!rdev->ops->set_power_mgmt) 14986 return -EOPNOTSUPP; 14987 14988 state = (ps_state == NL80211_PS_ENABLED) ? true : false; 14989 14990 if (state == wdev->ps) 14991 return 0; 14992 14993 err = rdev_set_power_mgmt(rdev, dev, state, wdev->ps_timeout); 14994 if (!err) 14995 wdev->ps = state; 14996 return err; 14997 } 14998 14999 static int nl80211_get_power_save(struct sk_buff *skb, struct genl_info *info) 15000 { 15001 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 15002 enum nl80211_ps_state ps_state; 15003 struct wireless_dev *wdev; 15004 struct net_device *dev = info->user_ptr[1]; 15005 struct sk_buff *msg; 15006 void *hdr; 15007 int err; 15008 15009 wdev = dev->ieee80211_ptr; 15010 15011 if (!rdev->ops->set_power_mgmt) 15012 return -EOPNOTSUPP; 15013 15014 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 15015 if (!msg) 15016 return -ENOMEM; 15017 15018 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 15019 NL80211_CMD_GET_POWER_SAVE); 15020 if (!hdr) { 15021 err = -ENOBUFS; 15022 goto free_msg; 15023 } 15024 15025 if (wdev->ps) 15026 ps_state = NL80211_PS_ENABLED; 15027 else 15028 ps_state = NL80211_PS_DISABLED; 15029 15030 if (nla_put_u32(msg, NL80211_ATTR_PS_STATE, ps_state)) 15031 goto nla_put_failure; 15032 15033 genlmsg_end(msg, hdr); 15034 return genlmsg_reply(msg, info); 15035 15036 nla_put_failure: 15037 err = -ENOBUFS; 15038 free_msg: 15039 nlmsg_free(msg); 15040 return err; 15041 } 15042 15043 static const struct nla_policy 15044 nl80211_attr_cqm_policy[NL80211_ATTR_CQM_MAX + 1] = { 15045 [NL80211_ATTR_CQM_RSSI_THOLD] = { .type = NLA_BINARY }, 15046 [NL80211_ATTR_CQM_RSSI_HYST] = { .type = NLA_U32 }, 15047 [NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT] = { .type = NLA_U32 }, 15048 [NL80211_ATTR_CQM_TXE_RATE] = { .type = NLA_U32 }, 15049 [NL80211_ATTR_CQM_TXE_PKTS] = { .type = NLA_U32 }, 15050 [NL80211_ATTR_CQM_TXE_INTVL] = { .type = NLA_U32 }, 15051 [NL80211_ATTR_CQM_RSSI_LEVEL] = { .type = NLA_S32 }, 15052 }; 15053 15054 static int nl80211_set_cqm_txe(struct genl_info *info, 15055 u32 rate, u32 pkts, u32 intvl) 15056 { 15057 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 15058 struct net_device *dev = info->user_ptr[1]; 15059 struct wireless_dev *wdev = dev->ieee80211_ptr; 15060 15061 if (rate > 100 || intvl > NL80211_CQM_TXE_MAX_INTVL) 15062 return -EINVAL; 15063 15064 if (!rdev->ops->set_cqm_txe_config) 15065 return -EOPNOTSUPP; 15066 15067 if (wdev->iftype != NL80211_IFTYPE_STATION && 15068 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) 15069 return -EOPNOTSUPP; 15070 15071 return rdev_set_cqm_txe_config(rdev, dev, rate, pkts, intvl); 15072 } 15073 15074 static int cfg80211_cqm_rssi_update(struct cfg80211_registered_device *rdev, 15075 struct net_device *dev, 15076 struct cfg80211_cqm_config *cqm_config) 15077 { 15078 struct wireless_dev *wdev = dev->ieee80211_ptr; 15079 s32 last, low, high; 15080 u32 hyst; 15081 int i, n, low_index; 15082 int err; 15083 15084 /* 15085 * Obtain current RSSI value if possible, if not and no RSSI threshold 15086 * event has been received yet, we should receive an event after a 15087 * connection is established and enough beacons received to calculate 15088 * the average. 15089 */ 15090 if (!cqm_config->last_rssi_event_value && 15091 wdev->links[0].client.current_bss && 15092 rdev->ops->get_station) { 15093 struct station_info sinfo = {}; 15094 u8 *mac_addr; 15095 15096 mac_addr = wdev->links[0].client.current_bss->pub.bssid; 15097 15098 err = rdev_get_station(rdev, wdev, mac_addr, &sinfo); 15099 if (err) 15100 return err; 15101 15102 cfg80211_sinfo_release_content(&sinfo); 15103 if (sinfo.filled & BIT_ULL(NL80211_STA_INFO_BEACON_SIGNAL_AVG)) 15104 cqm_config->last_rssi_event_value = 15105 (s8) sinfo.rx_beacon_signal_avg; 15106 } 15107 15108 last = cqm_config->last_rssi_event_value; 15109 hyst = cqm_config->rssi_hyst; 15110 n = cqm_config->n_rssi_thresholds; 15111 15112 for (i = 0; i < n; i++) { 15113 i = array_index_nospec(i, n); 15114 if (last < cqm_config->rssi_thresholds[i]) 15115 break; 15116 } 15117 15118 low_index = i - 1; 15119 if (low_index >= 0) { 15120 low_index = array_index_nospec(low_index, n); 15121 low = cqm_config->rssi_thresholds[low_index] - hyst; 15122 } else { 15123 low = S32_MIN; 15124 } 15125 if (i < n) { 15126 i = array_index_nospec(i, n); 15127 high = cqm_config->rssi_thresholds[i] + hyst - 1; 15128 } else { 15129 high = S32_MAX; 15130 } 15131 15132 return rdev_set_cqm_rssi_range_config(rdev, dev, low, high); 15133 } 15134 15135 static int nl80211_set_cqm_rssi(struct genl_info *info, 15136 const s32 *thresholds, int n_thresholds, 15137 u32 hysteresis) 15138 { 15139 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 15140 struct cfg80211_cqm_config *cqm_config = NULL, *old; 15141 struct net_device *dev = info->user_ptr[1]; 15142 struct wireless_dev *wdev = dev->ieee80211_ptr; 15143 s32 prev = S32_MIN; 15144 int i, err; 15145 15146 /* Check all values negative and sorted */ 15147 for (i = 0; i < n_thresholds; i++) { 15148 if (thresholds[i] > 0 || thresholds[i] <= prev) 15149 return -EINVAL; 15150 15151 prev = thresholds[i]; 15152 } 15153 15154 if (wdev->iftype != NL80211_IFTYPE_STATION && 15155 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) 15156 return -EOPNOTSUPP; 15157 15158 if (n_thresholds == 1 && thresholds[0] == 0) /* Disabling */ 15159 n_thresholds = 0; 15160 15161 old = wiphy_dereference(wdev->wiphy, wdev->cqm_config); 15162 15163 /* if already disabled just succeed */ 15164 if (!n_thresholds && !old) 15165 return 0; 15166 15167 if (n_thresholds > 1) { 15168 if (!wiphy_ext_feature_isset(&rdev->wiphy, 15169 NL80211_EXT_FEATURE_CQM_RSSI_LIST) || 15170 !rdev->ops->set_cqm_rssi_range_config) 15171 return -EOPNOTSUPP; 15172 } else { 15173 if (!rdev->ops->set_cqm_rssi_config) 15174 return -EOPNOTSUPP; 15175 } 15176 15177 if (n_thresholds) { 15178 cqm_config = kzalloc_flex(*cqm_config, rssi_thresholds, 15179 n_thresholds); 15180 if (!cqm_config) 15181 return -ENOMEM; 15182 15183 cqm_config->rssi_hyst = hysteresis; 15184 cqm_config->n_rssi_thresholds = n_thresholds; 15185 memcpy(cqm_config->rssi_thresholds, thresholds, 15186 flex_array_size(cqm_config, rssi_thresholds, 15187 n_thresholds)); 15188 cqm_config->use_range_api = n_thresholds > 1 || 15189 !rdev->ops->set_cqm_rssi_config; 15190 15191 rcu_assign_pointer(wdev->cqm_config, cqm_config); 15192 15193 if (cqm_config->use_range_api) 15194 err = cfg80211_cqm_rssi_update(rdev, dev, cqm_config); 15195 else 15196 err = rdev_set_cqm_rssi_config(rdev, dev, 15197 thresholds[0], 15198 hysteresis); 15199 } else { 15200 RCU_INIT_POINTER(wdev->cqm_config, NULL); 15201 /* if enabled as range also disable via range */ 15202 if (old->use_range_api) 15203 err = rdev_set_cqm_rssi_range_config(rdev, dev, 0, 0); 15204 else 15205 err = rdev_set_cqm_rssi_config(rdev, dev, 0, 0); 15206 } 15207 15208 if (err) { 15209 rcu_assign_pointer(wdev->cqm_config, old); 15210 kfree_rcu(cqm_config, rcu_head); 15211 } else { 15212 kfree_rcu(old, rcu_head); 15213 } 15214 15215 return err; 15216 } 15217 15218 static int nl80211_set_cqm(struct sk_buff *skb, struct genl_info *info) 15219 { 15220 struct nlattr *attrs[NL80211_ATTR_CQM_MAX + 1]; 15221 struct nlattr *cqm; 15222 int err; 15223 15224 cqm = info->attrs[NL80211_ATTR_CQM]; 15225 if (!cqm) 15226 return -EINVAL; 15227 15228 err = nla_parse_nested_deprecated(attrs, NL80211_ATTR_CQM_MAX, cqm, 15229 nl80211_attr_cqm_policy, 15230 info->extack); 15231 if (err) 15232 return err; 15233 15234 if (attrs[NL80211_ATTR_CQM_RSSI_THOLD] && 15235 attrs[NL80211_ATTR_CQM_RSSI_HYST]) { 15236 const s32 *thresholds = 15237 nla_data(attrs[NL80211_ATTR_CQM_RSSI_THOLD]); 15238 int len = nla_len(attrs[NL80211_ATTR_CQM_RSSI_THOLD]); 15239 u32 hysteresis = nla_get_u32(attrs[NL80211_ATTR_CQM_RSSI_HYST]); 15240 15241 if (len % 4) 15242 return -EINVAL; 15243 15244 return nl80211_set_cqm_rssi(info, thresholds, len / 4, 15245 hysteresis); 15246 } 15247 15248 if (attrs[NL80211_ATTR_CQM_TXE_RATE] && 15249 attrs[NL80211_ATTR_CQM_TXE_PKTS] && 15250 attrs[NL80211_ATTR_CQM_TXE_INTVL]) { 15251 u32 rate = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_RATE]); 15252 u32 pkts = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_PKTS]); 15253 u32 intvl = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_INTVL]); 15254 15255 return nl80211_set_cqm_txe(info, rate, pkts, intvl); 15256 } 15257 15258 return -EINVAL; 15259 } 15260 15261 static int nl80211_join_ocb(struct sk_buff *skb, struct genl_info *info) 15262 { 15263 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 15264 struct net_device *dev = info->user_ptr[1]; 15265 struct ocb_setup setup = {}; 15266 int err; 15267 15268 err = nl80211_parse_chandef(rdev, info->extack, info->attrs, 15269 &setup.chandef, false); 15270 if (err) 15271 return err; 15272 15273 return cfg80211_join_ocb(rdev, dev, &setup); 15274 } 15275 15276 static int nl80211_leave_ocb(struct sk_buff *skb, struct genl_info *info) 15277 { 15278 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 15279 struct net_device *dev = info->user_ptr[1]; 15280 15281 return cfg80211_leave_ocb(rdev, dev); 15282 } 15283 15284 static int nl80211_join_mesh(struct sk_buff *skb, struct genl_info *info) 15285 { 15286 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 15287 struct net_device *dev = info->user_ptr[1]; 15288 struct mesh_config cfg; 15289 struct mesh_setup setup; 15290 int err; 15291 15292 /* start with default */ 15293 memcpy(&cfg, &default_mesh_config, sizeof(cfg)); 15294 memcpy(&setup, &default_mesh_setup, sizeof(setup)); 15295 15296 if (info->attrs[NL80211_ATTR_MESH_CONFIG]) { 15297 /* and parse parameters if given */ 15298 err = nl80211_parse_mesh_config(info, &cfg, NULL); 15299 if (err) 15300 return err; 15301 } 15302 15303 if (!info->attrs[NL80211_ATTR_MESH_ID] || 15304 !nla_len(info->attrs[NL80211_ATTR_MESH_ID])) 15305 return -EINVAL; 15306 15307 setup.mesh_id = nla_data(info->attrs[NL80211_ATTR_MESH_ID]); 15308 setup.mesh_id_len = nla_len(info->attrs[NL80211_ATTR_MESH_ID]); 15309 15310 if (info->attrs[NL80211_ATTR_MCAST_RATE] && 15311 !nl80211_parse_mcast_rate(rdev, setup.mcast_rate, 15312 nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]))) 15313 return -EINVAL; 15314 15315 if (info->attrs[NL80211_ATTR_BEACON_INTERVAL]) { 15316 setup.beacon_interval = 15317 nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]); 15318 15319 err = cfg80211_validate_beacon_int(rdev, 15320 NL80211_IFTYPE_MESH_POINT, 15321 setup.beacon_interval); 15322 if (err) 15323 return err; 15324 } 15325 15326 if (info->attrs[NL80211_ATTR_DTIM_PERIOD]) { 15327 setup.dtim_period = 15328 nla_get_u32(info->attrs[NL80211_ATTR_DTIM_PERIOD]); 15329 if (setup.dtim_period < 1 || setup.dtim_period > 100) 15330 return -EINVAL; 15331 } 15332 15333 if (info->attrs[NL80211_ATTR_MESH_SETUP]) { 15334 /* parse additional setup parameters if given */ 15335 err = nl80211_parse_mesh_setup(info, &setup); 15336 if (err) 15337 return err; 15338 } 15339 15340 if (setup.user_mpm) 15341 cfg.auto_open_plinks = false; 15342 15343 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { 15344 err = nl80211_parse_chandef(rdev, info->extack, info->attrs, 15345 &setup.chandef, false); 15346 if (err) 15347 return err; 15348 } else { 15349 /* __cfg80211_join_mesh() will sort it out */ 15350 setup.chandef.chan = NULL; 15351 } 15352 15353 if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) { 15354 u8 *rates = nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); 15355 int n_rates = 15356 nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); 15357 struct ieee80211_supported_band *sband; 15358 15359 if (!setup.chandef.chan) 15360 return -EINVAL; 15361 15362 sband = rdev->wiphy.bands[setup.chandef.chan->band]; 15363 15364 err = ieee80211_get_ratemask(sband, rates, n_rates, 15365 &setup.basic_rates); 15366 if (err) 15367 return err; 15368 } 15369 15370 if (info->attrs[NL80211_ATTR_TX_RATES]) { 15371 err = nl80211_parse_tx_bitrate_mask(info, info->attrs, 15372 NL80211_ATTR_TX_RATES, 15373 &setup.beacon_rate, 15374 dev, false, 0); 15375 if (err) 15376 return err; 15377 15378 if (!setup.chandef.chan) 15379 return -EINVAL; 15380 15381 err = validate_beacon_tx_rate(rdev, setup.chandef.chan->band, 15382 &setup.beacon_rate); 15383 if (err) 15384 return err; 15385 } 15386 15387 setup.userspace_handles_dfs = 15388 nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS]); 15389 15390 if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) { 15391 int r = validate_pae_over_nl80211(rdev, info); 15392 15393 if (r < 0) 15394 return r; 15395 15396 setup.control_port_over_nl80211 = true; 15397 } 15398 15399 err = __cfg80211_join_mesh(rdev, dev, &setup, &cfg); 15400 if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) 15401 dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid; 15402 15403 return err; 15404 } 15405 15406 static int nl80211_leave_mesh(struct sk_buff *skb, struct genl_info *info) 15407 { 15408 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 15409 struct net_device *dev = info->user_ptr[1]; 15410 15411 return cfg80211_leave_mesh(rdev, dev); 15412 } 15413 15414 #ifdef CONFIG_PM 15415 static int nl80211_send_wowlan_patterns(struct sk_buff *msg, 15416 struct cfg80211_registered_device *rdev) 15417 { 15418 struct cfg80211_wowlan *wowlan = rdev->wiphy.wowlan_config; 15419 struct nlattr *nl_pats, *nl_pat; 15420 int i, pat_len; 15421 15422 if (!wowlan->n_patterns) 15423 return 0; 15424 15425 nl_pats = nla_nest_start_noflag(msg, NL80211_WOWLAN_TRIG_PKT_PATTERN); 15426 if (!nl_pats) 15427 return -ENOBUFS; 15428 15429 for (i = 0; i < wowlan->n_patterns; i++) { 15430 nl_pat = nla_nest_start_noflag(msg, i + 1); 15431 if (!nl_pat) 15432 return -ENOBUFS; 15433 pat_len = wowlan->patterns[i].pattern_len; 15434 if (nla_put(msg, NL80211_PKTPAT_MASK, DIV_ROUND_UP(pat_len, 8), 15435 wowlan->patterns[i].mask) || 15436 nla_put(msg, NL80211_PKTPAT_PATTERN, pat_len, 15437 wowlan->patterns[i].pattern) || 15438 nla_put_u32(msg, NL80211_PKTPAT_OFFSET, 15439 wowlan->patterns[i].pkt_offset)) 15440 return -ENOBUFS; 15441 nla_nest_end(msg, nl_pat); 15442 } 15443 nla_nest_end(msg, nl_pats); 15444 15445 return 0; 15446 } 15447 15448 static int nl80211_send_wowlan_tcp(struct sk_buff *msg, 15449 struct cfg80211_wowlan_tcp *tcp) 15450 { 15451 struct nlattr *nl_tcp; 15452 15453 if (!tcp) 15454 return 0; 15455 15456 nl_tcp = nla_nest_start_noflag(msg, 15457 NL80211_WOWLAN_TRIG_TCP_CONNECTION); 15458 if (!nl_tcp) 15459 return -ENOBUFS; 15460 15461 if (nla_put_in_addr(msg, NL80211_WOWLAN_TCP_SRC_IPV4, tcp->src) || 15462 nla_put_in_addr(msg, NL80211_WOWLAN_TCP_DST_IPV4, tcp->dst) || 15463 nla_put(msg, NL80211_WOWLAN_TCP_DST_MAC, ETH_ALEN, tcp->dst_mac) || 15464 nla_put_u16(msg, NL80211_WOWLAN_TCP_SRC_PORT, tcp->src_port) || 15465 nla_put_u16(msg, NL80211_WOWLAN_TCP_DST_PORT, tcp->dst_port) || 15466 nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD, 15467 tcp->payload_len, tcp->payload) || 15468 nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_INTERVAL, 15469 tcp->data_interval) || 15470 nla_put(msg, NL80211_WOWLAN_TCP_WAKE_PAYLOAD, 15471 tcp->wake_len, tcp->wake_data) || 15472 nla_put(msg, NL80211_WOWLAN_TCP_WAKE_MASK, 15473 DIV_ROUND_UP(tcp->wake_len, 8), tcp->wake_mask)) 15474 return -ENOBUFS; 15475 15476 if (tcp->payload_seq.len && 15477 nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ, 15478 sizeof(tcp->payload_seq), &tcp->payload_seq)) 15479 return -ENOBUFS; 15480 15481 if (tcp->payload_tok.len && 15482 nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN, 15483 sizeof(tcp->payload_tok) + tcp->tokens_size, 15484 &tcp->payload_tok)) 15485 return -ENOBUFS; 15486 15487 nla_nest_end(msg, nl_tcp); 15488 15489 return 0; 15490 } 15491 15492 static int nl80211_send_wowlan_nd(struct sk_buff *msg, 15493 struct cfg80211_sched_scan_request *req) 15494 { 15495 struct nlattr *nd, *freqs, *matches, *match, *scan_plans, *scan_plan; 15496 int i; 15497 15498 if (!req) 15499 return 0; 15500 15501 nd = nla_nest_start_noflag(msg, NL80211_WOWLAN_TRIG_NET_DETECT); 15502 if (!nd) 15503 return -ENOBUFS; 15504 15505 if (req->n_scan_plans == 1 && 15506 nla_put_u32(msg, NL80211_ATTR_SCHED_SCAN_INTERVAL, 15507 req->scan_plans[0].interval * 1000)) 15508 return -ENOBUFS; 15509 15510 if (nla_put_u32(msg, NL80211_ATTR_SCHED_SCAN_DELAY, req->delay)) 15511 return -ENOBUFS; 15512 15513 if (req->relative_rssi_set) { 15514 struct nl80211_bss_select_rssi_adjust rssi_adjust; 15515 15516 if (nla_put_s8(msg, NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI, 15517 req->relative_rssi)) 15518 return -ENOBUFS; 15519 15520 rssi_adjust.band = req->rssi_adjust.band; 15521 rssi_adjust.delta = req->rssi_adjust.delta; 15522 if (nla_put(msg, NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST, 15523 sizeof(rssi_adjust), &rssi_adjust)) 15524 return -ENOBUFS; 15525 } 15526 15527 freqs = nla_nest_start_noflag(msg, NL80211_ATTR_SCAN_FREQUENCIES); 15528 if (!freqs) 15529 return -ENOBUFS; 15530 15531 for (i = 0; i < req->n_channels; i++) { 15532 if (nla_put_u32(msg, i, req->channels[i]->center_freq)) 15533 return -ENOBUFS; 15534 } 15535 15536 nla_nest_end(msg, freqs); 15537 15538 if (req->n_match_sets) { 15539 matches = nla_nest_start_noflag(msg, 15540 NL80211_ATTR_SCHED_SCAN_MATCH); 15541 if (!matches) 15542 return -ENOBUFS; 15543 15544 for (i = 0; i < req->n_match_sets; i++) { 15545 match = nla_nest_start_noflag(msg, i); 15546 if (!match) 15547 return -ENOBUFS; 15548 15549 if (nla_put(msg, NL80211_SCHED_SCAN_MATCH_ATTR_SSID, 15550 req->match_sets[i].ssid.ssid_len, 15551 req->match_sets[i].ssid.ssid)) 15552 return -ENOBUFS; 15553 nla_nest_end(msg, match); 15554 } 15555 nla_nest_end(msg, matches); 15556 } 15557 15558 scan_plans = nla_nest_start_noflag(msg, NL80211_ATTR_SCHED_SCAN_PLANS); 15559 if (!scan_plans) 15560 return -ENOBUFS; 15561 15562 for (i = 0; i < req->n_scan_plans; i++) { 15563 scan_plan = nla_nest_start_noflag(msg, i + 1); 15564 if (!scan_plan) 15565 return -ENOBUFS; 15566 15567 if (nla_put_u32(msg, NL80211_SCHED_SCAN_PLAN_INTERVAL, 15568 req->scan_plans[i].interval) || 15569 (req->scan_plans[i].iterations && 15570 nla_put_u32(msg, NL80211_SCHED_SCAN_PLAN_ITERATIONS, 15571 req->scan_plans[i].iterations))) 15572 return -ENOBUFS; 15573 nla_nest_end(msg, scan_plan); 15574 } 15575 nla_nest_end(msg, scan_plans); 15576 15577 nla_nest_end(msg, nd); 15578 15579 return 0; 15580 } 15581 15582 static int nl80211_get_wowlan(struct sk_buff *skb, struct genl_info *info) 15583 { 15584 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 15585 struct sk_buff *msg; 15586 void *hdr; 15587 u32 size = NLMSG_DEFAULT_SIZE; 15588 15589 if (!rdev->wiphy.wowlan) 15590 return -EOPNOTSUPP; 15591 15592 if (rdev->wiphy.wowlan_config && rdev->wiphy.wowlan_config->tcp) { 15593 /* adjust size to have room for all the data */ 15594 size += rdev->wiphy.wowlan_config->tcp->tokens_size + 15595 rdev->wiphy.wowlan_config->tcp->payload_len + 15596 rdev->wiphy.wowlan_config->tcp->wake_len + 15597 rdev->wiphy.wowlan_config->tcp->wake_len / 8; 15598 } 15599 15600 msg = nlmsg_new(size, GFP_KERNEL); 15601 if (!msg) 15602 return -ENOMEM; 15603 15604 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 15605 NL80211_CMD_GET_WOWLAN); 15606 if (!hdr) 15607 goto nla_put_failure; 15608 15609 if (rdev->wiphy.wowlan_config) { 15610 struct nlattr *nl_wowlan; 15611 15612 nl_wowlan = nla_nest_start_noflag(msg, 15613 NL80211_ATTR_WOWLAN_TRIGGERS); 15614 if (!nl_wowlan) 15615 goto nla_put_failure; 15616 15617 if ((rdev->wiphy.wowlan_config->any && 15618 nla_put_flag(msg, NL80211_WOWLAN_TRIG_ANY)) || 15619 (rdev->wiphy.wowlan_config->disconnect && 15620 nla_put_flag(msg, NL80211_WOWLAN_TRIG_DISCONNECT)) || 15621 (rdev->wiphy.wowlan_config->magic_pkt && 15622 nla_put_flag(msg, NL80211_WOWLAN_TRIG_MAGIC_PKT)) || 15623 (rdev->wiphy.wowlan_config->gtk_rekey_failure && 15624 nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE)) || 15625 (rdev->wiphy.wowlan_config->eap_identity_req && 15626 nla_put_flag(msg, NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST)) || 15627 (rdev->wiphy.wowlan_config->four_way_handshake && 15628 nla_put_flag(msg, NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE)) || 15629 (rdev->wiphy.wowlan_config->rfkill_release && 15630 nla_put_flag(msg, NL80211_WOWLAN_TRIG_RFKILL_RELEASE))) 15631 goto nla_put_failure; 15632 15633 if (nl80211_send_wowlan_patterns(msg, rdev)) 15634 goto nla_put_failure; 15635 15636 if (nl80211_send_wowlan_tcp(msg, 15637 rdev->wiphy.wowlan_config->tcp)) 15638 goto nla_put_failure; 15639 15640 if (nl80211_send_wowlan_nd( 15641 msg, 15642 rdev->wiphy.wowlan_config->nd_config)) 15643 goto nla_put_failure; 15644 15645 nla_nest_end(msg, nl_wowlan); 15646 } 15647 15648 genlmsg_end(msg, hdr); 15649 return genlmsg_reply(msg, info); 15650 15651 nla_put_failure: 15652 nlmsg_free(msg); 15653 return -ENOBUFS; 15654 } 15655 15656 static int nl80211_parse_wowlan_tcp(struct cfg80211_registered_device *rdev, 15657 struct nlattr *attr, 15658 struct cfg80211_wowlan *trig) 15659 { 15660 struct nlattr *tb[NUM_NL80211_WOWLAN_TCP]; 15661 struct cfg80211_wowlan_tcp *cfg; 15662 struct nl80211_wowlan_tcp_data_token *tok = NULL; 15663 struct nl80211_wowlan_tcp_data_seq *seq = NULL; 15664 u32 size; 15665 u32 data_size, wake_size, tokens_size = 0, wake_mask_size; 15666 int err, port; 15667 15668 if (!rdev->wiphy.wowlan->tcp) 15669 return -EINVAL; 15670 15671 err = nla_parse_nested_deprecated(tb, MAX_NL80211_WOWLAN_TCP, attr, 15672 nl80211_wowlan_tcp_policy, NULL); 15673 if (err) 15674 return err; 15675 15676 if (!tb[NL80211_WOWLAN_TCP_SRC_IPV4] || 15677 !tb[NL80211_WOWLAN_TCP_DST_IPV4] || 15678 !tb[NL80211_WOWLAN_TCP_DST_MAC] || 15679 !tb[NL80211_WOWLAN_TCP_DST_PORT] || 15680 !tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD] || 15681 !tb[NL80211_WOWLAN_TCP_DATA_INTERVAL] || 15682 !tb[NL80211_WOWLAN_TCP_WAKE_PAYLOAD] || 15683 !tb[NL80211_WOWLAN_TCP_WAKE_MASK]) 15684 return -EINVAL; 15685 15686 data_size = nla_len(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD]); 15687 if (data_size > rdev->wiphy.wowlan->tcp->data_payload_max) 15688 return -EINVAL; 15689 15690 if (nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]) > 15691 rdev->wiphy.wowlan->tcp->data_interval_max || 15692 nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]) == 0) 15693 return -EINVAL; 15694 15695 wake_size = nla_len(tb[NL80211_WOWLAN_TCP_WAKE_PAYLOAD]); 15696 if (wake_size > rdev->wiphy.wowlan->tcp->wake_payload_max) 15697 return -EINVAL; 15698 15699 wake_mask_size = nla_len(tb[NL80211_WOWLAN_TCP_WAKE_MASK]); 15700 if (wake_mask_size != DIV_ROUND_UP(wake_size, 8)) 15701 return -EINVAL; 15702 15703 if (tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN]) { 15704 u32 tokln = nla_len(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN]); 15705 15706 tok = nla_data(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN]); 15707 tokens_size = tokln - sizeof(*tok); 15708 15709 if (!tok->len || tokens_size % tok->len) 15710 return -EINVAL; 15711 if (!rdev->wiphy.wowlan->tcp->tok) 15712 return -EINVAL; 15713 if (tok->len > rdev->wiphy.wowlan->tcp->tok->max_len) 15714 return -EINVAL; 15715 if (tok->len < rdev->wiphy.wowlan->tcp->tok->min_len) 15716 return -EINVAL; 15717 if (tokens_size > rdev->wiphy.wowlan->tcp->tok->bufsize) 15718 return -EINVAL; 15719 if (tok->offset + tok->len > data_size) 15720 return -EINVAL; 15721 } 15722 15723 if (tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ]) { 15724 seq = nla_data(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ]); 15725 if (!rdev->wiphy.wowlan->tcp->seq) 15726 return -EINVAL; 15727 if (seq->len == 0 || seq->len > 4) 15728 return -EINVAL; 15729 if (seq->len + seq->offset > data_size) 15730 return -EINVAL; 15731 } 15732 15733 size = sizeof(*cfg); 15734 size += data_size; 15735 size += wake_size + wake_mask_size; 15736 size += tokens_size; 15737 15738 cfg = kzalloc(size, GFP_KERNEL); 15739 if (!cfg) 15740 return -ENOMEM; 15741 cfg->src = nla_get_in_addr(tb[NL80211_WOWLAN_TCP_SRC_IPV4]); 15742 cfg->dst = nla_get_in_addr(tb[NL80211_WOWLAN_TCP_DST_IPV4]); 15743 memcpy(cfg->dst_mac, nla_data(tb[NL80211_WOWLAN_TCP_DST_MAC]), 15744 ETH_ALEN); 15745 port = nla_get_u16_default(tb[NL80211_WOWLAN_TCP_SRC_PORT], 0); 15746 #ifdef CONFIG_INET 15747 /* allocate a socket and port for it and use it */ 15748 err = __sock_create(wiphy_net(&rdev->wiphy), PF_INET, SOCK_STREAM, 15749 IPPROTO_TCP, &cfg->sock, 1); 15750 if (err) { 15751 kfree(cfg); 15752 return err; 15753 } 15754 if (inet_csk_get_port(cfg->sock->sk, port)) { 15755 sock_release(cfg->sock); 15756 kfree(cfg); 15757 return -EADDRINUSE; 15758 } 15759 cfg->src_port = inet_sk(cfg->sock->sk)->inet_num; 15760 #else 15761 if (!port) { 15762 kfree(cfg); 15763 return -EINVAL; 15764 } 15765 cfg->src_port = port; 15766 #endif 15767 15768 cfg->dst_port = nla_get_u16(tb[NL80211_WOWLAN_TCP_DST_PORT]); 15769 cfg->payload_len = data_size; 15770 cfg->payload = (u8 *)cfg + sizeof(*cfg) + tokens_size; 15771 memcpy((void *)cfg->payload, 15772 nla_data(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD]), 15773 data_size); 15774 if (seq) 15775 cfg->payload_seq = *seq; 15776 cfg->data_interval = nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]); 15777 cfg->wake_len = wake_size; 15778 cfg->wake_data = (u8 *)cfg + sizeof(*cfg) + tokens_size + data_size; 15779 memcpy((void *)cfg->wake_data, 15780 nla_data(tb[NL80211_WOWLAN_TCP_WAKE_PAYLOAD]), 15781 wake_size); 15782 cfg->wake_mask = (u8 *)cfg + sizeof(*cfg) + tokens_size + 15783 data_size + wake_size; 15784 memcpy((void *)cfg->wake_mask, 15785 nla_data(tb[NL80211_WOWLAN_TCP_WAKE_MASK]), 15786 wake_mask_size); 15787 if (tok) { 15788 cfg->tokens_size = tokens_size; 15789 cfg->payload_tok = *tok; 15790 memcpy(cfg->payload_tok.token_stream, tok->token_stream, 15791 tokens_size); 15792 } 15793 15794 trig->tcp = cfg; 15795 15796 return 0; 15797 } 15798 15799 static int nl80211_parse_wowlan_nd(struct cfg80211_registered_device *rdev, 15800 const struct wiphy_wowlan_support *wowlan, 15801 struct nlattr *attr, 15802 struct cfg80211_wowlan *trig) 15803 { 15804 struct nlattr **tb; 15805 int err; 15806 15807 tb = kzalloc_objs(*tb, NUM_NL80211_ATTR); 15808 if (!tb) 15809 return -ENOMEM; 15810 15811 if (!(wowlan->flags & WIPHY_WOWLAN_NET_DETECT)) { 15812 err = -EOPNOTSUPP; 15813 goto out; 15814 } 15815 15816 err = nla_parse_nested_deprecated(tb, NL80211_ATTR_MAX, attr, 15817 nl80211_policy, NULL); 15818 if (err) 15819 goto out; 15820 15821 trig->nd_config = nl80211_parse_sched_scan(&rdev->wiphy, NULL, tb, 15822 wowlan->max_nd_match_sets); 15823 err = PTR_ERR_OR_ZERO(trig->nd_config); 15824 if (err) 15825 trig->nd_config = NULL; 15826 15827 out: 15828 kfree(tb); 15829 return err; 15830 } 15831 15832 static int nl80211_set_wowlan(struct sk_buff *skb, struct genl_info *info) 15833 { 15834 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 15835 struct nlattr *tb[NUM_NL80211_WOWLAN_TRIG]; 15836 struct cfg80211_wowlan new_triggers = {}; 15837 struct cfg80211_wowlan *ntrig; 15838 const struct wiphy_wowlan_support *wowlan = rdev->wiphy.wowlan; 15839 int err, i; 15840 bool prev_enabled = rdev->wiphy.wowlan_config; 15841 bool regular = false; 15842 15843 if (!wowlan) 15844 return -EOPNOTSUPP; 15845 15846 if (!info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS]) { 15847 cfg80211_rdev_free_wowlan(rdev); 15848 rdev->wiphy.wowlan_config = NULL; 15849 goto set_wakeup; 15850 } 15851 15852 err = nla_parse_nested_deprecated(tb, MAX_NL80211_WOWLAN_TRIG, 15853 info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS], 15854 nl80211_wowlan_policy, info->extack); 15855 if (err) 15856 return err; 15857 15858 if (tb[NL80211_WOWLAN_TRIG_ANY]) { 15859 if (!(wowlan->flags & WIPHY_WOWLAN_ANY)) 15860 return -EINVAL; 15861 new_triggers.any = true; 15862 } 15863 15864 if (tb[NL80211_WOWLAN_TRIG_DISCONNECT]) { 15865 if (!(wowlan->flags & WIPHY_WOWLAN_DISCONNECT)) 15866 return -EINVAL; 15867 new_triggers.disconnect = true; 15868 regular = true; 15869 } 15870 15871 if (tb[NL80211_WOWLAN_TRIG_MAGIC_PKT]) { 15872 if (!(wowlan->flags & WIPHY_WOWLAN_MAGIC_PKT)) 15873 return -EINVAL; 15874 new_triggers.magic_pkt = true; 15875 regular = true; 15876 } 15877 15878 if (tb[NL80211_WOWLAN_TRIG_GTK_REKEY_SUPPORTED]) 15879 return -EINVAL; 15880 15881 if (tb[NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE]) { 15882 if (!(wowlan->flags & WIPHY_WOWLAN_GTK_REKEY_FAILURE)) 15883 return -EINVAL; 15884 new_triggers.gtk_rekey_failure = true; 15885 regular = true; 15886 } 15887 15888 if (tb[NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST]) { 15889 if (!(wowlan->flags & WIPHY_WOWLAN_EAP_IDENTITY_REQ)) 15890 return -EINVAL; 15891 new_triggers.eap_identity_req = true; 15892 regular = true; 15893 } 15894 15895 if (tb[NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE]) { 15896 if (!(wowlan->flags & WIPHY_WOWLAN_4WAY_HANDSHAKE)) 15897 return -EINVAL; 15898 new_triggers.four_way_handshake = true; 15899 regular = true; 15900 } 15901 15902 if (tb[NL80211_WOWLAN_TRIG_RFKILL_RELEASE]) { 15903 if (!(wowlan->flags & WIPHY_WOWLAN_RFKILL_RELEASE)) 15904 return -EINVAL; 15905 new_triggers.rfkill_release = true; 15906 regular = true; 15907 } 15908 15909 if (tb[NL80211_WOWLAN_TRIG_PKT_PATTERN]) { 15910 struct nlattr *pat; 15911 int n_patterns = 0; 15912 int rem, pat_len, mask_len, pkt_offset; 15913 struct nlattr *pat_tb[NUM_NL80211_PKTPAT]; 15914 15915 regular = true; 15916 15917 nla_for_each_nested(pat, tb[NL80211_WOWLAN_TRIG_PKT_PATTERN], 15918 rem) 15919 n_patterns++; 15920 if (n_patterns > wowlan->n_patterns) 15921 return -EINVAL; 15922 15923 new_triggers.patterns = kzalloc_objs(new_triggers.patterns[0], 15924 n_patterns); 15925 if (!new_triggers.patterns) 15926 return -ENOMEM; 15927 15928 new_triggers.n_patterns = n_patterns; 15929 i = 0; 15930 15931 nla_for_each_nested(pat, tb[NL80211_WOWLAN_TRIG_PKT_PATTERN], 15932 rem) { 15933 u8 *mask_pat; 15934 15935 err = nla_parse_nested_deprecated(pat_tb, 15936 MAX_NL80211_PKTPAT, 15937 pat, 15938 nl80211_packet_pattern_policy, 15939 info->extack); 15940 if (err) 15941 goto error; 15942 15943 err = -EINVAL; 15944 if (!pat_tb[NL80211_PKTPAT_MASK] || 15945 !pat_tb[NL80211_PKTPAT_PATTERN]) 15946 goto error; 15947 pat_len = nla_len(pat_tb[NL80211_PKTPAT_PATTERN]); 15948 mask_len = DIV_ROUND_UP(pat_len, 8); 15949 if (nla_len(pat_tb[NL80211_PKTPAT_MASK]) != mask_len) 15950 goto error; 15951 if (pat_len > wowlan->pattern_max_len || 15952 pat_len < wowlan->pattern_min_len) 15953 goto error; 15954 15955 pkt_offset = 15956 nla_get_u32_default(pat_tb[NL80211_PKTPAT_OFFSET], 15957 0); 15958 if (pkt_offset > wowlan->max_pkt_offset) 15959 goto error; 15960 new_triggers.patterns[i].pkt_offset = pkt_offset; 15961 15962 mask_pat = kmalloc(mask_len + pat_len, GFP_KERNEL); 15963 if (!mask_pat) { 15964 err = -ENOMEM; 15965 goto error; 15966 } 15967 new_triggers.patterns[i].mask = mask_pat; 15968 memcpy(mask_pat, nla_data(pat_tb[NL80211_PKTPAT_MASK]), 15969 mask_len); 15970 mask_pat += mask_len; 15971 new_triggers.patterns[i].pattern = mask_pat; 15972 new_triggers.patterns[i].pattern_len = pat_len; 15973 memcpy(mask_pat, 15974 nla_data(pat_tb[NL80211_PKTPAT_PATTERN]), 15975 pat_len); 15976 i++; 15977 } 15978 } 15979 15980 if (tb[NL80211_WOWLAN_TRIG_TCP_CONNECTION]) { 15981 regular = true; 15982 err = nl80211_parse_wowlan_tcp( 15983 rdev, tb[NL80211_WOWLAN_TRIG_TCP_CONNECTION], 15984 &new_triggers); 15985 if (err) 15986 goto error; 15987 } 15988 15989 if (tb[NL80211_WOWLAN_TRIG_NET_DETECT]) { 15990 regular = true; 15991 err = nl80211_parse_wowlan_nd( 15992 rdev, wowlan, tb[NL80211_WOWLAN_TRIG_NET_DETECT], 15993 &new_triggers); 15994 if (err) 15995 goto error; 15996 } 15997 15998 /* The 'any' trigger means the device continues operating more or less 15999 * as in its normal operation mode and wakes up the host on most of the 16000 * normal interrupts (like packet RX, ...) 16001 * It therefore makes little sense to combine with the more constrained 16002 * wakeup trigger modes. 16003 */ 16004 if (new_triggers.any && regular) { 16005 err = -EINVAL; 16006 goto error; 16007 } 16008 16009 ntrig = kmemdup(&new_triggers, sizeof(new_triggers), GFP_KERNEL); 16010 if (!ntrig) { 16011 err = -ENOMEM; 16012 goto error; 16013 } 16014 cfg80211_rdev_free_wowlan(rdev); 16015 rdev->wiphy.wowlan_config = ntrig; 16016 16017 set_wakeup: 16018 if (rdev->ops->set_wakeup && 16019 prev_enabled != !!rdev->wiphy.wowlan_config) 16020 rdev_set_wakeup(rdev, rdev->wiphy.wowlan_config); 16021 16022 return 0; 16023 error: 16024 for (i = 0; i < new_triggers.n_patterns; i++) 16025 kfree(new_triggers.patterns[i].mask); 16026 kfree(new_triggers.patterns); 16027 if (new_triggers.tcp && new_triggers.tcp->sock) 16028 sock_release(new_triggers.tcp->sock); 16029 kfree(new_triggers.tcp); 16030 kfree(new_triggers.nd_config); 16031 return err; 16032 } 16033 #endif 16034 16035 static int nl80211_send_coalesce_rules(struct sk_buff *msg, 16036 struct cfg80211_registered_device *rdev) 16037 { 16038 struct nlattr *nl_pats, *nl_pat, *nl_rule, *nl_rules; 16039 int i, j, pat_len; 16040 struct cfg80211_coalesce_rules *rule; 16041 16042 if (!rdev->coalesce->n_rules) 16043 return 0; 16044 16045 nl_rules = nla_nest_start_noflag(msg, NL80211_ATTR_COALESCE_RULE); 16046 if (!nl_rules) 16047 return -ENOBUFS; 16048 16049 for (i = 0; i < rdev->coalesce->n_rules; i++) { 16050 nl_rule = nla_nest_start_noflag(msg, i + 1); 16051 if (!nl_rule) 16052 return -ENOBUFS; 16053 16054 rule = &rdev->coalesce->rules[i]; 16055 if (nla_put_u32(msg, NL80211_ATTR_COALESCE_RULE_DELAY, 16056 rule->delay)) 16057 return -ENOBUFS; 16058 16059 if (nla_put_u32(msg, NL80211_ATTR_COALESCE_RULE_CONDITION, 16060 rule->condition)) 16061 return -ENOBUFS; 16062 16063 nl_pats = nla_nest_start_noflag(msg, 16064 NL80211_ATTR_COALESCE_RULE_PKT_PATTERN); 16065 if (!nl_pats) 16066 return -ENOBUFS; 16067 16068 for (j = 0; j < rule->n_patterns; j++) { 16069 nl_pat = nla_nest_start_noflag(msg, j + 1); 16070 if (!nl_pat) 16071 return -ENOBUFS; 16072 pat_len = rule->patterns[j].pattern_len; 16073 if (nla_put(msg, NL80211_PKTPAT_MASK, 16074 DIV_ROUND_UP(pat_len, 8), 16075 rule->patterns[j].mask) || 16076 nla_put(msg, NL80211_PKTPAT_PATTERN, pat_len, 16077 rule->patterns[j].pattern) || 16078 nla_put_u32(msg, NL80211_PKTPAT_OFFSET, 16079 rule->patterns[j].pkt_offset)) 16080 return -ENOBUFS; 16081 nla_nest_end(msg, nl_pat); 16082 } 16083 nla_nest_end(msg, nl_pats); 16084 nla_nest_end(msg, nl_rule); 16085 } 16086 nla_nest_end(msg, nl_rules); 16087 16088 return 0; 16089 } 16090 16091 static int nl80211_get_coalesce(struct sk_buff *skb, struct genl_info *info) 16092 { 16093 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 16094 struct sk_buff *msg; 16095 void *hdr; 16096 16097 if (!rdev->wiphy.coalesce) 16098 return -EOPNOTSUPP; 16099 16100 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 16101 if (!msg) 16102 return -ENOMEM; 16103 16104 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 16105 NL80211_CMD_GET_COALESCE); 16106 if (!hdr) 16107 goto nla_put_failure; 16108 16109 if (rdev->coalesce && nl80211_send_coalesce_rules(msg, rdev)) 16110 goto nla_put_failure; 16111 16112 genlmsg_end(msg, hdr); 16113 return genlmsg_reply(msg, info); 16114 16115 nla_put_failure: 16116 nlmsg_free(msg); 16117 return -ENOBUFS; 16118 } 16119 16120 void cfg80211_free_coalesce(struct cfg80211_coalesce *coalesce) 16121 { 16122 int i, j; 16123 struct cfg80211_coalesce_rules *rule; 16124 16125 if (!coalesce) 16126 return; 16127 16128 for (i = 0; i < coalesce->n_rules; i++) { 16129 rule = &coalesce->rules[i]; 16130 for (j = 0; j < rule->n_patterns; j++) 16131 kfree(rule->patterns[j].mask); 16132 kfree(rule->patterns); 16133 } 16134 kfree(coalesce); 16135 } 16136 16137 static int nl80211_parse_coalesce_rule(struct cfg80211_registered_device *rdev, 16138 struct nlattr *rule, 16139 struct cfg80211_coalesce_rules *new_rule) 16140 { 16141 int err, i; 16142 const struct wiphy_coalesce_support *coalesce = rdev->wiphy.coalesce; 16143 struct nlattr *tb[NUM_NL80211_ATTR_COALESCE_RULE], *pat; 16144 int rem, pat_len, mask_len, pkt_offset, n_patterns = 0; 16145 struct nlattr *pat_tb[NUM_NL80211_PKTPAT]; 16146 16147 err = nla_parse_nested_deprecated(tb, NL80211_ATTR_COALESCE_RULE_MAX, 16148 rule, nl80211_coalesce_policy, NULL); 16149 if (err) 16150 return err; 16151 16152 if (tb[NL80211_ATTR_COALESCE_RULE_DELAY]) 16153 new_rule->delay = 16154 nla_get_u32(tb[NL80211_ATTR_COALESCE_RULE_DELAY]); 16155 if (new_rule->delay > coalesce->max_delay) 16156 return -EINVAL; 16157 16158 if (tb[NL80211_ATTR_COALESCE_RULE_CONDITION]) 16159 new_rule->condition = 16160 nla_get_u32(tb[NL80211_ATTR_COALESCE_RULE_CONDITION]); 16161 16162 if (!tb[NL80211_ATTR_COALESCE_RULE_PKT_PATTERN]) 16163 return -EINVAL; 16164 16165 nla_for_each_nested(pat, tb[NL80211_ATTR_COALESCE_RULE_PKT_PATTERN], 16166 rem) 16167 n_patterns++; 16168 if (n_patterns > coalesce->n_patterns) 16169 return -EINVAL; 16170 16171 new_rule->patterns = kzalloc_objs(new_rule->patterns[0], n_patterns); 16172 if (!new_rule->patterns) 16173 return -ENOMEM; 16174 16175 new_rule->n_patterns = n_patterns; 16176 i = 0; 16177 16178 nla_for_each_nested(pat, tb[NL80211_ATTR_COALESCE_RULE_PKT_PATTERN], 16179 rem) { 16180 u8 *mask_pat; 16181 16182 err = nla_parse_nested_deprecated(pat_tb, MAX_NL80211_PKTPAT, 16183 pat, 16184 nl80211_packet_pattern_policy, 16185 NULL); 16186 if (err) 16187 return err; 16188 16189 if (!pat_tb[NL80211_PKTPAT_MASK] || 16190 !pat_tb[NL80211_PKTPAT_PATTERN]) 16191 return -EINVAL; 16192 pat_len = nla_len(pat_tb[NL80211_PKTPAT_PATTERN]); 16193 mask_len = DIV_ROUND_UP(pat_len, 8); 16194 if (nla_len(pat_tb[NL80211_PKTPAT_MASK]) != mask_len) 16195 return -EINVAL; 16196 if (pat_len > coalesce->pattern_max_len || 16197 pat_len < coalesce->pattern_min_len) 16198 return -EINVAL; 16199 16200 pkt_offset = nla_get_u32_default(pat_tb[NL80211_PKTPAT_OFFSET], 16201 0); 16202 if (pkt_offset > coalesce->max_pkt_offset) 16203 return -EINVAL; 16204 new_rule->patterns[i].pkt_offset = pkt_offset; 16205 16206 mask_pat = kmalloc(mask_len + pat_len, GFP_KERNEL); 16207 if (!mask_pat) 16208 return -ENOMEM; 16209 16210 new_rule->patterns[i].mask = mask_pat; 16211 memcpy(mask_pat, nla_data(pat_tb[NL80211_PKTPAT_MASK]), 16212 mask_len); 16213 16214 mask_pat += mask_len; 16215 new_rule->patterns[i].pattern = mask_pat; 16216 new_rule->patterns[i].pattern_len = pat_len; 16217 memcpy(mask_pat, nla_data(pat_tb[NL80211_PKTPAT_PATTERN]), 16218 pat_len); 16219 i++; 16220 } 16221 16222 return 0; 16223 } 16224 16225 static int nl80211_set_coalesce(struct sk_buff *skb, struct genl_info *info) 16226 { 16227 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 16228 const struct wiphy_coalesce_support *coalesce = rdev->wiphy.coalesce; 16229 struct cfg80211_coalesce *new_coalesce; 16230 int err, rem_rule, n_rules = 0, i; 16231 struct nlattr *rule; 16232 16233 if (!rdev->wiphy.coalesce || !rdev->ops->set_coalesce) 16234 return -EOPNOTSUPP; 16235 16236 if (!info->attrs[NL80211_ATTR_COALESCE_RULE]) { 16237 cfg80211_free_coalesce(rdev->coalesce); 16238 rdev->coalesce = NULL; 16239 rdev_set_coalesce(rdev, NULL); 16240 return 0; 16241 } 16242 16243 nla_for_each_nested(rule, info->attrs[NL80211_ATTR_COALESCE_RULE], 16244 rem_rule) 16245 n_rules++; 16246 if (n_rules > coalesce->n_rules) 16247 return -EINVAL; 16248 16249 new_coalesce = kzalloc_flex(*new_coalesce, rules, n_rules); 16250 if (!new_coalesce) 16251 return -ENOMEM; 16252 16253 new_coalesce->n_rules = n_rules; 16254 i = 0; 16255 16256 nla_for_each_nested(rule, info->attrs[NL80211_ATTR_COALESCE_RULE], 16257 rem_rule) { 16258 err = nl80211_parse_coalesce_rule(rdev, rule, 16259 &new_coalesce->rules[i]); 16260 if (err) 16261 goto error; 16262 16263 i++; 16264 } 16265 16266 err = rdev_set_coalesce(rdev, new_coalesce); 16267 if (err) 16268 goto error; 16269 16270 cfg80211_free_coalesce(rdev->coalesce); 16271 rdev->coalesce = new_coalesce; 16272 16273 return 0; 16274 error: 16275 cfg80211_free_coalesce(new_coalesce); 16276 16277 return err; 16278 } 16279 16280 static int nl80211_set_rekey_data(struct sk_buff *skb, struct genl_info *info) 16281 { 16282 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 16283 struct net_device *dev = info->user_ptr[1]; 16284 struct wireless_dev *wdev = dev->ieee80211_ptr; 16285 struct nlattr *tb[NUM_NL80211_REKEY_DATA]; 16286 struct cfg80211_gtk_rekey_data rekey_data = {}; 16287 int err; 16288 16289 if (!info->attrs[NL80211_ATTR_REKEY_DATA]) 16290 return -EINVAL; 16291 16292 err = nla_parse_nested_deprecated(tb, MAX_NL80211_REKEY_DATA, 16293 info->attrs[NL80211_ATTR_REKEY_DATA], 16294 nl80211_rekey_policy, info->extack); 16295 if (err) 16296 return err; 16297 16298 if (!tb[NL80211_REKEY_DATA_REPLAY_CTR] || !tb[NL80211_REKEY_DATA_KEK] || 16299 !tb[NL80211_REKEY_DATA_KCK]) 16300 return -EINVAL; 16301 if (nla_len(tb[NL80211_REKEY_DATA_KEK]) != NL80211_KEK_LEN && 16302 !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_EXT_KEK_KCK && 16303 nla_len(tb[NL80211_REKEY_DATA_KEK]) == NL80211_KEK_EXT_LEN)) 16304 return -ERANGE; 16305 if (nla_len(tb[NL80211_REKEY_DATA_KCK]) != NL80211_KCK_LEN && 16306 !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_EXT_KEK_KCK && 16307 nla_len(tb[NL80211_REKEY_DATA_KCK]) == NL80211_KCK_EXT_LEN) && 16308 !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_EXT_KCK_32 && 16309 nla_len(tb[NL80211_REKEY_DATA_KCK]) == NL80211_KCK_EXT_LEN_32)) 16310 return -ERANGE; 16311 16312 rekey_data.kek = nla_data(tb[NL80211_REKEY_DATA_KEK]); 16313 rekey_data.kck = nla_data(tb[NL80211_REKEY_DATA_KCK]); 16314 rekey_data.replay_ctr = nla_data(tb[NL80211_REKEY_DATA_REPLAY_CTR]); 16315 rekey_data.kek_len = nla_len(tb[NL80211_REKEY_DATA_KEK]); 16316 rekey_data.kck_len = nla_len(tb[NL80211_REKEY_DATA_KCK]); 16317 if (tb[NL80211_REKEY_DATA_AKM]) 16318 rekey_data.akm = nla_get_u32(tb[NL80211_REKEY_DATA_AKM]); 16319 16320 if (!wdev->connected) 16321 return -ENOTCONN; 16322 16323 if (!rdev->ops->set_rekey_data) 16324 return -EOPNOTSUPP; 16325 16326 return rdev_set_rekey_data(rdev, dev, &rekey_data); 16327 } 16328 16329 static int nl80211_register_unexpected_frame(struct sk_buff *skb, 16330 struct genl_info *info) 16331 { 16332 struct net_device *dev = info->user_ptr[1]; 16333 struct wireless_dev *wdev = dev->ieee80211_ptr; 16334 16335 if (wdev->iftype != NL80211_IFTYPE_AP && 16336 wdev->iftype != NL80211_IFTYPE_P2P_GO && 16337 wdev->iftype != NL80211_IFTYPE_NAN_DATA) 16338 return -EINVAL; 16339 16340 if (wdev->unexpected_nlportid) 16341 return -EBUSY; 16342 16343 wdev->unexpected_nlportid = info->snd_portid; 16344 return 0; 16345 } 16346 16347 static int nl80211_probe_peer(struct sk_buff *skb, struct genl_info *info) 16348 { 16349 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 16350 struct net_device *dev = info->user_ptr[1]; 16351 struct wireless_dev *wdev = dev->ieee80211_ptr; 16352 struct sk_buff *msg; 16353 void *hdr; 16354 const u8 *addr = NULL; 16355 u64 cookie; 16356 int err; 16357 16358 /* Allow in AP, STA, and their P2P counterparts */ 16359 switch (wdev->iftype) { 16360 case NL80211_IFTYPE_AP: 16361 case NL80211_IFTYPE_P2P_GO: 16362 if (!info->attrs[NL80211_ATTR_MAC]) 16363 return -EINVAL; 16364 addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 16365 break; 16366 case NL80211_IFTYPE_STATION: 16367 case NL80211_IFTYPE_P2P_CLIENT: 16368 if (!wiphy_ext_feature_isset(&rdev->wiphy, 16369 NL80211_EXT_FEATURE_PROBE_AP)) 16370 return -EOPNOTSUPP; 16371 if (!wdev->connected) 16372 return -ENOLINK; 16373 /* STA/P2P-client probes the currently associated AP/GO. */ 16374 if (info->attrs[NL80211_ATTR_MAC]) 16375 return -EINVAL; 16376 break; 16377 default: 16378 return -EOPNOTSUPP; 16379 } 16380 16381 if (!rdev->ops->probe_peer) 16382 return -EOPNOTSUPP; 16383 16384 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 16385 if (!msg) 16386 return -ENOMEM; 16387 16388 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 16389 NL80211_CMD_PROBE_PEER); 16390 if (!hdr) { 16391 err = -ENOBUFS; 16392 goto free_msg; 16393 } 16394 16395 cookie = cfg80211_assign_cookie(rdev); 16396 err = rdev_probe_peer(rdev, dev, addr, cookie); 16397 if (err) 16398 goto free_msg; 16399 16400 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie, 16401 NL80211_ATTR_PAD)) 16402 goto nla_put_failure; 16403 16404 genlmsg_end(msg, hdr); 16405 16406 return genlmsg_reply(msg, info); 16407 16408 nla_put_failure: 16409 err = -ENOBUFS; 16410 free_msg: 16411 nlmsg_free(msg); 16412 return err; 16413 } 16414 16415 static int nl80211_register_beacons(struct sk_buff *skb, struct genl_info *info) 16416 { 16417 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 16418 struct cfg80211_beacon_registration *reg, *nreg; 16419 int rv; 16420 16421 if (!(rdev->wiphy.flags & WIPHY_FLAG_REPORTS_OBSS)) 16422 return -EOPNOTSUPP; 16423 16424 nreg = kzalloc_obj(*nreg); 16425 if (!nreg) 16426 return -ENOMEM; 16427 16428 /* First, check if already registered. */ 16429 spin_lock_bh(&rdev->beacon_registrations_lock); 16430 list_for_each_entry(reg, &rdev->beacon_registrations, list) { 16431 if (reg->nlportid == info->snd_portid) { 16432 rv = -EALREADY; 16433 goto out_err; 16434 } 16435 } 16436 /* Add it to the list */ 16437 nreg->nlportid = info->snd_portid; 16438 list_add(&nreg->list, &rdev->beacon_registrations); 16439 16440 spin_unlock_bh(&rdev->beacon_registrations_lock); 16441 16442 return 0; 16443 out_err: 16444 spin_unlock_bh(&rdev->beacon_registrations_lock); 16445 kfree(nreg); 16446 return rv; 16447 } 16448 16449 static int nl80211_start_p2p_device(struct sk_buff *skb, struct genl_info *info) 16450 { 16451 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 16452 struct wireless_dev *wdev = info->user_ptr[1]; 16453 int err; 16454 16455 if (!rdev->ops->start_p2p_device) 16456 return -EOPNOTSUPP; 16457 16458 if (wdev->iftype != NL80211_IFTYPE_P2P_DEVICE) 16459 return -EOPNOTSUPP; 16460 16461 if (wdev_running(wdev)) 16462 return 0; 16463 16464 if (rfkill_blocked(rdev->wiphy.rfkill)) 16465 return -ERFKILL; 16466 16467 err = rdev_start_p2p_device(rdev, wdev); 16468 if (err) 16469 return err; 16470 16471 wdev->is_running = true; 16472 rdev->opencount++; 16473 16474 return 0; 16475 } 16476 16477 static int nl80211_stop_p2p_device(struct sk_buff *skb, struct genl_info *info) 16478 { 16479 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 16480 struct wireless_dev *wdev = info->user_ptr[1]; 16481 16482 if (wdev->iftype != NL80211_IFTYPE_P2P_DEVICE) 16483 return -EOPNOTSUPP; 16484 16485 if (!rdev->ops->stop_p2p_device) 16486 return -EOPNOTSUPP; 16487 16488 cfg80211_stop_p2p_device(rdev, wdev); 16489 16490 return 0; 16491 } 16492 16493 static struct ieee80211_channel *nl80211_get_nan_channel(struct wiphy *wiphy, 16494 int freq) 16495 { 16496 struct ieee80211_channel *chan; 16497 struct cfg80211_chan_def def; 16498 16499 /* Check if the frequency is valid for NAN */ 16500 if (freq != 5220 && freq != 5745 && freq != 2437) 16501 return NULL; 16502 16503 chan = ieee80211_get_channel(wiphy, freq); 16504 if (!chan) 16505 return NULL; 16506 16507 cfg80211_chandef_create(&def, chan, NL80211_CHAN_NO_HT); 16508 16509 /* Check if the channel is allowed */ 16510 if (cfg80211_reg_can_beacon(wiphy, &def, NL80211_IFTYPE_NAN)) 16511 return chan; 16512 16513 return NULL; 16514 } 16515 16516 static int nl80211_parse_nan_band_config(struct wiphy *wiphy, 16517 struct nlattr **tb, 16518 struct cfg80211_nan_band_config *cfg, 16519 enum nl80211_band band) 16520 { 16521 if (BIT(band) & ~(u32)wiphy->nan_supported_bands) 16522 return -EINVAL; 16523 16524 if (tb[NL80211_NAN_BAND_CONF_FREQ]) { 16525 u16 freq = nla_get_u16(tb[NL80211_NAN_BAND_CONF_FREQ]); 16526 16527 if (band != NL80211_BAND_5GHZ) 16528 return -EINVAL; 16529 16530 cfg->chan = nl80211_get_nan_channel(wiphy, freq); 16531 if (!cfg->chan) 16532 return -EINVAL; 16533 } 16534 16535 if (tb[NL80211_NAN_BAND_CONF_RSSI_CLOSE]) { 16536 cfg->rssi_close = 16537 nla_get_s8(tb[NL80211_NAN_BAND_CONF_RSSI_CLOSE]); 16538 if (!tb[NL80211_NAN_BAND_CONF_RSSI_MIDDLE]) 16539 return -EINVAL; 16540 } 16541 16542 if (tb[NL80211_NAN_BAND_CONF_RSSI_MIDDLE]) { 16543 cfg->rssi_middle = 16544 nla_get_s8(tb[NL80211_NAN_BAND_CONF_RSSI_MIDDLE]); 16545 if (!cfg->rssi_close || cfg->rssi_middle >= cfg->rssi_close) 16546 return -EINVAL; 16547 } 16548 16549 if (tb[NL80211_NAN_BAND_CONF_WAKE_DW]) { 16550 cfg->awake_dw_interval = 16551 nla_get_u8(tb[NL80211_NAN_BAND_CONF_WAKE_DW]); 16552 16553 if (band == NL80211_BAND_2GHZ && cfg->awake_dw_interval == 0) 16554 return -EINVAL; 16555 } 16556 16557 cfg->disable_scan = 16558 nla_get_flag(tb[NL80211_NAN_BAND_CONF_DISABLE_SCAN]); 16559 return 0; 16560 } 16561 16562 static int nl80211_parse_nan_conf(struct wiphy *wiphy, 16563 struct genl_info *info, 16564 struct cfg80211_nan_conf *conf, 16565 u32 *changed_flags, 16566 bool start) 16567 { 16568 struct nlattr *attrs[NL80211_NAN_CONF_ATTR_MAX + 1]; 16569 int err, rem; 16570 u32 changed = 0; 16571 struct nlattr *band_config; 16572 16573 if (info->attrs[NL80211_ATTR_NAN_MASTER_PREF]) { 16574 conf->master_pref = 16575 nla_get_u8(info->attrs[NL80211_ATTR_NAN_MASTER_PREF]); 16576 16577 changed |= CFG80211_NAN_CONF_CHANGED_PREF; 16578 } 16579 16580 if (info->attrs[NL80211_ATTR_BANDS]) { 16581 u32 bands = nla_get_u32(info->attrs[NL80211_ATTR_BANDS]); 16582 16583 if (bands & ~(u32)wiphy->nan_supported_bands) 16584 return -EOPNOTSUPP; 16585 16586 if (bands && !(bands & BIT(NL80211_BAND_2GHZ))) 16587 return -EINVAL; 16588 16589 conf->bands = bands; 16590 changed |= CFG80211_NAN_CONF_CHANGED_BANDS; 16591 } 16592 16593 conf->band_cfgs[NL80211_BAND_2GHZ].awake_dw_interval = 1; 16594 if (conf->bands & BIT(NL80211_BAND_5GHZ) || !conf->bands) 16595 conf->band_cfgs[NL80211_BAND_5GHZ].awake_dw_interval = 1; 16596 16597 /* On 2.4 GHz band use channel 6 */ 16598 conf->band_cfgs[NL80211_BAND_2GHZ].chan = 16599 nl80211_get_nan_channel(wiphy, 2437); 16600 if (!conf->band_cfgs[NL80211_BAND_2GHZ].chan) 16601 return -EINVAL; 16602 16603 if (!info->attrs[NL80211_ATTR_NAN_CONFIG]) 16604 goto out; 16605 16606 err = nla_parse_nested(attrs, NL80211_NAN_CONF_ATTR_MAX, 16607 info->attrs[NL80211_ATTR_NAN_CONFIG], NULL, 16608 info->extack); 16609 if (err) 16610 return err; 16611 16612 changed |= CFG80211_NAN_CONF_CHANGED_CONFIG; 16613 if (attrs[NL80211_NAN_CONF_CLUSTER_ID] && start) { 16614 ether_addr_copy(conf->cluster_id, 16615 nla_data(attrs[NL80211_NAN_CONF_CLUSTER_ID])); 16616 } else if (start) { 16617 conf->cluster_id[0] = 0x50; 16618 conf->cluster_id[1] = 0x6f; 16619 conf->cluster_id[2] = 0x9a; 16620 conf->cluster_id[3] = 0x01; 16621 get_random_bytes(&conf->cluster_id[4], 2); 16622 } 16623 16624 if (attrs[NL80211_NAN_CONF_EXTRA_ATTRS]) { 16625 conf->extra_nan_attrs = 16626 nla_data(attrs[NL80211_NAN_CONF_EXTRA_ATTRS]); 16627 conf->extra_nan_attrs_len = 16628 nla_len(attrs[NL80211_NAN_CONF_EXTRA_ATTRS]); 16629 } 16630 16631 if (attrs[NL80211_NAN_CONF_VENDOR_ELEMS]) { 16632 conf->vendor_elems = 16633 nla_data(attrs[NL80211_NAN_CONF_VENDOR_ELEMS]); 16634 conf->vendor_elems_len = 16635 nla_len(attrs[NL80211_NAN_CONF_VENDOR_ELEMS]); 16636 } 16637 16638 if (attrs[NL80211_NAN_CONF_BAND_CONFIGS]) { 16639 nla_for_each_nested(band_config, 16640 attrs[NL80211_NAN_CONF_BAND_CONFIGS], 16641 rem) { 16642 enum nl80211_band band; 16643 struct cfg80211_nan_band_config *cfg; 16644 struct nlattr *tb[NL80211_NAN_BAND_CONF_ATTR_MAX + 1]; 16645 16646 err = nla_parse_nested(tb, 16647 NL80211_NAN_BAND_CONF_ATTR_MAX, 16648 band_config, NULL, 16649 info->extack); 16650 if (err) 16651 return err; 16652 16653 if (!tb[NL80211_NAN_BAND_CONF_BAND]) 16654 return -EINVAL; 16655 16656 band = nla_get_u8(tb[NL80211_NAN_BAND_CONF_BAND]); 16657 if (conf->bands && !(conf->bands & BIT(band))) 16658 return -EINVAL; 16659 16660 cfg = &conf->band_cfgs[band]; 16661 16662 err = nl80211_parse_nan_band_config(wiphy, tb, cfg, 16663 band); 16664 if (err) 16665 return err; 16666 } 16667 } 16668 16669 if (attrs[NL80211_NAN_CONF_SCAN_PERIOD]) 16670 conf->scan_period = 16671 nla_get_u16(attrs[NL80211_NAN_CONF_SCAN_PERIOD]); 16672 16673 if (attrs[NL80211_NAN_CONF_SCAN_DWELL_TIME]) 16674 conf->scan_dwell_time = 16675 nla_get_u16(attrs[NL80211_NAN_CONF_SCAN_DWELL_TIME]); 16676 16677 if (attrs[NL80211_NAN_CONF_DISCOVERY_BEACON_INTERVAL]) 16678 conf->discovery_beacon_interval = 16679 nla_get_u8(attrs[NL80211_NAN_CONF_DISCOVERY_BEACON_INTERVAL]); 16680 16681 if (attrs[NL80211_NAN_CONF_NOTIFY_DW]) 16682 conf->enable_dw_notification = 16683 nla_get_flag(attrs[NL80211_NAN_CONF_NOTIFY_DW]); 16684 16685 out: 16686 if (!conf->band_cfgs[NL80211_BAND_5GHZ].chan && 16687 (!conf->bands || conf->bands & BIT(NL80211_BAND_5GHZ))) { 16688 /* If no 5GHz channel is specified use default, if possible */ 16689 conf->band_cfgs[NL80211_BAND_5GHZ].chan = 16690 nl80211_get_nan_channel(wiphy, 5745); 16691 if (!conf->band_cfgs[NL80211_BAND_5GHZ].chan) 16692 conf->band_cfgs[NL80211_BAND_5GHZ].chan = 16693 nl80211_get_nan_channel(wiphy, 5220); 16694 16695 /* Return error if user space asked explicitly for 5 GHz */ 16696 if (!conf->band_cfgs[NL80211_BAND_5GHZ].chan && 16697 conf->bands & BIT(NL80211_BAND_5GHZ)) { 16698 NL_SET_ERR_MSG_ATTR(info->extack, 16699 info->attrs[NL80211_ATTR_BANDS], 16700 "5 GHz band operation is not allowed"); 16701 return -EINVAL; 16702 } 16703 } 16704 16705 if (changed_flags) 16706 *changed_flags = changed; 16707 16708 return 0; 16709 } 16710 16711 static int nl80211_start_nan(struct sk_buff *skb, struct genl_info *info) 16712 { 16713 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 16714 struct wireless_dev *wdev = info->user_ptr[1]; 16715 struct cfg80211_nan_conf conf = {}; 16716 int err; 16717 16718 if (wdev->iftype != NL80211_IFTYPE_NAN) 16719 return -EOPNOTSUPP; 16720 16721 if (wdev_running(wdev)) 16722 return -EEXIST; 16723 16724 if (rfkill_blocked(rdev->wiphy.rfkill)) 16725 return -ERFKILL; 16726 16727 /* Master preference is mandatory for START_NAN */ 16728 if (!info->attrs[NL80211_ATTR_NAN_MASTER_PREF]) 16729 return -EINVAL; 16730 16731 err = nl80211_parse_nan_conf(&rdev->wiphy, info, &conf, NULL, true); 16732 if (err) 16733 return err; 16734 16735 err = rdev_start_nan(rdev, wdev, &conf); 16736 if (err) 16737 return err; 16738 16739 wdev->is_running = true; 16740 rdev->opencount++; 16741 16742 return 0; 16743 } 16744 16745 static int nl80211_stop_nan(struct sk_buff *skb, struct genl_info *info) 16746 { 16747 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 16748 struct wireless_dev *wdev = info->user_ptr[1]; 16749 16750 if (wdev->iftype != NL80211_IFTYPE_NAN) 16751 return -EOPNOTSUPP; 16752 16753 cfg80211_close_dependents(rdev, wdev); 16754 16755 guard(wiphy)(&rdev->wiphy); 16756 16757 cfg80211_stop_nan(rdev, wdev); 16758 16759 return 0; 16760 } 16761 16762 static int validate_nan_filter(struct nlattr *filter_attr) 16763 { 16764 struct nlattr *attr; 16765 int len = 0, n_entries = 0, rem; 16766 16767 nla_for_each_nested(attr, filter_attr, rem) { 16768 len += nla_len(attr); 16769 n_entries++; 16770 } 16771 16772 if (len >= U8_MAX) 16773 return -EINVAL; 16774 16775 return n_entries; 16776 } 16777 16778 static int handle_nan_filter(struct nlattr *attr_filter, 16779 struct cfg80211_nan_func *func, 16780 bool tx) 16781 { 16782 struct nlattr *attr; 16783 int n_entries, rem, i; 16784 struct cfg80211_nan_func_filter *filter; 16785 16786 n_entries = validate_nan_filter(attr_filter); 16787 if (n_entries < 0) 16788 return n_entries; 16789 16790 BUILD_BUG_ON(sizeof(*func->rx_filters) != sizeof(*func->tx_filters)); 16791 16792 filter = kzalloc_objs(*func->rx_filters, n_entries); 16793 if (!filter) 16794 return -ENOMEM; 16795 16796 i = 0; 16797 nla_for_each_nested(attr, attr_filter, rem) { 16798 filter[i].filter = nla_memdup(attr, GFP_KERNEL); 16799 if (!filter[i].filter) 16800 goto err; 16801 16802 filter[i].len = nla_len(attr); 16803 i++; 16804 } 16805 if (tx) { 16806 func->num_tx_filters = n_entries; 16807 func->tx_filters = filter; 16808 } else { 16809 func->num_rx_filters = n_entries; 16810 func->rx_filters = filter; 16811 } 16812 16813 return 0; 16814 16815 err: 16816 i = 0; 16817 nla_for_each_nested(attr, attr_filter, rem) { 16818 kfree(filter[i].filter); 16819 i++; 16820 } 16821 kfree(filter); 16822 return -ENOMEM; 16823 } 16824 16825 static int nl80211_nan_add_func(struct sk_buff *skb, 16826 struct genl_info *info) 16827 { 16828 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 16829 struct wireless_dev *wdev = info->user_ptr[1]; 16830 struct nlattr *tb[NUM_NL80211_NAN_FUNC_ATTR], *func_attr; 16831 struct cfg80211_nan_func *func; 16832 struct sk_buff *msg = NULL; 16833 void *hdr = NULL; 16834 int err = 0; 16835 16836 if (wdev->iftype != NL80211_IFTYPE_NAN) 16837 return -EOPNOTSUPP; 16838 16839 if (!wdev_running(wdev)) 16840 return -ENOTCONN; 16841 16842 if (!info->attrs[NL80211_ATTR_NAN_FUNC]) 16843 return -EINVAL; 16844 16845 err = nla_parse_nested_deprecated(tb, NL80211_NAN_FUNC_ATTR_MAX, 16846 info->attrs[NL80211_ATTR_NAN_FUNC], 16847 nl80211_nan_func_policy, 16848 info->extack); 16849 if (err) 16850 return err; 16851 16852 func = kzalloc_obj(*func); 16853 if (!func) 16854 return -ENOMEM; 16855 16856 func->cookie = cfg80211_assign_cookie(rdev); 16857 16858 if (!tb[NL80211_NAN_FUNC_TYPE]) { 16859 err = -EINVAL; 16860 goto out; 16861 } 16862 16863 16864 func->type = nla_get_u8(tb[NL80211_NAN_FUNC_TYPE]); 16865 16866 if (!tb[NL80211_NAN_FUNC_SERVICE_ID]) { 16867 err = -EINVAL; 16868 goto out; 16869 } 16870 16871 memcpy(func->service_id, nla_data(tb[NL80211_NAN_FUNC_SERVICE_ID]), 16872 sizeof(func->service_id)); 16873 16874 func->close_range = 16875 nla_get_flag(tb[NL80211_NAN_FUNC_CLOSE_RANGE]); 16876 16877 if (tb[NL80211_NAN_FUNC_SERVICE_INFO]) { 16878 func->serv_spec_info_len = 16879 nla_len(tb[NL80211_NAN_FUNC_SERVICE_INFO]); 16880 func->serv_spec_info = 16881 kmemdup(nla_data(tb[NL80211_NAN_FUNC_SERVICE_INFO]), 16882 func->serv_spec_info_len, 16883 GFP_KERNEL); 16884 if (!func->serv_spec_info) { 16885 err = -ENOMEM; 16886 goto out; 16887 } 16888 } 16889 16890 if (tb[NL80211_NAN_FUNC_TTL]) 16891 func->ttl = nla_get_u32(tb[NL80211_NAN_FUNC_TTL]); 16892 16893 switch (func->type) { 16894 case NL80211_NAN_FUNC_PUBLISH: 16895 if (!tb[NL80211_NAN_FUNC_PUBLISH_TYPE]) { 16896 err = -EINVAL; 16897 goto out; 16898 } 16899 16900 func->publish_type = 16901 nla_get_u8(tb[NL80211_NAN_FUNC_PUBLISH_TYPE]); 16902 func->publish_bcast = 16903 nla_get_flag(tb[NL80211_NAN_FUNC_PUBLISH_BCAST]); 16904 16905 if ((!(func->publish_type & NL80211_NAN_SOLICITED_PUBLISH)) && 16906 func->publish_bcast) { 16907 err = -EINVAL; 16908 goto out; 16909 } 16910 break; 16911 case NL80211_NAN_FUNC_SUBSCRIBE: 16912 func->subscribe_active = 16913 nla_get_flag(tb[NL80211_NAN_FUNC_SUBSCRIBE_ACTIVE]); 16914 break; 16915 case NL80211_NAN_FUNC_FOLLOW_UP: 16916 if (!tb[NL80211_NAN_FUNC_FOLLOW_UP_ID] || 16917 !tb[NL80211_NAN_FUNC_FOLLOW_UP_REQ_ID] || 16918 !tb[NL80211_NAN_FUNC_FOLLOW_UP_DEST]) { 16919 err = -EINVAL; 16920 goto out; 16921 } 16922 16923 func->followup_id = 16924 nla_get_u8(tb[NL80211_NAN_FUNC_FOLLOW_UP_ID]); 16925 func->followup_reqid = 16926 nla_get_u8(tb[NL80211_NAN_FUNC_FOLLOW_UP_REQ_ID]); 16927 memcpy(func->followup_dest.addr, 16928 nla_data(tb[NL80211_NAN_FUNC_FOLLOW_UP_DEST]), 16929 sizeof(func->followup_dest.addr)); 16930 if (func->ttl) { 16931 err = -EINVAL; 16932 goto out; 16933 } 16934 break; 16935 default: 16936 err = -EINVAL; 16937 goto out; 16938 } 16939 16940 if (tb[NL80211_NAN_FUNC_SRF]) { 16941 struct nlattr *srf_tb[NUM_NL80211_NAN_SRF_ATTR]; 16942 16943 err = nla_parse_nested_deprecated(srf_tb, 16944 NL80211_NAN_SRF_ATTR_MAX, 16945 tb[NL80211_NAN_FUNC_SRF], 16946 nl80211_nan_srf_policy, 16947 info->extack); 16948 if (err) 16949 goto out; 16950 16951 func->srf_include = 16952 nla_get_flag(srf_tb[NL80211_NAN_SRF_INCLUDE]); 16953 16954 if (srf_tb[NL80211_NAN_SRF_BF]) { 16955 if (srf_tb[NL80211_NAN_SRF_MAC_ADDRS] || 16956 !srf_tb[NL80211_NAN_SRF_BF_IDX]) { 16957 err = -EINVAL; 16958 goto out; 16959 } 16960 16961 func->srf_bf_len = 16962 nla_len(srf_tb[NL80211_NAN_SRF_BF]); 16963 func->srf_bf = 16964 kmemdup(nla_data(srf_tb[NL80211_NAN_SRF_BF]), 16965 func->srf_bf_len, GFP_KERNEL); 16966 if (!func->srf_bf) { 16967 err = -ENOMEM; 16968 goto out; 16969 } 16970 16971 func->srf_bf_idx = 16972 nla_get_u8(srf_tb[NL80211_NAN_SRF_BF_IDX]); 16973 } else { 16974 struct nlattr *attr, *mac_attr = 16975 srf_tb[NL80211_NAN_SRF_MAC_ADDRS]; 16976 int n_entries, rem, i = 0; 16977 16978 if (!mac_attr) { 16979 err = -EINVAL; 16980 goto out; 16981 } 16982 16983 n_entries = validate_acl_mac_addrs(mac_attr); 16984 if (n_entries <= 0) { 16985 err = -EINVAL; 16986 goto out; 16987 } 16988 16989 func->srf_num_macs = n_entries; 16990 func->srf_macs = 16991 kzalloc_objs(*func->srf_macs, n_entries); 16992 if (!func->srf_macs) { 16993 err = -ENOMEM; 16994 goto out; 16995 } 16996 16997 nla_for_each_nested(attr, mac_attr, rem) 16998 memcpy(func->srf_macs[i++].addr, nla_data(attr), 16999 sizeof(*func->srf_macs)); 17000 } 17001 } 17002 17003 if (tb[NL80211_NAN_FUNC_TX_MATCH_FILTER]) { 17004 err = handle_nan_filter(tb[NL80211_NAN_FUNC_TX_MATCH_FILTER], 17005 func, true); 17006 if (err) 17007 goto out; 17008 } 17009 17010 if (tb[NL80211_NAN_FUNC_RX_MATCH_FILTER]) { 17011 err = handle_nan_filter(tb[NL80211_NAN_FUNC_RX_MATCH_FILTER], 17012 func, false); 17013 if (err) 17014 goto out; 17015 } 17016 17017 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 17018 if (!msg) { 17019 err = -ENOMEM; 17020 goto out; 17021 } 17022 17023 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 17024 NL80211_CMD_ADD_NAN_FUNCTION); 17025 /* This can't really happen - we just allocated 4KB */ 17026 if (WARN_ON(!hdr)) { 17027 err = -ENOMEM; 17028 goto out; 17029 } 17030 17031 err = rdev_add_nan_func(rdev, wdev, func); 17032 out: 17033 if (err < 0) { 17034 cfg80211_free_nan_func(func); 17035 nlmsg_free(msg); 17036 return err; 17037 } 17038 17039 /* propagate the instance id and cookie to userspace */ 17040 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, func->cookie, 17041 NL80211_ATTR_PAD)) 17042 goto nla_put_failure; 17043 17044 func_attr = nla_nest_start_noflag(msg, NL80211_ATTR_NAN_FUNC); 17045 if (!func_attr) 17046 goto nla_put_failure; 17047 17048 if (nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, 17049 func->instance_id)) 17050 goto nla_put_failure; 17051 17052 nla_nest_end(msg, func_attr); 17053 17054 genlmsg_end(msg, hdr); 17055 return genlmsg_reply(msg, info); 17056 17057 nla_put_failure: 17058 nlmsg_free(msg); 17059 return -ENOBUFS; 17060 } 17061 17062 static int nl80211_nan_del_func(struct sk_buff *skb, 17063 struct genl_info *info) 17064 { 17065 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 17066 struct wireless_dev *wdev = info->user_ptr[1]; 17067 u64 cookie; 17068 17069 if (wdev->iftype != NL80211_IFTYPE_NAN) 17070 return -EOPNOTSUPP; 17071 17072 if (!wdev_running(wdev)) 17073 return -ENOTCONN; 17074 17075 if (!info->attrs[NL80211_ATTR_COOKIE]) 17076 return -EINVAL; 17077 17078 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); 17079 17080 rdev_del_nan_func(rdev, wdev, cookie); 17081 17082 return 0; 17083 } 17084 17085 static int nl80211_nan_change_config(struct sk_buff *skb, 17086 struct genl_info *info) 17087 { 17088 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 17089 struct wireless_dev *wdev = info->user_ptr[1]; 17090 struct cfg80211_nan_conf conf = {}; 17091 u32 changed = 0; 17092 int err; 17093 17094 if (wdev->iftype != NL80211_IFTYPE_NAN) 17095 return -EOPNOTSUPP; 17096 17097 if (!wdev_running(wdev)) 17098 return -ENOTCONN; 17099 17100 err = nl80211_parse_nan_conf(&rdev->wiphy, info, &conf, &changed, false); 17101 if (err) 17102 return err; 17103 17104 if (!changed) 17105 return -EINVAL; 17106 17107 return rdev_nan_change_conf(rdev, wdev, &conf, changed); 17108 } 17109 17110 static int nl80211_start_pd(struct sk_buff *skb, struct genl_info *info) 17111 { 17112 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 17113 struct wireless_dev *wdev = info->user_ptr[1]; 17114 int err; 17115 17116 if (wdev->iftype != NL80211_IFTYPE_PD) 17117 return -EOPNOTSUPP; 17118 17119 if (wdev_running(wdev)) 17120 return -EEXIST; 17121 17122 if (rfkill_blocked(rdev->wiphy.rfkill)) 17123 return -ERFKILL; 17124 17125 if (!rdev->ops->start_pd) 17126 return -EOPNOTSUPP; 17127 17128 err = rdev_start_pd(rdev, wdev); 17129 if (err) 17130 return err; 17131 wdev->is_running = true; 17132 rdev->opencount++; 17133 17134 return 0; 17135 } 17136 17137 static int nl80211_stop_pd(struct sk_buff *skb, struct genl_info *info) 17138 { 17139 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 17140 struct wireless_dev *wdev = info->user_ptr[1]; 17141 17142 if (wdev->iftype != NL80211_IFTYPE_PD) 17143 return -EOPNOTSUPP; 17144 17145 cfg80211_stop_pd(rdev, wdev); 17146 17147 return 0; 17148 } 17149 17150 void cfg80211_nan_match(struct wireless_dev *wdev, 17151 struct cfg80211_nan_match_params *match, gfp_t gfp) 17152 { 17153 struct wiphy *wiphy = wdev->wiphy; 17154 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 17155 struct nlattr *match_attr, *local_func_attr, *peer_func_attr; 17156 struct sk_buff *msg; 17157 void *hdr; 17158 17159 if (WARN_ON(wiphy->nan_capa.flags & WIPHY_NAN_FLAGS_USERSPACE_DE)) 17160 return; 17161 17162 if (WARN_ON(!match->inst_id || !match->peer_inst_id || !match->addr)) 17163 return; 17164 17165 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 17166 if (!msg) 17167 return; 17168 17169 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NAN_MATCH); 17170 if (!hdr) { 17171 nlmsg_free(msg); 17172 return; 17173 } 17174 17175 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 17176 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 17177 wdev->netdev->ifindex)) || 17178 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 17179 NL80211_ATTR_PAD)) 17180 goto nla_put_failure; 17181 17182 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, match->cookie, 17183 NL80211_ATTR_PAD) || 17184 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, match->addr)) 17185 goto nla_put_failure; 17186 17187 match_attr = nla_nest_start_noflag(msg, NL80211_ATTR_NAN_MATCH); 17188 if (!match_attr) 17189 goto nla_put_failure; 17190 17191 local_func_attr = nla_nest_start_noflag(msg, 17192 NL80211_NAN_MATCH_FUNC_LOCAL); 17193 if (!local_func_attr) 17194 goto nla_put_failure; 17195 17196 if (nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, match->inst_id)) 17197 goto nla_put_failure; 17198 17199 nla_nest_end(msg, local_func_attr); 17200 17201 peer_func_attr = nla_nest_start_noflag(msg, 17202 NL80211_NAN_MATCH_FUNC_PEER); 17203 if (!peer_func_attr) 17204 goto nla_put_failure; 17205 17206 if (nla_put_u8(msg, NL80211_NAN_FUNC_TYPE, match->type) || 17207 nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, match->peer_inst_id)) 17208 goto nla_put_failure; 17209 17210 if (match->info && match->info_len && 17211 nla_put(msg, NL80211_NAN_FUNC_SERVICE_INFO, match->info_len, 17212 match->info)) 17213 goto nla_put_failure; 17214 17215 nla_nest_end(msg, peer_func_attr); 17216 nla_nest_end(msg, match_attr); 17217 genlmsg_end(msg, hdr); 17218 17219 if (!wdev->owner_nlportid) 17220 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), 17221 msg, 0, NL80211_MCGRP_NAN, gfp); 17222 else 17223 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, 17224 wdev->owner_nlportid); 17225 17226 return; 17227 17228 nla_put_failure: 17229 nlmsg_free(msg); 17230 } 17231 EXPORT_SYMBOL(cfg80211_nan_match); 17232 17233 void cfg80211_nan_func_terminated(struct wireless_dev *wdev, 17234 u8 inst_id, 17235 enum nl80211_nan_func_term_reason reason, 17236 u64 cookie, gfp_t gfp) 17237 { 17238 struct wiphy *wiphy = wdev->wiphy; 17239 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 17240 struct sk_buff *msg; 17241 struct nlattr *func_attr; 17242 void *hdr; 17243 17244 if (WARN_ON(wiphy->nan_capa.flags & WIPHY_NAN_FLAGS_USERSPACE_DE)) 17245 return; 17246 17247 if (WARN_ON(!inst_id)) 17248 return; 17249 17250 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 17251 if (!msg) 17252 return; 17253 17254 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_DEL_NAN_FUNCTION); 17255 if (!hdr) { 17256 nlmsg_free(msg); 17257 return; 17258 } 17259 17260 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 17261 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 17262 wdev->netdev->ifindex)) || 17263 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 17264 NL80211_ATTR_PAD)) 17265 goto nla_put_failure; 17266 17267 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie, 17268 NL80211_ATTR_PAD)) 17269 goto nla_put_failure; 17270 17271 func_attr = nla_nest_start_noflag(msg, NL80211_ATTR_NAN_FUNC); 17272 if (!func_attr) 17273 goto nla_put_failure; 17274 17275 if (nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, inst_id) || 17276 nla_put_u8(msg, NL80211_NAN_FUNC_TERM_REASON, reason)) 17277 goto nla_put_failure; 17278 17279 nla_nest_end(msg, func_attr); 17280 genlmsg_end(msg, hdr); 17281 17282 if (!wdev->owner_nlportid) 17283 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), 17284 msg, 0, NL80211_MCGRP_NAN, gfp); 17285 else 17286 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, 17287 wdev->owner_nlportid); 17288 17289 return; 17290 17291 nla_put_failure: 17292 nlmsg_free(msg); 17293 } 17294 EXPORT_SYMBOL(cfg80211_nan_func_terminated); 17295 17296 void cfg80211_nan_sched_update_done(struct wireless_dev *wdev, bool success, 17297 gfp_t gfp) 17298 { 17299 struct wiphy *wiphy = wdev->wiphy; 17300 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 17301 struct sk_buff *msg; 17302 void *hdr; 17303 17304 trace_cfg80211_nan_sched_update_done(wiphy, wdev, success); 17305 17306 /* Can happen if we stopped NAN */ 17307 if (!wdev->u.nan.sched_update_pending) 17308 return; 17309 17310 wdev->u.nan.sched_update_pending = false; 17311 17312 if (!wdev->owner_nlportid) 17313 return; 17314 17315 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 17316 if (!msg) 17317 return; 17318 17319 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NAN_SCHED_UPDATE_DONE); 17320 if (!hdr) 17321 goto nla_put_failure; 17322 17323 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 17324 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 17325 NL80211_ATTR_PAD) || 17326 (success && 17327 nla_put_flag(msg, NL80211_ATTR_NAN_SCHED_UPDATE_SUCCESS))) 17328 goto nla_put_failure; 17329 17330 genlmsg_end(msg, hdr); 17331 17332 genlmsg_unicast(wiphy_net(wiphy), msg, wdev->owner_nlportid); 17333 17334 return; 17335 17336 nla_put_failure: 17337 nlmsg_free(msg); 17338 } 17339 EXPORT_SYMBOL(cfg80211_nan_sched_update_done); 17340 17341 static int nl80211_parse_nan_channel(struct cfg80211_registered_device *rdev, 17342 struct nlattr *channel, 17343 struct genl_info *info, 17344 struct cfg80211_nan_channel *nan_channels, 17345 u8 index, bool local) 17346 { 17347 struct nlattr **channel_parsed __free(kfree) = NULL; 17348 struct cfg80211_chan_def chandef; 17349 u8 n_rx_nss; 17350 int ret; 17351 17352 channel_parsed = kzalloc_objs(*channel_parsed, NL80211_ATTR_MAX + 1); 17353 if (!channel_parsed) 17354 return -ENOMEM; 17355 17356 ret = nla_parse_nested(channel_parsed, NL80211_ATTR_MAX, channel, NULL, 17357 info->extack); 17358 if (ret) 17359 return ret; 17360 17361 ret = nl80211_parse_chandef(rdev, info->extack, channel_parsed, 17362 &chandef, false); 17363 if (ret) 17364 return ret; 17365 17366 if (chandef.chan->band == NL80211_BAND_6GHZ) { 17367 NL_SET_ERR_MSG(info->extack, 17368 "6 GHz band is not supported"); 17369 return -EOPNOTSUPP; 17370 } 17371 17372 if (!cfg80211_reg_can_beacon(&rdev->wiphy, &chandef, 17373 NL80211_IFTYPE_NAN)) { 17374 NL_SET_ERR_MSG_ATTR(info->extack, channel, 17375 "Channel in NAN schedule is not allowed for NAN operation"); 17376 return -EINVAL; 17377 } 17378 17379 if (local) { 17380 for (int i = 0; i < index; i++) { 17381 if (cfg80211_chandef_compatible(&nan_channels[i].chandef, 17382 &chandef)) { 17383 NL_SET_ERR_MSG_ATTR(info->extack, channel, 17384 "Channels in NAN schedule must be mutually incompatible"); 17385 return -EINVAL; 17386 } 17387 } 17388 } 17389 17390 if (!channel_parsed[NL80211_ATTR_NAN_CHANNEL_ENTRY]) { 17391 NL_SET_ERR_MSG(info->extack, 17392 "Missing NAN channel entry attribute"); 17393 return -EINVAL; 17394 } 17395 17396 nan_channels[index].channel_entry = 17397 nla_data(channel_parsed[NL80211_ATTR_NAN_CHANNEL_ENTRY]); 17398 17399 if (!channel_parsed[NL80211_ATTR_NAN_RX_NSS]) { 17400 NL_SET_ERR_MSG(info->extack, 17401 "Missing NAN RX NSS attribute"); 17402 return -EINVAL; 17403 } 17404 17405 nan_channels[index].rx_nss = 17406 nla_get_u8(channel_parsed[NL80211_ATTR_NAN_RX_NSS]); 17407 17408 n_rx_nss = u8_get_bits(rdev->wiphy.nan_capa.n_antennas, 0x03); 17409 if ((local && nan_channels[index].rx_nss > n_rx_nss) || 17410 !nan_channels[index].rx_nss) { 17411 NL_SET_ERR_MSG_ATTR(info->extack, channel, 17412 "Invalid RX NSS in NAN channel definition"); 17413 return -EINVAL; 17414 } 17415 17416 nan_channels[index].chandef = chandef; 17417 17418 return 0; 17419 } 17420 17421 static int 17422 nl80211_parse_nan_schedule(struct genl_info *info, struct nlattr *slots_attr, 17423 u8 schedule[CFG80211_NAN_SCHED_NUM_TIME_SLOTS], 17424 u8 n_channels) 17425 { 17426 if (WARN_ON(nla_len(slots_attr) != CFG80211_NAN_SCHED_NUM_TIME_SLOTS)) 17427 return -EINVAL; 17428 17429 memcpy(schedule, nla_data(slots_attr), nla_len(slots_attr)); 17430 17431 for (int slot = 0; slot < CFG80211_NAN_SCHED_NUM_TIME_SLOTS; slot++) { 17432 if (schedule[slot] != NL80211_NAN_SCHED_NOT_AVAIL_SLOT && 17433 schedule[slot] >= n_channels) { 17434 NL_SET_ERR_MSG_FMT(info->extack, 17435 "Invalid time slot: slot %d refers to channel index %d, n_channels=%d", 17436 slot, schedule[slot], n_channels); 17437 return -EINVAL; 17438 } 17439 } 17440 17441 return 0; 17442 } 17443 17444 static int 17445 nl80211_parse_nan_peer_map(struct genl_info *info, struct nlattr *map_attr, 17446 struct cfg80211_nan_peer_map *map, u8 n_channels) 17447 { 17448 struct nlattr *tb[NL80211_NAN_PEER_MAP_ATTR_MAX + 1]; 17449 int ret; 17450 17451 ret = nla_parse_nested(tb, NL80211_NAN_PEER_MAP_ATTR_MAX, map_attr, 17452 nl80211_nan_peer_map_policy, info->extack); 17453 if (ret) 17454 return ret; 17455 17456 if (!tb[NL80211_NAN_PEER_MAP_ATTR_MAP_ID] || 17457 !tb[NL80211_NAN_PEER_MAP_ATTR_TIME_SLOTS]) { 17458 NL_SET_ERR_MSG(info->extack, 17459 "Missing required peer map attributes"); 17460 return -EINVAL; 17461 } 17462 17463 map->map_id = nla_get_u8(tb[NL80211_NAN_PEER_MAP_ATTR_MAP_ID]); 17464 17465 /* Parse schedule */ 17466 return nl80211_parse_nan_schedule(info, 17467 tb[NL80211_NAN_PEER_MAP_ATTR_TIME_SLOTS], 17468 map->schedule, n_channels); 17469 } 17470 17471 static int nl80211_nan_validate_map_pair(struct wiphy *wiphy, 17472 struct genl_info *info, 17473 const struct cfg80211_nan_peer_map *map1, 17474 const struct cfg80211_nan_peer_map *map2, 17475 struct cfg80211_nan_channel *nan_channels) 17476 { 17477 /* Check for duplicate map_id */ 17478 if (map1->map_id == map2->map_id) { 17479 NL_SET_ERR_MSG_FMT(info->extack, "Duplicate map_id %u", 17480 map1->map_id); 17481 return -EINVAL; 17482 } 17483 17484 /* Check for compatible channels between maps */ 17485 for (int i = 0; i < ARRAY_SIZE(map1->schedule); i++) { 17486 if (map1->schedule[i] == NL80211_NAN_SCHED_NOT_AVAIL_SLOT) 17487 continue; 17488 17489 for (int j = 0; j < ARRAY_SIZE(map2->schedule); j++) { 17490 u8 ch1 = map1->schedule[i]; 17491 u8 ch2 = map2->schedule[j]; 17492 17493 if (ch2 == NL80211_NAN_SCHED_NOT_AVAIL_SLOT) 17494 continue; 17495 17496 if (cfg80211_chandef_compatible(&nan_channels[ch1].chandef, 17497 &nan_channels[ch2].chandef)) { 17498 NL_SET_ERR_MSG_FMT(info->extack, 17499 "Maps %u and %u have compatible channels %d and %d", 17500 map1->map_id, map2->map_id, 17501 ch1, ch2); 17502 return -EINVAL; 17503 } 17504 } 17505 } 17506 17507 /* 17508 * Check for conflicting time slots between maps. 17509 * Only check for single-radio devices (n_radio <= 1) which cannot 17510 * operate on multiple channels simultaneously. 17511 */ 17512 if (wiphy->n_radio > 1) 17513 return 0; 17514 17515 for (int i = 0; i < ARRAY_SIZE(map1->schedule); i++) { 17516 if (map1->schedule[i] != NL80211_NAN_SCHED_NOT_AVAIL_SLOT && 17517 map2->schedule[i] != NL80211_NAN_SCHED_NOT_AVAIL_SLOT) { 17518 NL_SET_ERR_MSG_FMT(info->extack, 17519 "Maps %u and %u both schedule slot %d", 17520 map1->map_id, map2->map_id, i); 17521 return -EINVAL; 17522 } 17523 } 17524 17525 return 0; 17526 } 17527 17528 static int nl80211_nan_set_peer_sched(struct sk_buff *skb, 17529 struct genl_info *info) 17530 { 17531 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 17532 struct cfg80211_nan_channel *nan_channels __free(kfree) = NULL; 17533 struct cfg80211_nan_peer_sched sched = {}; 17534 struct wireless_dev *wdev = info->user_ptr[1]; 17535 struct nlattr *map_attr, *channel; 17536 int ret, n_maps = 0, n_channels = 0, i = 0, rem; 17537 17538 if (wdev->iftype != NL80211_IFTYPE_NAN) 17539 return -EOPNOTSUPP; 17540 17541 if (!info->attrs[NL80211_ATTR_MAC] || 17542 !info->attrs[NL80211_ATTR_NAN_COMMITTED_DW]) { 17543 NL_SET_ERR_MSG(info->extack, 17544 "Required NAN peer schedule attributes are missing"); 17545 return -EINVAL; 17546 } 17547 17548 /* First count how many channel attributes we got */ 17549 nlmsg_for_each_attr_type(channel, NL80211_ATTR_NAN_CHANNEL, 17550 info->nlhdr, GENL_HDRLEN, rem) 17551 n_channels++; 17552 17553 if (!((info->attrs[NL80211_ATTR_NAN_SEQ_ID] && 17554 info->attrs[NL80211_ATTR_NAN_PEER_MAPS] && n_channels) || 17555 ((!info->attrs[NL80211_ATTR_NAN_SEQ_ID] && 17556 !info->attrs[NL80211_ATTR_NAN_PEER_MAPS] && !n_channels)))) { 17557 NL_SET_ERR_MSG(info->extack, 17558 "Either provide all of: seq id, channels and maps, or none"); 17559 return -EINVAL; 17560 } 17561 17562 /* 17563 * Limit the number of peer channels to: 17564 * local_channels * 4 (possible BWs) * 2 (possible NSS values) 17565 */ 17566 if (n_channels && n_channels > wdev->u.nan.n_channels * 4 * 2) { 17567 NL_SET_ERR_MSG_FMT(info->extack, 17568 "Too many peer channels: %d (max %d)", 17569 n_channels, 17570 wdev->u.nan.n_channels * 4 * 2); 17571 return -EINVAL; 17572 } 17573 17574 if (n_channels) { 17575 nan_channels = kzalloc_objs(*nan_channels, n_channels); 17576 if (!nan_channels) 17577 return -ENOMEM; 17578 } 17579 17580 /* Parse peer channels */ 17581 nlmsg_for_each_attr_type(channel, NL80211_ATTR_NAN_CHANNEL, 17582 info->nlhdr, GENL_HDRLEN, rem) { 17583 bool compatible = false; 17584 17585 ret = nl80211_parse_nan_channel(rdev, channel, info, 17586 nan_channels, i, false); 17587 if (ret) 17588 return ret; 17589 17590 /* Verify channel is compatible with at least one local channel */ 17591 for (int j = 0; j < wdev->u.nan.n_channels; j++) { 17592 if (cfg80211_chandef_compatible(&nan_channels[i].chandef, 17593 &wdev->u.nan.chandefs[j])) { 17594 compatible = true; 17595 break; 17596 } 17597 } 17598 if (!compatible) { 17599 NL_SET_ERR_MSG_FMT(info->extack, 17600 "Channel %d not compatible with any local channel", 17601 i); 17602 return -EINVAL; 17603 } 17604 i++; 17605 } 17606 17607 sched.n_channels = n_channels; 17608 sched.nan_channels = nan_channels; 17609 sched.peer_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 17610 sched.seq_id = nla_get_u8_default(info->attrs[NL80211_ATTR_NAN_SEQ_ID], 0); 17611 sched.committed_dw = nla_get_u16(info->attrs[NL80211_ATTR_NAN_COMMITTED_DW]); 17612 sched.max_chan_switch = 17613 nla_get_u16_default(info->attrs[NL80211_ATTR_NAN_MAX_CHAN_SWITCH_TIME], 0); 17614 17615 if (info->attrs[NL80211_ATTR_NAN_ULW]) { 17616 sched.ulw_size = nla_len(info->attrs[NL80211_ATTR_NAN_ULW]); 17617 sched.init_ulw = nla_data(info->attrs[NL80211_ATTR_NAN_ULW]); 17618 } 17619 17620 /* Initialize all maps as invalid */ 17621 for (int j = 0; j < ARRAY_SIZE(sched.maps); j++) 17622 sched.maps[j].map_id = CFG80211_NAN_INVALID_MAP_ID; 17623 17624 if (info->attrs[NL80211_ATTR_NAN_PEER_MAPS]) { 17625 /* Parse each map */ 17626 nla_for_each_nested(map_attr, info->attrs[NL80211_ATTR_NAN_PEER_MAPS], 17627 rem) { 17628 if (n_maps >= ARRAY_SIZE(sched.maps)) { 17629 NL_SET_ERR_MSG(info->extack, "Too many peer maps"); 17630 return -EINVAL; 17631 } 17632 17633 ret = nl80211_parse_nan_peer_map(info, map_attr, 17634 &sched.maps[n_maps], 17635 n_channels); 17636 if (ret) 17637 return ret; 17638 17639 /* Validate against previous maps */ 17640 for (int j = 0; j < n_maps; j++) { 17641 ret = nl80211_nan_validate_map_pair(&rdev->wiphy, info, 17642 &sched.maps[j], 17643 &sched.maps[n_maps], 17644 nan_channels); 17645 if (ret) 17646 return ret; 17647 } 17648 17649 n_maps++; 17650 } 17651 } 17652 17653 /* Verify each channel is scheduled at least once */ 17654 for (int ch = 0; ch < n_channels; ch++) { 17655 bool scheduled = false; 17656 17657 for (int m = 0; m < n_maps && !scheduled; m++) { 17658 for (int s = 0; s < ARRAY_SIZE(sched.maps[m].schedule); s++) { 17659 if (sched.maps[m].schedule[s] == ch) { 17660 scheduled = true; 17661 break; 17662 } 17663 } 17664 } 17665 if (!scheduled) { 17666 NL_SET_ERR_MSG_FMT(info->extack, 17667 "Channel %d is not scheduled in any map", 17668 ch); 17669 return -EINVAL; 17670 } 17671 } 17672 17673 return rdev_nan_set_peer_sched(rdev, wdev, &sched); 17674 } 17675 17676 static bool nl80211_nan_is_sched_empty(struct cfg80211_nan_local_sched *sched) 17677 { 17678 if (!sched->n_channels) 17679 return true; 17680 17681 for (int i = 0; i < ARRAY_SIZE(sched->schedule); i++) { 17682 if (sched->schedule[i] != NL80211_NAN_SCHED_NOT_AVAIL_SLOT) 17683 return false; 17684 } 17685 17686 return true; 17687 } 17688 17689 static int nl80211_nan_set_local_sched(struct sk_buff *skb, 17690 struct genl_info *info) 17691 { 17692 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 17693 struct cfg80211_nan_local_sched *sched __free(kfree) = NULL; 17694 struct wireless_dev *wdev = info->user_ptr[1]; 17695 int rem, i = 0, n_channels = 0, ret; 17696 struct nlattr *channel; 17697 bool sched_empty; 17698 17699 if (wdev->iftype != NL80211_IFTYPE_NAN) 17700 return -EOPNOTSUPP; 17701 17702 if (!wdev_running(wdev)) 17703 return -ENOTCONN; 17704 17705 if (!info->attrs[NL80211_ATTR_NAN_TIME_SLOTS]) 17706 return -EINVAL; 17707 17708 /* First count how many channel attributes we got */ 17709 nlmsg_for_each_attr_type(channel, NL80211_ATTR_NAN_CHANNEL, 17710 info->nlhdr, GENL_HDRLEN, rem) 17711 n_channels++; 17712 17713 sched = kzalloc_flex(*sched, nan_channels, n_channels); 17714 if (!sched) 17715 return -ENOMEM; 17716 17717 sched->n_channels = n_channels; 17718 17719 nlmsg_for_each_attr_type(channel, NL80211_ATTR_NAN_CHANNEL, 17720 info->nlhdr, GENL_HDRLEN, rem) { 17721 ret = nl80211_parse_nan_channel(rdev, channel, info, 17722 sched->nan_channels, i, true); 17723 17724 if (ret) 17725 return ret; 17726 i++; 17727 } 17728 17729 /* Parse and validate schedule */ 17730 ret = nl80211_parse_nan_schedule(info, 17731 info->attrs[NL80211_ATTR_NAN_TIME_SLOTS], 17732 sched->schedule, sched->n_channels); 17733 if (ret) 17734 return ret; 17735 17736 sched_empty = nl80211_nan_is_sched_empty(sched); 17737 17738 sched->deferred = 17739 nla_get_flag(info->attrs[NL80211_ATTR_NAN_SCHED_DEFERRED]); 17740 17741 if (sched_empty) { 17742 if (sched->deferred) { 17743 NL_SET_ERR_MSG(info->extack, 17744 "Schedule cannot be deferred if all time slots are unavailable"); 17745 return -EINVAL; 17746 } 17747 17748 if (info->attrs[NL80211_ATTR_NAN_AVAIL_BLOB]) { 17749 NL_SET_ERR_MSG(info->extack, 17750 "NAN Availability blob must be empty if all time slots are unavailable"); 17751 return -EINVAL; 17752 } 17753 } else { 17754 if (!info->attrs[NL80211_ATTR_NAN_AVAIL_BLOB]) { 17755 NL_SET_ERR_MSG(info->extack, 17756 "NAN Availability blob attribute is required"); 17757 return -EINVAL; 17758 } 17759 17760 sched->nan_avail_blob = 17761 nla_data(info->attrs[NL80211_ATTR_NAN_AVAIL_BLOB]); 17762 sched->nan_avail_blob_len = 17763 nla_len(info->attrs[NL80211_ATTR_NAN_AVAIL_BLOB]); 17764 } 17765 17766 return cfg80211_nan_set_local_schedule(rdev, wdev, sched); 17767 } 17768 17769 static int nl80211_get_protocol_features(struct sk_buff *skb, 17770 struct genl_info *info) 17771 { 17772 void *hdr; 17773 struct sk_buff *msg; 17774 17775 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 17776 if (!msg) 17777 return -ENOMEM; 17778 17779 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 17780 NL80211_CMD_GET_PROTOCOL_FEATURES); 17781 if (!hdr) 17782 goto nla_put_failure; 17783 17784 if (nla_put_u32(msg, NL80211_ATTR_PROTOCOL_FEATURES, 17785 NL80211_PROTOCOL_FEATURE_SPLIT_WIPHY_DUMP)) 17786 goto nla_put_failure; 17787 17788 genlmsg_end(msg, hdr); 17789 return genlmsg_reply(msg, info); 17790 17791 nla_put_failure: 17792 kfree_skb(msg); 17793 return -ENOBUFS; 17794 } 17795 17796 static int nl80211_update_ft_ies(struct sk_buff *skb, struct genl_info *info) 17797 { 17798 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 17799 struct cfg80211_update_ft_ies_params ft_params; 17800 struct net_device *dev = info->user_ptr[1]; 17801 17802 if (!rdev->ops->update_ft_ies) 17803 return -EOPNOTSUPP; 17804 17805 if (!info->attrs[NL80211_ATTR_MDID] || 17806 !info->attrs[NL80211_ATTR_IE]) 17807 return -EINVAL; 17808 17809 memset(&ft_params, 0, sizeof(ft_params)); 17810 ft_params.md = nla_get_u16(info->attrs[NL80211_ATTR_MDID]); 17811 ft_params.ie = nla_data(info->attrs[NL80211_ATTR_IE]); 17812 ft_params.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 17813 17814 return rdev_update_ft_ies(rdev, dev, &ft_params); 17815 } 17816 17817 static int nl80211_crit_protocol_start(struct sk_buff *skb, 17818 struct genl_info *info) 17819 { 17820 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 17821 struct wireless_dev *wdev = info->user_ptr[1]; 17822 enum nl80211_crit_proto_id proto = NL80211_CRIT_PROTO_UNSPEC; 17823 u16 duration; 17824 int ret; 17825 17826 if (!rdev->ops->crit_proto_start) 17827 return -EOPNOTSUPP; 17828 17829 if (WARN_ON(!rdev->ops->crit_proto_stop)) 17830 return -EINVAL; 17831 17832 if (rdev->crit_proto_nlportid) 17833 return -EBUSY; 17834 17835 /* determine protocol if provided */ 17836 if (info->attrs[NL80211_ATTR_CRIT_PROT_ID]) 17837 proto = nla_get_u16(info->attrs[NL80211_ATTR_CRIT_PROT_ID]); 17838 17839 if (proto >= NUM_NL80211_CRIT_PROTO) 17840 return -EINVAL; 17841 17842 /* timeout must be provided */ 17843 if (!info->attrs[NL80211_ATTR_MAX_CRIT_PROT_DURATION]) 17844 return -EINVAL; 17845 17846 duration = 17847 nla_get_u16(info->attrs[NL80211_ATTR_MAX_CRIT_PROT_DURATION]); 17848 17849 ret = rdev_crit_proto_start(rdev, wdev, proto, duration); 17850 if (!ret) 17851 rdev->crit_proto_nlportid = info->snd_portid; 17852 17853 return ret; 17854 } 17855 17856 static int nl80211_crit_protocol_stop(struct sk_buff *skb, 17857 struct genl_info *info) 17858 { 17859 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 17860 struct wireless_dev *wdev = info->user_ptr[1]; 17861 17862 if (!rdev->ops->crit_proto_stop) 17863 return -EOPNOTSUPP; 17864 17865 if (rdev->crit_proto_nlportid) { 17866 rdev->crit_proto_nlportid = 0; 17867 rdev_crit_proto_stop(rdev, wdev); 17868 } 17869 return 0; 17870 } 17871 17872 static int nl80211_vendor_check_policy(const struct wiphy_vendor_command *vcmd, 17873 struct nlattr *attr, 17874 struct netlink_ext_ack *extack) 17875 { 17876 if (vcmd->policy == VENDOR_CMD_RAW_DATA) { 17877 if (attr->nla_type & NLA_F_NESTED) { 17878 NL_SET_ERR_MSG_ATTR(extack, attr, 17879 "unexpected nested data"); 17880 return -EINVAL; 17881 } 17882 17883 return 0; 17884 } 17885 17886 if (!(attr->nla_type & NLA_F_NESTED)) { 17887 NL_SET_ERR_MSG_ATTR(extack, attr, "expected nested data"); 17888 return -EINVAL; 17889 } 17890 17891 return nla_validate_nested(attr, vcmd->maxattr, vcmd->policy, extack); 17892 } 17893 17894 static int nl80211_vendor_cmd(struct sk_buff *skb, struct genl_info *info) 17895 { 17896 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 17897 struct wireless_dev *wdev = 17898 __cfg80211_wdev_from_attrs(rdev, genl_info_net(info), 17899 info->attrs); 17900 int i, err; 17901 u32 vid, subcmd; 17902 17903 if (!rdev->wiphy.vendor_commands) 17904 return -EOPNOTSUPP; 17905 17906 if (IS_ERR(wdev)) { 17907 err = PTR_ERR(wdev); 17908 if (err != -EINVAL) 17909 return err; 17910 wdev = NULL; 17911 } else if (wdev->wiphy != &rdev->wiphy) { 17912 return -EINVAL; 17913 } 17914 17915 if (!info->attrs[NL80211_ATTR_VENDOR_ID] || 17916 !info->attrs[NL80211_ATTR_VENDOR_SUBCMD]) 17917 return -EINVAL; 17918 17919 vid = nla_get_u32(info->attrs[NL80211_ATTR_VENDOR_ID]); 17920 subcmd = nla_get_u32(info->attrs[NL80211_ATTR_VENDOR_SUBCMD]); 17921 for (i = 0; i < rdev->wiphy.n_vendor_commands; i++) { 17922 const struct wiphy_vendor_command *vcmd; 17923 void *data = NULL; 17924 int len = 0; 17925 17926 vcmd = &rdev->wiphy.vendor_commands[i]; 17927 17928 if (vcmd->info.vendor_id != vid || vcmd->info.subcmd != subcmd) 17929 continue; 17930 17931 if (vcmd->flags & (WIPHY_VENDOR_CMD_NEED_WDEV | 17932 WIPHY_VENDOR_CMD_NEED_NETDEV)) { 17933 if (!wdev) 17934 return -EINVAL; 17935 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_NETDEV && 17936 !wdev->netdev) 17937 return -EINVAL; 17938 17939 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_RUNNING) { 17940 if (!wdev_running(wdev)) 17941 return -ENETDOWN; 17942 } 17943 } else { 17944 wdev = NULL; 17945 } 17946 17947 if (!vcmd->doit) 17948 return -EOPNOTSUPP; 17949 17950 if (info->attrs[NL80211_ATTR_VENDOR_DATA]) { 17951 data = nla_data(info->attrs[NL80211_ATTR_VENDOR_DATA]); 17952 len = nla_len(info->attrs[NL80211_ATTR_VENDOR_DATA]); 17953 17954 err = nl80211_vendor_check_policy(vcmd, 17955 info->attrs[NL80211_ATTR_VENDOR_DATA], 17956 info->extack); 17957 if (err) 17958 return err; 17959 } 17960 17961 rdev->cur_cmd_info = info; 17962 err = vcmd->doit(&rdev->wiphy, wdev, data, len); 17963 rdev->cur_cmd_info = NULL; 17964 return err; 17965 } 17966 17967 return -EOPNOTSUPP; 17968 } 17969 17970 static int nl80211_prepare_vendor_dump(struct sk_buff *skb, 17971 struct netlink_callback *cb, 17972 struct cfg80211_registered_device **rdev, 17973 struct wireless_dev **wdev) 17974 { 17975 struct nlattr **attrbuf; 17976 u32 vid, subcmd; 17977 unsigned int i; 17978 int vcmd_idx = -1; 17979 int err; 17980 void *data = NULL; 17981 unsigned int data_len = 0; 17982 17983 if (cb->args[0]) { 17984 /* subtract the 1 again here */ 17985 struct wiphy *wiphy = wiphy_idx_to_wiphy(cb->args[0] - 1); 17986 struct wireless_dev *tmp; 17987 17988 if (!wiphy) 17989 return -ENODEV; 17990 17991 /* 17992 * The wiphy may have moved netns between dumpit 17993 * invocations (via NL80211_CMD_SET_WIPHY_NETNS), so 17994 * re-check that it still matches the caller's netns. 17995 */ 17996 if (!net_eq(wiphy_net(wiphy), sock_net(skb->sk))) 17997 return -ENODEV; 17998 17999 *rdev = wiphy_to_rdev(wiphy); 18000 *wdev = NULL; 18001 18002 if (cb->args[1]) { 18003 list_for_each_entry(tmp, &wiphy->wdev_list, list) { 18004 if (tmp->identifier == cb->args[1] - 1) { 18005 *wdev = tmp; 18006 break; 18007 } 18008 } 18009 } 18010 18011 /* keep rtnl locked in successful case */ 18012 return 0; 18013 } 18014 18015 attrbuf = kzalloc_objs(*attrbuf, NUM_NL80211_ATTR); 18016 if (!attrbuf) 18017 return -ENOMEM; 18018 18019 err = nlmsg_parse_deprecated(cb->nlh, 18020 GENL_HDRLEN + nl80211_fam.hdrsize, 18021 attrbuf, nl80211_fam.maxattr, 18022 nl80211_policy, NULL); 18023 if (err) 18024 goto out; 18025 18026 if (!attrbuf[NL80211_ATTR_VENDOR_ID] || 18027 !attrbuf[NL80211_ATTR_VENDOR_SUBCMD]) { 18028 err = -EINVAL; 18029 goto out; 18030 } 18031 18032 *wdev = __cfg80211_wdev_from_attrs(NULL, sock_net(skb->sk), attrbuf); 18033 if (IS_ERR(*wdev)) 18034 *wdev = NULL; 18035 18036 *rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk), attrbuf); 18037 if (IS_ERR(*rdev)) { 18038 err = PTR_ERR(*rdev); 18039 goto out; 18040 } 18041 18042 vid = nla_get_u32(attrbuf[NL80211_ATTR_VENDOR_ID]); 18043 subcmd = nla_get_u32(attrbuf[NL80211_ATTR_VENDOR_SUBCMD]); 18044 18045 for (i = 0; i < (*rdev)->wiphy.n_vendor_commands; i++) { 18046 const struct wiphy_vendor_command *vcmd; 18047 18048 vcmd = &(*rdev)->wiphy.vendor_commands[i]; 18049 18050 if (vcmd->info.vendor_id != vid || vcmd->info.subcmd != subcmd) 18051 continue; 18052 18053 if (!vcmd->dumpit) { 18054 err = -EOPNOTSUPP; 18055 goto out; 18056 } 18057 18058 vcmd_idx = i; 18059 break; 18060 } 18061 18062 if (vcmd_idx < 0) { 18063 err = -EOPNOTSUPP; 18064 goto out; 18065 } 18066 18067 if (attrbuf[NL80211_ATTR_VENDOR_DATA]) { 18068 data = nla_data(attrbuf[NL80211_ATTR_VENDOR_DATA]); 18069 data_len = nla_len(attrbuf[NL80211_ATTR_VENDOR_DATA]); 18070 18071 err = nl80211_vendor_check_policy( 18072 &(*rdev)->wiphy.vendor_commands[vcmd_idx], 18073 attrbuf[NL80211_ATTR_VENDOR_DATA], 18074 cb->extack); 18075 if (err) 18076 goto out; 18077 } 18078 18079 /* 0 is the first index - add 1 to parse only once */ 18080 cb->args[0] = (*rdev)->wiphy_idx + 1; 18081 /* add 1 to know if it was NULL */ 18082 cb->args[1] = *wdev ? (*wdev)->identifier + 1 : 0; 18083 cb->args[2] = vcmd_idx; 18084 cb->args[3] = (unsigned long)data; 18085 cb->args[4] = data_len; 18086 18087 /* keep rtnl locked in successful case */ 18088 err = 0; 18089 out: 18090 kfree(attrbuf); 18091 return err; 18092 } 18093 18094 static int nl80211_vendor_cmd_dump(struct sk_buff *skb, 18095 struct netlink_callback *cb) 18096 { 18097 struct cfg80211_registered_device *rdev; 18098 struct wireless_dev *wdev; 18099 unsigned int vcmd_idx; 18100 const struct wiphy_vendor_command *vcmd; 18101 void *data; 18102 int data_len; 18103 int err; 18104 struct nlattr *vendor_data; 18105 18106 rtnl_lock(); 18107 err = nl80211_prepare_vendor_dump(skb, cb, &rdev, &wdev); 18108 if (err) 18109 goto out; 18110 18111 vcmd_idx = cb->args[2]; 18112 data = (void *)cb->args[3]; 18113 data_len = cb->args[4]; 18114 vcmd = &rdev->wiphy.vendor_commands[vcmd_idx]; 18115 18116 if (vcmd->flags & (WIPHY_VENDOR_CMD_NEED_WDEV | 18117 WIPHY_VENDOR_CMD_NEED_NETDEV)) { 18118 if (!wdev) { 18119 err = -EINVAL; 18120 goto out; 18121 } 18122 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_NETDEV && 18123 !wdev->netdev) { 18124 err = -EINVAL; 18125 goto out; 18126 } 18127 18128 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_RUNNING) { 18129 if (!wdev_running(wdev)) { 18130 err = -ENETDOWN; 18131 goto out; 18132 } 18133 } 18134 } 18135 18136 while (1) { 18137 void *hdr = nl80211hdr_put(skb, NETLINK_CB(cb->skb).portid, 18138 cb->nlh->nlmsg_seq, NLM_F_MULTI, 18139 NL80211_CMD_VENDOR); 18140 if (!hdr) 18141 break; 18142 18143 if (nla_put_u32(skb, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 18144 (wdev && nla_put_u64_64bit(skb, NL80211_ATTR_WDEV, 18145 wdev_id(wdev), 18146 NL80211_ATTR_PAD))) { 18147 genlmsg_cancel(skb, hdr); 18148 break; 18149 } 18150 18151 vendor_data = nla_nest_start_noflag(skb, 18152 NL80211_ATTR_VENDOR_DATA); 18153 if (!vendor_data) { 18154 genlmsg_cancel(skb, hdr); 18155 break; 18156 } 18157 18158 err = vcmd->dumpit(&rdev->wiphy, wdev, skb, data, data_len, 18159 (unsigned long *)&cb->args[5]); 18160 nla_nest_end(skb, vendor_data); 18161 18162 if (err == -ENOBUFS || err == -ENOENT) { 18163 genlmsg_cancel(skb, hdr); 18164 break; 18165 } else if (err <= 0) { 18166 genlmsg_cancel(skb, hdr); 18167 goto out; 18168 } 18169 18170 genlmsg_end(skb, hdr); 18171 } 18172 18173 err = skb->len; 18174 out: 18175 rtnl_unlock(); 18176 return err; 18177 } 18178 18179 struct sk_buff *__cfg80211_alloc_reply_skb(struct wiphy *wiphy, 18180 enum nl80211_commands cmd, 18181 enum nl80211_attrs attr, 18182 int approxlen) 18183 { 18184 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 18185 18186 if (WARN_ON(!rdev->cur_cmd_info)) 18187 return NULL; 18188 18189 return __cfg80211_alloc_vendor_skb(rdev, NULL, approxlen, 18190 rdev->cur_cmd_info->snd_portid, 18191 rdev->cur_cmd_info->snd_seq, 18192 cmd, attr, NULL, GFP_KERNEL); 18193 } 18194 EXPORT_SYMBOL(__cfg80211_alloc_reply_skb); 18195 18196 int cfg80211_vendor_cmd_reply(struct sk_buff *skb) 18197 { 18198 struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0]; 18199 void *hdr = ((void **)skb->cb)[1]; 18200 struct nlattr *data = ((void **)skb->cb)[2]; 18201 18202 /* clear CB data for netlink core to own from now on */ 18203 memset(skb->cb, 0, sizeof(skb->cb)); 18204 18205 if (WARN_ON(!rdev->cur_cmd_info)) { 18206 kfree_skb(skb); 18207 return -EINVAL; 18208 } 18209 18210 nla_nest_end(skb, data); 18211 genlmsg_end(skb, hdr); 18212 return genlmsg_reply(skb, rdev->cur_cmd_info); 18213 } 18214 EXPORT_SYMBOL_GPL(cfg80211_vendor_cmd_reply); 18215 18216 unsigned int cfg80211_vendor_cmd_get_sender(struct wiphy *wiphy) 18217 { 18218 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 18219 18220 if (WARN_ON(!rdev->cur_cmd_info)) 18221 return 0; 18222 18223 return rdev->cur_cmd_info->snd_portid; 18224 } 18225 EXPORT_SYMBOL_GPL(cfg80211_vendor_cmd_get_sender); 18226 18227 static int nl80211_set_qos_map(struct sk_buff *skb, 18228 struct genl_info *info) 18229 { 18230 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 18231 struct cfg80211_qos_map *qos_map = NULL; 18232 struct net_device *dev = info->user_ptr[1]; 18233 u8 *pos, len, num_des, des_len, des; 18234 int ret; 18235 18236 if (!rdev->ops->set_qos_map) 18237 return -EOPNOTSUPP; 18238 18239 if (info->attrs[NL80211_ATTR_QOS_MAP]) { 18240 pos = nla_data(info->attrs[NL80211_ATTR_QOS_MAP]); 18241 len = nla_len(info->attrs[NL80211_ATTR_QOS_MAP]); 18242 18243 if (len % 2) 18244 return -EINVAL; 18245 18246 qos_map = kzalloc_obj(struct cfg80211_qos_map); 18247 if (!qos_map) 18248 return -ENOMEM; 18249 18250 num_des = (len - IEEE80211_QOS_MAP_LEN_MIN) >> 1; 18251 if (num_des) { 18252 des_len = num_des * 18253 sizeof(struct cfg80211_dscp_exception); 18254 memcpy(qos_map->dscp_exception, pos, des_len); 18255 qos_map->num_des = num_des; 18256 for (des = 0; des < num_des; des++) { 18257 if (qos_map->dscp_exception[des].up > 7) { 18258 kfree(qos_map); 18259 return -EINVAL; 18260 } 18261 } 18262 pos += des_len; 18263 } 18264 memcpy(qos_map->up, pos, IEEE80211_QOS_MAP_LEN_MIN); 18265 } 18266 18267 ret = nl80211_key_allowed(dev->ieee80211_ptr); 18268 if (!ret) 18269 ret = rdev_set_qos_map(rdev, dev, qos_map); 18270 18271 kfree(qos_map); 18272 return ret; 18273 } 18274 18275 static int nl80211_add_tx_ts(struct sk_buff *skb, struct genl_info *info) 18276 { 18277 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 18278 struct net_device *dev = info->user_ptr[1]; 18279 struct wireless_dev *wdev = dev->ieee80211_ptr; 18280 const u8 *peer; 18281 u8 tsid, up; 18282 u16 admitted_time = 0; 18283 18284 if (!(rdev->wiphy.features & NL80211_FEATURE_SUPPORTS_WMM_ADMISSION)) 18285 return -EOPNOTSUPP; 18286 18287 if (!info->attrs[NL80211_ATTR_TSID] || !info->attrs[NL80211_ATTR_MAC] || 18288 !info->attrs[NL80211_ATTR_USER_PRIO]) 18289 return -EINVAL; 18290 18291 tsid = nla_get_u8(info->attrs[NL80211_ATTR_TSID]); 18292 up = nla_get_u8(info->attrs[NL80211_ATTR_USER_PRIO]); 18293 18294 /* WMM uses TIDs 0-7 even for TSPEC */ 18295 if (tsid >= IEEE80211_FIRST_TSPEC_TSID) { 18296 /* TODO: handle 802.11 TSPEC/admission control 18297 * need more attributes for that (e.g. BA session requirement); 18298 * change the WMM admission test above to allow both then 18299 */ 18300 return -EINVAL; 18301 } 18302 18303 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); 18304 18305 if (info->attrs[NL80211_ATTR_ADMITTED_TIME]) { 18306 admitted_time = 18307 nla_get_u16(info->attrs[NL80211_ATTR_ADMITTED_TIME]); 18308 if (!admitted_time) 18309 return -EINVAL; 18310 } 18311 18312 switch (wdev->iftype) { 18313 case NL80211_IFTYPE_STATION: 18314 case NL80211_IFTYPE_P2P_CLIENT: 18315 if (wdev->connected) 18316 break; 18317 return -ENOTCONN; 18318 default: 18319 return -EOPNOTSUPP; 18320 } 18321 18322 return rdev_add_tx_ts(rdev, dev, tsid, peer, up, admitted_time); 18323 } 18324 18325 static int nl80211_del_tx_ts(struct sk_buff *skb, struct genl_info *info) 18326 { 18327 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 18328 struct net_device *dev = info->user_ptr[1]; 18329 const u8 *peer; 18330 u8 tsid; 18331 18332 if (!info->attrs[NL80211_ATTR_TSID] || !info->attrs[NL80211_ATTR_MAC]) 18333 return -EINVAL; 18334 18335 tsid = nla_get_u8(info->attrs[NL80211_ATTR_TSID]); 18336 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); 18337 18338 return rdev_del_tx_ts(rdev, dev, tsid, peer); 18339 } 18340 18341 static int nl80211_tdls_channel_switch(struct sk_buff *skb, 18342 struct genl_info *info) 18343 { 18344 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 18345 struct net_device *dev = info->user_ptr[1]; 18346 struct wireless_dev *wdev = dev->ieee80211_ptr; 18347 struct cfg80211_chan_def chandef = {}; 18348 const u8 *addr; 18349 u8 oper_class; 18350 int err; 18351 18352 if (!rdev->ops->tdls_channel_switch || 18353 !(rdev->wiphy.features & NL80211_FEATURE_TDLS_CHANNEL_SWITCH)) 18354 return -EOPNOTSUPP; 18355 18356 switch (dev->ieee80211_ptr->iftype) { 18357 case NL80211_IFTYPE_STATION: 18358 case NL80211_IFTYPE_P2P_CLIENT: 18359 break; 18360 default: 18361 return -EOPNOTSUPP; 18362 } 18363 18364 if (!info->attrs[NL80211_ATTR_MAC] || 18365 !info->attrs[NL80211_ATTR_OPER_CLASS]) 18366 return -EINVAL; 18367 18368 err = nl80211_parse_chandef(rdev, info->extack, info->attrs, &chandef, 18369 false); 18370 if (err) 18371 return err; 18372 18373 /* 18374 * Don't allow wide channels on the 2.4Ghz band, as per IEEE802.11-2012 18375 * section 10.22.6.2.1. Disallow 5/10Mhz channels as well for now, the 18376 * specification is not defined for them. 18377 */ 18378 if (chandef.chan->band == NL80211_BAND_2GHZ && 18379 chandef.width != NL80211_CHAN_WIDTH_20_NOHT && 18380 chandef.width != NL80211_CHAN_WIDTH_20) 18381 return -EINVAL; 18382 18383 /* we will be active on the TDLS link */ 18384 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &chandef, 18385 wdev->iftype)) 18386 return -EINVAL; 18387 18388 /* don't allow switching to DFS channels */ 18389 if (cfg80211_chandef_dfs_required(wdev->wiphy, &chandef, wdev->iftype)) 18390 return -EINVAL; 18391 18392 addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 18393 oper_class = nla_get_u8(info->attrs[NL80211_ATTR_OPER_CLASS]); 18394 18395 return rdev_tdls_channel_switch(rdev, dev, addr, oper_class, &chandef); 18396 } 18397 18398 static int nl80211_tdls_cancel_channel_switch(struct sk_buff *skb, 18399 struct genl_info *info) 18400 { 18401 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 18402 struct net_device *dev = info->user_ptr[1]; 18403 const u8 *addr; 18404 18405 if (!rdev->ops->tdls_channel_switch || 18406 !rdev->ops->tdls_cancel_channel_switch || 18407 !(rdev->wiphy.features & NL80211_FEATURE_TDLS_CHANNEL_SWITCH)) 18408 return -EOPNOTSUPP; 18409 18410 switch (dev->ieee80211_ptr->iftype) { 18411 case NL80211_IFTYPE_STATION: 18412 case NL80211_IFTYPE_P2P_CLIENT: 18413 break; 18414 default: 18415 return -EOPNOTSUPP; 18416 } 18417 18418 if (!info->attrs[NL80211_ATTR_MAC]) 18419 return -EINVAL; 18420 18421 addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 18422 18423 rdev_tdls_cancel_channel_switch(rdev, dev, addr); 18424 18425 return 0; 18426 } 18427 18428 static int nl80211_set_multicast_to_unicast(struct sk_buff *skb, 18429 struct genl_info *info) 18430 { 18431 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 18432 struct net_device *dev = info->user_ptr[1]; 18433 struct wireless_dev *wdev = dev->ieee80211_ptr; 18434 const struct nlattr *nla; 18435 bool enabled; 18436 18437 if (!rdev->ops->set_multicast_to_unicast) 18438 return -EOPNOTSUPP; 18439 18440 if (wdev->iftype != NL80211_IFTYPE_AP && 18441 wdev->iftype != NL80211_IFTYPE_P2P_GO) 18442 return -EOPNOTSUPP; 18443 18444 nla = info->attrs[NL80211_ATTR_MULTICAST_TO_UNICAST_ENABLED]; 18445 enabled = nla_get_flag(nla); 18446 18447 return rdev_set_multicast_to_unicast(rdev, dev, enabled); 18448 } 18449 18450 static int nl80211_set_pmk(struct sk_buff *skb, struct genl_info *info) 18451 { 18452 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 18453 struct net_device *dev = info->user_ptr[1]; 18454 struct wireless_dev *wdev = dev->ieee80211_ptr; 18455 struct cfg80211_pmk_conf pmk_conf = {}; 18456 18457 if (wdev->iftype != NL80211_IFTYPE_STATION && 18458 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) 18459 return -EOPNOTSUPP; 18460 18461 if (!wiphy_ext_feature_isset(&rdev->wiphy, 18462 NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_1X)) 18463 return -EOPNOTSUPP; 18464 18465 if (!info->attrs[NL80211_ATTR_MAC] || !info->attrs[NL80211_ATTR_PMK]) 18466 return -EINVAL; 18467 18468 if (!wdev->connected) 18469 return -ENOTCONN; 18470 18471 pmk_conf.aa = nla_data(info->attrs[NL80211_ATTR_MAC]); 18472 if (memcmp(pmk_conf.aa, wdev->u.client.connected_addr, ETH_ALEN)) 18473 return -EINVAL; 18474 18475 pmk_conf.pmk = nla_data(info->attrs[NL80211_ATTR_PMK]); 18476 pmk_conf.pmk_len = nla_len(info->attrs[NL80211_ATTR_PMK]); 18477 if (pmk_conf.pmk_len != WLAN_PMK_LEN && 18478 pmk_conf.pmk_len != WLAN_PMK_LEN_SUITE_B_192) 18479 return -EINVAL; 18480 18481 if (info->attrs[NL80211_ATTR_PMKR0_NAME]) 18482 pmk_conf.pmk_r0_name = 18483 nla_data(info->attrs[NL80211_ATTR_PMKR0_NAME]); 18484 18485 return rdev_set_pmk(rdev, dev, &pmk_conf); 18486 } 18487 18488 static int nl80211_del_pmk(struct sk_buff *skb, struct genl_info *info) 18489 { 18490 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 18491 struct net_device *dev = info->user_ptr[1]; 18492 struct wireless_dev *wdev = dev->ieee80211_ptr; 18493 const u8 *aa; 18494 18495 if (wdev->iftype != NL80211_IFTYPE_STATION && 18496 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) 18497 return -EOPNOTSUPP; 18498 18499 if (!wiphy_ext_feature_isset(&rdev->wiphy, 18500 NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_1X)) 18501 return -EOPNOTSUPP; 18502 18503 if (!info->attrs[NL80211_ATTR_MAC]) 18504 return -EINVAL; 18505 18506 aa = nla_data(info->attrs[NL80211_ATTR_MAC]); 18507 return rdev_del_pmk(rdev, dev, aa); 18508 } 18509 18510 static int nl80211_external_auth(struct sk_buff *skb, struct genl_info *info) 18511 { 18512 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 18513 struct net_device *dev = info->user_ptr[1]; 18514 struct cfg80211_external_auth_params params; 18515 18516 if (!rdev->ops->external_auth) 18517 return -EOPNOTSUPP; 18518 18519 if (!info->attrs[NL80211_ATTR_SSID] && 18520 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 18521 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 18522 return -EINVAL; 18523 18524 if (!info->attrs[NL80211_ATTR_BSSID]) 18525 return -EINVAL; 18526 18527 if (!info->attrs[NL80211_ATTR_STATUS_CODE]) 18528 return -EINVAL; 18529 18530 memset(¶ms, 0, sizeof(params)); 18531 18532 if (info->attrs[NL80211_ATTR_SSID]) { 18533 params.ssid.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); 18534 if (params.ssid.ssid_len == 0) 18535 return -EINVAL; 18536 memcpy(params.ssid.ssid, 18537 nla_data(info->attrs[NL80211_ATTR_SSID]), 18538 params.ssid.ssid_len); 18539 } 18540 18541 memcpy(params.bssid, nla_data(info->attrs[NL80211_ATTR_BSSID]), 18542 ETH_ALEN); 18543 18544 params.status = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]); 18545 18546 if (info->attrs[NL80211_ATTR_PMKID]) 18547 params.pmkid = nla_data(info->attrs[NL80211_ATTR_PMKID]); 18548 18549 return rdev_external_auth(rdev, dev, ¶ms); 18550 } 18551 18552 static int nl80211_tx_control_port(struct sk_buff *skb, struct genl_info *info) 18553 { 18554 bool dont_wait_for_ack = info->attrs[NL80211_ATTR_DONT_WAIT_FOR_ACK]; 18555 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 18556 struct net_device *dev = info->user_ptr[1]; 18557 struct wireless_dev *wdev = dev->ieee80211_ptr; 18558 const u8 *buf; 18559 size_t len; 18560 u8 *dest; 18561 u16 proto; 18562 bool noencrypt; 18563 u64 cookie = 0; 18564 int link_id; 18565 int err; 18566 18567 if (!wiphy_ext_feature_isset(&rdev->wiphy, 18568 NL80211_EXT_FEATURE_CONTROL_PORT_OVER_NL80211)) 18569 return -EOPNOTSUPP; 18570 18571 if (!rdev->ops->tx_control_port) 18572 return -EOPNOTSUPP; 18573 18574 if (!info->attrs[NL80211_ATTR_FRAME] || 18575 !info->attrs[NL80211_ATTR_MAC] || 18576 !info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]) { 18577 GENL_SET_ERR_MSG(info, "Frame, MAC or ethertype missing"); 18578 return -EINVAL; 18579 } 18580 18581 switch (wdev->iftype) { 18582 case NL80211_IFTYPE_AP: 18583 case NL80211_IFTYPE_P2P_GO: 18584 case NL80211_IFTYPE_MESH_POINT: 18585 break; 18586 case NL80211_IFTYPE_ADHOC: 18587 if (wdev->u.ibss.current_bss) 18588 break; 18589 return -ENOTCONN; 18590 case NL80211_IFTYPE_STATION: 18591 case NL80211_IFTYPE_P2P_CLIENT: 18592 if (wdev->connected) 18593 break; 18594 return -ENOTCONN; 18595 default: 18596 return -EOPNOTSUPP; 18597 } 18598 18599 buf = nla_data(info->attrs[NL80211_ATTR_FRAME]); 18600 len = nla_len(info->attrs[NL80211_ATTR_FRAME]); 18601 dest = nla_data(info->attrs[NL80211_ATTR_MAC]); 18602 proto = nla_get_u16(info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]); 18603 noencrypt = 18604 nla_get_flag(info->attrs[NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT]); 18605 18606 link_id = nl80211_link_id_or_invalid(info->attrs); 18607 18608 cookie = dont_wait_for_ack ? 0 : cfg80211_assign_cookie(rdev); 18609 err = rdev_tx_control_port(rdev, dev, buf, len, 18610 dest, cpu_to_be16(proto), noencrypt, link_id, 18611 cookie); 18612 if (!err && cookie) 18613 nl_set_extack_cookie_u64(info->extack, cookie); 18614 return err; 18615 } 18616 18617 static int nl80211_get_ftm_responder_stats(struct sk_buff *skb, 18618 struct genl_info *info) 18619 { 18620 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 18621 struct net_device *dev = info->user_ptr[1]; 18622 struct wireless_dev *wdev = dev->ieee80211_ptr; 18623 struct cfg80211_ftm_responder_stats ftm_stats = {}; 18624 unsigned int link_id = nl80211_link_id(info->attrs); 18625 struct sk_buff *msg; 18626 void *hdr; 18627 struct nlattr *ftm_stats_attr; 18628 int err; 18629 18630 if (wdev->iftype != NL80211_IFTYPE_AP || 18631 !wdev->links[link_id].ap.beacon_interval) 18632 return -EOPNOTSUPP; 18633 18634 err = rdev_get_ftm_responder_stats(rdev, dev, &ftm_stats); 18635 if (err) 18636 return err; 18637 18638 if (!ftm_stats.filled) 18639 return -ENODATA; 18640 18641 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 18642 if (!msg) 18643 return -ENOMEM; 18644 18645 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 18646 NL80211_CMD_GET_FTM_RESPONDER_STATS); 18647 if (!hdr) 18648 goto nla_put_failure; 18649 18650 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) 18651 goto nla_put_failure; 18652 18653 ftm_stats_attr = nla_nest_start_noflag(msg, 18654 NL80211_ATTR_FTM_RESPONDER_STATS); 18655 if (!ftm_stats_attr) 18656 goto nla_put_failure; 18657 18658 #define SET_FTM(field, name, type) \ 18659 do { if ((ftm_stats.filled & BIT(NL80211_FTM_STATS_ ## name)) && \ 18660 nla_put_ ## type(msg, NL80211_FTM_STATS_ ## name, \ 18661 ftm_stats.field)) \ 18662 goto nla_put_failure; } while (0) 18663 #define SET_FTM_U64(field, name) \ 18664 do { if ((ftm_stats.filled & BIT(NL80211_FTM_STATS_ ## name)) && \ 18665 nla_put_u64_64bit(msg, NL80211_FTM_STATS_ ## name, \ 18666 ftm_stats.field, NL80211_FTM_STATS_PAD)) \ 18667 goto nla_put_failure; } while (0) 18668 18669 SET_FTM(success_num, SUCCESS_NUM, u32); 18670 SET_FTM(partial_num, PARTIAL_NUM, u32); 18671 SET_FTM(failed_num, FAILED_NUM, u32); 18672 SET_FTM(asap_num, ASAP_NUM, u32); 18673 SET_FTM(non_asap_num, NON_ASAP_NUM, u32); 18674 SET_FTM_U64(total_duration_ms, TOTAL_DURATION_MSEC); 18675 SET_FTM(unknown_triggers_num, UNKNOWN_TRIGGERS_NUM, u32); 18676 SET_FTM(reschedule_requests_num, RESCHEDULE_REQUESTS_NUM, u32); 18677 SET_FTM(out_of_window_triggers_num, OUT_OF_WINDOW_TRIGGERS_NUM, u32); 18678 #undef SET_FTM 18679 18680 nla_nest_end(msg, ftm_stats_attr); 18681 18682 genlmsg_end(msg, hdr); 18683 return genlmsg_reply(msg, info); 18684 18685 nla_put_failure: 18686 nlmsg_free(msg); 18687 return -ENOBUFS; 18688 } 18689 18690 static int nl80211_update_owe_info(struct sk_buff *skb, struct genl_info *info) 18691 { 18692 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 18693 struct cfg80211_update_owe_info owe_info; 18694 struct net_device *dev = info->user_ptr[1]; 18695 18696 if (!rdev->ops->update_owe_info) 18697 return -EOPNOTSUPP; 18698 18699 if (!info->attrs[NL80211_ATTR_STATUS_CODE] || 18700 !info->attrs[NL80211_ATTR_MAC]) 18701 return -EINVAL; 18702 18703 memset(&owe_info, 0, sizeof(owe_info)); 18704 owe_info.status = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]); 18705 nla_memcpy(owe_info.peer, info->attrs[NL80211_ATTR_MAC], ETH_ALEN); 18706 18707 if (info->attrs[NL80211_ATTR_IE]) { 18708 owe_info.ie = nla_data(info->attrs[NL80211_ATTR_IE]); 18709 owe_info.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 18710 } 18711 18712 return rdev_update_owe_info(rdev, dev, &owe_info); 18713 } 18714 18715 static int nl80211_probe_mesh_link(struct sk_buff *skb, struct genl_info *info) 18716 { 18717 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 18718 struct net_device *dev = info->user_ptr[1]; 18719 struct wireless_dev *wdev = dev->ieee80211_ptr; 18720 struct station_info sinfo = {}; 18721 const u8 *buf; 18722 size_t len; 18723 u8 *dest; 18724 int err; 18725 18726 if (!rdev->ops->probe_mesh_link || !rdev->ops->get_station) 18727 return -EOPNOTSUPP; 18728 18729 if (!info->attrs[NL80211_ATTR_MAC] || 18730 !info->attrs[NL80211_ATTR_FRAME]) { 18731 GENL_SET_ERR_MSG(info, "Frame or MAC missing"); 18732 return -EINVAL; 18733 } 18734 18735 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) 18736 return -EOPNOTSUPP; 18737 18738 dest = nla_data(info->attrs[NL80211_ATTR_MAC]); 18739 buf = nla_data(info->attrs[NL80211_ATTR_FRAME]); 18740 len = nla_len(info->attrs[NL80211_ATTR_FRAME]); 18741 18742 if (len < sizeof(struct ethhdr)) 18743 return -EINVAL; 18744 18745 if (!ether_addr_equal(buf, dest) || is_multicast_ether_addr(buf) || 18746 !ether_addr_equal(buf + ETH_ALEN, dev->dev_addr)) 18747 return -EINVAL; 18748 18749 err = rdev_get_station(rdev, wdev, dest, &sinfo); 18750 if (err) 18751 return err; 18752 18753 cfg80211_sinfo_release_content(&sinfo); 18754 18755 return rdev_probe_mesh_link(rdev, dev, dest, buf, len); 18756 } 18757 18758 static int parse_tid_conf(struct cfg80211_registered_device *rdev, 18759 struct nlattr *attrs[], struct net_device *dev, 18760 struct cfg80211_tid_cfg *tid_conf, 18761 struct genl_info *info, const u8 *peer, 18762 unsigned int link_id) 18763 { 18764 struct netlink_ext_ack *extack = info->extack; 18765 u64 mask; 18766 int err; 18767 18768 if (!attrs[NL80211_TID_CONFIG_ATTR_TIDS]) 18769 return -EINVAL; 18770 18771 tid_conf->config_override = 18772 nla_get_flag(attrs[NL80211_TID_CONFIG_ATTR_OVERRIDE]); 18773 tid_conf->tids = nla_get_u16(attrs[NL80211_TID_CONFIG_ATTR_TIDS]); 18774 18775 if (tid_conf->config_override) { 18776 if (rdev->ops->reset_tid_config) { 18777 err = rdev_reset_tid_config(rdev, dev, peer, 18778 tid_conf->tids); 18779 if (err) 18780 return err; 18781 } else { 18782 return -EINVAL; 18783 } 18784 } 18785 18786 if (attrs[NL80211_TID_CONFIG_ATTR_NOACK]) { 18787 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_NOACK); 18788 tid_conf->noack = 18789 nla_get_u8(attrs[NL80211_TID_CONFIG_ATTR_NOACK]); 18790 } 18791 18792 if (attrs[NL80211_TID_CONFIG_ATTR_RETRY_SHORT]) { 18793 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_RETRY_SHORT); 18794 tid_conf->retry_short = 18795 nla_get_u8(attrs[NL80211_TID_CONFIG_ATTR_RETRY_SHORT]); 18796 18797 if (tid_conf->retry_short > rdev->wiphy.max_data_retry_count) 18798 return -EINVAL; 18799 } 18800 18801 if (attrs[NL80211_TID_CONFIG_ATTR_RETRY_LONG]) { 18802 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_RETRY_LONG); 18803 tid_conf->retry_long = 18804 nla_get_u8(attrs[NL80211_TID_CONFIG_ATTR_RETRY_LONG]); 18805 18806 if (tid_conf->retry_long > rdev->wiphy.max_data_retry_count) 18807 return -EINVAL; 18808 } 18809 18810 if (attrs[NL80211_TID_CONFIG_ATTR_AMPDU_CTRL]) { 18811 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_AMPDU_CTRL); 18812 tid_conf->ampdu = 18813 nla_get_u8(attrs[NL80211_TID_CONFIG_ATTR_AMPDU_CTRL]); 18814 } 18815 18816 if (attrs[NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL]) { 18817 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL); 18818 tid_conf->rtscts = 18819 nla_get_u8(attrs[NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL]); 18820 } 18821 18822 if (attrs[NL80211_TID_CONFIG_ATTR_AMSDU_CTRL]) { 18823 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_AMSDU_CTRL); 18824 tid_conf->amsdu = 18825 nla_get_u8(attrs[NL80211_TID_CONFIG_ATTR_AMSDU_CTRL]); 18826 } 18827 18828 if (attrs[NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE]) { 18829 u32 idx = NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE, attr; 18830 18831 tid_conf->txrate_type = nla_get_u8(attrs[idx]); 18832 18833 if (tid_conf->txrate_type != NL80211_TX_RATE_AUTOMATIC) { 18834 attr = NL80211_TID_CONFIG_ATTR_TX_RATE; 18835 err = nl80211_parse_tx_bitrate_mask(info, attrs, attr, 18836 &tid_conf->txrate_mask, dev, 18837 true, link_id); 18838 if (err) 18839 return err; 18840 18841 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_TX_RATE); 18842 } 18843 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE); 18844 } 18845 18846 if (peer) 18847 mask = rdev->wiphy.tid_config_support.peer; 18848 else 18849 mask = rdev->wiphy.tid_config_support.vif; 18850 18851 if (tid_conf->mask & ~mask) { 18852 NL_SET_ERR_MSG(extack, "unsupported TID configuration"); 18853 return -EOPNOTSUPP; 18854 } 18855 18856 return 0; 18857 } 18858 18859 static int nl80211_set_tid_config(struct sk_buff *skb, 18860 struct genl_info *info) 18861 { 18862 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 18863 struct nlattr *attrs[NL80211_TID_CONFIG_ATTR_MAX + 1]; 18864 unsigned int link_id = nl80211_link_id(info->attrs); 18865 struct net_device *dev = info->user_ptr[1]; 18866 struct cfg80211_tid_config *tid_config; 18867 struct nlattr *tid; 18868 int conf_idx = 0, rem_conf; 18869 int ret = -EINVAL; 18870 u32 num_conf = 0; 18871 18872 if (!info->attrs[NL80211_ATTR_TID_CONFIG]) 18873 return -EINVAL; 18874 18875 if (!rdev->ops->set_tid_config) 18876 return -EOPNOTSUPP; 18877 18878 nla_for_each_nested(tid, info->attrs[NL80211_ATTR_TID_CONFIG], 18879 rem_conf) 18880 num_conf++; 18881 18882 tid_config = kzalloc_flex(*tid_config, tid_conf, num_conf); 18883 if (!tid_config) 18884 return -ENOMEM; 18885 18886 tid_config->n_tid_conf = num_conf; 18887 18888 if (info->attrs[NL80211_ATTR_MAC]) 18889 tid_config->peer = nla_data(info->attrs[NL80211_ATTR_MAC]); 18890 18891 nla_for_each_nested(tid, info->attrs[NL80211_ATTR_TID_CONFIG], 18892 rem_conf) { 18893 ret = nla_parse_nested(attrs, NL80211_TID_CONFIG_ATTR_MAX, 18894 tid, NULL, NULL); 18895 18896 if (ret) 18897 goto bad_tid_conf; 18898 18899 ret = parse_tid_conf(rdev, attrs, dev, 18900 &tid_config->tid_conf[conf_idx], 18901 info, tid_config->peer, link_id); 18902 if (ret) 18903 goto bad_tid_conf; 18904 18905 conf_idx++; 18906 } 18907 18908 ret = rdev_set_tid_config(rdev, dev, tid_config); 18909 18910 bad_tid_conf: 18911 kfree(tid_config); 18912 return ret; 18913 } 18914 18915 static int nl80211_color_change(struct sk_buff *skb, struct genl_info *info) 18916 { 18917 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 18918 struct cfg80211_color_change_settings params = {}; 18919 struct net_device *dev = info->user_ptr[1]; 18920 struct wireless_dev *wdev = dev->ieee80211_ptr; 18921 struct nlattr **tb; 18922 u16 offset; 18923 int err; 18924 18925 if (!rdev->ops->color_change) 18926 return -EOPNOTSUPP; 18927 18928 if (!wiphy_ext_feature_isset(&rdev->wiphy, 18929 NL80211_EXT_FEATURE_BSS_COLOR)) 18930 return -EOPNOTSUPP; 18931 18932 if (wdev->iftype != NL80211_IFTYPE_AP) 18933 return -EOPNOTSUPP; 18934 18935 if (!info->attrs[NL80211_ATTR_COLOR_CHANGE_COUNT] || 18936 !info->attrs[NL80211_ATTR_COLOR_CHANGE_COLOR] || 18937 !info->attrs[NL80211_ATTR_COLOR_CHANGE_ELEMS]) 18938 return -EINVAL; 18939 18940 params.count = nla_get_u8(info->attrs[NL80211_ATTR_COLOR_CHANGE_COUNT]); 18941 params.color = nla_get_u8(info->attrs[NL80211_ATTR_COLOR_CHANGE_COLOR]); 18942 18943 params.link_id = nl80211_link_id(info->attrs); 18944 if (!wdev->links[params.link_id].ap.beacon_interval) 18945 return -EINVAL; 18946 18947 tb = kzalloc_objs(*tb, NL80211_ATTR_MAX + 1); 18948 if (!tb) 18949 return -ENOMEM; 18950 18951 err = nl80211_parse_beacon(rdev, info->attrs, ¶ms.beacon_next, 18952 wdev->links[params.link_id].ap.chandef.chan, 18953 info->extack); 18954 if (err) 18955 goto out; 18956 18957 err = nla_parse_nested(tb, NL80211_ATTR_MAX, 18958 info->attrs[NL80211_ATTR_COLOR_CHANGE_ELEMS], 18959 nl80211_policy, info->extack); 18960 if (err) 18961 goto out; 18962 18963 err = nl80211_parse_beacon(rdev, tb, ¶ms.beacon_color_change, 18964 wdev->links[params.link_id].ap.chandef.chan, 18965 info->extack); 18966 if (err) 18967 goto out; 18968 18969 if (!tb[NL80211_ATTR_CNTDWN_OFFS_BEACON]) { 18970 err = -EINVAL; 18971 goto out; 18972 } 18973 18974 if (nla_len(tb[NL80211_ATTR_CNTDWN_OFFS_BEACON]) != sizeof(u16)) { 18975 err = -EINVAL; 18976 goto out; 18977 } 18978 18979 offset = nla_get_u16(tb[NL80211_ATTR_CNTDWN_OFFS_BEACON]); 18980 if (offset >= params.beacon_color_change.tail_len) { 18981 err = -EINVAL; 18982 goto out; 18983 } 18984 18985 if (params.beacon_color_change.tail[offset] != params.count) { 18986 err = -EINVAL; 18987 goto out; 18988 } 18989 18990 params.counter_offset_beacon = offset; 18991 18992 if (tb[NL80211_ATTR_CNTDWN_OFFS_PRESP]) { 18993 if (nla_len(tb[NL80211_ATTR_CNTDWN_OFFS_PRESP]) != 18994 sizeof(u16)) { 18995 err = -EINVAL; 18996 goto out; 18997 } 18998 18999 offset = nla_get_u16(tb[NL80211_ATTR_CNTDWN_OFFS_PRESP]); 19000 if (offset >= params.beacon_color_change.probe_resp_len) { 19001 err = -EINVAL; 19002 goto out; 19003 } 19004 19005 if (params.beacon_color_change.probe_resp[offset] != 19006 params.count) { 19007 err = -EINVAL; 19008 goto out; 19009 } 19010 19011 params.counter_offset_presp = offset; 19012 } 19013 19014 if (info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP]) { 19015 err = nl80211_parse_unsol_bcast_probe_resp( 19016 rdev, info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP], 19017 ¶ms.unsol_bcast_probe_resp); 19018 if (err) 19019 goto out; 19020 } 19021 19022 err = rdev_color_change(rdev, dev, ¶ms); 19023 19024 out: 19025 kfree(params.beacon_next.mbssid_ies); 19026 kfree(params.beacon_color_change.mbssid_ies); 19027 kfree(params.beacon_next.rnr_ies); 19028 kfree(params.beacon_color_change.rnr_ies); 19029 kfree(tb); 19030 return err; 19031 } 19032 19033 static int nl80211_set_fils_aad(struct sk_buff *skb, 19034 struct genl_info *info) 19035 { 19036 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 19037 struct net_device *dev = info->user_ptr[1]; 19038 struct cfg80211_fils_aad fils_aad = {}; 19039 u8 *nonces; 19040 19041 if (!info->attrs[NL80211_ATTR_MAC] || 19042 !info->attrs[NL80211_ATTR_FILS_KEK] || 19043 !info->attrs[NL80211_ATTR_FILS_NONCES]) 19044 return -EINVAL; 19045 19046 fils_aad.macaddr = nla_data(info->attrs[NL80211_ATTR_MAC]); 19047 fils_aad.kek_len = nla_len(info->attrs[NL80211_ATTR_FILS_KEK]); 19048 fils_aad.kek = nla_data(info->attrs[NL80211_ATTR_FILS_KEK]); 19049 nonces = nla_data(info->attrs[NL80211_ATTR_FILS_NONCES]); 19050 fils_aad.snonce = nonces; 19051 fils_aad.anonce = nonces + FILS_NONCE_LEN; 19052 19053 return rdev_set_fils_aad(rdev, dev, &fils_aad); 19054 } 19055 19056 static int nl80211_add_link(struct sk_buff *skb, struct genl_info *info) 19057 { 19058 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 19059 unsigned int link_id = nl80211_link_id(info->attrs); 19060 struct net_device *dev = info->user_ptr[1]; 19061 struct wireless_dev *wdev = dev->ieee80211_ptr; 19062 int ret; 19063 19064 if (!(wdev->wiphy->flags & WIPHY_FLAG_SUPPORTS_MLO)) 19065 return -EINVAL; 19066 19067 switch (wdev->iftype) { 19068 case NL80211_IFTYPE_AP: 19069 break; 19070 default: 19071 return -EINVAL; 19072 } 19073 19074 if (!info->attrs[NL80211_ATTR_MAC] || 19075 !is_valid_ether_addr(nla_data(info->attrs[NL80211_ATTR_MAC]))) 19076 return -EINVAL; 19077 19078 wdev->valid_links |= BIT(link_id); 19079 ether_addr_copy(wdev->links[link_id].addr, 19080 nla_data(info->attrs[NL80211_ATTR_MAC])); 19081 19082 ret = rdev_add_intf_link(rdev, wdev, link_id); 19083 if (ret) { 19084 wdev->valid_links &= ~BIT(link_id); 19085 eth_zero_addr(wdev->links[link_id].addr); 19086 } 19087 19088 return ret; 19089 } 19090 19091 static int nl80211_remove_link(struct sk_buff *skb, struct genl_info *info) 19092 { 19093 unsigned int link_id = nl80211_link_id(info->attrs); 19094 struct net_device *dev = info->user_ptr[1]; 19095 struct wireless_dev *wdev = dev->ieee80211_ptr; 19096 19097 /* cannot remove if there's no link */ 19098 if (!info->attrs[NL80211_ATTR_MLO_LINK_ID]) 19099 return -EINVAL; 19100 19101 switch (wdev->iftype) { 19102 case NL80211_IFTYPE_AP: 19103 break; 19104 default: 19105 return -EINVAL; 19106 } 19107 19108 cfg80211_remove_link(wdev, link_id); 19109 19110 return 0; 19111 } 19112 19113 static int 19114 nl80211_add_mod_link_station(struct sk_buff *skb, struct genl_info *info, 19115 bool add) 19116 { 19117 struct link_station_parameters params = {}; 19118 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 19119 struct net_device *dev = info->user_ptr[1]; 19120 int err; 19121 19122 if ((add && !rdev->ops->add_link_station) || 19123 (!add && !rdev->ops->mod_link_station)) 19124 return -EOPNOTSUPP; 19125 19126 if (add && !info->attrs[NL80211_ATTR_MAC]) 19127 return -EINVAL; 19128 19129 if (!info->attrs[NL80211_ATTR_MLD_ADDR]) 19130 return -EINVAL; 19131 19132 if (add && !info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) 19133 return -EINVAL; 19134 19135 params.mld_mac = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]); 19136 19137 if (info->attrs[NL80211_ATTR_MAC]) { 19138 params.link_mac = nla_data(info->attrs[NL80211_ATTR_MAC]); 19139 if (!is_valid_ether_addr(params.link_mac)) 19140 return -EINVAL; 19141 } 19142 19143 if (!info->attrs[NL80211_ATTR_MLO_LINK_ID]) 19144 return -EINVAL; 19145 19146 params.link_id = nla_get_u8(info->attrs[NL80211_ATTR_MLO_LINK_ID]); 19147 19148 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) { 19149 params.supported_rates = 19150 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); 19151 params.supported_rates_len = 19152 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); 19153 } 19154 19155 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) 19156 params.ht_capa = 19157 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]); 19158 19159 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) 19160 params.vht_capa = 19161 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]); 19162 19163 if (info->attrs[NL80211_ATTR_HE_CAPABILITY]) { 19164 params.he_capa = 19165 nla_data(info->attrs[NL80211_ATTR_HE_CAPABILITY]); 19166 params.he_capa_len = 19167 nla_len(info->attrs[NL80211_ATTR_HE_CAPABILITY]); 19168 19169 if (info->attrs[NL80211_ATTR_EHT_CAPABILITY]) { 19170 params.eht_capa = 19171 nla_data(info->attrs[NL80211_ATTR_EHT_CAPABILITY]); 19172 params.eht_capa_len = 19173 nla_len(info->attrs[NL80211_ATTR_EHT_CAPABILITY]); 19174 19175 if (!ieee80211_eht_capa_size_ok((const u8 *)params.he_capa, 19176 (const u8 *)params.eht_capa, 19177 params.eht_capa_len, 19178 false)) 19179 return -EINVAL; 19180 } 19181 } 19182 19183 if (info->attrs[NL80211_ATTR_UHR_CAPABILITY]) { 19184 if (!params.eht_capa) 19185 return -EINVAL; 19186 19187 params.uhr_capa = 19188 nla_data(info->attrs[NL80211_ATTR_UHR_CAPABILITY]); 19189 params.uhr_capa_len = 19190 nla_len(info->attrs[NL80211_ATTR_UHR_CAPABILITY]); 19191 } 19192 19193 if (info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]) 19194 params.he_6ghz_capa = 19195 nla_data(info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]); 19196 19197 if (info->attrs[NL80211_ATTR_OPMODE_NOTIF]) { 19198 params.opmode_notif_used = true; 19199 params.opmode_notif = 19200 nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]); 19201 } 19202 19203 err = nl80211_parse_sta_txpower_setting(info, ¶ms.txpwr, 19204 ¶ms.txpwr_set); 19205 if (err) 19206 return err; 19207 19208 if (add) 19209 return rdev_add_link_station(rdev, dev, ¶ms); 19210 19211 return rdev_mod_link_station(rdev, dev, ¶ms); 19212 } 19213 19214 static int 19215 nl80211_add_link_station(struct sk_buff *skb, struct genl_info *info) 19216 { 19217 return nl80211_add_mod_link_station(skb, info, true); 19218 } 19219 19220 static int 19221 nl80211_modify_link_station(struct sk_buff *skb, struct genl_info *info) 19222 { 19223 return nl80211_add_mod_link_station(skb, info, false); 19224 } 19225 19226 static int 19227 nl80211_remove_link_station(struct sk_buff *skb, struct genl_info *info) 19228 { 19229 struct link_station_del_parameters params = {}; 19230 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 19231 struct net_device *dev = info->user_ptr[1]; 19232 19233 if (!rdev->ops->del_link_station) 19234 return -EOPNOTSUPP; 19235 19236 if (!info->attrs[NL80211_ATTR_MLD_ADDR] || 19237 !info->attrs[NL80211_ATTR_MLO_LINK_ID]) 19238 return -EINVAL; 19239 19240 params.mld_mac = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]); 19241 params.link_id = nla_get_u8(info->attrs[NL80211_ATTR_MLO_LINK_ID]); 19242 19243 return rdev_del_link_station(rdev, dev, ¶ms); 19244 } 19245 19246 static int nl80211_set_hw_timestamp(struct sk_buff *skb, 19247 struct genl_info *info) 19248 { 19249 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 19250 struct net_device *dev = info->user_ptr[1]; 19251 struct cfg80211_set_hw_timestamp hwts = {}; 19252 19253 if (!rdev->wiphy.hw_timestamp_max_peers) 19254 return -EOPNOTSUPP; 19255 19256 if (!info->attrs[NL80211_ATTR_MAC] && 19257 rdev->wiphy.hw_timestamp_max_peers != CFG80211_HW_TIMESTAMP_ALL_PEERS) 19258 return -EOPNOTSUPP; 19259 19260 if (info->attrs[NL80211_ATTR_MAC]) 19261 hwts.macaddr = nla_data(info->attrs[NL80211_ATTR_MAC]); 19262 19263 hwts.enable = 19264 nla_get_flag(info->attrs[NL80211_ATTR_HW_TIMESTAMP_ENABLED]); 19265 19266 return rdev_set_hw_timestamp(rdev, dev, &hwts); 19267 } 19268 19269 static int 19270 nl80211_set_ttlm(struct sk_buff *skb, struct genl_info *info) 19271 { 19272 struct cfg80211_ttlm_params params = {}; 19273 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 19274 struct net_device *dev = info->user_ptr[1]; 19275 struct wireless_dev *wdev = dev->ieee80211_ptr; 19276 19277 if (wdev->iftype != NL80211_IFTYPE_STATION && 19278 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) 19279 return -EOPNOTSUPP; 19280 19281 if (!wdev->connected) 19282 return -ENOLINK; 19283 19284 if (!info->attrs[NL80211_ATTR_MLO_TTLM_DLINK] || 19285 !info->attrs[NL80211_ATTR_MLO_TTLM_ULINK]) 19286 return -EINVAL; 19287 19288 nla_memcpy(params.dlink, 19289 info->attrs[NL80211_ATTR_MLO_TTLM_DLINK], 19290 sizeof(params.dlink)); 19291 nla_memcpy(params.ulink, 19292 info->attrs[NL80211_ATTR_MLO_TTLM_ULINK], 19293 sizeof(params.ulink)); 19294 19295 return rdev_set_ttlm(rdev, dev, ¶ms); 19296 } 19297 19298 static int nl80211_assoc_ml_reconf(struct sk_buff *skb, struct genl_info *info) 19299 { 19300 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 19301 struct net_device *dev = info->user_ptr[1]; 19302 struct wireless_dev *wdev = dev->ieee80211_ptr; 19303 struct cfg80211_ml_reconf_req req = {}; 19304 unsigned int link_id; 19305 u16 add_links; 19306 int err; 19307 19308 if (!wdev->valid_links) 19309 return -EINVAL; 19310 19311 if (dev->ieee80211_ptr->conn_owner_nlportid && 19312 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) 19313 return -EPERM; 19314 19315 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 19316 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 19317 return -EOPNOTSUPP; 19318 19319 add_links = 0; 19320 if (info->attrs[NL80211_ATTR_MLO_LINKS]) { 19321 err = nl80211_process_links(rdev, req.add_links, 19322 /* mark as MLO, but not assoc */ 19323 IEEE80211_MLD_MAX_NUM_LINKS, 19324 NULL, 0, info); 19325 if (err) 19326 return err; 19327 19328 for (link_id = 0; link_id < IEEE80211_MLD_MAX_NUM_LINKS; 19329 link_id++) { 19330 if (!req.add_links[link_id].bss) 19331 continue; 19332 add_links |= BIT(link_id); 19333 } 19334 } 19335 19336 if (info->attrs[NL80211_ATTR_MLO_RECONF_REM_LINKS]) 19337 req.rem_links = 19338 nla_get_u16(info->attrs[NL80211_ATTR_MLO_RECONF_REM_LINKS]); 19339 19340 /* Validate that existing links are not added, removed links are valid 19341 * and don't allow adding and removing the same links 19342 */ 19343 if ((add_links & req.rem_links) || !(add_links | req.rem_links) || 19344 (wdev->valid_links & add_links) || 19345 ((wdev->valid_links & req.rem_links) != req.rem_links)) { 19346 err = -EINVAL; 19347 goto out; 19348 } 19349 19350 if (info->attrs[NL80211_ATTR_EXT_MLD_CAPA_AND_OPS]) 19351 req.ext_mld_capa_ops = 19352 nla_get_u16(info->attrs[NL80211_ATTR_EXT_MLD_CAPA_AND_OPS]); 19353 19354 err = cfg80211_assoc_ml_reconf(rdev, dev, &req); 19355 19356 out: 19357 for (link_id = 0; link_id < ARRAY_SIZE(req.add_links); link_id++) 19358 cfg80211_put_bss(&rdev->wiphy, req.add_links[link_id].bss); 19359 19360 return err; 19361 } 19362 19363 static int 19364 nl80211_epcs_cfg(struct sk_buff *skb, struct genl_info *info) 19365 { 19366 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 19367 struct net_device *dev = info->user_ptr[1]; 19368 struct wireless_dev *wdev = dev->ieee80211_ptr; 19369 bool val; 19370 19371 if (wdev->iftype != NL80211_IFTYPE_STATION && 19372 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) 19373 return -EOPNOTSUPP; 19374 19375 if (!wdev->connected) 19376 return -ENOLINK; 19377 19378 val = nla_get_flag(info->attrs[NL80211_ATTR_EPCS]); 19379 19380 return rdev_set_epcs(rdev, dev, val); 19381 } 19382 19383 #define NL80211_FLAG_NEED_WIPHY 0x01 19384 #define NL80211_FLAG_NEED_NETDEV 0x02 19385 #define NL80211_FLAG_NEED_RTNL 0x04 19386 #define NL80211_FLAG_CHECK_NETDEV_UP 0x08 19387 #define NL80211_FLAG_NEED_NETDEV_UP (NL80211_FLAG_NEED_NETDEV |\ 19388 NL80211_FLAG_CHECK_NETDEV_UP) 19389 #define NL80211_FLAG_NEED_WDEV 0x10 19390 /* If a netdev is associated, it must be UP, P2P must be started */ 19391 #define NL80211_FLAG_NEED_WDEV_UP (NL80211_FLAG_NEED_WDEV |\ 19392 NL80211_FLAG_CHECK_NETDEV_UP) 19393 #define NL80211_FLAG_CLEAR_SKB 0x20 19394 #define NL80211_FLAG_NO_WIPHY_MTX 0x40 19395 #define NL80211_FLAG_MLO_VALID_LINK_ID 0x80 19396 #define NL80211_FLAG_MLO_UNSUPPORTED 0x100 19397 19398 #define INTERNAL_FLAG_SELECTORS(__sel) \ 19399 SELECTOR(__sel, NONE, 0) /* must be first */ \ 19400 SELECTOR(__sel, WIPHY, \ 19401 NL80211_FLAG_NEED_WIPHY) \ 19402 SELECTOR(__sel, WDEV, \ 19403 NL80211_FLAG_NEED_WDEV) \ 19404 SELECTOR(__sel, NETDEV, \ 19405 NL80211_FLAG_NEED_NETDEV) \ 19406 SELECTOR(__sel, NETDEV_LINK, \ 19407 NL80211_FLAG_NEED_NETDEV | \ 19408 NL80211_FLAG_MLO_VALID_LINK_ID) \ 19409 SELECTOR(__sel, NETDEV_NO_MLO, \ 19410 NL80211_FLAG_NEED_NETDEV | \ 19411 NL80211_FLAG_MLO_UNSUPPORTED) \ 19412 SELECTOR(__sel, WIPHY_RTNL, \ 19413 NL80211_FLAG_NEED_WIPHY | \ 19414 NL80211_FLAG_NEED_RTNL) \ 19415 SELECTOR(__sel, WIPHY_RTNL_NOMTX, \ 19416 NL80211_FLAG_NEED_WIPHY | \ 19417 NL80211_FLAG_NEED_RTNL | \ 19418 NL80211_FLAG_NO_WIPHY_MTX) \ 19419 SELECTOR(__sel, WDEV_RTNL, \ 19420 NL80211_FLAG_NEED_WDEV | \ 19421 NL80211_FLAG_NEED_RTNL) \ 19422 SELECTOR(__sel, NETDEV_RTNL, \ 19423 NL80211_FLAG_NEED_NETDEV | \ 19424 NL80211_FLAG_NEED_RTNL) \ 19425 SELECTOR(__sel, NETDEV_UP, \ 19426 NL80211_FLAG_NEED_NETDEV_UP) \ 19427 SELECTOR(__sel, NETDEV_UP_LINK, \ 19428 NL80211_FLAG_NEED_NETDEV_UP | \ 19429 NL80211_FLAG_MLO_VALID_LINK_ID) \ 19430 SELECTOR(__sel, NETDEV_UP_NO_MLO, \ 19431 NL80211_FLAG_NEED_NETDEV_UP | \ 19432 NL80211_FLAG_MLO_UNSUPPORTED) \ 19433 SELECTOR(__sel, NETDEV_UP_NO_MLO_CLEAR, \ 19434 NL80211_FLAG_NEED_NETDEV_UP | \ 19435 NL80211_FLAG_CLEAR_SKB | \ 19436 NL80211_FLAG_MLO_UNSUPPORTED) \ 19437 SELECTOR(__sel, NETDEV_UP_NOTMX, \ 19438 NL80211_FLAG_NEED_NETDEV_UP | \ 19439 NL80211_FLAG_NO_WIPHY_MTX) \ 19440 SELECTOR(__sel, NETDEV_UP_NOTMX_MLO, \ 19441 NL80211_FLAG_NEED_NETDEV_UP | \ 19442 NL80211_FLAG_NO_WIPHY_MTX | \ 19443 NL80211_FLAG_MLO_VALID_LINK_ID) \ 19444 SELECTOR(__sel, NETDEV_UP_CLEAR, \ 19445 NL80211_FLAG_NEED_NETDEV_UP | \ 19446 NL80211_FLAG_CLEAR_SKB) \ 19447 SELECTOR(__sel, WDEV_UP, \ 19448 NL80211_FLAG_NEED_WDEV_UP) \ 19449 SELECTOR(__sel, WDEV_UP_CLEAR, \ 19450 NL80211_FLAG_NEED_WDEV_UP | \ 19451 NL80211_FLAG_CLEAR_SKB) \ 19452 SELECTOR(__sel, WDEV_UP_LINK, \ 19453 NL80211_FLAG_NEED_WDEV_UP | \ 19454 NL80211_FLAG_MLO_VALID_LINK_ID) \ 19455 SELECTOR(__sel, WDEV_UP_RTNL, \ 19456 NL80211_FLAG_NEED_WDEV_UP | \ 19457 NL80211_FLAG_NEED_RTNL) \ 19458 SELECTOR(__sel, WIPHY_CLEAR, \ 19459 NL80211_FLAG_NEED_WIPHY | \ 19460 NL80211_FLAG_CLEAR_SKB) \ 19461 SELECTOR(__sel, WDEV_UP_RTNL_NOMTX, \ 19462 NL80211_FLAG_NEED_WDEV_UP | \ 19463 NL80211_FLAG_NO_WIPHY_MTX | \ 19464 NL80211_FLAG_NEED_RTNL) 19465 19466 enum nl80211_internal_flags_selector { 19467 #define SELECTOR(_, name, value) NL80211_IFL_SEL_##name, 19468 INTERNAL_FLAG_SELECTORS(_) 19469 #undef SELECTOR 19470 }; 19471 19472 static u32 nl80211_internal_flags[] = { 19473 #define SELECTOR(_, name, value) [NL80211_IFL_SEL_##name] = value, 19474 INTERNAL_FLAG_SELECTORS(_) 19475 #undef SELECTOR 19476 }; 19477 19478 static int nl80211_pre_doit(const struct genl_split_ops *ops, 19479 struct sk_buff *skb, 19480 struct genl_info *info) 19481 { 19482 struct cfg80211_registered_device *rdev = NULL; 19483 struct wireless_dev *wdev = NULL; 19484 struct net_device *dev = NULL; 19485 u32 internal_flags; 19486 int err; 19487 19488 if (WARN_ON(ops->internal_flags >= ARRAY_SIZE(nl80211_internal_flags))) 19489 return -EINVAL; 19490 19491 internal_flags = nl80211_internal_flags[ops->internal_flags]; 19492 19493 rtnl_lock(); 19494 if (internal_flags & NL80211_FLAG_NEED_WIPHY) { 19495 rdev = cfg80211_get_dev_from_info(genl_info_net(info), info); 19496 if (IS_ERR(rdev)) { 19497 err = PTR_ERR(rdev); 19498 goto out_unlock; 19499 } 19500 info->user_ptr[0] = rdev; 19501 } else if (internal_flags & NL80211_FLAG_NEED_NETDEV || 19502 internal_flags & NL80211_FLAG_NEED_WDEV) { 19503 wdev = __cfg80211_wdev_from_attrs(NULL, genl_info_net(info), 19504 info->attrs); 19505 if (IS_ERR(wdev)) { 19506 err = PTR_ERR(wdev); 19507 goto out_unlock; 19508 } 19509 19510 dev = wdev->netdev; 19511 dev_hold(dev); 19512 rdev = wiphy_to_rdev(wdev->wiphy); 19513 19514 if (internal_flags & NL80211_FLAG_NEED_NETDEV) { 19515 if (!dev) { 19516 err = -EINVAL; 19517 goto out_unlock; 19518 } 19519 19520 info->user_ptr[1] = dev; 19521 } else { 19522 info->user_ptr[1] = wdev; 19523 } 19524 19525 if (internal_flags & NL80211_FLAG_CHECK_NETDEV_UP && 19526 !wdev_running(wdev)) { 19527 err = -ENETDOWN; 19528 goto out_unlock; 19529 } 19530 19531 info->user_ptr[0] = rdev; 19532 } 19533 19534 if (internal_flags & NL80211_FLAG_MLO_VALID_LINK_ID) { 19535 struct nlattr *link_id = info->attrs[NL80211_ATTR_MLO_LINK_ID]; 19536 19537 if (!wdev) { 19538 err = -EINVAL; 19539 goto out_unlock; 19540 } 19541 19542 /* MLO -> require valid link ID */ 19543 if (wdev->valid_links && 19544 (!link_id || 19545 !(wdev->valid_links & BIT(nla_get_u8(link_id))))) { 19546 err = -EINVAL; 19547 goto out_unlock; 19548 } 19549 19550 /* non-MLO -> no link ID attribute accepted */ 19551 if (!wdev->valid_links && link_id) { 19552 err = -EINVAL; 19553 goto out_unlock; 19554 } 19555 } 19556 19557 if (internal_flags & NL80211_FLAG_MLO_UNSUPPORTED) { 19558 if (info->attrs[NL80211_ATTR_MLO_LINK_ID] || 19559 (wdev && wdev->valid_links)) { 19560 err = -EINVAL; 19561 goto out_unlock; 19562 } 19563 } 19564 19565 if (rdev && !(internal_flags & NL80211_FLAG_NO_WIPHY_MTX)) { 19566 wiphy_lock(&rdev->wiphy); 19567 /* we keep the mutex locked until post_doit */ 19568 __release(&rdev->wiphy.mtx); 19569 } 19570 if (!(internal_flags & NL80211_FLAG_NEED_RTNL)) 19571 rtnl_unlock(); 19572 19573 return 0; 19574 out_unlock: 19575 rtnl_unlock(); 19576 dev_put(dev); 19577 return err; 19578 } 19579 19580 static void nl80211_post_doit(const struct genl_split_ops *ops, 19581 struct sk_buff *skb, 19582 struct genl_info *info) 19583 { 19584 u32 internal_flags = nl80211_internal_flags[ops->internal_flags]; 19585 19586 if (info->user_ptr[1]) { 19587 if (internal_flags & NL80211_FLAG_NEED_WDEV) { 19588 struct wireless_dev *wdev = info->user_ptr[1]; 19589 19590 dev_put(wdev->netdev); 19591 } else { 19592 dev_put(info->user_ptr[1]); 19593 } 19594 } 19595 19596 if (info->user_ptr[0] && 19597 !(internal_flags & NL80211_FLAG_NO_WIPHY_MTX)) { 19598 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 19599 19600 /* we kept the mutex locked since pre_doit */ 19601 __acquire(&rdev->wiphy.mtx); 19602 wiphy_unlock(&rdev->wiphy); 19603 } 19604 19605 if (internal_flags & NL80211_FLAG_NEED_RTNL) 19606 rtnl_unlock(); 19607 19608 /* If needed, clear the netlink message payload from the SKB 19609 * as it might contain key data that shouldn't stick around on 19610 * the heap after the SKB is freed. The netlink message header 19611 * is still needed for further processing, so leave it intact. 19612 */ 19613 if (internal_flags & NL80211_FLAG_CLEAR_SKB) { 19614 struct nlmsghdr *nlh = nlmsg_hdr(skb); 19615 19616 memset(nlmsg_data(nlh), 0, nlmsg_len(nlh)); 19617 } 19618 } 19619 19620 static int nl80211_set_sar_sub_specs(struct cfg80211_registered_device *rdev, 19621 struct cfg80211_sar_specs *sar_specs, 19622 struct nlattr *spec[], int index) 19623 { 19624 u32 range_index, i; 19625 19626 if (!sar_specs || !spec) 19627 return -EINVAL; 19628 19629 if (!spec[NL80211_SAR_ATTR_SPECS_POWER] || 19630 !spec[NL80211_SAR_ATTR_SPECS_RANGE_INDEX]) 19631 return -EINVAL; 19632 19633 range_index = nla_get_u32(spec[NL80211_SAR_ATTR_SPECS_RANGE_INDEX]); 19634 19635 /* check if range_index exceeds num_freq_ranges */ 19636 if (range_index >= rdev->wiphy.sar_capa->num_freq_ranges) 19637 return -EINVAL; 19638 19639 /* check if range_index duplicates */ 19640 for (i = 0; i < index; i++) { 19641 if (sar_specs->sub_specs[i].freq_range_index == range_index) 19642 return -EINVAL; 19643 } 19644 19645 sar_specs->sub_specs[index].power = 19646 nla_get_s32(spec[NL80211_SAR_ATTR_SPECS_POWER]); 19647 19648 sar_specs->sub_specs[index].freq_range_index = range_index; 19649 19650 return 0; 19651 } 19652 19653 static int nl80211_set_sar_specs(struct sk_buff *skb, struct genl_info *info) 19654 { 19655 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 19656 struct nlattr *spec[NL80211_SAR_ATTR_SPECS_MAX + 1]; 19657 struct nlattr *tb[NL80211_SAR_ATTR_MAX + 1]; 19658 struct cfg80211_sar_specs *sar_spec; 19659 enum nl80211_sar_type type; 19660 struct nlattr *spec_list; 19661 u32 specs; 19662 int rem, err; 19663 19664 if (!rdev->wiphy.sar_capa || !rdev->ops->set_sar_specs) 19665 return -EOPNOTSUPP; 19666 19667 if (!info->attrs[NL80211_ATTR_SAR_SPEC]) 19668 return -EINVAL; 19669 19670 nla_parse_nested(tb, NL80211_SAR_ATTR_MAX, 19671 info->attrs[NL80211_ATTR_SAR_SPEC], 19672 NULL, NULL); 19673 19674 if (!tb[NL80211_SAR_ATTR_TYPE] || !tb[NL80211_SAR_ATTR_SPECS]) 19675 return -EINVAL; 19676 19677 type = nla_get_u32(tb[NL80211_SAR_ATTR_TYPE]); 19678 if (type != rdev->wiphy.sar_capa->type) 19679 return -EINVAL; 19680 19681 specs = 0; 19682 nla_for_each_nested(spec_list, tb[NL80211_SAR_ATTR_SPECS], rem) 19683 specs++; 19684 19685 if (specs > rdev->wiphy.sar_capa->num_freq_ranges) 19686 return -EINVAL; 19687 19688 sar_spec = kzalloc_flex(*sar_spec, sub_specs, specs); 19689 if (!sar_spec) 19690 return -ENOMEM; 19691 19692 sar_spec->num_sub_specs = specs; 19693 sar_spec->type = type; 19694 specs = 0; 19695 nla_for_each_nested(spec_list, tb[NL80211_SAR_ATTR_SPECS], rem) { 19696 nla_parse_nested(spec, NL80211_SAR_ATTR_SPECS_MAX, 19697 spec_list, NULL, NULL); 19698 19699 switch (type) { 19700 case NL80211_SAR_TYPE_POWER: 19701 if (nl80211_set_sar_sub_specs(rdev, sar_spec, 19702 spec, specs)) { 19703 err = -EINVAL; 19704 goto error; 19705 } 19706 break; 19707 default: 19708 err = -EINVAL; 19709 goto error; 19710 } 19711 specs++; 19712 } 19713 19714 sar_spec->num_sub_specs = specs; 19715 19716 rdev->cur_cmd_info = info; 19717 err = rdev_set_sar_specs(rdev, sar_spec); 19718 rdev->cur_cmd_info = NULL; 19719 error: 19720 kfree(sar_spec); 19721 return err; 19722 } 19723 19724 #define SELECTOR(__sel, name, value) \ 19725 ((__sel) == (value)) ? NL80211_IFL_SEL_##name : 19726 int __missing_selector(void); 19727 #define IFLAGS(__val) INTERNAL_FLAG_SELECTORS(__val) __missing_selector() 19728 19729 static const struct genl_ops nl80211_ops[] = { 19730 { 19731 .cmd = NL80211_CMD_GET_WIPHY, 19732 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19733 .doit = nl80211_get_wiphy, 19734 .dumpit = nl80211_dump_wiphy, 19735 .done = nl80211_dump_wiphy_done, 19736 /* can be retrieved by unprivileged users */ 19737 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY), 19738 }, 19739 { 19740 .cmd = NL80211_CMD_GET_STATION, 19741 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19742 .doit = nl80211_get_station, 19743 .dumpit = nl80211_dump_station, 19744 .done = nl80211_dump_station_done, 19745 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV), 19746 }, 19747 }; 19748 19749 static const struct genl_small_ops nl80211_small_ops[] = { 19750 { 19751 .cmd = NL80211_CMD_SET_WIPHY, 19752 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19753 .doit = nl80211_set_wiphy, 19754 .flags = GENL_UNS_ADMIN_PERM, 19755 }, 19756 { 19757 .cmd = NL80211_CMD_GET_INTERFACE, 19758 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19759 .doit = nl80211_get_interface, 19760 .dumpit = nl80211_dump_interface, 19761 /* can be retrieved by unprivileged users */ 19762 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV), 19763 }, 19764 { 19765 .cmd = NL80211_CMD_SET_INTERFACE, 19766 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19767 .doit = nl80211_set_interface, 19768 .flags = GENL_UNS_ADMIN_PERM, 19769 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV | 19770 NL80211_FLAG_NEED_RTNL), 19771 }, 19772 { 19773 .cmd = NL80211_CMD_NEW_INTERFACE, 19774 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19775 .doit = nl80211_new_interface, 19776 .flags = GENL_UNS_ADMIN_PERM, 19777 .internal_flags = 19778 IFLAGS(NL80211_FLAG_NEED_WIPHY | 19779 NL80211_FLAG_NEED_RTNL | 19780 /* we take the wiphy mutex later ourselves */ 19781 NL80211_FLAG_NO_WIPHY_MTX), 19782 }, 19783 { 19784 .cmd = NL80211_CMD_DEL_INTERFACE, 19785 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19786 .doit = nl80211_del_interface, 19787 .flags = GENL_UNS_ADMIN_PERM, 19788 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV | 19789 NL80211_FLAG_NEED_RTNL), 19790 }, 19791 { 19792 .cmd = NL80211_CMD_GET_KEY, 19793 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19794 .doit = nl80211_get_key, 19795 .flags = GENL_UNS_ADMIN_PERM, 19796 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 19797 }, 19798 { 19799 .cmd = NL80211_CMD_SET_KEY, 19800 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19801 .doit = nl80211_set_key, 19802 .flags = GENL_UNS_ADMIN_PERM, 19803 /* cannot use NL80211_FLAG_MLO_VALID_LINK_ID, depends on key */ 19804 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP | 19805 NL80211_FLAG_CLEAR_SKB), 19806 }, 19807 { 19808 .cmd = NL80211_CMD_NEW_KEY, 19809 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19810 .doit = nl80211_new_key, 19811 .flags = GENL_UNS_ADMIN_PERM, 19812 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP | 19813 NL80211_FLAG_CLEAR_SKB), 19814 }, 19815 { 19816 .cmd = NL80211_CMD_DEL_KEY, 19817 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19818 .doit = nl80211_del_key, 19819 .flags = GENL_UNS_ADMIN_PERM, 19820 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 19821 }, 19822 { 19823 .cmd = NL80211_CMD_SET_BEACON, 19824 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19825 .flags = GENL_UNS_ADMIN_PERM, 19826 .doit = nl80211_set_beacon, 19827 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 19828 NL80211_FLAG_MLO_VALID_LINK_ID), 19829 }, 19830 { 19831 .cmd = NL80211_CMD_START_AP, 19832 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19833 .flags = GENL_UNS_ADMIN_PERM, 19834 .doit = nl80211_start_ap, 19835 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 19836 NL80211_FLAG_MLO_VALID_LINK_ID), 19837 }, 19838 { 19839 .cmd = NL80211_CMD_STOP_AP, 19840 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19841 .flags = GENL_UNS_ADMIN_PERM, 19842 .doit = nl80211_stop_ap, 19843 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 19844 NL80211_FLAG_MLO_VALID_LINK_ID), 19845 }, 19846 { 19847 .cmd = NL80211_CMD_SET_STATION, 19848 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19849 .doit = nl80211_set_station, 19850 .flags = GENL_UNS_ADMIN_PERM, 19851 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 19852 }, 19853 { 19854 .cmd = NL80211_CMD_NEW_STATION, 19855 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19856 .doit = nl80211_new_station, 19857 .flags = GENL_UNS_ADMIN_PERM, 19858 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 19859 }, 19860 { 19861 .cmd = NL80211_CMD_DEL_STATION, 19862 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19863 .doit = nl80211_del_station, 19864 .flags = GENL_UNS_ADMIN_PERM, 19865 /* cannot use NL80211_FLAG_MLO_VALID_LINK_ID, depends on 19866 * whether MAC address is passed or not. If MAC address is 19867 * passed, then even during MLO, link ID is not required. 19868 */ 19869 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 19870 }, 19871 { 19872 .cmd = NL80211_CMD_GET_MPATH, 19873 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19874 .doit = nl80211_get_mpath, 19875 .dumpit = nl80211_dump_mpath, 19876 .flags = GENL_UNS_ADMIN_PERM, 19877 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 19878 }, 19879 { 19880 .cmd = NL80211_CMD_GET_MPP, 19881 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19882 .doit = nl80211_get_mpp, 19883 .dumpit = nl80211_dump_mpp, 19884 .flags = GENL_UNS_ADMIN_PERM, 19885 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 19886 }, 19887 { 19888 .cmd = NL80211_CMD_SET_MPATH, 19889 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19890 .doit = nl80211_set_mpath, 19891 .flags = GENL_UNS_ADMIN_PERM, 19892 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 19893 }, 19894 { 19895 .cmd = NL80211_CMD_NEW_MPATH, 19896 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19897 .doit = nl80211_new_mpath, 19898 .flags = GENL_UNS_ADMIN_PERM, 19899 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 19900 }, 19901 { 19902 .cmd = NL80211_CMD_DEL_MPATH, 19903 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19904 .doit = nl80211_del_mpath, 19905 .flags = GENL_UNS_ADMIN_PERM, 19906 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 19907 }, 19908 { 19909 .cmd = NL80211_CMD_SET_BSS, 19910 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19911 .doit = nl80211_set_bss, 19912 .flags = GENL_UNS_ADMIN_PERM, 19913 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 19914 NL80211_FLAG_MLO_VALID_LINK_ID), 19915 }, 19916 { 19917 .cmd = NL80211_CMD_GET_REG, 19918 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19919 .doit = nl80211_get_reg_do, 19920 .dumpit = nl80211_get_reg_dump, 19921 /* can be retrieved by unprivileged users */ 19922 }, 19923 #ifdef CONFIG_CFG80211_CRDA_SUPPORT 19924 { 19925 .cmd = NL80211_CMD_SET_REG, 19926 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19927 .doit = nl80211_set_reg, 19928 .flags = GENL_ADMIN_PERM, 19929 }, 19930 #endif 19931 { 19932 .cmd = NL80211_CMD_REQ_SET_REG, 19933 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19934 .doit = nl80211_req_set_reg, 19935 .flags = GENL_ADMIN_PERM, 19936 }, 19937 { 19938 .cmd = NL80211_CMD_RELOAD_REGDB, 19939 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19940 .doit = nl80211_reload_regdb, 19941 .flags = GENL_ADMIN_PERM, 19942 }, 19943 { 19944 .cmd = NL80211_CMD_GET_MESH_CONFIG, 19945 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19946 .doit = nl80211_get_mesh_config, 19947 /* can be retrieved by unprivileged users */ 19948 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 19949 }, 19950 { 19951 .cmd = NL80211_CMD_SET_MESH_CONFIG, 19952 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19953 .doit = nl80211_update_mesh_config, 19954 .flags = GENL_UNS_ADMIN_PERM, 19955 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 19956 }, 19957 { 19958 .cmd = NL80211_CMD_TRIGGER_SCAN, 19959 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19960 .doit = nl80211_trigger_scan, 19961 .flags = GENL_UNS_ADMIN_PERM, 19962 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 19963 }, 19964 { 19965 .cmd = NL80211_CMD_ABORT_SCAN, 19966 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19967 .doit = nl80211_abort_scan, 19968 .flags = GENL_UNS_ADMIN_PERM, 19969 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 19970 }, 19971 { 19972 .cmd = NL80211_CMD_GET_SCAN, 19973 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19974 .dumpit = nl80211_dump_scan, 19975 }, 19976 { 19977 .cmd = NL80211_CMD_START_SCHED_SCAN, 19978 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19979 .doit = nl80211_start_sched_scan, 19980 .flags = GENL_UNS_ADMIN_PERM, 19981 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 19982 }, 19983 { 19984 .cmd = NL80211_CMD_STOP_SCHED_SCAN, 19985 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19986 .doit = nl80211_stop_sched_scan, 19987 .flags = GENL_UNS_ADMIN_PERM, 19988 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 19989 }, 19990 { 19991 .cmd = NL80211_CMD_AUTHENTICATE, 19992 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19993 .doit = nl80211_authenticate, 19994 .flags = GENL_UNS_ADMIN_PERM, 19995 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 19996 NL80211_FLAG_CLEAR_SKB), 19997 }, 19998 { 19999 .cmd = NL80211_CMD_ASSOCIATE, 20000 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20001 .doit = nl80211_associate, 20002 .flags = GENL_UNS_ADMIN_PERM, 20003 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 20004 NL80211_FLAG_CLEAR_SKB), 20005 }, 20006 { 20007 .cmd = NL80211_CMD_DEAUTHENTICATE, 20008 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20009 .doit = nl80211_deauthenticate, 20010 .flags = GENL_UNS_ADMIN_PERM, 20011 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20012 }, 20013 { 20014 .cmd = NL80211_CMD_DISASSOCIATE, 20015 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20016 .doit = nl80211_disassociate, 20017 .flags = GENL_UNS_ADMIN_PERM, 20018 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20019 }, 20020 { 20021 .cmd = NL80211_CMD_JOIN_IBSS, 20022 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20023 .doit = nl80211_join_ibss, 20024 .flags = GENL_UNS_ADMIN_PERM, 20025 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20026 }, 20027 { 20028 .cmd = NL80211_CMD_LEAVE_IBSS, 20029 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20030 .doit = nl80211_leave_ibss, 20031 .flags = GENL_UNS_ADMIN_PERM, 20032 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20033 }, 20034 #ifdef CONFIG_NL80211_TESTMODE 20035 { 20036 .cmd = NL80211_CMD_TESTMODE, 20037 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20038 .doit = nl80211_testmode_do, 20039 .dumpit = nl80211_testmode_dump, 20040 .flags = GENL_UNS_ADMIN_PERM, 20041 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY), 20042 }, 20043 #endif 20044 { 20045 .cmd = NL80211_CMD_CONNECT, 20046 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20047 .doit = nl80211_connect, 20048 .flags = GENL_UNS_ADMIN_PERM, 20049 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 20050 NL80211_FLAG_CLEAR_SKB), 20051 }, 20052 { 20053 .cmd = NL80211_CMD_UPDATE_CONNECT_PARAMS, 20054 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20055 .doit = nl80211_update_connect_params, 20056 .flags = GENL_ADMIN_PERM, 20057 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 20058 NL80211_FLAG_CLEAR_SKB), 20059 }, 20060 { 20061 .cmd = NL80211_CMD_DISCONNECT, 20062 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20063 .doit = nl80211_disconnect, 20064 .flags = GENL_UNS_ADMIN_PERM, 20065 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20066 }, 20067 { 20068 .cmd = NL80211_CMD_SET_WIPHY_NETNS, 20069 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20070 .doit = nl80211_wiphy_netns, 20071 .flags = GENL_UNS_ADMIN_PERM, 20072 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY | 20073 NL80211_FLAG_NEED_RTNL | 20074 NL80211_FLAG_NO_WIPHY_MTX), 20075 }, 20076 { 20077 .cmd = NL80211_CMD_GET_SURVEY, 20078 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20079 .dumpit = nl80211_dump_survey, 20080 }, 20081 { 20082 .cmd = NL80211_CMD_SET_PMKSA, 20083 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20084 .doit = nl80211_set_pmksa, 20085 .flags = GENL_UNS_ADMIN_PERM, 20086 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 20087 NL80211_FLAG_CLEAR_SKB), 20088 }, 20089 { 20090 .cmd = NL80211_CMD_DEL_PMKSA, 20091 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20092 .doit = nl80211_del_pmksa, 20093 .flags = GENL_UNS_ADMIN_PERM, 20094 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20095 }, 20096 { 20097 .cmd = NL80211_CMD_FLUSH_PMKSA, 20098 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20099 .doit = nl80211_flush_pmksa, 20100 .flags = GENL_UNS_ADMIN_PERM, 20101 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20102 }, 20103 { 20104 .cmd = NL80211_CMD_REMAIN_ON_CHANNEL, 20105 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20106 .doit = nl80211_remain_on_channel, 20107 .flags = GENL_UNS_ADMIN_PERM, 20108 /* FIXME: requiring a link ID here is probably not good */ 20109 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP | 20110 NL80211_FLAG_MLO_VALID_LINK_ID), 20111 }, 20112 { 20113 .cmd = NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL, 20114 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20115 .doit = nl80211_cancel_remain_on_channel, 20116 .flags = GENL_UNS_ADMIN_PERM, 20117 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 20118 }, 20119 { 20120 .cmd = NL80211_CMD_SET_TX_BITRATE_MASK, 20121 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20122 .doit = nl80211_set_tx_bitrate_mask, 20123 .flags = GENL_UNS_ADMIN_PERM, 20124 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV | 20125 NL80211_FLAG_MLO_VALID_LINK_ID), 20126 }, 20127 { 20128 .cmd = NL80211_CMD_REGISTER_FRAME, 20129 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20130 .doit = nl80211_register_mgmt, 20131 .flags = GENL_UNS_ADMIN_PERM, 20132 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV), 20133 }, 20134 { 20135 .cmd = NL80211_CMD_FRAME, 20136 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20137 .doit = nl80211_tx_mgmt, 20138 .flags = GENL_UNS_ADMIN_PERM, 20139 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 20140 }, 20141 { 20142 .cmd = NL80211_CMD_FRAME_WAIT_CANCEL, 20143 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20144 .doit = nl80211_tx_mgmt_cancel_wait, 20145 .flags = GENL_UNS_ADMIN_PERM, 20146 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 20147 }, 20148 { 20149 .cmd = NL80211_CMD_SET_POWER_SAVE, 20150 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20151 .doit = nl80211_set_power_save, 20152 .flags = GENL_UNS_ADMIN_PERM, 20153 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV), 20154 }, 20155 { 20156 .cmd = NL80211_CMD_GET_POWER_SAVE, 20157 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20158 .doit = nl80211_get_power_save, 20159 /* can be retrieved by unprivileged users */ 20160 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV), 20161 }, 20162 { 20163 .cmd = NL80211_CMD_SET_CQM, 20164 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20165 .doit = nl80211_set_cqm, 20166 .flags = GENL_UNS_ADMIN_PERM, 20167 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV), 20168 }, 20169 { 20170 .cmd = NL80211_CMD_SET_CHANNEL, 20171 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20172 .doit = nl80211_set_channel, 20173 .flags = GENL_UNS_ADMIN_PERM, 20174 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV | 20175 NL80211_FLAG_MLO_VALID_LINK_ID), 20176 }, 20177 { 20178 .cmd = NL80211_CMD_JOIN_MESH, 20179 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20180 .doit = nl80211_join_mesh, 20181 .flags = GENL_UNS_ADMIN_PERM, 20182 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20183 }, 20184 { 20185 .cmd = NL80211_CMD_LEAVE_MESH, 20186 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20187 .doit = nl80211_leave_mesh, 20188 .flags = GENL_UNS_ADMIN_PERM, 20189 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20190 }, 20191 { 20192 .cmd = NL80211_CMD_JOIN_OCB, 20193 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20194 .doit = nl80211_join_ocb, 20195 .flags = GENL_UNS_ADMIN_PERM, 20196 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20197 }, 20198 { 20199 .cmd = NL80211_CMD_LEAVE_OCB, 20200 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20201 .doit = nl80211_leave_ocb, 20202 .flags = GENL_UNS_ADMIN_PERM, 20203 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20204 }, 20205 #ifdef CONFIG_PM 20206 { 20207 .cmd = NL80211_CMD_GET_WOWLAN, 20208 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20209 .doit = nl80211_get_wowlan, 20210 /* can be retrieved by unprivileged users */ 20211 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY), 20212 }, 20213 { 20214 .cmd = NL80211_CMD_SET_WOWLAN, 20215 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20216 .doit = nl80211_set_wowlan, 20217 .flags = GENL_UNS_ADMIN_PERM, 20218 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY), 20219 }, 20220 #endif 20221 { 20222 .cmd = NL80211_CMD_SET_REKEY_OFFLOAD, 20223 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20224 .doit = nl80211_set_rekey_data, 20225 .flags = GENL_UNS_ADMIN_PERM, 20226 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 20227 NL80211_FLAG_CLEAR_SKB), 20228 }, 20229 { 20230 .cmd = NL80211_CMD_TDLS_MGMT, 20231 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20232 .doit = nl80211_tdls_mgmt, 20233 .flags = GENL_UNS_ADMIN_PERM, 20234 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 20235 NL80211_FLAG_MLO_VALID_LINK_ID), 20236 }, 20237 { 20238 .cmd = NL80211_CMD_TDLS_OPER, 20239 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20240 .doit = nl80211_tdls_oper, 20241 .flags = GENL_UNS_ADMIN_PERM, 20242 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20243 }, 20244 { 20245 .cmd = NL80211_CMD_UNEXPECTED_FRAME, 20246 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20247 .doit = nl80211_register_unexpected_frame, 20248 .flags = GENL_UNS_ADMIN_PERM, 20249 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV), 20250 }, 20251 { 20252 .cmd = NL80211_CMD_PROBE_PEER, 20253 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20254 .doit = nl80211_probe_peer, 20255 .flags = GENL_UNS_ADMIN_PERM, 20256 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20257 }, 20258 { 20259 .cmd = NL80211_CMD_REGISTER_BEACONS, 20260 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20261 .doit = nl80211_register_beacons, 20262 .flags = GENL_UNS_ADMIN_PERM, 20263 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY), 20264 }, 20265 { 20266 .cmd = NL80211_CMD_SET_NOACK_MAP, 20267 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20268 .doit = nl80211_set_noack_map, 20269 .flags = GENL_UNS_ADMIN_PERM, 20270 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV), 20271 }, 20272 { 20273 .cmd = NL80211_CMD_START_P2P_DEVICE, 20274 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20275 .doit = nl80211_start_p2p_device, 20276 .flags = GENL_UNS_ADMIN_PERM, 20277 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV | 20278 NL80211_FLAG_NEED_RTNL), 20279 }, 20280 { 20281 .cmd = NL80211_CMD_STOP_P2P_DEVICE, 20282 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20283 .doit = nl80211_stop_p2p_device, 20284 .flags = GENL_UNS_ADMIN_PERM, 20285 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP | 20286 NL80211_FLAG_NEED_RTNL), 20287 }, 20288 { 20289 .cmd = NL80211_CMD_START_NAN, 20290 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20291 .doit = nl80211_start_nan, 20292 .flags = GENL_ADMIN_PERM, 20293 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV | 20294 NL80211_FLAG_NEED_RTNL), 20295 }, 20296 { 20297 .cmd = NL80211_CMD_STOP_NAN, 20298 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20299 .doit = nl80211_stop_nan, 20300 .flags = GENL_ADMIN_PERM, 20301 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP | 20302 NL80211_FLAG_NO_WIPHY_MTX | 20303 NL80211_FLAG_NEED_RTNL), 20304 }, 20305 { 20306 .cmd = NL80211_CMD_ADD_NAN_FUNCTION, 20307 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20308 .doit = nl80211_nan_add_func, 20309 .flags = GENL_ADMIN_PERM, 20310 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 20311 }, 20312 { 20313 .cmd = NL80211_CMD_DEL_NAN_FUNCTION, 20314 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20315 .doit = nl80211_nan_del_func, 20316 .flags = GENL_ADMIN_PERM, 20317 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 20318 }, 20319 { 20320 .cmd = NL80211_CMD_CHANGE_NAN_CONFIG, 20321 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20322 .doit = nl80211_nan_change_config, 20323 .flags = GENL_ADMIN_PERM, 20324 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 20325 }, 20326 { 20327 .cmd = NL80211_CMD_START_PD, 20328 .doit = nl80211_start_pd, 20329 .flags = GENL_ADMIN_PERM, 20330 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV | 20331 NL80211_FLAG_NEED_RTNL), 20332 }, 20333 { 20334 .cmd = NL80211_CMD_STOP_PD, 20335 .doit = nl80211_stop_pd, 20336 .flags = GENL_ADMIN_PERM, 20337 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP | 20338 NL80211_FLAG_NEED_RTNL), 20339 }, 20340 { 20341 .cmd = NL80211_CMD_SET_MCAST_RATE, 20342 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20343 .doit = nl80211_set_mcast_rate, 20344 .flags = GENL_UNS_ADMIN_PERM, 20345 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV), 20346 }, 20347 { 20348 .cmd = NL80211_CMD_SET_MAC_ACL, 20349 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20350 .doit = nl80211_set_mac_acl, 20351 .flags = GENL_UNS_ADMIN_PERM, 20352 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV | 20353 NL80211_FLAG_MLO_UNSUPPORTED), 20354 }, 20355 { 20356 .cmd = NL80211_CMD_RADAR_DETECT, 20357 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20358 .doit = nl80211_start_radar_detection, 20359 .flags = GENL_UNS_ADMIN_PERM, 20360 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 20361 NL80211_FLAG_NO_WIPHY_MTX | 20362 NL80211_FLAG_MLO_VALID_LINK_ID), 20363 }, 20364 { 20365 .cmd = NL80211_CMD_GET_PROTOCOL_FEATURES, 20366 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20367 .doit = nl80211_get_protocol_features, 20368 }, 20369 { 20370 .cmd = NL80211_CMD_UPDATE_FT_IES, 20371 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20372 .doit = nl80211_update_ft_ies, 20373 .flags = GENL_UNS_ADMIN_PERM, 20374 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20375 }, 20376 { 20377 .cmd = NL80211_CMD_CRIT_PROTOCOL_START, 20378 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20379 .doit = nl80211_crit_protocol_start, 20380 .flags = GENL_UNS_ADMIN_PERM, 20381 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 20382 }, 20383 { 20384 .cmd = NL80211_CMD_CRIT_PROTOCOL_STOP, 20385 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20386 .doit = nl80211_crit_protocol_stop, 20387 .flags = GENL_UNS_ADMIN_PERM, 20388 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 20389 }, 20390 { 20391 .cmd = NL80211_CMD_GET_COALESCE, 20392 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20393 .doit = nl80211_get_coalesce, 20394 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY), 20395 }, 20396 { 20397 .cmd = NL80211_CMD_SET_COALESCE, 20398 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20399 .doit = nl80211_set_coalesce, 20400 .flags = GENL_UNS_ADMIN_PERM, 20401 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY), 20402 }, 20403 { 20404 .cmd = NL80211_CMD_CHANNEL_SWITCH, 20405 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20406 .doit = nl80211_channel_switch, 20407 .flags = GENL_UNS_ADMIN_PERM, 20408 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 20409 NL80211_FLAG_MLO_VALID_LINK_ID), 20410 }, 20411 { 20412 .cmd = NL80211_CMD_VENDOR, 20413 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20414 .doit = nl80211_vendor_cmd, 20415 .dumpit = nl80211_vendor_cmd_dump, 20416 .flags = GENL_UNS_ADMIN_PERM, 20417 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY | 20418 NL80211_FLAG_CLEAR_SKB), 20419 }, 20420 { 20421 .cmd = NL80211_CMD_SET_QOS_MAP, 20422 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20423 .doit = nl80211_set_qos_map, 20424 .flags = GENL_UNS_ADMIN_PERM, 20425 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20426 }, 20427 { 20428 .cmd = NL80211_CMD_ADD_TX_TS, 20429 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20430 .doit = nl80211_add_tx_ts, 20431 .flags = GENL_UNS_ADMIN_PERM, 20432 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 20433 NL80211_FLAG_MLO_UNSUPPORTED), 20434 }, 20435 { 20436 .cmd = NL80211_CMD_DEL_TX_TS, 20437 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20438 .doit = nl80211_del_tx_ts, 20439 .flags = GENL_UNS_ADMIN_PERM, 20440 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20441 }, 20442 { 20443 .cmd = NL80211_CMD_TDLS_CHANNEL_SWITCH, 20444 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20445 .doit = nl80211_tdls_channel_switch, 20446 .flags = GENL_UNS_ADMIN_PERM, 20447 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20448 }, 20449 { 20450 .cmd = NL80211_CMD_TDLS_CANCEL_CHANNEL_SWITCH, 20451 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20452 .doit = nl80211_tdls_cancel_channel_switch, 20453 .flags = GENL_UNS_ADMIN_PERM, 20454 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20455 }, 20456 { 20457 .cmd = NL80211_CMD_SET_MULTICAST_TO_UNICAST, 20458 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20459 .doit = nl80211_set_multicast_to_unicast, 20460 .flags = GENL_UNS_ADMIN_PERM, 20461 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV), 20462 }, 20463 { 20464 .cmd = NL80211_CMD_SET_PMK, 20465 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20466 .doit = nl80211_set_pmk, 20467 .flags = GENL_UNS_ADMIN_PERM, 20468 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 20469 NL80211_FLAG_CLEAR_SKB), 20470 }, 20471 { 20472 .cmd = NL80211_CMD_DEL_PMK, 20473 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20474 .doit = nl80211_del_pmk, 20475 .flags = GENL_UNS_ADMIN_PERM, 20476 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20477 }, 20478 { 20479 .cmd = NL80211_CMD_EXTERNAL_AUTH, 20480 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20481 .doit = nl80211_external_auth, 20482 .flags = GENL_ADMIN_PERM, 20483 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20484 }, 20485 { 20486 .cmd = NL80211_CMD_CONTROL_PORT_FRAME, 20487 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20488 .doit = nl80211_tx_control_port, 20489 .flags = GENL_UNS_ADMIN_PERM, 20490 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20491 }, 20492 { 20493 .cmd = NL80211_CMD_GET_FTM_RESPONDER_STATS, 20494 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20495 .doit = nl80211_get_ftm_responder_stats, 20496 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV | 20497 NL80211_FLAG_MLO_VALID_LINK_ID), 20498 }, 20499 { 20500 .cmd = NL80211_CMD_PEER_MEASUREMENT_START, 20501 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20502 .doit = nl80211_pmsr_start, 20503 .flags = GENL_UNS_ADMIN_PERM, 20504 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 20505 }, 20506 { 20507 .cmd = NL80211_CMD_NOTIFY_RADAR, 20508 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20509 .doit = nl80211_notify_radar_detection, 20510 .flags = GENL_UNS_ADMIN_PERM, 20511 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20512 }, 20513 { 20514 .cmd = NL80211_CMD_UPDATE_OWE_INFO, 20515 .doit = nl80211_update_owe_info, 20516 .flags = GENL_ADMIN_PERM, 20517 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20518 }, 20519 { 20520 .cmd = NL80211_CMD_PROBE_MESH_LINK, 20521 .doit = nl80211_probe_mesh_link, 20522 .flags = GENL_UNS_ADMIN_PERM, 20523 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20524 }, 20525 { 20526 .cmd = NL80211_CMD_SET_TID_CONFIG, 20527 .doit = nl80211_set_tid_config, 20528 .flags = GENL_UNS_ADMIN_PERM, 20529 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV | 20530 NL80211_FLAG_MLO_VALID_LINK_ID), 20531 }, 20532 { 20533 .cmd = NL80211_CMD_SET_SAR_SPECS, 20534 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20535 .doit = nl80211_set_sar_specs, 20536 .flags = GENL_UNS_ADMIN_PERM, 20537 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY | 20538 NL80211_FLAG_NEED_RTNL), 20539 }, 20540 { 20541 .cmd = NL80211_CMD_COLOR_CHANGE_REQUEST, 20542 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20543 .doit = nl80211_color_change, 20544 .flags = GENL_UNS_ADMIN_PERM, 20545 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 20546 NL80211_FLAG_MLO_VALID_LINK_ID), 20547 }, 20548 { 20549 .cmd = NL80211_CMD_SET_FILS_AAD, 20550 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20551 .doit = nl80211_set_fils_aad, 20552 .flags = GENL_UNS_ADMIN_PERM, 20553 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20554 }, 20555 { 20556 .cmd = NL80211_CMD_ADD_LINK, 20557 .doit = nl80211_add_link, 20558 .flags = GENL_UNS_ADMIN_PERM, 20559 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20560 }, 20561 { 20562 .cmd = NL80211_CMD_REMOVE_LINK, 20563 .doit = nl80211_remove_link, 20564 .flags = GENL_UNS_ADMIN_PERM, 20565 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 20566 NL80211_FLAG_MLO_VALID_LINK_ID), 20567 }, 20568 { 20569 .cmd = NL80211_CMD_ADD_LINK_STA, 20570 .doit = nl80211_add_link_station, 20571 .flags = GENL_UNS_ADMIN_PERM, 20572 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 20573 NL80211_FLAG_MLO_VALID_LINK_ID), 20574 }, 20575 { 20576 .cmd = NL80211_CMD_MODIFY_LINK_STA, 20577 .doit = nl80211_modify_link_station, 20578 .flags = GENL_UNS_ADMIN_PERM, 20579 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 20580 NL80211_FLAG_MLO_VALID_LINK_ID), 20581 }, 20582 { 20583 .cmd = NL80211_CMD_REMOVE_LINK_STA, 20584 .doit = nl80211_remove_link_station, 20585 .flags = GENL_UNS_ADMIN_PERM, 20586 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 20587 NL80211_FLAG_MLO_VALID_LINK_ID), 20588 }, 20589 { 20590 .cmd = NL80211_CMD_SET_HW_TIMESTAMP, 20591 .doit = nl80211_set_hw_timestamp, 20592 .flags = GENL_UNS_ADMIN_PERM, 20593 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20594 }, 20595 { 20596 .cmd = NL80211_CMD_SET_TID_TO_LINK_MAPPING, 20597 .doit = nl80211_set_ttlm, 20598 .flags = GENL_UNS_ADMIN_PERM, 20599 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20600 }, 20601 { 20602 .cmd = NL80211_CMD_ASSOC_MLO_RECONF, 20603 .doit = nl80211_assoc_ml_reconf, 20604 .flags = GENL_UNS_ADMIN_PERM, 20605 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20606 }, 20607 { 20608 .cmd = NL80211_CMD_EPCS_CFG, 20609 .doit = nl80211_epcs_cfg, 20610 .flags = GENL_UNS_ADMIN_PERM, 20611 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20612 }, 20613 { 20614 .cmd = NL80211_CMD_NAN_SET_LOCAL_SCHED, 20615 .doit = nl80211_nan_set_local_sched, 20616 .flags = GENL_ADMIN_PERM, 20617 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 20618 }, 20619 { 20620 .cmd = NL80211_CMD_NAN_SET_PEER_SCHED, 20621 .doit = nl80211_nan_set_peer_sched, 20622 .flags = GENL_ADMIN_PERM, 20623 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 20624 }, 20625 }; 20626 20627 static struct genl_family nl80211_fam __ro_after_init = { 20628 .name = NL80211_GENL_NAME, /* have users key off the name instead */ 20629 .hdrsize = 0, /* no private header */ 20630 .version = 1, /* no particular meaning now */ 20631 .maxattr = NL80211_ATTR_MAX, 20632 .policy = nl80211_policy, 20633 .netnsok = true, 20634 .pre_doit = nl80211_pre_doit, 20635 .post_doit = nl80211_post_doit, 20636 .module = THIS_MODULE, 20637 .ops = nl80211_ops, 20638 .n_ops = ARRAY_SIZE(nl80211_ops), 20639 .small_ops = nl80211_small_ops, 20640 .n_small_ops = ARRAY_SIZE(nl80211_small_ops), 20641 .resv_start_op = NL80211_CMD_REMOVE_LINK_STA + 1, 20642 .mcgrps = nl80211_mcgrps, 20643 .n_mcgrps = ARRAY_SIZE(nl80211_mcgrps), 20644 .parallel_ops = true, 20645 }; 20646 20647 /* notification functions */ 20648 20649 void nl80211_notify_wiphy(struct cfg80211_registered_device *rdev, 20650 enum nl80211_commands cmd) 20651 { 20652 struct sk_buff *msg; 20653 struct nl80211_dump_wiphy_state state = {}; 20654 20655 WARN_ON(cmd != NL80211_CMD_NEW_WIPHY && 20656 cmd != NL80211_CMD_DEL_WIPHY); 20657 20658 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 20659 if (!msg) 20660 return; 20661 20662 if (nl80211_send_wiphy(rdev, cmd, msg, 0, 0, 0, &state) < 0) { 20663 nlmsg_free(msg); 20664 return; 20665 } 20666 20667 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 20668 NL80211_MCGRP_CONFIG, GFP_KERNEL); 20669 } 20670 20671 void nl80211_notify_iface(struct cfg80211_registered_device *rdev, 20672 struct wireless_dev *wdev, 20673 enum nl80211_commands cmd) 20674 { 20675 struct sk_buff *msg; 20676 20677 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 20678 if (!msg) 20679 return; 20680 20681 if (nl80211_send_iface(msg, 0, 0, 0, rdev, wdev, cmd) < 0) { 20682 nlmsg_free(msg); 20683 return; 20684 } 20685 20686 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 20687 NL80211_MCGRP_CONFIG, GFP_KERNEL); 20688 } 20689 20690 static int nl80211_add_scan_req(struct sk_buff *msg, 20691 struct cfg80211_registered_device *rdev) 20692 { 20693 struct cfg80211_scan_request_int *req = rdev->scan_req; 20694 struct nlattr *nest; 20695 int i; 20696 struct cfg80211_scan_info *info; 20697 20698 if (WARN_ON(!req)) 20699 return 0; 20700 20701 nest = nla_nest_start_noflag(msg, NL80211_ATTR_SCAN_SSIDS); 20702 if (!nest) 20703 goto nla_put_failure; 20704 for (i = 0; i < req->req.n_ssids; i++) { 20705 if (nla_put(msg, i, req->req.ssids[i].ssid_len, 20706 req->req.ssids[i].ssid)) 20707 goto nla_put_failure; 20708 } 20709 nla_nest_end(msg, nest); 20710 20711 if (req->req.flags & NL80211_SCAN_FLAG_FREQ_KHZ) { 20712 nest = nla_nest_start(msg, NL80211_ATTR_SCAN_FREQ_KHZ); 20713 if (!nest) 20714 goto nla_put_failure; 20715 for (i = 0; i < req->req.n_channels; i++) { 20716 if (nla_put_u32(msg, i, 20717 ieee80211_channel_to_khz(req->req.channels[i]))) 20718 goto nla_put_failure; 20719 } 20720 nla_nest_end(msg, nest); 20721 } else { 20722 nest = nla_nest_start_noflag(msg, 20723 NL80211_ATTR_SCAN_FREQUENCIES); 20724 if (!nest) 20725 goto nla_put_failure; 20726 for (i = 0; i < req->req.n_channels; i++) { 20727 if (nla_put_u32(msg, i, 20728 req->req.channels[i]->center_freq)) 20729 goto nla_put_failure; 20730 } 20731 nla_nest_end(msg, nest); 20732 } 20733 20734 if (req->req.ie && 20735 nla_put(msg, NL80211_ATTR_IE, req->req.ie_len, req->req.ie)) 20736 goto nla_put_failure; 20737 20738 if (req->req.flags && 20739 nla_put_u32(msg, NL80211_ATTR_SCAN_FLAGS, req->req.flags)) 20740 goto nla_put_failure; 20741 20742 info = rdev->int_scan_req ? &rdev->int_scan_req->info : 20743 &rdev->scan_req->info; 20744 if (info->scan_start_tsf && 20745 (nla_put_u64_64bit(msg, NL80211_ATTR_SCAN_START_TIME_TSF, 20746 info->scan_start_tsf, NL80211_BSS_PAD) || 20747 nla_put(msg, NL80211_ATTR_SCAN_START_TIME_TSF_BSSID, ETH_ALEN, 20748 info->tsf_bssid))) 20749 goto nla_put_failure; 20750 20751 return 0; 20752 nla_put_failure: 20753 return -ENOBUFS; 20754 } 20755 20756 static int nl80211_prep_scan_msg(struct sk_buff *msg, 20757 struct cfg80211_registered_device *rdev, 20758 struct wireless_dev *wdev, 20759 u32 portid, u32 seq, int flags, 20760 u32 cmd) 20761 { 20762 void *hdr; 20763 20764 hdr = nl80211hdr_put(msg, portid, seq, flags, cmd); 20765 if (!hdr) 20766 return -1; 20767 20768 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 20769 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 20770 wdev->netdev->ifindex)) || 20771 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 20772 NL80211_ATTR_PAD)) 20773 goto nla_put_failure; 20774 20775 /* ignore errors and send incomplete event anyway */ 20776 nl80211_add_scan_req(msg, rdev); 20777 20778 genlmsg_end(msg, hdr); 20779 return 0; 20780 20781 nla_put_failure: 20782 genlmsg_cancel(msg, hdr); 20783 return -EMSGSIZE; 20784 } 20785 20786 static int 20787 nl80211_prep_sched_scan_msg(struct sk_buff *msg, 20788 struct cfg80211_sched_scan_request *req, u32 cmd) 20789 { 20790 void *hdr; 20791 20792 hdr = nl80211hdr_put(msg, 0, 0, 0, cmd); 20793 if (!hdr) 20794 return -1; 20795 20796 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, 20797 wiphy_to_rdev(req->wiphy)->wiphy_idx) || 20798 nla_put_u32(msg, NL80211_ATTR_IFINDEX, req->dev->ifindex) || 20799 nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, req->reqid, 20800 NL80211_ATTR_PAD)) 20801 goto nla_put_failure; 20802 20803 genlmsg_end(msg, hdr); 20804 return 0; 20805 20806 nla_put_failure: 20807 genlmsg_cancel(msg, hdr); 20808 return -EMSGSIZE; 20809 } 20810 20811 void nl80211_send_scan_start(struct cfg80211_registered_device *rdev, 20812 struct wireless_dev *wdev) 20813 { 20814 struct sk_buff *msg; 20815 20816 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 20817 if (!msg) 20818 return; 20819 20820 if (nl80211_prep_scan_msg(msg, rdev, wdev, 0, 0, 0, 20821 NL80211_CMD_TRIGGER_SCAN) < 0) { 20822 nlmsg_free(msg); 20823 return; 20824 } 20825 20826 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 20827 NL80211_MCGRP_SCAN, GFP_KERNEL); 20828 } 20829 20830 struct sk_buff *nl80211_build_scan_msg(struct cfg80211_registered_device *rdev, 20831 struct wireless_dev *wdev, bool aborted) 20832 { 20833 struct sk_buff *msg; 20834 20835 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 20836 if (!msg) 20837 return NULL; 20838 20839 if (nl80211_prep_scan_msg(msg, rdev, wdev, 0, 0, 0, 20840 aborted ? NL80211_CMD_SCAN_ABORTED : 20841 NL80211_CMD_NEW_SCAN_RESULTS) < 0) { 20842 nlmsg_free(msg); 20843 return NULL; 20844 } 20845 20846 return msg; 20847 } 20848 20849 /* send message created by nl80211_build_scan_msg() */ 20850 void nl80211_send_scan_msg(struct cfg80211_registered_device *rdev, 20851 struct sk_buff *msg) 20852 { 20853 if (!msg) 20854 return; 20855 20856 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 20857 NL80211_MCGRP_SCAN, GFP_KERNEL); 20858 } 20859 20860 void nl80211_send_sched_scan(struct cfg80211_sched_scan_request *req, u32 cmd) 20861 { 20862 struct sk_buff *msg; 20863 20864 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 20865 if (!msg) 20866 return; 20867 20868 if (nl80211_prep_sched_scan_msg(msg, req, cmd) < 0) { 20869 nlmsg_free(msg); 20870 return; 20871 } 20872 20873 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(req->wiphy), msg, 0, 20874 NL80211_MCGRP_SCAN, GFP_KERNEL); 20875 } 20876 20877 static bool nl80211_reg_change_event_fill(struct sk_buff *msg, 20878 struct regulatory_request *request) 20879 { 20880 /* Userspace can always count this one always being set */ 20881 if (nla_put_u8(msg, NL80211_ATTR_REG_INITIATOR, request->initiator)) 20882 goto nla_put_failure; 20883 20884 if (request->alpha2[0] == '0' && request->alpha2[1] == '0') { 20885 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE, 20886 NL80211_REGDOM_TYPE_WORLD)) 20887 goto nla_put_failure; 20888 } else if (request->alpha2[0] == '9' && request->alpha2[1] == '9') { 20889 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE, 20890 NL80211_REGDOM_TYPE_CUSTOM_WORLD)) 20891 goto nla_put_failure; 20892 } else if ((request->alpha2[0] == '9' && request->alpha2[1] == '8') || 20893 request->intersect) { 20894 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE, 20895 NL80211_REGDOM_TYPE_INTERSECTION)) 20896 goto nla_put_failure; 20897 } else { 20898 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE, 20899 NL80211_REGDOM_TYPE_COUNTRY) || 20900 nla_put_string(msg, NL80211_ATTR_REG_ALPHA2, 20901 request->alpha2)) 20902 goto nla_put_failure; 20903 } 20904 20905 if (request->wiphy_idx != WIPHY_IDX_INVALID) { 20906 struct wiphy *wiphy = wiphy_idx_to_wiphy(request->wiphy_idx); 20907 20908 if (wiphy && 20909 nla_put_u32(msg, NL80211_ATTR_WIPHY, request->wiphy_idx)) 20910 goto nla_put_failure; 20911 20912 if (wiphy && 20913 wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED && 20914 nla_put_flag(msg, NL80211_ATTR_WIPHY_SELF_MANAGED_REG)) 20915 goto nla_put_failure; 20916 } 20917 20918 return true; 20919 20920 nla_put_failure: 20921 return false; 20922 } 20923 20924 /* 20925 * This can happen on global regulatory changes or device specific settings 20926 * based on custom regulatory domains. 20927 */ 20928 void nl80211_common_reg_change_event(enum nl80211_commands cmd_id, 20929 struct regulatory_request *request) 20930 { 20931 struct sk_buff *msg; 20932 void *hdr; 20933 20934 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 20935 if (!msg) 20936 return; 20937 20938 hdr = nl80211hdr_put(msg, 0, 0, 0, cmd_id); 20939 if (!hdr) 20940 goto nla_put_failure; 20941 20942 if (!nl80211_reg_change_event_fill(msg, request)) 20943 goto nla_put_failure; 20944 20945 genlmsg_end(msg, hdr); 20946 20947 genlmsg_multicast_allns(&nl80211_fam, msg, 0, 20948 NL80211_MCGRP_REGULATORY); 20949 20950 return; 20951 20952 nla_put_failure: 20953 nlmsg_free(msg); 20954 } 20955 20956 struct nl80211_mlme_event { 20957 enum nl80211_commands cmd; 20958 const u8 *buf; 20959 size_t buf_len; 20960 int uapsd_queues; 20961 const u8 *req_ies; 20962 size_t req_ies_len; 20963 bool reconnect; 20964 }; 20965 20966 static void nl80211_send_mlme_event(struct cfg80211_registered_device *rdev, 20967 struct net_device *netdev, 20968 const struct nl80211_mlme_event *event, 20969 gfp_t gfp) 20970 { 20971 struct sk_buff *msg; 20972 void *hdr; 20973 20974 msg = nlmsg_new(100 + event->buf_len + event->req_ies_len, gfp); 20975 if (!msg) 20976 return; 20977 20978 hdr = nl80211hdr_put(msg, 0, 0, 0, event->cmd); 20979 if (!hdr) { 20980 nlmsg_free(msg); 20981 return; 20982 } 20983 20984 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 20985 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 20986 nla_put(msg, NL80211_ATTR_FRAME, event->buf_len, event->buf) || 20987 (event->req_ies && 20988 nla_put(msg, NL80211_ATTR_REQ_IE, event->req_ies_len, 20989 event->req_ies))) 20990 goto nla_put_failure; 20991 20992 if (event->reconnect && 20993 nla_put_flag(msg, NL80211_ATTR_RECONNECT_REQUESTED)) 20994 goto nla_put_failure; 20995 20996 if (event->uapsd_queues >= 0) { 20997 struct nlattr *nla_wmm = 20998 nla_nest_start_noflag(msg, NL80211_ATTR_STA_WME); 20999 if (!nla_wmm) 21000 goto nla_put_failure; 21001 21002 if (nla_put_u8(msg, NL80211_STA_WME_UAPSD_QUEUES, 21003 event->uapsd_queues)) 21004 goto nla_put_failure; 21005 21006 nla_nest_end(msg, nla_wmm); 21007 } 21008 21009 genlmsg_end(msg, hdr); 21010 21011 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21012 NL80211_MCGRP_MLME, gfp); 21013 return; 21014 21015 nla_put_failure: 21016 nlmsg_free(msg); 21017 } 21018 21019 void nl80211_send_rx_auth(struct cfg80211_registered_device *rdev, 21020 struct net_device *netdev, const u8 *buf, 21021 size_t len, gfp_t gfp) 21022 { 21023 struct nl80211_mlme_event event = { 21024 .cmd = NL80211_CMD_AUTHENTICATE, 21025 .buf = buf, 21026 .buf_len = len, 21027 .uapsd_queues = -1, 21028 }; 21029 21030 nl80211_send_mlme_event(rdev, netdev, &event, gfp); 21031 } 21032 21033 void nl80211_send_rx_assoc(struct cfg80211_registered_device *rdev, 21034 struct net_device *netdev, 21035 const struct cfg80211_rx_assoc_resp_data *data) 21036 { 21037 struct nl80211_mlme_event event = { 21038 .cmd = NL80211_CMD_ASSOCIATE, 21039 .buf = data->buf, 21040 .buf_len = data->len, 21041 .uapsd_queues = data->uapsd_queues, 21042 .req_ies = data->req_ies, 21043 .req_ies_len = data->req_ies_len, 21044 }; 21045 21046 nl80211_send_mlme_event(rdev, netdev, &event, GFP_KERNEL); 21047 } 21048 21049 void nl80211_send_deauth(struct cfg80211_registered_device *rdev, 21050 struct net_device *netdev, const u8 *buf, 21051 size_t len, bool reconnect, gfp_t gfp) 21052 { 21053 struct nl80211_mlme_event event = { 21054 .cmd = NL80211_CMD_DEAUTHENTICATE, 21055 .buf = buf, 21056 .buf_len = len, 21057 .reconnect = reconnect, 21058 .uapsd_queues = -1, 21059 }; 21060 21061 nl80211_send_mlme_event(rdev, netdev, &event, gfp); 21062 } 21063 21064 void nl80211_send_disassoc(struct cfg80211_registered_device *rdev, 21065 struct net_device *netdev, const u8 *buf, 21066 size_t len, bool reconnect, gfp_t gfp) 21067 { 21068 struct nl80211_mlme_event event = { 21069 .cmd = NL80211_CMD_DISASSOCIATE, 21070 .buf = buf, 21071 .buf_len = len, 21072 .reconnect = reconnect, 21073 .uapsd_queues = -1, 21074 }; 21075 21076 nl80211_send_mlme_event(rdev, netdev, &event, gfp); 21077 } 21078 21079 void cfg80211_rx_unprot_mlme_mgmt(struct net_device *dev, const u8 *buf, 21080 size_t len) 21081 { 21082 struct wireless_dev *wdev = dev->ieee80211_ptr; 21083 struct wiphy *wiphy = wdev->wiphy; 21084 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 21085 const struct ieee80211_mgmt *mgmt = (void *)buf; 21086 struct nl80211_mlme_event event = { 21087 .buf = buf, 21088 .buf_len = len, 21089 .uapsd_queues = -1, 21090 }; 21091 21092 if (WARN_ON(len < 2)) 21093 return; 21094 21095 if (ieee80211_is_deauth(mgmt->frame_control)) { 21096 event.cmd = NL80211_CMD_UNPROT_DEAUTHENTICATE; 21097 } else if (ieee80211_is_disassoc(mgmt->frame_control)) { 21098 event.cmd = NL80211_CMD_UNPROT_DISASSOCIATE; 21099 } else if (ieee80211_is_beacon(mgmt->frame_control)) { 21100 if (wdev->iftype == NL80211_IFTYPE_AP || 21101 wdev->iftype == NL80211_IFTYPE_P2P_GO) 21102 return; 21103 if (wdev->unprot_beacon_reported && 21104 elapsed_jiffies_msecs(wdev->unprot_beacon_reported) < 10000) 21105 return; 21106 event.cmd = NL80211_CMD_UNPROT_BEACON; 21107 wdev->unprot_beacon_reported = jiffies; 21108 } else { 21109 return; 21110 } 21111 21112 trace_cfg80211_rx_unprot_mlme_mgmt(dev, buf, len); 21113 nl80211_send_mlme_event(rdev, dev, &event, GFP_ATOMIC); 21114 } 21115 EXPORT_SYMBOL(cfg80211_rx_unprot_mlme_mgmt); 21116 21117 static void nl80211_send_mlme_timeout(struct cfg80211_registered_device *rdev, 21118 struct net_device *netdev, int cmd, 21119 const u8 *addr, gfp_t gfp) 21120 { 21121 struct sk_buff *msg; 21122 void *hdr; 21123 21124 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 21125 if (!msg) 21126 return; 21127 21128 hdr = nl80211hdr_put(msg, 0, 0, 0, cmd); 21129 if (!hdr) { 21130 nlmsg_free(msg); 21131 return; 21132 } 21133 21134 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 21135 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 21136 nla_put_flag(msg, NL80211_ATTR_TIMED_OUT) || 21137 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr)) 21138 goto nla_put_failure; 21139 21140 genlmsg_end(msg, hdr); 21141 21142 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21143 NL80211_MCGRP_MLME, gfp); 21144 return; 21145 21146 nla_put_failure: 21147 nlmsg_free(msg); 21148 } 21149 21150 void nl80211_send_auth_timeout(struct cfg80211_registered_device *rdev, 21151 struct net_device *netdev, const u8 *addr, 21152 gfp_t gfp) 21153 { 21154 nl80211_send_mlme_timeout(rdev, netdev, NL80211_CMD_AUTHENTICATE, 21155 addr, gfp); 21156 } 21157 21158 void nl80211_send_assoc_timeout(struct cfg80211_registered_device *rdev, 21159 struct net_device *netdev, const u8 *addr, 21160 gfp_t gfp) 21161 { 21162 nl80211_send_mlme_timeout(rdev, netdev, NL80211_CMD_ASSOCIATE, 21163 addr, gfp); 21164 } 21165 21166 void nl80211_send_connect_result(struct cfg80211_registered_device *rdev, 21167 struct net_device *netdev, 21168 struct cfg80211_connect_resp_params *cr, 21169 gfp_t gfp) 21170 { 21171 struct sk_buff *msg; 21172 void *hdr; 21173 unsigned int link; 21174 size_t link_info_size = 0; 21175 const u8 *connected_addr = cr->valid_links ? 21176 cr->ap_mld_addr : cr->links[0].bssid; 21177 21178 if (cr->valid_links) { 21179 for_each_valid_link(cr, link) { 21180 /* Nested attribute header */ 21181 link_info_size += NLA_HDRLEN; 21182 /* Link ID */ 21183 link_info_size += nla_total_size(sizeof(u8)); 21184 link_info_size += cr->links[link].addr ? 21185 nla_total_size(ETH_ALEN) : 0; 21186 link_info_size += (cr->links[link].bssid || 21187 cr->links[link].bss) ? 21188 nla_total_size(ETH_ALEN) : 0; 21189 link_info_size += nla_total_size(sizeof(u16)); 21190 } 21191 } 21192 21193 msg = nlmsg_new(100 + cr->req_ie_len + cr->resp_ie_len + 21194 cr->fils.kek_len + cr->fils.pmk_len + 21195 (cr->fils.pmkid ? WLAN_PMKID_LEN : 0) + link_info_size, 21196 gfp); 21197 if (!msg) 21198 return; 21199 21200 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CONNECT); 21201 if (!hdr) { 21202 nlmsg_free(msg); 21203 return; 21204 } 21205 21206 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 21207 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 21208 (connected_addr && 21209 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, connected_addr)) || 21210 nla_put_u16(msg, NL80211_ATTR_STATUS_CODE, 21211 cr->status < 0 ? WLAN_STATUS_UNSPECIFIED_FAILURE : 21212 cr->status) || 21213 (cr->status < 0 && 21214 (nla_put_flag(msg, NL80211_ATTR_TIMED_OUT) || 21215 nla_put_u32(msg, NL80211_ATTR_TIMEOUT_REASON, 21216 cr->timeout_reason))) || 21217 (cr->req_ie && 21218 nla_put(msg, NL80211_ATTR_REQ_IE, cr->req_ie_len, cr->req_ie)) || 21219 (cr->resp_ie && 21220 nla_put(msg, NL80211_ATTR_RESP_IE, cr->resp_ie_len, 21221 cr->resp_ie)) || 21222 (cr->fils.update_erp_next_seq_num && 21223 nla_put_u16(msg, NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM, 21224 cr->fils.erp_next_seq_num)) || 21225 (cr->status == WLAN_STATUS_SUCCESS && 21226 ((cr->fils.kek && 21227 nla_put(msg, NL80211_ATTR_FILS_KEK, cr->fils.kek_len, 21228 cr->fils.kek)) || 21229 (cr->fils.pmk && 21230 nla_put(msg, NL80211_ATTR_PMK, cr->fils.pmk_len, cr->fils.pmk)) || 21231 (cr->fils.pmkid && 21232 nla_put(msg, NL80211_ATTR_PMKID, WLAN_PMKID_LEN, cr->fils.pmkid)))) || 21233 (cr->assoc_encrypted && 21234 nla_put_flag(msg, NL80211_ATTR_ASSOC_ENCRYPTED))) 21235 goto nla_put_failure; 21236 21237 if (cr->valid_links) { 21238 int i = 1; 21239 struct nlattr *nested; 21240 21241 nested = nla_nest_start(msg, NL80211_ATTR_MLO_LINKS); 21242 if (!nested) 21243 goto nla_put_failure; 21244 21245 for_each_valid_link(cr, link) { 21246 struct nlattr *nested_mlo_links; 21247 const u8 *bssid = cr->links[link].bss ? 21248 cr->links[link].bss->bssid : 21249 cr->links[link].bssid; 21250 21251 nested_mlo_links = nla_nest_start(msg, i); 21252 if (!nested_mlo_links) 21253 goto nla_put_failure; 21254 21255 if (nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link) || 21256 (bssid && 21257 nla_put(msg, NL80211_ATTR_BSSID, ETH_ALEN, bssid)) || 21258 (cr->links[link].addr && 21259 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, 21260 cr->links[link].addr)) || 21261 nla_put_u16(msg, NL80211_ATTR_STATUS_CODE, 21262 cr->links[link].status)) 21263 goto nla_put_failure; 21264 21265 nla_nest_end(msg, nested_mlo_links); 21266 i++; 21267 } 21268 nla_nest_end(msg, nested); 21269 } 21270 21271 genlmsg_end(msg, hdr); 21272 21273 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21274 NL80211_MCGRP_MLME, gfp); 21275 return; 21276 21277 nla_put_failure: 21278 nlmsg_free(msg); 21279 } 21280 21281 void nl80211_send_roamed(struct cfg80211_registered_device *rdev, 21282 struct net_device *netdev, 21283 struct cfg80211_roam_info *info, gfp_t gfp) 21284 { 21285 struct sk_buff *msg; 21286 void *hdr; 21287 size_t link_info_size = 0; 21288 unsigned int link; 21289 const u8 *connected_addr = info->ap_mld_addr ? 21290 info->ap_mld_addr : 21291 (info->links[0].bss ? 21292 info->links[0].bss->bssid : 21293 info->links[0].bssid); 21294 21295 if (info->valid_links) { 21296 for_each_valid_link(info, link) { 21297 /* Nested attribute header */ 21298 link_info_size += NLA_HDRLEN; 21299 /* Link ID */ 21300 link_info_size += nla_total_size(sizeof(u8)); 21301 link_info_size += info->links[link].addr ? 21302 nla_total_size(ETH_ALEN) : 0; 21303 link_info_size += (info->links[link].bssid || 21304 info->links[link].bss) ? 21305 nla_total_size(ETH_ALEN) : 0; 21306 } 21307 } 21308 21309 msg = nlmsg_new(100 + info->req_ie_len + info->resp_ie_len + 21310 info->fils.kek_len + info->fils.pmk_len + 21311 (info->fils.pmkid ? WLAN_PMKID_LEN : 0) + 21312 link_info_size, gfp); 21313 if (!msg) 21314 return; 21315 21316 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_ROAM); 21317 if (!hdr) { 21318 nlmsg_free(msg); 21319 return; 21320 } 21321 21322 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 21323 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 21324 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, connected_addr) || 21325 (info->req_ie && 21326 nla_put(msg, NL80211_ATTR_REQ_IE, info->req_ie_len, 21327 info->req_ie)) || 21328 (info->resp_ie && 21329 nla_put(msg, NL80211_ATTR_RESP_IE, info->resp_ie_len, 21330 info->resp_ie)) || 21331 (info->fils.update_erp_next_seq_num && 21332 nla_put_u16(msg, NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM, 21333 info->fils.erp_next_seq_num)) || 21334 (info->fils.kek && 21335 nla_put(msg, NL80211_ATTR_FILS_KEK, info->fils.kek_len, 21336 info->fils.kek)) || 21337 (info->fils.pmk && 21338 nla_put(msg, NL80211_ATTR_PMK, info->fils.pmk_len, info->fils.pmk)) || 21339 (info->fils.pmkid && 21340 nla_put(msg, NL80211_ATTR_PMKID, WLAN_PMKID_LEN, info->fils.pmkid))) 21341 goto nla_put_failure; 21342 21343 if (info->valid_links) { 21344 int i = 1; 21345 struct nlattr *nested; 21346 21347 nested = nla_nest_start(msg, NL80211_ATTR_MLO_LINKS); 21348 if (!nested) 21349 goto nla_put_failure; 21350 21351 for_each_valid_link(info, link) { 21352 struct nlattr *nested_mlo_links; 21353 const u8 *bssid = info->links[link].bss ? 21354 info->links[link].bss->bssid : 21355 info->links[link].bssid; 21356 21357 nested_mlo_links = nla_nest_start(msg, i); 21358 if (!nested_mlo_links) 21359 goto nla_put_failure; 21360 21361 if (nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link) || 21362 (bssid && 21363 nla_put(msg, NL80211_ATTR_BSSID, ETH_ALEN, bssid)) || 21364 (info->links[link].addr && 21365 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, 21366 info->links[link].addr))) 21367 goto nla_put_failure; 21368 21369 nla_nest_end(msg, nested_mlo_links); 21370 i++; 21371 } 21372 nla_nest_end(msg, nested); 21373 } 21374 21375 genlmsg_end(msg, hdr); 21376 21377 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21378 NL80211_MCGRP_MLME, gfp); 21379 return; 21380 21381 nla_put_failure: 21382 nlmsg_free(msg); 21383 } 21384 21385 void nl80211_send_port_authorized(struct cfg80211_registered_device *rdev, 21386 struct net_device *netdev, const u8 *peer_addr, 21387 const u8 *td_bitmap, u8 td_bitmap_len) 21388 { 21389 struct sk_buff *msg; 21390 void *hdr; 21391 21392 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 21393 if (!msg) 21394 return; 21395 21396 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_PORT_AUTHORIZED); 21397 if (!hdr) { 21398 nlmsg_free(msg); 21399 return; 21400 } 21401 21402 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 21403 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 21404 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, peer_addr)) 21405 goto nla_put_failure; 21406 21407 if (td_bitmap_len > 0 && td_bitmap && 21408 nla_put(msg, NL80211_ATTR_TD_BITMAP, td_bitmap_len, td_bitmap)) 21409 goto nla_put_failure; 21410 21411 genlmsg_end(msg, hdr); 21412 21413 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21414 NL80211_MCGRP_MLME, GFP_KERNEL); 21415 return; 21416 21417 nla_put_failure: 21418 nlmsg_free(msg); 21419 } 21420 21421 void nl80211_send_disconnected(struct cfg80211_registered_device *rdev, 21422 struct net_device *netdev, u16 reason, 21423 const u8 *ie, size_t ie_len, bool from_ap) 21424 { 21425 struct sk_buff *msg; 21426 void *hdr; 21427 21428 msg = nlmsg_new(100 + ie_len, GFP_KERNEL); 21429 if (!msg) 21430 return; 21431 21432 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_DISCONNECT); 21433 if (!hdr) { 21434 nlmsg_free(msg); 21435 return; 21436 } 21437 21438 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 21439 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 21440 (reason && 21441 nla_put_u16(msg, NL80211_ATTR_REASON_CODE, reason)) || 21442 (from_ap && 21443 nla_put_flag(msg, NL80211_ATTR_DISCONNECTED_BY_AP)) || 21444 (ie && nla_put(msg, NL80211_ATTR_IE, ie_len, ie))) 21445 goto nla_put_failure; 21446 21447 genlmsg_end(msg, hdr); 21448 21449 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21450 NL80211_MCGRP_MLME, GFP_KERNEL); 21451 return; 21452 21453 nla_put_failure: 21454 nlmsg_free(msg); 21455 } 21456 21457 void cfg80211_links_removed(struct net_device *dev, u16 link_mask) 21458 { 21459 struct wireless_dev *wdev = dev->ieee80211_ptr; 21460 struct wiphy *wiphy = wdev->wiphy; 21461 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 21462 struct sk_buff *msg; 21463 struct nlattr *links; 21464 void *hdr; 21465 21466 lockdep_assert_wiphy(wdev->wiphy); 21467 trace_cfg80211_links_removed(dev, link_mask); 21468 21469 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_STATION && 21470 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT)) 21471 return; 21472 21473 if (WARN_ON(!wdev->valid_links || !link_mask || 21474 (wdev->valid_links & link_mask) != link_mask || 21475 wdev->valid_links == link_mask)) 21476 return; 21477 21478 cfg80211_wdev_release_link_bsses(wdev, link_mask); 21479 wdev->valid_links &= ~link_mask; 21480 21481 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 21482 if (!msg) 21483 return; 21484 21485 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_LINKS_REMOVED); 21486 if (!hdr) { 21487 nlmsg_free(msg); 21488 return; 21489 } 21490 21491 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 21492 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) 21493 goto nla_put_failure; 21494 21495 links = nla_nest_start(msg, NL80211_ATTR_MLO_LINKS); 21496 if (!links) 21497 goto nla_put_failure; 21498 21499 while (link_mask) { 21500 struct nlattr *link; 21501 int link_id = __ffs(link_mask); 21502 21503 link = nla_nest_start(msg, link_id + 1); 21504 if (!link) 21505 goto nla_put_failure; 21506 21507 if (nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link_id)) 21508 goto nla_put_failure; 21509 21510 nla_nest_end(msg, link); 21511 link_mask &= ~(1 << link_id); 21512 } 21513 21514 nla_nest_end(msg, links); 21515 21516 genlmsg_end(msg, hdr); 21517 21518 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21519 NL80211_MCGRP_MLME, GFP_KERNEL); 21520 return; 21521 21522 nla_put_failure: 21523 nlmsg_free(msg); 21524 } 21525 EXPORT_SYMBOL(cfg80211_links_removed); 21526 21527 void nl80211_mlo_reconf_add_done(struct net_device *dev, 21528 struct cfg80211_mlo_reconf_done_data *data) 21529 { 21530 struct wireless_dev *wdev = dev->ieee80211_ptr; 21531 struct wiphy *wiphy = wdev->wiphy; 21532 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 21533 struct nl80211_mlme_event event = { 21534 .cmd = NL80211_CMD_ASSOC_MLO_RECONF, 21535 .buf = data->buf, 21536 .buf_len = data->len, 21537 .uapsd_queues = -1, 21538 }; 21539 21540 nl80211_send_mlme_event(rdev, dev, &event, GFP_KERNEL); 21541 } 21542 EXPORT_SYMBOL(nl80211_mlo_reconf_add_done); 21543 21544 void nl80211_send_ibss_bssid(struct cfg80211_registered_device *rdev, 21545 struct net_device *netdev, const u8 *bssid, 21546 gfp_t gfp) 21547 { 21548 struct sk_buff *msg; 21549 void *hdr; 21550 21551 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 21552 if (!msg) 21553 return; 21554 21555 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_JOIN_IBSS); 21556 if (!hdr) { 21557 nlmsg_free(msg); 21558 return; 21559 } 21560 21561 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 21562 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 21563 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid)) 21564 goto nla_put_failure; 21565 21566 genlmsg_end(msg, hdr); 21567 21568 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21569 NL80211_MCGRP_MLME, gfp); 21570 return; 21571 21572 nla_put_failure: 21573 nlmsg_free(msg); 21574 } 21575 21576 void cfg80211_notify_new_peer_candidate(struct net_device *dev, const u8 *addr, 21577 const u8 *ie, size_t ie_len, 21578 int sig_dbm, gfp_t gfp) 21579 { 21580 struct wireless_dev *wdev = dev->ieee80211_ptr; 21581 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 21582 struct sk_buff *msg; 21583 void *hdr; 21584 21585 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_MESH_POINT)) 21586 return; 21587 21588 trace_cfg80211_notify_new_peer_candidate(dev, addr); 21589 21590 msg = nlmsg_new(100 + ie_len, gfp); 21591 if (!msg) 21592 return; 21593 21594 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NEW_PEER_CANDIDATE); 21595 if (!hdr) { 21596 nlmsg_free(msg); 21597 return; 21598 } 21599 21600 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 21601 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 21602 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr) || 21603 (ie_len && ie && 21604 nla_put(msg, NL80211_ATTR_IE, ie_len, ie)) || 21605 (sig_dbm && 21606 nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, sig_dbm))) 21607 goto nla_put_failure; 21608 21609 genlmsg_end(msg, hdr); 21610 21611 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21612 NL80211_MCGRP_MLME, gfp); 21613 return; 21614 21615 nla_put_failure: 21616 nlmsg_free(msg); 21617 } 21618 EXPORT_SYMBOL(cfg80211_notify_new_peer_candidate); 21619 21620 void nl80211_michael_mic_failure(struct cfg80211_registered_device *rdev, 21621 struct net_device *netdev, const u8 *addr, 21622 enum nl80211_key_type key_type, int key_id, 21623 const u8 *tsc, gfp_t gfp) 21624 { 21625 struct sk_buff *msg; 21626 void *hdr; 21627 21628 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 21629 if (!msg) 21630 return; 21631 21632 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_MICHAEL_MIC_FAILURE); 21633 if (!hdr) { 21634 nlmsg_free(msg); 21635 return; 21636 } 21637 21638 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 21639 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 21640 (addr && nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr)) || 21641 nla_put_u32(msg, NL80211_ATTR_KEY_TYPE, key_type) || 21642 (key_id != -1 && 21643 nla_put_u8(msg, NL80211_ATTR_KEY_IDX, key_id)) || 21644 (tsc && nla_put(msg, NL80211_ATTR_KEY_SEQ, 6, tsc))) 21645 goto nla_put_failure; 21646 21647 genlmsg_end(msg, hdr); 21648 21649 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21650 NL80211_MCGRP_MLME, gfp); 21651 return; 21652 21653 nla_put_failure: 21654 nlmsg_free(msg); 21655 } 21656 21657 void nl80211_send_beacon_hint_event(struct wiphy *wiphy, 21658 struct ieee80211_channel *channel_before, 21659 struct ieee80211_channel *channel_after) 21660 { 21661 struct sk_buff *msg; 21662 void *hdr; 21663 struct nlattr *nl_freq; 21664 21665 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC); 21666 if (!msg) 21667 return; 21668 21669 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_REG_BEACON_HINT); 21670 if (!hdr) { 21671 nlmsg_free(msg); 21672 return; 21673 } 21674 21675 /* 21676 * Since we are applying the beacon hint to a wiphy we know its 21677 * wiphy_idx is valid 21678 */ 21679 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, get_wiphy_idx(wiphy))) 21680 goto nla_put_failure; 21681 21682 /* Before */ 21683 nl_freq = nla_nest_start_noflag(msg, NL80211_ATTR_FREQ_BEFORE); 21684 if (!nl_freq) 21685 goto nla_put_failure; 21686 21687 if (nl80211_msg_put_channel(msg, wiphy, channel_before, false)) 21688 goto nla_put_failure; 21689 nla_nest_end(msg, nl_freq); 21690 21691 /* After */ 21692 nl_freq = nla_nest_start_noflag(msg, NL80211_ATTR_FREQ_AFTER); 21693 if (!nl_freq) 21694 goto nla_put_failure; 21695 21696 if (nl80211_msg_put_channel(msg, wiphy, channel_after, false)) 21697 goto nla_put_failure; 21698 nla_nest_end(msg, nl_freq); 21699 21700 genlmsg_end(msg, hdr); 21701 21702 genlmsg_multicast_allns(&nl80211_fam, msg, 0, 21703 NL80211_MCGRP_REGULATORY); 21704 21705 return; 21706 21707 nla_put_failure: 21708 nlmsg_free(msg); 21709 } 21710 21711 static void nl80211_send_remain_on_chan_event( 21712 int cmd, struct cfg80211_registered_device *rdev, 21713 struct wireless_dev *wdev, u64 cookie, 21714 struct ieee80211_channel *chan, 21715 unsigned int duration, gfp_t gfp) 21716 { 21717 struct sk_buff *msg; 21718 void *hdr; 21719 21720 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 21721 if (!msg) 21722 return; 21723 21724 hdr = nl80211hdr_put(msg, 0, 0, 0, cmd); 21725 if (!hdr) { 21726 nlmsg_free(msg); 21727 return; 21728 } 21729 21730 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 21731 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 21732 wdev->netdev->ifindex)) || 21733 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 21734 NL80211_ATTR_PAD) || 21735 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, chan->center_freq) || 21736 nla_put_u32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE, 21737 NL80211_CHAN_NO_HT) || 21738 nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie, 21739 NL80211_ATTR_PAD)) 21740 goto nla_put_failure; 21741 21742 if (cmd == NL80211_CMD_REMAIN_ON_CHANNEL && 21743 nla_put_u32(msg, NL80211_ATTR_DURATION, duration)) 21744 goto nla_put_failure; 21745 21746 genlmsg_end(msg, hdr); 21747 21748 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21749 NL80211_MCGRP_MLME, gfp); 21750 return; 21751 21752 nla_put_failure: 21753 nlmsg_free(msg); 21754 } 21755 21756 void cfg80211_assoc_comeback(struct net_device *netdev, 21757 const u8 *ap_addr, u32 timeout) 21758 { 21759 struct wireless_dev *wdev = netdev->ieee80211_ptr; 21760 struct wiphy *wiphy = wdev->wiphy; 21761 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 21762 struct sk_buff *msg; 21763 void *hdr; 21764 21765 trace_cfg80211_assoc_comeback(wdev, ap_addr, timeout); 21766 21767 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 21768 if (!msg) 21769 return; 21770 21771 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_ASSOC_COMEBACK); 21772 if (!hdr) { 21773 nlmsg_free(msg); 21774 return; 21775 } 21776 21777 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 21778 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 21779 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, ap_addr) || 21780 nla_put_u32(msg, NL80211_ATTR_TIMEOUT, timeout)) 21781 goto nla_put_failure; 21782 21783 genlmsg_end(msg, hdr); 21784 21785 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21786 NL80211_MCGRP_MLME, GFP_KERNEL); 21787 return; 21788 21789 nla_put_failure: 21790 nlmsg_free(msg); 21791 } 21792 EXPORT_SYMBOL(cfg80211_assoc_comeback); 21793 21794 void cfg80211_ready_on_channel(struct wireless_dev *wdev, u64 cookie, 21795 struct ieee80211_channel *chan, 21796 unsigned int duration, gfp_t gfp) 21797 { 21798 struct wiphy *wiphy = wdev->wiphy; 21799 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 21800 21801 trace_cfg80211_ready_on_channel(wdev, cookie, chan, duration); 21802 nl80211_send_remain_on_chan_event(NL80211_CMD_REMAIN_ON_CHANNEL, 21803 rdev, wdev, cookie, chan, 21804 duration, gfp); 21805 } 21806 EXPORT_SYMBOL(cfg80211_ready_on_channel); 21807 21808 void cfg80211_remain_on_channel_expired(struct wireless_dev *wdev, u64 cookie, 21809 struct ieee80211_channel *chan, 21810 gfp_t gfp) 21811 { 21812 struct wiphy *wiphy = wdev->wiphy; 21813 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 21814 21815 trace_cfg80211_ready_on_channel_expired(wdev, cookie, chan); 21816 nl80211_send_remain_on_chan_event(NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL, 21817 rdev, wdev, cookie, chan, 0, gfp); 21818 } 21819 EXPORT_SYMBOL(cfg80211_remain_on_channel_expired); 21820 21821 void cfg80211_tx_mgmt_expired(struct wireless_dev *wdev, u64 cookie, 21822 struct ieee80211_channel *chan, 21823 gfp_t gfp) 21824 { 21825 struct wiphy *wiphy = wdev->wiphy; 21826 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 21827 21828 trace_cfg80211_tx_mgmt_expired(wdev, cookie, chan); 21829 nl80211_send_remain_on_chan_event(NL80211_CMD_FRAME_WAIT_CANCEL, 21830 rdev, wdev, cookie, chan, 0, gfp); 21831 } 21832 EXPORT_SYMBOL(cfg80211_tx_mgmt_expired); 21833 21834 void cfg80211_new_sta(struct wireless_dev *wdev, const u8 *mac_addr, 21835 struct station_info *sinfo, gfp_t gfp) 21836 { 21837 struct wiphy *wiphy = wdev->wiphy; 21838 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 21839 struct sk_buff *msg; 21840 21841 trace_cfg80211_new_sta(wdev, mac_addr, sinfo); 21842 21843 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 21844 if (!msg) 21845 return; 21846 21847 if (nl80211_send_station(msg, NL80211_CMD_NEW_STATION, 0, 0, 0, 21848 rdev, wdev, mac_addr, sinfo) < 0) { 21849 nlmsg_free(msg); 21850 return; 21851 } 21852 21853 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21854 NL80211_MCGRP_MLME, gfp); 21855 } 21856 EXPORT_SYMBOL(cfg80211_new_sta); 21857 21858 void cfg80211_del_sta_sinfo(struct wireless_dev *wdev, const u8 *mac_addr, 21859 struct station_info *sinfo, gfp_t gfp) 21860 { 21861 struct wiphy *wiphy = wdev->wiphy; 21862 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 21863 struct sk_buff *msg; 21864 struct station_info empty_sinfo = {}; 21865 21866 if (!sinfo) 21867 sinfo = &empty_sinfo; 21868 21869 trace_cfg80211_del_sta(wdev, mac_addr); 21870 21871 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 21872 if (!msg) { 21873 cfg80211_sinfo_release_content(sinfo); 21874 return; 21875 } 21876 21877 if (nl80211_send_station(msg, NL80211_CMD_DEL_STATION, 0, 0, 0, 21878 rdev, wdev, mac_addr, sinfo) < 0) { 21879 nlmsg_free(msg); 21880 return; 21881 } 21882 21883 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21884 NL80211_MCGRP_MLME, gfp); 21885 } 21886 EXPORT_SYMBOL(cfg80211_del_sta_sinfo); 21887 21888 void cfg80211_conn_failed(struct net_device *dev, const u8 *mac_addr, 21889 enum nl80211_connect_failed_reason reason, 21890 gfp_t gfp) 21891 { 21892 struct wiphy *wiphy = dev->ieee80211_ptr->wiphy; 21893 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 21894 struct sk_buff *msg; 21895 void *hdr; 21896 21897 msg = nlmsg_new(NLMSG_GOODSIZE, gfp); 21898 if (!msg) 21899 return; 21900 21901 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CONN_FAILED); 21902 if (!hdr) { 21903 nlmsg_free(msg); 21904 return; 21905 } 21906 21907 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 21908 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr) || 21909 nla_put_u32(msg, NL80211_ATTR_CONN_FAILED_REASON, reason)) 21910 goto nla_put_failure; 21911 21912 genlmsg_end(msg, hdr); 21913 21914 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21915 NL80211_MCGRP_MLME, gfp); 21916 return; 21917 21918 nla_put_failure: 21919 nlmsg_free(msg); 21920 } 21921 EXPORT_SYMBOL(cfg80211_conn_failed); 21922 21923 static bool __nl80211_unexpected_frame(struct net_device *dev, u8 cmd, 21924 const u8 *addr, int link_id, gfp_t gfp) 21925 { 21926 struct wireless_dev *wdev = dev->ieee80211_ptr; 21927 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 21928 struct sk_buff *msg; 21929 void *hdr; 21930 u32 nlportid = READ_ONCE(wdev->unexpected_nlportid); 21931 21932 if (!nlportid) 21933 return false; 21934 21935 msg = nlmsg_new(100, gfp); 21936 if (!msg) 21937 return true; 21938 21939 hdr = nl80211hdr_put(msg, 0, 0, 0, cmd); 21940 if (!hdr) { 21941 nlmsg_free(msg); 21942 return true; 21943 } 21944 21945 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 21946 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 21947 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr) || 21948 (link_id >= 0 && 21949 nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link_id))) 21950 goto nla_put_failure; 21951 21952 genlmsg_end(msg, hdr); 21953 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); 21954 return true; 21955 21956 nla_put_failure: 21957 nlmsg_free(msg); 21958 return true; 21959 } 21960 21961 bool cfg80211_rx_spurious_frame(struct net_device *dev, const u8 *addr, 21962 int link_id, gfp_t gfp) 21963 { 21964 struct wireless_dev *wdev = dev->ieee80211_ptr; 21965 bool ret; 21966 21967 trace_cfg80211_rx_spurious_frame(dev, addr, link_id); 21968 21969 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP && 21970 wdev->iftype != NL80211_IFTYPE_P2P_GO && 21971 wdev->iftype != NL80211_IFTYPE_NAN_DATA)) { 21972 trace_cfg80211_return_bool(false); 21973 return false; 21974 } 21975 ret = __nl80211_unexpected_frame(dev, NL80211_CMD_UNEXPECTED_FRAME, 21976 addr, link_id, gfp); 21977 trace_cfg80211_return_bool(ret); 21978 return ret; 21979 } 21980 EXPORT_SYMBOL(cfg80211_rx_spurious_frame); 21981 21982 bool cfg80211_rx_unexpected_4addr_frame(struct net_device *dev, const u8 *addr, 21983 int link_id, gfp_t gfp) 21984 { 21985 struct wireless_dev *wdev = dev->ieee80211_ptr; 21986 bool ret; 21987 21988 trace_cfg80211_rx_unexpected_4addr_frame(dev, addr, link_id); 21989 21990 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP && 21991 wdev->iftype != NL80211_IFTYPE_P2P_GO && 21992 wdev->iftype != NL80211_IFTYPE_AP_VLAN)) { 21993 trace_cfg80211_return_bool(false); 21994 return false; 21995 } 21996 ret = __nl80211_unexpected_frame(dev, 21997 NL80211_CMD_UNEXPECTED_4ADDR_FRAME, 21998 addr, link_id, gfp); 21999 trace_cfg80211_return_bool(ret); 22000 return ret; 22001 } 22002 EXPORT_SYMBOL(cfg80211_rx_unexpected_4addr_frame); 22003 22004 int nl80211_send_mgmt(struct cfg80211_registered_device *rdev, 22005 struct wireless_dev *wdev, u32 nlportid, 22006 struct cfg80211_rx_info *info, gfp_t gfp) 22007 { 22008 struct net_device *netdev = wdev->netdev; 22009 struct sk_buff *msg; 22010 void *hdr; 22011 22012 msg = nlmsg_new(100 + info->len, gfp); 22013 if (!msg) 22014 return -ENOMEM; 22015 22016 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FRAME); 22017 if (!hdr) { 22018 nlmsg_free(msg); 22019 return -ENOMEM; 22020 } 22021 22022 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 22023 (netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 22024 netdev->ifindex)) || 22025 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 22026 NL80211_ATTR_PAD) || 22027 (info->have_link_id && 22028 nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, info->link_id)) || 22029 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, KHZ_TO_MHZ(info->freq)) || 22030 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ_OFFSET, info->freq % 1000) || 22031 (info->sig_dbm && 22032 nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, info->sig_dbm)) || 22033 nla_put(msg, NL80211_ATTR_FRAME, info->len, info->buf) || 22034 (info->flags && 22035 nla_put_u32(msg, NL80211_ATTR_RXMGMT_FLAGS, info->flags)) || 22036 (info->rx_tstamp && nla_put_u64_64bit(msg, 22037 NL80211_ATTR_RX_HW_TIMESTAMP, 22038 info->rx_tstamp, 22039 NL80211_ATTR_PAD)) || 22040 (info->ack_tstamp && nla_put_u64_64bit(msg, 22041 NL80211_ATTR_TX_HW_TIMESTAMP, 22042 info->ack_tstamp, 22043 NL80211_ATTR_PAD))) 22044 goto nla_put_failure; 22045 22046 genlmsg_end(msg, hdr); 22047 22048 return genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); 22049 22050 nla_put_failure: 22051 nlmsg_free(msg); 22052 return -ENOBUFS; 22053 } 22054 22055 static void nl80211_frame_tx_status(struct wireless_dev *wdev, 22056 struct cfg80211_tx_status *status, 22057 gfp_t gfp, enum nl80211_commands command) 22058 { 22059 struct wiphy *wiphy = wdev->wiphy; 22060 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 22061 struct net_device *netdev = wdev->netdev; 22062 struct sk_buff *msg; 22063 void *hdr; 22064 22065 /* userspace not interested in zero-cookie status */ 22066 if (!status->cookie) 22067 return; 22068 22069 if (command == NL80211_CMD_FRAME_TX_STATUS) 22070 trace_cfg80211_mgmt_tx_status(wdev, status->cookie, 22071 status->ack); 22072 else 22073 trace_cfg80211_control_port_tx_status(wdev, status->cookie, 22074 status->ack); 22075 22076 msg = nlmsg_new(100 + status->len, gfp); 22077 if (!msg) 22078 return; 22079 22080 hdr = nl80211hdr_put(msg, 0, 0, 0, command); 22081 if (!hdr) { 22082 nlmsg_free(msg); 22083 return; 22084 } 22085 22086 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 22087 (netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 22088 netdev->ifindex)) || 22089 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 22090 NL80211_ATTR_PAD) || 22091 nla_put(msg, NL80211_ATTR_FRAME, status->len, status->buf) || 22092 nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, status->cookie, 22093 NL80211_ATTR_PAD) || 22094 (status->ack && nla_put_flag(msg, NL80211_ATTR_ACK)) || 22095 (status->tx_tstamp && 22096 nla_put_u64_64bit(msg, NL80211_ATTR_TX_HW_TIMESTAMP, 22097 status->tx_tstamp, NL80211_ATTR_PAD)) || 22098 (status->ack_tstamp && 22099 nla_put_u64_64bit(msg, NL80211_ATTR_RX_HW_TIMESTAMP, 22100 status->ack_tstamp, NL80211_ATTR_PAD))) 22101 goto nla_put_failure; 22102 22103 genlmsg_end(msg, hdr); 22104 22105 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 22106 NL80211_MCGRP_MLME, gfp); 22107 return; 22108 22109 nla_put_failure: 22110 nlmsg_free(msg); 22111 } 22112 22113 void cfg80211_control_port_tx_status(struct wireless_dev *wdev, u64 cookie, 22114 const u8 *buf, size_t len, bool ack, 22115 gfp_t gfp) 22116 { 22117 struct cfg80211_tx_status status = { 22118 .cookie = cookie, 22119 .buf = buf, 22120 .len = len, 22121 .ack = ack 22122 }; 22123 22124 nl80211_frame_tx_status(wdev, &status, gfp, 22125 NL80211_CMD_CONTROL_PORT_FRAME_TX_STATUS); 22126 } 22127 EXPORT_SYMBOL(cfg80211_control_port_tx_status); 22128 22129 void cfg80211_mgmt_tx_status_ext(struct wireless_dev *wdev, 22130 struct cfg80211_tx_status *status, gfp_t gfp) 22131 { 22132 nl80211_frame_tx_status(wdev, status, gfp, NL80211_CMD_FRAME_TX_STATUS); 22133 } 22134 EXPORT_SYMBOL(cfg80211_mgmt_tx_status_ext); 22135 22136 static int __nl80211_rx_control_port(struct net_device *dev, 22137 struct sk_buff *skb, 22138 bool unencrypted, 22139 int link_id, 22140 gfp_t gfp) 22141 { 22142 struct wireless_dev *wdev = dev->ieee80211_ptr; 22143 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 22144 struct ethhdr *ehdr = eth_hdr(skb); 22145 const u8 *addr = ehdr->h_source; 22146 u16 proto = be16_to_cpu(skb->protocol); 22147 struct sk_buff *msg; 22148 void *hdr; 22149 struct nlattr *frame; 22150 22151 u32 nlportid = READ_ONCE(wdev->conn_owner_nlportid); 22152 22153 if (!nlportid) 22154 return -ENOENT; 22155 22156 msg = nlmsg_new(100 + skb->len, gfp); 22157 if (!msg) 22158 return -ENOMEM; 22159 22160 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CONTROL_PORT_FRAME); 22161 if (!hdr) { 22162 nlmsg_free(msg); 22163 return -ENOBUFS; 22164 } 22165 22166 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 22167 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 22168 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 22169 NL80211_ATTR_PAD) || 22170 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr) || 22171 nla_put_u16(msg, NL80211_ATTR_CONTROL_PORT_ETHERTYPE, proto) || 22172 (link_id >= 0 && 22173 nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link_id)) || 22174 (unencrypted && nla_put_flag(msg, 22175 NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT))) 22176 goto nla_put_failure; 22177 22178 frame = nla_reserve(msg, NL80211_ATTR_FRAME, skb->len); 22179 if (!frame) 22180 goto nla_put_failure; 22181 22182 skb_copy_bits(skb, 0, nla_data(frame), skb->len); 22183 genlmsg_end(msg, hdr); 22184 22185 return genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); 22186 22187 nla_put_failure: 22188 nlmsg_free(msg); 22189 return -ENOBUFS; 22190 } 22191 22192 bool cfg80211_rx_control_port(struct net_device *dev, struct sk_buff *skb, 22193 bool unencrypted, int link_id) 22194 { 22195 int ret; 22196 22197 trace_cfg80211_rx_control_port(dev, skb, unencrypted, link_id); 22198 ret = __nl80211_rx_control_port(dev, skb, unencrypted, link_id, 22199 GFP_ATOMIC); 22200 trace_cfg80211_return_bool(ret == 0); 22201 return ret == 0; 22202 } 22203 EXPORT_SYMBOL(cfg80211_rx_control_port); 22204 22205 static struct sk_buff *cfg80211_prepare_cqm(struct net_device *dev, 22206 const char *mac, gfp_t gfp) 22207 { 22208 struct wireless_dev *wdev = dev->ieee80211_ptr; 22209 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 22210 struct sk_buff *msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 22211 void **cb; 22212 22213 if (!msg) 22214 return NULL; 22215 22216 cb = (void **)msg->cb; 22217 22218 cb[0] = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NOTIFY_CQM); 22219 if (!cb[0]) { 22220 nlmsg_free(msg); 22221 return NULL; 22222 } 22223 22224 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 22225 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) 22226 goto nla_put_failure; 22227 22228 if (mac && nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac)) 22229 goto nla_put_failure; 22230 22231 cb[1] = nla_nest_start_noflag(msg, NL80211_ATTR_CQM); 22232 if (!cb[1]) 22233 goto nla_put_failure; 22234 22235 cb[2] = rdev; 22236 22237 return msg; 22238 nla_put_failure: 22239 nlmsg_free(msg); 22240 return NULL; 22241 } 22242 22243 static void cfg80211_send_cqm(struct sk_buff *msg, gfp_t gfp) 22244 { 22245 void **cb = (void **)msg->cb; 22246 struct cfg80211_registered_device *rdev = cb[2]; 22247 22248 nla_nest_end(msg, cb[1]); 22249 genlmsg_end(msg, cb[0]); 22250 22251 memset(msg->cb, 0, sizeof(msg->cb)); 22252 22253 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 22254 NL80211_MCGRP_MLME, gfp); 22255 } 22256 22257 void cfg80211_cqm_rssi_notify(struct net_device *dev, 22258 enum nl80211_cqm_rssi_threshold_event rssi_event, 22259 s32 rssi_level, gfp_t gfp) 22260 { 22261 struct wireless_dev *wdev = dev->ieee80211_ptr; 22262 struct cfg80211_cqm_config *cqm_config; 22263 22264 trace_cfg80211_cqm_rssi_notify(dev, rssi_event, rssi_level); 22265 22266 if (WARN_ON(rssi_event != NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW && 22267 rssi_event != NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH)) 22268 return; 22269 22270 rcu_read_lock(); 22271 cqm_config = rcu_dereference(wdev->cqm_config); 22272 if (cqm_config) { 22273 cqm_config->last_rssi_event_value = rssi_level; 22274 cqm_config->last_rssi_event_type = rssi_event; 22275 wiphy_work_queue(wdev->wiphy, &wdev->cqm_rssi_work); 22276 } 22277 rcu_read_unlock(); 22278 } 22279 EXPORT_SYMBOL(cfg80211_cqm_rssi_notify); 22280 22281 void cfg80211_cqm_rssi_notify_work(struct wiphy *wiphy, struct wiphy_work *work) 22282 { 22283 struct wireless_dev *wdev = container_of(work, struct wireless_dev, 22284 cqm_rssi_work); 22285 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 22286 enum nl80211_cqm_rssi_threshold_event rssi_event; 22287 struct cfg80211_cqm_config *cqm_config; 22288 struct sk_buff *msg; 22289 s32 rssi_level; 22290 22291 cqm_config = wiphy_dereference(wdev->wiphy, wdev->cqm_config); 22292 if (!cqm_config) 22293 return; 22294 22295 if (cqm_config->use_range_api) 22296 cfg80211_cqm_rssi_update(rdev, wdev->netdev, cqm_config); 22297 22298 rssi_level = cqm_config->last_rssi_event_value; 22299 rssi_event = cqm_config->last_rssi_event_type; 22300 22301 msg = cfg80211_prepare_cqm(wdev->netdev, NULL, GFP_KERNEL); 22302 if (!msg) 22303 return; 22304 22305 if (nla_put_u32(msg, NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT, 22306 rssi_event)) 22307 goto nla_put_failure; 22308 22309 if (rssi_level && nla_put_s32(msg, NL80211_ATTR_CQM_RSSI_LEVEL, 22310 rssi_level)) 22311 goto nla_put_failure; 22312 22313 cfg80211_send_cqm(msg, GFP_KERNEL); 22314 22315 return; 22316 22317 nla_put_failure: 22318 nlmsg_free(msg); 22319 } 22320 22321 void cfg80211_cqm_txe_notify(struct net_device *dev, 22322 const u8 *peer, u32 num_packets, 22323 u32 rate, u32 intvl, gfp_t gfp) 22324 { 22325 struct sk_buff *msg; 22326 22327 msg = cfg80211_prepare_cqm(dev, peer, gfp); 22328 if (!msg) 22329 return; 22330 22331 if (nla_put_u32(msg, NL80211_ATTR_CQM_TXE_PKTS, num_packets)) 22332 goto nla_put_failure; 22333 22334 if (nla_put_u32(msg, NL80211_ATTR_CQM_TXE_RATE, rate)) 22335 goto nla_put_failure; 22336 22337 if (nla_put_u32(msg, NL80211_ATTR_CQM_TXE_INTVL, intvl)) 22338 goto nla_put_failure; 22339 22340 cfg80211_send_cqm(msg, gfp); 22341 return; 22342 22343 nla_put_failure: 22344 nlmsg_free(msg); 22345 } 22346 EXPORT_SYMBOL(cfg80211_cqm_txe_notify); 22347 22348 void cfg80211_cqm_pktloss_notify(struct net_device *dev, 22349 const u8 *peer, u32 num_packets, gfp_t gfp) 22350 { 22351 struct sk_buff *msg; 22352 22353 trace_cfg80211_cqm_pktloss_notify(dev, peer, num_packets); 22354 22355 msg = cfg80211_prepare_cqm(dev, peer, gfp); 22356 if (!msg) 22357 return; 22358 22359 if (nla_put_u32(msg, NL80211_ATTR_CQM_PKT_LOSS_EVENT, num_packets)) 22360 goto nla_put_failure; 22361 22362 cfg80211_send_cqm(msg, gfp); 22363 return; 22364 22365 nla_put_failure: 22366 nlmsg_free(msg); 22367 } 22368 EXPORT_SYMBOL(cfg80211_cqm_pktloss_notify); 22369 22370 void cfg80211_cqm_beacon_loss_notify(struct net_device *dev, gfp_t gfp) 22371 { 22372 struct sk_buff *msg; 22373 22374 msg = cfg80211_prepare_cqm(dev, NULL, gfp); 22375 if (!msg) 22376 return; 22377 22378 if (nla_put_flag(msg, NL80211_ATTR_CQM_BEACON_LOSS_EVENT)) 22379 goto nla_put_failure; 22380 22381 cfg80211_send_cqm(msg, gfp); 22382 return; 22383 22384 nla_put_failure: 22385 nlmsg_free(msg); 22386 } 22387 EXPORT_SYMBOL(cfg80211_cqm_beacon_loss_notify); 22388 22389 static void nl80211_gtk_rekey_notify(struct cfg80211_registered_device *rdev, 22390 struct net_device *netdev, const u8 *bssid, 22391 const u8 *replay_ctr, gfp_t gfp) 22392 { 22393 struct sk_buff *msg; 22394 struct nlattr *rekey_attr; 22395 void *hdr; 22396 22397 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 22398 if (!msg) 22399 return; 22400 22401 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_SET_REKEY_OFFLOAD); 22402 if (!hdr) { 22403 nlmsg_free(msg); 22404 return; 22405 } 22406 22407 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 22408 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 22409 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid)) 22410 goto nla_put_failure; 22411 22412 rekey_attr = nla_nest_start_noflag(msg, NL80211_ATTR_REKEY_DATA); 22413 if (!rekey_attr) 22414 goto nla_put_failure; 22415 22416 if (nla_put(msg, NL80211_REKEY_DATA_REPLAY_CTR, 22417 NL80211_REPLAY_CTR_LEN, replay_ctr)) 22418 goto nla_put_failure; 22419 22420 nla_nest_end(msg, rekey_attr); 22421 22422 genlmsg_end(msg, hdr); 22423 22424 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 22425 NL80211_MCGRP_MLME, gfp); 22426 return; 22427 22428 nla_put_failure: 22429 nlmsg_free(msg); 22430 } 22431 22432 void cfg80211_gtk_rekey_notify(struct net_device *dev, const u8 *bssid, 22433 const u8 *replay_ctr, gfp_t gfp) 22434 { 22435 struct wireless_dev *wdev = dev->ieee80211_ptr; 22436 struct wiphy *wiphy = wdev->wiphy; 22437 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 22438 22439 trace_cfg80211_gtk_rekey_notify(dev, bssid); 22440 nl80211_gtk_rekey_notify(rdev, dev, bssid, replay_ctr, gfp); 22441 } 22442 EXPORT_SYMBOL(cfg80211_gtk_rekey_notify); 22443 22444 static void 22445 nl80211_pmksa_candidate_notify(struct cfg80211_registered_device *rdev, 22446 struct net_device *netdev, int index, 22447 const u8 *bssid, bool preauth, gfp_t gfp) 22448 { 22449 struct sk_buff *msg; 22450 struct nlattr *attr; 22451 void *hdr; 22452 22453 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 22454 if (!msg) 22455 return; 22456 22457 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_PMKSA_CANDIDATE); 22458 if (!hdr) { 22459 nlmsg_free(msg); 22460 return; 22461 } 22462 22463 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 22464 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex)) 22465 goto nla_put_failure; 22466 22467 attr = nla_nest_start_noflag(msg, NL80211_ATTR_PMKSA_CANDIDATE); 22468 if (!attr) 22469 goto nla_put_failure; 22470 22471 if (nla_put_u32(msg, NL80211_PMKSA_CANDIDATE_INDEX, index) || 22472 nla_put(msg, NL80211_PMKSA_CANDIDATE_BSSID, ETH_ALEN, bssid) || 22473 (preauth && 22474 nla_put_flag(msg, NL80211_PMKSA_CANDIDATE_PREAUTH))) 22475 goto nla_put_failure; 22476 22477 nla_nest_end(msg, attr); 22478 22479 genlmsg_end(msg, hdr); 22480 22481 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 22482 NL80211_MCGRP_MLME, gfp); 22483 return; 22484 22485 nla_put_failure: 22486 nlmsg_free(msg); 22487 } 22488 22489 void cfg80211_pmksa_candidate_notify(struct net_device *dev, int index, 22490 const u8 *bssid, bool preauth, gfp_t gfp) 22491 { 22492 struct wireless_dev *wdev = dev->ieee80211_ptr; 22493 struct wiphy *wiphy = wdev->wiphy; 22494 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 22495 22496 trace_cfg80211_pmksa_candidate_notify(dev, index, bssid, preauth); 22497 nl80211_pmksa_candidate_notify(rdev, dev, index, bssid, preauth, gfp); 22498 } 22499 EXPORT_SYMBOL(cfg80211_pmksa_candidate_notify); 22500 22501 static void nl80211_ch_switch_notify(struct cfg80211_registered_device *rdev, 22502 struct net_device *netdev, 22503 unsigned int link_id, 22504 struct cfg80211_chan_def *chandef, 22505 gfp_t gfp, 22506 enum nl80211_commands notif, 22507 u8 count, bool quiet) 22508 { 22509 struct wireless_dev *wdev = netdev->ieee80211_ptr; 22510 struct sk_buff *msg; 22511 void *hdr; 22512 22513 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 22514 if (!msg) 22515 return; 22516 22517 hdr = nl80211hdr_put(msg, 0, 0, 0, notif); 22518 if (!hdr) { 22519 nlmsg_free(msg); 22520 return; 22521 } 22522 22523 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex)) 22524 goto nla_put_failure; 22525 22526 if (wdev->valid_links && 22527 nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link_id)) 22528 goto nla_put_failure; 22529 22530 if (nl80211_send_chandef(msg, chandef)) 22531 goto nla_put_failure; 22532 22533 if (notif == NL80211_CMD_CH_SWITCH_STARTED_NOTIFY) { 22534 if (nla_put_u32(msg, NL80211_ATTR_CH_SWITCH_COUNT, count)) 22535 goto nla_put_failure; 22536 if (quiet && 22537 nla_put_flag(msg, NL80211_ATTR_CH_SWITCH_BLOCK_TX)) 22538 goto nla_put_failure; 22539 } 22540 22541 genlmsg_end(msg, hdr); 22542 22543 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 22544 NL80211_MCGRP_MLME, gfp); 22545 return; 22546 22547 nla_put_failure: 22548 nlmsg_free(msg); 22549 } 22550 22551 void cfg80211_ch_switch_notify(struct net_device *dev, 22552 struct cfg80211_chan_def *chandef, 22553 unsigned int link_id) 22554 { 22555 struct wireless_dev *wdev = dev->ieee80211_ptr; 22556 struct wiphy *wiphy = wdev->wiphy; 22557 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 22558 22559 lockdep_assert_wiphy(wdev->wiphy); 22560 WARN_INVALID_LINK_ID(wdev, link_id); 22561 22562 trace_cfg80211_ch_switch_notify(dev, chandef, link_id); 22563 22564 switch (wdev->iftype) { 22565 case NL80211_IFTYPE_STATION: 22566 case NL80211_IFTYPE_P2P_CLIENT: 22567 if (!WARN_ON(!wdev->links[link_id].client.current_bss)) 22568 cfg80211_update_assoc_bss_entry(wdev, link_id, 22569 chandef->chan); 22570 break; 22571 case NL80211_IFTYPE_MESH_POINT: 22572 wdev->u.mesh.chandef = *chandef; 22573 wdev->u.mesh.preset_chandef = *chandef; 22574 break; 22575 case NL80211_IFTYPE_AP: 22576 case NL80211_IFTYPE_P2P_GO: 22577 wdev->links[link_id].ap.chandef = *chandef; 22578 break; 22579 case NL80211_IFTYPE_ADHOC: 22580 wdev->u.ibss.chandef = *chandef; 22581 break; 22582 default: 22583 WARN_ON(1); 22584 break; 22585 } 22586 22587 cfg80211_schedule_channels_check(wdev); 22588 cfg80211_sched_dfs_chan_update(rdev); 22589 22590 nl80211_ch_switch_notify(rdev, dev, link_id, chandef, GFP_KERNEL, 22591 NL80211_CMD_CH_SWITCH_NOTIFY, 0, false); 22592 } 22593 EXPORT_SYMBOL(cfg80211_ch_switch_notify); 22594 22595 void cfg80211_incumbent_signal_notify(struct wiphy *wiphy, 22596 const struct cfg80211_chan_def *chandef, 22597 u32 signal_interference_bitmap, 22598 gfp_t gfp) 22599 { 22600 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 22601 struct sk_buff *msg; 22602 void *hdr; 22603 22604 trace_cfg80211_incumbent_signal_notify(wiphy, chandef, signal_interference_bitmap); 22605 22606 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 22607 if (!msg) 22608 return; 22609 22610 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_INCUMBENT_SIGNAL_DETECT); 22611 if (!hdr) 22612 goto nla_put_failure; 22613 22614 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx)) 22615 goto nla_put_failure; 22616 22617 if (nl80211_send_chandef(msg, chandef)) 22618 goto nla_put_failure; 22619 22620 if (nla_put_u32(msg, NL80211_ATTR_INCUMBENT_SIGNAL_INTERFERENCE_BITMAP, 22621 signal_interference_bitmap)) 22622 goto nla_put_failure; 22623 22624 genlmsg_end(msg, hdr); 22625 22626 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 22627 NL80211_MCGRP_MLME, gfp); 22628 return; 22629 22630 nla_put_failure: 22631 nlmsg_free(msg); 22632 } 22633 EXPORT_SYMBOL(cfg80211_incumbent_signal_notify); 22634 22635 void cfg80211_ch_switch_started_notify(struct net_device *dev, 22636 struct cfg80211_chan_def *chandef, 22637 unsigned int link_id, u8 count, 22638 bool quiet) 22639 { 22640 struct wireless_dev *wdev = dev->ieee80211_ptr; 22641 struct wiphy *wiphy = wdev->wiphy; 22642 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 22643 22644 lockdep_assert_wiphy(wdev->wiphy); 22645 WARN_INVALID_LINK_ID(wdev, link_id); 22646 22647 trace_cfg80211_ch_switch_started_notify(dev, chandef, link_id); 22648 22649 22650 nl80211_ch_switch_notify(rdev, dev, link_id, chandef, GFP_KERNEL, 22651 NL80211_CMD_CH_SWITCH_STARTED_NOTIFY, 22652 count, quiet); 22653 } 22654 EXPORT_SYMBOL(cfg80211_ch_switch_started_notify); 22655 22656 int cfg80211_bss_color_notify(struct net_device *dev, 22657 enum nl80211_commands cmd, u8 count, 22658 u64 color_bitmap, u8 link_id) 22659 { 22660 struct wireless_dev *wdev = dev->ieee80211_ptr; 22661 struct wiphy *wiphy = wdev->wiphy; 22662 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 22663 struct sk_buff *msg; 22664 void *hdr; 22665 22666 lockdep_assert_wiphy(wdev->wiphy); 22667 22668 trace_cfg80211_bss_color_notify(dev, cmd, count, color_bitmap); 22669 22670 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 22671 if (!msg) 22672 return -ENOMEM; 22673 22674 hdr = nl80211hdr_put(msg, 0, 0, 0, cmd); 22675 if (!hdr) 22676 goto nla_put_failure; 22677 22678 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) 22679 goto nla_put_failure; 22680 22681 if (wdev->valid_links && 22682 nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link_id)) 22683 goto nla_put_failure; 22684 22685 if (cmd == NL80211_CMD_COLOR_CHANGE_STARTED && 22686 nla_put_u32(msg, NL80211_ATTR_COLOR_CHANGE_COUNT, count)) 22687 goto nla_put_failure; 22688 22689 if (cmd == NL80211_CMD_OBSS_COLOR_COLLISION && 22690 nla_put_u64_64bit(msg, NL80211_ATTR_OBSS_COLOR_BITMAP, 22691 color_bitmap, NL80211_ATTR_PAD)) 22692 goto nla_put_failure; 22693 22694 genlmsg_end(msg, hdr); 22695 22696 return genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), 22697 msg, 0, NL80211_MCGRP_MLME, GFP_KERNEL); 22698 22699 nla_put_failure: 22700 nlmsg_free(msg); 22701 return -EINVAL; 22702 } 22703 EXPORT_SYMBOL(cfg80211_bss_color_notify); 22704 22705 void 22706 nl80211_radar_notify(struct cfg80211_registered_device *rdev, 22707 const struct cfg80211_chan_def *chandef, 22708 enum nl80211_radar_event event, 22709 struct net_device *netdev, gfp_t gfp) 22710 { 22711 struct sk_buff *msg; 22712 void *hdr; 22713 22714 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 22715 if (!msg) 22716 return; 22717 22718 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_RADAR_DETECT); 22719 if (!hdr) { 22720 nlmsg_free(msg); 22721 return; 22722 } 22723 22724 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx)) 22725 goto nla_put_failure; 22726 22727 /* NOP and radar events don't need a netdev parameter */ 22728 if (netdev) { 22729 struct wireless_dev *wdev = netdev->ieee80211_ptr; 22730 22731 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 22732 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 22733 NL80211_ATTR_PAD)) 22734 goto nla_put_failure; 22735 } 22736 22737 if (rdev->background_radar_wdev && 22738 cfg80211_chandef_identical(&rdev->background_radar_chandef, 22739 chandef)) { 22740 if (nla_put_flag(msg, NL80211_ATTR_RADAR_BACKGROUND)) 22741 goto nla_put_failure; 22742 } 22743 22744 if (nla_put_u32(msg, NL80211_ATTR_RADAR_EVENT, event)) 22745 goto nla_put_failure; 22746 22747 if (nl80211_send_chandef(msg, chandef)) 22748 goto nla_put_failure; 22749 22750 genlmsg_end(msg, hdr); 22751 22752 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 22753 NL80211_MCGRP_MLME, gfp); 22754 return; 22755 22756 nla_put_failure: 22757 nlmsg_free(msg); 22758 } 22759 22760 void cfg80211_sta_opmode_change_notify(struct net_device *dev, const u8 *mac, 22761 struct sta_opmode_info *sta_opmode, 22762 gfp_t gfp) 22763 { 22764 struct sk_buff *msg; 22765 struct wireless_dev *wdev = dev->ieee80211_ptr; 22766 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 22767 void *hdr; 22768 22769 if (WARN_ON(!mac)) 22770 return; 22771 22772 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 22773 if (!msg) 22774 return; 22775 22776 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_STA_OPMODE_CHANGED); 22777 if (!hdr) { 22778 nlmsg_free(msg); 22779 return; 22780 } 22781 22782 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx)) 22783 goto nla_put_failure; 22784 22785 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) 22786 goto nla_put_failure; 22787 22788 if (nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac)) 22789 goto nla_put_failure; 22790 22791 if ((sta_opmode->changed & STA_OPMODE_SMPS_MODE_CHANGED) && 22792 nla_put_u8(msg, NL80211_ATTR_SMPS_MODE, sta_opmode->smps_mode)) 22793 goto nla_put_failure; 22794 22795 if ((sta_opmode->changed & STA_OPMODE_MAX_BW_CHANGED) && 22796 nla_put_u32(msg, NL80211_ATTR_CHANNEL_WIDTH, sta_opmode->bw)) 22797 goto nla_put_failure; 22798 22799 if ((sta_opmode->changed & STA_OPMODE_N_SS_CHANGED) && 22800 nla_put_u8(msg, NL80211_ATTR_NSS, sta_opmode->rx_nss)) 22801 goto nla_put_failure; 22802 22803 genlmsg_end(msg, hdr); 22804 22805 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 22806 NL80211_MCGRP_MLME, gfp); 22807 22808 return; 22809 22810 nla_put_failure: 22811 nlmsg_free(msg); 22812 } 22813 EXPORT_SYMBOL(cfg80211_sta_opmode_change_notify); 22814 22815 void cfg80211_probe_status(struct net_device *dev, const u8 *peer, u64 cookie, 22816 int link_id, bool acked, s32 ack_signal, 22817 bool is_valid_ack_signal, gfp_t gfp) 22818 { 22819 struct wireless_dev *wdev = dev->ieee80211_ptr; 22820 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 22821 struct sk_buff *msg; 22822 void *hdr; 22823 22824 trace_cfg80211_probe_status(dev, peer, cookie, acked); 22825 22826 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 22827 22828 if (!msg) 22829 return; 22830 22831 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_PROBE_PEER); 22832 if (!hdr) { 22833 nlmsg_free(msg); 22834 return; 22835 } 22836 22837 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 22838 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 22839 (peer && nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, peer)) || 22840 nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie, 22841 NL80211_ATTR_PAD)) 22842 goto nla_put_failure; 22843 22844 if (link_id >= 0 && 22845 nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link_id)) 22846 goto nla_put_failure; 22847 22848 if ((acked && nla_put_flag(msg, NL80211_ATTR_ACK)) || 22849 (is_valid_ack_signal && 22850 nla_put_s32(msg, NL80211_ATTR_ACK_SIGNAL, ack_signal))) 22851 goto nla_put_failure; 22852 22853 genlmsg_end(msg, hdr); 22854 22855 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 22856 NL80211_MCGRP_MLME, gfp); 22857 return; 22858 22859 nla_put_failure: 22860 nlmsg_free(msg); 22861 } 22862 EXPORT_SYMBOL(cfg80211_probe_status); 22863 22864 void cfg80211_report_obss_beacon_khz(struct wiphy *wiphy, const u8 *frame, 22865 size_t len, int freq, int sig_dbm) 22866 { 22867 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 22868 struct sk_buff *msg; 22869 void *hdr; 22870 struct cfg80211_beacon_registration *reg; 22871 22872 trace_cfg80211_report_obss_beacon(wiphy, frame, len, freq, sig_dbm); 22873 22874 spin_lock_bh(&rdev->beacon_registrations_lock); 22875 list_for_each_entry(reg, &rdev->beacon_registrations, list) { 22876 msg = nlmsg_new(len + 100, GFP_ATOMIC); 22877 if (!msg) { 22878 spin_unlock_bh(&rdev->beacon_registrations_lock); 22879 return; 22880 } 22881 22882 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FRAME); 22883 if (!hdr) 22884 goto nla_put_failure; 22885 22886 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 22887 (freq && 22888 (nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, 22889 KHZ_TO_MHZ(freq)) || 22890 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ_OFFSET, 22891 freq % 1000))) || 22892 (sig_dbm && 22893 nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, sig_dbm)) || 22894 nla_put(msg, NL80211_ATTR_FRAME, len, frame)) 22895 goto nla_put_failure; 22896 22897 genlmsg_end(msg, hdr); 22898 22899 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, reg->nlportid); 22900 } 22901 spin_unlock_bh(&rdev->beacon_registrations_lock); 22902 return; 22903 22904 nla_put_failure: 22905 spin_unlock_bh(&rdev->beacon_registrations_lock); 22906 nlmsg_free(msg); 22907 } 22908 EXPORT_SYMBOL(cfg80211_report_obss_beacon_khz); 22909 22910 #ifdef CONFIG_PM 22911 static int cfg80211_net_detect_results(struct sk_buff *msg, 22912 struct cfg80211_wowlan_wakeup *wakeup) 22913 { 22914 struct cfg80211_wowlan_nd_info *nd = wakeup->net_detect; 22915 struct nlattr *nl_results, *nl_match, *nl_freqs; 22916 int i, j; 22917 22918 nl_results = nla_nest_start_noflag(msg, 22919 NL80211_WOWLAN_TRIG_NET_DETECT_RESULTS); 22920 if (!nl_results) 22921 return -EMSGSIZE; 22922 22923 for (i = 0; i < nd->n_matches; i++) { 22924 struct cfg80211_wowlan_nd_match *match = nd->matches[i]; 22925 22926 nl_match = nla_nest_start_noflag(msg, i); 22927 if (!nl_match) 22928 break; 22929 22930 /* The SSID attribute is optional in nl80211, but for 22931 * simplicity reasons it's always present in the 22932 * cfg80211 structure. If a driver can't pass the 22933 * SSID, that needs to be changed. A zero length SSID 22934 * is still a valid SSID (wildcard), so it cannot be 22935 * used for this purpose. 22936 */ 22937 if (nla_put(msg, NL80211_ATTR_SSID, match->ssid.ssid_len, 22938 match->ssid.ssid)) { 22939 nla_nest_cancel(msg, nl_match); 22940 goto out; 22941 } 22942 22943 if (match->n_channels) { 22944 nl_freqs = nla_nest_start_noflag(msg, 22945 NL80211_ATTR_SCAN_FREQUENCIES); 22946 if (!nl_freqs) { 22947 nla_nest_cancel(msg, nl_match); 22948 goto out; 22949 } 22950 22951 for (j = 0; j < match->n_channels; j++) { 22952 if (nla_put_u32(msg, j, match->channels[j])) { 22953 nla_nest_cancel(msg, nl_freqs); 22954 nla_nest_cancel(msg, nl_match); 22955 goto out; 22956 } 22957 } 22958 22959 nla_nest_end(msg, nl_freqs); 22960 } 22961 22962 nla_nest_end(msg, nl_match); 22963 } 22964 22965 out: 22966 nla_nest_end(msg, nl_results); 22967 return 0; 22968 } 22969 22970 void cfg80211_report_wowlan_wakeup(struct wireless_dev *wdev, 22971 struct cfg80211_wowlan_wakeup *wakeup, 22972 gfp_t gfp) 22973 { 22974 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 22975 struct sk_buff *msg; 22976 void *hdr; 22977 int size = 200; 22978 22979 trace_cfg80211_report_wowlan_wakeup(wdev->wiphy, wdev, wakeup); 22980 22981 if (wakeup) 22982 size += wakeup->packet_present_len; 22983 22984 msg = nlmsg_new(size, gfp); 22985 if (!msg) 22986 return; 22987 22988 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_SET_WOWLAN); 22989 if (!hdr) 22990 goto free_msg; 22991 22992 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 22993 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 22994 NL80211_ATTR_PAD)) 22995 goto free_msg; 22996 22997 if (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 22998 wdev->netdev->ifindex)) 22999 goto free_msg; 23000 23001 if (wakeup) { 23002 struct nlattr *reasons; 23003 23004 reasons = nla_nest_start_noflag(msg, 23005 NL80211_ATTR_WOWLAN_TRIGGERS); 23006 if (!reasons) 23007 goto free_msg; 23008 23009 if (wakeup->disconnect && 23010 nla_put_flag(msg, NL80211_WOWLAN_TRIG_DISCONNECT)) 23011 goto free_msg; 23012 if (wakeup->magic_pkt && 23013 nla_put_flag(msg, NL80211_WOWLAN_TRIG_MAGIC_PKT)) 23014 goto free_msg; 23015 if (wakeup->gtk_rekey_failure && 23016 nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE)) 23017 goto free_msg; 23018 if (wakeup->eap_identity_req && 23019 nla_put_flag(msg, NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST)) 23020 goto free_msg; 23021 if (wakeup->four_way_handshake && 23022 nla_put_flag(msg, NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE)) 23023 goto free_msg; 23024 if (wakeup->rfkill_release && 23025 nla_put_flag(msg, NL80211_WOWLAN_TRIG_RFKILL_RELEASE)) 23026 goto free_msg; 23027 23028 if (wakeup->pattern_idx >= 0 && 23029 nla_put_u32(msg, NL80211_WOWLAN_TRIG_PKT_PATTERN, 23030 wakeup->pattern_idx)) 23031 goto free_msg; 23032 23033 if (wakeup->tcp_match && 23034 nla_put_flag(msg, NL80211_WOWLAN_TRIG_WAKEUP_TCP_MATCH)) 23035 goto free_msg; 23036 23037 if (wakeup->tcp_connlost && 23038 nla_put_flag(msg, NL80211_WOWLAN_TRIG_WAKEUP_TCP_CONNLOST)) 23039 goto free_msg; 23040 23041 if (wakeup->tcp_nomoretokens && 23042 nla_put_flag(msg, 23043 NL80211_WOWLAN_TRIG_WAKEUP_TCP_NOMORETOKENS)) 23044 goto free_msg; 23045 23046 if (wakeup->unprot_deauth_disassoc && 23047 nla_put_flag(msg, 23048 NL80211_WOWLAN_TRIG_UNPROTECTED_DEAUTH_DISASSOC)) 23049 goto free_msg; 23050 23051 if (wakeup->packet) { 23052 u32 pkt_attr = NL80211_WOWLAN_TRIG_WAKEUP_PKT_80211; 23053 u32 len_attr = NL80211_WOWLAN_TRIG_WAKEUP_PKT_80211_LEN; 23054 23055 if (!wakeup->packet_80211) { 23056 pkt_attr = 23057 NL80211_WOWLAN_TRIG_WAKEUP_PKT_8023; 23058 len_attr = 23059 NL80211_WOWLAN_TRIG_WAKEUP_PKT_8023_LEN; 23060 } 23061 23062 if (wakeup->packet_len && 23063 nla_put_u32(msg, len_attr, wakeup->packet_len)) 23064 goto free_msg; 23065 23066 if (nla_put(msg, pkt_attr, wakeup->packet_present_len, 23067 wakeup->packet)) 23068 goto free_msg; 23069 } 23070 23071 if (wakeup->net_detect && 23072 cfg80211_net_detect_results(msg, wakeup)) 23073 goto free_msg; 23074 23075 nla_nest_end(msg, reasons); 23076 } 23077 23078 genlmsg_end(msg, hdr); 23079 23080 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 23081 NL80211_MCGRP_MLME, gfp); 23082 return; 23083 23084 free_msg: 23085 nlmsg_free(msg); 23086 } 23087 EXPORT_SYMBOL(cfg80211_report_wowlan_wakeup); 23088 #endif 23089 23090 void cfg80211_tdls_oper_request(struct net_device *dev, const u8 *peer, 23091 enum nl80211_tdls_operation oper, 23092 u16 reason_code, gfp_t gfp) 23093 { 23094 struct wireless_dev *wdev = dev->ieee80211_ptr; 23095 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 23096 struct sk_buff *msg; 23097 void *hdr; 23098 23099 trace_cfg80211_tdls_oper_request(wdev->wiphy, dev, peer, oper, 23100 reason_code); 23101 23102 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 23103 if (!msg) 23104 return; 23105 23106 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_TDLS_OPER); 23107 if (!hdr) { 23108 nlmsg_free(msg); 23109 return; 23110 } 23111 23112 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 23113 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 23114 nla_put_u8(msg, NL80211_ATTR_TDLS_OPERATION, oper) || 23115 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, peer) || 23116 (reason_code > 0 && 23117 nla_put_u16(msg, NL80211_ATTR_REASON_CODE, reason_code))) 23118 goto nla_put_failure; 23119 23120 genlmsg_end(msg, hdr); 23121 23122 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 23123 NL80211_MCGRP_MLME, gfp); 23124 return; 23125 23126 nla_put_failure: 23127 nlmsg_free(msg); 23128 } 23129 EXPORT_SYMBOL(cfg80211_tdls_oper_request); 23130 23131 static int nl80211_netlink_notify(struct notifier_block * nb, 23132 unsigned long state, 23133 void *_notify) 23134 { 23135 struct netlink_notify *notify = _notify; 23136 struct cfg80211_registered_device *rdev; 23137 struct wireless_dev *wdev; 23138 struct cfg80211_beacon_registration *reg, *tmp; 23139 23140 if (state != NETLINK_URELEASE || notify->protocol != NETLINK_GENERIC) 23141 return NOTIFY_DONE; 23142 23143 rcu_read_lock(); 23144 23145 list_for_each_entry_rcu(rdev, &cfg80211_rdev_list, list) { 23146 struct cfg80211_sched_scan_request *sched_scan_req; 23147 23148 list_for_each_entry_rcu(sched_scan_req, 23149 &rdev->sched_scan_req_list, 23150 list) { 23151 if (sched_scan_req->owner_nlportid == notify->portid) { 23152 sched_scan_req->nl_owner_dead = true; 23153 wiphy_work_queue(&rdev->wiphy, 23154 &rdev->sched_scan_stop_wk); 23155 } 23156 } 23157 23158 list_for_each_entry_rcu(wdev, &rdev->wiphy.wdev_list, list) { 23159 cfg80211_mlme_unregister_socket(wdev, notify->portid); 23160 23161 if (wdev->owner_nlportid == notify->portid) { 23162 wdev->nl_owner_dead = true; 23163 schedule_work(&rdev->destroy_work); 23164 } else if (wdev->conn_owner_nlportid == notify->portid) { 23165 wiphy_work_queue(wdev->wiphy, 23166 &wdev->disconnect_wk); 23167 } 23168 23169 cfg80211_release_pmsr(wdev, notify->portid); 23170 } 23171 23172 spin_lock_bh(&rdev->beacon_registrations_lock); 23173 list_for_each_entry_safe(reg, tmp, &rdev->beacon_registrations, 23174 list) { 23175 if (reg->nlportid == notify->portid) { 23176 list_del(®->list); 23177 kfree(reg); 23178 break; 23179 } 23180 } 23181 spin_unlock_bh(&rdev->beacon_registrations_lock); 23182 } 23183 23184 rcu_read_unlock(); 23185 23186 /* 23187 * It is possible that the user space process that is controlling the 23188 * indoor setting disappeared, so notify the regulatory core. 23189 */ 23190 regulatory_netlink_notify(notify->portid); 23191 return NOTIFY_OK; 23192 } 23193 23194 static struct notifier_block nl80211_netlink_notifier = { 23195 .notifier_call = nl80211_netlink_notify, 23196 }; 23197 23198 void cfg80211_ft_event(struct net_device *netdev, 23199 struct cfg80211_ft_event_params *ft_event) 23200 { 23201 struct wiphy *wiphy = netdev->ieee80211_ptr->wiphy; 23202 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 23203 struct sk_buff *msg; 23204 void *hdr; 23205 23206 trace_cfg80211_ft_event(wiphy, netdev, ft_event); 23207 23208 if (!ft_event->target_ap) 23209 return; 23210 23211 msg = nlmsg_new(100 + ft_event->ies_len + ft_event->ric_ies_len, 23212 GFP_KERNEL); 23213 if (!msg) 23214 return; 23215 23216 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FT_EVENT); 23217 if (!hdr) 23218 goto out; 23219 23220 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 23221 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 23222 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, ft_event->target_ap)) 23223 goto out; 23224 23225 if (ft_event->ies && 23226 nla_put(msg, NL80211_ATTR_IE, ft_event->ies_len, ft_event->ies)) 23227 goto out; 23228 if (ft_event->ric_ies && 23229 nla_put(msg, NL80211_ATTR_IE_RIC, ft_event->ric_ies_len, 23230 ft_event->ric_ies)) 23231 goto out; 23232 23233 genlmsg_end(msg, hdr); 23234 23235 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 23236 NL80211_MCGRP_MLME, GFP_KERNEL); 23237 return; 23238 out: 23239 nlmsg_free(msg); 23240 } 23241 EXPORT_SYMBOL(cfg80211_ft_event); 23242 23243 void cfg80211_crit_proto_stopped(struct wireless_dev *wdev, gfp_t gfp) 23244 { 23245 struct cfg80211_registered_device *rdev; 23246 struct sk_buff *msg; 23247 void *hdr; 23248 u32 nlportid; 23249 23250 rdev = wiphy_to_rdev(wdev->wiphy); 23251 if (!rdev->crit_proto_nlportid) 23252 return; 23253 23254 nlportid = rdev->crit_proto_nlportid; 23255 rdev->crit_proto_nlportid = 0; 23256 23257 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 23258 if (!msg) 23259 return; 23260 23261 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CRIT_PROTOCOL_STOP); 23262 if (!hdr) 23263 goto nla_put_failure; 23264 23265 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 23266 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 23267 NL80211_ATTR_PAD)) 23268 goto nla_put_failure; 23269 23270 genlmsg_end(msg, hdr); 23271 23272 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); 23273 return; 23274 23275 nla_put_failure: 23276 nlmsg_free(msg); 23277 } 23278 EXPORT_SYMBOL(cfg80211_crit_proto_stopped); 23279 23280 void nl80211_send_ap_stopped(struct wireless_dev *wdev, unsigned int link_id) 23281 { 23282 struct wiphy *wiphy = wdev->wiphy; 23283 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 23284 struct sk_buff *msg; 23285 void *hdr; 23286 23287 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 23288 if (!msg) 23289 return; 23290 23291 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_STOP_AP); 23292 if (!hdr) 23293 goto out; 23294 23295 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 23296 nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex) || 23297 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 23298 NL80211_ATTR_PAD) || 23299 (wdev->valid_links && 23300 nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link_id))) 23301 goto out; 23302 23303 genlmsg_end(msg, hdr); 23304 23305 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(wiphy), msg, 0, 23306 NL80211_MCGRP_MLME, GFP_KERNEL); 23307 return; 23308 out: 23309 nlmsg_free(msg); 23310 } 23311 23312 int cfg80211_external_auth_request(struct net_device *dev, 23313 struct cfg80211_external_auth_params *params, 23314 gfp_t gfp) 23315 { 23316 struct wireless_dev *wdev = dev->ieee80211_ptr; 23317 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 23318 struct sk_buff *msg; 23319 void *hdr; 23320 23321 if (!wdev->conn_owner_nlportid) 23322 return -EINVAL; 23323 23324 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 23325 if (!msg) 23326 return -ENOMEM; 23327 23328 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_EXTERNAL_AUTH); 23329 if (!hdr) 23330 goto nla_put_failure; 23331 23332 /* Some historical mistakes in drivers <-> userspace interface (notably 23333 * between drivers and wpa_supplicant) led to a big-endian conversion 23334 * being needed on NL80211_ATTR_AKM_SUITES _only_ when its value is 23335 * WLAN_AKM_SUITE_SAE. This is now fixed on userspace side, but for the 23336 * benefit of older wpa_supplicant versions, send this particular value 23337 * in big-endian. Note that newer wpa_supplicant will also detect this 23338 * particular value in big endian still, so it all continues to work. 23339 */ 23340 if (params->key_mgmt_suite == WLAN_AKM_SUITE_SAE) { 23341 if (nla_put_be32(msg, NL80211_ATTR_AKM_SUITES, 23342 cpu_to_be32(WLAN_AKM_SUITE_SAE))) 23343 goto nla_put_failure; 23344 } else { 23345 if (nla_put_u32(msg, NL80211_ATTR_AKM_SUITES, 23346 params->key_mgmt_suite)) 23347 goto nla_put_failure; 23348 } 23349 23350 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 23351 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 23352 nla_put_u32(msg, NL80211_ATTR_EXTERNAL_AUTH_ACTION, 23353 params->action) || 23354 nla_put(msg, NL80211_ATTR_BSSID, ETH_ALEN, params->bssid) || 23355 nla_put(msg, NL80211_ATTR_SSID, params->ssid.ssid_len, 23356 params->ssid.ssid) || 23357 (!is_zero_ether_addr(params->mld_addr) && 23358 nla_put(msg, NL80211_ATTR_MLD_ADDR, ETH_ALEN, params->mld_addr))) 23359 goto nla_put_failure; 23360 23361 genlmsg_end(msg, hdr); 23362 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, 23363 wdev->conn_owner_nlportid); 23364 return 0; 23365 23366 nla_put_failure: 23367 nlmsg_free(msg); 23368 return -ENOBUFS; 23369 } 23370 EXPORT_SYMBOL(cfg80211_external_auth_request); 23371 23372 void cfg80211_update_owe_info_event(struct net_device *netdev, 23373 struct cfg80211_update_owe_info *owe_info, 23374 gfp_t gfp) 23375 { 23376 struct wiphy *wiphy = netdev->ieee80211_ptr->wiphy; 23377 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 23378 struct sk_buff *msg; 23379 void *hdr; 23380 23381 trace_cfg80211_update_owe_info_event(wiphy, netdev, owe_info); 23382 23383 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 23384 if (!msg) 23385 return; 23386 23387 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_UPDATE_OWE_INFO); 23388 if (!hdr) 23389 goto nla_put_failure; 23390 23391 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 23392 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 23393 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, owe_info->peer)) 23394 goto nla_put_failure; 23395 23396 if (!owe_info->ie_len || 23397 nla_put(msg, NL80211_ATTR_IE, owe_info->ie_len, owe_info->ie)) 23398 goto nla_put_failure; 23399 23400 if (owe_info->assoc_link_id != -1) { 23401 if (nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, 23402 owe_info->assoc_link_id)) 23403 goto nla_put_failure; 23404 23405 if (!is_zero_ether_addr(owe_info->peer_mld_addr) && 23406 nla_put(msg, NL80211_ATTR_MLD_ADDR, ETH_ALEN, 23407 owe_info->peer_mld_addr)) 23408 goto nla_put_failure; 23409 } 23410 23411 genlmsg_end(msg, hdr); 23412 23413 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 23414 NL80211_MCGRP_MLME, gfp); 23415 return; 23416 23417 nla_put_failure: 23418 genlmsg_cancel(msg, hdr); 23419 nlmsg_free(msg); 23420 } 23421 EXPORT_SYMBOL(cfg80211_update_owe_info_event); 23422 23423 void cfg80211_schedule_channels_check(struct wireless_dev *wdev) 23424 { 23425 struct wiphy *wiphy = wdev->wiphy; 23426 23427 /* Schedule channels check if NO_IR or DFS relaxations are supported */ 23428 if (wdev->iftype == NL80211_IFTYPE_STATION && 23429 (wiphy_ext_feature_isset(wiphy, 23430 NL80211_EXT_FEATURE_DFS_CONCURRENT) || 23431 (IS_ENABLED(CONFIG_CFG80211_REG_RELAX_NO_IR) && 23432 wiphy->regulatory_flags & REGULATORY_ENABLE_RELAX_NO_IR))) 23433 reg_check_channels(); 23434 } 23435 EXPORT_SYMBOL(cfg80211_schedule_channels_check); 23436 23437 void cfg80211_epcs_changed(struct net_device *netdev, bool enabled) 23438 { 23439 struct wireless_dev *wdev = netdev->ieee80211_ptr; 23440 struct wiphy *wiphy = wdev->wiphy; 23441 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 23442 struct sk_buff *msg; 23443 void *hdr; 23444 23445 trace_cfg80211_epcs_changed(wdev, enabled); 23446 23447 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 23448 if (!msg) 23449 return; 23450 23451 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_EPCS_CFG); 23452 if (!hdr) { 23453 nlmsg_free(msg); 23454 return; 23455 } 23456 23457 if (enabled && nla_put_flag(msg, NL80211_ATTR_EPCS)) 23458 goto nla_put_failure; 23459 23460 genlmsg_end(msg, hdr); 23461 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 23462 NL80211_MCGRP_MLME, GFP_KERNEL); 23463 return; 23464 23465 nla_put_failure: 23466 nlmsg_free(msg); 23467 } 23468 EXPORT_SYMBOL(cfg80211_epcs_changed); 23469 23470 void cfg80211_next_nan_dw_notif(struct wireless_dev *wdev, 23471 struct ieee80211_channel *chan, gfp_t gfp) 23472 { 23473 struct wiphy *wiphy = wdev->wiphy; 23474 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 23475 struct sk_buff *msg; 23476 void *hdr; 23477 23478 trace_cfg80211_next_nan_dw_notif(wdev, chan); 23479 23480 if (!wdev->owner_nlportid) 23481 return; 23482 23483 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 23484 if (!msg) 23485 return; 23486 23487 hdr = nl80211hdr_put(msg, 0, 0, 0, 23488 NL80211_CMD_NAN_NEXT_DW_NOTIFICATION); 23489 if (!hdr) 23490 goto nla_put_failure; 23491 23492 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 23493 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 23494 NL80211_ATTR_PAD) || 23495 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, chan->center_freq)) 23496 goto nla_put_failure; 23497 23498 genlmsg_end(msg, hdr); 23499 23500 genlmsg_unicast(wiphy_net(wiphy), msg, wdev->owner_nlportid); 23501 23502 return; 23503 23504 nla_put_failure: 23505 nlmsg_free(msg); 23506 } 23507 EXPORT_SYMBOL(cfg80211_next_nan_dw_notif); 23508 23509 void cfg80211_nan_cluster_joined(struct wireless_dev *wdev, 23510 const u8 *cluster_id, bool new_cluster, 23511 gfp_t gfp) 23512 { 23513 struct wiphy *wiphy = wdev->wiphy; 23514 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 23515 struct sk_buff *msg; 23516 void *hdr; 23517 23518 trace_cfg80211_nan_cluster_joined(wdev, cluster_id, new_cluster); 23519 23520 memcpy(wdev->u.nan.cluster_id, cluster_id, ETH_ALEN); 23521 23522 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 23523 if (!msg) 23524 return; 23525 23526 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NAN_CLUSTER_JOINED); 23527 if (!hdr) 23528 goto nla_put_failure; 23529 23530 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 23531 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 23532 NL80211_ATTR_PAD) || 23533 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, cluster_id) || 23534 (new_cluster && nla_put_flag(msg, NL80211_ATTR_NAN_NEW_CLUSTER))) 23535 goto nla_put_failure; 23536 23537 genlmsg_end(msg, hdr); 23538 23539 if (!wdev->owner_nlportid) 23540 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(wiphy), 23541 msg, 0, NL80211_MCGRP_NAN, gfp); 23542 else 23543 genlmsg_unicast(wiphy_net(wiphy), msg, 23544 wdev->owner_nlportid); 23545 return; 23546 23547 nla_put_failure: 23548 nlmsg_free(msg); 23549 } 23550 EXPORT_SYMBOL(cfg80211_nan_cluster_joined); 23551 23552 void cfg80211_nan_ulw_update(struct wireless_dev *wdev, 23553 const u8 *ulw, size_t ulw_len, gfp_t gfp) 23554 { 23555 struct wiphy *wiphy = wdev->wiphy; 23556 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 23557 struct sk_buff *msg; 23558 void *hdr; 23559 23560 trace_cfg80211_nan_ulw_update(wiphy, wdev, ulw, ulw_len); 23561 23562 if (!wdev->owner_nlportid) 23563 return; 23564 23565 /* 32 for the wiphy idx, 64 for the wdev id, 100 for padding */ 23566 msg = nlmsg_new(nla_total_size(sizeof(u32)) + 23567 nla_total_size(ulw_len) + 23568 nla_total_size(sizeof(u64)) + 100, 23569 gfp); 23570 if (!msg) 23571 return; 23572 23573 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NAN_ULW_UPDATE); 23574 if (!hdr) 23575 goto nla_put_failure; 23576 23577 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 23578 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 23579 NL80211_ATTR_PAD) || 23580 (ulw && ulw_len && 23581 nla_put(msg, NL80211_ATTR_NAN_ULW, ulw_len, ulw))) 23582 goto nla_put_failure; 23583 23584 genlmsg_end(msg, hdr); 23585 23586 genlmsg_unicast(wiphy_net(wiphy), msg, wdev->owner_nlportid); 23587 23588 return; 23589 23590 nla_put_failure: 23591 nlmsg_free(msg); 23592 } 23593 EXPORT_SYMBOL(cfg80211_nan_ulw_update); 23594 23595 void cfg80211_nan_channel_evac(struct wireless_dev *wdev, 23596 const struct cfg80211_chan_def *chandef, 23597 gfp_t gfp) 23598 { 23599 struct wiphy *wiphy = wdev->wiphy; 23600 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 23601 struct sk_buff *msg; 23602 struct nlattr *chan_attr; 23603 void *hdr; 23604 23605 trace_cfg80211_nan_channel_evac(wiphy, wdev, chandef); 23606 23607 if (!wdev->owner_nlportid) 23608 return; 23609 23610 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 23611 if (!msg) 23612 return; 23613 23614 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NAN_CHANNEL_EVAC); 23615 if (!hdr) 23616 goto nla_put_failure; 23617 23618 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 23619 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 23620 NL80211_ATTR_PAD)) 23621 goto nla_put_failure; 23622 23623 chan_attr = nla_nest_start(msg, NL80211_ATTR_NAN_CHANNEL); 23624 if (!chan_attr) 23625 goto nla_put_failure; 23626 23627 if (nl80211_send_chandef(msg, chandef)) 23628 goto nla_put_failure; 23629 23630 nla_nest_end(msg, chan_attr); 23631 23632 genlmsg_end(msg, hdr); 23633 23634 genlmsg_unicast(wiphy_net(wiphy), msg, wdev->owner_nlportid); 23635 23636 return; 23637 23638 nla_put_failure: 23639 nlmsg_free(msg); 23640 } 23641 EXPORT_SYMBOL(cfg80211_nan_channel_evac); 23642 23643 /* initialisation/exit functions */ 23644 23645 int __init nl80211_init(void) 23646 { 23647 int err; 23648 23649 err = genl_register_family(&nl80211_fam); 23650 if (err) 23651 return err; 23652 23653 err = netlink_register_notifier(&nl80211_netlink_notifier); 23654 if (err) 23655 goto err_out; 23656 23657 return 0; 23658 err_out: 23659 genl_unregister_family(&nl80211_fam); 23660 return err; 23661 } 23662 23663 void nl80211_exit(void) 23664 { 23665 netlink_unregister_notifier(&nl80211_netlink_notifier); 23666 genl_unregister_family(&nl80211_fam); 23667 } 23668